Spring/스프링 프레임워크 핵심 원리

[Spring] #14. Validation 추상화

sujin7837 2020. 12. 24. 20:23
반응형

Validation 추상화

-Bean Validation: 자바 표준 스펙 중 하나

-Validator: 주로 애플리케이션 MVC에서 사용하지만, 어떤 계층에서도 사용 가능한 인터페이스

두 가지 메소드를 제공합니다

·supports: 검증해야 하는 인스턴스의 클래스가 해당 Validator가 지원 및 검증할 수 있는 클래스인지 확인해줍니다.

·validate: 실질적으로 검증 작업이 일어나는 곳입니다.

 

//Event.java

public class Event {
    Integer id;
    String title;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id=id;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title=title;
    }
}
//EventValidator.java

import org.springframework.validation.Validator;
//Validator를 가져올 때 스프링에 들어있는 것을 가져와야 함

public class EventValidator implements Validator {
    @Override
    public boolean supports(Class<?> clazz) {
        return Event.class equals(clazz);
    }
    //파라미터로 전달되는 타입이 이벤트인지 확인

    @Override
    public void validate(Object target, Errors errors) {
        ValidationUtils.rejectIfEmptyOrWhitespace(errors, field: "title", errorCode: "notempty", defaultMessage: "Empty title is now allowed");
    }
    //ValidationUtils를 사용하지 않고 직접 에러 코드를 담을 수도 있음
//LocalValidatorFactoryBean.java

@Component
public class AppRunner implements ApplicationRunner {
    @Override
    public void run(ApplicationArguments args) throws Exception {
        Event event=new Event();
        EventValidator eventValidator=new EventValidator();
        Errors errors=new BeanPropertyBindingResult(event, objectName: "event");

        eventValidator.validate(event, errors);
        //event객체를 검사하고 errors에 검증 에러를 담아줍니다

        System.out.println("errors", hasErrors());

        errors.getAllErrors().forEach(e -> {
            Sytem.out.println("===error code===");
            Arrays.stream(e.getCodes()).forEach(System.out::println);
            System.out.println(e.getDefaultMessage());
        });
        //errors에서 모든 에러를 가져와서 순차적으로 에러를 순회하며 에러 코드를 찍어봅니다

-스프링 부트를 사용할 경우

·LocalValidatorFactoruyBean 빈으로 자동 등록되어 사용 가능합니다

 

//Event.java

public class Event {
    Integer id;

    @NotEmpty
    String title;

    @NotNull @Min(0) 
    Integer limit;
    
    @Email
    String email;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id=id;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title=title;
    }

    public Integer getLimit() {
        return limit;
    }

    public void setLimit(Integer limit) {
        this.limit=limit;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email=email;
    }
}
//LocalValidatorFactoryBean.java

@Component
public class AppRunner implements ApplicationRunner {
    @Autowired
    Validator validator;

    @Override
    public void run(ApplicationArguments args) throws Exception {
        System.out.println(validator.getClass());

        Event event=new Event();
        event.setLimit(-1);    //최솟값 0보다 작은 값 대입(오류 발생)
        event.setEmail("aaa2");    //이메일 형식이 아닌 값 대입(오류 발생)
        Errors errors=new BeanPropertyBindingResult(event, objectName: "event");

        Validator.validate(event, errors);

        System.out.println("errors", hasErrors());

        errors.getAllErrors().forEach(e -> {
            Sytem.out.println("===error code===");
            Arrays.stream(e.getCodes()).forEach(System.out::println);
            System.out.println(e.getDefaultMessage());
        });
반응형