본문 바로가기
웹 개발(Web Development)/Spring

[Spring] @RequestMapping 이란? 다양한 방식의 매개변수

by whisperscope_ai 2024. 3. 14.
반응형

@RequestMapping은 Spring Framework에서 사용되는 주요 어노테이션 중 하나로, 요청(Request)을 특정 메서드나 클래스에 매핑(mapping)하는 역할을 합니다. 즉, 클라이언트의 요청 URL을 어떤 메서드가 처리할지 결정하는 데 사용됩니다. Spring MVC에서 컨트롤러(Controller) 클래스 또는 메서드에 이 어노테이션을 사용하여 HTTP 요청을 해당 메서드로 라우팅 할 수 있습니다.

기본 사용법

  • 클래스 레벨에서 사용하기: 컨트롤러 내의 모든 메소드에 공통적으로 적용될 기본 경로(prefix)를 설정합니다.
  • 메서드 레벨에서 사용하기: 특정 HTTP 요청(URL, HTTP 메서드 등)을 특정 메서드에 매핑합니다.

주요 속성

  • value: 요청 URL을 지정합니다.
  • method: HTTP 메소드(GET, POST, PUT, DELETE 등)를 지정합니다. 이를 통해 같은 URL이라도 요청 타입에 따라 다른 메서드를 호출할 수 있습니다.
  • params: 요청에 특정 파라미터가 있을 조건을 지정합니다.
  • headers: 요청에 특정 헤더가 있을 조건을 지정합니다.
  • consumes: 요청이 소비할 수 있는 미디어 타입을 지정합니다.
  • produces: 응답으로 생성할 수 있는 미디어 타입을 지정합니다.

예시

@Controller
@RequestMapping("/api")
public class SampleController {

    @RequestMapping(value = "/hello", method = RequestMethod.GET)
    public String sayHello() {
        return "hello";
    }

    @RequestMapping(value = "/hello", method = RequestMethod.POST)
    public String sayHelloPost() {
        return "helloPost";
    }
}

위 예시에서 SampleController 클래스는 /api 경로로 시작하는 요청을 처리합니다. /api/hello 경로로 GET 요청이 들어오면 sayHello 메소드가, POST 요청이 들어오면 sayHelloPost 메소드가 처리합니다.

Spring 4.3 버전 이후로는 @GetMapping, @PostMapping, @PutMapping, @DeleteMapping, @PatchMapping과 같은 더 구체적인 어노테이션을 사용하여 메서드 레벨에서 HTTP 메서드를 더 명확하게 지정할 수 있습니다. 이는 @RequestMapping의 단순화된 형태로, 코드의 가독성과 유지 보수성을 향상시킵니다.

Spring MVC Handler Method Parameters

Spring MVC에서 @RequestMapping 어노테이션을 사용한 핸들러 메서드는 다양한 타입의 매개변수를 받을 수 있습니다. 이는 스프링 프레임워크가 제공하는 다양한 내장 타입의 지원 덕분입니다. 여기에는 HttpSession과 같은 웹 관련 객체부터, 커맨드 객체, 에러 객체 등 다양한 범위가 포함됩니다. 이러한 매개변수들은 스프링의 DispatcherServlet이 요청을 처리할 때 자동으로 적절한 값이나 객체로 바인딩됩니다.

다음은 @RequestMapping (또는 스프링 MVC의 다른 매핑 어노테이션)을 사용한 컨트롤러 메서드에서 받을 수 있는 몇 가지 객체 유형입니다:

  1. HttpServletRequest: 현재 HTTP 요청 정보를 포함합니다.
  2. HttpServletResponse: 현재 HTTP 응답을 조작할 수 있는 객체입니다.
  3. HttpSession: 현재 HTTP 세션 정보에 접근할 수 있습니다.
  4. Model/ModelMap: 뷰에 전달할 데이터를 담는 객체입니다.
  5. RedirectAttributes: 리다이렉트 시에 사용할 속성 정보를 담습니다.
  6. WebRequest/WebRequest: 현재 요청에 대한 정보를 포함하는 일반적인 객체입니다.
  7. Locale: 현재 요청의 로케일 정보를 나타냅니다.
  8. InputStream/Reader: 요청 본문을 읽기 위한 입력 스트림입니다.
  9. OutputStream/Writer: 응답 본문을 쓰기 위한 출력 스트림입니다.
  10. @PathVariable: URI 템플릿 변수의 값을 메서드의 매개변수로 바인딩합니다.
  11. @RequestParam: 요청 파라미터의 값을 메소드의 매개변수로 바인딩합니다.
  12. @RequestBody: 요청 본문을 HTTP 메시지로부터 객체로 변환하여 바인딩합니다.
  13. @RequestHeader: 요청 헤더의 값을 메소드의 매개변수로 바인딩합니다.
  14. @CookieValue: 쿠키의 값을 메소드의 매개변수로 바인딩합니다.
  15. Command objects: 요청 파라미터를 객체에 바인딩하기 위한 객체입니다. (ex: form-backing objects)
  16. Errors/BindingResult: 바인딩 오류 정보를 포함하는 객체입니다.
  17. SessionStatus: 현재 세션 처리 상태를 나타냅니다.
  18. Principal: 현재 인증된 사용자 정보를 나타냅니다.

