스프링은 이러한 메시지 관리와 국제화 기능을 모두 제공한다.
하드코딩된 메시지(TW)를 특정 파일에서 일관되게 관리하도록 하는것을 말한다.(messages.properties)
왜 이렇게 관리해야하냐면... 만약 특정 화면의 제목을 변경해야하는 경우, 이 제목은 소스 코드에 하드 코딩되어있는게 아니라 메시지 파일에서만 바꿔주면 소스 코드의 변경 없이 요구 사항을 반영할 수 있게 된다.
(일관성을 갖는다.)
스프링에서 메시지 관리 기능을 제공하기 위해서 MessageSource를 스프링 빈으로 등록해야하는데, 스프링 부트를 사용하는 경우 자동으로 스프링빈으로 등록해주긴 한다고 한다.
@Bean
public MessageSource messageSource() {
ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
messageSource.setBasenames("messages", "errors");
messageSource.setDefaultEncoding("utf-8");
return messageSource;
}
MessageSource는 messages와 errors 라는 파일을 자동으로 읽어서 사용한다.(위 코드가 디폴트로 스프링 부트에서 스프링빈으로 추가해줌)
따라서, messages로 지정하면 messages.properties 파일을 읽어서 사용하며, 여기에 국제화 기능을 적용하려면 messages_en.properties, messages_ko.properties와 같이 파일명 마지막에 언어 정보를 주면 된다.
만약 국제화 파일을 찾을 수 없다면 messages.properties 를 기본으로 사용한다.
파일의 위치는 /resources/messages.properties 에 둔다.
스프링 부트를 쓰면 MessageSource를 스프링빈으로 자동으로 등록해준다고 한다.
그리고 스프링부트에서 MessageSource를 설정하기 위해서 application.properties파일에 아래와 같이 적는다.
spring.messages.basename=messages
만약 스프링빈으로 등록하지 않고, 별도의 설정을 하지 않는다면 messages라는 이름으로 기본 등록된다.
MessageSource는 messages.properties 파일을 읽어서 값을 반환해주는 역할을 수행한다.
스프링빈으로 등록된 MessageSource를 이용해서 메시지를 가져올 수 있다.
사용 예시는 아래와 같다.
@Autowired
MessageSource ms;
@Test
void whatMessage() {
String result = ms.getMessage("what", null, null);
assertThat(result).isEqualTo("뭐야");
}
getMessage의 매개변수는 첫번째부터 code, args, locale 값이 된다.
국제화는 메시지 파일(messages.properties)을 각 나라별로 별도로 관리하면 서비스를 국제화할 수 있다
해당 포스팅은 아래의 강의를 공부 후 개인적으로 정리한 내용입니다.
김영한님의 SpringMVC1편- 메시지,국제화