(by 웹지니, aspnetmvp@gmail.com)

불과 수 년 전까지만 해도 웹 애플리케이션을 개발하면서 웹 애플리케이션의 Globalization을 고려하는 개발자나 그에 대한 수요는 그다지 많지 않았다. 그도 그럴 것이 당시 대한민국 인터넷 사용자를 대상으로 한 시장이 지금처럼 포화상태도 아니었을 뿐더러 대한민국 IT 업계가 아직은 대한민국 인터넷 사용자만으로도 먹고 살만 했기 때문이다. 물론 서비스 자체가 여전히 성장의 여지가 남아있었음도 한 몫 했을테고.

그러나 시간이 점차 흐르면서 이제 국내 시장을 타겟으로 개발되는 서비스들도 글로벌 시장을 고려하지 않을 수 없게 되었다. 기껏해야 5천만, 그 중 인터넷 인구 2천만이 조금 넘는 대한민국 인터넷 시장에서 서비스와 서비스를 제공하는 회사의 성장이 한계에 부딪히기까지는 그다지 많은 시간이 필요하지 않을 것이라는 것쯤은 입아프게 말하지 않아도 조금만 생각해 보면 누구나 알 수 있는 자명한 사실.

그러나 최근 들어 게임 및 포털들의 해외 진출이 시작되고 중소 기업들도 좁은 국내 시장에서 탈피하여 해외로 진출하지 않는 이상 더 이상의 성장이 어렵기 때문에 이제 웹 개발자들에게 Globalization이란 애플리케이션의 설계 단계에서부터 반드시 고려되어야 하는 필수적인 요소가 되어가고 있다. 태생이 꼬부랑 글씨 쓰는 애들은 자기네 나라 말로만 만들어도 지구 상에 왠만한 나라 사람들은 무리 없이 사용할 수 있지만 우리네 한글은 그 우수성에도 불구하고 대한민국에서만 사용되다보니 한글로 아무리 좋은 서비스를 만들어봤자 우리만의 잔치가 될 뿐이며 전 세계 사용자를 대상으로 하는 글로벌 서비스가 될 수 없다.

필자는 현재까지 약 6년여에 걸쳐 여러 글로벌 서비스를 구축, 운영해 온 경험을 가지고 있으며 그런 필자의 경험이 독자 여러분에게 조금이나마 도움이 되기를 바라는 마음으로 글로벌 웹 서비스 구축에 필요한 기본적인 몇 가지를 여러분과 공유하고자 하는 의미에서 이번 포스트 시리즈를 기획하게 되었다.  

글로벌 웹 애플리케이션 구축에서 첫 번째로 소개하고자 하는 내용은 MaxMind사의 IP 데이터베이스를 활용하는 방법이다. 웹 애플리케이션 경험이 조금이라도 있는 개발자라면 MaxMind 사의 홈페이지를 통해 필요한 정보를 어렵지 않게 수집할 수 있겠지만 이번 포스트는 간략한 예제를 통해 웹 애플리케이션에서 IP 데이터베이스를 활용하는 방법을 빠르게 소개하는 것이 목적이다.

글로벌 서비스에서의 IP Database와 위치 기반 콘텐츠의 중요성

IP 데이터베이스는 말 그대로 전 세계에 널려있는 IP 주소에 대한 데이터베이스이다. 특정 IP가 어느 나라, 어느 지역에 할당되어 있으며 어떤 ISP에서 사용하고 있는지, 혹은 어떤 사용자에게 할당되어 있는지 등 유용한 정보가 담겨있다. 애플의 아이폰 덕분에 위치 정보가 어디에 어떻게 활용되는지는 이제 누구나 익숙하겠지만 IP 주소에 기반한 위치 정보는 글로벌 시장을 타겟으로 하는 웹 서비스 입장에서는 매우 중요하다. 왜냐하면 내가 만든 서비스를 어느 나라에서 많이 사용하는지, 또는 어떤 지역에서 사용하는지, 어느 지역 사용자가 어떤 서비스의 활용도가 높은지 등 서비스를 분석하고 향상시키기 위해 필요한 모든 분석 지표에 지역 및 위치 정보가 활용되기 때문이다.

