일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- html form
- 추상클래스
- 코드트리조별과제
- 테스트코드
- HttpServletResponse
- 오블완
- 코드트리
- JSON
- 스프링컨테이너
- 오버라이딩
- fielderror
- 싱글톤
- 김영한
- equals()
- 스프링
- 티스토리챌린지
- DI
- 코딩테스트
- java
- 서블릿
- 참조변수
- @configuration
- objecterror
- 의존관계
- ocp
- 프록시
- 다형성
- 백준
- 인터페이스
- http 메시지 컨버터
- Today
- Total
minOS
스프링 MVC 기본 기능 - 요청 매핑 핸들러 어댑터 구조 본문
요청 매핑 핸들러 어댑터
- 요청 맵핑 핸들러 어댑터란?: 스프링 프레임워크에서 클라이언트의 HTTP 요청을 적절한 핸들러 메서드로 연결해주는 중요한 구성 요소.
- 핸들러 어댑터의 역할과 중요성: 다양한 핸들러를 유연하게 지원하고, 요청 처리 로직의 확장성을 보장.
ArgumentResolver
애노테이션 기반 컨트롤러는 `HttpServletRequest`, `Model`뿐만 아니라 `@RequestParam`, `@ModelAttribute` 같은 애노테이션, 그리고 `@RequestBody`, `HttpEntity`와 같은 HTTP 메시지 처리 방식 등 매우 다양한 파라미터를 활용할 수 있다. 이러한 유연한 파라미터 처리가 가능한 이유는 바로 `ArgumentResolver` 덕분이다.
애노테이션 기반 컨트롤러를 처리하는 `RequestMappingHandlerAdapter` 는 바로 이 `ArgumentResolver` 를 호출해서 컨트롤러(핸들러)가 필요로 하는 다양한 파라미터의 값(객체)을 생성한다. 그리고 이렇게 파리미터의 값이 모두 준비되면 컨트롤러를 호출하면서 값을 넘겨준다. 스프링은 30개가 넘는 ArgumentResolver를 기본으로 제공한다.가능한 파라미터 목록은 다음 공식 메뉴얼에서 확인할 수 있다. https://docs.spring.io/spring-framework/docs/current/reference/html/web.html#mvc-ann-arguments
ReturnValueHandler
HandlerMethodReturnValueHandler`는 줄여서 `ReturnValueHandler`라고 부른다. 이 핸들러는 `ArgumentResolver`와 비슷하게 작동하지만, 주요 역할은 컨트롤러의 응답 값을 변환하고 처리하는 것이다. 예를 들어, 컨트롤러에서 뷰 이름을 `String`으로 반환해도 해당 뷰가 정상적으로 동작할 수 있는 이유는 바로 `ReturnValueHandler`가 이를 적절히 처리해주기 때문이다. 이러한 처리가 가능해지면서 컨트롤러 메서드에서 다양한 타입의 반환값을 유연하게 사용할 수 있게 된다.
스프링은 10여개가 넘는 `ReturnValueHandler` 를 지원한다.예) `ModelAndView` , `@ResponseBody` , `HttpEntity` , `String`
가능한 응답 값 목록은 다음 공식 메뉴얼에서 확인할 수 있다. https://docs.spring.io/spring-framework/docs/current/reference/html/web.html#mvc-ann- return-types
HTTP 메시지 컨버터
- HTTP 메시지 컨버터란?: 웹 애플리케이션에서 HTTP 요청과 응답의 본문을 객체로 변환하거나, 객체를 HTTP 메시지로 변환하는 역할을 하는 컴포넌트HTTP 메시지 컨버터를 사용하는 `@RequestBody` 도 컨트롤러가 필요로 하는 파라미터의 값에 사용된다.`@ResponseBody` 의 경우도 컨트롤러의 반환 값을 이용한다.
- 중요성: 클라이언트와 서버 간 데이터 전송을 유연하고 효율적으로 처리할 수 있게 해주는 핵심 요소.
요청의 경우, `@RequestBody`를 처리하는 `ArgumentResolver`와 `HttpEntity`를 처리하는 `ArgumentResolver`가 있다. 이 `ArgumentResolver`들은 내부적으로 HTTP 메시지 컨버터를 사용하여, 요청 본문을 적절한 Java 객체로 변환하고 생성한다. 예를 들어, `@RequestBody`는 요청 본문을 특정 타입의 객체로 변환하는 데 사용되며, `HttpEntity`는 요청의 전체 HTTP 메시지를 객체로 래핑하여 처리한다. 이러한 과정에서 HTTP 메시지 컨버터가 핵심적인 역할을 하며, 데이터 형식에 맞는 변환을 수행하여 컨트롤러 메서드에서 사용할 수 있는 형태로 객체를 반환해준다.
응답의 경우, `@ResponseBody`와 `HttpEntity`를 처리하는 `ReturnValueHandler`가 존재한다. 이 `ReturnValueHandler`는 컨트롤러 메서드에서 반환된 객체를 클라이언트로 전송할 적절한 HTTP 응답으로 변환하는 역할을 한다. 구체적으로, `@ResponseBody`는 메서드의 반환값을 HTTP 응답 본문으로 직렬화하고, `HttpEntity`는 응답 메시지 전체를 구성할 수 있는 객체를 반환한다. 이 과정에서 HTTP 메시지 컨버터가 중요한 역할을 담당하며, 반환된 객체를 JSON, XML, 텍스트 등 클라이언트가 이해할 수 있는 형식으로 변환한다. 결국, `ReturnValueHandler`는 HTTP 메시지 컨버터를 호출하여 최종적인 응답 결과를 생성하고, 이를 클라이언트에게 전달하는 역할을 한다.
참고) 스프링이 필요한 대부분의 기능을 제공하기 때문에 실제 기능을 확장할 일이 많지는 않다. 기능 확장은 `WebMvcConfigurer` 를 상속 받아서 스프링 빈으로 등록하면 된다. 실제 자주 사용하지는 않으니 실제 기능 확장이 필요할 때 `WebMvcConfigurer` 를 검색해보자.
'TIL > 김영한의 스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술' 카테고리의 다른 글
스프링 MVC 기본 기능 - HTTP 메세지 컨버터 (0) | 2024.08.02 |
---|---|
스프링 MVC 기본 기능 - 응답(2) (0) | 2024.08.01 |
스프링 MVC 기본 기능 - 응답(1) (0) | 2024.07.31 |
스프링 MVC 기본 기능 - HTTP 요청 메시지(2) (0) | 2024.07.30 |
스프링 MVC 기본 기능 - HTTP 요청 메시지(1) (0) | 2024.07.29 |