메시지, 국제화 란?
메시지
- 화면에 보이는 문구 '상품명'이라는 단어를 모두 '상품 이름' 으로 고쳐야 한다고 해보자.
- 지금처럼 화면 수가 적어도 귀찮은데, 화면이 수십 수백개라면 모두 고쳐야한다.
- 해당 HTML 파일에 메시지가 하드코딩 되어 있기 때문에 이런 문제가 생기는 것이다
- 이러한 다양한 메시지를 한 곳에서 관리하도록 하는 기능을 메시지 기능이라 한다.
국제화
- 메시지에서 설명한 메시지 파일을 각 나라별로 관리하면 서비스를 국제화 할 수 있다.
- 한국어, 영어로 따로 나눠 메시지를 관리해서 국제화 시킬 수 있다.
- HTTP
accept-language
헤더 값을 사용하거나, 사용자가 직접 언어를 선택하도록 하고, 쿠키 등을 사용해서 처리하면 된다.
이런 메시지, 국제화 기능을 직접 구현할 수 도 있지만 스프링은 기본적인 메시지와 국제화 기능을 모두 제공한다. 타임리프도 스프링이 제공하는 메시지와 국제화 기능을 편리하게 통합해서 제공한다.
하나씩 알아보도록 하자.
스프링은 기본적인 메시지 관리기능을 제공한다. 스프링이 제공하는 MessageSource
를 스프링 빈으로 등록하면 되는데, 구현체인 ResourceBundleMessageSource
를 스프링 빈으로 등록하면 된다.
스프링 부트를 사용하면 스프링 부트가 MessageSource
를 자동으로 스프링 빈으로 등록한다.
스프링 부트는 다음과 같이 메시지 소스를 설정할 수 있다.
applictaion.properties
spring.messages.basename=messages // 기본 디폴트값.(안넣어줘도 됨)별도의 설정을 하지 않으면 messages라는 이름을 기본으로 등록된다.
messages_en.properties , messages_ko.properties , messages.properties을 자동으로 인식한다.
messages.propertis
hello=안녕
hello.name=안녕 {0}
------
@Autowired
MessageSource ms;
ms.getMessage("hello", null, null);
ms.getMeesage("hello.name", new Object[]{"Spring"}, null);
getMessage에 순서대로 code, args, locale이 들어온다.
getMessage(code, args, locale);
getMessage(code, args, defaultMessage, locale);
두가지 메서드를 오버로드 해놨고, 필요에 따라 사용하면 된다.
locale 정보가 없으면 basename에서 설정한 기본 이름 메시지 파일을 조회한다. 별다른 설정이 없다면 messages를 지정했으므로 messages.properties 파일에서 데이터를 조회.
이것을 실제 적용할때는 어떻게 해야 될까?
label.item.itemName=상품명
label.item.price=가격
label.item.quantity=수량
page.addItem=상품등록
button.save=저장
button.cancle=취소
타임 리프의 적용
<h2 th:text="#{page.addItem}">상품</h2>
사용하기 매우 간편하다. #{등록명} 이렇게 넘기면 타임리프가 알아서 설정을 읽어와서 넣어준다. 이제 우리는 한곳에서 쉽게 수정이 가능하다.
참고로 파라미터는 다음과 같이 사용할 수 있다.
hello.name=안녕 {0}
<p th:text="#{hello.name(${item.itemName})}"></p>
()안에 넣고 싶은 값을 넣으면 된다.
타임리프
사실 할 게 없다.
messages_en.properties 를 기존의 messages.properties와 형식을 같이해서 한글 등록이 되어 있는 부분을 영어로 바꿔주기만 하면 된다.
이것은 사용자의 웹 브라우저 Accept-Language에 따라 한국어를 받을지 영어를 받을지, 다른 언어를 받을지를 결정한다. 영어가 가장 우선순위가 높은 유저가 들어온다면, 영어를 제공해주는 것이다.
만약 제공 받고 싶은 언어를 홈페이지에서 제공하지 않는다면 그 홈페이지의 기본으로 설정된 언어를 받는다.
스프링의 국제화 메시지 선택
스프링은 앞서 봤던 MessageSource에서 보았듯이 Locale
정보를 알아야 언어를 선택 가능하다. 그런데 스프링은 언어 선택시 기본으로 Accept-Language
헤더값을 사용한다.
LocaleResolver라는 인터페이스도 이미 존재하고, 스프링 부트는 기본으로 Accept-header를 활용하는 AcceptHeaderLocaleResolver를 사용한다.
만약 Locale 선택 방식을 변경하려면 LocaleResolver의 구현체를 변경해 쿠키나 세션 기반의 Locale 선택기능을 사용 가능하다. (ex 고객이 직접 Locale 선택)