HttpServletRequest 사용해 Accept-Lanauge 헤더 처리하기
HttpServletRequest를 사용해 Aceept-Lanauge 헤더를 처리하고, Locale 객체(지역 정보를 나타내는 객체)로 변환하기 위해서는 ServletRequest의 함수로 선언된 getLocale 함수를 사용하면 된다.
@GetMapping("/bloginfo/kotlinworld")
fun getBlogInfo(
request: HttpServletRequest
): ResponseEntity<BlogInfo> {
val locale: Locale = request.locale // getLocale 실행 해 HttpServletRequest의 Accept-Lanauge 헤더 정보를 Locale 정보로 변환
?: return ResponseEntity.badRequest().build()
...
}
getLocale 함수는 Accept-Language 헤더에 입력된 복수의 언어 중 가장 먼저 입력된 값을 가져오며, 만약 Accept-Language 값이 입력되지 않았다면, 스프링 애플리케이션의 기본 Locale 정보를 가져온다. 다음은 Request 객체에 선언된 getLocale 함수이다.
public Locale getLocale() {
if (!this.localesParsed) {
this.parseLocales();
}
return this.locales.size() > 0 ? (Locale)this.locales.get(0) : defaultLocale;
}
이후 해당 Locale에 따라 서로 다른 언어를 반환하고 싶다면, 다음과 같이 Locale 정보에 따라 서로 다른 결과를 반환하도록 만들면 된다.
@GetMapping("/bloginfo/kotlinworld")
fun getBlogInfo(
request: HttpServletRequest
): ResponseEntity<BlogInfo> {
val locale: Locale = request.locale
?: return ResponseEntity.badRequest().build()
val blogInfo = when (locale) {
Locale.KOREA -> BlogInfo("조세영의 Kotlin World", 3)
else -> BlogInfo("Seyoung's Kotlin World", 3)
}
return ResponseEntity.ok(blogInfo)
}
이렇게 완성한 후 헤더 정보에 Accept-Language 요청을 담아 날려보면
GET http://localhost:8081/bloginfo/kotlinworld
Accept-Language: en
다음과 같이 영문으로 결과가 나오는 것을 볼 수 있다.
@RequestHeader 사용해 Locale 정보 받아오기
스프링 부트에는 내부적으로 LocaleResolver가 등록되어 있어, 특정 헤더 값을 읽은 후 파싱해, Locale 객체로 처리할 수 있다. 따라서 다음과 같이 작성할 수 있다.
@GetMapping("/bloginfo/kotlinworld")
fun getBlogInfo(
@RequestHeader("Accept-Language") locale: Locale?
): ResponseEntity<BlogInfo> {
val blogInfo = when (locale) {
Locale.KOREA -> BlogInfo("조세영의 Kotlin World", 3)
else -> BlogInfo("Seyoung's Kotlin World", 3)
}
return ResponseEntity.ok(blogInfo)
}
이제 이것이 잘 동작하는지 확인하기 위해 다음과 같이 Aceept-Lanauge 헤더를 en으로 설정해 요청을 날려보자.
GET http://localhost:8081/bloginfo/kotlinworld
Accept-Language: en
그러면 다음과 같이 영문으로 응답이 오는 것을 확인할 수 있다.
이번에는 다음과 같이 Accept-Language 헤더를 ko-KR(한국어)로 설정해 요청을 날려보자.
GET http://localhost:8081/bloginfo/kotlinworld
Accept-Language: ko-KR
그러면 다음과 같이 응답이 한국어로 오는 것을 확인할 수 있다.
만약 스프링 부트를 사용하지 않는다면 LocaleResolver을 Bean으로 등록해줘야 한다.
@Configuration class SpringWebConfig : WebMvcConfigurer { @Bean fun localeResolver(): LocaleResolver { val localeResolver = AcceptHeaderLocaleResolver() localeResolver.setDefaultLocale(Locale.KOREAN) // 기본 값을 한국어로 변경 return localeResolver } ... }
MessageSource 사용해 다국어 가져오기
스프링 부트는 기본적으로 resource 경로에 있는 'message' 라는 이름으로 시작하고, .properties 확장자를 가지는 파일을 읽어 다국어를 처리하는 MessageSource 객체를 가진다.
만약 스프링을 사용 중이라면, MessageSource를 직접 구현해야 한다.
@Configuration class SpringWebConfig : WebMvcConfigurer { @Bean fun messageSource(): MessageSource { val messageResource = ReloadableResourceBundleMessageSource().apply { setBasename("classpath:/messages") // resources 아래에 messages로 시작하는 파일을 읽도록 설정 setDefaultEncoding("UTF-8") setCacheSeconds(3) } return messageResource } ... }
이제 resources 폴더 아래에 messages.properties 파일과, message_en_US.properties 파일 그리고 messages_ko_KR.properties파일을 만든다. 그러면 자동으로 Resource Bundle 'messages'로 그룹화된다.
그러면 각 파일은 뒤에 붙은 국가 코드에 해당하는 Locale에 매칭된다.
Accept-Language | Locale | 파일 |
Default Locale | messages.properties | |
en-US | Locale.US | messages_en_US.properties |
ko-KR | Locale.KOREA | messages_ko_KR.properties |
이제 각 파일을 다음과 같이 만들어보자. messages_en_US.properties와 messages.properties는 똑같이 만든다.
이후 MessageSource 객체를 주입 받는 HomePageController을 만들고, 해당 MessageSource 객체의 getMessage 함수를 불러보자. getMessage 함수의 첫 인자는 키 값인 'blogname'이며, 셋 째 인자는 사용자의 Accept-Langauge를 파싱해 만들어진 Locale 객체이다.
@Controller
class HomePageController(
private val messageSource: MessageSource
) {
@GetMapping("/bloginfo/kotlinworld")
fun getBlogInfo(
@RequestHeader("Accept-Language") locale: Locale // 언어 정보
): ResponseEntity<BlogInfo> {
val blogName = messageSource.getMessage("blogname", null, locale) // messages로부터 "blogname" 에 해당하는 값 가져옴
val blogInfo = BlogInfo(blogName, 3)
return ResponseEntity.ok(blogInfo)
}
}
이렇게 만들었으면, 이제 애플리케이션을 실행하고 다음의 HTTP 요청을 날려보자.
GET http://localhost:8081/bloginfo/kotlinworld
Accept-Language: ko-KR
그러면 다음과 같은 결과가 나오는 것을 볼 수 있다.
이번에는 결과값을 영문으로 받기 위해 HTTP 요청 헤더에 Accept-Language: en-US를 넣어보자.
GET http://localhost:8081/bloginfo/kotlinworld
Accept-Language: en-US
그러면 다음과 같은 HTTP 응답이 오는 것을 볼 수 있다.