검증 요구사항
타입 검증
>> 가격, 수량에 문자가 들어가면 검증 오류 처리
필드 검증
>> 상품명 : 필수, 공백 x
>> 가격 : 1000원 이상, 1백만원 이하
>> 수량 : 최대 9999
특정 필드의 범위를 넘어서는 검증
>> 가격 * 수량의 합은 10,000원 이상
컨트롤러의 중요한 역할 중 하나
>> HTTP 요청이 정상인지 검증
검증 직접 처리
BindingResult
필드에 오류가 있으면 FieldError 객체 생성해서 bindingResult에 담음
>> objectName : @ModelAttribute 이름, field : 오류 발생 필드 이름, defaultMessage : 오류 기본 메시지
필드를 넘어서는 오류가 있으면 ObjectError 객체를 생성해서 bindingResult에 담음
>> objectName : @ModelAttribute 이름, defaultMessage : 오류 기본 메시지
타임리프 스프링 검증 오류 통합 기능
스프링의 BindingResult를 활용해 편리하게 검증 오류 표현 기능 제공
>> #fields : BindingResult가 제공하는 검증 오류에 접근 가능
>> th:errors : 해당 필드에 오류가 있는 경우 태그 출력, th:if의 편의 버전
>> th:errorclass : th:field에서 지정한 필드에 오류 있으면 class 정보 추가
BindingResult는 스프링이 제공하는 검증 오류를 보관하는 객체
>> @ModelAttribute에 데이터 바인딩 시 오류가 발생해도 컨트롤러 호출됨!
>> 오류 정보(FieldError)를 BindingResult에 담아 컨트롤러 정상 호출
BindingResult에 검증 오류를 적용하는 3가지 방법
>> @ModelAttribute의 객체에 타입 오류 등으로 바인딩이 실패하는 경우 스프링이 FieldError 생성해서 BindingResult에 넣어줌
>> 개발자가 직접 넣어줌
>> Validator 사용
FieldError, ObjectError
사용자 입력 오류 메시지가 화면에 남도록
FieldError 생성자
두 가지 생성자 제공
objectName : 오류가 발생한 객체 이름
field : 오류 필드
rejectedValue : 사용자가 입력한 값(거절된 값)
bindingFailure : 타입 오류 같은 바인딩 실패인지, 검증 실패인지 구분 값
codes : 메시지 코드
arguments : 메시지에서 사용하는 인자
defaultMessage : 기본 오류 메시지
ObjectError도 유사
오류 발생시 사용자 입력 값 유지
FieldError는 오류 발생시 사용자 입력 값을 저장
>> rejectedValue : 오류 발생시 사용자 입력 값 저장 필드
오류 코드와 메시지 처리 1
errors.properties 메시지 파일
codes : required.item.itemName을 사용해 메시지 코드 지정
>> 메시지 코드는 하나가 아니라 배열로 여러 값 전달 가능, 순서대로 매칭해 처음 매칭되는 메시지 사용
arguments : Object[]{1000, 1000000}을 사용해 코드의 {0}, {1}로 치환할 값 전달
오류 코드와 메시지 처리 2
컨트롤러에서 BindingResult는 검증해야할 객체인 target 바로 다음에 옴
>> BindingResult는 이미 본인이 검증해야 할 객체인 target을 알고 있음
rejectValue()
field : 오류 필드명
errorCode : 오류 코드(메시지에 등록된 코드 x, messageResolver를 위한 오류 코드)
errorArgs : 오류 메시지에서 {0}을 치환하기 위한 값
defaultMessage : 오류 메시지를 찾을 수 없을 떄 사용하는 기본 메시지
오류 코드와 메시지 처리 3
단순하게 만들면 범용성이 좋지만 메시지를 세밀히 작성하기 어려움
반대로 자세하게 만들면 범용성이 떨어짐
>> 가장 좋은 방법은 범용성으로 사용하다가 세밀하게 작성해야 하는 경우에 세밀한 내용이 적용되게 단계를 두는 것
MessageCodesResolver
검증 오류 코드로 메시지 코드들 생성
MessageCodesResolver 인터페이스고 DefaultMessageCodesResolver가 기본 구현체
>> 주로 ObjectError, FieldError와 함께 사용
DefaultMessageCodesResolver의 기본 메시지 생성 규칙
객체 오류
1. code + "." + object name
2. code
예) 오류 코드: required, object name: item
1. required.item
2. required
필드 오류
1. code + "." + object name + "." + field
2. code + "." + field
3. code + "." + field type
4. code
예) 오류 코드: typeMismatch, object name "user", field "age", field type: int
1. "typeMismatch.user.age"
2. "typeMismatch.age"
3. "typeMismatch.int"
4. "typeMismatch"
동작 방식
rejectValue(), reject() 내부에서 MessageCodesResolver 사용
>> 메시지 코드들 생성
MessageCodesResolver를 통해 생성된 순서대로 여러 오류 코드들 보관
오류 메시지 출력
타임리프 화면을 렌더링 할 때 th:errors 실행
>> 생성된 오류 메시지 코드를 순서대로 돌아가면서 찾고 없으면 디폴트 메시지 출력
오류 코드와 메시지 처리 4
스프링이 직접 만든 오류 메시지 처리
스프링은 타입 오류가 발생하면 typeMismatch라는 오류 코드 사용
Validator 분리
컨트롤러에서 검증 로직을 별도의 클래스로 역할을 분리
supports() {} : 해당 검증기를 지원하는 여부 확인
validate() : 검증 대상 객체와 BindingResult
WebDataBinder 사용
해당 컨트롤러에서는 검증기를 자동으로 적용 가능
>> @InitBinder : 해당 컨트롤러에만 영향, 글로벌 설정 별도 필요
@Validated 적용
검증 대상 앞에 붙으며 검증기를 실행하라는 애노테이션
WebDataBinder에 등록한 검증기 찾아서 실행
>> 여러 검증기를 등록하면 어떤 검증기를 고를지 구분이 필요
>> 이때 supports() 사용
출처 : 김영한, 스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
'Spring' 카테고리의 다른 글
MVC / 로그인 처리 - 쿠키, 세션 (0) | 2025.04.12 |
---|---|
MVC / Bean Validation (0) | 2025.04.11 |
MVC / 메시지, 국제화 (0) | 2025.04.09 |
MVC / Thymeleaf - 스프링 통합과 폼 (0) | 2025.04.08 |
MVC / Thymeleaf - 기본 기능 (0) | 2025.04.07 |