Java 웹 애플리케이션을 위한 데이터베이스 기반 국제화(i18n) 구현

오늘날의 세계화된 환경에서 다양한 청중을 수용하는 응용 프로그램을 만드는 것이 매우 중요합니다. 웹 애플리케이션에서 다양한 언어와 문화를 수용하기 위한 필수 측면 중 하나가 **국제화(i18n)**입니다. 이 블로그 게시물에서는 Java 웹 애플리케이션에서 i18n을 구현할 때 개발자들이 직면하는 일반적인 문제를 다룰 것입니다. 특히 i18n 키/값 쌍을 저장하기 위해 데이터베이스를 활용하고 이 데이터를 런타임에 수정하거나 재로드 하는 방법입니다.

도전 과제

한 개발자가 데이터베이스 기반의 솔루션을 사용하여 i18n 데이터를 효과적으로 관리할 수 있는 방법에 대해 문의했습니다. 목표는 애플리케이션을 다시 배포할 필요 없이 국제화 문자열을 동적으로 업데이트할 수 있도록 하는 것이었습니다. 그들은 <fmt:setlocale>, <fmt:bundle>, <fmt:message>와 같은 JSTL (JavaServer Pages Standard Tag Library) 태그와 이 솔루션을 통합하고자 했으나, 특히 ResourceBundle을 확장하는 것과 관련된 어려움을 겪고 있었습니다.

비슷한 문제를 겪고 계시다면 걱정하지 마세요! 아래에서는 Java 웹 애플리케이션에서 데이터베이스 기반의 i18n을 구현하는 실용적인 접근 방식에 대해 논의하겠습니다.

데이터베이스 기반 i18n을 위한 제안된 솔루션

1단계: 데이터베이스 설정

먼저, i18n 데이터를 저장하기 위해 간단한 데이터베이스 테이블을 만들어야 합니다. 제안된 구조는 세 개의 열로 구성됩니다:

  • language: 언어 코드 (예: en, fr, es).
  • key: 각 문자열에 대한 고유 식별자, 일반적으로 영어 (예: login.error.password.dup).
  • value: 해당 key에 해당하는 번역 문자열.

예제 테이블 생성

CREATE TABLE translations (
    language VARCHAR(5),
    key VARCHAR(100),
    value TEXT,
    PRIMARY KEY (language, key)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

2단계: 데이터베이스 채우기

translations 테이블에 키/값 쌍으로 데이터를 삽입합니다. 다음은 간단한 예입니다:

INSERT INTO translations (language, key, value) VALUES
('en', 'login.error.password.dup', 'Password is already in use.'),
('fr', 'login.error.password.dup', 'Le mot de passe est déjà utilisé.'); 

3단계: ResourceBundle 조정

데이터베이스와 JSTL 태그를 통합하기 위해 ResourceBundle 클래스를 확장해야 합니다. 이 확장된 버전은 데이터베이스에서 직접 문자열을 가져올 수 있습니다.

샘플 코드

public class DatabaseResourceBundle extends ResourceBundle {
    private String language;

    public DatabaseResourceBundle(String language) {
        this.language = language;
    }

    @Override
    protected Object handleGetObject(String key) {
        // 언어 및 키를 사용하여 데이터베이스에서 값을 가져오는 논리
        return getValueFromDatabase(language, key);
    }

    @Override
    public Enumeration<String> getKeys() {
        // 키의 Enumeration을 반환하는 논리
    }
}

4단계: JSTL과 통합

사용자 정의 ResourceBundle을 생성한 후 이를 JSTL 태그와 통합해야 합니다. 서블릿이나 JSP에서 지역화 컨텍스트를 설정할 수 있습니다.

샘플 구현

HttpSession session = request.getSession();
String language = "en"; // 언어를 결정하는 논리
ResourceBundle bundle = new DatabaseResourceBundle(language);
Locale locale = new Locale(language);
javax.servlet.jsp.jstl.core.Config.set(session, Config.FMT_LOCALIZATION_CONTEXT, new LocalizationContext(bundle, locale));

추가 고려 사항

  • UTF-8 지원: 데이터베이스가 UTF-8 문자를 지원하는지 확인해야 합니다. MySQL과 Oracle 모두 데이터베이스 또는 테이블 생성 시 이를 설정할 수 있습니다.
  • 캐싱: 성능을 향상시키기 위해 데이터베이스 리소스 번들을 위한 캐싱 메커니즘을 구현하는 것을 고려하십시오.
  • 번역자용 UI: 보다 고급 접근 방식으로, 번역자가 항목을 편집할 수 있는 사용자 인터페이스를 구축하여 변경 사항의 감사 로그를 포함할 수 있습니다.

결론

Java 웹 애플리케이션에서 데이터베이스 기반의 국제화를 구현하면 애플리케이션의 언어 문자열을 실시간으로 업데이트할 수 있는 유연성을 크게 향상시킵니다. 위에 설명된 단계를 따르면 JSTL 태그와 매끄럽게 통합된 강력한 시스템을 구축할 수 있습니다.

귀하의 애플리케이션의 특정 요구 사항에 따라 이러한 솔루션을 실험하고 조정해 보십시오. 행복한 코딩 되세요!