본문 바로가기

Programing/Framework

(71)
[Spring] Boot 빈 의존성 사례 - Spring Integration (TCP) 하는 방법은 검색해보면 쉽게 찾을 수 있다. 글을 쓰는 이유는 실무에서 어떤 경우에 발생하는지 기록을 하기 위함이다. 스프링이 관리하는 객체, 즉 빈은 의존하고 있는 것이 명시적으로 드러날 때는 초기화 과정에서 필요한 빈들을 먼저 초기화를 해준다. 하지만 간접적으로 빈을 사용하는 경우 초기화 시점에 필요한 빈이 없을 수 있기 때문에 애플리케이션에서 실패가 발생한다. 내가 경험한 사례는 다음과 같다. TCP/IP 전문 통신을 해야해서 Spring Integration프로젝트 중 TCP and UDP Support 기능을 이용했다. Spring Integration 5.0 부터는 Java DSL을 통한 설정이 가능하기에 Configuration은 아래와 같이 구성했다. @Configuration @Enabl..
[Spring] ClientHttpResponse 인터페이스 계층 구조 ClientHttpRequestInterceptor 인터페이스를 통해 로깅을 남기고 있었는데 비표준 Http Status 코드로 인해 개선을 하게 되면서 정리를 하였다. ClientHttpResponse 인터페이스 close()는 며AutoCloseable에 정의한 인터페이스를 재정의한(override) 것이다. 나머지는 이름(상태코드, 숫자형태의 Raw 상태코드, 상태 문자열)의 정보를 획득한다. AbstractClientHttpResponse 추상 클래스 getStatusCode() 를 구현해놓았고 코드는 아래와 같다. public abstract class AbstractClientHttpResponse implements ClientHttpResponse { @Override public Htt..
[Sonarqube] Spring 기본 테스트 기본 템플릿은 아래와 유사한 테스트를 만들어준다. public class ApplicationFunctionalTest { @Autowired private ApplicationContext applicationContext; @Test public void contextLoads() { } } 문제는 sonarqube에서 단정문이 없다고 아래와 같이 경고한다. 간단한 해결책.. 애플리케이션 컨텍스트가 널이 아님을 단정한다. public class ApplicationFunctionalTest { @Autowired private ApplicationContext applicationContext; @Test public void contextLoads() { assertNotNull(applicatio..
[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..