che01 님의 블로그
Spring MVC ArgumentResolver와 ReturnValueHandler 본문
핵심 개념 정리
기본 용어 이해
- 메서드: 기능을 정의한 코드 블록 (Java에서는 함수를 메서드라고 부름)
- 파라미터: 외부에서 전달받을 값을 담을 변수 (String name)
- 인자(Argument): 실제로 전달하는 값 ("우주먼지")
- 리턴값: 메서드 실행 후 돌려주는 결과 ("Hello, 우주먼지")
public String sayHello(String name) { // name: 파라미터
return "Hello, " + name; // "Hello, 우주먼지": 리턴값
}
// sayHello("우주먼지")에서 "우주먼지"가 인자
Spring MVC 요청 처리 흐름
전체 구조
HTTP 요청 → DispatcherServlet → HandlerMapping → RequestMappingHandlerAdapter → Controller Method
RequestMappingHandlerAdapter의 역할
- 파라미터 값 자동 주입: HandlerMethodArgumentResolver 사용
- 리턴값 응답 변환: HandlerMethodReturnValueHandler 사용
HandlerMethodArgumentResolver (ArgumentResolver)
역할
HTTP 요청에서 데이터를 추출하여 컨트롤러 메서드의 파라미터에 자동으로 값을 주입
동작 과정
- supportsParameter(): 해당 파라미터 타입을 처리할 수 있는지 확인
- resolveArgument(): 실제 값을 생성해서 파라미터에 전달
주요 구현체들
어노테이션/타입 ArgumentResolver
| @RequestParam | RequestParamMethodArgumentResolver |
| @RequestBody | RequestResponseBodyMethodProcessor |
| @PathVariable | PathVariableMethodArgumentResolver |
| HttpServletRequest | ServletRequestMethodArgumentResolver |
| @ModelAttribute | ModelAttributeMethodProcessor |
예시
@GetMapping("/search")
public String search(@RequestParam String keyword) {
// RequestParamMethodArgumentResolver가
// 쿼리 파라미터에서 keyword 값을 추출해서 파라미터에 주입
return "검색: " + keyword;
}
@PostMapping("/user")
public void save(@RequestBody User user) {
// RequestResponseBodyMethodProcessor가
// JSON 데이터를 User 객체로 변환해서 파라미터에 주입
}
HandlerMethodReturnValueHandler (ReturnValueHandler)
역할
컨트롤러 메서드의 리턴값을 HTTP 응답으로 변환
동작 과정
- supportsReturnType(): 해당 리턴 타입을 처리할 수 있는지 확인
- handleReturnValue(): 실제 응답으로 변환
주요 구현체들
반환 형태 ReturnValueHandler
| @ResponseBody | RequestResponseBodyMethodProcessor |
| ModelAndView | ModelAndViewMethodReturnValueHandler |
| HttpEntity | HttpEntityMethodProcessor |
| ResponseEntity | HttpEntityMethodProcessor |
| 단순 문자열(View명) | ViewNameMethodReturnValueHandler |
예시
@GetMapping("/hello")
@ResponseBody
public String sayHello() {
return "안녕하세요";
// RequestResponseBodyMethodProcessor가
// 문자열을 HTTP 응답 본문으로 변환
}
@GetMapping("/user")
public ResponseEntity<User> getUser() {
return ResponseEntity.ok(new User("김철수"));
// HttpEntityMethodProcessor가
// ResponseEntity를 적절한 HTTP 응답으로 변환
}
실제 동작 예시
요청
GET /hello?name=우주먼지
컨트롤러
@GetMapping("/hello")
@ResponseBody
public String sayHello(@RequestParam String name) {
return "Hello, " + name;
}
내부 처리 과정
- ArgumentResolver: RequestParamMethodArgumentResolver가 쿼리 파라미터 name=우주먼지에서 "우주먼지"를 추출하여 name 파라미터에 주입
- 메서드 실행: "Hello, 우주먼지" 반환
- ReturnValueHandler: RequestResponseBodyMethodProcessor가 문자열을 HTTP 응답 본문으로 변환하여 브라우저에 전송
왜 알아야 할까?
장점
- 자동화: 개발자가 수동으로 요청 파라미터를 추출하거나 응답을 만들 필요 없음
- 확장성: 커스텀 ArgumentResolver, ReturnValueHandler 구현 가능
- 디버깅: 바인딩 오류 발생 시 원인 파악 용이
활용 가능한 상황
- 커스텀 어노테이션으로 특별한 파라미터 처리가 필요할 때
- 특정 형태의 응답 변환이 필요할 때
- API 응답을 JSON, XML 등 다양한 형식으로 제어하고 싶을 때
핵심 정리
Spring MVC는 ArgumentResolver로 요청 데이터를 파라미터에 자동 주입하고, ReturnValueHandler로 리턴값을 HTTP 응답으로 자동 변환한다. 이를 통해 개발자는 비즈니스 로직에만 집중할 수 있으며, 필요 시 커스텀 구현으로 확장이 가능하다.
'Spring' 카테고리의 다른 글
| Spring Formatter란 ? (0) | 2025.06.06 |
|---|---|
| ConversionService란? (1) | 2025.06.05 |
| TypeConverter — HTTP 요청 문자열을 객체로 편리하게 변환하기 (1) | 2025.06.05 |
| WebMvcConfigurer로 프레임워크 확장하기 (1) | 2025.06.05 |
| Spring @RequestBody와 HttpMessageConverter 동작 원리 (0) | 2025.06.05 |