오늘은 Spring MVC에서 클라이언트에서 전달한 URL 파라미터를 받아 컨트롤러에서 받아들이는 @RequestParam과 @PathVariable의 차이를 알아보고자 합니다. 이 두가지 어노테이션은 비슷한 기능을 하지만 약간의 차이를 가지고 있습니다.
@RequestParam
@RequestParam은 요청 매개변수를 가져오는데 사용됩니다. 이 어노테이션은 요청 매개변수를 핸들러 메소드의 인수에 자동으로 바인딩합니다. 또한 int, long, float, string, date 등과 같은 일부 표준 유형에 대한 자동 유형 변환을 제공합니다. 아래의 예를 보면서 자세히 설명하겠습니다.
요청 URL : http://localhost:8080/api/boards?id=3
@GetMapping("/boards")
public BoardResponseDto findById(@RequestParam("id") Long id) throws Exception{
logger.debug("id : "+id);
//...
}
위와같은 url을 요청했을때 @RequestParam은 url의 매개변수값을 바인딩하여 URL에 있는 id=3의 id값을 Long id에 매핑시킵니다.Debugging을 출력한 결과는 아래와 같습니다.
@RequestParam에서 사용하는 옵션은 아래와 같은 것들이 있습니다.
- defaultValue : String 타입의 속성이며, request 파라미터가 제공되지 않거나 값이 비어있을 때 기본값으로 셋팅하는 값입니다.
- name : String 타입의 속성이며, 요청 매개변수의 이름을 정의합니다.
- required : Boolean 타입의 속성이며, 요청 매개변수가 필수값인지 아닌지를 정의합니다.
- value : String 타입의 속성이며, 이름에 별명을 정의합니다.
@PathVariable
@PathVariable은 URL에서 각 구분자에 들어오는 값을 처리할 때 사용합니다. 요청 URL에 값만 매핑되어 들어왔을 경우 경우 사용되며, ReqeustMapping 혹은 GetMapping값에 각 구분자가 어떤 값을 의미하는지 작성되어야 값을 읽을 수 있습니다.아래의 예시를 보면서 자세히 설명하겠습니다.
요청 URL : http://localhost:8080/api/boards/3/5/18
@GetMapping("/boards/{grade}/{cls}/{num}")
public BoardResponseDto findById(@PathVariable("grade") Long grade,
@PathVariable("cls") Long cls,
@PathVariable("num") Long num) throws Exception{
logger.debug("Grade : "+grade);
logger.debug("Class : "+cls);
logger.debug("Number : "+num);
// ...
}
위와 같은 URL을 요청받았을때, 각 구분자의 값이 어떤것을 의미하는지 URL에 정의되어 해당값을 변수로 읽습니다.
위의 예시에서는 첫번째 구분자를 grade, 두번째 구분자를 cls, 세번째 구분자를 num으로 지정하여 구분자의 값을 순서대로 읽어 요청변수로 바인딩 합니다.
@PathVariable에서 사용하는 옵션은 아래와 같은 것들이 있습니다.
- value : String 유형 속성이고, URL에서 구분자에 따라서 바인딩할 값을 의미합니다.
위 2개의 URL 어노테이션이 요청 매겨변수 값을 가져오는 방법이 다르지만, 같이 사용할 수 있습니다.
요청 URL : http://localhost:8080/api/boards/3/5/18?name=John
@GetMapping("/boards/{grade}/{cls}/{num}")
public BoardResponseDto findById(@PathVariable("grade") Long grade,
@PathVariable("cls") Long cls,
@PathVariable("num") Long num,
@RequestParam(name="name") String name) throws Exception{
logger.debug("Grade : "+grade);
logger.debug("Class : "+cls);
logger.debug("Number : "+num);
logger.debug("Name : "+name);
//...
}
따라서 전달되는 URL의 값에 따라서 @RequestParam과 @PathVariable을 적절히 사용하여 요청 매개변수 값을 매핑하여 사용하면 될것 같습니다.
[ 참조 ]
https://www.dineshonjava.com/requestparam-vs-pathvariable-annotations-in-spring-mvc/
'개발 > Spring' 카테고리의 다른 글
[Spring] 의존성 주입의 정의 및 의존성 주입 3가지 방식 (생성자 주입, 수정자 주입, 필드 주입) (0) | 2022.04.30 |
---|---|
[Spring Boot] Thymeleaf 사용하기 (0) | 2022.03.06 |
[Spring] SSE(Server-Sent Events) 이해하기[실시간 서버 데이터 구독] (0) | 2022.02.10 |
[Spring] @Controller와 @RestController 차이 (0) | 2022.02.08 |
[Spring Boot] Spring Security 로그인기능 구현하기 (0) | 2022.01.29 |