[SPRINGBOOT] @PathVariable과 @RequestParam의 차이

728x90

스프링부트에서는 데이터를 전달 받을 때 @PathVariable 방식과 @RequestParam 방식이 있습니다.

둘다 URL에 매개변수를 넣어서 받는 방식입니다.

그러나 두가지 방식에는 약간의 차이가 있습니다.

 

1. @PathVariable

@PathVariable방법은 슬래쉬안에 매개변수를 넣는 방법입니다. 이 방법은 key값이 필요하지 않습니다.

예컨대 data라는 변수에 "test"를 담아서 전송하고 싶다면 http://127.0.0.1:8080/main/list/test로 전송하면 됩니다. 

그리고 서버에서는 @GetMapping("/main/list/{data}")로 받으면 됩니다. 여기서 data라는 변수를 사용하지 않아도 되지만 @PathVariable에는 {}안의 변수와 동일한 변수를 사용해야합니다.

 

예컨대 이렇게 작성해야합니다.

@ResponseBody
@GetMapping("/main/list/{data}")
public String getMain(@PathVariable String data) throws Exception{
    //@PathVariable("data") String dataValue 도 가능
    return "{\"status\":\"success\"}";
}

 

일반적으로 수정, 삭제 등 API호출을 할때 많이 사용합니다. 그리고 @PathVariable을 두개 이상을 넣는것도 가능합니다.

@ResponseBody
@GetMapping("/main/list/{data}/{data2}")
public String getMain(@PathVariable String data, @PathVariable String data2) throws Exception{
    //@PathVariable("data") String dataValue 도 가능
    return "{\"status\":\"success\"}";
}

 

 

2. @RequestParam

@RequestParam 방법은 ?key=value값으로 전송하는 것입니다. 일반적으로 GET방식으로 호출할 때 많이 사용합니다.

위와 동일하게 data라는 변수에 test를 담아서 전송하고 싶다면 http://127.0.0.1:8080/main/list?data=test로 전송하면 됩니다.

그리고 서버에서는 @GetMapping("/list")로 받고 @RequestParam에 변수를 넣으면 됩니다.

예를 들면 아래와 같습니다.

@GetMapping("/main/list")
public String getMain(@RequestParam String data) throws Exception{
    //@PathVariable(value="data") String dataValue 도 가능
    return "/main/list";
}

 

이 때 @RequestParam(value="data", required = false)을 사용하게 되면 data라는 키값을 넣지않아도 에러가 발생하지 않습니다. 즉 경로에 http://127.0.0.1:8080/main/list로 호출해도 된다는 것입니다.

이 방법은 검색 기능을 넣을 때 활용가능합니다.

또한 defaultValue라는 옵션도 있는데 이 옵션은 key값이 없을때 기본값을 지정해 놓을 수 있습니다. 

@ResponseBody
@GetMapping("/v1/get-items")
public String getItemsAll(@RequestParam(value = "page", defaultValue = "1") int page,
                          @RequestParam(value = "pageSize",defaultValue = "100") int pageSize) throws Exception{
                          
	return "{\"status\":\"success\"}";
}

 

이렇게 사용함으로써 DB에서 데이터를 가져올때 분할하여 가져올 수 있습니다. 주의할점은 int형이라도 defaultValue에는 문자형태를 넣어야한다는 것입니다.

 

'JAVA Programming > SpringBoot' 카테고리의 다른 글

[SPRINGBOOT] ObjectMapper  (1) 2024.12.13
[SPRINGBOOT] 스케줄링  (1) 2024.12.12
[SPRINGBOOT] 인텔리제이 환경설정  (1) 2024.12.12
[SPRINGBOOT] 프로젝트 생성  (0) 2024.12.12