인프런 커뮤니티 질문&답변

세승님의 프로필 이미지
세승

작성한 질문수

스프링 MVC 2편 - 백엔드 웹 개발 활용 기술

오류 코드와 메시지 처리4

ObjectError 오류 메시지 출력

해결된 질문

작성

·

716

0

복습하던중 궁금한 점이 생겨 질문 남깁니다.

강의 교안 4. 검증1- Validation 의 29페이지에 내용을 보면,

"타임리프가 화면을 렌더링할 때 th:errors 가 실행된다. 만약 이때 오류가 있다면 생성된 오류 메시지 코드를 순서대로 돌아가면서 메시지를 찾는다. 그리고 없으면 디폴트 메시지를 출력한다." 라고 되어있는데요.

FieldError의 경우에는 타임리프의 th:errors 속성으로 특정 필드를 지정해줄 수 있기 때문에 위의 내용이 가능하다고 생각되는데, ObjectError의 경우에는 th:errors 처럼 특정 속성을 지정할 수 있는 오류가 아닌데, 템플릿 상의 어떤 요소를 토대로 어떻게 타임리프가 ObjectError의 오류 메시지 코드를 찾게 되는 것인가요?

답변 1

0

김영한님의 프로필 이미지
김영한
지식공유자

안녕하세요. 세승님

th:errors는 필드 오류에 대한 것이 맞습니다.

ObjectError는 글로벌 오류로 처리해야 합니다.

감사합니다.

세승님의 프로필 이미지
세승
질문자

안녕하세요. 영한님!

제가 드린 질문을 잘못 이해하신것 같아서 답글을 달게되었습니다.

제가 궁금했던건,

"ObjectError의 경우에는 필드오류의 th:errors 처럼 특정 속성을 지정할 수 있는 오류가 아닌데, 템플릿 상의 어떤 요소를 토대로 어떻게 타임리프가 ObjectError의 오류 메시지 코드(강의의 totalPriceMin.item 또는 totalPriceMin)를 찾게 되는 것인가요?" 입니다.

김영한님의 프로필 이미지
김영한
지식공유자

안녕하세요. 세승님

섹션 4에 있는 검증1 - Validation을 부분으로 설명드리겠습니다.

글로벌 오류 - ObjectError 담기

bindingResult.addError(new ObjectError("item", "가격 * 수량의 합은 10,000원 이상이어야 합니다. 현재 값 = " + resultPrice));
또는
bindingResult.addError(new ObjectError("item", new String[]{"totalPriceMin"}, new Object[]{10000, resultPrice}, null));

이 부분들을 보시면 글로벌 오류는 ObjectError라는 타입으로 담기고, 이름도 "item"과 같이 지정할 수 있습니다. 그리고 ObjectError는 두번째 파라미터로 코드를 넘길 수도 있습니다. totalPriceMin와 같이요.

 

글로벌 오류 - ObjectError 출력하기

<div th:if="${#fields.hasGlobalErrors()}">
    <p class="field-error" th:each="err : ${#fields.globalErrors()}" th:text="${err}">전체 오류 메시지</p>
</div>

타임리프에서는 #fields.hasGlobalErrors()라는 부분을 통해서 ObjectError 부분을 찾아서 출력할 수 있습니다.

이때 내부에 담긴 item이라는 키 값을 알 수 있고, 오류 코드로 지정한 totalPriceMin도 알 수 있습니다.

더 자세한 내용은 섹션 4에 있는 검증1 - Validation 부분을 다시 복습해보시면 이해가 되실거에요^^

감사합니다.

 

세승님의 프로필 이미지
세승
질문자

헉 생각해보니 그렇네요. 복습중에 순간적으로 validator에 의해서 글로벌 오류도 처리되는거라고 착각하고 있었습니다 ㅠㅠㅠ

친절한 답변 감사합니다!

세승님의 프로필 이미지
세승

작성한 질문수

질문하기