Backend/Spring+Boot

@PathVariable vs @RequestParam

findmypiece 2022. 3. 7. 12:11
728x90

Spring 환경에서 RestApi 를 정의할 때 항상 고민을 하게 되는 것이 자원을 식별하는 값을 동적으로 정의할 경우 @PathVariable, @RequestParam 중 어떤 것을 사용할 것이냐 이다.

 

예를 들어 특정 그룹의 카운트를 리턴하는 api 를 만든다고 할 때 아래 두가지 방법을 사용할 수 있다.

@GetMapping("/target/admin/{groupSeq}/count")
fun adminTargetCount(@PathVariable groupSeq: Long): ResponseEntity<Any>{
    return ResponseEntity(pushService.adminTargetCount(groupSeq), HttpStatus.OK)
}
@GetMapping("/target/admin/count")
fun adminTargetCount(@RequestParam groupSeq: Long): ResponseEntity<Any>{
    return ResponseEntity(pushService.adminTargetCount(groupSeq), HttpStatus.OK)
}

 

어떤 방식을 사용해야 할까? 원래는 필수로 입력해야 하는 정보를 @PathVariable 로 정의했었는데 Spring 4.3.3부터 @RequestParam 과 동일하게 required 속성 을 사용하여 @PathVariable 을 선택 사항으로 만들 수 있다.

 

그럼 어떻게 구분해야 할까? 일단 RestApi URI 는 직관적으로 이해할 수 있어야 하며 최대 2단계 정도로 간단하게 많드는 것이 권장된다.

 

이런 면에서 자원을 필터링 하는 정보들은 @RequestParam 으로 정의하는게 맞다. 하지만 내부적으로 제한된 정책 안에서 구현을 하다보면 @PathVariable 로 필터링 정보들을 정의해야 하는 경우도 존재하기 마련이다.

 

예를 들어 서드파티 툴에 제공할 페이징 RestApi를 만들어야 하는데 RequestParm으로 page, limit 로 허용한다면 그 외 필터링 조건들은 모두 @PathVariable 로 정의할 수 밖에 없다.

 

Internal api 의 경우 내부적으로 협의만 되었다면 @RequestParam를 사용하든 @PathVariable 를 사용하든 상관은 없다. 다만 주의할 점이 하나 있다.

 

 

@PathVariable 은 URI 경로에서 값을 추출 하기 때문에 값이 인코딩 되지 않는 반면  @RequestParam 값은 은 인코딩 된다. 에를 들어 아래와 같다. 필터링 데이터로 인코딩으로 변환될 값을 사용할 경우에는 반드시 @RequestParam 을 사용해야 한다.

http://localhost:8080/spring-mvc-basics/foos/ab+c
----
ID: ab+c
http://localhost:8080/spring-mvc-basics/foos?id=ab+c
----
ID: ab c

 

 

https://www.baeldung.com/spring-requestparam-vs-pathvariable
728x90