이번 편의 목표: 제목이 비어 있거나 가격이 0 이하인 등록 요청을 객체로 만들기 전에 거절합니다.

JSON 변환은 타입이 맞는지만 봅니다. 빈 문자열과 음수 가격도 변환은 성공합니다. 값의 규칙은 검증 애너테이션으로 적습니다.

의존성

pom.xml의 dependencies 안에 검증 스타터를 추가하고 서버를 다시 실행합니다. 이미 있다면 중복해서 넣지 않습니다. 이 내용은 자바 소스가 아니라 pom.xml에 넣는 XML입니다.

dependency 요소 안에 groupId는 org.springframework.boot, artifactId는 spring-boot-starter-validation 입니다. src/main/java 아래에는 만들지 않습니다.

필드 규칙

BookRequest에 제약을 붙입니다.

Java
package com.thinktree.library;

import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.Positive;

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

@NotBlank는 공백만 있는 문자열을 거절합니다. @Positive는 1 이상의 정수만 허용합니다. 패키지는 javax가 아니라 jakarta입니다. Spring Boot 3의 검증 API입니다.

컨트롤러 매개변수를 바꿉니다.

Java
public Book create(@Valid @RequestBody BookRequest request) {
    return bookService.create(request);
}

import는 jakarta.validation.Valid 입니다. @Valid가 없으면 애너테이션을 적어 두어도 검사하지 않습니다.

다음 요청은 400 응답이어야 합니다.

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

정상적인 개미, 12000 요청은 200과 함께 JSON이 반환됩니다. 실패 본문은 아직 스프링의 기본 형식입니다. 다음 편에서 메시지 형식을 맞춥니다.

직접 해 보기

가격만 1800으로 올바른 요청을 보내고, 제목을 빈 문자열로 바꾼 요청은 거절되는지 비교하세요.

해설

가격이 양수이고 제목에 글자가 있으면 검증을 통과해 create가 실행됩니다. 제목이 빈 문자열이면 create 메서드 안의 코드는 실행되지 않습니다.