본문 바로가기
Framework & Library/Spring Boot

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

by 오주현 2022. 2. 10.
반응형

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


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

 

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

 

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

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

 

//검증 오류 결과를 보관
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편 - 백엔드 웹 개발 활용 기술을 참고하여 공부하였습니다.

반응형

댓글