본문 바로가기
코딩 공부/web & Java

[Spring] RequestParam과 PathVariable

by 현장 2023. 11. 7.

@RequestParam과 @PathVariable

컨트롤러에서 Requestparam, PathVariable은 uri를 통해서 파라미터 값을 넘겨받을 때 사용하는 어노테이션입니다. 

 

uri를 통해서 값을 전달하는 방식은 아래와 같이 2가지 방법이 있습니다.

RequestParam →  http://xxx.x.x?id=1
PathVariable → http://xxxx.x.x/users/1

 

RequestParam의 경우 파라미터의 값과 이름을 함께 전달하는 방식으로 게시판 등에서 페이지 및 검색 정보를 함께 전달하는 방식을 사용할 때 많이 사용합니다. 

 

PathVariable 의 경우 Rest api에서 값을 호출할 때 주로 많이 사용합니다.

 

이와 같이 Spring에서는 이러한 전달인자를 처리하는데 두 가지 방법을 제공합니다.

 

@RequestParam

@GetMapping("testRequestParam")
public String testRequestParam(
            @RequestParam(value="name1") String value1, 
            @RequestParam(value="name2") String value2){
     // 생략
}

 

위처럼 하나 이상의 타입을 적용 수 있으며 스프링에서 지원하는 모든 타입을 변환이 가능합니다. 또한 하나 이상의 파라미터가 있을 경우 사용이 가능합니다.

 

/testRequestParam?name1=1&name2=2

위의 경우 name1과 name2의 값을 받아오게 되며  RequestParam의 value 값(바인딩할 별칭)이랑 일치를 시켜줘야 합니다.

 

이렇게 @RequestParam은 주소 뒤에 붙는 파라미터 값을 가져오게 됩니다.

 

주의할 점

만약 RequestParam에 key값이 존재하지 않을 경우 BadRequest 4** error가 발생합니다.

이를  "DefaultValue"를 이용하여 기본 값을 설정하여 방지할 수 있습니다.

(required=false  속성을 꼭 명시해줘야 합니다. )

@GetMapping("testRequestParam")
public String testRequestParam(
            @RequestParam(value="name1", required=false, defaultValue="") String value1, 
            @RequestParam(value="name2", required=false, defaultValue="") String value2){
     // 생략
}

 

required = false 속성을 명시함으로써 키값이 존재하지 않다고 해서 BadRequest가 발생하지 않게 되고 존재하지 않다면 String 변수에 default로 defaultValue의 값이 들어가게 됩니다.

 

파라미터 많을 경우

파라미터가 많을 경우 일일이 지정해줘야 하므로 Map을 통해서 해결을 할 수 있습니다.

@GetMapping("testRequestParam")
public String testRequestParam(
            @RequestParam HashMap<String,String> map{
     // 생략
}

 

위와 같이 map으로 많은 파라미터를 받을 수 있지만 유지보수에 어려움이라는 단점이 생기게 됩니다.

 

@PathVariable

@GetMapping("/users/{id}")
public EntityModel<User> retrieveUsers(@PathVariable int id) {
	// 생략
}

 

위 예시 코드 처럼 각 구분자에 들어오는 값을 처리할 때 사용을 하게 됩니다.

 

결과

결과적으로 파라미터를 어떻게 전달하느냐에 따라서 2개의 전달 방법중 하나를 선택하는 것입니다. 또한 2개를 혼합하여 사용도 가능하기 때문에 상황에 맞춰서 사용을 하면 됩니다.

 

@GetMapping("/users/{id}")
public EntityModel<User> retrieveUsers(
        @PathVariable int id,
        @RequestParam(value = "name") String name) {
		
        // 생략
}

 

 

Reference

'코딩 공부 > web & Java' 카테고리의 다른 글

OpenAPI와 Swagger  (1) 2023.11.09
[Docker] Docker  (0) 2023.11.08
[Spring] ResponseEntity  (0) 2023.11.07
[Spring] 전역 예외 처리  (0) 2023.11.04
[Spring] @Controller와 @RestController  (0) 2023.11.04