반응형

[Spring] 메세지소스(MessageSource)를 통한 메세지 국제화, 메세지 소스 리로딩(MessageSource Reloading)

반응형

| 스프링 메세지소스(Spring MessageSource)


스프링 메세지 소스(Spring MeesageSource)는 국제화(i18n)을 제공하는 인터페이스다. 메세지 설정 파일을 모아놓고 각 국가마다 로컬라이징을 함으로서 쉽게 각 지역에 맞춘 메세지를 제공할 수 있다. 


| 메세지 설정 파일 셋업하기


메세지 설정 파일을 셋업하기 위해서는 .properties 확장자가 붙은 프로퍼티 파일에 [파일이름]_[언어]_[국가].properties 형식으로 메세지 파일을 추가해야 한다. 다음은 그 예시다.


        message.properties : 기본 메시지. 시스템의 언어 및 지역에 맞는 프로퍼티 파일이 존재하지 않을 경우에 사용.
       
message_en.properties : 영어 메시지.

        message_ko.properties : 한글 메시지.
        message_en_UK.properties : 영국을 위한 영어 메시지


위와 같은 식으로 메세지 설정 파일을 만든 다음 다음과 같이 key-value 형식의 값을 입력한다. 여기서는 (영어, 미국) 과 (한국어-한국)의 메세지 형식을 만들어 볼 것이다.

# messages_en_US.properties
greeting=Hello, so good {0}
# messages_ko_KR.properties
greeting=안녕, 진짜 반가워 {0}


| MessageSource 객체에서 로컬라이징된 메세지 얻기


위의 설정 파일을 통해 입력된 값들은 MessageSource 객체를 통해 값을 얻을 수 있다. 형식은 다음과 같다.

@Component

public class AppRunner implements ApplicationRunner {

@Autowired
MessageSource messageSource;

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

System.out.println(messageSource.getClass());
System.out.println(messageSource.getMessage("greeting", new String[]{"saelobi"}, Locale.KOREA));
System.out.println(messageSource.getMessage("greeting", new String[]{"saelobi"}, Locale.US));
}
}

안녕, 진짜 반가워 saelobi
Hello, so good saelobi


| ReloadableResourceBundleMessageSource 객체를 통한 MessageSource 리로딩


메세지 소스를 리로딩 하는 방법은 ReloadableResourceBundleMessageSource의 객체를 통해 메세지 프로퍼티 파일을 갱신하며 읽는 것이다.


아래의 코드는 ReloadableResourceBundleMessageSource객체의 메세지 리로딩 방법을 나타내는 코드이며 리로딩한 설정 파일을 10초간 캐싱한다.

@SpringBootApplication
public class SpringTutorialApplication {

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

@Bean
public MessageSource messageSource(){
ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();
messageSource.setBasename("classpath:/messages");
messageSource.setDefaultEncoding("UTF-8");
messageSource.setCacheSeconds(10);
return messageSource;
}
}


다음은 위의 messageSource 메서드를 통해 리로딩되는 메세지 소스를 구현함으로서 설정한 메세지를 얻는 방법을 나타낸 코드다.

@Component
public class AppRunner implements ApplicationRunner {

@Autowired
MessageSource messageSource;

@Override
public void run(ApplicationArguments args) throws Exception {
while(true){
System.out.println(messageSource.getClass());
System.out.println(messageSource.getMessage("greeting", new String[]{"saelobi"}, Locale.KOREA));
System.out.println(messageSource.getMessage("greeting", new String[]{"saelobi"}, Locale.US));
Thread.sleep(1000);
}
}
}


무한 while 문이 진행되는 동안 임의의 다른 값으로 프로퍼티 파일을 바꾸고 다시 build하면 아래와 같은 메세지로 바뀌는 것을 볼 수 있다.

class org.springframework.context.support.ReloadableResourceBundleMessageSource
안녕 , 반가워 saelobi
Hello, so good saelobi
class org.springframework.context.support.ReloadableResourceBundleMessageSource
안녕 , 반가워 saelobi
Hello, so good saelobi
class org.springframework.context.support.ReloadableResourceBundleMessageSource
안녕 , 반가워 saelobi
Hello, so good saelobi ㅁㅁ
class org.springframework.context.support.ReloadableResourceBundleMessageSource
안녕 , 반가워 saelobi
Hello, so good saelobi ㅁㅁ


반응형

이 글을 공유하기

댓글

Designed by JB FACTORY