Spring - 검증 객체와 에러코드
Validator를 직접 구현하여 객체를 수동 생성하여 동작
검증 객체를 커맨드 객체별로 따로 생성합니다.
Vaildator 인터페이스를 구현하는 객체를 생성하는데 supports()메소드는 해당 커맨드 객체를 검증할 수 있는지 없는지 구분하는 메소드입니다. 하지만 수동으로 생성할 경우 개발자가 직접 넣기 때문에 확인이 필요 없습니다.
vaildate()메소드는 커맨드 객체를 검증하는 메소드입니다. 여러개의 객체 검증을 위해 Object 와 에러코드를 담기 위한 Error를 매개변수로 가집니다. Object로 커맨드 객체를 받아와 메소드 내부에서 다운 캐스팅하여 사용합니다. 각 커맨드 객체의 프로퍼티들을 검사하여 올바르지 않다면 error객체의 rejectValue()메소드를 통해 문제있는 프로퍼티와 에러코드를 주어 저장합니다. rejcet()메소드는 객체전체에 문제가 있을때 사용합니다. ValidationUtils를 사용해 간단하게 표현도 가능합니다.
Validator 인터페이스를 구현했으면 요청 처리 메소드에서 커맨드객채와 Error 객체를 매개변수로 줍니다. 반드시 커맨드 객체뒤에 Error객체가 와야하는데 유틸리티 사용때문이고 앞의 파리미터를 보고 어느 커맨드 객체인지 구분할 수 있습니다.
요청 처리 메소드에서 Validator인터페이스를 구현한 객체를 직접 생성하고 커맨드 객체와 error 객체를 매개변수로 주어 valiate()메소드를 수행합니다.
뷰페이지에서 <form:error path="프로퍼티">로 에러 메시지를 줄 수 있습니다. 에러 코드 처리는 메시지 처리와 마찬가지로 MessageSource객체를 이용하기 때문에 리소스에 에러코드에 맞는 메시지를 추가해야합니다.
글로벌 Validator와 컨트롤러 Validator
검증객체를 준비 할 때 글로벌 범위의 검증 객체를 준비할 수 있습니다.
글로벌 범위의 Validator를 설정하기 위해서 두가지 방법이 있습니다.
설정 클래스에 getValidator()메소드가 Validator구현 객체를 리턴하도록 구현합니다.
요청 처리 메소드의 매개변수안의 검증할 객체에 @Valid 어노테이션을 사용하는데 이는 검증 객체가 요청 처리 메소드에서 개발자에 의해 동작 되는것이 아니라 컨테이너가 핸들러 어댑터에게 지시하여 동작 됩니다. 그러면 요청 처리 메소드가 수행되기 전에 자동적으로 검증 객체가 생성되고 수행이 되는데 이때 자동으로 돌아갈 수 있는 검증 객체인지 supports()메소드를 이용해 먼저 체크하여 동작됩니다.
컨트롤러 범위는 각 컨트롤러에서 @InitBinder어노테이션을 사용해 initBind메소드를 만들어 설정합니다.
initBind메소드의 매개변수인 WebDataBinder의 setValidator()메소드를 통해 컨트롤러 범위로 적용할 Validator를 설정할 수 있습니다. WebDataBinder는 내부적으로 Validator 목록을 가지는데 set의 경우 목록을 삭제하고 추가하는 것이므로 이경우에는 글로벌이 아닌 컨트롤러 범위가 수행됩니다. addValidator()는 글로벌 뒤에 추가하므로 글로벌이 수행되고 컨트롤러 를 적용합니다.
Bean Validation
Bean Validation을 사용하기 위해선 API 모듈인 validation-api와 검증 객체를 생성하는 프로바이더인 hibernate-validator를 추가해야합니다.
@Valid 어노테이션으로 작동이 됩니다. provider가 공급되어 개발자가 커맨드 객체 안에 어노테이션들을 기술하면 공장 객체가 해당 어노테이션대로 동작을 수행하는 검증 클래스(공동 클래스)가 자동으로 생성이 되고 검증을 수행합니다.
검증 클래스를 자동으로 생성하기 위해서는 OptionalValidatorFactoryBean 클래스를 Bean 객체로 등록해야합니다. 이 객체는 어노테이션에 맞게 검증해주는 객체를 생성해주는 공장 객체 입니다. 만약 글로벌 범위 Validator()를 설정 했으면 공장 객체가 생성한 Validator를 글로벌 범위로 사용하지 않으므로 getValidaotr()메소드를 삭제해야 합니다.