From 78581cdce01789160e4b79c0996a74edcc196d9d Mon Sep 17 00:00:00 2001 From: haerong22 Date: Sat, 17 Jul 2021 21:32:27 +0900 Subject: [PATCH] springboot_validation : bean validation - dto --- .../hello/itemservice/domain/item/Item.java | 12 +-- .../ValidationItemControllerV4.java | 102 ++++++++++++++++++ .../web/validation/form/ItemSaveForm.java | 23 ++++ .../web/validation/form/ItemUpdateForm.java | 24 +++++ .../templates/validation/v4/addForm.html | 73 +++++++++++++ .../templates/validation/v4/editForm.html | 75 +++++++++++++ .../templates/validation/v4/item.html | 60 +++++++++++ .../templates/validation/v4/items.html | 49 +++++++++ 8 files changed, 412 insertions(+), 6 deletions(-) create mode 100644 springboot_validation/src/main/java/hello/itemservice/web/validation/ValidationItemControllerV4.java create mode 100644 springboot_validation/src/main/java/hello/itemservice/web/validation/form/ItemSaveForm.java create mode 100644 springboot_validation/src/main/java/hello/itemservice/web/validation/form/ItemUpdateForm.java create mode 100644 springboot_validation/src/main/resources/templates/validation/v4/addForm.html create mode 100644 springboot_validation/src/main/resources/templates/validation/v4/editForm.html create mode 100644 springboot_validation/src/main/resources/templates/validation/v4/item.html create mode 100644 springboot_validation/src/main/resources/templates/validation/v4/items.html diff --git a/springboot_validation/src/main/java/hello/itemservice/domain/item/Item.java b/springboot_validation/src/main/java/hello/itemservice/domain/item/Item.java index 40654161..ac943181 100644 --- a/springboot_validation/src/main/java/hello/itemservice/domain/item/Item.java +++ b/springboot_validation/src/main/java/hello/itemservice/domain/item/Item.java @@ -12,18 +12,18 @@ import javax.validation.constraints.NotNull; //@ScriptAssert(lang = "javascript", script = "_this.price * _this.quantity >= 10000", message = "총 합은 10000원 이상 이다.") public class Item { - @NotNull(groups = UpdateCheck.class) // 수정 시 요구사항 추가 +// @NotNull(groups = UpdateCheck.class) // 수정 시 요구사항 추가 private Long id; - @NotBlank(groups = {SaveCheck.class, UpdateCheck.class}) +// @NotBlank(groups = {SaveCheck.class, UpdateCheck.class}) private String itemName; - @NotNull(groups = {SaveCheck.class, UpdateCheck.class}) - @Range(min = 1000, max = 1000000, groups = {SaveCheck.class, UpdateCheck.class}) +// @NotNull(groups = {SaveCheck.class, UpdateCheck.class}) +// @Range(min = 1000, max = 1000000, groups = {SaveCheck.class, UpdateCheck.class}) private Integer price; - @NotNull(groups = {SaveCheck.class, UpdateCheck.class}) - @Max(value = 9999, groups = {SaveCheck.class}) +// @NotNull(groups = {SaveCheck.class, UpdateCheck.class}) +// @Max(value = 9999, groups = {SaveCheck.class}) private Integer quantity; public Item() { diff --git a/springboot_validation/src/main/java/hello/itemservice/web/validation/ValidationItemControllerV4.java b/springboot_validation/src/main/java/hello/itemservice/web/validation/ValidationItemControllerV4.java new file mode 100644 index 00000000..a2f09d89 --- /dev/null +++ b/springboot_validation/src/main/java/hello/itemservice/web/validation/ValidationItemControllerV4.java @@ -0,0 +1,102 @@ +package hello.itemservice.web.validation; + +import hello.itemservice.domain.item.Item; +import hello.itemservice.domain.item.ItemRepository; +import hello.itemservice.domain.item.SaveCheck; +import hello.itemservice.domain.item.UpdateCheck; +import hello.itemservice.web.validation.form.ItemSaveForm; +import hello.itemservice.web.validation.form.ItemUpdateForm; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.validation.BindingResult; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.servlet.mvc.support.RedirectAttributes; + +import java.util.List; + +@Controller +@RequestMapping("/validation/v4/items") +@RequiredArgsConstructor +public class ValidationItemControllerV4 { + + private final ItemRepository itemRepository; + + @GetMapping + public String items(Model model) { + List items = itemRepository.findAll(); + model.addAttribute("items", items); + return "validation/v4/items"; + } + + @GetMapping("/{itemId}") + public String item(@PathVariable long itemId, Model model) { + Item item = itemRepository.findById(itemId); + model.addAttribute("item", item); + return "validation/v4/item"; + } + + @GetMapping("/add") + public String addForm(Model model) { + model.addAttribute("item", new Item()); + return "validation/v4/addForm"; + } + + @PostMapping("/add") + public String addItem(@Validated @ModelAttribute("item") ItemSaveForm form, BindingResult bindingResult, RedirectAttributes redirectAttributes) { + + if (form.getPrice() != null && form.getQuantity() != null ) { + int resultPrice = form.getPrice() * form.getQuantity(); + if (resultPrice < 10000) { + bindingResult.reject("totalPriceMin", new Object[]{10000, resultPrice}, null); + } + } + + // 검증 실패시 + if (bindingResult.hasErrors()) { + return "validation/v4/addForm"; + } + + Item item = new Item(); + item.setItemName(form.getItemName()); + item.setPrice(form.getPrice()); + item.setQuantity(form.getQuantity()); + + // 검증 성공시 + Item savedItem = itemRepository.save(item); + redirectAttributes.addAttribute("itemId", savedItem.getId()); + redirectAttributes.addAttribute("status", true); + return "redirect:/validation/v4/items/{itemId}"; + } + + @GetMapping("/{itemId}/edit") + public String editForm(@PathVariable Long itemId, Model model) { + Item item = itemRepository.findById(itemId); + model.addAttribute("item", item); + return "validation/v4/editForm"; + } + + @PostMapping("/{itemId}/edit") + public String edit(@PathVariable Long itemId, + @Validated @ModelAttribute("item") ItemUpdateForm form, BindingResult bindingResult) { + if (form.getPrice() != null && form.getQuantity() != null ) { + int resultPrice = form.getPrice() * form.getQuantity(); + if (resultPrice < 10000) { + bindingResult.reject("totalPriceMin", new Object[]{10000, resultPrice}, null); + } + } + + if (bindingResult.hasErrors()) { + return "validation/v4/editForm"; + } + + Item itemParam = new Item(); + itemParam.setItemName(form.getItemName()); + itemParam.setPrice(form.getPrice()); + itemParam.setQuantity(form.getQuantity()); + itemRepository.update(itemId, itemParam); + return "redirect:/validation/v4/items/{itemId}"; + } +} + diff --git a/springboot_validation/src/main/java/hello/itemservice/web/validation/form/ItemSaveForm.java b/springboot_validation/src/main/java/hello/itemservice/web/validation/form/ItemSaveForm.java new file mode 100644 index 00000000..3db6627f --- /dev/null +++ b/springboot_validation/src/main/java/hello/itemservice/web/validation/form/ItemSaveForm.java @@ -0,0 +1,23 @@ +package hello.itemservice.web.validation.form; + +import lombok.Data; +import org.hibernate.validator.constraints.Range; + +import javax.validation.constraints.Max; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +@Data +public class ItemSaveForm { + + @NotBlank + private String itemName; + + @NotNull + @Range(min = 1000, max = 1000000) + private Integer price; + + @NotNull + @Max(value = 9999) + private Integer quantity; +} diff --git a/springboot_validation/src/main/java/hello/itemservice/web/validation/form/ItemUpdateForm.java b/springboot_validation/src/main/java/hello/itemservice/web/validation/form/ItemUpdateForm.java new file mode 100644 index 00000000..bcbb3b57 --- /dev/null +++ b/springboot_validation/src/main/java/hello/itemservice/web/validation/form/ItemUpdateForm.java @@ -0,0 +1,24 @@ +package hello.itemservice.web.validation.form; + +import lombok.Data; +import org.hibernate.validator.constraints.Range; + +import javax.validation.constraints.Max; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +@Data +public class ItemUpdateForm { + + @NotNull + private Long id; + + @NotBlank + private String itemName; + + @NotNull + @Range(min = 1000, max = 1000000) + private Integer price; + + private Integer quantity; +} diff --git a/springboot_validation/src/main/resources/templates/validation/v4/addForm.html b/springboot_validation/src/main/resources/templates/validation/v4/addForm.html new file mode 100644 index 00000000..da0cf8db --- /dev/null +++ b/springboot_validation/src/main/resources/templates/validation/v4/addForm.html @@ -0,0 +1,73 @@ + + + + + + + + + +
+ +
+

