[Spring Boot] POST API
POST
리소스 생성, 추가
CRUD 의 C
멱등성 X
안정성 X
Path Variable O
Query Parameter 권장 x
DataBody O
데이터를 주고 받을 땐 xml, json을 주로 이용하지만, 대부분 json을 이용한다.
JSON은 괄호로 항상 시작하고, "key":"value" 형태를 띄게 된다.
key로 받을 수 있는 것은
string : value
number : value
boolean : value { }
object : value
arry : value [ ]
{
"account" :"",
"email" : "",
"password" : "",
"address" :""
}
우리는 POST API를 사용할 것이기 때문에 새로운 프로젝트를 생성하고, 기본 패키지의 하위로 controller 패키지를 생성 후 PostApiController.java를 생성한다.
PostApiController.java
package com.example.post.controller;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.Map;
@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 클래스를 생성한 후 Dto 클래스 파일을 생성하자.
PostRequestDto.java
package com.example.post.dto;
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 + '\'' +
'}';
}
}
객체의 속성들을 정의한 후 속성들을 getter, setter를 통해 generate한다.
그 후 toString 메서드를 overriding해준다.
또한, 속성들과 요청하는 JSON의 키와 매칭되는 값이여야 한다.
그럼 여기서 문제가 발생하는데, 자바의 경우 Camel case를 주로 사용하고, JSON의 경우 Snake case를 주로 사용하는데
속성과 JSON이 올바르게 매칭되지 않는 경우가 발생할 수 있다.
이럴 때는 여러가지 방법이 있지만, 그 중 하나로 @JsonProperty라는 annotation을 이용해서 값을 매칭시켜 줄 수 있다.
private String phoneNumber; //phone_number
@JsonProperty("phone_number")
public String getPhoneNumber() {
return phoneNumber;
}
public void setPhoneNumber(String phoneNumber) {
this.phoneNumber = phoneNumber;
}
PostApiController.java
package com.example.post.controller;
import com.example.post.dto.PostRequestDto;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.Map;
@RestController
@RequestMapping("/api")
public class PostApiController {
@PostMapping("/post")
public void post(@RequestBody PostRequestDto requestData){
System.out.println(requestData);
}
}
=== 입출력 ===
- 정리
@RequestBody annotation을 통해서 JSON Data를 parsing할 수 있고
이를 위해선 데이터 클래스 즉, 객체를 정의하고 기본은 camel case기 때문에 JsonProperty를 통해서 parsing이 되지 않는 값들을 할당시켜준다.