1. 들어가며
국가별, 지역별 방문자 통계 기능을 만들기 위해 이것저것을 조사하던 중 `GeoLite2`를 사용해 테스트를 진행한 결과 무료로 사용하기 좋으나 위치가 정확하지 않고 업데이트가 번거롭다는 진실을 마주했다.
GeoLite2를 테스트해 본 이전 글
https://greathyeon.tistory.com/56
[Java] GeoLite2 사용해 IP 위치 조회 기능 구현하기
1. 들어가며방문자 통계 기능을 만들어야 하는데 국가별, 지역별 접속자 통계를 구현해 달라는 요청이 있었다.무료인 것을 찾다 보니 GeoLite2라는 게 나오길래 한 번 테스트 삼아 이용해 봤다.GeoLi
greathyeon.tistory.com
다른 대안으로 IPinfo api를 사용해 IP위치 조회 기능을 구현해 보자.
2. 준비물(Gradle)
결괏값을 json으로 받을 것이기 때문에 `org.json`의존성을 추가해 줬다.
build.gradle에 dependencies 추가
dependencies {
implementation 'org.json:json:20231013' // 최신 버전 사용
}
3. IPinfo - Geolocation API 사용법(Java)
API를 호출해서 사용하기만 하면 되기 때문에 코드가 복잡하지는 않다.
apiURL에 조회를 원하는 IP만 쿼리 스트링에 입력해서 넘겨주기만 하면 된다.
import org.json.JSONObject;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
public class IPinfoApi {
public static void main(String[] args) {
try{
String testIp = "8.8.8.8";
String apiUrl = "https://ipinfo.io/" + testIp + "/json";
URL url = new URL(apiUrl);
HttpURLConnection con = (HttpURLConnection) url.openConnection();
con.setRequestMethod("GET");
con.setRequestProperty("Accept", "application/json");
if(con.getResponseCode() != 200){
System.out.println("API 요청 실패 : " + con.getResponseCode());
return;
}
BufferedReader br = new BufferedReader(new InputStreamReader(con.getInputStream()));
StringBuilder sb = new StringBuilder();
String line;
while( (line = br.readLine()) != null){
sb.append(line);
}
br.close();
JSONObject jsonObject = new JSONObject(sb.toString());
String ip = jsonObject.getString("ip");
String country = jsonObject.getString("country");
String region = jsonObject.getString("region");
String city = jsonObject.getString("city");
System.out.println("IP : " + ip);
System.out.println("Country : " + country);
System.out.println("Region : " + region);
System.out.println("City : " + city);
}catch (Exception e){
e.printStackTrace();
}
}
}
4. 결과 출력
입력한 IP의 국가와 지역값이 잘 넘어오는 것을 확인할 수 있었다.
자세한 정보는 공식 도큐먼트에서 확인할 수 있다.
5. 마무리
지난번 사용했던 ` GeoLite2`는 지역정보를 불러내지 못하는 경우가 있었지만 `IPinfo`는 일단 값을 불러내오기 때문에 쓸모가 있을 것 같다. 물론 이 API 또한 무료 버전에서는 정확한 값을 보장하지 못한다고 한다. 세상에 완전한 공짜는 없는가 보다.
무료 버전의 한계도 있는데 월간 요청수가 5만 건으로 제한된다고 한다.
요청 수가 적은 프로젝트에서는 유용하게 사용할 수 있을 것 같다.
근데 5만 건을 어떻게 계산하나 궁금해서 찾아봤더니 api key를 발급받지 않고 지속적인 요청을 할 경우 차단될 위험이 있다고 한다. API key를 발급받으려면 회원가입을 해야 한다.
Free and easy setup, no credit card required.
카드 정보를 요구하지 않는다고 하니 무료 버전도 안심하고 사용할 수 있을 것 같아 보이기는 한다.
또한 알아본 봐, 무료 플랜에서 5만 건 초과 요청 시 API 응답이 차단되고 HTTP 429(Too many Requests) 에러가 발생하며 응답을 받을 수 없다고 한다.
지금까지 찾은 방법 중에서는 이게 제일 좋을 것 같기는 하지만 더 알아보도록 하겠다.
'JAVA' 카테고리의 다른 글
[Java] GeoLite2 사용해 IP 위치 조회 기능 구현하기 (0) | 2025.02.18 |
---|---|
[Java] 자바로 엑셀 다루기 - Apache POI 라이브러리 사용법 (0) | 2025.02.16 |
[Java] JVM(Java Virtual Machine)은 무엇이며 왜 좋은가? (0) | 2025.02.15 |
[Java] diamond operator is not supported 에러 (0) | 2025.02.14 |
[Java] Math.random()의 취약성과 시큐어 코딩 (0) | 2024.11.19 |