1. 소개
이 기사에서는 무료 GeoLite2 데이터베이스와 함께 MaxMind GeoIP2 Java API를 사용하여 IP 주소에서 지리적 위치 데이터를 가져 오는 방법을 살펴 봅니다.
또한 간단한 Spring MVC 웹 데모 애플리케이션을 사용하여이를 실제로 볼 수 있습니다.
2. 시작하기
시작하려면 MaxMind에서 GeoIP2 API 및 GeoLite2 데이터베이스를 다운로드해야합니다.
2.1. Maven 의존성
Maven 프로젝트에 MaxMind GeoIP2 API를 포함하려면 pom.xml 파일에 다음을 추가 합니다.
<dependency>
<groupId>com.maxmind.geoip2</groupId>
<artifactId>geoip2</artifactId>
<version>2.8.0</version>
</dependency>
최신 버전의 API를 얻으려면 Maven Central 에서 찾을 수 있습니다 .
2.2. 데이터베이스 다운로드
다음으로 GeoLite2 데이터베이스 를 다운로드해야 합니다 . 이 예제에서는 GeoLite2 City 데이터베이스의 바이너리 gzip 버전을 사용합니다.
아카이브의 압축을 풀면 GeoLite2-City.mmdb 라는 파일 이 생성 됩니다. 이것은 독점 MaxMind 바이너리 형식의 IP- 위치 매핑 데이터베이스입니다.
3. GeoIP2 Java API 사용
GeoIP2 Java API를 사용하여 데이터베이스에서 주어진 IP 주소에 대한 위치 데이터를 가져옵니다. 먼저 데이터베이스 를 쿼리 하는 DatabaseReader 를 만들어 보겠습니다 .
File database = new File(dbLocation);
DatabaseReader dbReader = new DatabaseReader.Builder(database).build();
다음으로 city () 메서드를 사용하여 IP 주소에 대한 도시 데이터를 가져옵니다.
CityResponse response = dbReader.city(ipAddress);
CityResponse의 목적은 도시의 이름과 기타 정보의 여러 조각이 포함되어 있습니다. 다음은 데이터베이스를 열고, IP 주소에 대한 도시 정보를 가져오고, CityResponse 에서이 정보를 추출하는 방법을 보여주는 샘플 JUnit 테스트입니다 .
@Test
public void givenIP_whenFetchingCity_thenReturnsCityData()
throws IOException, GeoIp2Exception {
String ip = "your-ip-address";
String dbLocation = "your-path-to-mmdb";
File database = new File(dbLocation);
DatabaseReader dbReader = new DatabaseReader.Builder(database)
.build();
InetAddress ipAddress = InetAddress.getByName(ip);
CityResponse response = dbReader.city(ipAddress);
String countryName = response.getCountry().getName();
String cityName = response.getCity().getName();
String postal = response.getPostal().getCode();
String state = response.getLeastSpecificSubdivision().getName();
}
4. 웹 애플리케이션에서 GeoIP 사용
사용자의 공용 IP 주소에서 지리적 위치 데이터를 가져와Map에 위치를 표시하는 샘플 웹 애플리케이션을 살펴 보겠습니다.
우리는 시작됩니다 기본 스프링 웹 MVC 응용 프로그램 . 그런 다음 POST 요청에서 IP 주소를 받아들이고 GeoIP2 API에서 추론 된 도시, 위도 및 경도를 포함하는 JSON 응답을 반환 하는 컨트롤러 를 작성합니다 .
마지막으로 사용자의 공용 IP 주소를 양식에로드하고 Ajax POST 요청을 컨트롤러에 제출 하고 결과를 GoogleMap에 표시하는 HTML 및 JavaScript를 작성합니다 .
4.1. 응답 엔티티 클래스
지리적 위치 응답을 저장할 클래스를 정의하는 것으로 시작하겠습니다.
public class GeoIP {
private String ipAddress;
private String city;
private String latitude;
private String longitude;
// constructors, getters and setters...
}
4.2. 서비스 클래스
이제 GeoIP2 Java API 및 GeoLite2 데이터베이스를 사용하여 지리적 위치 데이터를 가져 오는 서비스 클래스를 작성해 보겠습니다.
public class RawDBDemoGeoIPLocationService {
private DatabaseReader dbReader;
public RawDBDemoGeoIPLocationService() throws IOException {
File database = new File("your-mmdb-location");
dbReader = new DatabaseReader.Builder(database).build();
}
public GeoIP getLocation(String ip)
throws IOException, GeoIp2Exception {
InetAddress ipAddress = InetAddress.getByName(ip);
CityResponse response = dbReader.city(ipAddress);
String cityName = response.getCity().getName();
String latitude =
response.getLocation().getLatitude().toString();
String longitude =
response.getLocation().getLongitude().toString();
return new GeoIP(ip, cityName, latitude, longitude);
}
}
4.3. 스프링 컨트롤러
지리적 위치 응답 데이터를 얻기 위해 서비스 클래스에 "ipAddress"요청 매개 변수를 보내는 Spring MVC 용 컨트롤러 를 살펴 보겠습니다 .
@RestController
public class GeoIPTestController {
private RawDBDemoGeoIPLocationService locationService;
public GeoIPTestController() throws IOException {
locationService = new RawDBDemoGeoIPLocationService();
}
@PostMapping("/GeoIPTest")
public GeoIP getLocation(
@RequestParam(value="ipAddress", required=true) String ipAddress
) throws Exception {
GeoIPLocationService<String, GeoIP> locationService
= new RawDBDemoGeoIPLocationService();
return locationService.getLocation(ipAddress);
}
}
4.4. HTML 양식
IP 주소가 포함 된 HTML 형식으로 시작하여 Spring Controller 를 호출하는 프런트 엔드 코드를 추가해 보겠습니다 .
<body>
<form id="ipForm" action="GeoIPTest" method="POST">
<input type="text" name = "ipAddress" id = "ip"/>
<input type="submit" name="submit" value="submit" />
</form>
...
</body>
4.5. 클라이언트에서 공용 IP 주소로드
이제 jQuery 및 ipify.org JavaScript API를 사용하여 "ipAddress"텍스트 필드를 사용자의 공용 IP 주소로 미리 채 웁니다 .
<script src
="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js">
</script>
<script type="text/javascript">
$(document).ready (function () {
$.get( "https://api.ipify.org?format=json",
function( data ) {
$("#ip").val(data.ip) ;
});
...
</script>
4.6. Ajax POST 요청 제출
양식이 제출되면 Spring Controller 에 Ajax POST 요청을 작성하여 지리적 위치 데이터와 함께 JSON 응답을 검색합니다.
$( "#ipForm" ).submit(function( event ) {
event.preventDefault();
$.ajax({
url: "GeoIPTest",
type: "POST",
contentType:
"application/x-www-form-urlencoded; charset=UTF-8",
data: $.param( {ipAddress : $("#ip").val()} ),
complete: function(data) {},
success: function(data) {
$("#status").html(JSON.stringify(data));
if (data.ipAddress !=null) {
showLocationOnMap(data);
}
},
error: function(err) {
$("#status").html("Error:"+JSON.stringify(data));
},
});
});
4.7. 샘플 JSON 응답
Spring Controller 의 JSON 응답 은 다음 형식을 갖습니다.
{
"ipAddress":"your-ip-address",
"city":"your-city",
"latitude":"your-latitude",
"longitude":"your-longitude"
}
4.8. GoogleMap에 위치 표시
GoogleMap에 위치를 표시하려면 HTML 코드에 Google Maps API를 포함해야합니다.
<script src="https://maps.googleapis.com/maps/api/js?key=YOUR-API-KEY"
async defer></script>
Google 개발자 콘솔을 사용하여 GoogleMap 용 API 키를 얻을 수 있습니다.
Map 이미지를 포함하려면 HTML <div> 태그 도 정의해야합니다 .
<div id="map" style="height: 500px; width:100%; position:absolute"></div>
다음 JavaScript 함수를 사용하여 GoogleMap에 좌표를 표시 할 수 있습니다.
function showLocationOnMap (location) {
var map;
map = new google.maps.Map(document.getElementById('map'), {
center: {
lat: Number(location.latitude),
lng: Number(location.longitude)},
zoom: 15
});
var marker = new google.maps.Marker({
position: {
lat: Number(location.latitude),
lng: Number(location.longitude)},
map: map,
title:
"Public IP:"+location.ipAddress
+" @ "+location.city
});
}
웹 애플리케이션을 시작한 후Map 페이지의 URL을 엽니 다.
http://localhost:8080/spring-mvc-xml/GeoIpTest.jsp
텍스트 상자에로드 된 연결에 대한 현재 공용 IP 주소가 표시됩니다.
GeoIP2와 ipify는 모두 IPv4 주소와 IPv6 주소를 지원합니다.
양식을 제출하면 공용 IP 주소에 해당하는 도시, 위도 및 경도가 포함 된 JSON 응답 텍스트가 표시되며 그 아래에는 사용자의 위치를 가리키는 GoogleMap가 표시됩니다.
5. 결론
이 예제에서는 JUnit 테스트를 사용하여 MaxMind GeoIP2 Java API 및 무료 MaxMind GeoLite2 City 데이터베이스의 사용법을 검토했습니다.
그런 다음 IP 주소에서 지리적 위치 데이터 (도시, 위도, 경도)를 가져 오는 Spring MVC 컨트롤러 및 서비스를 구축했습니다 .
마지막으로이 기능을 사용하여 GoogleMap에 사용자의 위치를 표시하는 방법을 보여주기 위해 HTML / 자바 스크립트 프런트 엔드를 구축했습니다.
이 제품에는 http://www.maxmind.com 에서 구할 수있는 MaxMind에서 만든 GeoLite2 데이터가 포함되어 있습니다 .
이 예제의 코드는 Github 사이트 에서 찾을 수 있습니다 .
- https://docs.spring.io/spring-framework/docs/current/reference/html
- https://www.baeldung.com/geolocation-by-ip-with-maxmind
'Java' 카테고리의 다른 글
SpringData JPA 및 Querydsl을 사용한 REST 쿼리 언어 (0) | 2021.03.30 |
---|---|
Java 세션 시간 초과 (0) | 2021.03.29 |
SpringMVC의 양식 태그 라이브러리 탐색 (0) | 2021.03.29 |
자바 스크립트에서 Spring MVC 모델 객체에 접근하기 (0) | 2021.03.29 |
Spring MVC의 캐시 헤더 (0) | 2021.03.29 |