@InitBinder 애노테이션
- 컨트롤러 범위 Validator 설정 가능
package controller;
import javax.validation.Valid;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.Errors;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.InitBinder;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import spring.DuplicateMemberException;
import spring.MemberRegisterService;
import spring.RegisterRequest;
@Controller
public class RegisterController {
private MemberRegisterService memberRegisterService;
public void setMemberRegisterService(MemberRegisterService memberRegisterService) {
this.memberRegisterService = memberRegisterService;
}
...
@PostMapping("/register/step3")
public String handleStep3(@Valid RegisterRequest regReq, Errors errors) {
if (errors.hasErrors()) {
return "register/step2";
}
try {
memberRegisterService.reigst(regReq);
return "register/step3";
} catch (DuplicateMemberException ex) {
//이메일 중복 익셉션 발생 시, "email" 프로퍼티 에러코드 "duplicate" 추가
errors.rejectValue("email", "duplicate");
return "register/step2";
}
}
@InitBinder
protected void initBinder(WebDataBinder binder) {
binder.setValidator(new RegisterRequestValidator());
}
}
handleStep3() 메소드에서 커맨드 객체 파라미터에 @Valid 애노테이션 적용
Validator 객체의 validate() 메서드를 호출하는 코드가 없다(글로벌과 마찬가지로)
initBinder()메서드가 결정
- @InitBinder 어노테이션을 적용한 메서드는 WebDataBinder 타입 파라미터를 갖는데 WebDataBinder#setValidator()메서드를 이용해 컨트롤러 범위에 적용할 Validator를 설정할 수 있다.
RegisterRequest 타입을 지원하는 RegisterRequestValidator를 컨트롤러 범위 Validator로 설정
@Valid 애노테이션을 적용한 ReigsteRequest를 검증할 때 해당 Validator를 사용
@InitBinder를 적용한 메서드의 동작
- 컨트롤러의 요청 처리 메서드를 실행하기 전에 매번 실행
RegisterController 컨트롤러 요청 처리 메서드인 handleStep1(), .. handleStep3()을 실행하기 전
initBinder()메서드를 매번 호출하여 WebDataBinder를 초기화
글로벌 범위 Validator와 컨트롤러 범위 Validator의 우선순위
- @InitBinder 애노테이션을 적용한 메서드에 전달되는 WebDatabinder는 내부적으로 Validator 목록을 가짐
- 이 목록에는 글로벌 범위 Validator 기본으로 포함
setValidator()
WebDataBinder#setValidator(Validator validator) 메서드를 실행하면 WebDataBinder가 갖고 있는 Validator를 목록에서 삭제 후 파라미터로 전달받은 Validator 목록에 추가
setValidator() : 글로벌 범위 Validator 대신 컨트롤러 범위 Validator 사용
addValidator()
- 기존 Validator 목록에 새로운 Validator 추가
- 글로벌 범위 Validator가 존재하는 상태에서 addValidator() 메서드 실행 시, 순서상 글로벌 범위 Validator 뒤에 새로 추가한 컨트롤러 범위 Validator 추가
- 이 경우, 글로벌 범위 Validator 를 먼저 적용 후 컨트롤러 범위 Validator 적용
'Spring' 카테고리의 다른 글
[Spring] HttpSession 사용해보기 (0) | 2024.05.20 |
---|---|
[Spring] Bean Validation 검증 (0) | 2024.05.18 |
[Spring] 글로벌 Validator (0) | 2024.05.14 |
[Spring] 커맨드 객체의 에러 메시지 출력하기 (0) | 2024.05.14 |
[Spring] Errors 와 ValidationUtils 클래스의 주요 메서드 (0) | 2024.05.13 |
@InitBinder 애노테이션
- 컨트롤러 범위 Validator 설정 가능
package controller;
import javax.validation.Valid;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.Errors;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.InitBinder;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import spring.DuplicateMemberException;
import spring.MemberRegisterService;
import spring.RegisterRequest;
@Controller
public class RegisterController {
private MemberRegisterService memberRegisterService;
public void setMemberRegisterService(MemberRegisterService memberRegisterService) {
this.memberRegisterService = memberRegisterService;
}
...
@PostMapping("/register/step3")
public String handleStep3(@Valid RegisterRequest regReq, Errors errors) {
if (errors.hasErrors()) {
return "register/step2";
}
try {
memberRegisterService.reigst(regReq);
return "register/step3";
} catch (DuplicateMemberException ex) {
//이메일 중복 익셉션 발생 시, "email" 프로퍼티 에러코드 "duplicate" 추가
errors.rejectValue("email", "duplicate");
return "register/step2";
}
}
@InitBinder
protected void initBinder(WebDataBinder binder) {
binder.setValidator(new RegisterRequestValidator());
}
}
handleStep3() 메소드에서 커맨드 객체 파라미터에 @Valid 애노테이션 적용
Validator 객체의 validate() 메서드를 호출하는 코드가 없다(글로벌과 마찬가지로)
initBinder()메서드가 결정
- @InitBinder 어노테이션을 적용한 메서드는 WebDataBinder 타입 파라미터를 갖는데 WebDataBinder#setValidator()메서드를 이용해 컨트롤러 범위에 적용할 Validator를 설정할 수 있다.
RegisterRequest 타입을 지원하는 RegisterRequestValidator를 컨트롤러 범위 Validator로 설정
@Valid 애노테이션을 적용한 ReigsteRequest를 검증할 때 해당 Validator를 사용
@InitBinder를 적용한 메서드의 동작
- 컨트롤러의 요청 처리 메서드를 실행하기 전에 매번 실행
RegisterController 컨트롤러 요청 처리 메서드인 handleStep1(), .. handleStep3()을 실행하기 전
initBinder()메서드를 매번 호출하여 WebDataBinder를 초기화
글로벌 범위 Validator와 컨트롤러 범위 Validator의 우선순위
- @InitBinder 애노테이션을 적용한 메서드에 전달되는 WebDatabinder는 내부적으로 Validator 목록을 가짐
- 이 목록에는 글로벌 범위 Validator 기본으로 포함
setValidator()
WebDataBinder#setValidator(Validator validator) 메서드를 실행하면 WebDataBinder가 갖고 있는 Validator를 목록에서 삭제 후 파라미터로 전달받은 Validator 목록에 추가
setValidator() : 글로벌 범위 Validator 대신 컨트롤러 범위 Validator 사용
addValidator()
- 기존 Validator 목록에 새로운 Validator 추가
- 글로벌 범위 Validator가 존재하는 상태에서 addValidator() 메서드 실행 시, 순서상 글로벌 범위 Validator 뒤에 새로 추가한 컨트롤러 범위 Validator 추가
- 이 경우, 글로벌 범위 Validator 를 먼저 적용 후 컨트롤러 범위 Validator 적용
'Spring' 카테고리의 다른 글
[Spring] HttpSession 사용해보기 (0) | 2024.05.20 |
---|---|
[Spring] Bean Validation 검증 (0) | 2024.05.18 |
[Spring] 글로벌 Validator (0) | 2024.05.14 |
[Spring] 커맨드 객체의 에러 메시지 출력하기 (0) | 2024.05.14 |
[Spring] Errors 와 ValidationUtils 클래스의 주요 메서드 (0) | 2024.05.13 |