주녁, DevNote
article thumbnail
Published 2023. 1. 21. 21:30
Spring - 메시지, 국제화 Backend

개요

Spring은 메시지 내용을 properties 설정 파일에서 불러올 수 있다.

또한, 국제화를 위해 다국어 설정도 지원한다.


여정

설정파일 이름 지정

스프링 부트는 application.properties에서 아래와 같이 메시지 설정파일의 이름을 지정해줄 수 있다.

(기본값이 messages 이기 때문에 아래 코드를 적지 않아도 적용된다)

spring.messages.basename=messages

즉, messages.properties, errors.properties라는 설정파일을 기본적으로 읽어와 사용할 수 있다.

설정파일의 위치는 /resources/messages.properties 위치에 두면 된다.

 

메시지 관리 기능

설정파일의 이름을 코드로 지정하고 사용할 수도 있다.

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

코드 내용에 따라 messages.properties, errors.properties라는 설정파일을 읽어와 사용할 수 있게 된다.

또한, messages_ko.properties, messages_en.properties  파일도 등록하면 국제화 기능에 따라 같이 인식된다.

 

이렇게 생성된 MessageSource는 아래와 같은 메시지 관리 인터페이스를 제공한다.

  • code : 불러올 property 명
  • args : property에 전달할 매개변수 명
  • defaultMessage : 해당 property가 없을 때 출력할 기본 메시지
  • locale : properties 설정파일의 언어 설정
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 인터페이스 Locale에 따라서 설정파일을 다르게 가져온다.

이름만 다를뿐인데 어떻게 찾아올 수 있을까?

 

국제화 기능은 Locale 정보를 기반으로 파일을 선택한다.

파일을 선택하는 순서는 구체적 이름 → 기본 이름 순이다.

ex) Locale이 en_US인 경우 : messages_en_US → messages_en → messages 순서

따라서, message.properties에 한글 내용, messages_en.properties에 영문 내용을 두면

자연스럽게 한글 우선 인식, 상황에 맞춰 영문인식으로 변경할 수 있다.

 

사용자가 원하는 언어로 서비스하기

HTTP 요청 헤더 중에는 'Accept-Language' 라는 값에 기대하는 언어 정보를 담아 요청할 수 있다.

즉, 사용자가 원하는 언어가 요청에 담겨져서 전달된다.

 

스프링은 이러한 요청에 따라 Locale 선택방식을 변경할 수 있도록

LocaleResolver 라는인터페이스를 지원한다.

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

 

스프링부트는 기본적으로 Accept-Language 를 활용하는 AcceptHeaderLocaleResolver 를 사용한다.

따라서, 코드상에서 Locale 설정을 따로 하지 않아도 국제화 설정파일만 잘 설정해두었다면,

브라우저의 언어 설정값에 따라 언어별 메시지를 전달할 수 있다.

 

만약 Locale 선택방식을 변경하려면 LocaleResolver의구현체를 변경하면 된다.

예를 들어, 쿠키나 세션 정보를 통해 Locale 기능을 설정하거나, 고객이 직접 선택하도록 할수 있다.

 


참고자료

스프링 MVC 2편 - 백엔드 웹 개발 활용 기술 - 김영한님 강의

'Backend' 카테고리의 다른 글

Spring Batch로 Log 내용 DB에 적재하기  (0) 2023.07.03
Spring - 검증(Validation)  (0) 2023.01.23
profile

주녁, DevNote

@junwork

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!