[스프링 MVC 2편] 메시지, 국제화 핵심 정리
by mini_min⏰ 시간 없어서 핵심만!
강의는 몇 개월 전에 듣고 정리는 2023년 끝나갈 때 쯤 하는 나....
메시지 란 ?
단어들을 변경해야할 때, 수십 개의 파일을 다 고칠 수 없잖아?
이럴 때 message.properties 라는 메시지 관리 파일을 만들고 해당 데이터를 key 값으로 불러 사용해준다.
item=상품
itemName=상품 이름
라고 메시지 프로퍼티 파일에 적어두면, HTML 에서 해당 데이터를 key 로 불러서 사용하면 된다.
그럼 "상품" 을 "아이템" 이라고 바꾸고 싶을 때, 메시지 프로퍼티 파일 하나만 수정해주면 되니까 아주 편리
<label for="itemName" th:text="#{item.itemName}"></label>
이렇게 item.itemName 을 text 로 설정하면 "상품 이름" 이 뜨겠다.
국제화 란?
국제화는 메시지에서 한 발 더 나아가서, 다른 언어용 프로퍼티를 사용해서 개발하는 것이다. "message_en.properties" 하나를 만들면 사이트를 국제화할 수 있다!
HTTP accept-language 헤더 값을 사용하면, 한국에서 접근하는지 영어에서 접근하는지 파악이 가능하다.
사용자가 직접 언어를 선택하거나 쿠키 등을 사용해서도 처리가 가능하다.
기본적으로 스프링은 메시지와 국제화 기능을 모두 제공한다.
스프링 메시지 소스 설정
1. MessageSource 스프링 빈을 등록한다. (MessageSource 는 인터페이스이고 구현체인 ResourceBundleMessageSource 를 스프링 빈으로 등록하면 된다. )
아, 스프링 부트는 자동으로 MessageSource 를 자동으로 빈에 등록한다.
@Bean
public MessageSource messageSource() {
ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
messageSource.setBasenames("messages", "errors");
messageSource.setDefaultEncoding("utf-8");
return messageSource;
}
🪄 basename : 설정 파일의 이름을 설정하면, 해당 메시지 프로퍼티 파일을 읽어서 사용한다. 기본적으로 message.properties 을 기본으로 사용하도록 되어있긴 하다.
🪄 파일 위치 : /resources/message.properties
스프링 부트는 application.properties 에 메시지 소스를 설정할 수 있다.
spring.messages.basename=messages,config.i18n.messages
스프링 메시지 소스 사용
MessageSource 인터페이스는 메시지를 일부 파라미터로 읽어오는 기능을 제공한다.
- 메시지가 없는 경우 기본 메시지 반환도 가능하다.
- 매개변수를 전달해 치환도 가능하다.
- local 정보를 기반으로 국제화 파일 선택도 가능하다. (Locale.KOREA)
public interface MessageSource {
String getMessage(String code, @Nullable Object[] args, @Nullable String defaultMessage, Locale locale);
String getMessage(String code, @Nullable Object[] args, Locale locale) throws NoSuchMessageException;
package hello.itemservice.message;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.context.MessageSource;
import static org.assertj.core.api.Assertions.*;
@SpringBootTest
public class MessageSourceTest {
@Autowired
MessageSource ms;
@Test
void helloMessage() {
String result = ms.getMessage("hello", null, null);
assertThat(result).isEqualTo("안녕");
}
@Test
void notFoundMessageCodeDefaultMessage() {
String result = ms.getMessage("no_code", null, "기본 메시지", null);
assertThat(result).isEqualTo("기본 메시지");
}
@Test
void defaultLang() {
assertThat(ms.getMessage("hello", null, null)).isEqualTo("안녕");
assertThat(ms.getMessage("hello", null, Locale.KOREA)).isEqualTo("안녕");
}
}
스프링 LocaleResolver
스프링은 Locale 선택을 변경할 수 있도록 LocaleResolver 라는 인터페이스를 제공한다. 스프링 부트는 기본으로 HTTP Accept-Language 를 활용하는 AcceptHeaderLocaleResolver 를 사용한다.
'Spring' 카테고리의 다른 글
[Spring MVC] 스프링 부트 로깅 (logging) 설정 (0) | 2023.08.22 |
---|---|
[스프링 MVC 1편] MVC - 구조의 이해 (0) | 2023.07.01 |
[스프링 MVC 1편] MVC 프레임워크 만들기 (3) - 어댑터 패턴 (0) | 2023.07.01 |
[스프링 MVC 1편] MVC 프레임워크 만들기 (2) (0) | 2023.07.01 |
[스프링 MVC 1편] MVC 프레임워크 만들기 (1) (0) | 2023.06.27 |
블로그의 정보
개발자 미니민의 개발로그
mini_min