보통 검증에 대표적인 예로 로그인과 회원가입을 예로 들 수 있다.
특정 필드의 타입 오류
특정 필드의 공백
특정 필드의 범위 오류
EX ) 상품의 수량은 5개 이상, 최소 주문금액은 10,000원 이상 등
이 외에도 개발하고자 하는 애플리케이션에 맞는 검증을 확인해야 한다.
이러한 검증 비즈니스 로직은 컨트롤러의 역할 중 하나이다.
클라이언트 검증, 서버 검증
- 클라이언트에서의 검증은 보안에 취약
- 서버에서만의 검증은 고객 사용성의 부족
〓 둘이 적절히 섞은 검증을 사용하여, 최종적으로 서버 검증은 필수
검증하고자 하는 부분에서 오류가 발생하였을 경우에 오류 정보를 저장해야 한다.
그렇다면 오류 정보를 어떻게 관리하고, 처리할까? 바로 스프링에서 제공하는 BindingResult
!
BindingResult
는 스프링이 제공하여 검증 오류를 보관하는 객체로, @ModelAttribute
에 데이터 바인딩할 때 오류가 발생해도 컨트롤러는 호출된다.
BindingResult
에 검증 오류를 적용하는 방법
타겟 객체에 바인딩이 실패 시, 스프링이 FieldError
생성해서 BindingResult
에 넣음
개발자가 직접 정의하여 사용
Validator
사용
BindingResult
가 제공하는 rejectValue()
, reject()
메소드를 알아보자.
1) rejectValue()
:
void rejectValue(@Nullable String field, String errorCode,
@Nullable Object[] errorArgs, @Nullable String defaultMessage);
field
: 오류 필드명errorCode
: 오류 코드( messageResolver
오류 코드 )errorArgs
: 오류 메시지에서 {0}을 치환하기 위한 값defaultMessage
: 오류 메시지를 찾을 수 없을 때 사용하는 기본 메시지2) reject()
:
void reject(String errorCode, @Nullable Object[] errorArgs,
@Nullable String defaultMessage)
위 메서드를 활용하면 FieldError
, ObjectError
를 직접 생성하지 않고도 검증 오류를 다룰 수 있게 된다.
BindingResult br
파라미터 위치는@ModelAttribute A a
다음에 와야 한다.
스프링의 경우, MessageCodesResolver
기능을 제공한다. 이 기능은 rejectValue()
, reject()
메서드 내부에서 메시지 활용을 위해 사용되는 기능으로 다음과 같은 규칙으로 메시지를 관리할 수 있다.
1 : code
+ "." + object name
2 : code
1 : code
+ "." + object name
+ "." + field
2 : code
+ "." + field
3 : code
+ "." + field type
4 : code
범용성 있는 메시지 - 우선순위가 낮은 메시지
중요한 메시지 - 우선순위가 높은 메시지
rejectValue()
/ reject()
호출
MessageCodesResolver
를 사용해서 검증 오류 코드로 메시지 코드들을 생성
new FieldError()
/ new ObjectError()
를 생성하면서 메시지 코드들을 보관
th:erros
에서 메시지 코드들로 메시지를 순서대로 메시지에서 찾고, 노출
📌 본 포스트는 스프링 MVC 2편 - 백엔드 웹 개발 핵심 기술 통해 학습한 내용을 요약 및 정리한 것입니다.