• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    미해결

Validator 분리 2 - 4:25를 듣던 중 궁금한 점이 생겼습니다!

23.07.28 23:25 작성 조회수 291

0

@InitBinder 에 여러 개의 검증이 등록되고 @Validated에 의해 실행될 때 각 검증을 구분하는 것이 Validator의 supports라고 설명하셨는데

그래서 임의로 UserValidator를 추가하고 실행해본 결과 IllegalStateException이 발생하는 것을 확인했습니다.

 

유사한 질문으로 https://www.inflearn.com/questions/811214/initbinder-%EC%A7%88%EB%AC%B8%EC%9E%88%EC%8A%B5%EB%8B%88%EB%8B%A4

또한 확인했습니다.

 

@InitBinder에 모델명을 등록하는 방식, 한 컨트롤러에서 하나의 모델 객체만 사용하는 방식 등 을 사용하게 된다면 결국 Validator의 supports는 다른 타입을 받게되는 경우가 없는 것 같은데 어떤 경우에 사용되는 것 일까요?

 

 

답변 2

·

답변을 작성해보세요.

3

안녕하세요. 석현님

강의에서 제가 설명을 명확하게 하지 못했네요.

validator를 글로벌로 설정하는 경우에는 여러 모델을 검증해야 하기 때문에 구분을 합니다. 이 경우 supports가 참을 반환하는 경우에만 검증합니다.

그런데 지금처럼 컨트롤러에 직접 @InitBinder를 사용하는 경우에는 보통 컨트롤러당 검증 대상이 명확합니다. 따라서 이런 경우에는 검증 모델이 맞지 않으면 개발자가 잘못된 검증기를 실수로 등록했다고 가정하고 예외를 발생하도록 되어 있습니다. (참고로 이것은 제 추정입니다.)

정리하면 글로벌 설정의 경우에는 구분을 하고, 컨트롤러에 직접 검증기를 설정하는 경우에는 명확하게 등록해주어야 합니다.

추가로 하나의 컨트롤러에서 여러 검증기를 사용하려면 다음을 참고해주세요.

https://www.inflearn.com/questions/280541

감사합니다.

이석현님의 프로필

이석현

질문자

2023.08.02

상세한 답변 감사드립니다!

영한님 덕분에 스프링 공부에 많은 도움이 되고 있습니다!!

0

인프런 AI 인턴님의 프로필

인프런 AI 인턴

2023.07.30

안녕하세요, 인프런 AI 인턴이에요.

@InitBinder 어노테이션은 스프링 MVC의 컨트롤러에서 요청 파라미터를 바인딩하기 전에 수행되는 메소드를 지정할 때 사용됩니다. supports 메소드는 Validator가 어떤 타입의 객체를 검증할 수 있는지를 판별하는 역할을 합니다. 따라서 supports 메소드의 리턴 값은 검증할 객체의 클래스 타입과 동일한 타입인지 확인하도록 구현해야 합니다.

UserValidator를 추가하고 IllegalStateException이 발생하는 이유는, supports 메소드에서 User 객체의 타입만을 받을 수 있도록 구현되어 있기 때문입니다. 그래서 User 객체가 아닌 다른 타입을 검증하려고 하면 IllegalStateException이 발생하게 됩니다.

보통 한 컨트롤러에서는 여러개의 모델 객체를 사용하는 경우가 많기 때문에 supports 메소드가 필요합니다. supports 메소드는 각 객체의 타입을 구분하여 해당 객체에 맞는 Validator를 호출하도록 도와줍니다. 그래서 요청 파라미터로 넘어온 모델 객체 중 어떤 객체의 Validator를 실행할지 판별하는 역할을 합니다.

따라서 한 컨트롤러에서 하나의 모델 객체만 사용한다고 해도 supports 메소드는 그 객체의 타입을 판별하기 위해 사용될 수 있습니다. 또한, 여러 개의 검증을 등록하는 경우 supports 메소드는 각 검증에 대해 해당 객체를 검증할 수 있는지를 확인하는 역할을 수행합니다.

정리하자면, supports 메소드는 Validator가 어떤 객체를 검증할 수 있는지를 판별하는 역할을 하며, @InitBinder 어노테이션을 사용할 때 여러 개의 검증을 등록하거나 한 컨트롤러에서 하나의 모델 객체를 사용하는 경우에 유용하게 사용될 수 있습니다.

다른 궁금한 점이 있으시면 언제든지 물어보세요!