Notice
Recent Posts
Recent Comments
Link
«   2026/01   »
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
Tags
more
Archives
Today
Total
관리 메뉴

che01 님의 블로그

Spring MVC ArgumentResolver와 ReturnValueHandler 본문

Spring

Spring MVC ArgumentResolver와 ReturnValueHandler

che01 2025. 6. 5. 15:28

핵심 개념 정리

기본 용어 이해

  • 메서드: 기능을 정의한 코드 블록 (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의 역할

  1. 파라미터 값 자동 주입: HandlerMethodArgumentResolver 사용
  2. 리턴값 응답 변환: HandlerMethodReturnValueHandler 사용

HandlerMethodArgumentResolver (ArgumentResolver)

역할

HTTP 요청에서 데이터를 추출하여 컨트롤러 메서드의 파라미터에 자동으로 값을 주입

동작 과정

  1. supportsParameter(): 해당 파라미터 타입을 처리할 수 있는지 확인
  2. 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 응답으로 변환

동작 과정

  1. supportsReturnType(): 해당 리턴 타입을 처리할 수 있는지 확인
  2. 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;
}

내부 처리 과정

  1. ArgumentResolver: RequestParamMethodArgumentResolver가 쿼리 파라미터 name=우주먼지에서 "우주먼지"를 추출하여 name 파라미터에 주입
  2. 메서드 실행: "Hello, 우주먼지" 반환
  3. ReturnValueHandler: RequestResponseBodyMethodProcessor가 문자열을 HTTP 응답 본문으로 변환하여 브라우저에 전송

왜 알아야 할까?

장점

  • 자동화: 개발자가 수동으로 요청 파라미터를 추출하거나 응답을 만들 필요 없음
  • 확장성: 커스텀 ArgumentResolver, ReturnValueHandler 구현 가능
  • 디버깅: 바인딩 오류 발생 시 원인 파악 용이

활용 가능한 상황

  • 커스텀 어노테이션으로 특별한 파라미터 처리가 필요할 때
  • 특정 형태의 응답 변환이 필요할 때
  • API 응답을 JSON, XML 등 다양한 형식으로 제어하고 싶을 때

핵심 정리

Spring MVC는 ArgumentResolver로 요청 데이터를 파라미터에 자동 주입하고, ReturnValueHandler로 리턴값을 HTTP 응답으로 자동 변환한다. 이를 통해 개발자는 비즈니스 로직에만 집중할 수 있으며, 필요 시 커스텀 구현으로 확장이 가능하다.