스프링에서 Controller 단에서 흔히 사용하는 @RequestParam 어노테이션과 @PathVariable 어노테이션
사용도중 쓰임이 비슷하여 차이점을 명확히 알고싶어서 정리하게 됐습니다.
먼저, 두 어노테이션은 http의 비연결성을 극복하고 데이터 전달을 위한 방법입니다.
즉, uri를 통해 전달된 값을 파라미터로 받아오는 역할을 합니다.
- http://localhost:8080/article/comment?name=홍길동&age=20
- http://localhost:8080/article/comment/1
먼저, 정리해보면 첫번째와 같이 쿼리스트링을 통해 여러개의 값을 전달하는 첫번째 방식은 @RequetParam이고 두 번째 방식은 @PathVariable 입니다.
Case 1의 경우 파라미터의 값과 이름을 함께 전달하는 방식으로 게시판 등에서 페이지 및 검색 정보를 함께 전달하는 방식을 사용할 때 많이 사용합니다.
Case 2의 경우 URL, Rest api에서 값을 호출할 때 주로 많이 사용합니다.
@RequestParam
- @RequestParam("실제 값") 자료형 `설정할 변수 이름`
-> URL이 전달될 때 name 파라미터(name에 담긴 value)를 담아옴. - defaultValue - 값이 설정되지 않을 때 기본으로 설정할 값
- name - 바인딩할 요청 파라미터의 이름
- value - name의 별칭
- required - 필수 값인지 설정하는 값
@RestController
public class TestController (){
@GetMapping("/article/comment")
public String test(@RequestParam("name") String name,
@RequestParam("age") int age){
//아래와 같이 해당 변수에 파라미터값이 할당된다.
//name = "홍길동"
//age = "11"
return "TEST 성공"
}
}
위와 같이 @RequestParam 지정한 키값이 존재하지 않다면 BadRequest로 4xx 에러가 발생합니다.
이를 방지하기 위해 필수적이지 않도록 그리고 존재하지 않다면 DefaultValue를 지정할 수 있습니다.
@RestController
public class TestController (){
@GetMapping("/article/comment")
public String test(@RequestParam(value="name", required=false, defaultValue ="0") String name){
return "TEST 성공"
}
}
만약 파라미터가 많아지게 된다면?
위 예시는 파라미터가 2개이지만, 만약에 파라미터가 3개 이상일 경우에는 어떨까요??
가독성도 떨어지고 코드가 길어질 수 있습니다.
이럴때 유용한게 "Map" 입니다.
하지만, 개발한 이외의 사람들은 파라미터가 뭐가 들어올지를 모르기 때문에 유지보수하기에는 어렵다는 단점이 있습니다.
@RestController
public class TestController (){
@GetMapping("/article/comment")
public String test(@RequestParam HashMap<Stirng, String> paramMap){
Stirng data = paramMap.get("name");
return "성공";
}
}
@PathVariable
메소드 정의에서 위에 쓴 변수명을 그대로 @PathVariable("변수명")
@RestController
public class TestController (){
@GetMapping("/article/comment/{id}")
public String test(@PathVariable Long id){
Member member = memberRepository.findById(id);
return new MemberResponseDto(member);
}
}
참고
https://inseok9068.github.io/springboot/springboot-parameter/
'Spring' 카테고리의 다른 글
@RequestBody vs @ModelAttribute (0) | 2022.09.25 |
---|---|
연관관계 편의 메서드 필요성 [Spring] (0) | 2022.09.13 |
@Controller에서 vs @RestController [Spring] (0) | 2022.09.12 |
DTO vs VO (0) | 2022.07.15 |