2024. 10. 9. 21:12ㆍSpring Framework/Web on Servlet Stack
다음 표는 지원되는 컨트롤러 메서드 아규먼트를 설명합니다.
JDK 8의 java.util.Optional
은 필수 속성이 있는 어노테이션(@RequestParam, @RequestHeader 등)과 결합하여 메서드 아규먼트로 지원되며, 이는 required=false
와 동일합니다.
Controller Method Argument | 설명 |
---|---|
WebRequest , NativeWebRequest |
Servlet API를 직접 사용하지 않고 요청 파라미터 및 요청 및 세션 속성에 대한 일반적인 접근. |
jakarta.servlet.ServletRequest , jakarta.servlet.ServletResponse |
특정 요청 또는 응답 유형을 선택 — 예: ServletRequest , HttpServletRequest 또는 Spring의 MultipartRequest , MultipartHttpServletRequest . |
jakarta.servlet.http.HttpSession |
세션의 존재를 강제합니다. 결과적으로 이러한 아규먼트는 절대 null이 아닙니다. 세션 접근은 스레드 안전하지 않으므로 여러 요청이 동시에 세션에 접근할 수 있도록 허용되는 경우 RequestMappingHandlerAdapter 인스턴스의 synchronizeOnSession 플래그를 true로 설정하는 것을 고려하십시오. |
jakarta.servlet.http.PushBuilder |
프로그래밍 방식의 HTTP/2 리소스 푸시를 위한 Servlet 4.0 푸시 빌더 API. 클라이언트가 해당 HTTP/2 기능을 지원하지 않는 경우, 주입된 PushBuilder 인스턴스는 null일 수 있습니다. |
java.security.Principal |
현재 인증된 사용자 — 알려진 경우 특정 Principal 구현 클래스를 포함할 수 있습니다. |
HttpMethod |
요청의 HTTP 메서드. |
java.util.Locale |
가장 특정한 LocaleResolver 에 의해 결정된 현재 요청의 로케일. |
java.util.TimeZone + java.time.ZoneId |
LocaleContextResolver 에 의해 결정된 현재 요청과 관련된 시간대. |
java.io.InputStream , java.io.Reader |
Servlet API에 의해 노출된 원시 요청 본문에 접근하기 위한 것입니다. |
java.io.OutputStream , java.io.Writer |
Servlet API에 의해 노출된 원시 응답 본문에 접근하기 위한 것입니다. |
@PathVariable |
URI 템플릿 변수에 접근하기 위한 것입니다. URI 패턴을 참조하십시오. |
@MatrixVariable |
URI 경로 세그먼트의 이름-값 쌍에 접근하기 위한 것입니다. 매트릭스 변수를 참조하십시오. |
@RequestParam |
Servlet 요청 파라미터에 접근하기 위한 것입니다. 여기에는 멀티파트 파일이 포함됩니다. 파라미터 값은 선언된 메서드 아규먼트 유형으로 변환됩니다. @RequestParam 과 멀티파트를 참조하십시오. |
@RequestHeader |
요청 헤더에 접근하기 위한 것입니다. 헤더 값은 선언된 메서드 아규먼트 유형으로 변환됩니다. @RequestHeader 를 참조하십시오. |
@CookieValue |
쿠키에 접근하기 위한 것입니다. 쿠키 값은 선언된 메서드 아규먼트 유형으로 변환됩니다. @CookieValue 를 참조하십시오. |
@RequestBody |
HTTP 요청 본문에 접근하기 위한 것입니다. 본문 내용은 HttpMessageConverter 구현을 사용하여 선언된 메서드 아규먼트 유형으로 변환됩니다. @RequestBody 를 참조하십시오. |
HttpEntity<B> |
요청 헤더 및 본문에 접근하기 위한 것입니다. 본문은 HttpMessageConverter 로 변환됩니다. HttpEntity 를 참조하십시오. |
@RequestPart |
multipart/form-data 요청의 일부에 접근하기 위한 것입니다. 해당 부분의 본문은 HttpMessageConverter 로 변환됩니다. 멀티파트를 참조하십시오. |
java.util.Map , org.springframework.ui.Model , org.springframework.ui.ModelMap |
HTML 컨트롤러에서 사용되는 모델에 접근하기 위한 것입니다. 이는 템플릿에서 뷰 렌더링의 일부로 노출됩니다. |
RedirectAttributes |
리디렉션 시 사용할 속성을 지정합니다 (즉, 쿼리 문자열에 추가됨) 및 리디렉션 후 요청까지 임시로 저장될 플래시 속성. 리디렉트 속성 및 플래시 속성을 참조하십시오. |
@ModelAttribute |
데이터 바인딩 및 유효성 검사가 적용된 모델에서 기존 속성에 접근하기 위한 것입니다 (존재하지 않으면 인스턴스화됨). @ModelAttribute 및 모델과 데이터 바인더를 참조하십시오. |
Error, BindingResult |
명령 객체(@ModelAttribute 아규먼트)에 대한 유효성 검사 및 데이터 바인딩의 오류 또는 @RequestBody 또는 @RequestPart 아규먼트의 유효성 검사 오류에 접근하기 위한 것입니다. 유효성 검사된 메서드 아규먼트 직후에 Errors 또는 BindingResult 아규먼트를 선언해야 합니다. |
SessionStatus + 클래스 레벨 @SessionAttributes |
양식 처리가 완료되었음을 표시하여 클래스 레벨의 @SessionAttributes 어노테이션을 통해 선언된 세션 속성의 정리를 트리거합니다. @SessionAttributes 에 대한 자세한 내용을 참조하십시오. |
UriComponentsBuilder |
현재 요청의 host, port, skim, 컨텍스트 경로 및 서블릿 매핑의 리터럴 부분에 상대적인 URL을 준비하기 위한 것입니다. URI 링크를 참조하십시오. |
@SessionAttribute |
클래스 레벨의 @SessionAttributes 선언 결과로 세션에 저장된 모델 속성과 대조적으로 세션 속성에 접근하기 위한 것입니다. @SessionAttribute 에 대한 자세한 내용을 참조하십시오. |
@RequestAttribute |
요청 속성에 접근하기 위한 것입니다. @RequestAttribute 에 대한 자세한 내용을 참조하십시오. |
Any other argument | 메서드 아규먼트가 이 표의 이전 값과 일치하지 않고 간단한 유형인 경우(BeanUtils#isSimpleProperty에 의해 결정됨) @RequestParam 으로 해결됩니다. 그렇지 않으면 @ModelAttribute 로 해결됩니다. |
Spring의 @RequestMapping
애너테이션은 다양한 메서드 아규먼트를 지원하여 HTTP 요청을 처리하는 데 매우 유용합니다. 이 설명에서는 각 메서드 아규먼트의 기능과 사용 방법을 샘플 코드와 함께 자세히 설명하겠습니다.
1. WebRequest
, NativeWebRequest
이 아규먼트는 요청 파라미터와 요청 및 세션 속성에 대한 일반적인 접근을 제공합니다. WebRequest
를 사용하면 Servlet API에 직접 접근하지 않고도 요청 정보를 다룰 수 있습니다.
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.context.request.WebRequest;
@RestController
public class WebRequestController {
@GetMapping("/webrequest")
public String handleWebRequest(WebRequest request) {
String paramValue = request.getParameter("paramName");
return "Received parameter: " + paramValue;
}
}
2. jakarta.servlet.ServletRequest
, jakarta.servlet.ServletResponse
Servlet API를 사용하여 특정 요청 또는 응답 유형을 선택할 수 있습니다.
import jakarta.servlet.ServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class ServletController {
@PostMapping("/servlet")
public String handleServletRequest(ServletRequest request, HttpServletResponse response) {
String remoteAddr = request.getRemoteAddr();
return "Remote address: " + remoteAddr;
}
}
3. jakarta.servlet.http.HttpSession
세션의 존재를 강제하며, 이러한 아규먼트는 절대 null이 아닙니다.
세션의 존재를 강제한다는 것은: 메서드 아규먼트로 HttpSession을 선언함으로써, 해당 메서드가 호출될 때 반드시 유효한 세션이 있어야 함을 보장하는 것입니다. 세션이 없을 경우 메서드는 호출되지 않고, Spring은 예외를 발생시킵니다. 이는 개발자가 세션 관리를 보다 쉽게 할 수 있도록 도와줍니다.
import jakarta.servlet.http.HttpSession;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class SessionController {
@GetMapping("/session")
public String handleSession(HttpSession session) {
session.setAttribute("username", "user123");
return "Session attribute set: " + session.getAttribute("username");
}
}
4. java.security.Principal
현재 인증된 사용자 정보를 얻는 데 사용됩니다.
import java.security.Principal;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class PrincipalController {
@GetMapping("/principal")
public String handlePrincipal(Principal principal) {
return "Authenticated user: " + principal.getName();
}
}
5. HttpMethod
요청의 HTTP 메서드를 확인할 수 있습니다.
import org.springframework.http.HttpMethod;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HttpMethodController {
@RequestMapping("/httpmethod")
public String handleHttpMethod(HttpMethod httpMethod) {
return "HTTP Method: " + httpMethod;
}
}
6. @PathVariable
URI 템플릿 변수에 접근하는 데 사용됩니다.
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class PathVariableController {
@GetMapping("/user/{id}")
public String getUserById(@PathVariable String id) {
return "User ID: " + id;
}
}
7. @RequestParam
Servlet 요청 파라미터에 접근할 수 있습니다.
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class RequestParamController {
@GetMapping("/requestparam")
public String handleRequestParam(@RequestParam String name) {
return "Hello, " + name + "!";
}
}
8. @RequestHeader
요청 헤더에 접근하는 데 사용됩니다.
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class RequestHeaderController {
@GetMapping("/requestheader")
public String handleRequestHeader(@RequestHeader("User-Agent") String userAgent) {
return "User-Agent: " + userAgent;
}
}
9. @RequestBody
HTTP 요청 본문에 접근하는 데 사용됩니다.
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class RequestBodyController {
@PostMapping("/requestbody")
public String handleRequestBody(@RequestBody String body) {
return "Received body: " + body;
}
}
10. @ModelAttribute
모델에서 기존 속성에 접근하는 데 사용됩니다. 데이터 바인딩과 유효성 검사가 적용됩니다.
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class ModelAttributeController {
@GetMapping("/modelattribute")
public String handleModelAttribute(@ModelAttribute User user) {
return "User: " + user.getName();
}
}
class User {
private String name;
// Getters and Setters
public String getName() { return name; }
public void setName(String name) { this.name = name; }
}
11. Errors
, BindingResult
유효성 검사 및 데이터 바인딩 오류에 접근하는 데 사용됩니다.
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class ErrorsController {
@PostMapping("/errors")
public String handleErrors(@RequestBody User user, BindingResult bindingResult) {
if (bindingResult.hasErrors()) {
return "Errors occurred: " + bindingResult.getAllErrors();
}
return "User name: " + user.getName();
}
}
12. @SessionAttribute
세션 속성에 접근하는 데 사용됩니다.
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.SessionAttributes;
@RestController
@RequestMapping("/session")
@SessionAttributes("username")
public class SessionAttributeController {
@GetMapping("/set")
public String setSessionAttribute() {
return "Session attribute set: username";
}
@GetMapping("/get")
public String getSessionAttribute(@SessionAttribute("username") String username) {
return "Session attribute username: " + username;
}
}
이와 같이 다양한 메서드 인수를 사용하여 HTTP 요청을 유연하게 처리할 수 있습니다. 각 인수는 특정한 목적을 가지고 있으며, 이를 통해 클라이언트의 요청을 효과적으로 관리할 수 있습니다.
'Spring Framework > Web on Servlet Stack' 카테고리의 다른 글
Type Conversion (0) | 2024.10.09 |
---|---|
Return Values (0) | 2024.10.09 |
Handler Method (0) | 2024.10.09 |
Mapping Requests (0) | 2024.10.09 |
Declaration (1) | 2024.10.09 |