개요
진행 중인 프로젝트에 다국어 처리를 추가해야 하는데, 공식 문서에서 제시한 properties 파일 대신 yml 파일을 사용하고 싶었고, 조사 결과 이를 가능하게 하는 라이브러리가 존재했습니다.
https://github.com/akkinoc/yaml-resource-bundle?tab=readme-ov-file
이 게시글에서는 스프링 부트 프로젝트에 해당 라이브러리를 어떻게 접목시킬지 간단히 설명하겠습니다.
프로젝트 환경
- Springboot 2.6.3
- Java 1.8
- yaml-resource-bundle 2.8.1
다국어 처리를 위해 구현해야 할 Configuration 클래스
다국어 처리를 적용하기 위해서는 두 가지의 Configuration 클래스를 구현해야 합니다.
- MessageConfiguration
- LocaleConfiguration
1. MessageConfiguration
MessageSource는 국제화(i18n)를 제공하는 인터페이스이며 MessageConfiguration에서 yaml-resource-bundle에서 제공하는 커스텀 MessageSource인 YamlMessageSource를 빈으로 등록해야 합니다.
YamlMessageSource에서 제공하는 메서드를 간단히 소개하자면 아래와 같습니다.
- setBaseName: resources 폴더 내 메시지를 찾을 파일 경로
- 저처럼 "resource"로 설정할 경우 파일 경로는 resources/resource_[Locale].yml이 되며
- Header 내 Accept-Language가 en일 경우 resource_en.yml,
- Header 내 Accept-Language가 fr일 경우 resource_fr.yml 파일 내 메시지를 찾게 됩니다.
- setDefaultEncoding: 기본 인코딩 방식
- setAlwaysUseMessageFormat(): 메세지 포맷 규칙 사용 여부
- setUseCodeAsDefaultMessage(): 메세지를 못 찾으면 코드 그 자체를 기본 메시지로 사용할지 여부
- setFallbackToSystemLocale(): 특정 Locale에 대한 파일을 발견하지 못할 경우 fallback 처리로 [base-name].yml을 사용할지 여부
- base-name을 "message"로 설정했다면 fallback 처리로 message.yml 사용
2. LocaleConfiguration
다국어 처리를 위해 Spring MVC는 LocaleResolver를 이용하여 웹 요청과 관련된 지역 정보인 Locale을 추출하고 이 Locale 객체를 이용해서 알맞은 언어의 메시지를 선택합니다.
- Header 내 Accept-Language 정보를 토대로 Locale 설정
따라서 LocaleConfiguration에서는 LocaleResolver를 빈으로 설정하고 메인이 국내 서비스이기 때문에 기본 Locale을 KOREAN으로 설정합니다.
테스트
앞서 언급한 두 설정 파일을 구현하면 메시지 다국어 처리를 위한 준비는 끝났습니다.
yaml-resource-bundle 라이브러리 적용 시 yml 파일에 map 형식 혹은 list 형식으로 메시지 포맷을 저장할 수 있습니다.
편의상 README에서 제공한 예제를 그대로 사용해서 api로 제공하는 코드를 테스트해보겠습니다.
resource.yml (한국어)
resource_en.yml (영어)
ApiController.java
테스트 결과
1. map value 받아오는 api (한글)
2. map value 받아오는 api (영어)
3. list value 받아오는 api (한글)
4. list value 받아오는 api (영어)
프로젝트 레포지토리
https://github.com/jaimemin/internationalization-message-yml
postman collection
참고
https://github.com/ttasjwi/trilo-be
https://velog.io/@junyoungs7/LocaleResolver%EB%9E%80
'리서치' 카테고리의 다른 글
[SpringBoot] Springdoc Swagger 적용 (2) | 2024.05.28 |
---|---|
[SpringBoot] JPA 쿼리 성능 감시 가이드 (0) | 2024.03.12 |
[Springboot] Jpa 프로젝트에 jOOQ 도입 (6) | 2023.10.03 |
[Springboot] 멀티 데이터소스 (MyBatis, JPA) (11) | 2023.03.25 |
[MSA] CQRS 패턴과 실제 적용 사례 (4) | 2022.10.31 |