이러한 객체들은 대부분의 스프링 웹 애플리케이션 개발 시 필요한 정보에 접근하거나, 웹 요청 및 응답을 처리하는데 필요한 기능을 제공합니다. 개발자는 이러한 매개변수들을 활용하여 효율적으로 웹 애플리케이션을 개발할 수 있습니다.

HttpServletRequest

  • 설명: 현재 HTTP 요청에 대한 정보를 포함하는 객체입니다. 요청 URL, 헤더, 파라미터 등에 접근할 수 있습니다.
  • 예제:
    @RequestMapping("/request")
    public String handleRequest(HttpServletRequest request) {
        String parameter = request.getParameter("param");
        // 로직 처리
        return "viewName";
    }

HttpServletResponse

  • 설명: 현재 HTTP 응답을 조작할 수 있는 객체입니다. 응답 상태 코드, 헤더 설정 등이 가능합니다.
  • 예제:
    @RequestMapping("/response")
    public void handleResponse(HttpServletResponse response) {
        response.setStatus(HttpServletResponse.SC_OK);
        // 추가 응답 처리
    }

HttpSession

  • 설명: 현재 사용자 세션에 접근할 수 있습니다. 세션에 데이터를 저장하거나 조회할 수 있습니다.
  • 예제:
    @RequestMapping("/session")
    public String handleSession(HttpSession session) {
        session.setAttribute("attribute", "value");
        // 세션 관련 로직 처리
        return "viewName";
    }

Model/ModelMap

  • 설명: 뷰에 전달할 데이터를 담습니다. Model 인터페이스 또는 ModelMap 클래스를 사용할 수 있습니다.
  • 예제:
    @RequestMapping("/model")
    public String handleModel(Model model) {
        model.addAttribute("attribute", "value");
        return "viewName";
    }

RedirectAttributes

  • 설명: 리다이렉션 시에 사용할 속성 정보를 담습니다. 리다이렉트 URL에 파라미터를 추가하는 등의 작업에 사용됩니다.
  • 예제:
    @RequestMapping("/redirect")
    public String handleRedirect(RedirectAttributes redirectAttributes) {
        redirectAttributes.addAttribute("param", "value");
        return "redirect:/destination";
    }

WebRequest/WebRequest

  • 설명: 현재 요청에 대한 정보를 포함하는 일반적인 객체입니다. HttpServletRequest를 직접 사용하는 대신 이를 추상화한 인터페이스입니다.
  • 예제:
    @RequestMapping("/webRequest")
    public String handleWebRequest(WebRequest webRequest) {
        String parameter = webRequest.getParameter("param");
        // 로직 처리
        return "viewName";
    }

Locale

  • 설명: 현재 요청의 로케일 정보입니다. 국제화(i18n) 기능 구현 시 유용합니다.
  • 예제:
    @RequestMapping("/locale")
    public String handleLocale(Locale locale) {
        // 로케일 기반 처리
        return "viewName";
    }

InputStream/Reader

  • 설명: 요청 본문을 읽기 위한 입력 스트림입니다. 바이트(InputStream) 또는 문자(Reader) 기반으로 데이터를 읽습니다.
  • 예제:
    @RequestMapping("/input")
    public String handleInput(InputStream inputStream) {
        // 입력 스트림 처리
        return "viewName";
    }

