resolveLocale(req)가 하는 일 - 이 요청의 언어/국가(locale)를 어떻게 정할까?

2025. 10. 15. 09:55·개발/spring boot
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
'개발/spring boot' 카테고리의 다른 글
  • 헥사고날 아키텍처 구조 설명
  • (Spring) sso 외부 인증 토큰을 검증하고 세션에 사용자 정보를 저장하는 흐름
  • Authentication을 SecurityContext 저장하는 사용방
  • Spring Boot와 React 프로젝트를 하나로 합쳐서 개발하고 배포
nix-be
nix-be
  • nix-be
    NiX
    nix-be
  • 전체
    오늘
    어제
    • 홈
      • 책
        • 오브젝트
      • 성장
        • jpa Querydsl 정리
        • 코딩테스트
        • 스프링 핵심 원리 - 기본편
      • 인프라
        • linux
        • vmware
        • CI&CD
        • 네트워크
        • docker
      • 개발
        • spring boot
        • spring security
        • JPA
        • java
        • thymeleaf
        • 이슈
        • jquery
        • javascript
        • 안드로이드
        • MyBatis
        • git
        • 과제
      • DB
        • postgreSql
        • mysql
        • redis
      • 잡다한것
        • 프로그램
        • 일상 관련
        • 프로젝트-주차관리
      • 회사
        • 티
        • 피
  • 블로그 메뉴

    • 홈
    • 개발
  • 링크

  • 공지사항

  • 인기 글

  • 태그

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
nix-be
resolveLocale(req)가 하는 일 - 이 요청의 언어/국가(locale)를 어떻게 정할까?
상단으로

티스토리툴바