레이블이 지역화인 게시물을 표시합니다. 모든 게시물 표시
레이블이 지역화인 게시물을 표시합니다. 모든 게시물 표시

2014년 2월 18일 화요일

한국 SW가 해외에서 힘 못쓰는 이유

01/02/03은 몇년 몇월 며칠일까? 

우리나라 사람들은 2001년 2월 3일로 읽지만 미국사람들은 2003년 1월 2일로 읽는다. 이것이 다 일까? 호주사람들은 2003년 2월 1일로 읽는다. 이렇듯 나라마다 날짜를 쓰는 방식이 다를 뿐만 아니라 번역, 날짜, 숫자, 화폐, 단수/복수, 어순, 쓰기 방향, 키보드배치, 폰트, 띄어쓰기 여부, 쉼표, 온도, 문장정렬, 이름, 주소, 색깔의 의미, 섬머타임, 종이 크기 등 지역, 언어별로 다른 것들은 수천가지에 이른다. 

이렇게 나라마다 언어마다 다른 특성을 소프트웨어도 각각 다르게 지원해야 한다. 이를 소프트웨어 국제화와 지역화라고 부른다. 하지만 많은 우리나라 소프트웨어는 제대로 된 국제화 전략 없이 개발돼 해외에서 외면받는 일이 많다. 

그 중에는 적당히 넘어갈 수 있는 것도 있지만 많은 항목들이 버그로 보고 된다. 어설프게 개발된 소프트웨어는 고쳐도 고쳐도 끝이 없다. 일단 국제화에 대한 이해를 돕기 위해서 꼭 알아야 할 용어를 알아보자.

첫 번째는 국제화(Internationalization)다. 영어 줄임말로 i18n이라고 한다. ‘i’와 ‘n’사이에 18글자의 알파벳이 있다. 단어가 워낙 길어 이렇게 짧게 줄여서 얘기한다. 소프트웨어를 여러 나라 언어를 지원하기 쉬운 구조로 만드는 것이다. 국제화가 잘된 소프트웨어는 쉽게 여러 나라 언어를 지원할 수 있다. 

두 번째는 지역화(Localization)다. 줄여서 L10n이라고 한다. 소프트웨어를 특정 지역의 언어를 지원하도록 만드는 것이다. 예를 들면 중국어나 일본어를 지원하는 것이다.

소프트웨어 국제화라고 하면 누구나 알 것 같은 용어지만 기술적으로 자세히 들어가면 그렇게 간단하지는 않다. 많은 회사들이 소프트웨어 국제화에 대한 정교한 전략 없이 일단 소프트웨어를 개발해 놓고 국내에서 반응이 좋으면 번역을 해서 해외에 팔면 된다고 생각한다. 국제화를 미리 대비한다고 해도 국제화에 대한 부족한 지식과 경험으로 실제 해외 판매 시 많은 문제를 겪는다.

소프트웨어를 개발해서 많은 나라에 팔기 위한 전략과 기술은 수십 년간 발전해 왔는데, 많은 개발자나 경영자들은 단순히 메뉴 정도만 번역하면 되는 정도로 이해를 하고 국제화에는 별로 투자를 하지 않는다. 우리나라에 소프트웨어 국제화 전문가가 턱없이 부족한 것도 큰 문제다. 

개발자가 수천명인 대기업부터 1인 스타트업까지 우리나라 소프트웨어 회사 중에서 국제화를 제대로 알고  적용하고 있는 회사는 거의 없다고 보면 된다. 문제는 대부분 국제화가 그렇게 어려운 지, 무엇을 해야 하는지 잘 모른다는 것이다. 

의욕만 가지고 되는 것은 아니다. 방대한 지식과 경험이 필요하다. 비주얼스튜디오나 엑스코드(XCode) 등 각 개발 툴에서 제공하는 기본적인 국제화 방법은 그야말로 기초 중에 기초이며 이것만 이용해서 대규모 상업용 소프트웨어의 국제화를 완성할 수는 없다. 그런 것들은 마트의 시식코너 같은 것인데 이것이 전부인줄 알면 오산이다. 

우리가 흔히 알고 있는 글로벌 소프트웨어들은 국제화가 매우 잘 되어 있고 지역화를 통해서 수십, 수백개의 언어를 지원한다. 기술적으로는 지역과 언어를 합친 로케일(locale)을 지원한다고 한다. 

소프트웨어를 처음 개발할 때부터 국제화를 제대로 적용하면 개발비용이 5%만 더 들어간다. 추후 지역화 비용은 각 언어별로 1~2%정도만 더 쓰면 된다.

