일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- mybatis
- nodejs
- JavaScript
- MySQL
- Windows
- Git
- useEffect
- gson
- dbeaver
- log4j2
- Spring
- JPA
- Java
- LOG4J
- jetbrains
- database
- kubectl
- tibero
- BPMN
- intellijIDEA
- wildfly
- nginx
- Kubernetes
- VSCode
- IntelliJ
- springboot
- react
- docker
- NCP
- gradle
- Today
- Total
목록프로그래밍 (23)
두 손끝의 창조자
Gson gson = new GsonBuilder() .registerTypeAdapter(new TypeToken() { }.getType(), (JsonDeserializer) (element, typeOfT, context) -> { if (element.isJsonPrimitive()) { return new Table(Collections.emptyList()); } else { JsonElement jsonElement = ((JsonObject) element).get("T_DATA"); if (jsonElement.isJsonObject()) { CompanyInfo deserialize = context.deserialize(jsonElement, CompanyInfo.class); re..
타입이 없으면 다음과 같은 문제가 발생할 수 있음 잘못된 파라미터 함수에 전달 원하지 않은 타입 변환 코드 계층 구조 이해 불가 AddUserToGroup(string, string) 위 메소드는 파라미터가 2개 있다. 하나는 유저일 것이고 하나는 그룹일 것인데 어느 것이 유저이고 어느 것이 그룹인가? 메소드 시그니처 가지고는 알수가 없다. 만약, 타입 파라미터를 아래처럼 정의했다면 AddUserToGroup(User,Group) 순서를 생각할 필요가 없다. AddUserToGroup(new User('u1'), new Group('g1')) 쓸때는 이런 식이 아닐까?
클래스의 속성이 모두 final 일 때 자동으로 컨스트럭터의 파라미터로 만들어 줘서 편리하게 쓸 수 있다. 하지만 속성 중에 String 등 같은 타입이 여러개 잇을 때 기대한 순서가 달라 실제 사용한 클라이언트에서 사용했을 때 순서와 필드를 추가했을 때 순서가 다를 수 있다. 매우 심각한 문제를 발생시키므로 속성 타입이 모두 다를 때나 가끔 사용하고 아니면 사용하지 말자.
gson을 아무 옵션 없이 쓰면 소수점이 없는 숫자도 모두 float 타입으로 변환한다. Number 타입 변환 전략을 수정하면 Long과 Double 중 하나로 변환하게 할 수 있다. gson = new GsonBuilder() .setObjectToNumberStrategy(ToNumberPolicy.LONG_OR_DOUBLE) .create();
톰캣 폼 디렉토리 밑에 /bin 에 저장된다.
SpringBoot 가장 간단하게 해결된다. resources의 application-{Profile}.properties 파일을 추가하면 프로파일에 해당하는 설정정보를 가져온다. 가령, application-dev.properties 라는 파일이 있다면 현재 프로파일이 dev 인 경우 해당 파일을 읽는다. application-prd.properties 가 있다면 프로파일이 prd 인 경우 해당 파일을 읽는다. 그러면 프로파일에 맞는 속성파일에 log4j 설정파일 경로를 설정한다. logging.config=classpath:log4j2-dev.xml ServletContainerInitializer 서블릿 기반 웹이면 ServletContainerInitializer 인터페이스를 이용해서 web.xm..
MyBatis는 특정 메소드를 인터셉트 할 수 있는 애노테이션인 Intercepts 을 제공한다. Intercepts 의 값으로 메소드 시그니처를 지정해야하는데 메소드 시그니처를 지정하는 애노테이션이 Signature 이다. 메소드 시그니처는 메소드이름과 파라미터 타입이므로 인터셉트 할 메소드를 정확하게 지정한다. 예를 들어 org.apache.ibatis.executor.Executor 인터페이스는 ... int update(MappedStatement ms, Object parameter) throws SQLException; List query(MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler)..
PrefixContext base64 Base64 encoded data. The format is ${base64:Base64_encoded_data}. For example: ${base64:SGVsbG8gV29ybGQhCg==} yields Hello World!. bundle Resource bundle. The format is ${bundle:BundleName:BundleKey}. The bundle name follows package naming conventions, for example: ${bundle:com.domain.Messages:MyKey}. ctx Thread Context Map (MDC) date Inserts the current date and/or time usi..
WEB-INF 밑에 jboss-web.xml 파일을 만들고 /pmf 컨텍스트 루트 이름을 입력한다. 기본값은 war 파일명이다.
log4j 뿐만아니라 slf4j 를 사용하든, logback 을 사용하든 wildfly는 logger를 자체 정의하고 있기 때문에 기본값으로 놔두면 logger 우선순위에서 밀려서 내가 정한 logging 옵션을 사용하지 못 한다. 사용하게 하려면 META-INF 또는 WEB-INF 밑에 jboss-deployment-structure.xml 파일을 만들고 내용을 입력한다. 사용하는 로거에 따라서 module에 추가한다.
$/usr/libexec/java_home -V $/usr/libexec/java_home -v11 은 11버전의 경로 출력
brew install --cask anaconda 로 설치했을 때 anaconda 위치는 /opt/homebrew/anaconda3 이다. 이 위치가 path에 지정되어 있지 않기 때문에 conda를 terminal에서 바로 사용할 수 없다. 경로를 등록하자. .zshrc에 export PATH=[conda위치]:$PATH
작성한 테스트 스크립트를 많은 호스트가 실행을 하게 해서 타겟에 부하를 주고 그 결과를 모니터링 하는 솔루션이다. 크게 콘트롤러와 에이젼으로 구성된다. 콘트롤러는 웹 애플리케이션인데 테스트 스크립트를 생성하고 실행을 구성한다. 에이전트는 가상 사용자를 만들어서 부하를 발생시킨다. 콘트롤러에서 에이전트를 지정하고 에이전트에게 스크립트를 실행하게 하는 구조이다. 스크립트 Jython, Groovy 스크립트를 사용할 수 있다. IDE에서 Groovy 스크립트를 개발 및 테스트를 할 수 있고 이것을 에이전트에게 실행시킬 수있다. 다운로드 Releases · naver/ngrinder (github.com) Releases · naver/ngrinder enterprise level performance test..
MyBatis Mapper 스캔은 스캔을 설정한 패키지와 하위 패키지를 검색하여 등록하거나, 베이스 패키지와 그 하위 패키지를 검색하여 매퍼로 등록한다. 별도 설정을 하지 않으면 하위 패키지내에 있는 인터페이스는 모두 매퍼로 등록을 한다. 지원낭비이자 이중 빈 등록으로 인한 문제가 생길 수 있다. 매퍼 인터페이스를 한 군데 정해서 지정하면 간단하게 해결되지만 기능 별로 다른 패키지에 매퍼가 있을 경우는 좀 곤란하다. 패턴으로 매퍼의 위치를 지정할 수 없기 때문이다. 매퍼 스캔 옵션에 annotationClass 를 Mapper.classs 를 지정하면 @Mapper 애노테이션이 있는 인터페이스만 매퍼로 등록한다. 참고로 매퍼 xml을 지정하고, namespace에 인터페이스를 정확하게 입력했다면 그 인터..
ITemplateResolver 를 ClassLoaderTemplateResolver 를 사용한다. public ITemplateResolver templateResolver() { ClassLoaderTemplateResolver templateResolver = new ClassLoaderTemplateResolver(); templateResolver.setPrefix("templates/"); templateResolver.setSuffix(".html"); templateResolver.setTemplateMode(TemplateMode.HTML); templateResolver.setCacheable(false); return templateResolver; }
Thymeleaf 홈페이지에 Spring과 연동하는 소스를 가져와서 테스트 했는데 아무리 해도 뷰가 매핑이 되지 않았다. 몇 시간 헤매다가 아래 구문에서 문제가 있었다. viewResolver.setViewNames(new String[]{".html", ".xhtml"}); 당연하게도 xxx.html 파일과 매핑을 위한 설정정보라고 생각했는데 Controller에서 반환한 뷰 이름과 패턴 매치해볼 대상들이었다. 컨트롤러에서 뷰 이름만 리턴했으니 .html 과 같은 것이 매치가 될 리가 없다. 무슨 샘플 소스를 이따구로... https://www.thymeleaf.org/doc/tutorials/3.0/thymeleafspring.html
Apple 푸시 알림 서비스(APN)는 원격 알림 기능의 핵심입니다. 앱 개발자가 iOS(및 간접적으로 watchOS), tvOS 및 macOS 장치에 정보를 전파할 수 있는 강력하고 안전하며 매우 효율적인 서비스입니다. 사용자 기기에서 앱을 처음 시작할 때 시스템은 앱과 APN 간에 인증되고 암호화된 영구 IP 연결을 자동으로 설정합니다. 이 연결을 통해 앱은 원격 알림 지원 구성에 설명된 대로 알림을 받을 수 있도록 설정을 수행할 수 있습니다. 알림 전송을 위한 연결의 나머지 절반(제공자 서버와 APN 간의 지속적이고 안전한 채널)에는 온라인 개발자 계정의 구성과 Apple 제공 암호화 인증서의 사용이 필요합니다. 공급자는 APN과 함께 작동하도록 구성하고 배포 및 관리하는 서버입니다. 그림 6-1은..
xcode project를 위한 패키지 관리자이다. npm 에서 사용하는 패키지 정의 문법과 유사하다. pod는 ruby로 작성되어 mac에서는 설치 후 바로 사용할 수 있다. pod init 으로 xcode 프로젝트에 패키지관리자를 추가할 수 있고 Profile 에 패키지를 지정하고 pod install 로 정의한 패키지는 다운로드 또는 삭제한다. pod를 사용하면 xcode project가 아닌 workspace를 열어야 pod에서 다운받은 패키지를 참조할 수 있다.
cordova build 를 했는데 Cannot read property 'toLowerCase' of undefined 따위의 오류가 발생하면 다른사람이 만든 플랫폼 파일을 가지고 실행했을 수 있다. 설치된 플랫폼을 지우고 다시 추가한다. cordova platform rm ios cordova platform add ios
logback mdc 등 MDC 를 찾아서 적용하라