Spring MVC validation 검증

zwon·2023년 8월 29일
0

Spring

목록 보기
4/12

Controller의 주요 역할은 HTTP 요청이 정상적인 요청인지 "검증"하는 것이다.
예를 들어 도서 입력 폼이 있는데 Page수에 문자를 작성하거나 정보를 입력하지 않는 경우 다시 입력 폼을 서비스 사용자에게 보여줘야한다.

근데 그냥 보여주면 안되고 어떤 값을 잘못 입력했는지도 함께 알려줘야한다.

BindingResult

  • Spring에서는 BindingResult라는 것을 제공해서 오류를 처리할 수 있도록 해준다.
  • BindingResult는 Spring이 제공하는 검증 오류 보관 객체이다
  • BindingResult는 @ModelAttribute 다음에 와야한다.
  • BindigResult는 model에 담아주지않아도 자동으로 view에 같이 넘어간다.
  • BindigResult를 사용하면 컨트롤러가 정상적으로 호출이 된다.


필드 오류는 BindingResult를 사용할 때 new Field()를 제공해줘서 여기에 작성하면 된다.

[예시]
도서명과 저자명을 입력해야하고 Book의 필드로 bookName과 author를 가진다고 가정하자.

그러면 new Field("오브젝트명", "필드명", "에러메시지")의 순으로 작성하면 된다.

근데 추가 요구사항으로 입력폼에 도서 총 페이지 수와 현재 읽은 페이지 수도 입력받아야한다고 하자.
그리고 현재 읽은 페이지 수가 총 페이지 수를 넘을 수 없고 넘는다면 에러 메시지를 띄워주도록 하는 요구사항이 들어왔다고 가정하자.

특정 필드 검증이 아닌 오류같은 경우는 new ObjectError()를 사용하면 된다.
new Object("오브젝트명", "에러메시지")를 작성해주면 된다.


StringUtils.hasText(값)

StringUtils.hasText(값)를 사용하면 값이 있을 경우에는 true를 반환, 공백이나 null일 경우 false를 반환한다.


요구사항 반영 후 코드이다.
마지막 bindingResult.hasError()를 이용하여 에러가 있는 경우 다시 도서 입력폼을 보여주는 로직을 끝으로 요구사항 반영을 다 했다.

당연히 view도 수정해줘야하고 템플릿엔진은 thymeleaf를 사용한다고 하겠다.

타임리프에서 스프링 BindingResult 접근법

  1. #fields : BindingResult에 접근 가능
  2. th:errors : 해당 필드에 오류가 있는 경우 태그 출력 (th:if와 비슷)
  3. th:errorclass : th:field에 지정한 필드에 오류가 있으면 class정보를 추가해줌

[예시]

<div th:if="${#fields.hasGlobalErrors()}">
      <p class="filed-error" th:each="err : ${#fields.globalErrors()}" 
      th:text="${err}">글로벌 오류 메시지</p>
</div>
<div class="filed-error" th:errors="*{bookName}"></div>

여기서는 BindingResult에 대해 알아보았고 더 나아가서 오류 메시지 관리나 코드의 중복 최적화를 위해 코드를 개선해나갈 것이다.
좀 더 알아보고싶다면 BindingResult의 rejectValue(), reject()에 대해 찾아보면된다.


스프링 MVC 2편-백엔드 웹 개발 활용 기술을 수강하면서 사이드 프로젝트에 적용한 내용을 바탕으로 정리했습니다.

profile
Backend 관련 지식을 정리하는 Back과사전

0개의 댓글