MessageSource

  • 애플리케이션 컨텍스트가 상속하고 있는 또 다른 기능.

  • 국제화(i18n) 기능을 제공하는 인터페이스이다.

properties를 활용한 방법

@Component
public class AppRunner implements ApplicationRunner {
    @Autowired
    MessageSource messageSource;

    @Override
    public void run(ApplicationArguments args) throws Exception {
        // message_ko_KR.properties
        System.out.println(messageSource.getMessage("greeting", new String[]{"keesun"}, Locale.KOREA));
        // messages.properties
        System.out.println(messageSource.getMessage("greeting", new String[]{"keesun"}, Locale.getDefault()));
    }
}
안녕, keesun
Hello keesun

원래 ResourceBundleMessageSource 빈을 등록해야 사용할 수 있지만 스프링 부트는 자동으로 실행해준다.

직접 정의하는 방법

ReloadableResourceBundleMessageSource를 이용해 직접 정의하는 방법도 있다.

@SpringBootApplication
public class MessageSourceApplication {

    public static void main(String[] args) {
        SpringApplication.run(MessageSourceApplication.class, args);
    }

    @Bean
    // 빈 이름은 항상 messageSource가 되어야 한다.
    public MessageSource messageSource() {
        var messageSource = new ReloadableResourceBundleMessageSource();
        messageSource.setBasename("classpath:/messages");
        // 한글이 깨지므로 인코딩 해준다.
        messageSource.setDefaultEncoding("UTF-8");
        return messageSource;
    }
}
안녕, keesun
hello keesun

메시지 리로딩

중간에 메시지를 수정하면 수정한 내용이 출력된다.

@Component
public class AppRunner implements ApplicationRunner {
    @Autowired
    MessageSource messageSource;

    @Override
    public void run(ApplicationArguments args) throws Exception {
        while (true) {
            // message_ko_KR.properties
            System.out.println(messageSource.getMessage("greeting", new String[]{"keesun"}, Locale.KOREA));
            // messages.properties
            // OS 기본 언어 설정에 기반하기 때문에 나는 한국어로 출력된다.
            System.out.println(messageSource.getMessage("greeting", new String[]{"keesun"}, Locale.getDefault()));

            // 1초마다 기록한다.
            Thread.sleep(1000L);
        }
    }
}

먼저 메시지가 1초마다 기록되게 만든다.

@SpringBootApplication
public class MessageSourceApplication {

    public static void main(String[] args) {
        SpringApplication.run(MessageSourceApplication.class, args);
    }

    @Bean
    // 빈 이름은 항상 messageSource가 되어야 한다.
    public MessageSource messageSource() {
        var messageSource = new ReloadableResourceBundleMessageSource();
        messageSource.setBasename("classpath:/messages");

        // 한글이 깨지므로 인코딩 해준다.
        messageSource.setDefaultEncoding("UTF-8");

        // 리소스를 캐시하는 시간을 3초로 설정한다.
        messageSource.setCacheSeconds(3);

        return messageSource;
    }
}

그리고 3초마다 캐시를 하게 한 뒤

greeting=안녕, 반갑습니다. {0}
  • 프로퍼티를 수정하고 Build Project(F9) 하면 수정 내용이 실시간으로 반영된다.

  • 빌드 패스에 있는 파일을 끌어오는 것이기 때문에 빌드는 반드시 해준다.

안녕, keesun
안녕, keesun
안녕, 반갑습니다. keesun
안녕, 반갑습니다. keesun

이렇게 변경 사항이 바로 찍힌다.

Last updated