스프링부트는 spring-boot-starter-validation 라이브러리를 넣으면 자동으로 bean validator를 인지하고 스프링에 통합
검증 로직을 모든 프로젝트에 적용할 수 있게 공통화하고 , 표준화한 것이 Bean Validation
@Validated : 스프링 전용 검증 어노테이션
@Valid: 자바 표준 검증 어노테이션
검증 순서
1. @ModelAttribute 각각의 필드에 타입 변환 시도
1) 성공하면 다음으로
2) 실패하면 typeMismatch 로 FieldError 추가
2. Validator 적용(실제 min , max 등의 검증 기능)
바인딩에 성공한 필드만 Bean Validation을 적용
BeanValidator 는 바인딩에 실패한 필드는 BeanValidation을 적용하지않는다.
itemName` 에 문자 "A" 입력 타입 변환 성공 `itemName` 필드에 BeanValidation 적용
`price` 에 문자 "A" 입력 "A"를 숫자 타입 변환 시도 실패 typeMismatch FieldError 추가 `price` 필
드는 BeanValidation 적용 X
`@ModelAttribute` 는 HTTP 요청 파라미터(URL 쿼리 스트링, POST Form)를 다룰 때 사용한다.
`@RequestBody` 는 HTTP Body의 데이터를 객체로 변환할 때 사용한다. 주로 API JSON 요청을 다룰 때 사용
한다.
@ModelAttribute vs @RequestBody
HTTP 요청 파리미터를 처리하는 `@ModelAttribute` 는 각각의 필드 단위로 세밀하게 적용된다. 그래서 특정 필드
에 타입이 맞지 않는 오류가 발생해도 나머지 필드는 정상 처리할 수 있었다.
`HttpMessageConverter` 는 `@ModelAttribute` 와 다르게 각각의 필드 단위로 적용되는 것이 아니라, 전체 객체
단위로 적용된다.
따라서 메시지 컨버터의 작동이 성공해서 `ItemSaveForm` 객체를 만들어야 `@Valid` , `@Validated` 가 적용된다.
`@ModelAttribute` 는 필드 단위로 정교하게 바인딩이 적용된다. 특정 필드가 바인딩 되지 않아도 나머지 필드
는 정상 바인딩 되고, Validator를 사용한 검증도 적용할 수 있다.
`@RequestBody` 는 HttpMessageConverter 단계에서 JSON 데이터를 객체로 변경하지 못하면 이후 단계 자
체가 진행되지 않고 예외가 발생한다. 컨트롤러도 호출되지 않고, Validator도 적용할 수 없다.
스프링 MVC는 컨트롤러(핸들러) 밖으로 예외가 던져진 경우 예외를 해결하고, 동작을 새로 정의할 수 있는 방법을 제
공한다. 컨트롤러 밖으로 던져진 예외를 해결하고, 동작 방식을 변경하고 싶으면
사용하면 된다. 줄여서 ExceptionResolver라 한다.
ExceptionResolver 를 사용하면 컨트롤러에서 예외가 발생해도 ExceptionResolver
에서 예외를 처리해버린
따라서 예외가 발생해도 서블릿 컨테이너까지 예외가 전달되지 않고, 스프링 MVC에서 예외 처리는 끝이 난다.
결과적으로 WAS 입장에서는 정상 처리가 된 것이다. 이렇게 예외를 이곳에서 모두 처리할 수 있다는 것이 핵심이다.
서블릿 컨테이너까지 예외가 올라가면 복잡하고 지저분하게 추가 프로세스가 실행된다. 반면에 ExceptionResolver를 직접 사용하면 예외처리가 상당히 깔끔해진다.
참고
스프링 MVC 2편 - 백엔드 웹 개발 활용 기술 강의 | 김영한 - 인프런
김영한 | , 원리를 알아야 핵심이 보인다!김영한의 스프링 MVC 활용편 👨💻 📌 수강 전 확인해주세요! 본 강의는 자바 스프링 완전 정복 시리즈의 다섯 번째 강의입니다. 우아한형제들 최연소
www.inflearn.com
'Spring' 카테고리의 다른 글
| @Transactional(readOnly=true) 를 쓰는 이유 (0) | 2024.09.20 |
|---|---|
| [Spring] 웹 개발 방법 3가지(정적컨텐츠, MVC, API) (0) | 2023.12.24 |
| [JPA] JPA, ORM, Spring Data JPA (0) | 2023.12.15 |
| [Spring] @Transactional 이해하기 (0) | 2023.12.14 |
| [Spring] @Valid, @Validated로 유효성 검증하기 (0) | 2023.12.13 |