Spring Boot 다국어 지원, DB 번역값 처리하기 - Entity 바로 번역하기

ABL·2024년 7월 3일
3
post-thumbnail
post-custom-banner

현재 진행 중인 프로젝트는 외국인의 인바운드 관광 활성화를 돕기 위한 어플리케이션으로, 다국어 지원이 필요합니다. 예를들어, 여러 장소 리스트의 장소명과 설명(Description)의 번역값을 관리해야 합니다.


전통적인 다국어 처리 방법

MessageSource 및 properties 파일로 관리:

  • 일반적으로 각 언어별 메시지를 messages_en.properties, messages_ko.properties와 같이 프로퍼티 파일에 작성합니다.
    // 예시
    messages_ko.properties에는 greeting.message=안녕하세요.
    messages_en.properties에는 greeting.message=Hello.

이 방법은 정적 문자열 값을 처리하는 데 적합하지만, 동적으로 관리되는 데이터에는 적합하지 않습니다.

더하여, 프론트에서 데이터를 받아올 때마다 번역 api를 사용해서 처리를 하기에는 번역 결과의 정확도가 좋지 않을 수 있으며, 그만큼 성능이 떨어질 수 있기에 선택하지 않았습니다.

특히 서비스 특성 상 사용자들이 조회하는 기본적인 데이터들은 모두 DB에서 관리되기에 백엔드에서 관리되어야 합니다.


다국어 지원을 위한 데이터베이스 설계 전략은 여러가지가 있는데, 처음에는 단순하게 title_kr, title_en과 같이 각 엔티티에 언어별로 필드를 추가했습니다.
하지만 지원하는 언어의 종류가 변경될 때마다 새로운 필드를 하나씩 수정해야 하기에, 적절하지 않다고 생각했습니다.
따라서 유연한 처리와 확장성을 위해 DB에 key-value 형식으로 Translation 테이블을 만들어 번역값을 처리하기로 결정했습니다.

Translation 테이블


Spring Boot 설정

LocaleResolver 설정

  • 프론트엔드에서 Accept-Language 헤더를 받아와서 해당 언어에 대응하는 응답값을 동적으로 내려줍니다.
    @Bean
    public LocaleResolver localeResolver() {
        AcceptHeaderLocaleResolver localeResolver = new AcceptHeaderLocaleResolver();
        localeResolver.setDefaultLocale(Locale.ENGLISH);
        return localeResolver;
    }

Translation Entity

  • 복합키: key와 language를 조합하여 사용합니다.
  • value: 번역된 값을 담습니다.
  • 여기서 key는 {{엔티티명_필드명_entityId}} 형태로 선언합니다.

TranslationId

TranslationResolver

다음으로 TranslationResolver class를 추가하여, 번역값을 가져올 메소드를 선언합니다.

TranslationService

아래와 같이 TranslationService를 만들어, Translatable한 엔티티를 쉽게 번역할 수 있습니다.

Translatable 인터페이스 및 구현
번역값을 하나의 테이블이 아닌 여러 테이블에서의 처리가 필요하다면, Translatable interface를 선언하여 implements하여 사용하는 것이 일관성을 위해 좋습니다.

상속 적용 예시


content = translationService.getTranslatedEntity(content);

이후 위와 같이 사용해주면 번역이 필요한 필드들에 쉽게 적용할 수 있습니다.


결과

번역이 필요한 엔티티마다 직접 getTranslatedEntity를 사용해주어야 하는 부분이 번거롭다고 느껴졌다. 이후 Spring AOP와 custom annotation을 이용하여 Entity의 특정 필드에 대한 번역하는 방법을 시도했으나, return되는 Object가 Translatable한 엔티티가 아닌 DTO였기 때문에 기존 코드로는 적용이 불가능했다. 따라서 아예 DTO에 translatable한 필드를 따로 어노테이션으로 명시하여, AOP를 사용해서 구현하는 방법을 다음 포스트에 적어볼 예정이다.


Reference

다국어 지원을 위한 데이터베이스 설계와 Spring Boot 구현 전략
DB를 통한 다국어 지원 기능 구현

profile
💻
post-custom-banner

0개의 댓글