퓨처디벨로퍼 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("안녕");
  1. locale 정보가 없으므로 messages 사용
  2. 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 선택방식이 변경된다.