관리 메뉴

취미개발 블로그와 마음수양

스프링 부트 custom validaiton 과 i18n 메시지의 처리 본문

FrameWork_ETC/Spring

스프링 부트 custom validaiton 과 i18n 메시지의 처리

아라한사 2016. 11. 10. 15:02

스프링 부트 custom validaiton 과 i18n 메시지의 처리

내용

개발하다보면 공통적으로 발생하는 커스텀 밸리데이션 어노테이션을 만들 때가 있다. 뭐.. 만드는 법은 넘 간단해부려서..

조건인터페이스.java
// 밑의 어노테이션 정의는 상황마다 다름
@Target( {FIELD})
@Retention(RUNTIME)
@Constraint(validatedBy = 조건밸리데이터.class)
@Documented
@NotNull
public @interface 조건 {
    String message() default "{메시지 키}";
    Class<?>[] groups() default {};
    Class<? extends Payload>[] payload() default {};
}

이렇게 만들면 되고 여기서 사용할 밸리데이터는

조건밸리데이터.java
public class 조건밸리데이터  implements ConstraintValidator<조건, 필드타입이 될 수 있는> {

    @Override
    public void initialize(조건 annotation) {
    }

    @Override
    public boolean isValid(필드타입이 될 수 있는 value, ConstraintValidatorContext context) {
        //조건 맞는지 참 거짓 리턴
    }
}

이렇게 만들면 되고

테스트는 뭐 이런식으로 테스트를 해볼 수가 있을 것이다. 참조 ( 조원태님 슬라이드 ) 하단 링크 참조

CustomValidateTest.java
ValidatorFactory validatorFactory = Validation.buildDefaultValidatorFactory();
Validator validator = validatorFactory.getValidator();

@Test
public void test() throws Exception{
  테스트클래스 객체 = new 테스트클래스("조건");
  Set<ConstraintViolation<TestOnlyLetter>> constraintViolations = validator.validate(testClass);
  assertThat(constraintViolations.size()).isEqualTo(1);
  constraintViolations.forEach(n-> assertThat(n.getMessage()).isEqualTo("{메시지 키}"));
}

@Data @NoArgsConstructor @AllArgsConstructor
static class 테스트클래스 {
    @조건
    String testMsg;
}

하지만 이것을 스프링 부트에서 연동하는 순간 어노테이션에 정의한 메시지키를 그대로 사용할 수가 없는데.. 이럴 때는 이렇게 해주면 된다

public class WebConfig extends WebMvcConfigurerAdapter {
    @Autowired
    private MessageSource messageSource;

    @Override
    public Validator getValidator() {
        LocalValidatorFactoryBean factory = new LocalValidatorFactoryBean();
        factory.setValidationMessageSource(messageSource);
        return factory;
    }
}

아흙.. 너무 간단ㅠㅜ 하지만 과정이 넘 힘들었어..ㅠ

추가적으로 나중에 고민 해볼 수 있는 문제들과 좀 더 배운 점

  • interpolate 라는 것을 나중에라도 한 번 좀 봐야겠는데..?

  • JSR 349 에서인가 추가되어있는 ${validatedValue} 로 밸리데이션 메시지를 좀 더 풍부하게 할 수 있다 ?

  • 개발하다보면 ajax 같은 것들은 또 백엔드와 비슷하게 밸리데이션 조건을 들어가야할 수도 있는데.. (스프링 폼태그를 못 타기 때문), 밸리데이션을 XML로 만들고 한군데서 밸리데이션 조건을 관리하면 더 편하지 않을까..? 자바스크립트로 해당 XML을 조건으로 변환해주는 라이브러리가 필요할지도..

  • 스프링 MVC 컨트롤러에서 값이 어떻게 들어가서 어떻게 조건을 통과하는지 좀 자세히.. 알고 싶다.