타임리프를 통한 검증 코드 추가하기
상품 등록에 검증 코드를 추가해주었다.
검증이 처음에는 뭔가 했는데 그냥 쉽게 입력 누락이나 정해진 범위 초과 등 정석에 맞지 않는 부분이 틀렸다고 알려주는 코드를 추가해주는 것이였다.
이것 역시 공모전을 진행하면서 고생했던 부분이었는데 이렇게 쉽게 할 수 있는 것을 보고 많이 배워간다.
예시 코드는 너무 길어서 일부분만 뺴왔다.
//검증 오류 결과를 보관
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편 - 백엔드 웹 개발 활용 기술을 참고하여 공부하였습니다.
'Framework & Library > Spring Boot' 카테고리의 다른 글
[Spring Boot] : BindingResult 사용(2) (0) | 2022.02.10 |
---|---|
[Spring Boot] : BindingResult 사용(1) (0) | 2022.02.10 |
[Spring Boot] : 타임리프 Message 국제화 (0) | 2022.02.09 |
[Spring Boot] : 타임리프 웹 애플리케이션 Message에 적용하기 (0) | 2022.02.09 |
[Spring Boot] : 타임리프 MessageSource 사용하기 (0) | 2022.02.09 |
댓글