๋ฐ์ํ
Bean Validation ์ด๋?
- ๋จผ์ Bean Validation์ ํน์ ํ ๊ตฌํ์ฒด๊ฐ ์๋๋ผ Bean Validation 2.0(JSR-380)์ด๋ผ๋ ๊ธฐ์ ํ์ค์ด๋ค.
- ์ฝ๊ฒ ์ด์ผ๊ธฐํด์ ๊ฒ์ฆ ์ ๋ ธํ ์ด์ ๊ณผ ์ฌ๋ฌ ์ธํฐํ์ด์ค์ ๋ชจ์์ด๋ค.
- Bean Validation์ ๊ตฌํํ ๊ธฐ์ ์ค์ ์ผ๋ฐ์ ์ผ๋ก ์ฌ์ฉํ๋ ๊ตฌํ์ฒด๋ ํ์ด๋ฒ๋ค์ดํธ Validator์ด๋ค.
๊ณต์ ์ฌ์ดํธ: http://hibernate.org/validator/
๊ณต์ ๋ฉ๋ด์ผ: https://docs.jboss.org/hibernate/validator/6.2/reference/en-US/html_single/
๊ฒ์ฆ ์ ๋ ธํ ์ด์ ๋ชจ์: https://docs.jboss.org/hibernate/validator/6.2/reference/en-US/ html_single/#validator-defineconstraints-spec
- jakarta.validation-api : ์ธํฐํ์ด์ค
- hibernate-validator : ๊ตฌํ์ฒด
์คํ๋ง๋ถํธ์ Bean Validator
- spring-boot-starter-validation ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ฃ์ผ๋ฉด ์๋์ผ๋ก LocalValidatorFactoryBean์ ๊ธ๋ก๋ฒ Validator๋ก ๋ฑ๋กํ๋ค.
- ์ค๋ฅ ๋ฐ์์ BindingResult์ ๋ด์์ค๋ค
@Valid, @Validated
- @Validated ๋ ์คํ๋ง ์ ์ฉ ๊ฒ์ฆ ์ ๋ ธํ ์ด์ ์ด๊ณ , @Valid ๋ ์๋ฐ ํ์ค ๊ฒ์ฆ ์ ๋ ธํ ์ด์ ์ด๋ค.
- ๋์ค ์๋ฌด๊ฑฐ๋ ์ฌ์ฉํด๋ ๋์ผํ๊ฒ ์๋ํ์ง๋ง, @Validated ๋ ๋ด๋ถ์ groups ๋ผ๋ ๊ธฐ๋ฅ์ ํฌํจํ๊ณ ์๋ค.
ํ๋๊ฐ ์๋ Object ์ค๋ฅ
@Data
@ScriptAssert(lang = "javascript", script = "_this.price * _this.quantity >=
10000")
public class Item {
//...
}
์ค๋ธ์ ํธ ์ค๋ฅ์ ๊ฒฝ์ฐ @ScriptAssert๋ฅผ ์ด์ฉํด์ ์ฒ๋ฆฌํ ์๋ ์์ง๋ง, ์ค์ ๋ก ์ฌ์ฉํด๋ณด๋ฉด ์ ์ฝ์ด ๋ง๊ณ ๋ณต์กํ๋ ์ค๋ธ์ ํธ ์ค๋ฅ ๊ด๋ จ ๋ถ๋ถ๋ง ์๋ฐ๋ก ์์ฑํ๋ ๊ฒ์ ๊ถ์ฅํ๋ค.
@Groups
public interface SaveCheck {}
public interface UpdateCheck {}
// item domain
public class Item {
@NotNull(groups = UpdateCheck.class) //์์ ์์๋ง ์ ์ฉ
private Long id;
@NotBlank(groups = {SaveCheck.class, UpdateCheck.class})
private String itemName;
// ์๋ต
}
@PostMapping("/add")
public String addItemV2(@Validated(SaveCheck.class) @ModelAttribute Item item,
BindingResult bindingResult, RedirectAttributes redirectAttributes) {
}
์๋ก ๋น์ทํ ๋ณ์๋ฅผ ๊ฐ์ง๋ DTO๋ฅผ ํฉ์น๋ ๊ฒ ์ข์์ง?
- ๊ฐ๊ฐ ์ฅ๋จ์ด ์์ง๋ง, ์ด์คํ๊ฒ ํฉ์น๋ฉด ์ ์ง๋ณด์์์ ๊ณ ํต์ ๋ง๋ณธ๋ค. ์ด์คํ ๋ถ๊ธฐ๋ฌธ์ด ๋ณด์ด๊ธฐ ์์ํ๋ฉด ๋ถ๋ฆฌํ์.
@ModelAttribute vs @RequestBody
- HTTP ์์ฒญ ํ๋ฆฌ๋ฏธํฐ๋ฅผ ์ฒ๋ฆฌํ๋ @ModelAttribute ๋ ๊ฐ๊ฐ์ ํ๋ ๋จ์๋ก ์ธ๋ฐํ๊ฒ ์ ์ฉ๋๋ค. ๊ทธ๋์ ํน์ ํ๋์ ํ์ ์ด ๋ง์ง ์๋ ์ค๋ฅ๊ฐ ๋ฐ์ํด๋ ๋๋จธ์ง ํ๋๋ ์ ์ ์ฒ๋ฆฌํ ์ ์์๋ค.
- HttpMessageConverter ๋ @ModelAttribute ์ ๋ค๋ฅด๊ฒ ๊ฐ๊ฐ์ ํ๋ ๋จ์๋ก ์ ์ฉ๋๋ ๊ฒ์ด ์๋๋ผ, ์ ์ฒด ๊ฐ์ฒด ๋จ์๋ก ์ ์ฉ๋๋ค.
- ๋ฐ๋ผ์ ๋ฉ์์ง ์ปจ๋ฒํฐ์ ์๋์ด ์ฑ๊ณตํด์ ItemSaveForm ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด์ผ @Valid , @Validated ๊ฐ ์ ์ฉ๋๋ค.
- @ModelAttribute ๋ ํ๋ ๋จ์๋ก ์ ๊ตํ๊ฒ ๋ฐ์ธ๋ฉ์ด ์ ์ฉ๋๋ค. ํน์ ํ๋๊ฐ ๋ฐ์ธ๋ฉ ๋์ง ์์๋ ๋๋จธ์ง ํ๋๋ ์ ์ ๋ฐ์ธ๋ฉ ๋๊ณ , Validator๋ฅผ ์ฌ์ฉํ ๊ฒ์ฆ๋ ์ ์ฉํ ์ ์๋ค.
- @RequestBody ๋ HttpMessageConverter ๋จ๊ณ์์ JSON ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ฒด๋ก ๋ณ๊ฒฝํ์ง ๋ชปํ๋ฉด ์ดํ ๋จ๊ณ ์์ฒด๊ฐ ์งํ๋์ง ์๊ณ ์์ธ๊ฐ ๋ฐ์ํ๋ค. ์ปจํธ๋กค๋ฌ๋ ํธ์ถ๋์ง ์๊ณ , Validator๋ ์ ์ฉํ ์ ์๋ค.
๐ Reference
๋ฐ์ํ