본문 바로가기

Programing/Framework

(71)
[SpringBoot] ConversionService에 대한 오해 부제: spring-integration 를 추가하면서 발행한 오류를 통한 ConversionService에 대한 추적 spring-boot 프로젝트에서 "org.springframework.boot:spring-boot-starter-web"를 사용하고 있었다. 엔드포인트로 TCP 연결이 필요해서 스프링 통합 프로젝트의 Spring Integration IP Support를 사용하기 위해 "org.springframework.integration:spring-integration-ip" 의존성을 추가하였다. 잘 돌아가는 애플리케이션이 시작이 되지 않는다. 메세지는 아래와 같다. Description: Parameter 2 of constructor in com.tistory.repository.Cach..
[스프링 부트] StringHttpMessageConverter 를 쓸 때 주의점 제목이 길어져서 생략했지만 2.1.2.RELEASE 부터 적용되는 이야기이다. 스프링부터 2.1.2.RELEASE 에서 의존하는 스프링 프레임워크 버전은 5.1.4.RELEASE 이다. spring-web:5.1.4.RELEASE 에 들어있는 StringHttpMessageConverter 클래스의 코드가 아래와 같이 변경된 것을 알 수 있었다. getContentTypeCharset 메서드가 해주는 역할은 미디어타입에 따라 캐릭터셋을 돌려주는데, 크게 3가지 부분에서 사용이 된다. readInternal: 메세지를 읽을 때 getContentLength: 컨텐츠의 길이를 계산할 때 writeInternal: 메세지를 쓸 때 문제는 getContentTypeCharset의 로직의 분기가 추가됨에 따라 J..
[spring boot] Type-safe Configuration Properties 쓸 때 주의점 스프링부트에서 Configuration Properties의 기능은 설정을 접두어를 통한 그룹핑을 할 수 있어서 유용하다. 어제 배포 과정에서 실제 환경에 배포를 하였음에도 테스트 환경의 설정이 적용되어 배포 지연이 있었다. 원인을 살펴보니 yml 파일에 boolean 타입의 프로퍼티가 is가 붙어 있는 형태였다. is-real: true 이에 대응하는 Java 클래스는 아래와 같았다. private boolean isReal; 문제는 해당 필드는 설정이 적용되지 않는 것이었다. 어떻게 확인을 했나? 1. 생성자에서 초기화 테스트 생성자를 만들어서 해당 필드를 임의의 값을 설정해서 했는데, 스프링 프레임워크에 의한 값 덮어씀이 발생하지 않았다. 따라서 값 매핑이 제대로 되지 않는다고 판단할 수 있다. 2..
[Spring] AOP로 로깅 코드 덜어내기 기존에 되어 있던 코드에 보면 메서드 시작부에 인자로 받은 값들을 JSON으로 serialize해서 로그에 찍고, 결과를 반환하기 전에 결과도 JSON으로 serialize해서 로그로 찍는 식의 코드가 많았다. 사실 로깅을 하거나 DB에 이력을 쌓는 등의 코드는 핵심 비즈니스 코드와 별로 관계가 없다고 볼 수 있다. 이번에 새로운 feature를 추가하면서 기존 레거시의 방식(위의 방식)을 따르기 보다, AOP를 적용해서 관심사의 분리를 해보는 경험을 해보아서 기록으로 남긴다. 버전정보 자바: 1.8 스프링부트: 2.1.4.RELEASE -> 스프링 프레임워크: 5.1.6.RELEASE 의존성 추가 스프링부트 레퍼런스에 보면 AOP관련 스타터가 spring-boot-starter-aop 라서 추가를 했으..
[Spring] 스프링 부트에서 SOAP 클라이언트 사용하기 최근에 내가 개발했던 웹서비스(클라이언트던 서버던 간에) RESTful 웹서비스였다. 메세지의 포맷도 JSON으로 사실상의 표준(De facto)으로 자리잡은 듯하다고 느꼈다. 얼마전부터 멤버십 서비스 연동을 할 일이 있어서 타 사와의 업무를 진행하게 되었다. 하지만 연동해야 하는 방식이 이제는 더 이상 안쓸 것 같다고 생각했던, 소켓(socket) 통신을 실 환경에서도 사용되고 있었다. 좀 더 추상화된 레벨을 요구했더니 SOAN 기반의 웹서비스를 제공해주었다. SOAP과 RESTful 웹서비스가 익숙하지 않은 사람은 ETRI(한국전자통신연구원)에서 2010년에 출간한 비교 자료를 참고하면 좋다. SOAP with Spring Framework 일반적인 스프링 서적중에 SOAP 웹서비스를 다루고 있는 책..
[Jackson vs Gson] 오버라이딩한 메서드의 JSON serialize 테스트 기존에 JSON으로 만들던 객체에 메서드가 추가된다면 어떨까? 단순하게 생각하면 public 한 getter가 추가 되면 프로퍼티로 추가가 될 것 같다. 실험을 해보자. 테스트 DTO import lombok.Getter; import lombok.Setter; @Getter @Setter public class Apple { private String color; private int radius; } 1. Gson 및 Jackson 대조군 import com.fasterxml.jackson.databind.ObjectMapper import com.google.gson.Gson import spock.lang.Specification class AppleTest extends Specification..
[Spring] core - Converter 인터페이스 org.springframework.core.convert.converter 패키지에는 Converter라는 이름의 인터페이스가 있다. @FunctionalInterface public interface Converter { /** * Convert the source object of type {@code S} to target type {@code T}. * @param source the source object to convert, which must be an instance of {@code S} (never {@code null}) * @return the converted object, which must be an instance of {@code T} (potentially {@code..
[SpringBoot] HikariCP의 leakDetectionThreshold 기본값은? SpringBoot에서는 기본 커넥션 풀을 HikariCP을 쓴다. 가끔 long query가 있는지 가끔 누수가 검출되었다고 나온다. 그런데 좀 지나면 해당 커넥션이 회수되었다고 뒷북(?) 로그가 나온다. 회수가 되었으니 누수는 아닌데 에러 로그에 껴있어서 신경이 쓰인다. 스프링부트에는 spring.datasource.hikari.leak-detection-threshold 라는 프로퍼티가 있다. 실제 HikariCP에서는 leakDetectionThreshold 프로퍼티에 대응된다. com.zaxxer.hikari.HikariConfig 클래스에 보면 leakDetectionThreshold 필드가 있다. 기본값 디버깅 부트가 기본값으로 얼마를 넣어주는지 궁금해서 디버깅을 해보았다. org.sprin..