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

지현·2021년 12월 30일
0

스프링

목록 보기
24/32
post-custom-banner

메시지, 국제화 소개

메세지

  • 하드코딩 되어있는 단어들을 별도의 파일에서 관리하도록 하는 기능
  • 메세지를 관리하는 곳에서 내용을 변경하면 한번에 모든 파일에 변경된 내용이 적용됨

국제화

  • 메시지에서 설명한 메시지 파일을 각 나라별로 별도로 관리하면 서비스를 국제화할 수 있음
  • 한국에서 접근한 것인지 영어에서 접근한 것인지는 인식하는 방법은 HTTP accept-language 헤더 값을 사용하거나 사용자가 직접 언어를 선택하도록 하고, 쿠키 등을 사용해서 처리

스프링 메시지 소스 설정

  • 스프링은 기본적인 메시지 관리 기능을 제공
  • 메시지 관리 기능을 사용하려면 스프링이 제공하는 MessageSource 를 스프링 빈으로 등록해야 함
  • 스프링 부트를 사용하면 스프링 부트가 MessageSource 를 자동으로 스프링 빈으로 등록

스프링 부트 메시지 소스 설정
application.properties

spring.messages.basename=messages
  • 스프링 부트 메시지 소스 기본 값
  • MessageSource를 스프링 빈으로 등록하지 않고, 스프링 부트와 관련된 별도의 설정을 하지 않으면 messages라는 이름으로 기본 등록됨
  • 나머지 옵션은 여기서 확인

메세지 만들기

  • messages.properties :기본 값으로 사용
  • messages_en.properties : 영어 국제화 사용

messages.properties

hello=안녕
hello.name=안녕 {0}
  • 파라미터 받는 것도 가능

스프링 메시지 소스 사용

@SpringBootTest
public class MessageSourceTest {

    @Autowired
    MessageSource ms;

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

}
  • ms.getMessage(code, args, locale)
  • locale 정보가 없으면 basename에서 설정한 기본 이름 메시지 파일을 조회
    @Test
    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)를 사용하면 기본 메시지가 반환
    @Test
    void argumentMessage(){
        String message=ms.getMessage("hello.name", new Object[]{"Spring"},null);
        assertThat(message).isEqualTo("안녕 Spring");
    }
  • 파라미터를 사용하려면 매개변수 Object 배열을 넘겨줘야 함

웹 애플리케이션에 메시지 적용하기

타임리프 메시지 적용

  • 타임리프의 메시지 표현식 #{...} 를 사용하여 스프링의 메시지를 편리하게 조회
    <div th:text="#{label.item}"></h2>

파라미터 적용하는 법
hello.name=안녕 {0}
<p th:text="#{hello.name(${item.itemName})}"></p>


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

messages_en.properties에 영어 메세지를 추가하고 #{...} 를 통해서 메시지를 사용하도록 하면 알아서 국제화 적용됨

  • 웹 브라우저의 언어 설정 값을 변경하면서 국제화 적용을 확인하면 됨
  • 웹 브라우저의 언어 설정 값을 변경하면 요청시 Accept-Language 의 값이 변경
  • 스프링은 언어 선택시 기본으로 Accept-Language 헤더의 값을 사용

LocaleResolver

  • 스프링은 Locale 선택 방식을 변경할 수 있도록 LocaleResolver 라는 인터페이스를 제공
  • Locale 선택 방식을 변경하려면 LocaleResolver의 구현체를 변경해서 쿠키나 세션 기반의 Locale 선택 기능을 사용할 수 있음


출처
[인프런] 스프링 MVC 2편 - 백엔드 웹 개발 활용 기술

post-custom-banner

0개의 댓글