Validation
๐ ๊ฐ์
- **Bean Validation(JSR 380)**์ ์๋ฐ ํ์ค ์ ํจ์ฑ ๊ฒ์ฌ ํ๋ ์์ํฌ.
- Spring MVC๋
@Valid
๋๋@Validated
๋ฅผ ํตํด ์ด๋ฅผ ์ปจํธ๋กค๋ฌ ๋ ๋ฒจ์์ ์ฝ๊ฒ ์ ์ฉ. - ์ ๋ ฅ๊ฐ ์ ์ฝ ์กฐ๊ฑด์ ์ด๋ ธํ ์ด์ ๊ธฐ๋ฐ์ผ๋ก ์ ์ธํ์ฌ, ์ฌ์ฌ์ฉ์ฑ๊ณผ ๊ฐ๋ ์ฑ์ ๋์ธ๋ค.
โ๐ป ํ์ค ์์ฝ
์ปจํธ๋กค๋ฌ ๋ฉ์๋ ํ๋ผ๋ฏธํฐ์ @Valid
/@Validated
๋ฅผ ๋ถ์ด๊ณ BindingResult
๋ก ๊ฒฐ๊ณผ๋ฅผ ํ์ธํ์ฌ ์ ํจ์ฑ ๊ฒ์ฌ๋ฅผ ์ํํ๋ค.
๐ค ์ ํ์ํ๊ฐ?
- ํด๋ผ์ด์ธํธ ์ ๋ ฅ๊ฐ์ ํ์๊ณผ ๋ฒ์๋ฅผ ๋ณด์ฅํ๊ธฐ ์ํจ
- ์๋ชป๋ ๊ฐ์ผ๋ก ์ธํ ๋น์ฆ๋์ค ๋ก์ง ์ค๋ฅ ์๋ฐฉ
- ์ ์ธํ ์ ์ฝ ์กฐ๊ฑด์ผ๋ก ์ฝ๋ ๊ฐ๊ฒฐํ
- ์ค๋ณต ๊ฒ์ฌ ๋ก์ง ์ ๊ฑฐ
โ๏ธ ์ฃผ์ ๊ตฌ์ฑ ์์
1. ๊ฒ์ฌ ํธ๋ฆฌ๊ฑฐ
@Valid
: Bean Validation ํ์ค@Validated
: Spring ์ ์ฉ, ๊ทธ๋ฃน ๊ฒ์ฆ(Group Validation) ์ง์
2. ์ ์ฝ ์กฐ๊ฑด ์ด๋ ธํ ์ด์
Annotation | ์ค๋ช |
---|---|
@NotNull | null ๊ธ์ง (๋น ๋ฌธ์์ด์ ํ์ฉ) |
@NotEmpty | null ๋ฐ ๊ธธ์ด 0 ๊ธ์ง (์ปฌ๋ ์ ํฌํจ) |
@NotBlank | null, ๊ธธ์ด 0, ๊ณต๋ฐฑ ๋ฌธ์ ๊ธ์ง |
@Size | ๋ฌธ์์ด/์ปฌ๋ ์ ํฌ๊ธฐ ์ ํ |
@Length | ๋ฌธ์์ด ๊ธธ์ด ์ ํ (Hibernate Validator) |
@Email | ์ด๋ฉ์ผ ํ์ ๊ฒ์ฆ |
@Pattern | ์ ๊ท์ ํจํด ์ผ์น ๊ฒ์ฆ |
@Past / @Future | ๊ณผ๊ฑฐ/๋ฏธ๋ ๋ ์ง์ธ์ง ํ์ธ |
@Min / @Max | ์ซ์ ๋ฒ์ ์ ํ |
3. BindingResult / Errors
- ์ ํจ์ฑ ๊ฒ์ฌ ๊ฒฐ๊ณผ๋ฅผ ๋ด๋ ๊ฐ์ฒด
@Valid
/@Validated
๋ฐ๋ก ๋ค์ ํ๋ผ๋ฏธํฐ๋ก ์ ์ธ- ์ค๋ฅ ๋ฐ์ ์ ์ปจํธ๋กค๋ฌ์์ ์ง์ ์ฒ๋ฆฌ ๊ฐ๋ฅ
๐ง ์์
(A) ๊ธฐ๋ณธ ์ฌ์ฉ
@PostMapping("/users")
public String createUser(
@Valid @ModelAttribute UserRequest request,
BindingResult bindingResult
) {
if (bindingResult.hasErrors()) {
throw new ValidationFailedException(bindingResult);
}
// ๋ก์ง ์ํ
return "redirect:/users";
}
(B) ๊ทธ๋ฃน ๊ฒ์ฆ
public interface OnCreate {}
public interface OnUpdate {}
public class UserDto {
@NotNull(groups = OnUpdate.class)
private Long id;
@NotBlank(groups = {OnCreate.class, OnUpdate.class})
private String name;
}
@PostMapping("/users")
public String create(@Validated(OnCreate.class) UserDto dto, BindingResult br) { ... }
(C) JSON ์์ฒญ ๋ฐ๋ ๊ฒ์ฆ
@PostMapping("/api/users")
@ResponseBody
public ApiResponse createUser(@Valid @RequestBody UserRequest request) {
// ์ ํจ์ฑ ๊ฒ์ฌ ์คํจ ์ MethodArgumentNotValidException ๋ฐ์
return ApiResponse.ok();
}
โ ๏ธ ์ฃผ์ํ ์
BindingResult
๋ฅผ ์ฌ์ฉํ์ง ์์ผ๋ฉด ์ ํจ์ฑ ์คํจ ์ ์์ธ ๋ฐ์ (MethodArgumentNotValidException
)- JSON ์์ฒญ ๊ฒ์ฆ ์
@RequestBody
์ ํจ๊ป ์ฌ์ฉํด์ผ ํจ @Valid
์@Validated
๋ ๊ธฐ๋ฅ์ด ๊ฐ์ง๋ง, ๊ทธ๋ฃน ๊ฒ์ฆ์@Validated
๋ง ์ง์- ์ปค์คํ
์ ์ฝ ์กฐ๊ฑด์
@Constraint
๋ก ์ ์ ๊ฐ๋ฅ