[Spring] 메시지, 국제화
메시지
여러 웹페이지에 표시되는 같은 내용의 텍스트들을 한번에 처리하고 싶을 때 메시지 기능을 이용한다.
C에서 코드 내에 쓸 상수를 전역 변수 또는 #define으로 처리하는 것과 비슷하다고 느꼈다!
일반적으로 관리할 내용들은 messages.properties에 적어두고 수정하면 되며,
다음과 같이 설정해주면 된다.
item=상품
item.id=상품 ID
item.itemName=상품명
item.price=가격
item.quantity=수량
그리고 html 파일에서 처리는 thymeleaf
로 다음과 같이 처리한다!
<label for="itemName" th:text="#{item.itemName}"></label>
국제화
앞에서 메시지를 messages.properties로 관리하다고 말했는데 이는 default라고 생각하면 되고
영어는 messages_en.properties, 한국어는 messages_ko.properties 파일에서 관리해주면 된다.
사용자의 HTTP 헤더에서 accept-language 값을 보고 적절한 파일로 스프링이 알아서 처리해준다!
바로 위 파일을 설정해준다고 알아서 처리해주진 않고 다음 내용을 거쳐야한다.
스프링에서 메시지 소스 설정하기
스프링에서 메시지 관리 기능을 쓰려면 MessageSource을 써야하는데 이건 인터페이스여서
구현체인 ResourceBundleMessageSource를 써야한다! 스프링 빈으로 등록해서 사용하면 된다.
직접 등록해서 사용하려면 @Bean
으로 처리하면 되고, 스프링 부트에서는 application.properties
에서
다음과 같이 적으면 쉽게 설정할 수 있다!
spring.messages.basename=messages,config.i18n.messages
기본값이 messages이므로 messages.properties
, messages_ko.properties
, messages_en.properties
를 만들면 알아서 처리한다.
messages.properties
에 다음과 같이 적었을 때 {0}
에는 매개변수로 값을 받아올 수 있다!
hello=안녕
hello.name=안녕 {0}
test 시 매개변수로 값을 설정할때 예시이다.
@Test
void argumentMessage() {
String result = ms.getMessage("hello.name", new Object[]{"Spring"}, null); //{0} -> Spring
assertThat(result).isEqualTo("안녕 Spring");
}
국제화 예시 (test)
test 시 국제화 설정 예시이다. Locale에 맞춰서 구체적인 파일을 찾고 이외에는 default를 찾게된다.
@Test
void defaultLang() {
assertThat(ms.getMessage("hello", null, null)).isEqualTo("안녕"); //messages (default)
assertThat(ms.getMessage("hello", null, Locale.KOREA)).isEqualTo("안녕");} //messages_ko -> messages
웹에서 국제화 기능 적용
스프링은 Locale 값을 설정할 수 있도록 LocaleResolver라는 인터페이스를 제공한다.
스프링 부트는 Accept-Language를 설정하는 위 인터페이스 구현체 AcceptHeaderLocaleResolver를 사용한다.
Locale을 설정하는 기능을 제공하고 싶다면 LocaleResolver를 검색해서 관련 예제를 찾아보자!
댓글남기기