Question
- 스프링 부트의 기본 메시지 관리 파일이름은?
- 스프링 부트의 기본 국제화 메시지 관리 파일 이름은?
- 스프링 부트의 메시지 관리 파일의 기본 위치는?
국제화
- 여러 언어를 지원해야 하는 경우 메세지들을 언어에 따라 별도의 파일로 관리
- 어떤 언어를 사용하는지 HTTP accept-language 헤더 값 등을 기반으로 판단해 언어맞는 메시지 전달
스프링의 MessageSource
@Bean
public MessageSource messageSource() {
ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
messageSource.setBasenames("messages", "errors");
messageSource.setDefaultEncoding("utf-8");
return messageSource;
}
- 스프링이 제공하는 메시지 관리 기능은 MessageSource
- MessageSource를 bean으로 등록해서 사용해야 함
- Basename을 "messages"로 지정하면 messages.properties 파일을 읽어서 사용함
- 추가로 국제화 기능을 적용하려면 messages_en.properties, messages_ko.peroperties와 같이 사용하면 됨
- 만약, 국제화 파일이 없다면 messages.properties를 기본으로 사용함
- 파일의 위치는 /resources/messages.properties에 두면 됨
- 파일명 "messages"에 뒤에 s를 조심해야 함
- 여러 파일을 한 번에 지정할 수 있으며 이 케이스에서는 "messages", "errors" 두 개를 지정 했음
스프링 부트의 MessageSource
application.properties
spring.messages.basename=messages,config.i18n.messages
- 스프링 부트에서는 application.properteis에 위와 같이 등록 가능
- 스프링 부트에서는 MessageSource를 스프링 빈으로 등록하지 않아도 Basename을 messages라고 기본 등록해줌
- 따라서 messages_en.properteis, messages_ko.properties 등은 자동 인식됨
스프링 메시지 소스 사용
@SpringBootTest
public class MessageSourceTest {
@Autowired
MessageSource ms;
@Test
void helloMessage() {
String result = ms.getMessage("hello", null, null);
assertThat(result).isEqualTo("안녕");
}
}
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;
}
- MessageSource 빈을 주입받아 사용
- 메시지를 조회해서 나오지 않으면 defaultMessage를 적용할 수 있음
- locale을 넣지 않으면 국제화 파일이 아닌 기본 메시지 파일인 messages.properties를 조회
스프링의 국제화 메시지 선택
- 스프링은 언어 선택시 기본으로 Accept-Language 헤더의 값을 사용함
- 스프링은 Local 선택 방식을 변경할 수 있도록 LocalResolver 라는 인터페이스르 제공하며, 스프링 부트는 기본으로 Accept-Language를 활용하는 AcceptHeaderLocaleResolver를 사용
- 원한다면 LocaleResolver 구현체를 별도로 만들어 원하는대로 사용 가능