이번 편의 목표: 요청 본문의 JSON을 객체로 받고, 객체를 JSON 응답으로 돌려줍니다.

조회 응답은 이미 Book 객체가 JSON으로 나갔습니다. 스프링 MVC의 변환기가 public 조회 메서드를 보고 JSON 필드를 만듭니다. 등록은 반대로, 요청 JSON을 자바 객체로 만듭니다.

요청 객체

BookRequest.java를 추가합니다. 클라이언트가 보내는 값만 담습니다. id는 서버가 정하므로 요청에 없습니다.

Java
package com.thinktree.library;

public record BookRequest(String title, int price) {
}

BookController에 import 두 개와 등록 메서드를 추가합니다. import는 org.springframework.web.bind.annotation.PostMapping 과 RequestBody 입니다.

Java
@PostMapping
public Book create(@RequestBody BookRequest request) {
    return new Book(1L, request.title(), request.price());
}

@RequestBody는 본문을 BookRequest로 바꾸라는 표시입니다. 필드 이름이 JSON 키와 같아야 합니다. 06편의 find와 search는 그대로 둡니다.

서버를 실행한 뒤 터미널에서 등록을 요청합니다.

curl -X POST http://localhost:8080/api/books -H "Content-Type: application/json" -d "{\"title\":\"개미\",\"price\":12000}"

응답 본문은 id가 1이고 title이 개미이며 price가 12000인 JSON입니다. 아직 저장하지 않으므로 같은 요청을 다시 보내도 id는 항상 1입니다. 저장은 11편에서 붙입니다.

Content-Type이 application/json이 아니거나, price에 숫자가 아닌 값이 있으면 변환에 실패합니다. 빈 제목은 이 편에서는 통과합니다. 값의 규칙은 09편의 검증에서 거절합니다.

직접 해 보기

제목 공책, 가격 1800으로 POST한 뒤 응답 price가 1800인지 확인하세요.

해설

요청 JSON의 price가 BookRequest.price()로 들어가고, create가 그 값을 Book에 복사합니다. id는 요청에 없어도 응답에는 1로 있습니다. 서버가 채운 값입니다.