728x90
반응형
여기서 req는 HttpServletRequest이고, LocaleResolver 구현체가 req 안의 정보(헤더·세션·쿠키 등)를 읽어서 Locale을 반환해요. 그 Locale을 MessageSource.getMessage(..., locale)에 넘기면, messages_ko.properties 같은 번들에서 해당 언어의 문구를 찾아 반환합니다.
무엇을 기준으로 Locale이 정해지나요?
스프링은 여러 LocaleResolver 구현을 제공합니다. 프로젝트에 어떤 걸 쓰느냐에 따라 resolveLocale(req)의 동작이 달라집니다.
- 기본값(AcceptHeaderLocaleResolver): 별도 설정이 없으면 **요청 헤더 Accept-Language**를 보고 Locale을 고릅니다. 브라우저/클라이언트가 Accept-Language: ko-KR,ko;q=0.9를 보내면 ko_KR을 반환하는 식이에요. 이 구현은 헤더만 사용하므로 setLocale은 지원하지 않습니다.
- SessionLocaleResolver: 사용자가 선택한 언어를 HttpSession에 저장/조회합니다(세션 끝나면 소멸).
- CookieLocaleResolver: 선택한 언어를 쿠키에 보관합니다. 설정된 기본 Locale이 없으면 Accept-Language나 서버 기본 Locale로 폴백합니다. 세션 상태를 쓰기 싫은 REST에 적합해요.
추가로, LocaleChangeInterceptor를 쓰면 ?lang=ko 같은 요청 파라미터로 Locale을 바꿀 수 있습니다(인터셉터 등록 필요).
메시지가 “어떻게” 나오는가?
String msg = messageSource.getMessage("error.user.0007", null, "기본메시지",
localeResolver.resolveLocale(req));
- 마지막 인자의 Locale을 기준으로 messages_ko.properties, messages_en.properties 등에서 코드에 해당하는 문구를 찾습니다. 없으면 "기본메시지"가 사용됩니다. 이것이 Spring의 MessageSource(리소스 번들 기반 국제화) 메커니즘입니다.
실전 설정 예시(세 가지 패턴 중 택1)
1) 기본 Accept-Language 사용(설정 최소)
아무 설정도 안 해도 됩니다(부트 기본). 필요 시 기본 Locale만 지정:
@Bean("localeResolver")
public LocaleResolver localeResolver() {
var r = new AcceptHeaderLocaleResolver();
r.setDefaultLocale(Locale.KOREAN); // 선택
return r;
}
2) 세션/쿠키로 사용자 선택 언어 고정
@Bean("localeResolver")
public LocaleResolver localeResolver() {
return new CookieLocaleResolver(); // or new SessionLocaleResolver()
}
@Bean
public LocaleChangeInterceptor localeChangeInterceptor() {
var lci = new LocaleChangeInterceptor();
lci.setParamName("lang"); // /api?lang=ko
return lci;
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(localeChangeInterceptor());
}
- 이렇게 하면 /api?lang=en 요청 한 번으로 쿠키/세션에 언어가 저장되고, 이후 요청에서 resolveLocale(req)가 그 언어로 Locale을 돌려줍니다.
한 줄 정리
- resolveLocale(req)는 요청 객체에서 Locale을 읽어내는 전략이고, 기본은 Accept-Language 헤더 기반입니다.
- 그 Locale을 MessageSource에 넘기면 그 언어의 메시지 파일에서 문구가 조회되어 응답에 들어갑니다.
728x90
반응형
'개발 > spring boot' 카테고리의 다른 글
| 헥사고날 아키텍처 구조 설명 (0) | 2026.02.12 |
|---|---|
| (Spring) sso 외부 인증 토큰을 검증하고 세션에 사용자 정보를 저장하는 흐름 (0) | 2026.01.07 |
| Authentication을 SecurityContext 저장하는 사용방 (0) | 2025.10.13 |
| Spring Boot와 React 프로젝트를 하나로 합쳐서 개발하고 배포 (2) | 2025.07.26 |
| controller에서 URL 패턴 매칭 순서는 가장 구체적인(specific) 패턴이 먼저 매칭 (0) | 2025.04.16 |