본문 바로가기
Tech/etc

데이터 베이스(DB) 다국어 지원, 어떻게 구현하는게 좋을까?

by 패드로 2021. 4. 23.

 

 

Flutter 스터디에서 다양한 프로젝트를 하다가, 이번엔 판을 좀 키워보았습니다.

Flutter에 제공되는 정보를 Next.js를 써서 웹페이지로도 제공을 하고, 한글/영어로 서비스 제공이 가능하도록 하는 것이죠.

 

Flutter 소스 내에서 사용되는 언어들에 대해서는 easy_localization 패키지를 써서 진행을 했지만, 서비스에서 제공되는 데이터 중 서버(자체서버) api를 통해 오는 데이터들의 다국어 지원을 어떻게 할지에 대해서는 고민이 필요했습니다.

 

물론 최근에 번역 시스템이 아주 잘 되어있어서 번역 패키지를 쓰는 것도 좋겠지만, 아직 그 '번역체'의 느낌을 저버릴 수가 없더라구요. 

좀 더 확실한 글로벌 서비스 제공을 위해 번거롭지만 컨텐츠들을 직접 번역하기로 마음먹었습니다.

 

구글링과 함께 생각해본 방식을 보자면 3가지 정도 방법이 있을 것 같습니다.

코드 예시는 문법 생각 안하고 작성하니 의미 이해 용도로만 봐주세요 :) 

 

1. 제공하는 언어 별로 스키마에 속성을 추가해준다

Student 라는 테이블이 있을 때 아래처럼 정의를 해주는 거죠.

//Student Table
{
	'id': '1',
    'name_kor' : '김민수',
    'name_eng' : 'Kim, minsoo'
}

아마 3가지 방식 중에 가장 테이블을 적게 만들고 사용할 수 있는 방법일 것 같습니다. 가장 단순하구요

 

[장점] 

데이터베이스 구조가 복잡해지지 않는다

 

[단점]

api 단에서 처리해주지 않으면 클라이언트에서 언어 설정에 따라 'name_kor', 'name_eng' 등으로 구분해서 접근해야한다.

2. 언어별 테이블을 별도로 구성해준다

//Student_kor Table
{
	'id': '1',
    'name' : '김민수'
},

//Student_eng Table
{
	'id': '1',
    'name' : 'Kim, minsoo'
}

//if eng, select * from student_eng where id = 1
//if kor, select * from student_kor where id = 1

 

[장점]

클라이언트에서 별도로 처리할 필요 없이 'name' 속성에 접근해서 바로 사용이 가능하다.

 

[단점]

데이터베이스 구조가 약간 복잡해진다.

테이블이 2배로 늘어난다.

3. 모든 번역이 필요한 String 데이터들을 Translation Table에 넣어두고 연동해서 쓴다

//Student Table
{
	'id': '1',
    'name_tid' : '1'
},

//Translation Table
{
	't_id': '1',
    'eng' : 'Kim, minsoo',
    'kor' : '김민수',
}

[장점]

데이터베이스 번역에 수정이 필요할 경우 쉽게 읽고 수정이 가능하다

지원하고자 하는 언어가 추가될 경우 다른 테이블은 안건드리고 이 부분만 수정해주면 된다.

 

[단점]

데이터베이스 구조와 쿼리문이 복잡해진다

 

결론

방법론에 대한 부분이라 정답은 없습니다!(?)

다만, 프로젝트의 규모에 따라 다르겠지만 저는 1번 혹은 3번 방법을 많이 사용할 것 같습니다.

단점을 극복 가능하거나 단점을 덮을 만큼의 이점이 2번에서는 보이지 않아서요.

 

1번의 단점으로 작성한 name_kor, name_eng 등은 사실 api 단에서 가공해서 클라이언트로 전해준다면 클라이언트에서 동일하게 name으로 접근 가능한 부분이고,

3번의 경우에는 구조가 복잡해질 수는 있지만 추후 수십개의 언어로 서비스를 제공해야 할 경우까지 고려한다면 가장 유연하게 확장이 가능할 것 같습니다.

 

2번은 장점이 크게 뛰어나지 않은 대신 테이블 수가 (2n - 1)개로 증가하게되니 메리트가 딱히 없는 것 같아요.

 

제가 현재 하는 프로젝트는 개인 프로젝트이고, 글로벌 서비스를 지원하지만 제가 할 줄 아는 언어가 영어와 한글 뿐이라 그 이상의 확장에 대한 고려는 하지 않고 있습니다.

이렇게 작성해놓고 보니 1번처럼 가장 단순한 방법이 가장 좋을 것 같다는 생각이 들어 1번으로 적용하기로 결정하였습니다.

Simple is the best!~

 

15분 동안 고민하고 작성한 글이니 허점이 있을 수도 있고 나중에 발생할 수 있는 큰 문제를 간과했을 수도 있습니다.

혹시 그런게 있다면 댓글로 알려주시면 감사하겠습니다 :)

댓글