Framework & Library/Spring Boot

[Spring Boot] : 타임리프를 통한 검증 코드 추가하기

오주현 2022. 2. 10. 18:08
반응형

타임리프를 통한 검증 코드 추가하기


상품 등록에 검증 코드를 추가해주었다.

 

검증이 처음에는 뭔가 했는데 그냥 쉽게 입력 누락이나 정해진 범위 초과 등 정석에 맞지 않는 부분이 틀렸다고 알려주는 코드를 추가해주는 것이였다.

 

이것 역시 공모전을 진행하면서 고생했던 부분이었는데 이렇게 쉽게 할 수 있는 것을 보고 많이 배워간다.

예시 코드는 너무 길어서 일부분만 뺴왔다.

 

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

먼저 컨트롤러에 검증 로직을 추가하기 위해 검증 오류 결과를 보관할 errors를 만들어주었다.

 

if (!StringUtils.hasText(item.getItemName())) { //넘어온 글자가 없으면
            errors.put("itemName", "상품 이름은 필수입니다."); //상품 이름은 필수입니다.를 넘겨준다.
        }

그 뒤 검증 로직을 만들어 주었는데 먼저 SpringUtils를 임포트해주고 주석처럼 if문을 통해 넘어온 글자가 없다면 errors.put을 통해 메시지를 남겨준다. 오류가 발생한 필드명을 key로 해서 어떤 필드에서 오류가 발생하였는지 판단할 수 있다.

 

th:class="${errors?.containsKey('itemName')} ? 'form-control field-error' : 'form-control'"

    <div class="field-error" th:if="${errors?.containsKey('itemName')}" th:text="${errors['itemName']}">
        상품명 오류
    </div>

코드 중 라인만 뗴어오면 위 코드가 핵심이다.

 

오류 메시지는 errors에 내용이 있을 때만 출력이 된다. 이때, th:if를 통해 조건을 판단한다.

 

errors? 에대해 알려주었는데 Safe Navigation Operator이라고 errors가 null일 떄 원래는 NullPointerException이 발생하는데 errors?.은 errors가 null일때 오류대신 null을 반환하도록 해주는 문법이라고 한다. 때문에 th:if에서 errors의 내용이 없다면 null이 뜨고 실패로 인식되어 오류 메시지 출력이 되지 않는다.

 

//검증에 실패하면 다시 입력 홈으로
if (!errors.isEmpty()) { //부정의 부정이라 리팩토링이 필요하나 다루진 않는다.
    log.info("errors = {}", errors);
    model.addAttribute("errors", errors);
    return "validation/v1/addForm";
}

검증을 실패했을 때 다시 입력 홈으로 가도록 하는 코드도 추가해 주었다.

 

주석처럼 부정의 부정은 원래 잘 사용하지 않는데 실습이니까 사용한다고 한다. 이것에 관해서는 리팩터링 책을 참고하면 좋다고 한다.

 

이렇게 값을 입력하지 않거나 정해진 범위를 벗어나는 값을 입력하면 사용자가 체크할 수 있도록 한다.

 


스프링 MVC 2편 - 백엔드 웹 개발 활용 기술을 참고하여 공부하였습니다.

반응형