제품마다 비율은 다르지만 대충 이해를 돕기 위해서 설명하면 그 정도다. 여러 언어를 지원하더라도 개발자들이 특별히 해줘야 할 것은 거의 없고 대부분의 프로세스는 자동화된다. 국제화가 잘 된 소프트웨어는 추가로 몇 개의 언어를 지원하더라도 큰 비용과 시간이 들지 않는다.

하지만 급하다고 또는 무지 때문에 국제화에 대한 전략 없이 그냥 소프트웨어를 개발하면 처음에는 5% 절약은 되겠지만 나중에 여러 언어를 지원하려고 할 때 수십 ~수백배 비용이 더 들어가게 된다. 시간이 흐를수록 비용도 점점 늘어난다. 

물론 나라별 고객의 요구를 무시하면 되지만 그러면 제품 품질은 형편없이 떨어지게 된다. 사례에 따라서 비용 부담의 편차는 다르지만 허술한 국제화에 대한 전략이 미치는 폐해는 엄청나다. 많은 회사들이 어설프게 여러 언어를 지원하다가 포기하거나 결국 실패한 사례는 셀 수 없이 많다. 

그렇지만 소프트웨어 국제화를 처음부터 제대로 적용하기는 쉽지 않다. 소프트웨어 국제화 시 고려해야 할 것이 수백 가지인데 일반 개발자들은 대부분은 들어본 적도 없는 것들이며 들어 봤어도 어떻게 해야 할지 막막한 것들이다. 

소프트웨어 국제화는 관습, 문화적인 것도 이해를 해야 하지만 기술적인 것도 매우 중요하다. 국제화를 위한 수많은 기술이 수십 년간 연구되어 왔는데 이를 다 이해하는 것만도 전문가가 아닌 사람들에게는 벅찬 일이다. 그래서 소프트웨어 국제화 전문가가 필요한 것이다. 

그럼 우리나라 회사들은 어떻게 국제화에 실패했는지 실제 사례를 알아보자.

E사는 초기에 한국어만 지원하도록 소프트웨어를 개발했다. 그런데 일본어 버전이 필요할 때 한국어 버전을 복사해서 번역을 할 경우 한 달이면 일본어 버전을 만들 수 있고 나름대로 국제화를 적용하려면 두 달이 걸린다는 개발자들의 의견에 경영진은 빠른 개발을 선택했다.

한국어와 일본어 버전은 소스코드가 갈라졌고, 매번 개발 시마다 양쪽 소스코드에 각각 기능을 적용했다. 두 소스코드는 점점 달라졌다. 이제는 너무 달라져서 두 소스코드를 다시 합치는 것이 불가능하며 그런 식으로 중국어 버전까지 나오다보니 비효율적인 개발에 따른 고통을 겪고 있다. 

S사는 웹서비스 회사다. 처음에는 국내 사용자만을 대상으로 하는 서비스였는데 몇 년전 해외에도 서비스를 오픈 하려고 했다. 하지만 처음에 서비스를 시작할 때 별 계획 없이 데이터베이스에 자료를 한국어(EUC-KR)로 입력해 놓았다.

전세계 모든 언어를 지원하려면 유니코드로 저장해야 한다. 글로벌 서비스를 위해서 데이터를 유니코드로 변환하려고 했는데 데이터베이스만 변환한다고 될 일은 아니었다. 얽혀 있는 것이 너무 많고 소스코드를 너무 많이 바꿔야 했다. 엄두가 나지 않아 결국 데이터베이스 변환 계획은 포기했다. 

C사는 국내 서비스를 해외 서비스로 확장하기 위해서 해외 버전을 별도로 개발했다. S사와 마찬가지로 별도 개발하는 것이 더 빨리 개발할 수 있는 상황이었다. 

문제는 해외 서비스 오픈 후에 발생했다. 이중으로 작업을 하다가 팀을 나눠서 각각의 서비스를 따로 개발하기 시작했다. 개발은 점점 비효율적으로 변해갔다. 그러느라고 해외 서비스는 제대로 개발도 못하는 상황이 벌어졌다.

A사는 나름대로 연구를 해서 국제화 기능을 구현했다. 각 언어의 메시지를 데이터베이스에 넣어 관리를 하는 방식으로 구현했다. 개발자는 코딩을 하다가 메뉴 등 메시지를 하나 추가하려면 많은 일을 해야해서 부담스럽다. 

