Ch13 유효성검사
13.1 유효성 검사의 개요
13.2 JSR-380을 통한 유효성 검사
13.3 사용자 정의 애너테이션을 통한 유효성 검사
13.4 Validator 인터페이스를 통한 유효성 검사
13.3 사용자 정의 애너테이션을 통한 유효성 검사
13.3.1 사용자 정의 애너테이션 생성
형식
@Constraint(validatedBy=유효성검사클래스.class)
@Target(속성)
@Retention(속성)
@Documented
public @interface 사용자정의이너테이션명 {
String message() default "출력할 오류 메시지";
Class<?>[] groups() default {};
Class<?>[] payload() default {};
}
사용자 정의 애너테이션의 필수 속성
message: 오류 발생시 반환되는 기본 메시지
groups: 특정 유효성 검사를 그룹으로 설정
payload: 사용자가 추가한 정보 전달
@Retention: 애너테이션 지속시간 설정
속성 | 설명 |
Source | 소스 코드까지만 유지(컴파일시 사라짐) |
Class | 컴파일한 .class 파일에 유지 런타임시 클래스를 메모리로 읽어오면 사라짐 |
Runtime | 런타임을 할 때도 .class 파일에 유지 사용자 정의 애너테이션을 만들 때 주로 사용 |
@Target: 애너테이션을 사용할 곳 지정
속성 | 애너테이션 적용 장소 |
TYPE | class, interface, enum |
FIELD | 클래스의 멤버 변수 |
METHOD | 메서드 |
PARAMETER | 메서드 인자 |
CONSTRUCTOR | 생성자 |
LOCAL_VARIABLE | 로컬 변수 |
ANNOTATION_TYPE | 애너테이션 타입에만 적용 |
PACKAGE | 패키지 |
TYPE_PARAMETER | 제네릭 타입 변수(MyClass<T>) |
TYPE_USE | 어떤 타입에도 적용 |
13.3.2 ConstraintValidator 인터페이스의 구현체 생성
인터페이스의 메서드
유형 | 설명 |
void initialize(A constraintAnnotation) | 사용자 정의 애너테이션과 관련 정보를 읽어 초기화 |
boolean isValid(T value, constraintValidatorContext context) | 유효성 검사 로직 수행 value: 유효성 검사를 위한 도메인 클래스의 변수 값 context: 제약 사항을 평가하는 컨텍스트 |
initialize()에서는 파라미터로 받은 값이 isValid에서 사용 가능한지 확인한다.
isValid에서는 데이터가 기준을 충족하면 false를 반환하고, 충족하지 못하면 false를 반환한다.
public class MemberIdValidator implements ConstrainValidator<MemberId, String>{
private Member member;
public void initialize(MemberId constraintAnnotation){
}
public boolean isValid(String value, ConstraintValidatorContext context){
if(value.equals("admin")){
return false;
}
return true;
}
}
13.4 Validator 인터페이스를 통한 유효성 검사
1)스프링의 기본 Validator 인터페이스의 구현체를 만들어 유효성 검사(도메인 클래스에 애너테이션 선언 x)
2)스프링의 Validator 인터페이스와 JSR-380 Bean Validator를 연동
1) 스프링의 기본 Validator 인터페이스의 구현체를 만들어 유효성 검사(도메인 클래스에 애너테이션 선언 x)
(1)구현 필요 메서드
Validator 인터페이스 메서드 | 설명 |
boolean supports(Class<?> clazz) | 주어진 객체(class)에 유효성 검사를 할 수 있는지 검사 |
void validate(Object target, Errors errors) | 주어진 객체(target)에 유효성 검사 수행, 오류 발생시 주어진 Errors 객체에 오류 관련 정보 저장 |
(2)Errors 객체의 주요 메서드
Errors 객체 메서드 | 설명 |
boid rejectValue(String field, String errorCode, String defaultMessage) | 설정된 field(변수)에서 유효성 검사 오류 발생시 설정된 errorCode와 함께 거부 |
void reject(String errorCode, String defaultMessage) | 유효성 검사 오류 발생시 설정된 errorCode를 사용하여 객체 전체 거부 |
Validator 인터페이스 구현체 생성 예
①도메인 클래스
public class Person{
private String name;
private String age;
private String email;
//getter/setter
}
②Validator 구현체
@Component
public class PersonValidator implements Validator{
public boolean supports(Class<?> clazz){
return Person.class.isAssignableFrom(clazz);
}
public void validate(Object target, Errors errors){
Person person = (Person) target;
String name = person.getName();
if(name == null || name.trim().isEmpty()){
errors.rejectValue("name", "name.not.empty");
}
String age = person.getAge();
if(age == null || age.trim().isEmpty()){
errors.rejectValue("age", "age.not.inrange");
}
String age = person.getEmail();
if(age == null || email.trim().isEmpty()){
errors.rejectValue("email", "email.not.correct");
}
}
}
○@InitBinder를 선언한 메서드 추가
@Valid: 매개변수에 선언, 컨트롤러의 메서드 안에 바인딩되는 데이터의 유효성 검사
@InitBinder: 선언된 메서드에 Validator를 미리 등록하면 해당 컨트롤러의 모든 메서드에서 유효성 검사 기능 사용 가능
@Controller
@RequestMapping("/exam03")
public class Example03Controller{
@Autowired
private PersonValidator personValidator;
@GetMapping
public String showForm(Model model){
model.addAttribute("person", new Person());
return "webpage13_03";
}
@PostMapping
public String submit(@Valid @ModelAttribute Person person, BindingResult result){
if(result.hasErrors()){
return "webpage13_03";
}
return "webpage13_result";
}
@InitBinder
protected void initBinder(){
}
}
2)스프링의 Validator 인터페이스와 JSR-380 Bean Validator를 연동
'정리노트' 카테고리의 다른 글
[스프링]스프링 웹 플로우 (0) | 2024.01.31 |
---|---|
REST API (0) | 2024.01.30 |
[스프링] 유효성 검사② (0) | 2024.01.26 |
[스프링]로그②, 다국어 처리 (0) | 2024.01.25 |
[스프링] 로그 (0) | 2024.01.24 |