뿐만 아니라 서비스가 제공하는 콘텐츠도 이 위치 정보에 의해 좌우되기도 한다. 예를 들어 얼마 전 구글이 야심차게 오픈했다는 구글 뮤직 페이지를 방문해 보면 아래와 같은 화면을 볼 수 있을 것이다.

그림 1: 구글 뮤직 페이지 - 한국에는 언제 열어주려나...

현재 사용자의 접속 지역을 토대로 페이지의 콘텐츠를 제어한 좋은 예이다. 만일 내가 만드는 서비스가 디지털 아이템, 특히 CP(Content Provider, 콘텐츠 공급자)에 의해 제공되는 아이템을 온라인에서 판매하는 서비스라면 사용자의 접속 지역을 파악하는 것은 더욱 중요해진다. 왜냐하면 이들 콘텐츠의 판매에 대한 라이선스 계약에 따라 특정 지역에서는 해당 아이템을 사용자가 구매하지 못하도록 제어할 필요가 있기 때문이다. 특히 각 국가나 지역별로 판매하는 디지털 아이템의 가격이 달라질 수 있다면 현재 접속 중인 사용자의 위치는 더욱 중요해진다. 사용자의 접속 지역을 잘못 판단하면 향후 매출 집계 및 CP에 대한 정산에 있어 오차가 발생할 수 있으며 이는 곧 회사의 손실로 이어지기 때문이다.

따라서 IP 데이터베이스의 구축 및 사용자의 위치 정보 수집 및 활용 등은 웹 애플리케이션을 위한 프레임워크 레벨에서 구현되어 전체 조직 내의 개발자들이 공통의 코드를 사용하도록 해야 한다. 특히 IP 데이터베이스가 문제인데 구글이나 마이크로소프트 등 대형 인터넷 서비스/소프트웨어 업체 수준의 정밀한 IP 데이터베이스가 우리 회사에도 있다면 얼마나 좋겠냐마는 현실적으로 어려운 이상 대안을 찾을 수 밖에 없다. 구글 신에게 도움을 청해보면 알겠지만 그래도 현재 가장 쓸만한 IP 데이터베이스를 제공하는 곳이 바로 MaxMind.com이다.

MaxMind GeoIP 솔루션 소개

MaxMind사는 전 세계의 IP 데이터베이스를 서비스로 제공하는 회사로 IP를 이용하여 해당 IP가 사용되는 국가 및 지역에 대한 정보 및 해당 IP의 위치(위도 및 경도) 정보를 제공하는 데이터베이스와 API를 제공한다. 크게 무료 버전과 유료 버전으로 구분되며 무료 버전(GeoLiteCity라는 이름으로 제공된다)의 경우 IP에 대한 국가 수준의 정보가 제공되는 반면 유료 버전(GeoIPCity라는 이름으로 제공된다)을 구매하면 도시 수준의 보다 상세한 위치 정보를 얻을 수 있게 된다. 아래 그림은 MaxMind GeoLiteCity 데이터베이스에 대한 소개 및 다운로드 페이지의 모습이다.

그림 2: MaxMind사의 GeoLiteCity 데이터베이스 소개 페이지

그림 2에서 붉게 표시한 링크를 클릭하면 GeoLiteCity.dat.gz 파일을 다운로드할 수 있다. 이 파일은 GeoLiteCity.dat 파일을 압축한 파일이며 이 파일이 바로 전 세계 IP 주소의 위치 정보를 담고 있는 데이터베이스 파일이다. 물론 페이지 아래 쪽에서 CSV 형식의 파일을 다운로드 후 여러분이 사용하는 RDBMS로 가져올 수도 있다. 이 포스트에서는 GeoLiteCity.dat 파일을 사용하기로 한다. GeoLiteCity.dat 파일은 단순한 바이너리 파일이며 따라서 다운로드한 파일을 그대로 웹 서버에 배포하여 사용할 수 있다. 이 파일로부터 특정 IP 주소의 위치 정보를 가져오기 위해서는 별도의 API가 필요하며 그림 2의 웹 페이지 좌측 메뉴엣 [GeoIP APIs] 링크를 클릭하여 독자 여러분의 개발 언어에 따라 적당한 API를 다운로드하면 된다. 이 포스트에서는 C#으로 작성된 .NET용 API를 사용한다. 다운로드 한 C# API 압축 파일의 압축을 해제해보면 아래 그림과 같은 파일들이 존재하는 것을 확인할 수 있다.

