@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의 다른 매핑 어노테이션)을 사용한 컨트롤러 메서드에서 받을 수 있는 몇 가지 객체 유형입니다:
- HttpServletRequest: 현재 HTTP 요청 정보를 포함합니다.
- HttpServletResponse: 현재 HTTP 응답을 조작할 수 있는 객체입니다.
- HttpSession: 현재 HTTP 세션 정보에 접근할 수 있습니다.
- Model/ModelMap: 뷰에 전달할 데이터를 담는 객체입니다.
- RedirectAttributes: 리다이렉트 시에 사용할 속성 정보를 담습니다.
- WebRequest/WebRequest: 현재 요청에 대한 정보를 포함하는 일반적인 객체입니다.
- Locale: 현재 요청의 로케일 정보를 나타냅니다.
- InputStream/Reader: 요청 본문을 읽기 위한 입력 스트림입니다.
- OutputStream/Writer: 응답 본문을 쓰기 위한 출력 스트림입니다.
- @PathVariable: URI 템플릿 변수의 값을 메서드의 매개변수로 바인딩합니다.
- @RequestParam: 요청 파라미터의 값을 메소드의 매개변수로 바인딩합니다.
- @RequestBody: 요청 본문을 HTTP 메시지로부터 객체로 변환하여 바인딩합니다.
- @RequestHeader: 요청 헤더의 값을 메소드의 매개변수로 바인딩합니다.
- @CookieValue: 쿠키의 값을 메소드의 매개변수로 바인딩합니다.
- Command objects: 요청 파라미터를 객체에 바인딩하기 위한 객체입니다. (ex: form-backing objects)
- Errors/BindingResult: 바인딩 오류 정보를 포함하는 객체입니다.
- SessionStatus: 현재 세션 처리 상태를 나타냅니다.
- 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의 유연성과 강력한 기능을 잘 보여줍니다.
'웹 개발(Web Development) > Spring' 카테고리의 다른 글
| [Spring] 데이터 전송과 응답 방법 (0) | 2024.03.17 |
|---|---|
| [Spring] Model과 JSP 내장 객체 EL 사용법 (0) | 2024.03.14 |
| STS(Spring Tool Suite) 자동 주석 템플릿 설정 방법 (0) | 2024.03.04 |
| Spring MVC(Spring Legacy Project) (0) | 2024.03.03 |
| Spring Framework vs Spring Boot (0) | 2024.03.03 |