[스프링 MVC 2편] 3. 메시지, 국제화

조은지·2023년 8월 15일

메시지

  • 예시 ) html 파일 내 상품명 텍스트를 모두 상품이름으로 고쳐달라는 요청
  • 방법 1) html 하드코딩 수정
  • 방법 2) message.properties 라는 메시지 관리용 파일을 활용하여 수정
item=상품
item.id=상품 ID
item.itemName=상품명
item.price=가격
item.quantity=수량

properties 파일에 key, value 형식으로 저장하여 사용


국제화

  • messages.properties를 각 나라별로 별도로 관리하면 서비스를 국제화 할 수 있다.
  • messages_ko.properties , messages_en.properties 의 파일을 분리하여 제공
  • HTTP내의 accept-language 헤더 값을 사용, 사용자가 직접 언어 선택, 쿠키 활용

스프링 메시지 소스 설정

스프링은 기본적인 메시지 관리 기능을 제공한다.

MessageSource를 스프링 빈으로 등록하면 되는데

스프링에서는 MessageSource 인터페이스의 구현체인 ResourceBundleMessageSource를 스프링 빈으로 자동으로 등록해주고 있다.


스프링 부트 메시지 소스 설정

spring.messages.basename=messages

application.properties 파일 내에서 설정 파일의 이름을 지정할 수 있다.
(기본 경로는 /resources/messages.properties)


스프링 메시지 소스 사용

1. 성공 테스트

 @Test
 void helloMessage() {
 String result = ms.getMessage("hello", null, null);
 assertThat(result).isEqualTo("안녕");
 }

messages.propertieshello라는 키가 존재하는 경우 데이터를 조회한다.

2. 실패 테스트 (메시지가 없는 경우)

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("기본 메시지");
}
  1. 메시지가 없는 경우 NoSuchMessageException 이 발생한다.
  2. 메시지가 없어도 기본 메시지( defaultMessage )를 사용하면 기본 메시지가 반환된다

국제화 파일 선택

  • locale 정보를 기반으로 국제화 파일을 선택한다.
  • Locale이 en_US 의 경우 messages_en_US messages_en messages 순서로 찾는다.
  • Locale 에 맞추어 구체적인 것이 있으면 구체적인 것을 찾고, 없으면 디폴트를 찾는다.

추가) locale 정보가 없는 경우 Locale.getDefault()를 호출해서 시스템의 기본 로케일을 사용한다.


*타임리프에서의 메시지 처리 문법은 생략


웹 애플리케이션에 국제화 적용하기

각 언어 별 messages.properties를 추가해주면 스프링 내에서 자동으로 국제화 처리를 해줌

어떻게 언어를 찾는가?

LocaleResolver

스프링은 Locale 선택 방식을 변경할 수 있도록 LocaleResolver 라는 인터페이스를 제공하는데, 스프링 부트는 기본으로 Accept-Language 를 활용하는 AcceptHeaderLocaleResolver 를 사용한다

LocaleResolver 변경

  • LocaleResolver의 구현체를 변경해서 쿠키나 세션 기반의 Locale 선택 기능을 활용할 수 있다.

예시) 쿠키를 사용해서 언어를 판단하고 싶은 경우

@Bean 
public LocaleResolver localeResolver() {
    CookieLocaleResolver localeResolver = new CookieLocaleResolver();
    localeResolver.setCookieName("lang");
    localeResolver.setDefaultLocale(new Locale("ko"));
    localeResolver.setCookieHttpOnly(true);
    return localeResolver;

CookieLocaleResolver 를 구현체로 갖는 스프링 빈을 등록한다.

1개의 댓글

comment-user-thumbnail
2023년 8월 15일

많은 도움이 되었습니다, 감사합니다.

답글 달기