OutputStream/Writer

  • 설명: 응답 본문을 쓰기 위한 출력 스트림입니다. 바이트(OutputStream) 또는 문자(Writer) 기반으로 데이터를 씁니다.
  • 예제:
    @RequestMapping("/output")
    public void handleOutput(OutputStream outputStream) {
        // 출력 스트림 처리
    }

@PathVariable

  • 설명: URI 템플릿 변수의 값을 메소드의 매개변수로 바인딩합니다. URL 경로의 일부를 파라미터로 사용할 때 활용됩니다.
  • 예제:
    @RequestMapping("/path/{variable}")
    public String handlePathVariable(@PathVariable("variable") String variable) {
        // 변수 사용 로직
        return "viewName";
    }

@RequestParam

  • 설명: 요청 파라미터의 값을 메소드의 매개변수로 바인딩합니다. 주로 GET 요청의 쿼리 파라미터 또는 POST 요청의 폼 데이터 처리에 사용됩니다.
  • 예제:
    @RequestMapping("/requestParam")
    public String handleRequestParam(@RequestParam("param") String param) {
        // 파라미터 사용 로직
        return "viewName";
    }

@RequestBody

  • 설명: HTTP 요청의 본문을 객체로 변환하여 바인딩합니다. 주로 JSON이나 XML과 같은 복잡한 데이터 구조를 받을 때 사용됩니다.
  • 예제:
    @PostMapping("/body")
    public String handleRequestBody(@RequestBody MyObject myObject) {
        // 객체 처리 로직
        return "viewName";
    }

@RequestHeader

  • 설명: 요청 헤더의 값을 메소드의 매개변수로 바인딩합니다. 특정 헤더 값을 필요로 할 때 사용합니다.
  • 예제:
    @RequestMapping("/header")
    public String handleRequestHeader(@RequestHeader("headerName") String headerValue) {
        // 헤더 값 처리 로직
        return "viewName";
    }

@CookieValue

  • 설명: 쿠키의 값을 메소드의 매개변수로 바인딩합니다. 사용자의 로컬 쿠키 정보를 필요로 할 때 유용합니다.
  • 예제:
    @RequestMapping("/cookie")
    public String handleCookieValue(@CookieValue("cookieName") String cookieValue) {
        // 쿠키 값 처리 로직
        return "viewName";
    }

Command objects

  • 설명: 요청 파라미터를 객체에 바인딩하기 위한 객체입니다. 주로 폼 데이터를 받아 처리할 때 사용합니다.
  • 예제:
    @PostMapping("/command")
    public String handleCommandObject(@ModelAttribute("command") CommandObject commandObject) {
        // 커맨드 객체 처리 로직
        return "viewName";
    }

SessionStatus

  • 설명: 현재 세션 처리 상태를 나타냅니다. 세션 완료 처리 등에 사용됩니다.
  • 세션 완료 처리 (setComplete() 메서드): 가장 주요한 기능으로, 현재 컨트롤러에서 관리하는 세션 어트리뷰트를 제거합니다. @SessionAttributes를 통해 세션에 저장된 어트리뷰트는 해당 세션 어트리뷰트가 더 이상 필요하지 않을 때 명시적으로 세션에서 제거해야 합니다. setComplete() 메서드를 호출하면, 스프링은 @SessionAttributes에 의해 관리되는 세션 어트리뷰트를 세션에서 제거합니다. 이는 폼 처리가 완료되었을 때 사용자의 세션을 정리하는 데 유용하며, 리소스 누수를 방지하고 애플리케이션의 보안을 강화하는 데 도움이 됩니다.

사용 예제:

@PostMapping("/processForm")
public String processForm(@ModelAttribute("formModel") FormModel formModel, SessionStatus status) {
    // 폼 처리 로직
    ...
    // 폼 처리가 완료되었으므로 세션에서 formModel을 제거
    status.setComplete();
    return "redirect:/formSubmitted";
}

이러한 예제들은 Spring MVC에서 @RequestMapping을 사용한 핸들러 메서드에서 다양한 종류의 매개변수를 받는 방법을 보여줍니다. 이를 통해 요청 데이터 처리, 사용자 인증 정보 접근, 폼 데이터 검증 및 처리, 세션 관리 등 다양한 웹 애플리케이션의 필요를 충족시킬 수 있습니다. 각 예제는 실제 애플리케이션 개발 시 자주 사용되는 패턴을 반영하며, Spring MVC의 유연성과 강력한 기능을 잘 보여줍니다.

반응형