Web/Spring

Spring MVC 2 - 국제화/메시지

now0204 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 선택

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