강의 링크는 아래와 같습니다.
https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-mvc-2/dashboard
메시지
예시를 들어보자. HTML 태그에서 모든 label에 있는 메시지를 변경한다고 생각해보자. 그러면 HTML 파일에 메시지가 하드 코딩되어 있어서 한 땀 한 땀 전부 수정해야 할 것이다.
이런 다양한 메시지를 한 곳에서 관리하도록 하는 기능을 메시지 기능이라고 한다
예를 들어서 message.properteis라는 메시지 관리용 파일을 만들고
item=상품
item.id=상품 ID
item.itemName=상품명
item.price=가격
item.quantity=수량
각 HTML들은 다음과 같이 해당 데이터를 key 값으로 불러서 사용하는 것이다.
<label for='itemName' th:text="#{item.itemName}"></label>
국제화
메시지에서 설명한 메시지 파일(message.properties)을 나라별로 별도로 관리하면 서비스를 국제화할 수 있다.
예를 들어서 다음과 같이 2개의 파일을 만들어서 분류한다.
messages_en.properties
item=Item
item.id=Item ID
item.itemName=Item Name
item.price=price
item.quantity=quantity
messages_ko.properties
item=상품
item.id=상품 ID
item.itemName=상품명
item.price=가격
item.quantity=수량
영어를 사용하는 사람이면 messages_en.properties를 사용하고,
한국어를 사용하는 사람이면 messages_ko.properties를 사용하게 개발하면 된다.
이렇게 사용하면 사이트를 국제화할 수 있다.
한국에서 접근한 것인지 영어에서 접근한 것인지는 인식하는 방법은 HTTP accept-language 해더 값을 사용하거나 사용자가 직접 언어를 선택하도록 하고, 쿠키 등을 사용해서 처리하면 된다.
메시지와 국제화 기능을 직접 구현할 수도 있겠지만, 스프링은 기본적인 메시지와 국제화 기능을 모두 제공한다. 그리고 타임리프도 스프링이 제공하는 메시지와 국제화 기능을 편리하게 통합해서 제공한다.
스프링 메시지 소스 설정
메시지 관리 기능을 사용하려면 스프링이 제공하는 MessageSource를 스프링 빈으로 등록하면 되는데,
MessageSourcesms 인터페이스다. 따라서 구현체인 ResourceBundleMesageSource를 스프링 빈으로 등록하면 된다.
직접 등록해보자.
@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 에 두면 된다.
- 여러 파일을 한 번에 지정할 수 있다. 여기서는 messages , errors 둘을 지정했다.
- defaultEncoding : 인코딩 정보를 지정한다. utf-8을 사용하면 된다.
스프링 부트를 사용하면 다음과 같이 메시지 소스를 설정할 수 있다.
application.properties
spring.messages.basename=messages,config:i18n.messages
스프링 부트 메시지 소스 기본 값은
spring.messages.basename=messages이다.
MessageSource를 스프링 빈으로 등록하지 않고, 스프링 부트와 관련된 별도의 설정을 하지 않으면 messages라는 이름으로 기본 등록된다. 따라서 messages_en.properties , messages_ko.properties , messages.properties 파일만 등록하면 자동으로 인식된다.
주의!!! 파일명은 message가 아니라 messages다! 마지막 s에 주의하자.
/resources/messages.properties
hello=안녕 hello.name=안녕 {0}
/resources/messages_en.properties
hello=hello
hello.name=hello {0}
MessageSource 인터페이스를 확인하면 getMessage메서드를 이용해 코드를 포함한 일부 파라미터로 메시지를 읽어오는 기능을 제공한다.
메시지 소스를 어떻게 사용하는지 코드를 통해 짧게 알아보겠다.
@springBootTest
public class MesageSourceTest{
@Autowired
MessageSource ms;
@Test
void helloMesage(){
String result=ms.getMessage("hello",null,null);
assrtThat(result).isEqualTo("안녕");
}
}
getMessage 메서도의 매개변수는
- 첫 번째 자리 - code
- 두 번째 자리 - args
- 세 번째 자리 -locale
이렇게 나누어진다. locale 정보가 없으면 basename에서 설정한 기본 이름 메시지 파일을 조회한다.
@Test
void argumentMessage() {
String result = ms.getMessage("hello.name", new Object[]{"Spring"}, null);
assertThat(result).isEqualTo("안녕 Spring");
}
다음 메시지의 {0} 부분은 매개변수를 전달해서 치환할 수 있다.
hello.name=안녕 {0} -> Spring 단어를 매개 변수로 전달 -> 안녕 Spring
국제화 파일 선택
locale 정보를 기반으로 국제화 파일을 선택한다.
Locale이 en_US의 경우 messages_en_US messages_en messages 순서로 찾는다.
Locale에 맞추어 구체적인 것이 있으면 구체적인 것을 찾고, 없으면 디폴트를 찾는다고 이해하면 된다.
예시 코드는 아래와 같다.
@Test
void defaultLang() {
assertThat(ms.getMessage("hello", null, null)).isEqualTo("안녕");
assertThat(ms.getMessage("hello", null, Locale.ENGLISH)).isEqualTo("hello");
}
타임리프 메시지에 적용하려면 타임리프의 메시지 표현식 #{...}를 사용하면 스프링의 메시지를 편리하게 조회할 수 있다.
예를 들어서 방금 등록한 상품이라는 이름을 조회하려면 #{label.item}이라고 하면 된다.
물론 messages.properties 안에는 label.item=상품이라는 코드가 적혀 있다.
렌더링 전은 아래와 같다.
<div th:text="#{label.item}"></div>
렌더링 후는 아래와 같다.
<div>상품</div>
웹에서 국제화 적용은 간단하다.
웹 브라우저의 언어 설정 값을 변경하면 된다. 크롬의 경우를 생각해보면,
크롬 브라우저 -> 설정 -> 언어를 검색하고, 우선순위를 변경하면 된다.
우선순위를 영어로 변경하고 테스트해보자.
웹 브라우저의 언어 설정 값을 변경하면 요청 시 Accept-Language의 Accept-Language의 값이 변경된다.
우리가 messages_en.properties라는 파일의 값도 동일하게 작성해 놓았다면 #{..}를 통해 국제화가 동일하게 적용된다.
국제화는 정말 간편하게 구현할 수 있다!!!
LocaleResolver
스프링은 Locale 선택 방식을 변경할 수 있도록 LocaleResolver라는 인터페이스를 제공하는데, 스프링 부트는 기본으로 Accept-Language를 활용하는 AcceptHeaderLocaleResolver를 사용한다.
LocaleResolver 변경
만약 Locale 선택 방식을 변경하려면 LocaleResolver의 구현체를 변경해서 쿠키나 세션 기반의 Locale 선택 기능을 사용할 수 있다.
이상으로 포스팅을 마치겠습니다.
댓글