🤍 전 강의 25% 할인 중 🤍

2024년 상반기를 돌아보고 하반기에도 함께 성장해요!
인프런이 준비한 25% 할인 받으러 가기 >>

  • 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    미해결

강사님

22.07.27 20:41 작성 조회수 194

0

학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.

1. 강의 내용과 관련된 질문을 남겨주세요.
2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.
(자주 하는 질문 링크: https://bit.ly/3fX6ygx)
3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.
(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)

질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.
=========================================
[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (/아니오)
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (/아니오)
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)

[질문 내용]
여기에 질문 내용을 남겨주세요.
강사님 24:00경 errors가 없는 경우를 설명하실 때 post로 /add를 보내면
Map<String, String> errors = new HashMap<>(); 이것을 
코드에 넣어두기 때문에 errros가 비어있는게 아니라고 하셨는데
생성만 해도 @ModelAttribute와 같이 addObject를 해주는 건가요?
그게 아니라면 errors가 비어있어 /add를 post로 보내도 thymeleaf에서 볼 땐 비어있는 것으로 보일것 같아서요!

답변 2

·

답변을 작성해보세요.

0

그건 

if (!errors.isEmpty()) 
이로직에 걸릴 때만 하는것 아닌가요? 비어있는 것에서는 아예 model에 put을 안하는데요

 

OMG님의 프로필

OMG

2022.07.31

생각하신게 해당 메서드 첫라인 errors인스턴스를 생성하는 코드를 작성하여

성공로직에서 errors가 비어있더라도 화면단에서 오류가 발생하지 않는지 궁금해하시는 것 같습니다.

        //검증 오류 결과를 보관
        Map<String, String> errors = new HashMap<>();

        //검증 로직
        if (!StringUtils.hasText(item.getItemName())) {
           // errors.put("itemName", "상품 이름은 필수입니다.");
        }
        if (item.getPrice() == null || item.getPrice() < 1000 || item.getPrice() > 1000000) {
           // errors.put("price", "가격은 1,000 ~ 1,000,000 까지 허용합니다.");
        }
        if (item.getQuantity() == null || item.getQuantity() >= 9999) {
         //   errors.put("quantity", "수량은 최대 9,999 까지 허용합니다.");
        }

        //특정 필드가 아닌 복합 룰 검증
        if (item.getPrice() != null && item.getQuantity() != null) {
            int resultPrice = item.getPrice() * item.getQuantity();
            if (resultPrice < 10000) {
                //errors.put("globalError", "가격 * 수량의 합은 10,000원 이상이어야 합니다. 현재 값 = " + resultPrice);
            }
        }

        //검증에 실패하면 다시 입력 폼으로
        if (!errors.isEmpty()) {
            log.info("errors = {} ", errors);
            model.addAttribute("errors", errors);
            return "validation/v1/addForm";
        }

        //성공 로직
        Item savedItem = itemRepository.save(item);
        redirectAttributes.addAttribute("itemId", savedItem.getId());
        redirectAttributes.addAttribute("status", true);
        return "redirect:/validation/v1/items/{itemId}";

 

여기서 검증 실패 오류를 처리하는 코드를 제외하면 성공로직 코드만 남습니다.

 //검증 오류 결과를 보관
        Map<String, String> errors = new HashMap<>();

        //성공 로직
        Item savedItem = itemRepository.save(item);
        redirectAttributes.addAttribute("itemId", savedItem.getId());
        redirectAttributes.addAttribute("status", true);
        return "redirect:/validation/v1/items/{itemId}";

0

OMG님의 프로필

OMG

2022.07.27

안녕하세요. marlone Johnathan님, 공식 서포터즈 OMG입니다.

Map<String, String> errors = new HashMap<>(); 

HashMap타입의 인스턴스를 model.addAttribute("errors", errors);

를 호출하였기 때문에 가능한 것으로 보시면 됩니다.

 

//검증에 실패하면 다시 입력 폼으로
if (!errors.isEmpty()) {
log.info("errors = {} ", errors);
model.addAttribute("errors", errors);
return "validation/v1/addForm";
}

감사합니다.

채널톡 아이콘