Bean Validation - ๊ฒ์ฆ ์ด๋ ธํ ์ด์ ์ฌ์ฉ
by rlaehddnd0422Bean Validation
๊ฒ์ฆ๊ธฐ๋ฅ์ ๋งค๋ฒ ์ฝ๋๋ก ์์ฑํ๋ ๊ฒ๋ ์ข ๊ท์ฐฎ์ ์ผ์ ๋๋ค.
ํน์ ํ๋์ ๋ํ ๊ฒ์ฆ ๋ก์ง์ ๋๋ถ๋ถ ๋น ๊ฐ์ธ์ง, ํน์ ํฌ๊ธฐ๋ฅผ ๋๋์ง์ ๊ฐ์ด ๋งค์ฐ ์ผ๋ฐ์ ์ธ ๋ก์ง์ธ๋ฐ ์ด๋ฐ ์ผ๋ฐ์ ์ธ ๋ก์ง์ ํ์คํ ํ ๊ฒ์ด ๋ฐ๋ก Bean Validation ์ ๋๋ค.
์ด๋ฒ ํฌ์คํ ์์๋ Bean Validation ํ์ค ๊ธฐ์ ์ ์ด์ฉํด ์ด๋ ธํ ์ด์ ์ผ๋ก ๊ฒ์ฆ ์ฒ๋ฆฌ๋ฅผ ํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
( ์๋ฐํ ๋งํ๋ฉด Bean Validation ํ์ค ๊ธฐ์ ์ ๊ตฌํ์ฒด์ธ ํ์ด๋ฒ๋ค์ดํธ๋ฅผ ์ฌ์ฉํ ์์ )
์ค์
Bean Validation ์์กด๊ด๊ณ ์ถ๊ฐ - build.gradle - dependencies
implementation 'org.springframework.boot:spring-boot-starter-validation'
ํ์ด๋ฒ๋ค์ดํธ์์ ์ง์ํ๋ ๊ฒ์ฆ ์ด๋ ธํ ์ด์
- @NotBlank, @NotNull, @Max, @Range ๋ฑ๋ฑ..
- ์๋ ๋งํฌ๋ฅผ ํตํด ์ถ๊ฐ์ ์ธ ์ด๋ ธํ ์ด์ ๋ค์ ๋ ์ฐธ๊ณ ํ์ค ์ ์์ต๋๋ค.
Bean Validation ์ ์ฉ
๊ตฌํํ๋ ๊ฒ์ฆ๋ก์ง์ ์ฌ์ฉํ์ง ์๊ณ Bean Validation์ ์ด๋ ธํ ์ด์ ์ ์ ์ฉํด์ ์ํ๊ด๋ฆฌ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฒ์ฆ์ฒ๋ฆฌ๋ฅผ ํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
Bean Validation์ ์ฐ์ ๋๋ฉ์ธ์ ์ ์ฉํด์ผ ํฉ๋๋ค.
@Data
public class Item {
private Long id;
@NotBlank
private String itemName;
@NotNull
@Range(min=1000,max=1000000)
private Integer price;
@NotNull
@Max(value=9999)
private Integer quantity;
public Item() {}
public Item(String itemName, Integer price, Integer quantity) {
this.itemName = itemName;
this.price = price;
this.quantity = quantity;
}
}
- @NotBlank : ๋น ์นธ, ๊ณต๋ฐฑ ํ์ฉ X
- @NotNull : null์ ํ์ฉ X
- @Range(min,max) : min~max ๋ฒ์ ์์ ๊ฐ์ด์ด์ผ ํจ.
- @Max(value) : ์ต๋ value ๊ฐ ๊น์ง๋ง ํ์ฉ.
์ด๋ ๊ฒ ๊ฒ์ฆ๋ก์ง์ ๋๋ฉ์ธ์ ๊ฑธ์ด์ฃผ๋ฉด ์คํ๋ง์ ValidationFactory๋ก ๋ถํฐ Validator(๊ฒ์ฆ๊ธฐ)๋ฅผ ์๋์ผ๋ก ์์ฑํด์ ๊ฒ์ฆ ๋์์ ์ง์ ๊ฒ์ฆ๊ธฐ์ ๋ฃ๊ณ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ์ต๋๋ค. ๊ทธ ๊ฒฐ๊ณผ๋ ๋ง์ฐฌ๊ฐ์ง๋ก BindingResult์ ๋ด๊น๋๋ค.
์ด์ ์ปจํธ๋กค๋ฌ๋ฅผ ์์ ํด๋ณด๊ฒ ์ต๋๋ค.
@PostMapping("/add")
public String addItem(@Validated @ModelAttribute Item item, BindingResult bindingResult, RedirectAttributes redirectAttributes)
{
๋ง์ฐฌ๊ฐ์ง๋ก ๊ฒ์ฆ ๋์์ธ @ModelAttribute Item item์ @Validated ์ด๋ ธํ ์ด์ ์ ๋ถํ ์ฃผ์ด์ผํฉ๋๋ค. ( Validator๋ฅผ ์ฌ์ฉํ๋ ์๋ฆฌ์ ๋์ผํฉ๋๋ค. )
๊ฒ์ฆ ์์๋ ์ด๋ ๊ฒ ํ๋ฌ๊ฐ๋๋ค.
์ฐ์ @ModelAttribute ๊ฐ๊ฐ์ ํ๋์ ํ์ ๋ณํ์ ์๋ํฉ๋๋ค.
โถ๏ธ ํ์ ๋ณํ ์คํจ์ typeMistmatch๋ก FieldError ์ถ๊ฐ
โถ๏ธ ํ์ ๋ณํ ์ฑ๊ณต ์ ํ์ด๋ฒ๋ค์ดํธ ์ด๋ ธํ ์ด์ ๊ธฐ๋ฐ Validator ์ ์ฉํ์ฌ ๊ฒ์ฆ ๊ณผ์ ์ ๊ฑฐ์ณ ์ค๋ฅ ๋ฐ์์ FieldError ์ถ๊ฐ
(์ด ๋ ์๋ฌ์ฝ๋๋ ์ด๋ ธํ ์ด์ ๊ธฐ๋ฐ์ผ๋ก ์์ฑ๋ฉ๋๋ค)
ex) @NotNull์ ๊ฒฝ์ฐ itemName์์ ํ๋์๋ฌ ๋ฐ์ ์ NotNull.item.itemName, NotNull.itemName, NotNull.java.lang.String, NotNull
Bean Validation์ ๋ฐ์ธ๋ฉ์ ์คํจ( ํ์ ๋ณํ ์คํจ )ํ ํ๋๋ Bean Validation์ ์ ์ฉํ์ง ์์ต๋๋ค.
๋ฐ์ธ๋ฉ์ ์คํจํด๋ด์ผ Bean Validation์ ์ ์ฉํ๋๊ฒ ์๋ฏธ๊ฐ ์๊ธฐ ๋๋ฌธ์ ์ด์ฉ๋ฉด ๋น์ฐํ ์๊ธฐ.
Bean-Validation ๊ฒ์ฆ๋ ๋ฉ์์ง๋ฅผ ๋ณ๋์ ํ์ผ์ ํตํด ๊ด๋ฆฌํ ์ ์์ต๋๋ค.
NotBlank={0} ๊ณต๋ฐฑX
Range={0} {2} ~ {1} ํ์ฉ
Max={0}, ์ต๋ {1}
{0} : ํ๋๋ช ์ด ์ฃผ์ ๋ฉ๋๋ค.
{1}, {2} .. : ์ด๋ ธํ ์ด์ ๋ง๋ค ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ ์์ ์ฌ๋ฆฐ ๋งํฌ๋ฅผ ์ฐธ๊ณ ํด์ฃผ์ธ์.
๋ฉ์์ง๋ ์๋ ์ฐ์ ์์๋๋ก ๊ธฐ์ ๋ฉ๋๋ค.
- messageSource - ์๋ ๋น, ์๋ ๋น (๋ฉ์์ง ํ์ผ)
- ์ด๋ ธํ ์ด์ ์ message ์์ฑ ex) @NotBlank(message = "ํ์ ์ ๋ ฅ์ฌํญ์ ๋๋ค")
- ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์ ๊ณตํ๋ ๊ธฐ๋ณธ ๊ฐ ์ฌ์ฉ
Bean Validation - ObjectError ์ฒ๋ฆฌ
FieldError๋ ์ด๋ป๊ฒ ์ฒ๋ฆฌํ ์ง ํ์คํ ์์๋๋ฐ ๊ทธ๋ ๋ค๋ฉด ObjectError๋ Bean-Validation์์ ์ด๋ป๊ฒ ์ฒ๋ฆฌํ ๊น์?
Bean-Validation๋ฅผ ์ฌ์ฉํด ObjectError๋ํ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
๋ฐ๋ก @ScriptAssert()๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฉ๋๋ค.
@Data
@ScriptAssert(lang="javascript", script="_this.price * _this.quantity >= 10000", message="์๋ * ๊ฐ์ >= 10000 ์ด์ด์ผ ํฉ๋๋ค.")
public class Item {
ํ์ง๋ง ์ค์ ๋ก ์ฌ์ฉํด๋ณด๋ฉด ํ๊ณ๊ฐ ๋ง์ต๋๋ค. ํด๋น ๊ฐ์ฒด์ ๋ฒ์๋ฅผ ๋์ด์๋ ๊ฒฝ์ฐ์๋ ํด๊ฒฐํ ์ ์๋ค๋์ง.. ๋ฑ ์ด๋ฐ ๊ฒฝ์ฐ์๋ ๋์์ด ์ด๋ ต์ต๋๋ค. ๊ทธ๋์ ๊ถ์ฅํ๋ ๋ฐฉ๋ฒ์ ์๋๋๋ค.
ObjectError์ ํํด์๋ ๊ทธ๋ฅ ์ปจํธ๋กค๋ฌ์์ ๋ค๋ฃจ๋๊ฒ ๊ฐ์ฅ ์ ์ง๋ณด์ํ๊ธฐ ์ฝ์ต๋๋ค. ObjectError๋ ์ปจํธ๋กค๋ฌ์์ ๋ก์ง์ ์ง์ ๊ตฌํํด์ bindingresult์ ๋ด๋ ๋ฐฉํฅ์ ์งํฅํฉ์๋ค.
Bean Validation - ๊ทธ๋ฃนํ (groups)
Bean Validation์ ๋๋ฉ์ธ์ ์ง์ ๊ฒ์ฆ์ ๊ฑธ์ด์ฃผ๋ ํํ๋ผ ์ ์ฐํ๊ฒ ์ค์ ํ ์ ์์ต๋๋ค.
์ด๊ฒ ๋ฌด์จ ๋ง์ด๋๋ฉด ์๋ฅผ๋ค์ด ์ํ๊ด๋ฆฌ ์์คํ ์์ ๋ฑ๋กํ ๋์๋ ์๋์ ์ต๋ 10000๊ฐ๋ก, ์์ ํ ๋์๋ ์๋์ ์ต๋ 50000๊ฐ๋ก ์ค์ ํ๊ณ ์ถ์ ๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๋ค. ์๋ํ๋ฉด ๋ฑ๋ก์์๋ ์์ ์์๋ ๊ฐ์ ๋๋ฉ์ธ์ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ด์์.
์ด๋ด ๋ ํด๊ฒฐํ ์ ์๋ ๋ฐฉ๋ฒ์ด ๊ทธ๋ฃนํ์ ๋๋ค.
Bean validation์ groups ์ต์ ์ ์ฌ์ฉํด์ ๋ฑ๋ก๊ฒ์ฆ, ์์ ๊ฒ์ฆ์ ๊ทธ๋ฃน์ผ๋ก ๋๋์ด ์ ์ฉํ ์ ์์ด์.
@NotNull(groups = {SaveCheck.class, UpdateCheck.class})
@Range(min=1000,max=1000000,groups = {SaveCheck.class, UpdateCheck.class})
private Integer price;
@Max(value=9999, groups = {SaveCheck.class})
private Integer quantity;
@Validated์๋ ์ด๋ ๊ฒ ๊ทธ๋ฃน์ ์ค์ ํด์ค์ผ ํฉ๋๋ค.
์ฃผ์ : @Valid์๋ groups ์ต์ ์ ์ ์ฉํ ์ ์๊ธฐ ๋๋ฌธ์ groups์ ์ฐ๊ณ ์ ํ๋ค๋ฉด @Validated๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
@PostMapping("/add")
public String addItem2(@Validated(SaveCheck.class) @ModelAttribute Item item, BindingResult bindingResult, RedirectAttributes redirectAttributes)
@PostMapping("/{itemId}/edit")
public String edit(@PathVariable Long itemId, @Validated(UpdateCheck.class) @ModelAttribute Item item, BindingResult bindingResult)
groups์ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ ๋ฒจ์ด ๋์์ง์๋ก ๋ณต์กํ๊ณ ์ฝ๊ธฐ ์ด๋ ต์ต๋๋ค. ์ค๋ฌด์์๋ groups๋ฅผ ์ ์ฌ์ฉํ์ง ์๋๋ค๊ณ ํฉ๋๋ค. ๊ทธ๋ฅ ์ด๋ฐ ๊ธฐ๋ฅ์ด ์๊ตฌ๋ ์ ๋๋ก ์์๋๊ณ ๋์ด๊ฐ๋๋ก ํ๊ฒ ์ต๋๋ค.
์ ์ก ๊ฐ์ฒด ๋ถ๋ฆฌ ํ Bean Validation ์ ์ฉ
์ง๊ธ๊น์ง๋ ๋ฑ๋กํ ๋๋ ์์ ํ ๋๋ ํผ ๋ฐ์ดํฐ ์ ๋ฌ์ Item ๋๋ฉ์ธ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํด์
HTML Form โฃ Item โฃ Controller โฃ Item โฃ Repository ์ด๋ฐ ํ๋ก์ฐ๋ก ๋์ผํ๊ฒ ํ๋ฌ๊ฐ์์ต๋๋ค.
์ด๋ ๊ฒ Item ๋๋ฉ์ธ์ผ๋ก ํ์ณ์ ๊ฒ์ฆํ๋ฉด ์ ์ฐํ๊ฒ ๊ฒ์ฆ์ ์ค์ ํ ์ ์๊ณ , groups๋ผ๋ ๊ท์ฐฎ์ ์ต์ ์ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
์ค๋ฌด์์๋ ํผ ๋ฐ์ดํฐ ์ ๋ฌ์ ์ํ ๊ฐ์ฒด๋ฅผ ๋ณ๋๋ก ์ง์ ํด์ ์ฌ์ฉํฉ๋๋ค.
- ์ํ ๊ด๋ฆฌ๋ฅผ ์๋ก๋ ๋ค๋ฉด ๋ฑ๋ก ํผ ๊ฐ์ฒด(ItemSaveForm), ์์ ํผ ๊ฐ์ฒด(ItemUpdateForm) ์ด๋ ๊ฒ.
- ์ปจํธ๋กค๋ฌ์์๋ ํผ ๊ฐ์ฒด์ ๋ฐ์ดํฐ ๊ธฐ๋ฐ์ผ๋ก Item ๊ฐ์ฒด๋ฅผ ์์ฑํด์ ์ฌ์ฉํ๋ ์ถ๊ฐ๊ณผ์ ์ด ์์ง๋ง ๊ฒ์ฆ์ด ์ค๋ณต๋์ง ์๊ณ , ์ฝ๊ธฐ๋ ํจ์ฌ ์ฌ์์ก์ด์. ์ด ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋ ๊ฑธ ๊ถ์ฅํฉ๋๋ค.
- ๋ฑ๋ก์ HTML Form โฃ ItemSaveForm โฃ Controller โฃ Item ์์ฑ โฃ Repository
- ์์ ์ HTML Form โฃ ItemUpdateForm โฃ Controller โฃ Item ์์ฑ โฃ Repository
ํผ ๋ฐ์ดํฐ ์ ๋ฌ์ ํ๋ฉด Item ๋๋ฉ์ธ์๋ ๊ฒ์ฆ์ ๊ฑธ์ด์ค ํ์๊ฐ ์์ต๋๋ค.
๊ฒ์ฆ์ Form ๊ฐ์ฒด๋ฅผ ํตํด ๋ณ๋๋ก ์ง์ .
์ปจํธ๋กค๋ฌ์๋ ์ ์ฉ์ ํ์ ๋ ๋ฑ๋ก์ ๊ฒฝ์ฐ
@PostMapping("/add")
public String addItem(@Validated @ModelAttribute("item") ItemSaveForm form, BindingResult bindingResult,
RedirectAttributes redirectAttributes)
{
@ModelAttribute๋ก addForm์์ POST๋ก ๋์ด์จ item์ ItemSaveForm form์ ํ๋ ์ฃผ์ ํฉ๋๋ค.
1. @Validated๋ก ItemSaveForm์ ๊ฒ์ฆ๋ ํ๋๋ง ์ฃผ์ ๋ฉ๋๋ค. ํ์ ์ค๋ฅ ๋ฐ์ ํ๋ฉด bindingResult์ ๋ด๊ธฐ๊ณ Bean-Validation ์ ์ฉ X
2. @ModelAttribute("item") ์ผ๋ก ์ค์ ํด์ฃผ์ด์ผ ํฉ๋๋ค. ์ด๋ ๊ฒ ํ์ง ์์ผ๋ฉด Model์ itemSaveForm๋ผ๋ ์ด๋ฆ์ผ๋ก ๋ด๊ธฐ๊ธฐ ๋๋ฌธ์, ๋ทฐ ํ ํ๋ฆฟ์์ ์ ๊ทผํ๋ th:object๋ itemSaveForm์ผ๋ก ์ค์ ํด์ผ ํฉ๋๋ค.
if (form.getPrice() != null && form.getQuantity() != null)
{
int resultPrice = form.getPrice() * form.getQuantity();
if (resultPrice < 10000) {
bindingResult.reject("totalPriceMin", new Object[]{10000, resultPrice}, null);
}
}
ObjectError๋ Item ๋๋ฉ์ธ์ ํ๋๊ฐ ์๋ form์ ํ๋๋ฅผ ์ฐธ๊ณ ํ๋๋ก ๋ณ๊ฒฝ.
Item item = new Item(form.getItemName(),form.getPrice(),form.getQuantity());
Item savedItem = itemRepository.save(item);
redirectAttributes.addAttribute("status",true);
redirectAttributes.addAttribute("itemId",savedItem.getId());
Repository์๋ item์ด ๊ธฐ๋ก๋์ด์ผ ํฉ๋๋ค. ๋ฐ๋ผ์ form ๊ฐ์ฒด์ ํ๋ ๊ธฐ๋ฐ์ผ๋ก item์ ๋ง๋ค๊ณ ๋ฃ์ด์ฃผ์์ต๋๋ค.
์์ ์ ๊ฒฝ์ฐ๋ ๊ฐ์ ๋งฅ๋ฝ์ด๊ธฐ ๋๋ฌธ์ ๋ฐ๋ก ๊ณผ์ ์ ์ค๋ช ํ๋ ๊ฑด ์๋ตํ๋๋ก ํ๊ฒ ์ต๋๋ค.
Bean Validation - @Validated @RequestBody
@Valid @Validated๋ @ModelAttribute ๋ฟ๋ง ์๋๋ผ @RequestBody(HttpMessageConverter)์๋ ์ ์ฉ๊ฐ๋ฅํฉ๋๋ค.
@ModelAttribute๋ HTTP ์์ฒญ ํ๋ผ๋ฏธํฐ(URL ์ฟผ๋ฆฌ ์คํธ๋ง์ด๋ POST Form)๋ฅผ ๋ค๋ฃฐ ๋ ์ฌ์ฉ.
@RequestBody๋ฅผ ์ฌ์ฉํด Http Body์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ฒด๋ก ๋ณํํ ๋ ์ฌ์ฉ.
@ModelAttribute์์๋ ๊ฐ๊ฐ์ ํ๋ ๋จ์๋ก ์ธ๋ฐํ๊ฒ ์ ์ฉ๋๊ธฐ ๋๋ฌธ์ ํน์ ํ๋์ ํ์ ์ด ๋ง์ง ์๋ ์ค๋ฅ๊ฐ ๋ฐ์ํด๋ ๋๋จธ์ง ํ๋๋ ์ ์ ์ฒ๋ฆฌ ๋์ด ๊ฐ์ฒด๊ฐ ์์ฑ๋๊ณ ์ปจํธ๋กค๋ฌ๊ฐ ํธ์ถํฉ๋๋ค.
- ๊ฒ์ฆ ์ฑ๊ณต์ ๊ฒฝ์ฐ๋ ๋น์ฐํ ๊ฐ์ฒด ์์ฑ ์ฑ๊ณต & ์ปจํธ๋กค๋ฌ ํธ์ถ
- ํ์ ์ค๋ฅ ๋ฐ์์ ๊ฒฝ์ฐ ๊ฐ์ฒด ์์ฑ์ ์ฑ๊ณต (์ค๋ฅ ๋ฐ์ ํ๋๋ฅผ ์ ์ธํ ๊ฐ๋ค์ ์ฃผ์ ๋ ์ํ๋ก)ํ๊ณ ์ปจํธ๋กค๋ฌ ๋ํ ํธ์ถํฉ๋๋ค.
- ํ๋ ์ค๋ฅ ๋ฐ์์ ๊ฒฝ์ฐ์๋ ๊ฐ์ฒด ์์ฑํ๊ณ , ์ปจํธ๋กค๋ฌ ํธ์ถํ์ต๋๋ค.
๋ฐ๋ฉด @RequestBody๋ HttpMessageConverter ๋จ๊ณ์์ JSON ๋ฐ์ดํฐ๋ก ๊ฐ์ฒด๋ฅผ ๋ณ๊ฒฝํ์ง ๋ชปํ๋ฉด ์ดํ ๋จ๊ณ ์์ฒด๊ฐ ์งํ๋์ง ์๊ณ ์์ธ๊ฐ ๋ฐ์ํฉ๋๋ค. ์ฆ, ์ปจํธ๋กค๋ฌ๋ ํธ์ถ๋์ง ์๊ณ , Validator๋ ์ ์ฉํ ์ ์์ต๋๋ค.
- ๊ฒ์ฆ ์ฑ๊ณต์ ๊ฒฝ์ฐ๋ ๋น์ฐํ ๊ฐ์ฒด ์์ฑ ์ฑ๊ณต & ์ปจํธ๋กค๋ฌ ํธ์ถ
- ํ์ ์ค๋ฅ ๋ฐ์ ์์๋ MessageConverter์์ ๊ฐ์ฒด ์์ฑ ์คํจํ๊ธฐ ๋๋ฌธ์ ์ปจํธ๋กค๋ฌ ๋ํ ํธ์ถํ์ง ๋ชปํฉ๋๋ค.
- ํ๋ ์ค๋ฅ ๋ฐ์ ์์๋ ํ์ ์ค๋ฅ๋ ํต๊ณผํ ์ํ์ด๋ฏ๋ก MessageConverter๋ฅผ ํตํด ๊ฐ์ฒด๋ ์์ฑํ๊ธฐ ๋๋ฌธ์ ์ปจํธ๋กค๋ฌ๊ฐ ํธ์ถ๋๊ณ @Validator๊ฐ ์ ์ฉ๋์ด ํ๋ ์ค๋ฅ๋ฅผ ์ก์๋ ๋๋ค.
Postman์ ์ด์ฉํด ํ ์คํธ
@Slf4j
@RestController
@RequestMapping("/validation/api/items")
public class ValidationItemApiController {
@PostMapping("/add")
public Object addItemRequestBody(@Validated @RequestBody ItemSaveForm form,
BindingResult bindingResult)
{
log.info("API ์ปจํธ๋กค๋ฌ ํธ์ถ");
if(bindingResult.hasErrors())
{
log.info("๊ฒ์ฆ ์ค๋ฅ ๋ฐ์ errors={}", bindingResult);
log.info("{}",form);
return bindingResult.getAllErrors();
}
return form;
}
@PostMapping("/add2")
public Object addItemModelAttribute(@Validated @ModelAttirubte ItemSaveForm form,
BindingResult bindingResult)
{
log.info("API ์ปจํธ๋กค๋ฌ ํธ์ถ");
if(bindingResult.hasErrors())
{
log.info("๊ฒ์ฆ ์ค๋ฅ ๋ฐ์ errors={}", bindingResult);
log.info("{}",form);
return bindingResult.getAllErrors();
}
return form;
}
}
<์ฐธ๊ณ ์๋ฃ>
https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-mvc-2/dashboard
'๐ Backend > MVC Pattern' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Servlet Filter(์๋ธ๋ฆฟ ํํฐ) (0) | 2023.03.24 |
---|---|
๋ก๊ทธ์ธ ์ฒ๋ฆฌ - ์ฟ ํค, ์ธ์ (0) | 2023.03.23 |
์ค๋ฅ ์ฝ๋์ ๋ฉ์์ง ์ฒ๋ฆฌ (0) | 2023.03.21 |
๊ฒ์ฆ(Validation) ์ฒ๋ฆฌ ๋ฐฉ๋ฒ (0) | 2023.03.20 |
๋ฉ์์ง, ๊ตญ์ ํ ๊ธฐ๋ฅ (0) | 2023.03.20 |
๋ธ๋ก๊ทธ์ ์ ๋ณด
Study Repository
rlaehddnd0422