본문 바로가기
Spring/스프링 MVC 활용

#3 메시지, 국제화

by 히포파타마스 2021. 7. 27.

메시지, 국제화

 

웹 페이지 혹은 코드에 사용되는 메시지를 한 곳에서 관리하도록 하는 기능을 메시지 기능이라 한다.

 

예를 들어 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

댓글