소프트웨어 아키텍처는 창의력의 산물이기 때문에 정답이 있는 것은 아니지만 몇 가지 소개를 하려고 한다. 다시 한번 강조하지만 국제화가 잘 된 소프트웨어의 아키텍처 원칙은 다음과 같다.
“하나의 소스코드, 한번의 빌드, 하나의 팩키지”
나라별로 별도의 소스코드를 관리하고 별도로 빌드를 하거나 제품이 각각 따로 나온다면 이를 관리하기 위해서 열배, 백배의 노력을 들여야 한다.
국제화된 소프트웨어는 크게 “싱글 로케일”과 “멀티 로케일”로 구분할 수 있다. “싱글 로케일”은 소프트웨어가 동작하면서 하나의 로케일만 지원하는 것이다. 이런 소프트웨어는 지원하는 로케일을 바꾸려면 소프트웨어의 설정을 바꾼 후 Restart 하거나 L10n 모듈을 Reload 해야 한다. 몇몇 데스크탑 소프트웨어가 여기에 해당한다.
위 그림처럼 어플리케이션이 시작될 때 필요한 L10n 모듈만 Load해서 하나의 로케일로만 동작하는 것이다. 이 경우 L10n 모듈은 DLL이나Shared Object 형태로 제작해서 Dynamic load를 할 수 있다. 이런 아키텍처는 복잡도가 낮고 필요한 L10n 모듈만 Load를 하기 때문에 메모리를 절약할 수 있는 장점이 있다.
아래 그림처럼 한국인이 사용할 때는 L10n ko_KR 라이브러리만 Load를 하고 일본인이 사용할 때는 L10n ja_JP 라이브러리를 Load하면 된다. 이런 방식은 로케일을 중간에 바꾸거나 섞어서 사용할 수 없는 단점이 있다. 예를 들어서 날짜는 한국식으로 표현을 하다가 독일인에게 메시지를 보내기 위해서 숫자의 형식을 바꿔준다든지 하는 등의 기능은 구현할 수 없다. 소프트웨어의 성격에 알맞게 아키텍처를 선택하면 된다.
두번째 방식을 “멀티 로케일”을 지원하기 위한 방식이다. “멀티 로케일”은 소프트웨어가 동시에 여러 가지 로케일을 지원하는 것이다. 여러 L10n 라이브러리를 모두 Load 해 놓고 한국인이 사용할 때는 L10n ko_KR 라이브러리를 이용해서 한국인에게 알맞게 동작하고 일본인이 사용할 때는 L10n ja_JP 라이브러리를 사용하는 방식이다. 대부분의 서버 소프트웨어는 “멀티 로케일”지원이 필요하다. 데스크탑 소프트웨어도 요구사항에 따라서 “멀티 로케일”지원이 필요하다. 사용자가 접속할 때마다 필요한 L10n 라이브러리를 Load하는 것은 부담이 심하기 때문에 모두 Load를 해 놓는 것이다.
“멀티 로케일”을 지원하는 소프트웨어는 한 화면에서 로케일을 바꿔가면서 동작할 수도 있고 기능별로 다른 로케일을 사용할 수도 있다. 즉, 날짜는 한국식, 숫자는 독일식, 통화는 미국식으로 동작하게 할 수도 있다. 이런 소프트웨어는 메모리를 많이 쓰는 단점이 있기는 하지만 메모리를 많이 사용하는 것은 요즘 세상에 단점으로 볼 수도 없다. 장점으로는 소프트웨어 국제화 지원에 제한이 없다는 것이다.
그럼 이런 방식을 구현하기 위해서는 어떤 아키텍처를 사용해야 할까? 수많은 방법이 있겠지만 그 중에서 한가지 방법은 아래와 같이 클래스 상속을 이용하는 방법이다. L10n Base Class에서 필요한 국제화 함수들을 정의하고 기본 기능을 구현한 후에 각 로케일별 서브클래스를 구현하는 방식이다. 로케일별로 각기 다른 기능은 서브클래스에서 각각 구현하면 된다. 그리고 접속한 사용자에 따라서 필요한 로케일의 서브클래스를 호출하면 된다. 이때 i18n 라이브러리는 적절한 분기를관장하게 된다.
이 방법 외에도 Function Pointer를 이용하는 방법도 있고 방법은 무궁무진할 것이다. 소프트웨어의 성격에 맞게 창의력을 발휘해서 가장 알맞은 방법을 선택하면 될 것이다.
소프트웨어를 개발할 때 아키텍처를 결정하는 것은 매우 중요하다. 한번 정하면 쉽게 바꾸기 어렵기 때문이다. 소프트웨어의 전략, 비전 그리고 회사의 목표와 방향도 알아야 소프트웨어의 아키텍처를 잘 정할 수 있다. 국제화된 소프트웨어를 개발할 때는 회사의 국제화 전략을 잘 이해해야 한다.
목표와 비전을 모르고 후다닥 만들어진 소프트웨어는 십리도 못가서 발병이 날 것 이다. 이런 소프트웨어는 아니 만드니 만도 못한 경우가 허다하다.