이번 강의에서는 기능적인 변화보다는
REST API 설계 관점에서의 네이밍과 요청 처리 방식을 정리하는 시간이었다.
겉보기엔 변경 사항이 적어 보이지만,
REST API를 제대로 이해하기 위해서는 꼭 짚고 넘어가야 할 내용이다.
record PostWriteForm(
@NotBlank
@Size(min = 2, max = 100)
String title,
@NotBlank
@Size(min = 2, max = 5000)
String content
) {
}
record PostWriteReqBody(
@NotBlank
@Size(min = 2, max = 100)
String title,
@NotBlank
@Size(min = 2, max = 5000)
String content
) {
}
Form이라는 이름은 보통 HTML form 기반 요청을 연상시킨다.
하지만 지금 우리가 구현하는 것은:
즉, 이 객체는 화면 폼(Form) 이 아니라
👉 HTTP 요청의 Body(JSON) 를 그대로 표현하는 객체다.
그래서 강사님은
PostWriteForm 보다 PostWriteReqBody가 의미상 더 정확하다고 설명하셨다.
이름만 봐도
“아, 이건 요청 바디(JSON)를 받는 객체구나”
를 바로 알 수 있어야 한다는 의미다.
현재 구조는 다음과 같다.
@RestController
@RequestMapping("/api/v1/posts")
@RequiredArgsConstructor
public class ApiV1PostController {
// 생략
record PostWriteReqBody(
String title,
String content
) {
}
@PostMapping
@Transactional
public RsData<PostDto> write(
@Valid @RequestBody PostWriteReqBody form
) {
Post post = postService.write(form.title(), form.content());
return new RsData<>(
"200-1",
"%d번 글이 생성되었습니다.".formatted(post.getId()),
new PostDto(post)
);
}
}
“이 API 전용 요청 바디”라는 의도가 코드 구조에서도 드러난다.
JSON 요청 바디를 받을 때는 거의 무조건 필요하다.
@Valid @RequestBody PostWriteReqBody form
이 한 줄에서 일어나는 일:
form에 주입한다@Valid가 붙어 있으므로 유효성 검사 수행public RsData<PostDto> write(PostWriteReqBody form)
이 경우 Spring은 이렇게 생각한다.
“이건 요청 바디가 아니라
쿼리 파라미터나 form-data겠네?”
결과적으로:
form은 null이거나즉, REST API + JSON 요청 조합에서는
👉 @RequestBody는 사실상 필수다.
아래 같은 경우에는 사용하지 않는다.
GET /posts?page=1&size=10
@GetMapping
public List<PostDto> getItems(
@RequestParam int page,
@RequestParam int size
)
GET /posts/1
@GetMapping("/{id}")
public PostDto getItem(@PathVariable int id)
@PostMapping("/write")
public String write(PostWriteForm form)
이 경우는 @RequestBody ❌
(서버 사이드 렌더링 전제)
PostWriteForm → PostWriteReqBodyform.title() 형태로 접근 가능@RequestBody는 필수@RequestBody는 JSON → Java 객체 변환의 핵심REST API에서 DTO 이름은 의도를 드러내는 문서이고,
JSON 요청을 받는다면@RequestBody는 선택이 아니라 기본이다.