저번 포스팅에서 SpringMVC Validation에 대한 간단한 예제를 살펴보았다. 유효성 검사에서 오류가 있다고 판단되는 항목에 대해서 JSP에서 메세지를 출력하였는데 JSR-303에서 정의한 defaultMessage를 가져와서 출력해주는 것이었다.

우리가 설정한 문자열을 오류메세지로서 출력하기 위해서는 properties파일을 이용한다.

propertise파일에 정의한 변수들은 서버가 동작하는 중에는 절대 변경할 수 없는 값이며, message로 등록하면 JSP에서도 사용할 수 있었다. 그 점을 이용해서 properties파일에서 변수를 불러와서 메세지를 커스텀메시지를 출력할 수 있다.

 

저번 포스팅에서 BindingReust객체를 getAllErrors()를 이용해서 가져온 후, 배열의 첫번째 인덱스를 읽어왔을 때, 

에러종류(어노테이션의 종류).빈 이름.프로퍼티 이름의 형식으로 문자열을 가져올 수 있었다.

 

properties파일에 등록할 변수를 위와 같은 형식으로 message에 등록해줌으로써 유효성 검사에 통과하지 못하여 에러메세지가 출력될 때, properties파일에 사용자가 지정한 데이터를 출력할 수 있도록 해준다!

또 한, 메세지를 이용한 다국어 처리까지 가능해진다.

 

 

빈 클래스의 유효성 검사 정보 설정

 

다음과 같이 DataBean1이라는 빈클래스를 유효성검사 대상 빈으로 등록하고 BindingResult객체를 주입받아서 결과에 오류가 있다면(유효성 검사에 만족하지 않는다면) 값을 입력하는 폼을 다시 불러오게 하였다.

 

기본적인 Validation을 JSP에 출력하는 방법은 Request객체에 담겨있는 errors를 이용하는 것이지만 이번에는 properties파일에 에러메세지를 저장하고 그 파일을 message에 등록한 후, form커스텀의 message태그를 이용하여 해당 에러메세지를 출력해보는 방식으로 활용해 보겠다!!

 

 

error_message.properties

 

codes배열에 첫번째 배열의 인덱스에는 에러종류(어노테이션의 종류).빈 이름.프로퍼티 의 형태로 에러메세지가 저장됨을 저번 예제에서 살펴보았었다. 그부분의 에러를 똑같이 properties파일에 저장하는 것이다. 

DataBean1빈에서 data1프로퍼티의 Size(여기서는 2~10글자수의 문자열)에 유효성검사가 실패하면 오류가 날것이기 때문에 오류메세지를 위와 같이 정의해준다. data2도 마찬가지이다.

 

 

그 후에 이 properties파일을 Message로 등록해주자.

 

 

message로 등록해주었으니 이제 form커스텀 태그를 이용해서 jsp에서도 활용을 할 수 있게 되었다.

 

 

 

 

tags를 사용하기 위해서 jsp에 taglib를 추가해주고, 만약 dataBean1의 data1에 에러가 있으면

<spring:message>태그를 이용하여 위와같이 출력해준다. codes배열의 첫번째 인덱스의 형식으로 properties파일을 등록해주었기 때문에 만약 유효성검사를 통과하지 못하고 error가 발생한다면 우리가 커스텀한 메세지가 출력될 것이다.

 

 

 

유효성 검사의 조건을 만족하지 못하면 위와 같이 커스터마이징한 에러메세지가 출력된다. 

 

 

 

 

그런데, 한가지 문제가 있다.

Controller에서 BindingResult객체를 주입받아서 result.hasErrors()하여 유효성 검사를 만족하지 못하면 폼 화면을(inputData.jsp) 요청하였다. 이렇게 되면 유효성을 만족하지 못한 데이터 뿐만 아니라 만족했던 데이터까지도 input폼에 남아있지 않고 사라진다. 유효성조건을 만족하는 데이터는 사라지지 않게 하려면 어떻게 해야할까??

 

form커스텀 태그의 input태그를 이용하면 자동으로 name값과 id값을 넣어주고, value값을 유지시켜주었다.

그래서 회원수정 폼이나 글 수정 폼에 적합하다고 소개를 했었다!!

그걸 활용해보자.

 

 

 

폼 커스텀 태그를 사용하기 위해서 taglib를 추가해 주었다.

<form:form>태그에 modelAttribute속성에 빈 클래스를 정의해주면 컨트롤러에서 modelAttribute로 넘겨주었던 빈클래스를 주입하여 사용하게 된다. 

<form:input>태그에 path속성을 정의한 빈 클래스의 프로퍼티와 동일하게 설정하면 자동으로 id, name이 path의 값과 동일하게 들어가고 사용자가 입력한 값이 value속성에 들어가게 된다. 

<form:errors>태그의 path속성을 정의한 빈 클래스의 프로퍼티와 동일하게 설정하면 컨트롤러에서 Request에 자동으로 들어갔던 BindingResult객체의 errors값을 이용하여 유효성 검사를 하게 되고, 유효성 검사를 만족하지 못하면 errors의 배열의 첫번째 인덱스의 에러메세지를 출력하게 된다. 에러메세지는 Message로 등록된 properties파일에서 찾아준다.

 

 

즉, 

 

<c:if test="${errors.hasFieldErrors('data1') }">
   <spring:message code="${errors.getFieldError('data1').codes[0]}" /><br/>
</c:if>

 

 

이만큼의 코드를 

 

 

<form:errors path="data1" /><br/>

 

 

이 폼 커스텀 태그 한줄로 대체가 가능하다는 것이다..

유효성 검사를 jsp에서 활용하려면 폼 커스텀 태그를 사용해야 할 것 같다.

'JAVA > Spring MVC' 카테고리의 다른 글

Interceptor  (0) 2020.05.03
JSR-303, JSR-380 어노테이션  (0) 2020.05.01
Spring MVC 유효성검사  (0) 2020.04.30
Message  (0) 2020.04.29
Properties  (0) 2020.04.28

+ Recent posts