4. POST API
WEB에서는 json이나 xml 형태로 주고 받는다. 최근에는 json을 많이 쓴다.
JSon 데이터 종류
String : value
number : value
boolean : value { }
object : value
array : value [ ]
phone_number => 이런식으로 단어를 연결 할 때 _ 붙이는 것을 스네이크 케이스
phoneNumber => 이런식으로 단어를 하는 것은 카멜 케이스(낙타봉 형태)
Post일때 @RequestBody를 꼭 붙여주자
@RestController
@RequestMapping("/api")
public class PostApiController {
@PostMapping("/post")
public void post(@RequestBody Map<String, Object> requestData){
requestData.forEach((key, value) -> {
System.out.println("key " + key);
System.out.println("value " + value);
});
}
}
값을 받아 줄 수 있도록 DTO 작성해보자.
@RestController
@RequestMapping("/api")
public class PostApiController {
@PostMapping("/post")
public void post(@RequestBody PostRequestDto requestData) {
System.out.println(requestData);
}
}
public class PostRequestDto {
private String account;
private String email;
private String address;
private String password;
public String getAccount() {
return account;
}
public void setAccount(String account) {
this.account = account;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String toString() {
return "PostRequestDto{" +
"account='" + account + '\'' +
", email='" + email + '\'' +
", address='" + address + '\'' +
", password='" + password + '\'' +
'}';
}
}
PostRequestDto{account='user01', email='steve@gmail.com', address='Seoul', password='abcd'}
정상 작동 된다.
자바에서는 카멜 케이스로 작성했는데 보내는 쪽에서는 스네이크 케이스로 작성될 때 오류가 날 수 있다.
EX)
private String phoneNumber; // phone_number
PostRequestDto{account='user01', email='steve@gmail.com', address='Seoul', password='abcd', phoneNumber='null'}
null이 들어간다.
text data가 object로 바뀌어서 전송되기 때문에 따로 이름을 지정해주지 않으면 스네이크 케이스를 찾아가기 때문에 못찾는다.
해결하기 위한 여러가지 방법이 있다.
1. @JsonProperty
@JsonProperty("phone_number")
private String phoneNumber; // phone_number
변수에 일일히 달아줘야 하는 불편함이 있지만 값을 받게 해준다.
PostRequestDto{account='user01', email='steve@gmail.com', address='Seoul', password='abcd', phoneNumber='010-1234-1234'}
phoneNumber가 제대로 입력된다.
실제 개발하다보면 이도저도 아닌 케이스가 있다
ex) OTP
카멜케이스도 아니고 스네이크도 케이스도 아닐 때는 @JsonProperty라는 어노테이션을 붙여줘 매칭을 해주는것이 좋다.
정리)
@RequestBody 라는 어노테이션으로 Json body를 파싱할 수 있고 반드시 객체를 하나 정의해서 기본은 카멜 케이스로 하고 @JsonProperty로 스네이크 케이스를 파싱해 준다.
두 케이스 다 아닐때에도 @JsonProperty로 파싱해준다.