메시지 국제화

bw1611·2023년 12월 9일
0

메시지 국제화란?


국제화 서비스를 위해서는 사용자 언어에 맞는 페이지가 번역되어 보여져야 한다. 그런데 서비스 되는 언어마다 html 파일을 작성하여, 요청 언어에 따라 응답 페이지를 분기시키는 것은 매우 비효율적이고, 유지보수를 어렵게 만듭니다. 그래서 저희는 Spring에서 제공하는 국제화 기능을 사용하면 됩니다.
Springboot에서는 messageSource를 자동으로 스프링 빈 주입해주기 때문에 따로 MessageSource 구현없이 message_properties를 정의해주면 Springboot가 알아서 사용자 언어를 확인 후 메시지를 변환해줍니다.

스프링 부트를 사용하여 messageSource 설정

spring:
  messages:
    basename: messages

MessageSource의 내부구현은 어떻게 되어있을까?

ApplicationContext에 들어가게 되면 MessageSource를 상속받는 것을 확인할 수 있다.

MessageSource는 Bean으로 등록된 것으로 설정해준다.

MessageSource는 MessageSourceAutoConfiguration에서 bean으로 생성되어 진다.

아직 확실히 내부 구현을 열어본것이 아니라 대충 이렇게 진행된다고 보면 될 것같다. 즉 우리가 따로 MessageSource를 빈 주입 해주지 않아도 되는 이유는 여기에 있는 것 같다.

messageProperties 정의

messages.properties

hello=안녕
hello.name=안녕 {0}

messages_en.properties

hello=hello
hello.name=hello {0}

messageProperties를 만들게 되면 bundle이라는 구조가 생기게 된다.
만약 우리가 설정한 언어 형식으로 들어오지 않는다면 default를 불러오고 언어 설정이 en으로 들어온다면 messages_en.properties가 실행되게 된다.
(만약 중국인이 들어오면 우리는 중국언어 설정을 해주지 않았기에 한국말로 보이게 된다.)

MessageSource 사용하기

    @Autowired
    MessageSource messageSource;

    @Test
    void helloMessage() {
        String result = messageSource.getMessage("hello", null, null); // -> default 선택

        assertThat(result).isEqualTo("안녕");
    }

ms.getMessage("hello", null, null)

  • code: hello
  • args: null
  • locale: nul

MessageSource를 직접 bean으로 주입해주어 테스트 코드를 작성해봤다. locale이 null로 들어온다면 시스템 기본을 따르기 때문에 KR로 조회를 했다가 없다면 default "안녕"이 실행되는걸 확인할 수 있었다. 이로써 현재 메시지 국제화 기능이 정상적으로 사용되는 것을 확인할 수 있다.

messageSource 빈의 기본 설정 범위는 다음과 같다.

  • 기본 ClassLoader 사용
  • messages로 이름 사용
  • UTF-8 인코딩 사용
  • 각 locale별 message bundle 캐시 처리
profile
Java BackEnd Developer

0개의 댓글