본문 바로가기

Java, JavaScript/Spring Boot

[Spring Boot] @RequestParam, @PathVariable 차이는 뭐야?

728x90

프로젝트를 만들면서 조회 API를 만드는 2가지 방법에 대해서 알게 되었습니다. 예를 들어 id에 맞게 반려동물의 정보를 조회한다고 한다면 크게 2가지 방법으로 나눌 수 있습니다.

 

  1. /api/v1/pet?id=XXX - id 파라미터를 명시해주면서 조회를 요청하는 법
  2. /api/v1/pet/XXX - pet/ 뒤에 id를 입력하여 조회를 요청하는 법

1번처럼 요청을 할 경우에 추가적인 파라미터가 존재할 경우 /api/v1/pet?id=XXX&param=YYY와 같이 변하고, 2번의 경우에는 추가적인 파라미터가 존재할 경우 /api/v1/pet/XXX/YYY 와 같은 형태로 변형이 됩니다. 따라서 2번의 경우에는 입력받을 파라미터가 많이 존재한다면 어떤 값이 입력되는지 알기가 힘듭니다.

 

다음으로는 @RequestParam과 @PathVariable의 파라미터들을 살펴보겠습니다. 먼저 @RequestParam 입니다.

 

  • defaultValue - 값이 설정되지 않을 때 기본으로 설정할 값
  • name - 바인딩할 요청 파라미터의 이름
  • value -  name의 별칭
  • required  - 필수 값인지 설정하는 값

다음은 @RequestParam를 사용하여 반려동물의 정보를 요청하는 코드입니다.

 

@GetMapping("/api/v1/pet")
public PetResponseDto petV1(
        @RequestParam(name = "id") Long id){
    Pet pet = petRepository.findOne(id);
    return new PetResponseDto(pet);
}

 

name = "id"로 설정하여 /api/v1/pet?id=XXX 에서 XXX의 값을 가져옵니다. 나머지 코드는 입력받은 id에 따른 정보를 JSON 형태로 변환하는 과정입니다. 다음은 정상 동작하는 name, value의 입력입니다.

 

@RequestParam(name = "id")
@RequestParam(value = "id")
@RequestParam(value = "id", name = "id")

 

위에서 확인할 수 있듯이 name과 value 둘 중에 하나만 입력하는 것이 가능합니다. 또한 둘 다 선언되었을 경우에도 값이 같다면 오류를 발생시키지 않습니다.

 

@RequestParam(value = "id2", name = "id") // 오류 발생
@RequestParam(value = "id", name = "id2") // 오류 발생

 

하지만 위와 같이 value와 name의 값이 같지 않다면 오류를 발생하는 것을 알 수 있습니다. 따라서 value와 name을 동시에 사용하는 것보다는 name만 설정하여 사용하는 것이 더 편리할 것 같습니다.

 

@RequestParam(value = "id", name = "id", required = true, defaultValue = "0")

 

위의 코드는 모든 값을 넣어준 것입니다. id라는 값이 필수적으로 입력되어야 하고 입력되지 않았을 경우에는 "0"이 default로 입력되게 됩니다. defaultValue의 값은 문자로 입력되고, 입력되는 파라미터의 타입에 따라 형변환이 이루어지게 됩니다.

 

다음은 @PathVariable의 파라미터에 대해서 알아보겠습니다. @RequestParam과 같은 기능을 하기 때문에 이름만 열거하겠습니다. 파라미터는 다음과 같습니다. [name, required, value]

 

다음은 @PathVariable를 사용하여 반려동물의 정보를 요청하는 코드입니다.

 

@GetMapping("/api/v1/pet/{id}")
public PetResponseDto petIdV1(
        @PathVariable Long id){
    Pet pet = petRepository.findOne(id);
    return new PetResponseDto(pet);
}

 

@GetMapping에 {id}를 추가해주고, 변수 앞에 @PathVariable만 추가해주면 됩니다.

 

@PathVariable은 @RequestParam과 다르게 default 값을 설정하지 않으므로 만약 default 값이 필요한 조회 요청을 한다면 @RequestParam을 사용하여 구현하면 되고, 앞서 보여주었던 예제와 같이 id와 같이 필수로 입력되어야 하는 값이라면 @PathVariable을 사용하여 구현하면 될 것으로 생각됩니다.

 

그리고 2가지 기능 모두가 필요하다고 한다면 @PathVariable, @RequestParam 모두 사용하는 것도 가능하므로 해당 경우를 생각하는 것도 괜찮을 것 같습니다.

728x90