[Spring] 메시지 , 국제화

hi·2022년 11월 28일

메시지와 국제화

메시지

  • 다양한 메시지를 한 곳에서 관리하는 기능
  • 각 HTML들은 해당 데이터를 key 값으로 불러 사용
ex)

//messages.properties
item=상품
item.id=상품 ID
item.itemName=상품명
item.price=가격
item.quantity=수량

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

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

국제화

  • 메시지 파일을 각 나라별로 별도로 관리
ex)

//messages_en.properties
item=Item
item.id=Item ID
item.itemName=Item Name
item.price=price
item.quantity=quantity

//messages_ko.properties
item=상품
item.id=상품 ID
item.itemName=상품명
item.price=가격
item.quantity=수량
  • HTTP accept-language 헤더 값을 사용하거나
  • 사용자가 직접 언어를 선택 -> 세션, 쿠키를 사용하여 처리

스프링 제공 메시지

  • 인터페이스 MessageSource 를 제공
    👉 구현체 ResourceBundleMessageSource 를 스프링 빈으로 등록

직접 등록

@Bean
public MessageSource messageSource() {

	ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
    
	messageSource.setBasenames("messages", "errors"); 
	messageSource.setDefaultEncoding("utf-8");
    
	return messageSource;
}

1) Basename : 설정 파일의 이름 지정

  • 여러 파일을 한 번에 지정 가능
  • messages로 지정하면 messages.properties 파일을 읽어서 사용
  • 국제화 기능을 추가하려면 messages_en.properties , messages_ko.properties 처럼 파일명 마지막에 언어 정보를 추가한다
    • 찾는 국제화 파일이 없으면 언어정보가 없는 파일명 을 기본으로 사용
  • /resources/messages.properties 에 위치

2) defaultEncoding : 인코딩 정보 지정


💡 스프링 부트의 경우

  • 자동으로 MessageSource 를 스프링 빈으로 등록

메시지 소스 설정

기본값
spring.messages.basename=messages


직접 설정 가능
application.properties
spring.messages.basename=messages,config.i18n.messages


참고
https://docs.spring.io/spring-boot/docs/2.7.6/reference/html/application-properties.html#appendix.application-properties


메시지 소스 사용


MessageSource 인터페이스

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;
  • 코드를 포함한 일부 파라미터로 메시지를 읽어오는 기능 제공

  • locale 정보가 없거나 찾는 파일이 없으면
    basename 에서 설정한 기본 이름 메시지 파일 조회

  • 메시지가 없는 경우 NoSuchMessageException 발생
    기본 메시지(defaultMessage)를 사용하면 기본 메시지 반환

	ms.getMessage("no_code", null, "기본 메시지", null);
  • 메시지의 {0} 부분은 매개변수를 전달
	ms.getMessage("hello.name", new Object[]{"Spring"}, null);

	hello.name=안녕 {0} -> Spring 전달 -> 안녕 Spring

타임리프 메시지 적용

#{...}

ex)

<div th:text="#{label.item}"></h2>
👇
<div>상품</h2>

파라미터 적용

ex)

hello.name=안녕 {0}

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

스프링 제공 국제화

  • 언어 선택시 기본으로 Accept-Language 헤더 값 사용

  • Locale 선택 방식을 변경할 수 있는 LocaleResolver 인터페이스 제공


LocaleResolver 인터페이스

public interface LocaleResolver {

	Locale resolveLocale(HttpServletRequest request);

	void setLocale(HttpServletRequest request, 
    			   @Nullable HttpServletResponse response, 
                   @Nullable Locale locale);
}
  • Locale 선택 방식을 변경하려면 LocaleResolver 의 구현체를 변경하여
    쿠키나 세션 기반의 Locale 선택 기능을 사용할 수 있다
    (ex. 고객이 직접 선택)

💡 스프링 부트의 경우

기본으로 Accept-Language 를 활용하는 AcceptHeaderLocaleResolver 사용

0개의 댓글