스프링 MVC(8)
메시지, 국제화
메시지
- 요구사항의 잦은 변화로 인해, 상품명이란 단어를 모두 상품이름으로 고쳐달라고 하면 서비스의 크기가 큰 경우 수십개 이상의 파일을 고쳐야한다.
- 위와 같은 다양한 메시지를 한 곳에서 관리하도록 하는 기능을 메시지 기능이라 한다.
예시
item=상품
item.id=상품 ID
item.itemName=상품명
item.price=가격
item.quantity=수량
위와 같이 설정하면 다음과 같이 해당 데이터를 key 값으로 불러서 사용할 수 있다.
<label for="itemName" th:text="#{item.itemName}"></label>
국제화
- 메시지에서 설명한 메시지 파일(messages.properties)을 각 나라별로 별도로 관리하면 서비스를 국제화 할 수 있다.(접속 지역에 따라 언어를 다르게 설정)
예시
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 를 사용 한다.
- 만약 위의 파일에 해당하는 지역이 없다면 messages.properties라는 default파일을 사용한다.
- 지역을 인식하는 방법은 HTTP accept-language헤더 값을 사용하거나 크롬의 경우 사용자가 직접 언어를 선택하도록하고, 쿠키를 사용한다.
스프링 메시지 직접 등록
- 메시지 관리 기능을 사용하려면 스프링이 제공하는 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 파일을 읽어서 사용
- 파일 위치는 /resources/messages.properties에 두면 된다.
- 여러 파일 한번에 지정가능 여기서는 messages,errors를 등록
- 국제화를 하려면 위와 같이 messages_en.properties, messages_ko.properties와 같이 파일명 마지막에 언어 정보를 주면 된다.
- defaultEncoding : 인코딩 정보를 지정한다.
스프링 부트 메시지 등록
- 스프링 부트를 사용하면 스프링 부트가 MessageSource를 자동으로 스프링 빈으로 등록한다.
스프링 부트 메시지 소스 설정
application.properties파일
spring.messages.basename=messages
->MessageSource 를 스프링 빈으로 등록하지 않고, 스프링 부트와 관련된 별도의 설정을 하지 않으면 messages 라는 이름으로 기본 등록된다. 따라서 messages_en.properties , messages_ko.properties , messages.properties 파일만 등록하면 자동으로 인식된다.
스프링 메시지 소스 사용
@SpringBootTest
public class MessageSourceTest {
@Autowired
MessageSource ms;
@Test
void helloMessage() {
String result = ms.getMessage("hello", null, null);
assertThat(result).isEqualTo("안녕");
}
}
- ms.getMessage(“hello”, null, null)
- code: hello
- args: null
- locale: null -> 위치 정보
@Test
void argumentMessage() {
String result = ms.getMessage("hello.name", new Object[]{"Spring"}, null);
assertThat(result).isEqualTo("안녕 Spring");
}
- hello.name= 안녕 {0} -> Spring 단어를 매개변수로 전달 -> 안녕 Spring
출처 - 김영한의 스프링 MVC 2편
Leave a comment