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