그림 3: MaxMind C# API를 구성하는 소스 파일들

전체 소스가 모두 필요한 것은 아니며 ~Example.cs 파일을 제외한 나머지 파일들만 프로젝트에서 사용하면 된다.

Working with MaxMind API

그러면 간단한 예제를 통해 MaxMind API의 사용법을 확인해 보자. 먼저 Visual Studio를 실행하고 아래 그림과 같이 필요한 파일들을 프로젝트에 추가하자.

그림 4: ASP.NET MVC2 프로젝트를 구성한 모습

그림 4에서 보듯이 GeoLiteCity.dat 파일은 웹 애플리케이션 프로젝트의 루트에 추가했으며 MaxMind  API를 구성하는 소스 파일들은 GeoIP라는 폴더에 추가하였다. MaxMind API의 핵심은 LookupService 클래스로 이 클래스에 IP 주소를 전달하면 Location 클래스의 인스턴스를 돌려준다. Location 클래스는 지정된 IP 주소를 사용하는 지역의 국가 코드와 지역 코드, 위도 및 경도, 우편 번호 등의 데이터를 가지고 있다. 그러면 ASP.NET MVC 프로젝트에 기본으로 생성된 HomeController.cs 파일을 열고 Index 액션 메서드를 아래와 같이 수정해보자.

public ActionResult Index()
{
	var lookup = new LookupService(Server.MapPath("GeoLiteCity.dat"));
	var location = lookup.getLocation("168.126.63.1");

	ViewData["country"] = String.Format("Country: {0} ({1})",
		location.countryName, location.countryCode);
	ViewData["location"] = String.Format("Location: Latitude: {0}, Longitude: {1}",
		location.latitude, location.longitude);

	return View();
}

이제 /Views/Home/Index.aspx 파일을 열고 코드를 아래와 같이 수정하자.


    

<%= Html.Encode(ViewData["country"]) %>

<%= Html.Encode(ViewData["location"]) %>


이 페이지를 실행한 결과는 아래 그림과 같다.

그림 5: 예제 코드의 실행 결과

그림에서 보듯이 지정한 IP 주소의 소유 국가와 위치 정보가 잘 나타나는 것을 볼 수 있다. 이처럼 API가 제공하는 정보들을 활용하면 서비스의 콘텐츠를 지역별로 얼마든지 제어할 수 있게 된다.

MaxMind API 사용 시 주의할 점

지금까지 MaxMind API를 이용하여 IP 주소를 기준으로 사용자의 위치 정보를 얻어내는 방법을 소개하였다. 포스트를 마무리하면서 한 가지 주의할 점은 IP 주소를 이용한 위치 정보는 (당연하겠지만) 공인 IP를 대상으로 하기 때문에 사설 IP를 사용하는 사무실 이나 가정에서 개발자 PC에 할당된 주소를 API에 전달하면 null이 리턴된다. 또한 MaxMind IP 데이터베이스의 커버리지는 100%가 아닌 99.5%이므로 0.5%는 잘못된 정보가 리턴되거나 혹은 null이 리턴될 수 있다. 따라서 Location 객체 등을 사용하기 전에는 반드시 null 여부를 검사하는 것이 좋다.

또한 MaxMind가 제공하는 무료 버전의 IP 데이터베이스를 사용할 계획이라면 국가 및 위/경도 값 외에 지역이나 우편 번호 등 나머지 정보들은 커버리지가 낮은 편이므로 이 정보에 너무 의존하지 않는 것이 좋다. 만일 이 정보들이 반드시 필요하다면 유료 버전을 구매할 것을 권한다.




Posted by 웹지니 트랙백 0 : 댓글 4