RE-Heat 개발자 일지

스프링 MVC 2편 - [3] 메시지·국제화 본문

백엔드/스프링

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

RE-Heat 2023. 7. 13. 19:40

https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-mvc-2/dashboard

 

스프링 MVC 2편 - 백엔드 웹 개발 활용 기술 - 인프런 | 강의

웹 애플리케이션 개발에 필요한 모든 웹 기술을 기초부터 이해하고, 완성할 수 있습니다. MVC 2편에서는 MVC 1편의 핵심 원리와 구조 위에 실무 웹 개발에 필요한 모든 활용 기술들을 학습할 수 있

www.inflearn.com

인프런 김영한 님의 스프링 MVC 2편 강의를 토대로 정리한 내용입니다.

 

[1] 메시지, 국제화 소개

■ 메시지

 화면문구를 상품명에서 상품이름으로 바꿔야 할 때 모든 HTML을 일일이 고치면 상당히 번거로운 일이 될 것이다. 그래서 스프링에선 이런 다양한 메시지를 한 곳에서 관리하는 기능을 제공하고 이를 메시지 기능이라 한다.

 

예를 들어 messages.properties라는 관리용 파일을 만들고 각 HTML에서 해당 데이터를 key 값으로 불러서 사용하는 방법이 있다.

 

    ▶ messages.properties

        item.itemName=상품명

    ▶ addFrom.html

        <lable for="itemname" th:text="#{item.itemName}"></label>

 

■ 국제화

message.properties를 각 나라별로 별도로 관리하면 서비스를 국제화할 수 있다. 영어판, 한국판을 따로 제공할 수 있다는 뜻이다.

 

    ▶messages_en.properties

        item=Item
        item.id=Item ID

        item.itemName=Item Name
        item.price=price
        item.quantity=quantity

 

HTTP accept-language 헤더값이나 사용자가 직접 언어를 선택하도록 하고, 영어를 사용하는 사람이면 message_en.properties를 한국은 message.properties를 사용하게 개발하면 된다.

 

 

 

[2] 스프링 메시지 소스 설정

메시지 관리 기능을 사용하는 방법은 두 가지가 있다.

① 스프링이 제공하는 MessageSource를 스프링 빈으로 등록하기

② 스프링부트가 MessageSource를 자동으로 스프링 빈으로 등록하도록 설정하기

 

1] 직접 MessageSource를 등록하기

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

- basenames는 설정 파일의 이름을 지정.

    messages로 지정하면 message.properties 파일을 읽어서 사용한다.

    국제화 기능을 사용하려면 파일명 마지막에 언어 정보(messages_en.properties)를 주면 된다.

    파일의 위치는 /resources/messages.properties에 둬야 한다.

    여러 파일을 한 번에 지정할 수 있다. 위 코드를 보면 messages, errors 둘을 지정한 것을 볼 수 있다.

- defaultEncoding : 인코딩 정보를 사용한다. 여기선 한글이 깨지지 않도록 utf-8을 사용한다.    

 

2] 스프링 부트 설정

스프링 부트 메시지 소스의 기본값으로 MessageSource를 스프링 빈으로 등록하지 않고, 별도 설정을 하지 않으면 messages라는 이름으로 기본 등록된다. 따라서 message_en.properties, messages_ko.properties, messages.properties 파일만 등록하면 자동으로 인식된다.

 

참고] application.properties의 추가설정을 알고 싶으면 아래 스프링 부트 공식 문서를 확인하면 된다.

https://docs.spring.io/spring-boot/docs/current/reference/html/application-properties.html#appendix.application-properties

 

 

[3] 스프링 메시지 소스 사용

 

MessageSource 인터페이스

MessageSource 인터페이스를 확인하면 일부 파라미터로 메시지를 읽어오는 기능을 제공하는 것을 확인할 수 있다.

 

MessageSourceTest

메시지 코드로 hello로 입력하고 나머지 값은 null값을 넣었다. locale 정보가 없는 것을 확인할 수 있는데, 이러면 스프링은 basename에서 설정한 기본 이름 메시지 파일(messages.properties)을 조회한다. 

 

▶ 메시지가 없을 때

메시지가 없을 땐 NoSuchMessageException이 발생한다.

 

▶ 기본 메시지

메시지가 없을 때를 대비해 defaultMessage를 던져주면 notFoundEmssageCodeDefualtMessage에서 "기본 메시지"를 반환한다.

 

▶ 매개변수 사용

messages.properties

messages.properties의 {0} 부분을 매개변수(new Object[]{"Spring"})를 전달해 치환할 수 있다. 

 

▶ 국제화 파일 선택

① defaultLang()

1] locale 정보가 없으므로 Locale.getDefault()를 호출해 시스템 기본 로케일을 사용한다.

    ex) locale=null → 시스템 기본 locale이 ko_KR이므로 message_ko.properties 조회 조회 실패

          → messages.properties 조회

2] locale 정보(Locale.KOREA)가 있지만, message_ko가 없으므로 messages 조회

 

② enLang()

1] locale 정보가 Locale.ENGLISH이므로 messages_en을 찾아서 사용한다.

 

 

 

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

 

messages & messages_en.properties

HTML에 공통적으로 들어갈 메시지를 등록하고 한글판, 영어판으로 나눈다.

 

■ 타임리프 메시지 적용

    타임리프 메시지 표현식 #{...}을 사용해 스프링 메시지를 편리하게 조회한다.

    ex) 렌더링 전] <div th:text="#{label.item}"></div>  

          렌더링 후] <div>상품</div>

 

th:text="#{page.addItem}"으로 메시지를 불러오니 상품 등록 폼이 message.properties의 page.addItem값인 상품 등록으로 변환된 것을 확인할 수 있다.

 

이러한 방식으로 addForm.html, editForm.html, item.html, items.html에 적용하면 된다.

 

■ 파라미터 적용하는 방법

hello.name=안녕 {0}

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

위와 같은 방식으로 사용할 수 있다.

 

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

 

messages_en.properties 추가하면 #{...}를 통해서 알아서 국체화가 적용된다.

 

브라우저 설정에서 언어를 검색하고 우선순위를 영어로 변경

브레이브 브라우저 기준

 

① 이러면 HTTP 메시지 헤더의 Accept-Language에서 en-Us의 우선순위가 올라가며 아래와 같은 화면을 확인할 수 있다.

 

 

② 스프링은 언어 선택 시 기본으로 Accept-Language 헤더의 값을 사용한다.

 

■ LocaleResolver

사실 사용자가 브라우저의 설정을 일일이 건드릴 일은 잘 없다. 그래서 스프링은 사용자가 자신이 원하는 언어를 직접 선택할 수 있도록 LocaleResolver라는 인터페이스를 제공한다.

스프링부트는 Accept-Language를 활용하는 AcceptheaderLocaleResolver를 사용한다.