메시지를 추가하려면 먼저 엑셀에 해당 메시지를 추가해야 하는데 다른 개발자가 동시 수정하면 충돌이 일어나는 일이 자주 발생했다. 그래서 메시지 관리 담당자를 따로 정해서 관리했다. 그러다보니 관리부담만 늘고 개발자들은 매번 담당자에게 요청하느라 매우 불편해졌다. 

국가별 날짜포맷도 연구해서 직접 개발을 했다. 국제화에 많은 노력을 투자했음에도 A사는 해외 고객들로부터 계속 수많은 국제화 관련 버그를 보고 받고 있다. 

I사도 국제화에 많은 노력을 기울였다. E사 제품은 한국어의 특징을 살려서 제품 유저인터페이스(UI)가 상당히 조밀하다. 한국어는 단어 길이가 짧은 것들이 많다보니 메뉴, 옵션 화면 등을 상당히 빽빽하게 구성됐다.

이런 화면을 영어, 독일어로 변환하다 보니 언어별로 메시지 길이가 천차만별이라서 화면 구성에 애를 먹었다. 결국에 화면을 언어별로 다르게 디자인했는데 그렇게 개발한 후로 개발할 때마다 언어별 화면을 튜닝 하느라고 많은 비용이 들어가고 있다. 

N사는 언어별로 번역을 해서 소프트웨어를 여러 나라에 팔고 있다. 그런데 번역이 잘못되었다는 버그를 많이 보고 받았다. “A의 B”를 변역 해야 했고 A와 B는 다른 단어로 대체 가능한 문장이었다. 

그런데 영어로 번역을 하니 “A of B”처럼 어순이 뒤바뀌어 의미가 달라져 버렸다. 그리고 “사과 2개”를 영어로 번역을 하니 “2 apple”과 같이 복수 처리가 안되었다. 복수 지원을 위해서 복수 메시지 함수를 만들었는데 언어마다 단수, 복수 체계가 다르다는 것을 몰랐다. 지금도 구조적인 번역 오류에 대한 보고는 계속 되고 있다. 

이렇게 여러 실패 사례를 알아 봤는데, 안타까운 것은 지금도 소프트웨어 국제화의 필요성을 인식 못하고 이와 같은 일들이 계속 벌어지고 있다. 해외에 소프트웨어를 팔 계획을 가지고 있고 영원히 영어만 지원하는 소프트웨어를 만들 것이 아니라면 국제화 전문가의 도움을 받아야 한다. 

회사 내부에서 1, 2년만에 전문가를 키우기도 쉽지 않다. 소프트웨어마다 필요한 국제화 수준이 다르기는 하지만 지금처럼 소프트웨어 국제화를 쉽게 생각하다가는 좋은 소프트웨어가 국경과 문화의 장벽에 막혀서 실패하는 일은 계속 될 것이다. 

글로벌 소프트웨어를 개발하는 있어서 소프트웨어 국제화는 선택이 아닌 필수요소임을 알아야 한다. 

이글은 ZDNet Korea에 기고한 칼럼입니다.

2010년 12월 14일 화요일

해외에 소프트웨어를 팔려면 이것이 꼭 필요하다.

연초에 소프트웨어의 국제화와 지역화를 언급하면서 조만간 이에 대한 글을 올리겠다고 했는데, 벌써 10개월이 지났네요. 
2010/02/11 - [소프트웨어이야기] - 애플은 한국어와 한글을 구분하지 못한다?

그래서 간단하게 정리를 해보려고 합니다.

일단 다음의 기본 용어는 알아두는 것이 좋습니다.

 i18n(internationalization) - 국제화를 말하며 i와 n사이에 18개의 알파벳이 있어서 i18n으로 줄여말합니다. 소프트웨어가 여러 언어(locale)를 지원하기 용이한 형태로 만드는 것을 말합니다. i가 소문자인 이유는 알파벳엘(l) 또는 숫자일(1)과 혼동되기 때문입니다. 

 L10n(localization) - 지역화를 말하며 l과 n사이에 10개의 알파벳이 있어서 L10n으로 줄여말합니다. 소프트웨어를 해당 지역에서 사용할 수 있도록 메시지나 기능을 해당지역에 맞춰주는 것을 말합니다.

Locale - 지역화의 단위입니다. 한국어를 공식적으로 쓰는 나라는 우리나라밖에 없어서 (북한예외) Locale과 나라를 동일시하기도 하는데 영어만 아더라도 여러나라에서 쓰고 캐나다에서는 영어와 프랑스어를 모두 쓰게 됩니다. 따라서 Locale에는 언어 정보와 지역정보가 같이 포함되어 있습니다. 제 글에서는 국가와 혼영해서 사용했으니 알아서 이해하세요.

