본문 바로가기

Programing/Framework

(32)
[Spring] MockRestServiceServer를 이용한 RestTemplate 테스트 스프링에서는 이제 웹 클라이언트를 RestTemplate 대신 WebClient를 쓸 것을 이야기하고 있지만 아직 계속 쓰고 있다. 기능 테스트 코드를 작성하려고 한다. 결국은 클라이언트 코드는 RestTemplate을 주입받을 것인데, 테스트 코드에서 해당 요청을 Mocking을 할 수 있게 해주어야 한다. 스프링 프레임워크 스프링 프레임워크에서는 MockRestServiceServer 를 제공한다. 처음에 3.2.x 버전의 JavaDoc을 참고했다. 예제가 아래와 같이 되어있다. RestTemplate restTemplate = new RestTemplate() MockRestServiceServer mockServer = MockRestServiceServer.createServer(restTemp..
[Spring] RestClientException 예외 정리 RestTemplate 은 Retire되었다. WebClient가 계승할 예정이다. 하지만 아직 많은 곳에 RestTemplate를 쓰고 있어서 정리를 하게 되었다. 계층도 NestedRuntimeException: RuntimeException의 root cause를 다루기 쉽게 래핑한 예외 클래스 내부적으로는 NestedExceptionUtils 라는 유틸리티 클래스를 이용한다. RestClientException: 클라이언트 사이드의 HTTP 에러를 만났을 때 던져지는 기본 예외 클래스 RestClientResponseException: 실제 HTTP 응답 데이터를 포함하고 있는 예외클래스들의 공통 기반 클래스 int rawStatusCode String statusText byte[] respon..
[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..
[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 ..