Spring Validation 어노테이션 메시지에 다국어 적용(Message Resources 활용)

어제에 이어 계속 다국어 처리하는 중.
오늘은 서버 측 유효성 검사 시 message에 Message Resources를 적용하는 방법을 알아냈다.

Bean 생성

다국어 지원을 위해 MessageResource 빈은 만든 상태였다. 하지만 서버 측 유효성 검사 어노테이션(예, @NotNull, @Min…)에 MessageResource 빈을 사용하려면 추가적인 설정이 필요하다.
바로 맨 아래에 있는 빈, LocalValidatorFactoryBean 요것!
클래스 생성 내에 setValidationMessageSource(MessageSource messageSource) 메소드로 커스텀한 MessageSource를 지정할 수 있다. 지정해주지 않으면 JSR-303의 디폴트 번들인 ValidationMessages.properties에 의존한다고 한다.

@Component
public class MailConfig {

    /* ... */

    @Bean
    public SpringTemplateEngine templateEngine(ITemplateResolver templateResolver, SpringSecurityDialect sec) {
        final SpringTemplateEngine templateEngine = new SpringTemplateEngine();
        templateEngine.setTemplateResolver(templateResolver);
        templateEngine.addDialect(sec);
        templateEngine.setMessageSource(messageSource());
        return templateEngine;
    }

    @Bean
    public ResourceBundleMessageSource messageSource() {
        final ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
        messageSource.setBasename("messages");
        messageSource.setDefaultEncoding("UTF-8");

        return messageSource;
    }

    @Bean
    public LocalValidatorFactoryBean getValidator() {
        LocalValidatorFactoryBean factoryBean = new LocalValidatorFactoryBean();
        factoryBean.setValidationMessageSource(messageSource());

        return factoryBean;
    }

}

Validation 어노테이션에 적용

설정을 마치면 Validation을 위한 어노테이션에 적용하기는 매우 쉽다.
message = {KEY} 형태로 넣어주면 끝! (참고로 @NotInUse는 내가 커스텀한 어노테이션이다.)

    @NotInUse(message = "{error.id.remote}", flag = NotInUse.Flag.USER_ID)
    @NotBlank(message = "{error.id.requiredJoin}")
    private String id;

오늘은 다국어 처리를 하느라 문자열을 정리하고, 번역하고, 기존에 하드 코딩으로 박아 둔 문자열을 모두 교체하느라 시간이 오래 걸렸다. 글로벌 서비스를 할 때는 미리 다국어 처리를 해가면서 구현하는 쪽이 낫겠다.

참고자료

  • Custom Validation MessageSource in Spring Boot 🔗