2 분 소요


메시지

예를 들어 웹 페이지의 상품명을 모두 상품이름으로 바꾼다고 한다면, 여러 화면에 있는 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편 - 백엔드 웹 개발 활용 기술(김영한)>

댓글남기기