controller에서 파라미터를 받는 다양한 방법들

bird.j·2021년 4월 19일
0

SpringBoot

목록 보기
15/22

스프링 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


📌 @RequestBodyhttp요청의 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를 사용하는 것이 좋음!

0개의 댓글