이전 글로 Validation 오류를 담는 객체인 BindingResult 객체에 대한 사용을 알아보았습니다.
Validation 검증 - BindingResult 사용
BindingResult 사용 BindingResult가 사용되는 위치 FieldError ObjectError BindingResult에 검증 오류를 담는 3가지 방법 을 다룹니다. BindingResult가 사용되는 위치 BindingResult는 @ModelAttribute의 객체 다음에 와야 합
hhhhicode.tistory.com
이번 글로 사용자의 입력을 보존하는 방법과 오류 메시지를 남기는 방법을 알아보겠습니다.
사용자 입력 보존과 오류 메시지 남기기
- 스프링에서 Type 오류가 아닌 Validation 오류 발생 시 사용자 입력 값 유지
- 바인딩 오류 FieldError 처리
를 다룹니다.
Type 오류가 발생하면 해당 필드는 바인딩되지 못하고 결과적으로 Validation 또한 적용되지 못합니다.
그렇기 때문에
1. 타입 오류가 아닌 Validation 오류 발생
2. 바인딩 오류 FieldError 처리
로 나뉘어 집니다.
스프링에서 타입 오류가 아닌 Validation 오류 발생 시 사용자 입력 값 유지.
FieldError
이전 글에서 FieldError의 생성자를 보았습니다.
해당 FieldError의 생성자를 보시면, 사용자가 입력한 값(거절된 값, rejectedValue)과 메시지(defaultMessage)
BindingResult는 addError(ObjectError error) 메서드를 통해 Validation 오류를 담습니다.
파라미터의 ObjectError는 FieldError를 상속하고 있고요.
그렇기 때문에
new FieldErorr("user", "userName", user.getUserName(), false, null, null, "이름은 한글만 허용합니다.")
를 통해 직접 FieldError 객체를 생성하여 BindingResult에 addError 해주면 됩니다.
바인딩 오류 FieldError 처리
FieldError
파라미터에 BindingResult를 사용하라고 명시되어 있으면
바인딩 오류 시 스프링은 FieldError를 사용합니다.
물론 바인딩이 되지 않았기 때문에 Validation은 적용되지 않겠지만요.
스프링이 FieldError를 사용하지 않는 경우와 사용하는 경우를 알아봅시다.
스프링이 FieldError를 사용하지 않는다면...
사용자의 입력 데이터가
Controller의 @ModelAttribute에 바인딩되는 시점에 오류가 발생하면
Model 객체에 사용자 입력 값을 유지하기가 힘듭니다.
애초에 사용자 입력 값을 담을 수 없어서 오류가 발생한 거기도 하니 당연합니다.
예를 들면
나이에 숫자가 아닌 문자가 입력된다면
Integer에 String을 보관할 수 있는 방법이 없습니다.
그래서 오류가 발생하는 경우
사용자 입력 값을 보관하는 별도의 방법이 필요합니다.
그리고 그 값을 다시 출력해주면 됩니다.
그렇기 때문에 FieldError는
오류 발생 시 사용자 입력 값을 저장하는 기능을 제공합니다.
스프링이 FieldError를 사용한다면...
FieldError의 생성자를 다시 한번 보겠습니다.
바인딩에 실패하였지만 우리는 사용자에게 이전에 잘못 적었던 값을 보여주어야 합니다.
그러기 위해 rejectedValue 파라미터의 자료형은, 모든 객체의 부모인 Object로 되어있습니다.
Object rejectedValue 파라미터로 사용자가 입력한 값(거절된 값)을 받아서 저장합니다.
bindingFailure은 타입 오류같이 바인딩 실패인지 여부를 설정하는 파라미터입니다.
처리 순서
타입 오류로 바인딩에 실패하게 되면
스프링은 FieldError를 생성하면서 rejectedValue에 사용자가 입력한 값을 인자로 넣어줍니다.
그리고 생성한 FieldError를 BindingResult에 담아서
HTTP Request가 매칭 된 Controller를 호출하며 인자로 담아줍니다.
물론 이 Controller에는 BindingResult를 사용한다고 파라미터에 명시되어 있습니다.
따라서 타입 오류 같은 바인딩 실패에도 (우리가 원하는 객체에 사용자 입력값을 바인딩하지 못할 때에도)
Controller는 정상 호출되고,
오류 메시지를 출력해줄 수 있으며,
사용자가 입력한 값을 그대로 정상 출력할 수 있습니다.
조금 더 알기 쉽게 표현해보겠습니다.
BindingResult를 사용할 때, 타입 오류 시 Controller가 정상 호출되는 과정
요청
→ Controller 매칭
→ 파라미터 바인딩, 타입 오류로 바인딩 실패
→ 스프링이 FieldError 생성 및 rejectedValue 등 설정
→ 스프링이 FieldError를 BindingResult에 담고 Controller에 주입하며 호출
→ BindingResult가 주입된 Controller가 정상 호출
다음 글로 Validator 이해와 MyValidator 만들기를 알아보겠습니다.
Validation 검증 - Validator 이해와 MyValidator 만들어보기
이전 글로 FieldError를 사용하여, 사용자 입력 보존과 오류 메시지 남기기를 알아보았습니다. Validation 검증 - 사용자 입력 보존과 오류 메시지 남기기 이전 글로 Validation 오류를 담는 객체인 BindingR
hhhhicode.tistory.com
'Spring MVC > Validation' 카테고리의 다른 글
Validation 검증 - Bean Validation의 글로벌 Validation 오류 (2) | 2022.12.08 |
---|---|
Validation 검증 - Bean Validation과 Spring MVC (1) | 2022.12.06 |
Validation 검증 - Bean Validation 이란? (1) | 2022.12.06 |
Validation 검증 - Validator를 사용하는 2가지 방법 (2) | 2022.12.05 |
Validation 검증 - Validator 이해와 MyValidator 만들어보기 (1) | 2022.12.04 |
Validation 검증 - BindingResult 사용 (1) | 2022.12.02 |
Validation 검증 - BindingResult란? (1) | 2022.12.02 |
Validation 검증 - 검증이란? (0) | 2022.12.01 |
댓글