우리는 스프링으로 웹페이지를 만들 때 @ModelAttribute 등을 사용하여 파라미터로 손쉽게 값을 읽어온다
또한 값을 View 로 넘겨줄떄 String 타입으로 반환하는 등 세세한 내용을 신경쓰지 않고 코드를 작성할 수 있다
복잡한 Http 요청을 어떻게 객체로 자동 바인딩을 하며 View 를 String 타입으로 호출할 수 있는 것일까?
이런 편의성을 제공해주는 ArgumentResolver 와 ReturnValueHandler 에 대해 알아보자
ArgumentResolver
ArgumentResolver 의 정확한 명칭은 HandlerMethodArgumentResolver 이다
HandlerMethodArgumentResolver 인터페이스가 정의한 메소드들을 보자
1. supportsParameter(MethodParameter parameter);
supportsParameter() 는 '어디에 적용할지' 를 정한다
정확히는 미리 정의해놓은 범위에 해당하는가? 이다
예를 들어, 내가 적용하길 원하는 클래스나 타입인지, 특정 애노테이션을 가지고 있는지 등 원하는 조건을 서술해놓으면 그 조건이 해당되면 true, 그렇지 않으면 false 를 반환하게 하면 된다
2. Object resolveArgumet( .. .... ... . ..) throws Exception;
supportsParameter() 가 true 를 반환하게 된다면 호출되는 부분이다
이 부분에는 내가 원하는 조건일 경우 '무슨 행위를 하는가' 에 대해 서술하면 된다
실제 객체를 생성하고 생성된 객체를 컨트롤러 호출시 넘겨버린다던지, 이 부분에 원하는 로직을 구현한다던지..
(대표적으로 로그인)
(물론 실제 스프링에서는 HttpMessageConverter 를 사용해서 필요한 객체를 생성한다)
ArgumentResolver 는 정말 많이 있다
HandlerMethodArgumentResolver, HttpMessageConverter 등을 인터페이스로 제공하고 있기 때문에 수많은 형태의 변환이 가능한 것이다 (해당 형태에 맞춰 인터페이스를 구현하면 된다)
(물론 우리가 직접 오버라이드하여 기능확장도 가능하다)
ReturnValueHandler
정확한 명칭은 HandlerMethodReturnValueHandler 이다
응답 값을 변환하고 처리하는 역할을 한다
주로 View 이름을 String 으로 반환할 때 ReturnValueHandler 가 적용된다
주로 Handler Adapter 에서 Argument Resolver 와 ReturnValueHandler 의 역할을 볼 수 있다
HandlerAdapter 가 Handler 를 호출하기 위해 ArgumentResolver 를 거치고 Handler 는 다시 HandlerAdapter 에게 넘겨줄 때 ReturnValueHandler 를 거치게 된다
Controller 와 RestController 의 차이를 생각해보면 ReturnValueHandler 의 역할이 무엇인지 느껴질 것이다
두 컨트롤러의 차이점은 반환값에 있다
Controller 가 String 을 반환값으로 ViewResolver 를 호출 하고, RestController 가 데이터 그 자체를 반환하는 과정을 돕는 것이 ReturnValueHandler 라고 할 수 있다
WebMvcConfigurer
기능 확장이 필요한 경우 WebMvcConfigurer 를 상속받아서 스프링 빈으로 등록하면 된다
만일 ArgumentResolver 를 커스텀하여 직접 만든 경우 WebMvcConfigurer 를 구현한 클래스에 addArgumentResolver 를 오버라이드 하여 등록하면 된다 (보통 인터셉터 등을 등록한다)
'Spring' 카테고리의 다른 글
Servlet 과 DispatcherServlet (0) | 2024.08.14 |
---|---|
AOP 간단 요약 (0) | 2024.08.12 |
Spring Boot 에서 사용자와 데이터 교환 방법 (1) | 2024.06.30 |
@ModelAttribute 는 언제 어떻게 왜 쓰는가 (0) | 2024.06.29 |