작성
·
367
0
@InitBinder 에 여러 개의 검증이 등록되고 @Validated에 의해 실행될 때 각 검증을 구분하는 것이 Validator의 supports라고 설명하셨는데
그래서 임의로 UserValidator를 추가하고 실행해본 결과 IllegalStateException이 발생하는 것을 확인했습니다.
또한 확인했습니다.
@InitBinder에 모델명을 등록하는 방식, 한 컨트롤러에서 하나의 모델 객체만 사용하는 방식 등 을 사용하게 된다면 결국 Validator의 supports는 다른 타입을 받게되는 경우가 없는 것 같은데 어떤 경우에 사용되는 것 일까요?
답변 2
3
안녕하세요. 석현님
강의에서 제가 설명을 명확하게 하지 못했네요.
validator를 글로벌로 설정하는 경우에는 여러 모델을 검증해야 하기 때문에 구분을 합니다. 이 경우 supports가 참을 반환하는 경우에만 검증합니다.
그런데 지금처럼 컨트롤러에 직접 @InitBinder를 사용하는 경우에는 보통 컨트롤러당 검증 대상이 명확합니다. 따라서 이런 경우에는 검증 모델이 맞지 않으면 개발자가 잘못된 검증기를 실수로 등록했다고 가정하고 예외를 발생하도록 되어 있습니다. (참고로 이것은 제 추정입니다.)
정리하면 글로벌 설정의 경우에는 구분을 하고, 컨트롤러에 직접 검증기를 설정하는 경우에는 명확하게 등록해주어야 합니다.
추가로 하나의 컨트롤러에서 여러 검증기를 사용하려면 다음을 참고해주세요.
https://www.inflearn.com/questions/280541
감사합니다.
0
안녕하세요, 인프런 AI 인턴이에요.
@InitBinder 어노테이션은 스프링 MVC의 컨트롤러에서 요청 파라미터를 바인딩하기 전에 수행되는 메소드를 지정할 때 사용됩니다. supports 메소드는 Validator가 어떤 타입의 객체를 검증할 수 있는지를 판별하는 역할을 합니다. 따라서 supports 메소드의 리턴 값은 검증할 객체의 클래스 타입과 동일한 타입인지 확인하도록 구현해야 합니다.
UserValidator를 추가하고 IllegalStateException이 발생하는 이유는, supports 메소드에서 User 객체의 타입만을 받을 수 있도록 구현되어 있기 때문입니다. 그래서 User 객체가 아닌 다른 타입을 검증하려고 하면 IllegalStateException이 발생하게 됩니다.
보통 한 컨트롤러에서는 여러개의 모델 객체를 사용하는 경우가 많기 때문에 supports 메소드가 필요합니다. supports 메소드는 각 객체의 타입을 구분하여 해당 객체에 맞는 Validator를 호출하도록 도와줍니다. 그래서 요청 파라미터로 넘어온 모델 객체 중 어떤 객체의 Validator를 실행할지 판별하는 역할을 합니다.
따라서 한 컨트롤러에서 하나의 모델 객체만 사용한다고 해도 supports 메소드는 그 객체의 타입을 판별하기 위해 사용될 수 있습니다. 또한, 여러 개의 검증을 등록하는 경우 supports 메소드는 각 검증에 대해 해당 객체를 검증할 수 있는지를 확인하는 역할을 수행합니다.
정리하자면, supports 메소드는 Validator가 어떤 객체를 검증할 수 있는지를 판별하는 역할을 하며, @InitBinder 어노테이션을 사용할 때 여러 개의 검증을 등록하거나 한 컨트롤러에서 하나의 모델 객체를 사용하는 경우에 유용하게 사용될 수 있습니다.
다른 궁금한 점이 있으시면 언제든지 물어보세요!
상세한 답변 감사드립니다!
영한님 덕분에 스프링 공부에 많은 도움이 되고 있습니다!!