MessageSource
Spring이 기본적인 메시지와 국제화 기능을 제공하는 인터페이스입니다.
이를 통해 각 나라별로 메시지 파일을 관리하여, 사용자의 언어별로 메시지를 전달할 수 있습니다.
서버는 HTTP Accept-Language 헤더 값을 통해 message 언어를 기본적으로 설정해 줍니다.
// messages_ko.properties
error.key=기본 에러 메시지
error.value={0} 에러 필드
// === //
// messages_en.properties
error.key=Default error message
error.value={0} error field
Message Properties 생성
Bundle 생성 방법
사용할 Locale properties 생성
MessageSource 설정
메시지 관리 기능을 사용하기 위해서 스프링이 제공하는 MessageSource 인터페이스를 상속받는 구현체인 ResourceBundleMessageSource를 스프링 빈으로 등록합니다.
스프링 부트를 사용하면 자동으로 등록을 해줍니다. properties를 여러 개 사용하는 각 bundle을 사용할 때 설정이 필요함.!!
@Configuration
public class MessageSourceConfig {
@Bean
public MessageSource messageSource() {
ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
messageSource.setBasenames("messages");
messageSource.setDefaultEncoding("utf-8");
return messageSource;
}
}
- setBasenames("messages")
- 기본적으로 messages.properties 파일을 읽어옵니다.
- default 파일 경로 /resources/ 에서 properties파일들을 찾습니다.
- /resources/messages.properties
- setDefaultEncoding("utf-8")
- 인코딩 정보를 지정한다. default로 utf-8을 사용
MessageSource 사용
@SpringBootTest
public class MessageSourceTest {
@Autowired
MessageSource messageSource;
@Test
void test() {
String koMsg = messageSource.getMessage("error.key", null, Locale.KOREAN);
String enMsg = messageSource.getMessage("error.key", null, Locale.ENGLISH);
System.out.println("koMsg = " + koMsg);
System.out.println("enMsg = " + enMsg);
String koo = messageSource.getMessage("error.value", new String[]{"커피"}, Locale.KOREAN);
String enn = messageSource.getMessage("error.value", new String[]{"coffee"},
Locale.ENGLISH);
System.out.println("koo = " + koo);
System.out.println("enn = " + enn);
}
}
Locale 설정에 관해 더 알아보기
LocaleResolver
Interface for web-based locale resolution strategies that allows for both locale resolution via the request and locale modification via request and response.
- 웹 기반 Locale 해결(적용) 전략 인터페이스이며 request를 통해 각 Locale 적용과 Locale 수정을 가능하게 합니다.
- 다국어 설정을 위한 인터페이스입니다.!
This interface allows for implementations based on request, session, cookies, etc. The default implementation is org.springframework.web.servlet.i18n.AcceptHeaderLocaleResolver, simply using the request's locale provided by the respective HTTP header.
기본 구현체는 AcceptHeaderLocaleResolver로 요청받은 HTTP header의 값으로 locale을 설정합니다. (header - Accept-Language)
resolveLocale()
Resolve the current locale via the given request. Can return a default locale as fallback in any case.
요청을 통해 현재 locale을 반환합니다. 또한, 어느 케이스의 실패에 경우 기본 값을 반환하는 역할을 수행
AcceptHeaderLocaleResolver
LocaleResolver implementation that looks for a match between locales in the Accept-Language header and a list of configured supported locales. See setSupportedLocales(List) for further details on how supported and requested locales are matched.
HTTP Header의 값 중 Accept-Language에 전달받은 값과 locales 값의 매치를 찾아 설정해 줍니다.
getDefaultLocale()은 무슨 값?
위에서 설정된 getDefaultLocale()에 기본 Locale 값은 운영체제에 설정된 언어입니다. JVM이 구동될 때 OS 환경 변수 등에서 정보를 읽어 기본 값을 설정합니다.
Locale.getDefault()에 대한 질문 - 인프런 | 커뮤니티 질문&답변
LocaleContextHolder
Simple holder class that associates a LocaleContext instance with the current thread. The LocaleContext will be inherited by any child threads spawned by the current thread if the flag is set to.
Used as a central holder for the current Locale in Spring, wherever necessary.
현재 스레드의 LocaleContext와 관련된 간단한 holder class이다. 즉, 각 요청에 대한 Locale 값을 관리하는 Holder라 생각할 수 있다.
참고 자료
Spring MVC - 스프링에서 제공하는 MessageSource 사용 방법 (메시지와 국제화 기능)
Locale.getDefault()에 대한 질문 - 인프런 | 커뮤니티 질문&답변
'Spring Framework > Spring' 카테고리의 다른 글
Java HashMap vs LinkedHashMap 차이점 - 스프링에서 데이터 삽입 순서 유지하기 (1) | 2024.11.09 |
---|---|
Spring 정렬 Sort, Order 클래스 이해하기 - 정렬 방향, 속성 접근하기 (0) | 2024.11.08 |
Spring @RequestParam 페이징 정보 처리하기 - Pageable, @PageableDefault, sort (0) | 2024.10.19 |
Spring StdSerializer, @JsonSerializer 커스텀 직렬화 처리 방법 (1) | 2024.10.16 |
Spring Scope 어노테이션으로 빈 라이프사이클 이해하기 - prototype, request, session (4) | 2024.10.13 |