-
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 변수명 규칙이 다를 때 대응 방법
마지막 예제 참고! (사용 코드만 적어둠)
- class 위에
@JsonNaming
어노테이션을 사용하면 Object Mapper라는 모듈이 동작할 때 해당 클래스 변수명을 JsonNaming에 지정한 형식으로 해석해서 값을 받아온다.
// 스네이크 표기법으로 변수명 일괄 해석 @JsonNaming(value = PropertyNamingStrategies.SnakeCaseStrategy.class) class CarDTO { ... }
- 변수 명 위에
@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 + '\'' + '}'; } }
'Spring Boot 🍃' 카테고리의 다른 글
Spring Boot: JSON 클래스 만들때 알아두면 좋을 설정 (0) 2023.11.29 Spring Boot: Response 응답에 대해 알아두면 좋을 2가지 (0) 2023.11.29 Spring Boot: GET , DELETE Method 요청 받기 (0) 2023.11.29 Spring Boot: @Controller , @RestController (0) 2023.11.29 Spring Boot: port 번호 변경하기 (0) 2023.11.29 - class 위에