ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • controller에서 파라미터를 받는 방법 : @RequestParam, @RequestBody, @PathVariable (+ DTO를 포함하는 DTO)
    Spring 2021. 10. 26. 13:18

     

    스프링에서 프론트엔드에서 넘어온 데이터를 받는데에는 대표적으로 3가지 방식이 있다. 

     

    @RequestParam
        @GetMapping("/activity")
        public ActivityDTO getActivity(@RequestParam(value = "id", required = true)String id){
            Integer activityId = Integer.parseInt(id);
            return activityService.getActivity(activityId);
        }

    @RequestParam에서는 프론트엔드로부터 http://localhost:8080/activity?id=2 의 형식으로 요청이 넘어오게 된다면 물음표 뒤의 아이디 값을 받는 어노테이션이다.

    value 혹은 name으로 넘어오는 데이터의 이름을 설정할 수 있으며 required는 기본적으로 true 이기 때문에 만약 값을 넘기지 않은 채 get을 시도한다면 400에러가 발생하게 된다. defaultValue 설정을 이용하여 값이 넘어오지 않았을 때의 기본값을 설정해줄 수도 있다. 

    const bodyFormData = new FormData()
    
    bodyFormData.append('id', activity.id)
    bodyFormData.append('name', name)
    bodyFormData.append('score', score)
    bodyFormData.append('description', description)
    bodyFormData.append('multipartFile', imageUrl)

    프론트엔드에서 다음과 같이 multipartFile타입을 FormData를 이용해서 추가해주려고 하는 경우에도 이 어노테이션을 사용해서 데이터를 전달할 수 있다.

        @PostMapping("/activity/save")
        public ActivityCreateDTO saveActivity(@RequestParam(value = "id", required = false)Integer id,
                                   @RequestParam("name")String name,
                                   @RequestParam("score")Integer score,
                                   @RequestParam("description")String description,
                                   @RequestParam(value = "multipartFile",required = false)MultipartFile multipartFile){
    
            ActivityCreateDTO activityCreateDTO = new ActivityCreateDTO(id, name, score, description);
            return activityService.saveActivity(activityCreateDTO,multipartFile);
        }

     

     

    @PathVariable
        @GetMapping("/activity/{id}")
        public ActivityDTO getActivity(@PathVariable("id")String id){
            Integer activityId = Integer.parseInt(id);
            return activityService.getActivity(activityId);
        }

    @PathVariable에서는 프론트엔드로부터 http://localhost:8080/activity/2 의 형식으로 주소에 값자체를 포함하여 요청이 넘어오는 방식이다. 

    어노테이션 옆의 () 안에 받은 데이터의 이름을 정해주면 받아온 데이터를 타입에 맞춰 사용할 수 있다.

     

     

    @RequestBody
        @PostMapping("/order/create")
        public ResponseEntity<?> createOrder(@RequestBody OrderCreateDTO orderCreateDTO) {
            AddressDTO addressDTO = orderCreateDTO.getAddress();
            List<OrderItemCreateDTO> orderItemCreateDTOS = orderCreateDTO.getOrderItems();
    
            return new ResponseEntity<OrderDTO>(orderService.createOrder(orderCreateDTO), HttpStatus.CREATED);
        }

    @RequestBody는 프론트엔드로부터 들어오는 json형식의 body부분을 java객체로 받게 해주는 어노테이션이다. 

    이 어노테이션을 사용할 시에는, 다음과 같이 데이터를 담을 객체를 구현해주어야 한다. 

    @Getter
    @Setter
    public class OrderCreateDTO {
    
        private Integer id;
    
        private String paymentMethod;
    
        private Float shipping;
    
        public OrderCreateDTO() {
        }
    
        public OrderCreateDTO(Integer id, String paymentMethod, Float shipping) {
            this.id = id;
            this.paymentMethod = paymentMethod;
            this.shipping = shipping;
        }
    
    }

    생성자가 구현이 되어 있으면  들어오는 데이터를 이름과 타입에 맞게 데이터를 받아 가져와서 사용할 수 있게 된다. 

     

     

    전달하려는 DTO데이터가 2개 이상일 때

     전달하려는 데이터가 2개이상 (dto자체가 2개 이상일 때) 존재할 때, 혹시 방법이 없을까 찾아보았는데, @RequestBody어노테이션을 2번 사용할 수는 없으므로 다음과 같이 전하려고 하는 dto를 포함하는 또다른 Object 클래스 를 만들어야 해당 데이터를 넘길 수 있었다. 

    @Getter
    @Setter
    public class OrderCreateDTO {
    
        private Integer id;
    
        private String paymentMethod;
    
        private AddressDTO address;
    
        private Integer userId;
    
        public OrderCreateDTO() {
        }
    
        public OrderCreateDTO(Integer id, String paymentMethod, AddressDTO address, Integer userId) {
            this.id = id;
            this.paymentMethod = paymentMethod;
            this.address = address;
            this.userId = userId;
        }

    위와 같이 OrderCreateDTO는 또다른 객체인 AddressDTO를 포함하고 있는 새로운 Object 클래스가 되었다. 프론트엔드에서 데이터를 넘겨줄때는 다음과 같이 객체 안의 객체형식으로 보내주도록 한다. 여기서 AddressDTO와 같은 포함된 class들은 모두 생성자를 가지고 있어야 한다. 

           const addressInfo = {
                name: addressName,
                country,city,zipcode,address
            }
            
           const orderCreateDTO = {
                id,
                shipping,
                paymentMethod:"paypal",
                address:addressInfo
            }

     

     

    (참고한 블로그)

    https://takeknowledge.tistory.com/39

     

    스프링 controller에서 파라미터를 받는 다양한 방법 ( @RequestParam, @RequestBody, @PathVariable)

    컨트롤러에서 파라미터를 받을 수 있는 다양한 방법이 있다 1. @RequestParam 어노테이션 활용 GET방식으로 넘어온 URI의 queryString을 받기에 적절해 html부터 단계별(?)로 밟아온 사람이라면 가장 쉽게

    takeknowledge.tistory.com

     

Designed by Tistory.