개요
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 기능을 설정하거나, 고객이 직접 선택하도록 할수 있다.
참고자료
'Backend' 카테고리의 다른 글
Spring Batch로 Log 내용 DB에 적재하기 (0) | 2023.07.03 |
---|---|
Spring - 검증(Validation) (0) | 2023.01.23 |