최근의 소프트웨어들을 보면 국경은 의미가 없어진지 오래입니다. 특히 스마트폰이 폭발적으로 보급되면서 개발자들과 세계 각국의 사용자들은 더욱 가까워졌습니다.

그래서 지역화된 소프트웨어가 더욱 절실해졌습니다. 그런데 우리나라 상황을 보면 아직도 많은 소프트웨어들이 국제화와 지역화에 관심을 기울이지 않고 있습니다. 그러다보니 국내에서 성공한 제품들을 들고 해외에 진출을 하다가 국제화와 지역화의 어려움에 막혀서 좌절하곤 합니다.

 국제화, 지역화 방법은 표준을 따라야 합니다.

국제화와 지역화에대한 소프트웨어 개발의 표준(De facto)이 정립된지는 매우 오래되었지만, 국내에서는 별로 관심을 받지 못하는 것이 사실입니다. 그렇게 어렵지 않은 기술임에도 관심들이 별로 없고 관심이 있다고 하더라도 흩어져 있는 정보를 모두 모아서 하나의 그림으로 보기 어려운 상황입니다. 어렵지는 않다고 했지만 매우 복잡하기 때문에 처음에 이해하기란 쉽지 않습니다.

대부분의 소프트웨어 회사들은 국제화와 지역화 과정에서 표준적인 방법을 따르지 않고 스스로 연구한 방법을 사용하다가 큰 낭패를 보게 됩니다. 왜냐하면 국제화와 지역화에 대한 방대한 지식을 소수의 개발자가 연구해서 체계화 하기란 불가능합니다. 전세계 수백명의 개발자들이 십수년간 모여서 완성한 것을 우습게 보면 안됩니다.

그래서 스스로의 방법은 대부분 실패하게 됩니다. 

 초기부터 국제화와 지역화를 고려해야 합니다.

소프트웨어 개발 초기부터 국제화와 지역화를 신경쓰지 않다가 제품을 다 완성한 후에 나중에 반영을 하게 되면 또 엄청난 비용이 들고 그 방법이 잘못되었다면 비용을 많이 들이고도 또 실패합니다.

소프트웨어가 다른 언어를 지원해야 할 가능성이 단 1%라도 있다면 저는 국제화와 지역화를 적용하여 소프트웨어를 개발합니다. 초기부터 적용하는 것은 비용이 추가로 거의 들지 않기 때문입니다.

 소프트웨어는 하나로 만들어야 합니다.

여러개로 지역화된 소프트웨어 별로 Master가 별도로 존재한다면 이를 관리하는데 또 엄청난 비용을 지불해야 합니다. 표준적인 방법들은 대부분은 하나의 소프트웨어에서 여러개의 언어(locale)을 지원할 수 있도록 미리 준비되어 있습니다.

Locale별로 여러벌의 소프트웨어가 존재한다면 이를 관리하는 비용은 기하급수로 증가하여 혼돈의 상태를 경험하게 됩니다. 이 과정에서 수많은 오류가 발생하고 해외 진출 실패의 주요 원인이 되곤 합니다.

 메시지 번역이 지역화의 전부가 아닙니다.

흔히들 우리나라에서 성공한 제품을 가지고 해외에 진출한다고 영어버전을 만들고 일본어, 중국어 버전을 만들곤 합니다. 이때 그냥 메시지만 번역을 해서 지역화된 제품이라고 생각하곤 합니다. 하지만 이런 제품을 해외에 가지고 나갔다가는 낭패를 보기 일쑤입니다. 외국과 우리나라가 그렇게 비슷하다고 생각하면 착각입니다.

숫자만하더라도 우리나라에서는 1,234.56이라고 쓰는 것을 독일에서는 1.234,56이라고 씁니다. 즉 콤마와 소숫점을 반대로 사용합니다. 

이런식으로 언어(locale)이 고려해야 할 것은 메시지외에도 Collate, Ctype, Monetary, Numeric, Time이 있습니다. 이것들은 표준적으로 정해 놓은 것이고 비표준적인 요소는 이보다 훨씬 많습니다. 비표준적인 요소들은 제품마다 별도로 분석해야 합니다.
 메시지도 단순히 번역하는 것이 다가 아닙니다.

간단한 예로 나라마다 어순이 다르고 단수, 복수의 표현이 다릅니다.

