본문 바로가기
dev/Spring

[Spring] 데이터 검증

by dev_Step 2022. 6. 18.

 데이터 검증

  >> 데이터 검증은 GET/POST 방식으로 요청이 온데이터를  

  >>  WebDataBinder에서 ①타입변환이 끝난 후에 해당 데이터가 정당한 데이터 인지 확인하는 단계로  ②데이터 검증

        단계를 거친다.

 

지금까지 데이터 검증은 Controller에서 직접 처리하는 방식을 사용했었다.

하지만 이것은 검증이라는 관심사를 분리하여 사용해 보겠다.

 

검증의 종류를 따지자면 많은 검증이 있겠지만 범위로 나눠보자

Controller 안에서 사용하는 검증(Valid) 또는 전 Controller에서사용하는 검증이 있다.

우선 Controller안에서 사용하는 검증에 대해서 알아보자

 

우선 검증(Valid) 관심사를 분리하기 위하여 검증을 위한 클래스를 생성해 준다.

검증을 위한 클래스는Validator interface를 상속하며,

① supports(Class<?> clazz)

   >> clazz 가 검증이 가능한지 여부를 확인하는 메서드이다.

   >> 아래에서는 User 클래스 또는 그 자손들인지 여부를 확인하고 있다.

② validate(Object target, Errors errors) 를 구현한다.

   >> target은 검증하려는 대상으로 Object이므로 검증하고자하는 type으로 형변환을 해준다.

   >> 검증하고자 하는 필드를 가지고 검증을 하는데 이때  

 Error 클래스의 reject 매서드를 통해서 error에 저장을 해준다.

>> 추가적으로  ValidationUtils 의 rejectIfEmptyOrWhitespace 의경우는 

      값이 null 이거나 공백일경우에 저장하는 것으로   errors 참조변수에, "해당 필드" "에러코드값" 

      적시된 필드에 적시된 에러코드값을 저장한다.

 

이렇게 작성한 검증클래스를 사용하기 위해서는 해당 컨트롤러로 돌아가서

1. 수동방법

2. 자동방법

두가지 방법으로 사용할 수 있따.

 

 

1) 수동방법으론 직접 클래스를 생성하여 해당 메서드를 호출하는 방식이다.

 >> BindingResult result    << validate(String field, Error error) 이므로 Error의 자손이므로 해당 매개변수로 들어갈 수 있다

 따라서 해당 UserValidator에서 validate()에 의한 errors의 값은 result 를 통해서 확인할 수 있다.

2) 자동방법으론

@InitBinder에서 valid를 지정하여 주는 방법이다.

@InitBinder 애너테이션이 붙은 매서드에서

생성한 UserValidator() 클래스를 setValidator를 통해서 지정해주고

검증할 User 객체에 @Valid 어노테이션을 붙여준다.

그러면 해당 URL 요청이 발생하면 자동으로 User 객체에 대한 검증이 실시되고 해당 결과는 result로 들어가게 되어 

에러 발생시에 registerForm으로 돌아가게 할 수 있다.

 

현재 까지 방법은 Local Controller에 대한 방법이였고 

모든 Controller에 대한 검증 방법을 설명해 드리겠다.

동일하게 글로벌로 설정할 검증 클래스를 생성한후에 Controller에 설정해 주는게 아닌 Servlet-context.xml 에서 지정해줘야 한다.

 >> 글로벌 검증 클래스를 Bean 등록하여 준다음

 >> annotation-driven을 통해서 validator로 지정하여 준다.

 >> 등록된 Valid는 binder.getValidators()를 통해서 List<Validator> 를통해서 확인할 수 있다.

 만약에 Controller에 Local Validator()가   setValidator() 를 통해서 설정되어 있다면 해당 컨트롤러에서는

GlobalValidator()가 아닌 Local Validator()만 지정이 되어 진다.

 

 

>> 만약에 GlobalValidator()가 지정되어 있는 상태에서 따로 Local Validator()를 지정할떄는 

setValidator() 가 아닌 addValidator()를 통해서 설정해준다.

 

 

이렇게 검증을 할 Valid 를 지정해 주고 해당 URL로 요청을 보내보면 위에서 지정한 에러가 표시되는 것을 확인할 수 있다.

현재 pwd 에는 required 가 나타나는것을 확인 할 수 있고, id 에서는  invalidLength가 나타나는것을 확인 할 수 있다

 

하지만 사용자가 해당 에러를 확인하려면 Console이 아닌 브라우저에 띄워야 하는데 해당 방법으로는

 >> Valid에서 지정한 필드에대한 에러코드값에 맞는 에러 내용을 properties 파일을 만들어서 저장해주고

 >> MassageSource 라는 인터페이스를 구현한 ResourceBundleMessageSource를 Bean으로 등록하여 사용한다.

   --- MassageSource는 브라우저에 message를 나타내기 위한 메서드를 제공하는 인터페이스이다.

 

>>error_message.properties             -- 해당 파일의 경로는 src/main/resources/error_message.properties 이하이다.

>> servlet-context.xml

 --- 위에서 생성한 properties 파일을 value값으로 넣어주었다.

 

 

마지막 작업으로 해당 내용을 Browswer에 표시하기 위해서는

JSP 페이지에 taglib를 추가하고  해당 추가한 태그 라이브러리를 사용해야 한다.

>> form 태그 라이브러리를 추가하고

>> 해당 URL 요청에 대한 form을 <form:form modelAttribute="user"> 를 사용한다.

>> 에러내용을 확인하기 위해서는 <form:errors path="id"> 를 사용한다 이때 path는 의 값은 필드값을 나타낸다 id 필드

 -- 이내용은 user 객체에 대한 UserValide 클래스의 검증 

해당 요청 내용을 소스 보기로 볼경우 다음과 같이 변경되어 보인다.

 <form:form modelAttribute="user"> 

  >>>    <form id="user" action="/ch2/register/save" method="post">

<form:errors path="id"> 

  >>>           <span id="id.errors">   id의 에러코드값과 동일한 properties에서 지정한 내용이 출력된다.  </span>

 

 

추가적으로 {1} ~ {2} 의 의미는

>> rejectValue 에서 지정한 Object[] 인자값들을 의미하고,  맨마지막 null의 경우는 defaultMessage를 나타내나 현재는

null값으로 지정해 줬다.'

 

 

'dev > Spring' 카테고리의 다른 글

[Spring] Export / Import  (0) 2022.06.20
[Spring] form:form 태그 공부  (0) 2022.06.19
[Spring] 데이터 변환  (0) 2022.06.18
[Spring] Spring MVC vs RESTful  (0) 2022.06.16
[Spring] 예외처리2  (0) 2022.06.14