0. 들어가기 전에 LazyConnectionDataSourceProxy을 MySQL Replication 할 때 사용했는데, 어떤 원리로 동작하는지 알아보기 위해 글을 작성했습니다. 1. LazyConnectionDataSourceProxy란? LazyConnectionDataSourceProxy는 JDBC 커낵션이 실제 필요한 시점에 커넥션을 가져오도록하는 프록시 객체이다. 예시 코드로 살펴보자. @Service @Transactional public class LazyService { private final DataSource dataSource; public void lazy() { HikariPoolMXBean hikariPool; if (dataSource instanceof LazyConn..
FRAMEWORK/[SPRING]
[Spring] Spring Rest docs 적용해보기 0. 들어가기 전에 API문서를 Postman으로 만들었었는데, 설정이 바뀔 때마다 업데이트하기가 힘들다는 단점을 느껴서 Restdocs에 대해서 알아봤습니다. 1. Spring REST docs란? REST API의 명세에 대한 문서화 툴 API 문서화의 대표적 주자는 Swagger와 REST docs가 있습니다. 그 중에서 제가 REST docs를 더 선호하는데 이유는 다음과 같습니다. Swagger와 달리 Restdocs는 테스트 코드를 통해 작동하기 떄문에 테스트 코드를 필수적으로 작성해야 합니다. Swagger는 운영코드인 Controller 단에서 @Api나 @ApiImplicitParams와 같은 어노테이션을 통해 문서화를 해서 운영 ..
[Spring] HandlerMethodArgumentResolver 동작 원리 0. 들어가기 전에 ArugmentResolver을 사용해보고, 어느 시점에서 사용 되는지 알아보기 위해 정리했습니다. 1. HandlerMethodArgumentResolver란? 특정 조건에 맞는 파라미터가 있을 때 원하는 값을 바인딩해주는 인터페이스 컨트롤러에 있는 메서드 파라미터는 누가 넘겨주는 것일까? 우리는 @GetMapping, @PostMapping등이 붙은 메서드를 사용하면서, 메서드 파라미터 값에 @RequestParam, @RequestBody를 사용해서 값을 입력받는다. JSON을 파싱하고 파라미터에 값을 넣어주는 복잡한 연산들을 누가하는 것일까? 이 연산들을 하는 것은 흔히 얘기하는 ArgumentRe..
[Spring] DispatcherServlet이란? 0. 들어가기 전에 @RequestBody의 동작을 알아보다가 DispatcherServlet, ~Resolver라는 언어가 많이 나와 이번 기회에 정리해보고 공부해봤습니다. 1. DispatcherServlet 중앙 Servlet으로써 요청 처리를 위한 공통의 알고리즘을 제공하는 클래스이다. 스프링 MVC는 프론트 컨트롤러 패턴으로 만들어졌다. 프론트 컨트롤러 패턴이란, 프론트 컨트롤러가 클라이언트의 요청을 받고 요청을 알맞게 처리해주는 컨트롤러들을 호출하여 처리하는 패턴이다. [AS - IS] 위의 사진은 클라이언트가 요청을 하는 그림이다. 클라이언트가 서버에 요청을 할 때, 요청을 처리할 수 있는 컨트롤러를 직접 찾아서 매핑을 해주어야 한다. [..
[Spring] Spring에서 Bean은 어떤 자료구조로 관리될까요? 0. 들어가기 전에 영한님 강의를 듣다가 스프링 컨테이너가 어떻게 빈을 관리하는지 궁금해져서 찾아보게 되었습니다. 스프링 빈을 관리하는 개념인 IoC Container부터 설명하고, 어떤 자료구조를 사용하는지 알아보겠습니다. 1. IoC Container란? 순수 자바 객체(POJO)와 메타데이터들을 이용해 빈을 생성하고, 관리하는 컨테이너 IoC 컨테이너는 스프링 컨테이너라고도 불리며 빈의 생명주기를 관리하고, DI를 하는 역할을 맡고 있다. DI 글에서 이야기했듯이 DI는 외부에서 의존성을 주입해 주는 것이다. 이 역할을 또 다른 말로 IoC(Inversion of Control)라고도 한다. 스프링 컨테이너는 Configurat..
[Spring] Spring에서 DI하는 3가지 방법 0. 들어가기 전에 스프링은 POJO(순수한 자바 객체) 형태의 객체 지향 설계를 만족하기 위해 탄생했습니다. 그렇다면 순수하게 객체 지향적으로 어떻게 코드를 작성할까요? 스프링은 DI와 IoC를 사용하는데, 이번 글에서는 DI에 대해서 설명을 하겠습니다. 1. DI 란? DI는 Dependency Injection의 약자로, 의존관계 주입이라고 한다. DI는 스프링의 핵심 기능 중 하나로 관심사 분리를 할 수 있게 도와준다. '의존관계를 주입한다'라는 말을 살펴보자. 주입은 집어 넣는다는 것이라고 생각하면 되는데, 여기에서 말하는 의존관계는 무엇일까? 자바 예제 코드로 알아보자. 1.1 예제 public interface DiscountPolicy ..
[Spring] RestAssured로 API 테스트 진행하기 0. 들어가기 전에 API를 테스트하기 위해 RestAssured를 사용하게 되었는데, ''응답 값을 어떻게 테스트할까?' 하는 생각으로 사용 방법을 찾아봤습니다. 테스트 방식으로 REST-assured에서 나온 것처럼 then()절 뒤에 body()를 사용해서 테스트하는 방식과 JsonPath를 사용하는 방식이 있습니다. body()를 사용하는 방식은 한 메서드의 길이가 길어지고 주로 사용하는 given / when / then 패턴을 사용하기 어렵습니다.. 그래서 이 글에서는 JsonPath를 사용하여 테스트를 진행하는 방식을 소개하겠습니다. 1. RestAssured란? REST 기반 서비스를 간단히 테스트하기 위한 Java DSL(Do..
[Spring] Spring ArgumentResolver란? 1. ArgumentResolver란? Controller로 들어온 파라미터를 가공하거나 수정 기능을 제공하는 객체 주로 컨트롤러 단에서 중복 코드를 제거하려는 목적으로 사용 HandlerMethodArgumentResolver를 구현한 ArgumentResolver를 WebMvcConfig를 구현한 설정 파일에 등록하여 사용 2. 동작 과정 인터셉터 이후에 동작을 함. 인터셉터는 컨트롤러를 부를수 있는지 유무를 검사하는 반면에 ArgumentResolver는 컨트롤러가 원하는 객체를 생성해서 반환해준다.동작 과정 3. 인터페이스 public interface HandlerMethodArgumentResolver { boolean suppor..