message.properties 라는 메시지 관리용 파일을 활용하여 수정item=상품
item.id=상품 ID
item.itemName=상품명
item.price=가격
item.quantity=수량
properties 파일에 key, value 형식으로 저장하여 사용
messages.properties를 각 나라별로 별도로 관리하면 서비스를 국제화 할 수 있다. messages_ko.properties , messages_en.properties 의 파일을 분리하여 제공스프링은 기본적인 메시지 관리 기능을 제공한다.
MessageSource를 스프링 빈으로 등록하면 되는데
스프링에서는 MessageSource 인터페이스의 구현체인 ResourceBundleMessageSource를 스프링 빈으로 자동으로 등록해주고 있다.
spring.messages.basename=messages
application.properties 파일 내에서 설정 파일의 이름을 지정할 수 있다.
(기본 경로는 /resources/messages.properties)
1. 성공 테스트
@Test
void helloMessage() {
String result = ms.getMessage("hello", null, null);
assertThat(result).isEqualTo("안녕");
}
messages.properties에 hello라는 키가 존재하는 경우 데이터를 조회한다.
2. 실패 테스트 (메시지가 없는 경우)
void notFoundMessageCode() {
assertThatThrownBy(() -> ms.getMessage("no_code", null, null))
.isInstanceOf(NoSuchMessageException.class);
}
@Test
void notFoundMessageCodeDefaultMessage() {
String result = ms.getMessage("no_code", null, "기본 메시지", null);
assertThat(result).isEqualTo("기본 메시지");
}
NoSuchMessageException 이 발생한다.defaultMessage )를 사용하면 기본 메시지가 반환된다en_US 의 경우 messages_en_US messages_en messages 순서로 찾는다.추가) locale 정보가 없는 경우 Locale.getDefault()를 호출해서 시스템의 기본 로케일을 사용한다.
*타임리프에서의 메시지 처리 문법은 생략
각 언어 별 messages.properties를 추가해주면 스프링 내에서 자동으로 국제화 처리를 해줌
어떻게 언어를 찾는가?
스프링은 Locale 선택 방식을 변경할 수 있도록 LocaleResolver 라는 인터페이스를 제공하는데, 스프링 부트는 기본으로 Accept-Language 를 활용하는 AcceptHeaderLocaleResolver 를 사용한다
LocaleResolver 변경
예시) 쿠키를 사용해서 언어를 판단하고 싶은 경우
@Bean
public LocaleResolver localeResolver() {
CookieLocaleResolver localeResolver = new CookieLocaleResolver();
localeResolver.setCookieName("lang");
localeResolver.setDefaultLocale(new Locale("ko"));
localeResolver.setCookieHttpOnly(true);
return localeResolver;
CookieLocaleResolver 를 구현체로 갖는 스프링 빈을 등록한다.
많은 도움이 되었습니다, 감사합니다.