스프링 controller에서 파라미터를 받는 다양한 방법들이 존재한다.
RequestParamPathVariableRequestBodyMap위의 순서대로 하나씩 알아보자 !
RequestParamURI 가
📌 /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)를 받아올 수 있다.
PathVariableURI가
📌 /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를 사용하는 것이 좋음!