- 데이터베이스, 전자화된 파일 등으로 공공기관에서 사용할 목적으로 처리된 자료 또는 정보
- 공공기관에서의 일상적 업무 수행의 결과물로 생성 또는 수집/취득한 다양한 형태(텍스트, 이미지, 동영상 등)의 모든 자료
공공기관이 이용자로 하여금 기계 판독이 가능한 형태의 공공데이터에 접근할 수 있게 하거나 이를 다양한 방식으로 전달하는 것
공공기관이 이용자에게 정보를 재활용할 수 있도록 제공하고, 제공받은 정보를 상업적/비영리적으로 이용할 권한을 부여하는 것
정부에서 운영하고 있는 공공데이터를 제공하는 웹 애플리케이션으로 누구나 자유롭게 공공데이터를 확인하고 관련 내용을 활용하여 애플리케이션을 만들 수 있다.
CSV, XML, exls
형태의 파일로 데이터를 제공하는 것
사용자가 직접 파일을 다운로드받아 사용할 수 있다.
HttpRequest 요청
을 보내면 서버가 데이터를 응답해주는 방식
이때 요청해야 되는 주소, 파라미터(요청 시 전달 값), 반환 데이터 등이 정해져 있으며
이 방식을 이용하기 위해서는 인증키를 발급 받아야 된다.
-> 웹 애플리케이션 개발 시에는 해당 OpenAPI 방식을 권장한다.
key=value
형식으로 전달 해야만 함HTML과 같은 마크업 언어(Markup Language)
웹에서 구조화된 문서를 전송 가능하도록 설계되어 각 요소들의 독립성을 보장함으로써
문서의 호환성, 내용의 독립성, 요소 변경의 용이성 등의 특성을 제공하는 사용자 정의 태그 문서이다.
자바스크립트의 구문 형식
프로그래밍 언어나 플랫폼에 독립적이기 때문에 C, C++, C#, Java, JavaScript 등 많은 언어에서 이용 가능하다.
각 항목이나 내용마다 쉼표(comma)로 구분되어 저장
CSV형식의 파일은 텍스트 파일로 보존되며 문서처리기나 편집기에서 열람 및 편집 가능하다.
엑셀에서 ‘다른 이름으로 저장'시 파일 형식을 CSV 포맷으로 변환도 가능하다.
마이크로소프트(MS)사의 엑셀 문서 형식
스프레드시트를 연결하고 통합하여 다양한 도형과 차트 등 자료를 작성하는 기능을 제공한다.
이제 공공데이터 OpenAPI를 진짜로 사용해 보자!
- 공공데이터포털 사이트 회원 가입 후 로그인
- 사용하고자 하는 공공데이터 조회 및 선택
- OpenAPI 개발 계정 신청
- 개발하고자 하는 Application에서 공공데이터 연동 기능 구현
지금부터 이 절차를 사진과 함께 자세히 설명해 보도록 하겠다.
공공데이터포털 사이트로 접속하여 회원 가입 후 로그인을 한다.
내가 사용하고자 하는 공공데이터 이름을 검색해 보자.
나는 '한국환경공단_에어코리아'를 조회해 보았다.
조회하면 다양한 공공데이터를 조회할 수 있는데, 나는 그중 제일 위에 있는 한국환경공단_에어코리아_대기오염정보
를 사용해 볼 것이다.
원하는 공공데이터를 눌러 상세 조회 페이지로 이동해 보자.
이렇게 상세 조회를 하면 해당 오픈 API에 대한 정보들을 볼 수 있다.
'요청변수' 항목에서는 이 API를 사용하기 위해 필요한 변수들을 볼 수 있는데,
'항목구분'에서 필수
로 표기된 항목들은 꼭 작성을 해야 하는 점 기억해야 한다!
이 자료들을 사용하기 위해서는 우측 상단의 '활용 신청'을 완료해야만 한다.
내가 활용하기 위한 목적에 따라 '활용 목적'을 선택 및 작성해 준 뒤, 활용 신청 버튼을 클릭하면 신청 완료! 😉
마이페이지 > 데이터 활용 > Open API > 활용신청 현황
에 들어가 보면 내가 신청한 Open API가 있는 것을 볼 수가 있다. 여기서 원하는 Open API를 클릭하여 상세 조회해 본다.
'활용신청 상세기능정보'에서 원하는 기능의 '미리보기' 확인 버튼을 클릭하면 내가 원하는 대로 샘플데이터를 커스터마이징해서 미리 볼 수가 있다.
여기서 제일 위에 serviceKey
항목을 볼 수 있는데, 여기에는 내가 발급받은 인증키를 입력해야만 한다.
인증키 확인을 위해 마이페이지 > Open API > 인증키 발급현황
으로 들어가 보자.
사진과 같이 내 인증키를 볼 수가 있다.
이처럼 Open API 사용 시 인증키가 꼭 필요하니 이것도 기억해 두자!
다시 원하는 Open API 상세 조회 페이지로 돌아가 '활용신청 상세기능정보'에서 인증키를 입력한 뒤 '미리보기' 확인 버튼을 클릭해 보자.
returnType에 작성한 타입에 따라 (xml 또는 json)
내가 작성한 내용대로 Open API 코드를 미리 볼 수가 있다.
마지막으로 Java Application
과 Web Application
에서의 공공데이터 연동 기능 구현 절차를 알아보자.
- 요청할 주소를 전달해서
java.net.URL
객체 생성하기- 생성된 URL 객체를가지고
HttpUrlConnection
객체 얻어내기- 요청 시 필요한 Header 설정하기
- 해당 Open API 서버로 요청 보낸 후 입력 스트림을 통해 응답 데이터 받기
- 다 사용한 스트림 객체 반납하기
- Jsp에서 현재 웹 애플리케이션 서버로 ajax 요청
- Controller에서 요청 받기 (이때 요청 시 전달값이 있다면 기록)
HttpURLConnection
객체 활용해서 Open API 서버에 요청하여 응답데이터 받기- 3번 과정에서의 응답 데이터를 Client에게 다시 응답
- Client 측에서 돌려받은 응답데이터를 가지고 파싱 작업 후 웹 페이지에 시각화 하기
자, 이제 준비는 끝났다!
Spring에서 코드를 작성해 보자.
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<script src="https://code.jquery.com/jquery-3.7.0.min.js" integrity="sha256-2Pmvv0kuTBOenSvLm6bvfBSSHrUJ+3A7x6P5Ebd07/g=" crossorigin="anonymous"></script>
<title>대기오염 공공데이터</title>
</head>
<body>
<h1>실시간 대기 오염 정보</h1>
지역 :
<select id="location">
<option>서울</option>
<option>부산</option>
<option>대전</option>
</select>
<button id="btn1">해당 지역 대기 오염 정보</button>
<br>
<br>
<table border="1" id="result1">
<thead>
<tr>
<th>측정소명</th>
<th>측정일시</th>
<th>통합대기환경수치</th>
<th>미세먼지농도</th>
<th>아황산가스농도</th>
<th>일산화탄소농도</th>
<th>이산화탄소농도</th>
<th>오존농도</th>
</tr>
</thead>
<tbody></tbody>
</table>
<script>
$(function() {
$("#btn1").click(function() {
// 응답 데이터를 json 형식으로 응답받을 때
$.ajax({
url : "air",
data : {location : $("#location").val()},
success : function(data) {
// console.log(data);
// console.log(data.response.body.items)
const itemArr = data.response.body.items;
let value = "";
for(let item of itemArr){
// console.log(item);
value += "<tr>"
+ "<td>" + item.stationName + "</td>"
+ "<td>" + item.dataTime + "</td>"
+ "<td>" + item.khaiValue + "</td>"
+ "<td>" + item.pm10Value + "</td>"
+ "<td>" + item.so2Value + "</td>"
+ "<td>" + item.coValue + "</td>"
+ "<td>" + item.no2Value + "</td>"
+ "<td>" + item.o3Value + "</td>"
+ "</tr>"
}
$("#result1 > tbody").html(value);
}, error : function() {
console.log("통신 실패");
}
})
})
})
</script>
</body>
</html>
package com.kh.opendata.controller;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
public class OpenAPIController {
// 발급받은 인증키 변수 처리
public static final String SERVICEKEY = "내서비스키";
// json 형식으로 대기오염 OpenAPI 활용하기
@ResponseBody
// @RequestMapping(value = "air", produces = "application/json; charset=UTF-8")
public String airMethod(String location) throws IOException {
// OpenAPI 서버로 요청하고자 하는 url 작성
String url = "http://apis.data.go.kr/B552584/ArpltnInforInqireSvc/getCtprvnRltmMesureDnsty";
url += "?serviceKey=" + SERVICEKEY; // 서비스키 추가
url += "&sidoName=" + URLEncoder.encode(location, "UTF-8"); // 지역명 추가(한글이 들어가면 인코딩 처리해야 함)
url += "&returnType=json"; // 리턴 타입
url += "&numOfRows=10"; // 결과 개수
// 1. 작성된 url 정보를 넣어서 url 객체 생성
URL requestUrl = new URL(url);
// 2. 생성된 URL 객체로 URLConnection 생성
HttpURLConnection urlConn = (HttpURLConnection) requestUrl.openConnection();
// 3. 요청 시 필요한 Header 설정하기
urlConn.setRequestMethod("GET");
// 4. 해당 OpenAPI 서버로 요청 후 입력 스트림을 통해서 응답데이터 읽어 오기
BufferedReader br = new BufferedReader( new InputStreamReader( urlConn.getInputStream() ) );
String responseText = "";
String line;
while((line=br.readLine()) != null) {
responseText += line;
}
// 5. 다 사용한 스트림 반납 및 연결 해제
br.close();
urlConn.disconnect();
System.out.println(responseText);
return responseText;
}
...
<script>
$(function() {
$("#btn1").click(function() {
// 응답 데이터를 xml 형식으로 받을 때
$.ajax({
url : "air",
data : {
location : $("#location").val()
},
success : function(result) {
console.log(result);
// $(요소명).find(매개변수)
// - 기준이 되는 요소의 하위 요소들 중 특정 요소를 찾을 때 사용
// - html, xml은 같은 markup language이기 때문에 사용 가능하다.
// console.log($(result).find("item"));
// xml 형식의 응답 데이터를 받았을 때
// 1. 넘겨 받은 데이터를 $() 제이쿼리화 시킨 후
// 응답 데이터 안에 실제 데이터가 담겨 있는 요소 선택하기
const itemArr = $(result).find("item");
// 2. 반복문을 통해 실제 데이터가 담긴 요소들에 접근해서 동적으로 요소 만들기
let value;
itemArr.each(function(index, item) {
// console.log(item);
console.log($(item).find("stationName")
.text());
value += "<tr>" + "<td>"
+ $(item).find("stationName")
.text() + "</td>" + "<td>"
+ $(item).find("dataTime").text()
+ "</td>" + "<td>"
+ $(item).find("khaiValue").text()
+ "</td>" + "<td>"
+ $(item).find("pm10Value").text()
+ "</td>" + "<td>"
+ $(item).find("so2Value").text()
+ "</td>" + "<td>"
+ $(item).find("coValue").text()
+ "</td>" + "<td>"
+ $(item).find("no2Value").text()
+ "</td>" + "<td>"
+ $(item).find("o3Value").text()
+ "</td>" + "</tr>"
})
// 3. 동적으로 만들어낸 요소를 화면에 출력
$('#result1 > tbody').html(value);
},
error : function() {
console.log("통신 실패");
}
})
})
})
...
// xml 형식으로 대기오염 OpenAPI 활용하기
@ResponseBody
@RequestMapping(value="air", produces="text/xml; charset=UTF-8")
public String airPollution(String location) throws IOException {
// OpenAPI 서버로 요청하고자 하는 url 작성
String url = "http://apis.data.go.kr/B552584/ArpltnInforInqireSvc/getCtprvnRltmMesureDnsty";
url += "?serviceKey=" + SERVICEKEY; // 서비스키 추가
url += "&sidoName=" + URLEncoder.encode(location, "UTF-8"); // 지역명 추가(한글이 들어가면 인코딩 처리해야 함)
url += "&returnType=xml"; // 리턴 타입
url += "&numOfRows=20"; // 결과 개수
// 1. 요청할 주소를 전달해서 java.net.URL 객체 생성하기
URL requestUrl = new URL(url);
// 2. 생성된 URL 객체로 URLConnection 생성
HttpURLConnection urlConn = (HttpURLConnection) requestUrl.openConnection();
// 3. 요청 시 필요한 Header 설정하기
urlConn.setRequestMethod("GET");
// 4. 해당 OpenAPI 서버로 요청 후 입력 스트림을 통해서 응답데이터 읽어 오기
BufferedReader br = new BufferedReader( new InputStreamReader( urlConn.getInputStream() ) );
String responseText = "";
String line;
while((line=br.readLine()) != null) {
responseText += line;
}
// 5. 다 사용한 스트림 반납 및 연결 해제
br.close();
urlConn.disconnect();
System.out.println(responseText);
return responseText;
}
원하는 지역을 선택한 뒤 '해당 지역 대기 오염 정보' 버튼을 클릭해 보자.
위 사진과 같이 해당하는 지역의 대기 오염 정보가 조회된다!
공공데이터 포털 사이트를 살펴보니 다양한 분야의 API가 무척 많았다. 잘 활용하면 무궁무진한 개발이 가능할 것 같다. 😉
정리 너무 멋져요!..! 읽기만 해도 완전 찰떡 이해🍳