인프런 커뮤니티 질문&답변
타임리프에서 th:errorclass가 정확히 어떤 것인지 궁금합니다!
작성
·
596
0
안녕하세요!
항상 좋은 답변해주셔서 감사합니다.
이번에는 타임리프에서 th:errorclass를 사용할 때 궁금증이 생겨서 코드로 여쭤보고 싶어 글을 작성하게 되었습니다.
정확하게는 th:errorclass에서 errorclass가 true일 때, th:field="*{price}"를 통해서 나와야 할 th:value = "${item.price}"가 왜 안 나오는지를 이해하지 못해서 글을 적게 되었습니다.
<input type="text" id="price" th:field="*{price}"
th:errorclass="field-error"
class="form-control" placeholder="가격을 입력하세요">
위 코드를 보면 errorclass='field-error'가 있고, 이것이 여러가지의 형태를 축약해서 보여주는 것으로 알고 있습니다.
<input type="text" id="price" th:field="*{price}"
th:classappend="${#fields.hasErrors('price')} ? 'field-error' : _"
class="form-control" placeholder="가격을 입력하세요">
타임리프 독스를 활용하면 위의 코드가 축약되는 것이 errorclass로 이해를 하고 있습니다. 즉, errorclass는 현재 선택표현식으로 나오는 값이 에러가 있으면, 클래스에 field-error를 더해서 사용하고, 에러가 없으면 form-control만 사용하는 것으로 이해를 하고 있습니다.
bindingResult.addError(new FieldError("Item","itemName","상품 이름은 필수입니다."));
그런데 RejectedValue를 사용하지 않고, 위 코드를 사용하게 될 경우 Validation을 통과하지 못한 값들은 다시 HTML Form으로 나오지는 않습니다.
그런데 확인해보니 @ModelAttribute로 요청 파라미터가 바인딩 될 때는, 로그 상에서 잘못된 값이 들어오더라도 Item 객체에는 정상적으로 바인딩 되는 것이 확인되었습니다.
이 상황들을 요약해보면 다음과 같습니다.
1. @ModelAttribute로 객체 Binding이 될 때는 타입 에러만 아니면, Validation을 통과하지 못하는 모든 값들도 자동적으로 객체에 Binding이 된다.
2. 따라서 다시 addForm으로 넘어갈 때, Model에 들어있는 Item에는 비정상적으로 입력된 값도 들어가있다.
3. 뷰 템플릿에서 Model에서 item을 찾아서 값을 꺼내려고 할 때, 값이 없기 때문에 안 꺼내지는 것은 아닌 것으로 확인된다.
위의 세 가지 상황을 요약해보면...
<input type="text" id="price" th:field="*{price}"
th:errorclass="field-error"
class="form-control" placeholder="가격을 입력하세요">
위 코드에서 price로 된 error가 있다면, th:field에 의해서 자동으로 생성되는 th:value=${price}만 실행되지 않는다로 이해를 해야할 것 같습니다. 왜냐하면 error가 있을 때, 레드박스는 발동하기 때문입니다.
아무리 찾아봐도... 없어서... 위처럼 이해를 해도 되는 것인지 궁금합니다!
항상 좋은 답변 감사드립니다!
좋은 하루 되세요!
퀴즈
애플리케이션에서 검증(Validation)이 중요한 주된 이유가 무엇일까요?
데이터 처리 속도 향상
시스템 오남용 방지 및 데이터 무결성 보장
사용자 인터페이스 디자인 개선
데이터베이스 부하 감소






감사합니다 영한님 !!