1. 준비

GeoIP는 MaxMind(http://www.maxmind.com/)에서 오픈소스로 제공하는 국가별 IP체크 라이브러리이다.
다운로드 주소는 여기 http://www.maxmind.com/app/geolitecountry


빨간 네모박스 안의 링크에서 GeoIP API와 Database 파일을 다운로드할 수 있다.
GeoIP API는 매우 다양한 언어로 제공이 되는데, 여기서는 Java를 이용한다.(현재 GeoIPJava 최신버전은 1.2.3)


다운로드 받은 파일의 압축을 해제하면 위와 같은 GeoIPJava 폴더와 GeoIP.dat 파일을 얻을 수 있다.
GeoIPJava/source/com 폴더를 자신의 프로젝트 폴더로 복사하고 GeoIP.dat를 적당한 위치(C:\GeoIP.dat)에 옮겨둔다.
이로서 GeoIP를 사용하기 위한 준비가 끝났다.


2. 사용방법

먼저GeoIP LookupService 객체를 생성한다.
LookupService lookup = null;

try {
	lookup = new LookupService("C:\GeoIP.dat", LookupService.GEOIP_MEMORY_CACHE);
} catch (IOException e) {
	exceptionLogger.fatal("Unexpected exception: "+e);
}
LookupService 객체생성이 완료되었다면 다음과 같이 IP별 국가코드 및 국가명을 검색할 수 있다.
InetAddress inetAddress = InetAddress.getByName(url.getHost());
Country country = lookup.getCountry(inetAddress.getHostAddress());

String countryCode = country.getCode();
String countryName = country.getName();
위 코드에서와 같이 LookupService 객체의 getCountry 메소드는 도메인명이 아닌 IP를 주소를 인자로 받는다.
따라서 도메인명을 IP주소로 변환하기 위해 DNS서버에 질의를 하게 되는데 이와 같은 과정은 상당히 높은 오버헤드를 수반하게 된다. 오버헤드를 줄이기 위해 DNS 결과를 캐쉬하는 방법을 사용할 수 있다.

Java에서 DNS 캐쉬를 제어하기 위해서 $JAVA_HOME/jre/lib/security/java.security 파일을 수정한다.

networkaddress.cache.ttl=10(또는 임의의 정수)
networkaddress.cache.negative.ttl=10(또는 임의이 정수)

첫번째는, 네임 서비스로부터의 이름의 검색에 성공했을 경우의 캐싱 정책를 나타낸다. 지정하는 값은, 성공한 검색 결과를 캐쉬하는 초수를 나타내는 정수인데 -1의 값은 영원히 캐쉬함을 의미한다.

두번째는, 네임 서비스로부터의 이름의 검색에 실패했을 경우의 캐싱 정책를 나타낸다. 지정하는 값은, 실패한 검색 결과를 캐쉬하는 초수를 나타내는 정수인데 0 의 값은, 캐쉬하지 않는다는 의미이다. -1 의 값은 영원히 캐쉬함을 의미한다.

어플리케이션상에서 캐쉬를 제어하기 위해서는 다음과 같은 코드를 사용한다.
java.security.Security.setProperty("networkaddress.cache.ttl" , "10");

'프로그래밍 > 오픈소스' 카테고리의 다른 글

SQLite with Eclipse  (1) 2010.05.06
SWF파일 분석 도구  (0) 2010.04.13
boost library 설치  (0) 2010.03.17
libcurl 사용하기  (0) 2010.03.15
SQLite  (3) 2009.09.11
ACE(ADAPTIVE Communication Environment)  (0) 2009.09.03
MySQL++  (0) 2009.08.21
C++ 암복호화 라이브러리 Crypto++  (0) 2009.08.20
C/C++ XML Parser TinyXml  (1) 2009.08.20
HttpClient와 Jericho Parser를 이용한 HTML 파싱  (0) 2009.07.28
GeoIP를 이용한 IP대역별 국가코드 검색  (1) 2009.07.07
Posted by devop

댓글을 달아 주세요

  1. java 버전으로 정리해 놓으셨네요. 잘 참고하겠습니다.
    저도 GeoIP에 대해 PHP로 정리했는데요. 함께 참고하시면 좋을 것 같네요
    http://blog.acronym.co.kr/313

    2012.03.08 10:43 신고 [ ADDR : EDIT/ DEL : REPLY ]