티스토리 뷰

Spring

[Spring] 메시지 소스 & 국제화

hyuuny 2022. 1. 17. 22:39

스프링 메시지 소스

스프링은 기본적인 메시지 관리 기능을 제공한다.
메시지 관리 기능을 사용하기 위해서는 스프링이 제공하는 MessageSource를 스프링 빈으로 등록하면 되는데, 인터페이스이기 때문에 구현체인 ResourceBundleMessageSource를 스프링 빈으로 등록한다.



스프링 메시지 소스 직접 등록

@Bean
public MessageSource messageSource() {
    ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
    messageSource.setBasenames("messages", "errors");
    messageSource.setDefaultEncoding("utf-8");
    return messageSource;
}
  • basenames : 설정 파일의 이름을 지정한다.
    • messages로 지정하면 messages.properties파일을 읽어서 사용한다.
    • 국제화 기능을 적용하려면 messages_en.properties, messages_ko.properties와 같이 파일명 마지막에 언어 정보를 주면 되는데, 만약 찾을 수 있는 국제화 파일이 없으면 messages.properties(언어정보가 없는 파일명)를 기본으로 사용한다.
    • 파일은 /resources/messages.properties에 위치시킨다.
    • 여러 파일을 한번에 지정할 수 있다.


스프링 부트 메시지 소스 사용하기

스프링 부트를 사용하면 application.properties파일에 메시지 소스를 설정할 수 있다.

spring.messages.basename=messages,config.i18n.messages

MessageSource를 스프링 빈으로 등록하지 않고, 스프링 부트와 관련된 별도의 설정을 하지 않으면 messages라는 이름으로 기본 등록된다. 따라서 messages_en.properties, messages_ko.properties, messages.properties파일만 등록하면 자동으로 인식된다.



메시지 파일 만들기

  • messages.properties : 기본 값으로 사용(한글)
  • messages_en.properties : 영어 국제화 사용

messages.properties

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

messages_en.properties

hello=hello
hello.name=hello {0}


스프링 메시지 소스 사용

MessageSource 인터페이스

public interface MessageSource {
    String getMessage(String code, @Nullable Object[] args, @Nullable String defaultMessage Locale locale);
    String getMessage(String code, @Nullable Object[] args, Locale locale) throws NoSuchMessageException;
}

MessgaeSource인터페이스를 보면 코드를 포함한 일부 파라미터로 메시지를 읽어오는 기능을 제공한다.



메시지 소스 테스트 코드

import ...

@SpringBootTest
public class MessageSourceTest {

  @Autowired
  MessageSource messageSource; // 스프링부트 자동 등록

  @Test
  void helloMessage() {
    String result = messageSource.getMessage("hello", null, null);
    assertThat(result).isEqualTo("안녕");
  }

}

테스트 결과

테스트는 메시지 코드로 hello를 입력하고 나머지 값은 null을 입력했다.
locale정보가 없으면 basename에서 설정한 기본 이름 메시지 파일을 조회한다. basename으로 messages를 지정 했으므로 messages.properties파일에서 데이터를 조회한다.



메시지 소스 테스트 코드(매개변수 사용)

@Test
void argumentMessage() {
    String result = messageSource.getMessage("hello.name", new Object[]{"Spring"}, null);
    assertThat(result).isEqualTo("안녕 Spring");
}

테스트 결과

  • 다음 메시지의 {0} 부분은 매개변수를 전달해서 치환할 수 있다.
  • hello.name=안녕 -> {0}의 매개변수로 Spring 전달 -> 안녕 Spring



국제화

  • locale정보를 기반으로 국제화 파일을 선택한다.
  • Locale이 en_US의 경우 messages_en_US -> messages_en -> messages 순서로 찾는다.
  • Locale에 맞추어 구체적인 것이 있으면 구체적인 것을 찾고, 없으면 디폴트를 찾는다.

Default 국제화 테스트 코드

@Test
void defaultLang() {
    assertThat(messageSource.getMessage("hello", null, null)).isEqualTo("안녕");
    assertThat(messageSource.getMessage("hello", null, Locale.KOREA)).isEqualTo("안녕");
}

테스트 결과

  • ms.getMessage("hello", null, null) : locale 정보가 없으므로 messages를 사용
  • ms.getMessage("hello", null, Locale.KOREA) : locale 정보가 있지만, messages_ko가 없으므로 messages 를 사용


en 국제화 테스트 코드

@Test
void enLang() {
    assertThat(ms.getMessage("hello", null, Locale.ENGLISH)).isEqualTo("hello");
}

테스트 결과

  • ms.getMessage("hello", null, Locale.ENGLISH) : locale 정보가 Locale.ENGLISH이므로 messages_en을 찾아서 사용
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
글 보관함