JAVA

[Java] IPinfo API 사용해 IP 위치 조회 기능 구현하기

그레이트현 2025. 2. 23. 19:28
반응형

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만 건으로 제한된다고 한다.

요청 수가 적은 프로젝트에서는 유용하게 사용할 수 있을 것 같다.

IPinfo 요금제

 

근데 5만 건을 어떻게 계산하나 궁금해서 찾아봤더니 api key를 발급받지 않고 지속적인 요청을 할 경우 차단될 위험이 있다고 한다. API key를 발급받으려면 회원가입을 해야 한다.

IPinfo 회원가입 창

 

Free and easy setup, no credit card required.
카드 정보를 요구하지 않는다고 하니 무료 버전도 안심하고 사용할 수 있을 것 같아 보이기는 한다.

 

또한 알아본 봐, 무료 플랜에서 5만 건 초과 요청 시 API 응답이 차단되고 HTTP 429(Too many Requests) 에러가 발생하며 응답을 받을 수 없다고 한다.

 

지금까지 찾은 방법 중에서는 이게 제일 좋을 것 같기는 하지만 더 알아보도록 하겠다.

반응형