안녕하세요. J4J입니다.
이번 포스팅은 i18n을 활용하여 다국어 처리하는 방법에 대해 적어보는 시간을 가져보려고 합니다.
i18n이란?
i18n은 국제화하는 기능을 의미합니다.
다른 말로는 세계에 존재하는 다양한 언어들을 서비스 사용자에게 보여줄 때 사용될 수 있는 것을 뜻합니다.
다른 여러 지역의 사용자들이 하나의 서비스를 사용하는 경우는 잦은 일은 아니지만, 만약 이런 유형의 서비스를 제공하기 위해 개발해야 한다면 i18n을 활용하여 다양한 지역의 언어들을 보여주는 기능을 활용해 볼 수 있습니다.
기본 설정
[ 1. properties 파일 인코딩 설정 ]
일반적인 상황에서는 properties 파일 인코딩을 설정하지 않아도 되지만 한글을 적용하기 위해서는 properties 파일 인코딩 설정이 필요합니다.
그렇지 않으면 한글이 깨져서 사용자에게 보여지는 결과를 만듭니다.
IntelliJ를 사용하는 경우 "ctrl + alt + s"를 누르면 설정 화면이 나옵니다.
여기서 properties 파일에 대한 인코딩 값을 UTF-8로 변경해 주시면 됩니다.
[ 2. application.properties 설정 ]
# message 파일의 기본 이름 (콤마로 구분해서 사용 가능) (default messages)
# /resources/messages/messages_{언어}.properties를 바라보도록 설정
spring.messages.basename=messages/messages
# 인코딩 설정 (default UTF-8)
spring.messages.encoding=UTF-8
# 메세지 코드를 찾지 못했을 때 메세지 코드를 그대로 반환하는 설정 (default false)
# true → 코드 값 그대로 반환
# false → exception 발생
spring.messages.use-code-as-default-message=false
# 언어별 message 파일을 찾지 못한 경우에 대한 설정 (default true)
# true → 시스템 설정 (MessageConfig)에서 설정한 언어에 맞는 message 파일 활용
# false → default 파일 (message.properties) 활용
spring.messages.fallback-to-system-locale=false
# 캐시 주기 설정 (default forever)
spring.messages.cache-duration=3600
# messageFormat 항상 사용 여부 (arguments에 따른 format 처리 방식) (default false)
# true → 항상 사용
## 예를 들어 message.properties에 welcome=Hello ''라고 되어있는걸 호출하면 Hello '로 출력
## 예를 들어 message.properties에 welcome=Hello ''{0} 라고 되어있는걸 호출하면 Hello '{0}로 출력
# false → 항상 미사용
## 예를 들어 message.properties에 welcome=Hello ''라고 되어있는걸 호출하면 Hello ''로 출력
## 예를 들어 message.properties에 welcome=Hello ''{0} 라고 되어있는걸 호출하면 Hello '{0}로 출력
spring.messages.always-use-message-format=true
[ 3. Message Config 클래스 추가 ]
package com.i18n.config;
import org.springframework.context.annotation.Bean;
import org.springframework.web.servlet.LocaleResolver;
import org.springframework.web.servlet.i18n.SessionLocaleResolver;
import java.util.Locale;
public class MessageConfig {
@Bean
public LocaleResolver localResolver() {
// messageSource의 기본 언어를 한국어로 설정
SessionLocaleResolver sessionLocaleResolver = new SessionLocaleResolver();
sessionLocaleResolver.setDefaultLocale(Locale.KOREA);
return sessionLocaleResolver;
}
}
[ 4. message 파일 추가 ]
message 파일은 위의 application.properties의 basename 설정 값에 따라 위치가 달라집니다.
저는 위의 설정에 맞게 /resources/messages 폴더를 만들어 다음과 같이 default, 한국어, 영어 파일들을 추가하겠습니다.
// messages.properties
welcome=웰컴 'default'
// messages_ko.properties
welcome=웰컴 ''{0}''
// messages_en.properties
welcome=welcome ''{0}''
[ 5. Controller 클래스 추가 ]
다국어 message 호출 테스트를 위한 Controller 클래스 파일을 다음과 같이 추가해 보겠습니다.
package com.i18n.controller;
import lombok.RequiredArgsConstructor;
import org.springframework.context.MessageSource;
import org.springframework.context.i18n.LocaleContextHolder;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequiredArgsConstructor
@CrossOrigin("*")
public class MessageController {
private final MessageSource messageSource;
@GetMapping("/welcome")
public ResponseEntity<Object> welcome(String name) {
System.out.println(LocaleContextHolder.getLocale());
return ResponseEntity.ok(
messageSource.getMessage(
// message code (message.properties에 작성된 key)
"welcome",
// arguments
new String[]{name},
// header의 Accept-Language 값을 이용하여 메세지 처리할 언어 선택
// 값이 ko, ko_KR 이면 messages_ko.properties, 값이 en, en_US 이면 message_en.properties 활용
LocaleContextHolder.getLocale()
)
);
}
}
테스트
먼저 한국어가 올바르게 확인되는지 다음과 같이 테스트해볼 수 있습니다.
다음은 영어가 올바르게 확인되는지 다음과 같이 테스트 해볼 수 있습니다.
마지막으로 정의하지 않은 언어를 사용할 경우 default 파일 내용이 보이는 것을 확인할 수 있습니다.
이상으로 i18n을 활용하여 다국어 처리하는 방법에 대해 간단하게 알아보는 시간이었습니다.
읽어주셔서 감사합니다.
'Spring > SpringBoot' 카테고리의 다른 글
[SpringBoot] @Transactional 사용 방식 정리 (1) | 2023.09.25 |
---|---|
[SpringBoot] LocalDateTime 사용하기 (0) | 2023.09.24 |
[Springboot] Jacoco를 이용하여 테스트 커버리지 확인하기 (1) | 2023.09.16 |
[SpringBoot] SpringBatch 사용하기 (4) - Quartz로 클러스터링 처리하기 (1) | 2023.09.10 |
[SpringBoot] SpringBatch 사용하기 (3) - Quartz로 배치 만들기 (0) | 2023.09.03 |
댓글