티스토리 뷰

반응형

 

실무에서 앱을 개발하다보면 외국인을 대상으로 서비스를 운영하기도 합니다.  외국인 클라이언트들에게 한국어를 강요할 수는 없기때문에 우리 개발자들은 정해진 locale 에 따라서 언어를 분기해주어야 하죠

 

제가 소속된 팀에서는 GetX를 사용하는데 이 상태관리툴에는 기본적으로 다국어를 지원할 수 있끔 기능이 포함되어있습니다. 아래 예시를 보시죠

 

 

위 내용은 Getx 패키지 Readme에 작성 되어있는 다국어의 예시입니다.

각 국가별 구분을 최상위 key로 가지고 value 로는 같은 하위 key에 다른 하위 value 를 가진 json 형태로 만들어져 있죠

그리고 이렇게 정해준 내용들을 가지고  아래와 같은 형태로 사용을 하게 되는겁니다.

Text('title'.tr);

 

하지만 위와 같은 방식으로 사용하게 되면 부각되는 단점이 있습니다. 바로 유지보수가 어렵다는 점입니다.

예들들어 아래와 같은 json 내용물이 있다고 가정하겠습니다.

 

{
	"conversation_person_1_1" : "난 대학시절 묵찌빠를 전공했단 사실!",
	"conversation_person_1_2" : "니놈을 이겨 눈물, 콧물 쏙다빼주마!",
	"conversation_person_2_1" : "난 묵찌빠로 유학까지 다녀왔단 사실!",
	"conversation_person_2_2" : "니놈을 이겨 가문의 이름 높이리!"
}

 

그렇다면 코드는 아래와 같게 될겁니다.

 

Text('conversation_person_1_1'.tr);
Text('conversation_person_1_2'.tr);
Text('conversation_person_2_1'.tr);
Text('conversation_person_2_2'.tr);

 

여기서 만약에 위 json에 'conversation_person_1_2' 항목을 지워버린다면 어떻게 될까요?

몰래 json 행지우는 김AI씨

물론 우리 개발자들이 json 행을 의도적으로 지우는 만행을 하지는 않을겁니다. 그렇지만 코드를 작성하다가 json 작업중 confilct가 나고 휴먼에러를 일으켜 정상적으로 병합이 되지 않는일이 발생할지도 모르죠

기본적으로 다국어 key 값이 존재하지 않는다면 공백으로 노출되게 됩니다. 이 텍스트가 노출되는 부분이 눈에 잘 띄는 부분이라 금방 발견하면 좋지만 만약 눈에 띄지 않는 부분이고 그게 그대로 심사를 받고 스토어에 올라간다면,,? 

우리는 스스로의 코드를 믿지 못하고 항상 불안하게 코드를 작성하게 될지도 모르는 일입니다. 그렇다면 어떻게 하면 이러한 문제를 해결할 수 있을까요?

 

답은 Type Safe 코드로 작성한다 입니다. 이 모든 문제는 위 GetX의 다국어 예제와 같이 String 값을 그대로 사용하려 했기 때문에 발생하게 됩니다. 그렇다면 우리는 String 값이 아니라 다국어 json 을 기반으로 Model 을 구축해 그 Model 에서 변수로 값을 불러와 사용을 하면 됩니다.

  

제가만든 플러그인인 gh_i18n 에서는 asset으로 지정해놓은 json 데이터를 토대로 자동으로 model 만들고 만들어진 model 을 기반으로 다국어 처리를 손쉽게 할 수 있게 작업이 되어있습니다.

 

gh_i18n | Flutter package

This is an easy plugin to implement i18n functions in flutter.

pub.dev

 

위 그림과 같이 각 언어별 같은 폼을 가진 json 에셋들을 준비하고 json 파일의 경로와 같은 환경 변수들을 기입한 Yaml 파일을 생성합니다. 

dart run gh_i18n

 

그리고 위와같이 명령어를 입력해 플러그인을 실행시켜주면

작성된 json 파일을 기반으로한 model 이 생성이 되고 그 모델을 기반으로 한 Helper 와 Translator 가 생성이 되는데 이 클래스들을 통해 Type Safe 한 방식으로 다국어를 사용할 수 있게 됩니다. 이 후 json이 수정되면 다시 위 명령어를 호출해 model 을 업데이트 시켜줍니다.

그러면 이제 안전한 다국어를  사용할 준비가 되었는데 그 예시는 아래와 같습니다.

//기존
Text('conversation_person_1_1'.tr);

//수정된 형태
Text(tl.common.conversationPerson11);

 

tl 이라는 객체는 아래와 같이 생긴 json을 바탕으로 만들어진 모델의 shortCut 입니다. 

GhI18nLanguage get tl => GhTranslatorHelper()._translateLanguage;

 

 

이 tl 객체를 전역에서 불러와 사용하면 되는데 여기서 기존에 가지고있던 문제점인 유지보수가 어려운 점을 해결할 수 있습니다.

 

예를들어

기존에 json에 등록되어있던 'conversation_person_2_1' 값을 실수로 삭제한 경우 명령어 입력시 model 생성과정에서 현재 기준 json 을 바탕으로 모델을 만들기 때문에 만약 기존에 tl.common.conversationPerson21 을 사용하는곳이 있었다면 해당 row에는 에러가 발생해 빌드를 할 수 없게됩니다.

 

이와같이 String 기반 다국어 처리가 아닌 Model을 통한 다국어처리를 하고 거기에 json 과 Model 의 동기화를 명령어 한줄로 수행함으로써 불필요하게 늘어날 코드를 방지하고 미래에 발생할 유지보수의 어려움을 사전에 막아 더 효율적인 결과물을 도출할 수 있게 됩니다.

반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함