Spring MVC 2 - 국제화/메시지
1. 메시지/국제화 기능이란
- 만약 html에 출력하는 상품명 -> 상품이름으로 모두 고쳐야할 경우
- 모든 상품명에 찾아서 이를 모두 수정해야한다. (하드코딩 되어 있다)
- 메시지는 이러한 것들을 한번에 관리하도록 기능을 제공한다.
item=상품
item.id=상품 ID
item.itemName=상품명
item.price=가격
item.quantity=수량
addForm.html
<label for="itemName" th:text="#{item.itemName}"></label>
editFrom.html
<label for="itemName" th:text="#{item.itemName}"></label>
- 국제화는 이러한 메시지 기능에서 한발 더 나아가, 나라별로 보여줄 메시지를 한번에 관리할 수 있게한다.
- acept-language값을 사용하거나, 사용자가 선택하도록하여 쉽게 다른 언어로 치환할 수 있다.
2. 스프링 메시지 소스 설정
- 스프링은 기본적인 메시지 관리 기능을 제공한다. MessageSource를 스프링 빈으로 등록하면된다.
(구현체 ResourceBundleMessageSource)
@Bean
public MessageSource messageSource() {
ResourceBundleMessageSource messageSource = new
ResourceBundleMessageSource();
messageSource.setBasenames("messages", "errors");
messageSource.setDefaultEncoding("utf-8");
return messageSource;
}
- basenames: 메시지 파일 이름 지정 (messages -> messages.properties)
파일명 마지막에 언어정보 추가하면, 국제화 기능 실행 -> 없으면 언어정보 없는 파일 실행함
파일 위치는 /resources밑에 두자
2.1 스프링부트 : 스프링부트는 자동으로 MessageSource를 자동으로 등록함! 따라서 다음과 같이 메시지 소스 설정 가능
//application.properties
spring.messages.basename=messages,config.i18n.messages
- 기본값이 messages로 되어 있다.
2.2 messages.properties파일 만들기
hello=안녕
hello.name=안녕 {0}
- {} 메시지 매개변수로 전달될 값
3. 스프링 메시지 소스 사용
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는 파라미터를 통해 메시지를 읽어오는 기능 제공
- code는 hello나 hello.name같은 키 값, Object는 {0}값에 넣어줄 것, default나, Locale정보 넣을 수 있다.
- 해당 코드에 메시지가 없는 경우 NoSuchMessageException 발생한다.!
- Locale정보는 en_US면 -> messages_en_US -> message_en 순서 (구체적 -> 단순한것)
*Locale정보가 null이면 Locale.getDefault()를 호출해서 알아서 사용함!
4. 웹 애플리케이션 메시지 적용하기
label.item=상품
label.item.id=상품 ID
label.item.itemName=상품명
label.item.price=가격
label.item.quantity=수량
page.items=상품 목록
page.item=상품 상세
page.addItem=상품 등록
page.updateItem=상품 수정
button.save=저장
button.cancel=취소
- 메시지 등록, 해당 메시지 코드로 값을 읽어오면됨!!
4.1 타임리프 메시지 적용
메시지 표현식 #{}을 사용하면 스프링 메시지를 편리하게 조회할 수 있다.
ex #{page.addItem}
-> 메시지 넣으려는 태그에 th:text="#{label.item.itemName}" 사용하면 렌더링시에 content를 바꿔줌
4.2 타임리프에서 메시지에 파라미터 넣기
<p th:text="#{hello.name(${item.itemName})}"</p>
메시지 코드에 파라미터 전달하듯이 넣어주면 된다.
위와 같이 메시지를 효율적으로 관리할 수 있다.
5. 국제화 적용하기
- messages_en.properties같은 파일 추가
- 요청시 Accept-Language 값을 변경하면됨
- 스프링은 Locale정보를 알아야 선택 -> 기본으로 Accept-Laguage 헤더 값 사용
5.1 LocaleResolver
스프링은 Locale 선택 방식을 변경할 수 있도록 LocaleResolver인터페이스 제공
이때 기본적으로 AcceptHeaderLocaleResolver사용 (Accept 헤더값 사용)
5.2 LocaleResolver 인터페이스
public interface LocaleResolver {
Locale resolveLocale(HttpServletRequest request);
void setLocale(HttpServletRequest request, @Nullable HttpServletResponse
response, @Nullable Locale locale);
}
만약 Locale 선택 방식을 변경하려면, LocaleResolver 구현체 변경하거나, 쿠키나 세션 기반으로 Locale 선택
기능을 사용할 수 있다. -> 나중에 더 찾아보자(필요시)