LocaleResolver란,

공식 Docs

Spring에서 제공하는 다국어 설정을 위한 인터페이스이다.

국제화를 위해 Locale 값을 얻어올 때 사용되며, 기본 구현체는 AcceptHeaderLocaleResolver를 사용한다.

종류

  • AcceptHeaderLocaleResolver
    • 아무 설정도 하지 않았을때 사용되는 기본 구현체이다.
    • 웹 브라우저가 전송한 Accept-Language Header를 이용해 Locale를 선택한다.
    • setLocale 메서드를 지원하지 않기 때문에, 중간에 서버에서 언어를 바꿀 수 없다.
  • CookieLocaleResolver
    • Cookie를 이용해 Locale를 선택한다.
    • setLocale 메서드를 사용할 경우, 브라우저의 Cookie에 Locale 정보가 저장된다.
    • Set-Cookie: en_US
  • SessionLocaleResolver
    • Session을 이용해 Locale를 선택한다.
    • setLocale 메서드를 사용할 경우, 서버의 Session에 Locale 정보가 저장된다.
  • FixedLocaleResolver
    • 웹 요청에 상관없이 특정한 Locale을 선택한다.
    • 초기 설정에서 사용한 Locale값 만을 사용하며, setLocale 메서드를 지원하지 않는다.

LocaleResolver 등록

CookieLocaleResolver

@Configuration
public class LocaleConfig {
    /**
     * LocaleResolver 설정
     * - Cookie 방식 사용
     */
    @Bean
    public LocaleResolver localeResolver() {
        // 쿠키
        CookieLocaleResolver cookieLocaleResolver = new CookieLocaleResolver();
        cookieLocaleResolver.setDefaultLocale(Locale.ENGLISH);
        cookieLocaleResolver.setCookieHttpOnly(true);
        return cookieLocaleResolver;
    }
}

SessionLocaleResolver

@Configuration
public class LocaleConfig {
    /**
     * LocaleResolver 설정
     * - Session 방식 사용
     */
    @Bean
    public LocaleResolver localeResolver() {
        SessionLocaleResolver sessionLocaleResolver = new SessionLocaleResolver();
        sessionLocaleResolver.setDefaultLocale(Locale.ENGLISH);
        return sessionLocaleResolver;
    }
}

Locale 변경

Controller 변경

@Controller
public class IndexController {
    @RequestMapping("/")
    public String changeLocale(
            @RequestParam("lang") String language,
            HttpSession session
    ) {
        session.setAttribute(
                SessionLocaleResolver.LOCALE_SESSION_ATTRIBUTE_NAME,
                new Locale(language)
        );
        
        return "form/items";
    }
}

HttpSession의 setAttribute 메서드를 통해 위와 같이 Session에 저장된 Locale 값을 바꿀 수 있다.

하지만, 위 방법은 다른 URL로 Redirect가 힘들다는 단점이 있다.

그래서 위 방법보다 아래의 인터셉터를 사용하는 방법을 많이 사용한다.

Interceptor 설정

@Configuration
public class LocaleConfig extends WebMvcConfigurationSupport {
    /**
     * Locale 정보 변경 ( 인터셉터 )
     * - 모든 URL에 대해 ?lang= 쿼리를 날리면 이 인터셉터를 지난다.
     */
    @Bean
    public LocaleChangeInterceptor localeChangeInterceptor() {
        LocaleChangeInterceptor localeChangeInterceptor = new LocaleChangeInterceptor();
        localeChangeInterceptor.setParamName("lang");
        return localeChangeInterceptor;
    }

    /**
     * 인터셉터 등록
     */
    @Override
    protected void addInterceptors(
            InterceptorRegistry registry
    ) {
        registry.addInterceptor(localeChangeInterceptor());
    }
}

Spring에서 제공하는 LocaleChangeInterceptor를 이용하여 어떤 URL 경로에 상관없이 ?lang= 쿼리를 추가하는 것으로 Session에 저장된 Locale 값을 변경할 수 있다.

profile
백엔드 개발자 지망생

0개의 댓글