POST API는 웹 애플리케이션을 통해 데이터베이스 등의 저장소에 리소스를 저장할 때 사용되는 API이다. 앞에서 살펴본 GET API에서는 URL의 경로나 파라미터에 변수를 넣어 요청을 보냈지만 POST API에서는 저장하고자 하는 리소스나 값을 HTTP body에 담아 서버에 전달한다. 그래서 URI가 GET API에 비해 간단하다.
이 방법은 GET API와 크게 다르지 않다. 요청 처리 메서드를 설정할 때에 예제처럼 method 요소를 RequestMethod.POST로 설정하는 부분을 제외하면 GET API와 동일하다.
@RestController
@RequestMapping("/api/v1/post-api")
public class PostController {
// 1) RequestMapping으로 구현하기
@RequestMapping(value = "/domain", method = RequestMethod.POST)
public String postExample() {
return "Hello Post API";
}
}
일반적으로 POST 형식의 요청은 클라이언트가 서버에 리소스를 저장하는 데 사용한다. 그러므로 크라이언트의 요청 트래픽에 값이 포함되어 있다. 즉, POST 요청에서는 리소스를 담기 위해 HTTP Body에 값을 넣어 전송한다. 아래와 같이 Body 영역에 직접 값을 입력할 수 있다.
Body 영역에 작성되는 값은 일정한 형태를 취한다. 일반적으로 JSON(JavaScript Object Notation) 형식으로 전송된다. 이렇게 서버에 들어온 요청은 아래와 같이 처리할 수 있다.
JSON이란? JSON은 'JavaScript Object Notation'의 약자로 자바스크립트의 객체 문법을 따르는 문자 기반의 데이터 포맷 이다. 현재는 자바스크립트 외에도 다수의 프로그래밍 환경에서 사용한다. 대체로 네트워크를 통해 데이터를 전달할 때 사용하며, 문자열 형태로 작성되기 때문에 파싱하기 쉽다는 장점이 있다.
// 2) RequestBody를 활용한 POST 메서드 구현
@PostMapping(value = "/member")
public String postMember(@RequestBody Map<String, Object> postData) {
StringBuilder sb = new StringBuilder();
postData.entrySet().forEach(map -> {
sb.append(map.getKey() + " : " + map.getValue() + "\n");
});
return sb.toString();
}
@PostMapping을 사용하면 method 요소를 따로 정의하지 않아도 된다. 그리고 @RequestBody 어노테이션을 사용했는데, 이는 HTTP의 Body 내용을 해당 어노테이션이 지정된 객체에 매핑하는 역할을 한다.
Map 객체는 요청을 통해 어떤 값이 들어오게 될지 특정하기 어려울 때 사용한다. 요청 메세지에 들어갈 값이 정해져 있다면 아래와 같이 DTO 객체를 매개변수로 삼아 작성할 수도 있다.
// 2-2) DTO 객체를 이용한 POST 메서드 구현
@PostMapping(value = "/request3")
public String postMemberDto(@RequestBody MemberDto memberDto) {
return memberDto.toString();
}
위와 같이 작성하면 MemberDto의 멤버 변수를 요청 메시지의 키와 매핑해 값을 가져온다.