작성
·
535
0
안녕하세요! 현재 강의를 듣고 개인적으로 프로젝트를 진행하고 있습니다. 회원가입 폼을 만들고 각각의 값이 유효한지를 검증하도록 하고 있습니다.
그런데 만약 필드가 5개가 있고, 각각 @NotBlank와 @Pattern으로 검증한다고 했을 때, 검증에 우선순위를 두어서 @NotBlank가 실패한 경우에는 @Pattern은 검증하지 않도록 하는 방법이 있을까요? 지금은 공백을 입력하는 경우 @NotBlank에 대한 에러메시지와 @Pattern에 대한 에러메시지가 모두 출력되고 있습니다. 공백을 입력하는 경우 @Pattern에 대한 에러는 출력하지 않고 싶습니다.(@Pattern에 공백을 허용하도록 정규식을 작성하면 될 것 같지만, @Pattern 이외에 다른 Validation을 사용할 경우도 생각해서 정석적인 방법을 알고 싶습니다.)
먼저 적용해본 방식은, 순서를 지정하는 인터페이스를 만들고 @GroupSequence를 적용하는 것인데요, @NotBlank를 상위 우선순위로 두고 @Pattern을 하위 우선순위로 두었을 떄, 어떤 한 필드에서라도 @NotBlank를 만족시기키 못해 에러메시지가 나가면, 다른 필드에서 @Pattern의 메시지가 나가야 하는 상황에서도 출력되지 않는 문제가 있어 원하는 방식이 아니었습니다.
만약 Validation과정에서 우선순위를 정할 수 없는 방법이 없다면 제가 bindingResult를 조작하여 원하는 error만 view로 넘겨주거나, 타임리프에서 우선순위에 맞는 에러만 보여줄 수 있는 방법이 있을까요? bindingResult의 값을 다 까서 필요한 것들만 다른 List나 Map에 담아 Model로 넘기는 것은 너무 돌아가는 방법인 것 같아 정석적인 방법이 있는지 질문드립니다.
답변 1
2
안녕하세요. BrokenCareer님
지금 떠오르는 방법은 2가지 입니다.
첫 번째는 검증은 모두 하더라도 메시지가 중복 출력되는 것이 문제이면 다음과 같이 처리하면 될 것 같아요.
기존 코드
<div class="field-error" th:errors="*{price}">
가격 오류
</div>
변경 코드
<div class="field-error" th:each="error, stat : ${#fields.errors('price')}" th:text="${error}" th:if="${stat.first}" />
변경 코드를 보시면 오류 메시지가 반복에서 처음인 경우에만 div를 출력하도록 했습니다.
두 번째는 만약 이 방법으로 원하는 목표가 달성되지 않는다면, 제 생각에는 이 경우 BeanValidation을 사용하지 않고, 앞서 배운 것 처럼 BindingResult.reject()... 등과 코드로 직접 컨트롤하는 것이 좋을 듯 합니다.
관련해서 더 좋은 방법을 아시는 분은 도움 부탁드립니다.
감사합니다.