스프링 controller에서 파라미터를 받는 다양한 방법들이 존재한다.
RequestParam
PathVariable
RequestBody
Map
위의 순서대로 하나씩 알아보자 !
RequestParam
URI 가
📌 /api/products?page=1&size=10&sortBy=coffeeId&isAsc=true
이렇게 생겼을 때 controller에서
@GetMapping("/api/products")
public ReturnProduct getProducts(@RequestParam("page") int page, @RequestParam("size") int size, @RequestParam("sortBy") String sortBY,
@RequestParam("isAsc") boolean isAsc){ //page : 현재 페이지 번호, size : 페이지 사이즈, sortBy : 정렬 항목, isAsc : 오름차순?(true오름차순, false내림차순)
page = page - 1;
return productService.getProducts(page, size, sortBY, isAsc);
}
이런식으로 받을 수 있다.
?
뒤에 key=value
를 적고 데이터가 다수일 경우 &
로 이어서 붙이면 된다.
@RequestParam("key값")
을 붙이면 URI의 파라미터 (value
)를 받아올 수 있다.
PathVariable
URI가
📌 /api/details/2
이렇게 생겼을 때, '2'가 파라미터 이므로, controller에서는 /api/details/{coffeeId}
이렇게 API를 설계할 수 있다.
@PostMapping("/api/reviews/{coffeeId}")
public ReturnReview createReview(@PathVariable Long coffeeId, @RequestBody ReviewDto reviewDto, @AuthenticationPrincipal User user){
return reviewService.createReview(user, coffeeId, reviewDto);
}
메서드 파라미터 안에 @PathVariable
어노테이션을 붙이고 변수를 선언해주면 경로의 파라미터가 선언한 변수에 담긴다.
RequestBody
📌 @RequestBody
는 http
요청의 body
부분을 java
객체로 받을 수 있게 해주는 어노테이션으로 주로 json
을 받을 때 활용한다.
{
"username":"hihi",
"password":1234
}
이런 데이터를 클라이언트에서 서버로 넘긴다면,
해당 요청을 매핑하는 controller에서는
@PostMapping("/api/login")
public ReturnUser login(@RequestBody LoginDto loginDto) {
return userService.login(loginDto);
}
이렇게 @RequestBody
어노테이션을 선언하고, 생성한 java
객체를 파라미터를 담을 변수로 적어주면 json
데이터로 온 파라미터가 고스란히 java
객체에 담긴다.
🚩 잠깐, ResponseBody
는 뭐였지?
@RestController
대신 @Controller
어노테이션을 사용했을 때, view가 아닌 data
를 반환할 때 사용한다.
Map
📌 JSON데이터를 클라이언트로부터 받는데, 데이터마다 DTO를 만들만큼 복잡하지 않고 단순히 String으로 key:value
형태라면 굳이 DTO를 만들지 않고 Map
으로 간단히 받을 수 있다.
클라이언트로 부터 받는 데이터가 다음과 같다면,
{
"username":"hihi",
"password":1234
}
controller에서는
@PostMapping("/api/login")
public ReturnUser login(@RequestBody Map<String, String> user) {
return userService.login(user);
}
이렇게 Map<String, String>으로 데이터를 받을 수 있다.
형식은 Map<key자료형, value자료형>
이다.
데이터는, user.get("key값")
으로 뽑아낼 수 있다.
📌 그러나 Map의 방식은 지양.
Map은 데이터를 파악하기 힘든데 프로젝트가 커지면 이것이 크게 문제가 될 수 있다.
언제나 DTO를 사용하는 것이 좋음!