정리노트

[스프링]유효성 검사③

망고고래 2024. 1. 30. 08:56

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