Method Arguments

2024. 10. 9. 21:12Spring 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 요청을 유연하게 처리할 수 있습니다. 각 인수는 특정한 목적을 가지고 있으며, 이를 통해 클라이언트의 요청을 효과적으로 관리할 수 있습니다.

 

<참고> : https://docs.spring.io/spring-framework/reference/web/webmvc/mvc-controller/ann-methods/arguments.html

'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