MessageSource

ApplicationContext가 가지고 있는 국제화 (i18n) 기능(메세지 다국화)을 제공하는 인터페이스이다.

Spring boot를 사용한다면 별 다른 설정없이 messages.properties를 만들어 사용 가능하다.


사용 방법

1. messages.properties 파일을 생성한다.

  • messages.properties에 들어가는 내용은 Default Locale에 해당하는 message이다.

messages.properties

greeting=안녕, {0}

위에서 {0} 은 인자를 뜻한다.


2. Locale 별 메세지를 작성한다.

  • 위의 en_US에 해당하는 메세지 프로퍼티를 만들어 본다.

messages_en_US.properties

greeting=Hello, {0}


위의 설정을 가져와 출력하기 위한 Runner를 만든다.

MyRunner.java

@Component
public class AppRunner implements ApplicationRunner {

    @Autowired
    MessageSource messageSource;

    @Override
    public void run(ApplicationArguments args) throws Exception {
        System.out.println(Locale.getDefault());
        System.out.println(messageSource.getMessage("greeting", new String[]{"Seongmun"}, Locale.getDefault()));
        System.out.println(messageSource.getMessage("greeting", new String[]{"Seongmun"}, Locale.KOREA));
        System.out.println(messageSource.getMessage("greeting", new String[]{"Seongmun"}, Locale.US));
    }

}


프로젝트를 실행시켜 보면 결과는 다음과 같다.

ko_KR
안녕, Seongmun
안녕, Seongmun
Hello, Seongmun


Reloading 기능이 있는 MessageSource 사용하기


1. Reloading 기능이 있는 MessageSource를 Bean으로 등록

MessagesourceApplication.java

@SpringBootApplication
public class MessagesourceApplication {

    @Bean
    public MessageSource messageSource() {
        ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();
        messageSource.setBasename("classpath:/messages");
        messageSource.setDefaultEncoding("UTF-8"); // messages.properties 의 인코딩 설정
        messageSource.setCacheSeconds(5); // 메세지를 캐시하는 시간을 설정 
        // 5초마다 메세지를 다시 읽어와서 캐시함 (수정해도 다시 가져오면 수정사항이 반영됨)
        return messageSource;
    }

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

}


2. 수정사항을 보기 위한 Runner코드 수정

MyRunner.java

@Component
public class AppRunner implements ApplicationRunner {

    @Autowired
    MessageSource messageSource;

    @Override
    public void run(ApplicationArguments args) throws Exception {

        while (true) {
            System.out.println(messageSource.getMessage("greeting", new String[]{"Seongmun"}, Locale.getDefault()));
            System.out.println(messageSource.getMessage("greeting", new String[]{"Seongmun"}, Locale.US));
            Thread.sleep(3000L);
        }

    }

}

3. 프로젝트 실행 후 messages.properties 수정

프로젝트를 실행하면 3초마다 greeting message를 가져와서 출력한다.

...
안녕, Seongmun
Hello, Seongmun
안녕, Seongmun
Hello, Seongmun
...


도중 messages.properties들을 수정한다.

messages.properties

greeting=새로운 안녕, {0}


messages_en_US.properties

greeting=new Hello, {0}


위와 같이 수정한 후 프로젝트를 빌드하면 출력 메세지가 변경되는 것을 확인할 수 있다.

결과는 아래와 같다.

...
안녕, Seongmun
Hello, Seongmun
새로운 안녕, Seongmun
new Hello, Seongmun
새로운 안녕, Seongmun
new Hello, Seongmun
...


Project Repository

  • https://github.com/Seongmun-Hong/SpringStudy


Reference

  • https://www.inflearn.com/course/spring-framework_core
Share :

Comments