Today
-
Yesterday
-
Total
-
  • Spring Boot: POST , PUT, PATCH Method 요청 받기
    Spring Boot 🍃 2023. 11. 29. 06:21

    POST , PUT , PATCH 요청은 HTTP 메세지의 Body 부분에 붙어서 날라오기 때문에, RequestBody 어노테이션을 사용하며, 이것들은 선언 메서드 이름만 다를뿐 사용 형식은 같다.

    + Request / Response 헷갈릴때

    Request는 클라이언트에서 서버로 값을 보내달라고 요청하는 것이기 때문에 Request로써 존재하는 것. Response는 서버클라이언트의 요청에 대한 응답을 보내는 것이기 때문에 Response로써 존재한다.

    + JSON과 JAVA DTO 변수명 규칙이 다를 때 대응 방법

    마지막 예제 참고! (사용 코드만 적어둠)

    1. class 위에 @JsonNaming 어노테이션을 사용하면 Object Mapper라는 모듈이 동작할 때 해당 클래스 변수명을 JsonNaming에 지정한 형식으로 해석해서 값을 받아온다.
    // 스네이크 표기법으로 변수명 일괄 해석
    @JsonNaming(value = PropertyNamingStrategies.SnakeCaseStrategy.class)
    class CarDTO {
    	...
    }
    1. 변수 명 위에 @JsonProperty 어노테이션을 사용하면 해당 변수만 JsonProperty어노테이션에 지정한 값으로 해석해서 값을 받아온다.
    class CarDTO {
       	@JsonProperty("car_number")
       	private String CarNumber;
    }

    경로 변수를 받는 방법은 GET Method의 @PathVariable과 같음

    Post 요청으로 들어오는 키-값이 뭔지 제대로 알지 못하는 경우

    @RestController
    @RequestMapping("/api/post")
    public class PostApiController {
    
        // 이렇게 PostMapping 어노테이션에 경로 지정을 안해주면
        // class 부분의 requestMapping 어노테이션 경로로 post 요청시 이리로 들어옴
        @PostMapping // localhost:8888/api/post
        public void post(@RequestBody Map<String, Object> requestData) {
            requestData.forEach((s, o) -> {
                System.out.println("key : " + s);
                System.out.println("val : " + o.toString());
            });
        }
    
    }

    Post 요청값 Json으로 받기

    1.

    GET Method에서 QueryParameter를 DTO로 받을 때는 어노테이션을 안붙여도 가능했는데, POST Method에서는 @RequestBody 어노테이션을 붙여줘 값을 받아온다.

    2.

    자바에서 DTO에 선언한 변수 이름과 , JSON으로 들어오는 변수 이름의 표기 형식이 다른 경우. 이럴 때는 자바의 DTO 파일에서 해당되는 변수에 @JsonProperty("JSON에 표기된 이름") 으로 적어주면 된다. 만약 , @JsonProperty로 변수 이름을 맞춰주지 않는다면 값을 받아오지 못한다.

    @RestController
    @RequestMapping("/api/post")
    public class PostApiController {
    
        @PostMapping("/dto") // localhost:8888/api/post/dto
        public void dto(@RequestBody PostRequestDTO dto) {
            System.out.println(dto.toString());
        }
    
    }

    데이터 DTO 생성

    class PostRequestDTO {
        private String name;
        private int year;
        private String address;
    
        @JsonProperty("phone_number")
        private String phoneNumber;
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public int getYear() {
            return year;
        }
    
        public void setYear(int year) {
            this.year = year;
        }
    
        public String getPhoneNumber() {
            return phoneNumber;
        }
    
        public void setPhoneNumber(String phoneNumber) {
            this.phoneNumber = phoneNumber;
        }
    
        public String getAddress() {
            return address;
        }
    
        public void setAddress(String address) {
            this.address = address;
        }
    
        @Override
        public String toString() {
            return "PostRequestDTO{" +
                    "name='" + name + '\'' +
                    ", year=" + year +
                    ", phoneNumber='" + phoneNumber + '\'' +
                    ", address='" + address + '\'' +
                    '}';
        }
    }

    POST 요청 데이터에서 Header에 숨겨온 값과 Body의 JSON값 받기

    @RestController
    @RequestMapping("/api/post")
    public class PostApiController {
    
        @PostMapping("/req") // localhost:8888/api/post/req
        public String createReq(
        	@RequestBody CreateRequest req, 
            @RequestHeader(name = "user_id") String userId ) {
            return req.toString() + ", " + userId;
        }
    }

    dataDTO 생성

    class CreateRequest {
        private String id;
        private Integer amount;
    
        public String getId() {
            return id;
        }
    
        public void setId(String id) {
            this.id = id;
        }
    
        public Integer getAmount() {
            return amount;
        }
    
        public void setAmount(Integer amount) {
            this.amount = amount;
        }
    
        @Override
        public String toString() {
            return "CreateRequest{" +
                    "id='" + id + '\'' +
                    ", amount=" + amount +
                    '}';
        }
    }

    PUT 요청 데이터에서 JSON 값 가져오는데, 객체가 2개일 때 예시

    @RestController
    @RequestMapping("/api/put")
    public class PutController {
    
        @PutMapping("/json")
        public PutDTO put(@RequestBody PutDTO dto) {
            return dto;
        }
    }

    Dto 객체 1

    @JsonNaming(value = PropertyNamingStrategies.SnakeCaseStrategy.class)
    class PutDTO {
        private String name;
        private int abc;
        private List<CarDTO> carList;
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public int getAbc() {
            return abc;
        }
    
        public void setAbc(int abc) {
            this.abc = abc;
        }
    
        public List<CarDTO> getCarList() {
            return carList;
        }
    
        public void setCarList(List<CarDTO> carList) {
            this.carList = carList;
        }
    
        @Override
        public String toString() {
            return "PutDTO{" +
                    "name='" + name + '\'' +
                    ", abc=" + abc +
                    ", carList=" + carList +
                    '}';
        }
    }

    DTO 객체 2

    @JsonNaming(value = PropertyNamingStrategies.SnakeCaseStrategy.class)
    class CarDTO {
        private String name;
        private String carNum;
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public String getCarNum() {
            return carNum;
        }
    
        public void setCarNum(String carNum) {
            this.carNum = carNum;
        }
    
        @Override
        public String toString() {
            return "CarDTO{" +
                    "name='" + name + '\'' +
                    ", carNum='" + carNum + '\'' +
                    '}';
        }
    }

Designed by Tistory / Custom by 얼거스