본문 바로가기
Spring

[Spring] MessageSource

by dbjh 2020. 1. 18.
반응형

이번 글에서는 ApplicationContext에서 다국화(i18n)을 담당하는 MessageSource 인터페이스에 대해 배워보자.

다국화(i18n) 란, 설정 값에 따라 각국의 언어로 변화시켜서 제공하는 것을 말한다.
제공하는 서비스가 우리나라뿐 아니라 세계적으로 사용되는 경우가 있다.  대표적으로 "Line" 이라는 어플리케이션이 있는데, 세계 각국의 사람들이 이용하는 대표적인 서비스인 만큼 각 나라의 언어에 맞게 노출되는 문구가 달라야 하는게 당연하다. 만약 각국의 언어로 제공하기 위해 각나라마다 새로운 프로젝트를 생성하거나 복잡한 코드로 제공한다면, 상당히 비효율적인 방식이다. 이때, 필요한 것이 바로 다국화(i18n) 이다.

ApplicationContext의 MessageSource를 이용하면 다국화(i18n)을 할 수 있다. 

일단 MessageSource 인터페이스를 이용하기전에 사용할 메세지 및 클래스를 생성하도록하자.

messages 파일 및 Runner 클래스 생성

위와 같이 한국어를 입력할 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)

properties Encoding을 UTF-8로 설정

 

Locale.getDefault() 메소드를 호출하면 실제로 "ko_KR"이 나오는데 현재 위치기반으로 설정 값이 출력 되는 것으로 보인다. 이렇게 각 국가에 맞게 설정파일(여기서는 .properties)을 작성한 후, 읽어서 출력되는 형식을 다르게 할 수 있다.
또한, messageSource 타입의 변수에 주입되는 Bean이 ResourceBundleMessageSource인 것을 확인 할 수 있다.

Bean 주입시 ResourceBundleMessageSource 가 아닌 ReloadableResourceBundleMessageSource 를  주입하도록 설정하면, 어플리케이션이 실행 중인 상태에서 message 파일을 변경한다고 해도 새로 Build만 해주면 실시간으로 국제화를 적용하여 제공할 수 있다.

Bean 주입 관련한 설정에 대해 잘 모른다면, 아래의 글을 참고하자.

 

[Spring] Spring Bean 설정 방법 - Java Config

이전 글에는 XML Config를 이용하여 Spring Bean 설정 하는 법을 진행하였다. 이 글에서는 Java Config 설정 방식에 대해 알아보려고 하는데, 기본적인 클래스가 필요 하기 때문에 혹시라도 이전 글인 XML Config..

dbjh.tistory.com

 

 

내용 출처

반응형

'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

댓글