본문 바로가기

Programing/Framework

(36)
[Spring] Bean 생성시 필드주입 시점은? 객체의 생성은 프레임워크가 해준다. 문제는 프레임워크가 JVM을 넘어 마술을 부리는 줄 아는 경우가 있다. 아래 글을 읽어보면 결국 프레임워크도 JVM이 제공해주는 리플렉션 도구들을 이용해서 객체를 만들고 private 필드에 값을 설정함을 알 수 있다. 질문 import org.springframework.stereotype.Service; @Service public class TestService { public void print() { System.out.println("TestService - print"); } } import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype..
[spring] stream 사용 예, 하지만 없어졌지... ControllerAdviceBean#findAnnotatedBeans ~v5.0.9.RELEASE v5.0.9.RELEASE 까지는 enhanced for 로 구성이 되어 있었다. package org.springframework.web.method; public class ControllerAdviceBean implements Ordered { // ... /** * Find the names of beans annotated with * {@linkplain ControllerAdvice @ControllerAdvice} in the given * ApplicationContext and wrap them as {@code ControllerAdviceBean} instances. */ publi..
[Spring] 스프링 프레임워크 개요 레퍼런스: https://docs.spring.io/spring-framework/docs/current/spring-framework-reference/overview.html#overview 스프링은 자바 엔터프라이즈 애플리케이션들을 작성하기 쉽게 해준다. 1. Spring 이라는 의미? 문맥에 따라 다양한 의미로 사용된다. 1. Spring Framework 프로젝트 그 차제 2. 프로젝트들의 모든 계층 레퍼런스에서는 1번을 의미 스프링 프레임워크는 여러 모듈들로 나뉘어 짐. 핵심을 설정 모델과 의존성 주입 매커니즘을 포함한 core container임. 이것을 넘어, 프레임워크는 메시징, 트랜잭션 데이터, 퍼시스턴스, (Spring MVC, Spring WebFlux) 웹 등의 애플리케이션 지원을..
[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..
[스프링 부트] 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..