ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Spring MVC 2 - 국제화/메시지
    Web/Spring 2023. 10. 24. 14:44

     

    1. 메시지/국제화 기능이란

     

    - 만약 html에 출력하는 상품명 -> 상품이름으로 모두 고쳐야할 경우 

    - 모든 상품명에 찾아서 이를 모두 수정해야한다. (하드코딩 되어 있다)

    - 메시지는 이러한 것들을 한번에 관리하도록 기능을 제공한다.

    item=상품
    item.id=상품 ID
    item.itemName=상품명
    item.price=가격
    item.quantity=수량
    
    addForm.html
    <label for="itemName" th:text="#{item.itemName}"></label>
    
    editFrom.html
    <label for="itemName" th:text="#{item.itemName}"></label>

    - 국제화는 이러한 메시지 기능에서 한발 더 나아가, 나라별로 보여줄 메시지를 한번에 관리할 수 있게한다.

    - acept-language값을 사용하거나, 사용자가 선택하도록하여 쉽게 다른 언어로 치환할 수 있다.

     

    2. 스프링 메시지 소스 설정 

     

    - 스프링은 기본적인 메시지 관리 기능을 제공한다. MessageSource를 스프링 빈으로 등록하면된다.

      (구현체 ResourceBundleMessageSource)

     

    @Bean
    public MessageSource messageSource() {
     ResourceBundleMessageSource messageSource = new
    ResourceBundleMessageSource();
     messageSource.setBasenames("messages", "errors");
     messageSource.setDefaultEncoding("utf-8");
     return messageSource;
    }

    - basenames: 메시지 파일 이름 지정 (messages -> messages.properties)

                           파일명 마지막에 언어정보 추가하면, 국제화 기능 실행 -> 없으면 언어정보 없는 파일 실행함

                            파일 위치는 /resources밑에 두자 

     

    2.1 스프링부트 : 스프링부트는 자동으로 MessageSource를 자동으로 등록함! 따라서 다음과 같이 메시지 소스 설정 가능

    //application.properties
    spring.messages.basename=messages,config.i18n.messages

    - 기본값이 messages로 되어 있다.

     

    2.2 messages.properties파일 만들기 

    hello=안녕
    hello.name=안녕 {0}

    - {} 메시지 매개변수로 전달될 값 

     

    3. 스프링 메시지 소스 사용

     

    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;

    - MessageSource는 파라미터를 통해 메시지를 읽어오는 기능 제공 

    - code는 hello나 hello.name같은 키 값, Object는 {0}값에 넣어줄 것, default나, Locale정보 넣을 수 있다.

    - 해당 코드에 메시지가 없는 경우 NoSuchMessageException 발생한다.!

    - Locale정보는 en_US면 -> messages_en_US -> message_en 순서 (구체적 -> 단순한것)

     

    *Locale정보가 null이면 Locale.getDefault()를 호출해서 알아서 사용함! 

     

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

     

    label.item=상품
    label.item.id=상품 ID
    label.item.itemName=상품명
    label.item.price=가격
    label.item.quantity=수량
    page.items=상품 목록
    page.item=상품 상세
    page.addItem=상품 등록
    page.updateItem=상품 수정
    button.save=저장
    button.cancel=취소

    - 메시지 등록, 해당 메시지 코드로 값을 읽어오면됨!!

     

    4.1 타임리프 메시지 적용 

     

    메시지 표현식 #{}을 사용하면 스프링 메시지를 편리하게 조회할 수 있다.

    ex #{page.addItem}

     

    -> 메시지 넣으려는 태그에 th:text="#{label.item.itemName}" 사용하면 렌더링시에 content를 바꿔줌 

     

    4.2 타임리프에서 메시지에 파라미터 넣기 

     

    <p th:text="#{hello.name(${item.itemName})}"</p>

    메시지 코드에 파라미터 전달하듯이 넣어주면 된다.

     

    위와 같이 메시지를 효율적으로 관리할 수 있다.

     

    5. 국제화 적용하기

     

    - messages_en.properties같은 파일 추가

    - 요청시 Accept-Language 값을 변경하면됨 

    - 스프링은 Locale정보를 알아야 선택 -> 기본으로 Accept-Laguage 헤더 값 사용

     

    5.1 LocaleResolver 

     

    스프링은 Locale 선택 방식을 변경할 수 있도록 LocaleResolver인터페이스 제공 

    이때 기본적으로 AcceptHeaderLocaleResolver사용 (Accept 헤더값 사용)

     

    5.2 LocaleResolver 인터페이스 

     

    public interface LocaleResolver {
    Locale resolveLocale(HttpServletRequest request);
    void setLocale(HttpServletRequest request, @Nullable HttpServletResponse 
    response, @Nullable Locale locale);
    }

    만약 Locale 선택 방식을 변경하려면, LocaleResolver 구현체 변경하거나, 쿠키나 세션 기반으로 Locale 선택

    기능을 사용할 수 있다. -> 나중에 더 찾아보자(필요시)

     

     

     

     

Designed by Tistory.