메시지, 국제화
웹 페이지 혹은 코드에 사용되는 메시지를 한 곳에서 관리하도록 하는 기능을 메시지 기능이라 한다.
예를 들어 messages.properties라는 메시지 관리용 파일을 만들고 자바코드나 HTML에서 해당 데이터를 key 값으로 불러서 사용하는 것이다.
[메시지 사용 예 - messages.properties]
item=상품
item.id=상품
ID item.itemName=상품명
item.price=가격
item.quantity=수량
[메시지 사용 예 - HTML]
<label for="itemName" th:text="#{item.itemName}"></label>
위와 같은 메시지 기능에서 더 나아가 메시지 파일(messages.properteis)을 각 나라별로 별도로 관리하면 서비스를 국제화 할 수 있다.
[메시지 사용 예 - messages_en.properties]
item=Item
item.id=Item ID
item.itemName=Item Name
item.price=price
item.quantity=quantity
영어를 사용하는 사람이면 messages_en.properties를 사용하고, 한국어를 사용하면 기존의 messages.properties를 사용하면 된다.
이런 방식을 사용해서 사이트를 국제화 할 수 있다.
1. 스프링 메시지
메시지 관리 기능을 사용하려면 스프링이 제공하는 MessageSource를 스프링 빈으로 등록하고 메시지 소스를 직접 설정해주어야 한다.
다만, 스프링 부트를 사용하면 스프링 부트가 자동으로 MessageSource를 스프링 빈으로 등록한다.
※ MessageSource는 인터페이스이다.
실제로는 ResourceBundleMessageSource와 같은 구현체가 등록된다.
스프링 부트를 사용하면 application.properties에서 다음과 같이 메시지 소스를 설정할 수 있다.
[스프링 부트 메시지 소스 설정]
spring.messages.basename=messages,config.i18n.messages
메시지 소스를 위의 예제처럼 messages 라고 지정하면 messages.properties 파일을 읽어서 사용한다.
추가로 국제화 기능을 적용하려면 messages_en.properties 와 같이 파일명 마지막에 언어 정보를 주면 된다.
만약 찾을 수 있는 국제화 파일이 없으면 messages.properties를 기본으로 사용한다.
※ 스프링 부트 메시지 설정 기본 값은 spring.messages.basename=messages 이다.
■ 메시지 사용 - 자바 코드
메시지 파일은 다음과 같이 작성할 수 있다.
[메시지 사용 예 - messages.properies]
hello=안녕
hello.name=안녕 {0}
메시지 파일은 key & value로 구성되어있고 {}를 사용해서 매개변수를 받아 사용할 수도 있다.
자바 코드상에서는 MessageSource의 구현 객체를 사용해서 메시지 파일의 키값으로 메시지를 불러온다.
[메시지 사용 예 - 자바 코드]
public class MessageSourceTest {
@Autowired
MessageSource ms;
@Test
void helloMessage() {
String result = ms.getMessage("hello", Spring!, Locale.KOREA);
assertThat(result).isEqualTo("안녕");
}
}
getMessage() 메서드를 사용해서 메시지 파일의 메시지를 사용할 수 있다.
MesssageSource의 구현체를 사용해, ms.getMessage(code, args, locale) 의 형식으로 사용된다.
code는 메시지 파일의 key값이 사용되며, args는 매개변수를 뜻하고 locale은 국제화 코드를 의미한다.
locale이 없으면 기본 메시지 파일(messages.properties)을 조회한다.
위 예제의 결과는 "안녕 Spring" 이 된다.
2. 웹 어플리케이션 메시지 적용
[웹 어플리케이션 메시지 적용 - message.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=취소
타임리프의 메시지 표현식 #{...}을 사용하면 스프링의 메시지를 편리하게 조회할 수 있다.
예를 들어서 방금 위의 예제에서 등록한 상품이라는 이름을 조회하려면 #{lable.item} 이라고 하면된다.
[웹 어플리케이션 메시지 적용 - HTML]
<div th:text="#{label.item}"></h2>
파라미터는 다음과 같이 사용할 수 있다.
[웹 어플리케이션 메시지 적용 - 파라미터 전달]
<!-- hello.name=안녕 {0} -->
<p th:text="#{hello.name('Spring')}"></p>
<!-- = 안녕 Spring -->
웹 어플리케이션에서 국제화 메시지 사용 여부는 요청 헤더의 Accept-Language에 의해 결정된다.
ex) Accept-Language이 en이면 message_en.proerties가 사용된다.
스프링은 Locale 선택 방식을 변경할 수 있도록 LocalResolver라는 인터페이스를 제공하는데, 스프링 부트는 기본으로 Accept-Language를 활용하는 AcceptHeaderLocalResolver를 사용한다.
만약 Locale 선택 방식을 변경하려면 LocaleResolver의 구현체를 변경해서 쿠키나 세션 기반의 Locale 선택 기능을 사용 할수도 있다.
'Spring > 스프링 MVC 활용' 카테고리의 다른 글
#6 로그인 처리 - 쿠키, 세션 (0) | 2021.07.30 |
---|---|
#5 Bean Validation (0) | 2021.07.28 |
#4 검증 - Validation (0) | 2021.07.28 |
#2 타임리프 - 스프링 통합 폼 (0) | 2021.07.27 |
#1 타임리프 - 기본 기능 (0) | 2021.07.25 |
댓글