[Thymeleaf] 메시지, 국제화
메시지
예를 들어 웹 페이지의 상품명을 모두 상품이름으로 바꾼다고 한다면, 여러 화면에 있는 label
의 단어를 모두 변경해야 한다.
addForm.html
,editForm.html
,item.html
,items.html
이렇게 다양한 메시지를 한 곳에서 관리하도록 하는 기능을 메시지 기능이라 한다.
messages.properties
item=상품
item.id=상품 ID
item.itemName=상품명
item.price=가격
item.quantity=수량
각 HTML들은 해당 데이터를 key값으로 불러서 사용한다.
addForm.html
<label for="itemName" th:text="#{item.itemName}"></label>
editForm.html
<label for="itemName" th:text="#{item.itemName}"></label>
국제화
메시지 파일(messages.properties
)을 각 나라별로 관리하면 서비스를 국제화 할 수 있다.
message_en.properties
item=Item
item.id=Item ID
item.itemName=Item Name
item.price=price
item.quantity=quantity
messages_ko.propertis
item=상품
item.id=상품 ID
item.itemName=상품명
item.price=가격
item.quantity=수량
영어를 사용하는 사람이면 message_en.properties
를 사용,
한국어를 사용하는 사람이면 message_ko.properties
를 사용하게 개발.
언어 인식 방법은 HTTP Accept-language
헤더 값을 사용하거나, 사용자가 직접 언어를 선택하도록 하여 쿠키 등을 사용해서 처리.
메시지 소스 설정
메시지 관리 기능을 사용하려면 스프링이 제공하는 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
defaultEncoding
: 인코딩 정보를utf-8
로 지정.
스프링 부트
스프링 부트는 MessageSource
를 자동으로 스프링 빈으로 등록한다.
스프링 부트 메시지 소스 설정
application.properties
spring.messages.basename=messages
MessageSource
를 스프링 빈으로 등록하지 않고, 스프링 부트와 관련된 별도의 설정을 하지 않으면 messages
라는 이름으로 기본 등록된다.
따라서 messages_en.properties
, messages_ko.properties
, messages.properties
파일만 등록하면 자동으로 인식.
메시지 적용
messages.properties
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=취소
타임리프 메시지 적용
타임리프의 메시지 표현식#{...}
을 사용하면 스프링의 메시지를 편리하게 조회할 수 있다.
렌더링 전
<h2 th:text="#{label.item}"></h2>
렌더링 후
<h2>상품</h2>
[참고]
파라미터는 다음과 같이 사용할 수 있다.
hello.name=안녕 {0}
<p th:text="#{hello.name(${item.itemName})}">
국제화 적용
messages_en.properties
label.item=Item
label.item.id=Item ID
label.item.itemName=Item Name
label.item.price=price
label.item.quantity=quantity
page.items=Item List
page.item=Item Detail
page.addItem=Item Add
page.updateItem=Item Update
button.save=Save
button.cancel=Cancel
앞에서 모두 #{...}
를 사용해 같은 이름으로 메시지를 사용하도록 적용해두었기 때문에 확인만 하면 된다.
웹으로 확인
- 웹 브라우저의 언어 설정 값을 변경하여 국제화 적용을 확인할 수 있다.
- 크롬 -> 설정 -> 언어를 검색하여 우선 순위를 변경.
- 웹 브라우저의 언어 설정 값을 변경하면 요청시
Accept-Language
의 값이 변경된다. - 결국 스프링도
Locale
정보를 알아야 언어를 선택할 수 있는데, 스프링은 언어 선택시 기본으로Accept-Language
헤더의 값을 사용한다.
LocaleResolver
스프링은 Locale
선택 방식을 변경할 수 있도록 LocaleResolver
라는 인터페이스를 제공하는데, 스프링 부트는 기본으로 Accept-Language
를 활용하는 AcceptHeaderLocaleResolver
를 사용한다.
LocaleResolver 변경
만약 Locale
선택 방식을 변경하려면 LocaleResolver
의 구현체를 변경해서 쿠키나 세션 기반의 Locale
선택 기능을 사용할 수 있다.
(ex. 고객이 직접 Locale
을 선택)
정리
실제로 국제적으로 사용할 웹 서비스를 만들게 아니라면 국제화를 사용할 일은 많지 않다. 따라서, LocaleResolver를 변경해서 사용해야 한다면 관련 예제를 찾아보면 된다.
<출처 : 인프런 스프링 MVC 2편 - 백엔드 웹 개발 활용 기술(김영한)>
댓글남기기