웹 어플리케이션에서 사용자 입력에 대해 유효성을 검사해야하는 경우가 있다. 예를 들어, 회원가입을 한다거나 글을 작성한다거나 하는 경우가 되겠다. 이 때, 작성한 내용을 규칙에 맞게 잘 작성을 하였는가에 대한 검사를 유효성 검사라고 한다.
이러한 유효성검사는 JavaScript에서 브라우저가 서버로 요청을 보낼 때 먼저 확인을 하는 경우도 있으나 SpringMVC에서도 확인을 할 수 있다. 클라이언트가 보낸 테이터를 서버에서 먼저 확인을 하고 저장을 할지 말지를 결정하겠다는 것이다.
빈에 데이터가 입력될 때 어떤검사를 할것인지 어노테이션으로 지정하고 지정된 어노테이션의 조건에 맞지 않으면 개발자에게 입력값에 오류가 있다는 정보를 전달한다. 즉, 클라이언트에서 넘어온 데이터 자체를 검사한다기 보다는 일단은 값을 빈에 주입을 하고, 들어간 값을 검사해서 올바른 규칙으로 들어왔는지에 대한 검사를 한다.
SpringMVC는 JSR-303, JSR-380 이라는 규격의 유효성 검사 라이브러리를 사용할 수 있다.
먼저 라이브러리를 추가해보도록 하겠다.
mvnrepository사이트에서 Bean Validation이라고 검색하면 다음과 같은 javax.validation api를 찾을 수 있다.
pom.xml에 추가해주었다.
hibernate validator라는 라이브러리도 추가해주어야한다. hibernate validation은 변수에 주입된 값을 실제로 검사하는 코드가 구현된 검사기이다. 가장 많이 사용하는 validator라고 한다..
이제 간단하게 유효성 검사를 해보겠다.
먼저 주입받는 빈에 어노테이션을 이용하여 조건을 정해주어야 한다.
@Size는 min값과 max값 사이의 글자 수 만큼만 주입할 수 있다는 의미이다. (data1에는 글자수 2~10의 문자열)
@Max는 정해진 숫자 이하의 값만 주입할 수 있다는 의미이다. (data2에는 100이하의 정수)
더 많은 어노테이션이 있지만 다음 포스팅에서 더 자세하고 다양하게 예제실습을 해보도록 하겠다.
Controller에서 @Valid를 설정하여 유효성 검사를 실시할 수 있다. 매개변수에 어노테션은 붙여주면 설정해준 빈 클래스에서 조건 어노테이션에 맞게 유효성 검사를 진행한다.
유효성 검사의 결과는 BindingResult객체를 주입받아서 확인이 가능하다. BindingResult객체에는 유효성 검사에 위배된 정보들이 들어가 있다. 이 정보들은 Request 영역에 errors라는 이름으로 넘겨지게 된다. 후에 JSP에서 활용하는 코드에서 살펴보자.
result라는 이름의 BindingResult변수를 이용하여 유효성 검사에 위반된 부분을 알 수 있다.
hasErrors()를 이용하여 만약에 오류가 발생하였다면(위반된 부분이 있다면), 그 모든 오류들을 ObjectError객체에 담아서 출력할 수 있다. getAllErrors메소드는 List형의 반환값을 가진다.
위와 같이 출력하면 다음과 같은 결과를 얻을 수 있다. 여기서 한개 더 얻을 수 있는 정보는 바로 getCodes에 관한 부분이다.
오류결과를 모두 가져와 출력해주는 코드에서 String배열로 obj.getCodes()를 이용하여 에러 코드들만을 받아온 부분을 볼 수 있다. 저 배열에 담겨 있는 모든 코드들을 실행 해보겠다.
어떤 에러가 났고, 어떤 빈에서 났고, 어떤 프로퍼티에서 났고.. 이러한 정보들이 여러개 나오는것을 알 수 있었다.
우리는 이중에서 첫번째 배열을 잘 보자.
에러종류(어노테이션종류).빈이름.프로퍼티이름
이러한 규칙으로 출력되었다. 이 첫번째 인덱스에 들어간 정보들에서 어떤 빈에서 어떤 프로퍼티가 어떤 에러가
났는지 바로 알 수 있기 때문에 우리는 이 첫번째 인덱스를 나중에 properties파일에 위와 같은 양식으로 집어넣어 code[0]으로 값을 가져와 사용할 수 있다. 이 예제는 다음포스팅에서 살펴보도록 하자.
이번에는 이 유효성검사의 오류결과들을 JSP에서 사용해보자.
아까 위에서 잠깐 이야기를 했지만, BindingResult객체를 이용하면 오류정보들이 Request영역에 errors라는 이름으로 넘겨지게 된다. 우리는 그것을 JSP에서 사용하면 된다.
errors를 가져오려면 spring 태그를 이용해야하기 때문에 taglib를 추가해주었다. 오류가 나면 그 오류 메세지를 가져오라는 조건문을 작성해야 하기 때문에 jstl도 사용한다.
조금 복잡하지만 일단은 가장 기본적인 방법으로 에러메세지를 출력하는 방법을 사용해보았다. 앞으로 에러메세지를 커스터마이징 하는 부분에서 위의 코드는 더욱 간단해질 것이다.
<spring:hasBindErrors> 태그의 name을 빈 클래스로 설정해주어서 빈클래스의 유효성검사에 error가 있으면 이 커스텀 태그에 들어오게 된다. <c:if test>에서 Request영역에 있는 errors를 가지고 온다. 빈 클래스의 data1프로퍼티에 오류가 있을 때, 오류메세지를 받아와서 그중에서 defaultMessage만 출력하겠다는 이야기이다.
여기서 defaultMessage는 위의 결과창에서 보았던 메세지를 말한다.
data1의 문자열 길이가 2~10글자수가 넘어가거나, data2의 정수가 100이 넘어가게 되면 오류메세지를 출력한다.
'JAVA > Spring MVC' 카테고리의 다른 글
JSR-303, JSR-380 어노테이션 (0) | 2020.05.01 |
---|---|
에러메세지 커스터마이징 (2) | 2020.04.30 |
Message (0) | 2020.04.29 |
Properties (0) | 2020.04.28 |
SpringMVC에서 Cookie 사용하기 (0) | 2020.04.28 |