우리나라에는 단수, 복수에 따른 차이가 거의 없지만, 영어에는 복수가 있지요. 하지만 폴란드어는 1개일때 2~4개일때, 5개 이상일 때 서로 표현이 다릅니다. 게다가 12~14개로 넘어가면 또 반복이 됩니다.

이렇듯 거의 모든 요소에서 다른 나라에서는 과연 이대로 쓰는지 의심을 해봐야 합니다. 경험도 많이 필요합니다. 그러면서 자연스럽게 문장의 표현 방법도 글로벌하게 문제가 없는 방법을 사용하게 됩니다.

또한, 번역을 했을 때 문장의 길이가 천차만별이기 때문에 UI 디자인시 문장의 길이를 충분히 길다고 생각하고 디자인을 해야 합니다.

이러한 모든 것이 습관이 되어 있다면 간단한 일이지만 초기에는 매우 귀찮은 일이 됩니다.
 유니코드는 기본입니다.

지역화된 소프트웨어를 개발하다보면 항상 부딪히는 것이 문자코드의 충돌입니다.
유니코드를 사용하지 않아도 지역화된 소프트웨어를 개발할 수 없는 것은 아니지만, 여러 군데에서 매우 귀찮은 일이 발생하게 됩니다.
따라서 유니코드를 기본으로 생각하면 복잡한 문제들이 대부분 해소가 됩니다.
기존에 ANSI 프로그램만 작성을 하다가 유니코드 프로그램을 작성하는 것이 낯설고 어려울 수 있지만 이 또한 적응이 되고 나면 그렇게 어려운 일도 아닙니다.

단, 유니코드 및 문자셋, 코드셋, 인코딩 등 복잡한 컨셉을 모두 제대로 이해하는 것은 보통 어려운 일이 아닙니다. 그렇지 않다면 개발을 하다가도 "어찌어찌 하니 우연히 되더라"하는 식의 개발이 되기도 합니다.

유니코드가 적용된 지역화된 소프트웨어를 개발하려면 갖춰야할 기본 지식이 매우 많습니다.

 꾸준히 유지보수 할 수 있는 프로세스를 만들어야 합니다.

지역화된 소프트웨어를 만들때 흔히 발생하는 문제점이 처음에 한번 개발은 어떻게든 해 냈는데, 유지보수 단계에서 상당히 곤란한 상황에 처한다는 겁니다. 한국어를 포함해서 영어, 중국어, 일본어 그러고 여러 언어를 지원하다보면 패치를 만들어가 업그레이드를 할 때 매번 새로 추가된 메시지와 삭제, 변경된 메시지를 추려서 각각의 언어로 번역을 하고 제품에 반영해서 또 테스트를 해야 하는데 그게 잘 안되고 뒤죽박죽되기 일쑤입니다. 툭하면 어떤 언어에서는 메시지가 제대로 안나오곤 합니다.
지역화 프로세스는 번역과정을 빼고는 모두 자동화를 해서 추가로 비용이 들지 않아야 합니다.

각 개발자나 회사에서 스스로 만든 지역화 방법을 사용하면 좋지 않은 결정적인 이유가 유지보수 입니다. 대부분의 개인들이 만든 지역화 방법은 유지보수까지 완벽하게 반영하지 못한 것이 대부분이기 때문입니다.
 결론

필자는 무슨 소프트웨어를 만들지간에 국제화는 무조건 생각합니다. 이미 알고 있는 마당에서 비용이 추가로 들것도 별로 없습니다.
하지만, 초기에 국제화를 생각하지 않고 나중에 영업이 잘되서 해외 진출을 한번 해보려고 하면 국제화와 지역화는 큰 걸림돌이 될 겁니다. 
이 또한 알면 무지 쉬운데 모르면 한없이 어려운 분야 중 하나입니다.
"유비무환". 미리미리 준비해서 언제든지 글로벌 소프트웨어 회사들과 경쟁할 준비를 해놓읍시다.

이번 글에는 소프트에어의 국제화와 지역화의 필요성과 개념만 정리를 했는데, 그 구체적인 방법은 너무 광범위 해서 블로그 글로 모두 적기는 어려울 것 같습니다. 하지만 기회가 되면 한가지씩 올려 볼 수는 있을 것 같습니다.

혹시 소프트웨어의 국제화와 지역화가 필요하기는 한데 어려움을 겪고 있거나 이미 스스로 방법을 만들어서 쓴맛을 본 분들이 있으면 연락해주세요. 도움이 되어 드리면 좋겠습니다. :)