SpringBoot/스프링 MVC 1편-백엔드 웹 개발 핵심 기술
3. 메시지, 국제화
퓨처디벨로퍼
2022. 8. 8. 12:57
목차
1. 메시지, 국제화 소개2. 스프링 메시지 소스 설정
3. 스프링 메시지 소스 사용
4. 웹 애플리케이션에 메시지 적용하기
5. 웹 애플리케이션에 국제화 적용하기
1. 메시지, 국제화 소개
메시지
- 만약, 상품명-> 상품이름으로 고친다면 화면들을 찾아가면서 변경해야한다.
- 다양한 메시지를 한 곳에서 관리하도록 하는 기능이 메시지 기능이다.
- 사용법:
<messages.properties>
item=상품
item.id=상품 ID
item.itemName=상품명
item.price=가격
item.quantity=수량
<addForm.html>
<label for="itemName" th:text="#{item.itemName}"></label>
국제화
- messages.properties를 각 나라별로 별도로 관리
- <messages_en.properties>, <messages_ko.properties> 파일을 만들어 관리한다.
- 접근 국가 인식 방법: HTTP accept-language 해더 값을 사용하거나, 사용자가 직접 언어를 선택하도록하고 쿠키 등을 사용해 처리한다.
- 스프링은 기본적인 메시지와 국제화 기능 모두 제공한다.
2. 스프링 메시지 소스 설정
스프링의 MessageSource 스프링 빈 등록
- 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 에 둔다.
- 여러 파일을 한번에 지정할 수 있다. 여기서는 messages , errors 둘을 지정했다.
- defaultEncoding : 인코딩 정보를 지정한다. utf-8 을 사용하면 된다.
스프링 부트의 MessageSource 자동 스프링빈 등록
- 메시지 소스 설정
<application.properties>spring.messages.basename=messages
- 별도의 설정을 하지 않으면 message라는 이름으로 기본 등록된다.
메시지 파일 만들기
</resources/messages.properties>
hello=안녕
hello.name=안녕 {0}
- 기본값으로 사용(한글)
</resources/messages_en.properties>
hello=hello
hello.name=hello {0}
- 영어 국제화 사용
3. 스프링 메시지 소스 사용
사용
String result = ms.getMessage("hello", null, null);
- code
- args
- locale: 없으면 basename에서 설정한 기본 이름 메시지 파일을 조회한다.
메시지가 없는 경우, 기본 메시지
void notFoundMessageCode() {
assertThatThrownBy(() -> ms.getMessage("no_code", null, null))
.isInstanceOf(NoSuchMessageException.class);
}
@Test
void notFoundMessageCodeDefaultMessage() {
String result = ms.getMessage("no_code", null, "기본 메시지", null);
assertThat(result).isEqualTo("기본 메시지");
}
- 메시지가 없는 경우에는 NoSuchMessageException 이 발생한다.
- 메시지가 없어도 기본 메시지( defaultMessage )를 사용하면 기본 메시지가 반환된다.
매개변수 사용
String result = ms.getMessage("hello.name", new Object[]{"Spring"}, null);
- 메시지의 {0} 부분은 매개변수를 전달해서 치환할 수 있다.
국제화 파일 선택
- locale 정보를 기반으로 국제화 파일을 선택한다.
- locale = null 인 경우 시스템 기본 locale 이 ko_KR 이면 messages_ko.properties 조회시도 => 조회 실패 messages.properties 조회
1. assertThat(ms.getMessage("hello", null, null)).isEqualTo("안녕");
2. assertThat(ms.getMessage("hello", null, Locale.KOREA)).isEqualTo("안녕");
- locale 정보가 없으므로 messages 사용
- locale 정보가 있지만, message_ko가 없으므로 messages 사용
assertThat(ms.getMessage("hello", null,Locale.ENGLISH)).isEqualTo("hello");
- ms.getMessage("hello", null, Locale.ENGLISH) : locale 정보가 Locale.ENGLISH 이므로 messages_en 을 찾아서 사용
4. 웹 애플리케이션에 메시지 적용하기
타임리프 메시지 적용
- #{...} 사용
<div th:text="#{label.item}"></h2>
5. 웹 애플리케이션에 국제화 적용하기
웹으로 확인하기
- 크롬 브라우저 => 설정 => 언어검색, 우선순위 변경
- 언어 설정 값을 변경하면 요청시 Accept-Language값이 변경된다.
스프링의 국제화 메시지 선택
- 스프링은 언어 선택시 기본으로 Accept-Language 헤더 값을 사용한다.
- Locale 선택 방식 변경
- LocaleResolver 인터페이스 제공
- 스프링 부트는 기본으로 Accept-Language 를 활용하는 AcceptHeaderLocaleResolver 를 사용
- 면 LocaleResolver 의 구현체를 변경하면 Locale 선택방식이 변경된다.