Notice
Recent Posts
Recent Comments
Link
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

개발자되기 프로젝트

Form 전송 객체 분리 - 개발 본문

인프런/[인프런] 스프링 MVC 2

Form 전송 객체 분리 - 개발

Seung__ 2021. 9. 25. 16:19

1. ItemSaveForm


@Data
public class ItemSaveForm {

    @NotBlank
    private String itemName;

    @NotNull
    @Range(min=1000, max=1000000)
    private Integer price;

    @NotNull
    @Max(value = 9999)
    private Integer quantity;

}

 

2. ItemUpdateForm


@Data
public class ItemUpdateForm {

    @NotNull
    private Long id;

    @NotBlank
    private String itemName;

    @NotNull
    @Range(min=1000, max=1000000)
    private Integer price;

    //수정에서는 수량은 제약 없음.
    private Integer quantity;

}

 

3. Controller


  • addItem(), edit() 수정
  • form 객체 -> Item 객체 변환 로직 추가
@Slf4j
@Controller
@RequestMapping("/validation/v4/items")
@RequiredArgsConstructor
public class ValidationItemControllerV4 {

    private final ItemRepository itemRepository;


    @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()){
            log.info("errors = {}", bindingResult);
            // model.addAttribute("errors", errors);
            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}";
    }


    @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()){
            log.info("errors = {}", bindingResult);
            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}";
    }
}

 

4. Form 객체 바인딩


@PostMapping("/add")
public String addItem(@Validated @ModelAttribute("item") ItemSaveForm form,
BindingResult bindingResult, RedirectAttributes redirectAttributes) {
//...
}
  • Item 대신에 ItemSaveform 을 전달 받는다. 
  • 그리고 @Validated 로 검증도 수행하고, BindingResult 로 검증 결과도 받는다.
  • 주의
  • @ModelAttribute("item") 에 item 이름을 넣어준 부분을 주의하자. 
    • 이것을 넣지 않으면 ItemSaveForm 의 경우 규칙에 의해 
    • itemSaveForm 이라는 이름으로 MVC Model에 담기게 된다.
    • 이렇게 되면 뷰 템플릿에서 접근하는 th:object 이름도 함께 변경해주어야 한다.

 

5. GitHub : 210925 Bean Validation, DTO


 

GitHub - bsh6463/Validation-V1

Contribute to bsh6463/Validation-V1 development by creating an account on GitHub.

github.com

 

Comments