먼저 Spring Boot의 요청 처리 프로세스를 다시 한 번 알아보자

1. 사용자로부터 요청이 들어온다.
2. DispatcherServlet이 받아서 Header에 저장된 부가적인 정보를 이용해서 요청 처리를 위임할 Controller를 찾는다 (HandlerMapping)
3. 요청를 위임할 HandlerAdapter를 찾아서 전달한다.
※ 직접 Controller로 요청을 위임하지 않는 이유는 Controller 구현 방식이 다양하기 때문에 Adapter 패턴을 적용해 컨트롤러의 구현 방식에 상관 없이 요청을 위임한다.
4. HandlerAdpater가 Controller를 호출한다.
여기까지가 스프링 부트를 공부할 때, 평범하게 알고가는 요청 프로세스이다.
여기서 조금 더 자세히 알아보자.
Controller 메서드 인자에 작성하는 @RequestParam과 @RequestBody는 언제 어떻게 자바 객체로 변환될까

HandlerAdpater에서 Handler로 요청을 위임하는 과정에서 인스턴스화를 진행한다.
먼저 Handler Adapter가 호출하려는 Handler의 메서드에서 파라미터 정보를 전달 받는다.
그렇게 전달 받은 메서드 정보를 가지고 ArgumentResolver를 호출해 자바 객체로 변화하는 과정을 갖는다.
이 과정에서 ArgumentResolver가 HttpMessageConverter를 사용해서 RequestMessage의 데이터를 적절한 타입으로 변환 및 생성한다.
ArgumentResolver와 HttpMessageConverter에 대해 조금 더 자세히 알아보자.
ArgumentResolver 상세 프로세스

먼저 supportsParamter를 사용해 Resolver가 관여할 파라미터인지에 대한 판단을 진행한다.
그런 다음 resolveArgument가 Method의 Paramter를 HttpMessageConverter를 사용해 Request Message를 데이터 타입을 변환하고 생성한 후 반환한다.
@RequesParam: RequestParamMethodArgumentResolver
@RequestBody: RequestResponseBodyMethodProcessor
위에 해당하는 객체들을 보면 구현 방법을 자세하게 볼 수 있다.
이번엔 ArgumentResolver가 호출하는 HttpMessageConverter를 살펴보자.
HttpMessageConverter

HttpMessageConverter를 이용해서 RequestMessage를 알맞은 데이터 타입으로 변환하고 반환하는데 기본적으로 제공되는 Converter가 다양하게 존재하고 JSON을 역직렬활 할 수 있는 라이브러리를 추가하면 자동으로 Converter가 추가 등록 된다.

MessageConverter의 여러 구현체 중 MappingJacksonHttpMessageConverter를 사용하여 리플렉션을 통해 @RequestBody가 붙은 객체를 가져와 Jackson의 ObjectMapper를 써서 직렬화, 역직렬화 하고 적절한 객체 타입으로 Casting된다.
이제 이렇게 들어온 객체에 대해 유효성 검사는 언제 진행하게 될까
스프링에서 대표적인 검증 방식인 @Valid, @Validated의 처리 방식에 대해 알아보자.
간단하게 정의 먼저 살펴보자면 @Valid, @Validated는 "Request Message의 값 여부 및 Format을 정의한 대로 검사해주는 어노테이션"이다. 그렇다면 Request Message를 검사해주는 시점은 언제일까
검사가 실행되는 시점부터 말하자면 ArgumentResolver의 resolveArgument 메서드에서 실행된다.

검증까지의 요청 흐름을 보자면

Filter -> DispatherServlet -> Handler Mapping -> HandlerAdpater -> HandlerInterceptor ->
ArgumentResolver (HttpMessageConverter로 객체 생성 -> validateIfApplicable 메서드로 검증 가능한지 확인후 검증 메서드 실행) -> Handler
위 순서로 진행된다.
추가로 LocalValidationFactoryBean이 제약조건 검증을 처리해주기 때문에 활용하기 위해서는 LocalValidationFactoryBean을빈으로 등록해야한다 따라서 의존성 추가가 필수 이다.
'Back-End > Spring Boot' 카테고리의 다른 글
| Spring Boot - ResponseBodyAdvice를 활용한 공통 응답 처리 (0) | 2025.02.15 |
|---|---|
| Spring Boot - @RestController의 동작 과정과 MessageConverter (0) | 2025.02.14 |
| Spring Boot - RestTemplate를 사용한 Server To Server 연결(3) (0) | 2024.08.18 |
| Spring Boot - RestTemplate를 사용한 Server To Server 연결(2) (0) | 2024.06.22 |
| Spring Boot - RestTemplate를 사용한 Server To Server 연결(1) (0) | 2024.06.18 |