์คํ๋ง ๋ถํธ์์๋ @Valid ์ด๋ ธํ ์ด์ ์ ํตํด ์ ํจ์ฑ ๊ฒ์ฌ๋ฅผ ์ฝ๊ฒ ๊ตฌํํ ์ ์๋ค.
์ ํจ์ฑ ๊ฒ์ฌ๋?
์ฌ์ฉ์๊ฐ ์ ๋ ฅํ ๋ฐ์ดํฐ๊ฐ ์ฌ๋ฐ๋ฅด๊ณ ๊ธฐ๋ํ ํ์์ด๋ ์กฐ๊ฑด์ ๋ง๋์ง ํ์ธํ๋ ๊ณผ์ ์ ์๋ฏธํ๋ค. ์ด๋ฅผ ํตํด ์๋ชป๋ ๋ฐ์ดํฐ๊ฐ ์์คํ ์ ๋ค์ด์ค๋ ๊ฒ์ ์ฌ์ ์ ์ฐจ๋จํ ์ ์๋ค.
์ ํจ์ฑ ๊ฒ์ฌ๋ฅผ ํ์ง ์์ผ๋ฉด ์์์น ๋ชปํ ์
๋ ฅ์ผ๋ก ์ธํด ํ๋ก๊ทธ๋จ์ด ๋น์ ์ ์ข
๋ฃ๋๊ฑฐ๋ ์๋ชป๋ ๋ฐ์ดํฐ๊ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅ๋์ด ์ค๋ฅ๊ฐ ๋ฐ์ํ ์ ์์ผ๋ฉฐ ๋ณด์ ์ํ๋ ์ฆ๊ฐํ๋ค.
๋ฐ๋ผ์ ๋น์ฆ๋์ค ๋ก์ง์ ๋ง๋ ์ ํจ์ฑ ๊ฒ์ฌ๋ฅผ ํตํด ์ฌ๋ฐ๋ฅธ ๋ฐ์ดํฐ๋ง ์ฒ๋ฆฌํ๊ณ ์๋ชป๋ ์
๋ ฅ์ ๋ํด์๋ ์ฌ์ฉ์์๊ฒ ์ ์ ํ ํผ๋๋ฐฑ์ ์ ๊ณตํ ํ์๊ฐ ์๋ค.
์คํ๋ง ๋ถํธ์์๋ @Valid ์ด๋
ธํ
์ด์
์ ์ฌ์ฉํด ๊ฐ์ฒด์ ์ ํจ์ฑ์ ๊ฐ๋จํ ๊ฒ์ฌํ ์ ์๋ค. ์ด๋
ธํ
์ด์
์ ์ฌ์ฉํ๊ธฐ ์ํด์๋ ๋จผ์ Validation ๊ด๋ จ ์์กด์ฑ์ ํ๋ก์ ํธ์ ์ถ๊ฐํ์ฌ์ผ ํ๋ค.
// build.gradle
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-validation'
}
Jakarta Bean Validation API์ Hibernate Validator๊ฐ ํฌํจ๋์ด ์๋ค.
์์กด์ฑ์ ์ถ๊ฐํ ํ์๋ DTO์ ์ ํจ์ฑ ๊ฒ์ฆ ์ด๋
ธํ
์ด์
์ ๋ถ์ธ๋ค.
public class PostCreateRequest {
@NotBlank(message = "์ ๋ชฉ์ ํ์์
๋๋ค.")
@Size(max = 255, message = "์ ๋ชฉ์ 255์ ์ด๋ด์ฌ์ผ ํฉ๋๋ค.")
private String title;
@NotBlank(message = "๋ด์ฉ์ ํ์์
๋๋ค.")
private String content;
@NotNull(message = "์นดํ
๊ณ ๋ฆฌ๋ฅผ ์ ํํ์ฌ์ผ ํฉ๋๋ค.")
private Long categoryId;
@NotNull
private Boolean isPublic;
}
๋ํ์ ์ผ๋ก DTO์ ๋ถ์ผ ์ ์๋ ์ ํจ์ฑ ๊ฒ์ฌ ์ด๋
ธํ
์ด์
์ผ๋ก๋ ์๋์ ๊ฐ์ ๊ฒ๋ค์ด ์๋ค.
1. @NotNull - null ๊ฐ์ ํ์ฉํ์ง ์๋๋ค.
2. @NotBlank - null ๋ฐ ๋น ๋ฌธ์์ด(""), ๊ณต๋ฐฑ๋ง ์๋ ๋ฌธ์์ด(" ")์ ๋ชจ๋ ํ์ฉํ์ง ์๋๋ค.
3. @NotEmpty - null ๋ฐ ๋น ๊ฐ์ ํ์ฉํ์ง ์๋๋ค. (๋ฌธ์์ด, ๋ฐฐ์ด, ๋ฆฌ์คํธ, ๋งต ๋ชจ๋ ํฌํจ)
4. @Size - ๊ธธ์ด ๋๋ ํฌ๊ธฐ๋ฅผ ์ ํํ๋ค.
5. @Pattern - ์ ๊ท ํํ์์ ํตํด ๋ฌธ์์ด ํจํด์ ๊ฒ์ฆํ๋ค.
6. @Min, @Max - ์ซ์ ํ์
์ ์ต์๊ฐ, ์ต๋๊ฐ์ ์ง์ ํ๋ค.
๊ฐ ํ๋์ ํ์
์ ๋ฐ๋ผ ์ฌ์ฉํ ์ ์๋ ์ด๋
ธํ
์ด์
๊ณผ ์ต์
๋ค์ด ๋ชจ๋ ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ ๋ฐ์ดํฐ์ ํน์ฑ๊ณผ ์๊ตฌ์ฌํญ์ ๋ฐ๋ผ ์ ์ ํ๊ฒ ์ฌ์ฉํ๋ ๊ฒ์ด ์ค์ํ๋ค.
DTO์ ์ ํจ์ฑ ๊ฒ์ฌ ์ด๋
ธํ
์ด์
์ ์ค์ ํ ํ์๋ ์ค์ ๋ก ์ด ๊ฒ์ฌ๊ฐ ์๋ํ๋๋ก ํ๊ธฐ ์ํด ์ปจํธ๋กค๋ฌ์์ @Valid๋ฅผ ์ฌ์ฉํ๋ค.
@PostMapping
public PostCreateResponse createPost(@Valid @RequestBody PostCreateRequest request) {
// ...์ปจํธ๋กค๋ฌ ๋ก์ง
}
@Valid๋ก ์ ํจ์ฑ ๊ฒ์ฌ๋ฅผ ์ํํ ๋ ์
๋ ฅ ๊ฐ์ด ์กฐ๊ฑด์ ๋ง์กฑํ์ง ๋ชปํ๋ฉด ๋ ๊ฐ์ง ์์ธ ์ค ํ๋๊ฐ ๋ฐ์ํ ์ ์๋ค.
@RequestBody๋ก ์ ๋ฌ๋ DTO์ ์ ํจ์ฑ ๊ฒ์ฌ๊ฐ ์คํจํ์ ๋ ๋ฐ์ํ๋ MethodArgumentNotValidException, @ModelAttribute ๋๋ @RequestParam ๋ฐฉ์์ผ๋ก ์ ๋ฌ๋ ๋ฐ์ดํฐ๊ฐ ์ ํจ์ฑ ์กฐ๊ฑด์ ๋ง์กฑํ์ง ๋ชปํ ๋ ๋ฐ์ํ๋ BindException์ด ์๋ค.
์ด๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํด์๋ ์ปจํธ๋กค๋ฌ์์ @Valid ๋ฐ๋ก ๋ค์ BindingResult๋ฅผ ํจ๊ป ์ ์ธํ์ฌ ์ค๋ฅ ์ ๋ณด๋ฅผ ์๋์ผ๋ก ์ฒ๋ฆฌํ๊ฑฐ๋ @RestControllerAdvice๋ฅผ ์ด์ฉํด ์ ์ญ์์ ๊ณตํต์ ์ผ๋ก ์์ธ๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐฉ์์ด ์๋ค.