상품 등록

+
+ +
+ +
+

글로벌 오류 메시지

+
+
+ + +
+ 상품명 오류 +
+
+
+ + +
+ 가격 오류 +
+
+
+ + +
+ 수량 오류 +
+
+ +
+ +
+
+ +
+
+ +
+
+ +
+ +
+ + \ No newline at end of file diff --git a/springboot_validation/src/main/resources/templates/validation/v4/editForm.html b/springboot_validation/src/main/resources/templates/validation/v4/editForm.html new file mode 100644 index 00000000..825468c2 --- /dev/null +++ b/springboot_validation/src/main/resources/templates/validation/v4/editForm.html @@ -0,0 +1,75 @@ + + + + + + + + + +
+ +
+

상품 수정

+
+ +
+ +
+

글로벌 오류 메시지

+
+ +
+ + +
+
+ + +
+ 상품명 오류 +
+
+
+ + +
+ 가격 오류 +
+
+
+ + +
+ 수량 오류 +
+
+ +
+ +
+
+ +
+
+ +
+
+ +
+ +
+ + \ No newline at end of file diff --git a/springboot_validation/src/main/resources/templates/validation/v4/item.html b/springboot_validation/src/main/resources/templates/validation/v4/item.html new file mode 100644 index 00000000..76cd1cb6 --- /dev/null +++ b/springboot_validation/src/main/resources/templates/validation/v4/item.html @@ -0,0 +1,60 @@ + + + + + + + + + +
+ +
+

상품 상세

+
+ + +

+ +
+ + +
+
+ + +
+
+ + +
+
+ + +
+ +
+ +
+
+ +
+
+ +
+
+ +
+ + \ No newline at end of file diff --git a/springboot_validation/src/main/resources/templates/validation/v4/items.html b/springboot_validation/src/main/resources/templates/validation/v4/items.html new file mode 100644 index 00000000..f5fe7315 --- /dev/null +++ b/springboot_validation/src/main/resources/templates/validation/v4/items.html @@ -0,0 +1,49 @@ + + + + + + + + +
+
+

상품 목록

+
+ +
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + +
ID상품명가격수량
회원id상품명1000010
+
+ +
+ + + \ No newline at end of file