희디비
[Spring] 빈 검증 ( Bean Validation ) 본문
💡 빈 검증 ( Bean Vaildation )
Validator를 등록하여 검증 하는 방식은 따로 클래스를 만들고 등록 하는 과정이 필요합니다.
이 과정을 없애기 위해 스프링부트는 글로벌 Validator를 등록 합니다.
그러므로 따로 Validator를 등록 할 필요가 없습니다.
또한 코드를 통해 검증 하는 방식을 빈 어노테이션을 통해 검증 하여 검증 코드를 작성 하지 않고,
빈 어노에티션을 통해 검증 할 수 있습니다.
🙄 빈 검증 기능을 어떻게 사용하나요?
검증 하고자 하는 객체에 원하는 검증 어노테이션을 붙이고,
컨트롤러에서 검증 객체 앞에 @Valid or @Validated 어노테이션을 붙이면 됩니다.
그러면 해당 객체의 어노테이션을 통해 검증을 하게 됩니다.
빈 검증 단계는 다음과 같습니다.
1. @ModelAttribute 를 통해 Item 객체 필드에 바인딩을 합니다.
2. 바인딩에 성공한 필드만 @Validation 검증을 합니다.
3. 검증에 실패 한다면 BindingResult에 error가 담기게 됩니다.
🙄 BindingResult 값이 어떻게 담기나요?
codes를 보면 messageCodesResolver가 동작 한 것을 알 수 있습니다.
그레서 message를 바꾸고 싶다면 메시지 기능을 사용 하여 바꿀 수 있습니다.
🙄 ObjectError 는 어떻게 검증 하나요?
@ScriptAssert를 사용해 글로벌 에러를 검증 할 수 있습니다.
하지만 글로벌 에러는 현재 객체 뿐만 아니라 다른 객체의 값, 혹은 DB 조회등 복잡한 방식을 사용 할 수 있기 때문에
@ScriptAssert 보단 BindingResult.reject를 사용 하는 것을 권장 합니다.
💥 등록과 수정을 다르게 검증 하고 싶어요.
groups 라는 기능을 지원 하는데, 인터페이스를 만들고 검증을 원하는 필드에 groups를 지정 하면 됩니다.
@Validated(검증인터페이스.class)를 지정 하면 해당 그룹이 지정된 필드만 검증 어노테이션만 동작 하게 됩니다.
하지만 이러한 방식은 도메인 객체를 보기 힘들게 만들고,
객체의 등록과 수정에 사용 되는 필드는 보통 같지 않기 때문에 추천 되지 않습니다.
💥 등록과 수정 객체를 나누기
등록 객체를 따로 분리 함으로써 객체의 검증이 뚜렷하고 등록 할 때 어떤 필드를 사용 하는지 보이게 됩니다.
💥 HTTP 메시지 컨버터
API를 받을땐 @RequestBody를 사용 하게 되는데 이때 @Validated를 사용 하면 문제가 있습니다.
@ModelAttribute는 하나의 필드씩 접근하여 값을 매핑 하는데,
@RequestBody는 한번에 매핑을 시도 합니다.
int price에 String 값이 들어 오지 못하고 오류를 내고 컨트롤러가 호출 되지 못합니다.
그레서 defaultExceptionresolver가 에러 메시지를 보여 준 것 입니다.
예외처리에 대한 것은 다음 글에서 알아 보겠습니다.
위 글은 영한님의 mvc2를 보고 작성 하였습니다.
https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-mvc-2/dashboard
'Spring' 카테고리의 다른 글
[Spring] @ExceptionHandler API 에러 핸들링 (3) | 2024.09.06 |
---|---|
[Spring] 필터, 인터셉터 (Interceptor) (0) | 2024.09.05 |
[Spring] 쿠키, 세션 (Cookie, Session) (0) | 2024.09.04 |
[Spring] 메시지, 검증 (Validation) (4) | 2024.09.02 |
[Spring] 싱글톤 컨테이너 (0) | 2024.05.01 |