POST , PUT , PATCH 요청은
HTTP 메세지의 Body 부분에 붙어서 날라오기 때문에,
RequestBody 어노테이션을 사용하며, 이것들은 선언 메서드 이름만 다를뿐 사용 형식은 같다.
Request는 클라이언트에서 서버로 값을 보내달라고 요청하는 것이기 때문에 Request로써 존재하는 것.
Response는 서버가 클라이언트의 요청에 대한 응답을 보내는 것이기 때문에 Response로써 존재한다.
마지막 예제 참고! (사용 코드만 적어둠)
class 위에 @JsonNaming 어노테이션을 사용하면
Object Mapper라는 모듈이 동작할 때 해당 클래스 변수명을 JsonNaming에 지정한 형식으로 해석해서 값을 받아온다.
// 스네이크 표기법으로 변수명 일괄 해석
@JsonNaming(value = PropertyNamingStrategies.SnakeCaseStrategy.class)
class CarDTO {
...
}
변수 명 위에 @JsonProperty 어노테이션을 사용하면
해당 변수만 JsonProperty어노테이션에 지정한 값으로 해석해서 값을 받아온다.
class CarDTO {
@JsonProperty("car_number")
private String CarNumber;
}

@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());
});
}
}

GET Method에서 QueryParameter를 DTO로 받을 때는 어노테이션을 안붙여도 가능했는데,
POST Method에서는 @RequestBody 어노테이션을 붙여줘 값을 받아온다.
자바에서 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 + '\'' +
'}';
}
}

@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 +
'}';
}
}

@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 + '\'' +
'}';
}
}
