이번 글에서는 ApplicationContext에서 다국화(i18n)을 담당하는 MessageSource 인터페이스에 대해 배워보자.
다국화(i18n) 란, 설정 값에 따라 각국의 언어로 변화시켜서 제공하는 것을 말한다.
제공하는 서비스가 우리나라뿐 아니라 세계적으로 사용되는 경우가 있다. 대표적으로 "Line" 이라는 어플리케이션이 있는데, 세계 각국의 사람들이 이용하는 대표적인 서비스인 만큼 각 나라의 언어에 맞게 노출되는 문구가 달라야 하는게 당연하다. 만약 각국의 언어로 제공하기 위해 각나라마다 새로운 프로젝트를 생성하거나 복잡한 코드로 제공한다면, 상당히 비효율적인 방식이다. 이때, 필요한 것이 바로 다국화(i18n) 이다.
ApplicationContext의 MessageSource를 이용하면 다국화(i18n)을 할 수 있다.
일단 MessageSource 인터페이스를 이용하기전에 사용할 메세지 및 클래스를 생성하도록하자.
위와 같이 한국어를 입력할 messages.properties 파일과 영문을 입력할 messages_en_US.properties 파일을 resources 디렉토리에 추가하자. 위 두파일을 추가하게 되면 자동으로 번들로 인식하여 위처럼 파일트리가 형성된다.
파일을 생성하였다면 각 파일에 아래와 같이 작성하도록 하자.
messages.properties
greeting=메세지 {0}
messages_en_US.properties
greeting=Message {0}
작성이 끝났다면, 해당 파일을 읽어서 사용할 수 있도록 클래스 파일을 작성하자.
코드를 작성 하기에 앞서서 ApplcationContext는 실제로 MessageSource 인터페이스를 확장하고 있기 때문에 ApplcationContext를 주입받는 것처럼, MessageSource도 주입 받을 수 있다는 것을 참고하자.
AppRunner.java
// 코드중략
@Component
public class AppRunner implements ApplicationRunner {
@Autowired
MessageSource messageSource;
@Override
public void run(ApplicationArguments args) throws Exception {
// 파일명이 "messages" 뒤에 "_en_US" 붙은 파일을 읽음 => "messages_en_US"
System.out.println(messageSource.getMessage("greeting", new String[]{"message"}, Locale.US));
// 파일명이 "messages"로 시작하는 파일을 읽음 - 디폴트 =>
// 우리는 한국이기 때문에 기본 값으로 "_ko_KR"이 붙어있다고 보면됨
// 실제로 Locale.getDefault() 출력해보면 "ko_KR" 출력됨
System.out.println(messageSource.getMessage("greeting", new String[]{"message"}, Locale.getDefault()));
// 실제로 주입된 Bean 어떠한 클래스인지 확인하기 위해 추가
System.out.println(messageSource.getClass());
}
}
위와 같이 코드를 작성한후 어플리케이션을 실행하면, 아래와 같은 결과를 확인 할 수 있다.
주석에 입력해둔 대로 값들을 읽어와서 출력 해줄 것이다.
혹시라도 한글이 깨진다면, IntelliJ의 properties 인코딩 설정을 UTF-8로 바꿔주도록 하자.
(File > Settings > Editor > File Encoding)
Locale.getDefault() 메소드를 호출하면 실제로 "ko_KR"이 나오는데 현재 위치기반으로 설정 값이 출력 되는 것으로 보인다. 이렇게 각 국가에 맞게 설정파일(여기서는 .properties)을 작성한 후, 읽어서 출력되는 형식을 다르게 할 수 있다.
또한, messageSource 타입의 변수에 주입되는 Bean이 ResourceBundleMessageSource인 것을 확인 할 수 있다.
Bean 주입시 ResourceBundleMessageSource 가 아닌 ReloadableResourceBundleMessageSource 를 주입하도록 설정하면, 어플리케이션이 실행 중인 상태에서 message 파일을 변경한다고 해도 새로 Build만 해주면 실시간으로 국제화를 적용하여 제공할 수 있다.
Bean 주입 관련한 설정에 대해 잘 모른다면, 아래의 글을 참고하자.
내용 출처
'Spring' 카테고리의 다른 글
[Spring] ResourceLoader (0) | 2020.05.17 |
---|---|
[Spring] ApplicationEventPublisher (0) | 2020.05.15 |
[Spring] Environment - Property (0) | 2020.01.07 |
[Spring] Environment - Profile (0) | 2019.12.29 |
[Spring] Bean의 스코프 (0) | 2019.12.29 |
댓글