본문 바로가기
Spring Framework

리졸버(Resolver)

by xogns93 2024. 10. 16.

리졸버(Resolver)해석하고 결정하는 역할을 하는 객체입니다. 스프링 프레임워크에서 리졸버는 특정 요청이나 작업을 처리할 때 그 과정에서 발생하는 불확정 요소를 해결하고, 필요한 데이터를 제공하는 역할을 합니다.

1. 리졸버(Resolver)란?

스프링에서 리졸버는 주어진 조건이나 상황에 맞게 값을 결정하거나 적절한 객체를 반환하는 역할을 합니다. 예를 들어, HandlerMethodArgumentResolver컨트롤러 메서드에 주입할 파라미터 값을 결정하는 리졸버이고, ViewResolver컨트롤러가 반환하는 뷰 이름에 맞는 실제 뷰 객체를 찾아주는 역할을 합니다.

즉, 리졸버는 상황에 맞게 무언가를 '결정하고 반환하는 메커니즘'이라고 이해할 수 있습니다.

2. 리졸버의 일반적인 역할

  • 해석: 입력으로 받은 정보를 해석합니다.
  • 결정: 특정 규칙이나 조건을 바탕으로 필요한 값을 결정합니다.
  • 반환: 최종적으로 결정된 값을 반환하거나, 다음 단계에 필요한 객체나 데이터를 전달합니다.

3. 스프링에서 자주 사용되는 리졸버의 종류

스프링에는 여러 종류의 리졸버가 있으며, 그중 대표적인 몇 가지를 소개하겠습니다.

1) HandlerMethodArgumentResolver (아규먼트 리졸버)

  • 역할: 컨트롤러 메서드가 호출될 때, 메서드에 전달될 매개변수 값을 결정합니다.

  • 예시: @RequestParam, @PathVariable 등의 애노테이션으로 전달받은 값들을 파라미터로 주입할 때 사용됩니다.

    @GetMapping("/users/{id}")
    public String getUser(@PathVariable Long id) {
        // id는 HandlerMethodArgumentResolver가 URL 경로에서 추출하여 주입함
    }

2) ViewResolver (뷰 리졸버)

  • 역할: 컨트롤러가 반환하는 뷰 이름을 실제 뷰 객체로 변환하여 렌더링합니다. 주로 JSP, Thymeleaf, FreeMarker 등의 뷰 리졸버가 있습니다.

    예시:

    @GetMapping("/home")
    public String home() {
        return "home";  // "home"이라는 이름을 가진 뷰를 찾아 렌더링
    }

    ViewResolver"home"이라는 이름을 기반으로 실제 렌더링할 JSP, Thymeleaf 파일을 찾아내는 역할을 합니다.

3) LocaleResolver (로케일 리졸버)

  • 역할: 사용자의 언어와 지역 설정(로케일)을 결정합니다. 이 설정에 따라 스프링이 국제화된 메시지와 포맷을 선택할 수 있습니다.

    예시: 웹 요청의 헤더나 세션에서 로케일 정보를 읽어들이고, 그에 맞는 언어로 콘텐츠를 제공할 때 사용됩니다.

4) ExceptionResolver (예외 리졸버)

  • 역할: 스프링 MVC에서 발생한 예외를 처리하고, 적절한 응답을 반환합니다.
  • 예시: 특정 예외가 발생했을 때 이를 처리하여, 사용자에게 알맞은 오류 페이지를 반환하거나 JSON 응답을 돌려주는 역할을 합니다.

5) HandlerMapping (핸들러 매핑)

  • 역할: 요청 URL을 보고, 해당 요청을 처리할 핸들러(컨트롤러 메서드)를 결정하는 역할을 합니다.
  • 스프링 MVC에서, 들어온 요청을 처리할 컨트롤러를 찾는 것이 바로 HandlerMapping의 역할입니다.

4. 리졸버의 동작 예시

예를 들어, 다음과 같은 코드가 있다고 가정해보겠습니다:

@GetMapping("/users/{id}")
public String getUser(@PathVariable Long id, Model model) {
    model.addAttribute("user", userService.findUserById(id));
    return "userProfile";  // 뷰 이름을 반환
}

이 코드에서 스프링이 어떻게 리졸버를 사용하는지 살펴보겠습니다.

  1. HandlerMethodArgumentResolver@PathVariable("id")을 보고, URL 경로에서 값을 추출하여 id 변수에 전달합니다.
  2. ViewResolver는 컨트롤러가 반환한 "userProfile"이라는 뷰 이름을 해석하여 실제 렌더링할 JSP 또는 Thymeleaf 템플릿을 찾아 렌더링합니다.

5. 리졸버의 역할 요약

리졸버는 스프링의 내부 처리 과정에서 동적인 요소를 해결하는 중요한 역할을 합니다. 스프링 MVC와 같은 웹 애플리케이션에서 요청을 처리하고, 응답을 생성하는 전 과정에서 다양한 리졸버들이 함께 작동하여 애플리케이션의 동작을 원활하게 해줍니다.

  • HandlerMethodArgumentResolver: 컨트롤러 메서드에 전달할 파라미터를 해석하여 주입.
  • ViewResolver: 컨트롤러가 반환하는 뷰 이름을 실제 뷰 객체로 변환.
  • LocaleResolver: 사용자의 로케일 정보를 해석하여 적절한 언어 설정.
  • ExceptionResolver: 발생한 예외를 처리하여 적절한 응답 생성.

이처럼 리졸버는 스프링 내부에서 필요한 정보를 동적으로 결정하고, 그 정보를 바탕으로 처리 흐름을 제어하는 데 중요한 역할을 합니다.