공공 데이터(Open Data) (23.08.25)

·2023년 8월 25일
1

Spring

목록 보기
22/36
post-thumbnail

🌷 공공데이터(Open Data)

  • 데이터베이스, 전자화된 파일 등으로 공공기관에서 사용할 목적으로 처리된 자료 또는 정보
  • 공공기관에서의 일상적 업무 수행의 결과물로 생성 또는 수집/취득한 다양한 형태(텍스트, 이미지, 동영상 등)의 모든 자료

🌱 공공데이터 제공

공공기관이 이용자로 하여금 기계 판독이 가능한 형태의 공공데이터에 접근할 수 있게 하거나 이를 다양한 방식으로 전달하는 것

🌱 공공데이터 개방

공공기관이 이용자에게 정보를 재활용할 수 있도록 제공하고, 제공받은 정보를 상업적/비영리적으로 이용할 권한을 부여하는 것


🌼 공공데이터 활용

정부에서 운영하고 있는 공공데이터를 제공하는 웹 애플리케이션으로 누구나 자유롭게 공공데이터를 확인하고 관련 내용을 활용하여 애플리케이션을 만들 수 있다.

공공데이터포털 - 바로 가기


🌼 공공데이터 제공 형식

🌱 파일 다운로드 방식

CSV, XML, exls 형태의 파일로 데이터를 제공하는 것

사용자가 직접 파일을 다운로드받아 사용할 수 있다.

🌱 Open API 방식

HttpRequest 요청을 보내면 서버가 데이터를 응답해주는 방식

이때 요청해야 되는 주소, 파라미터(요청 시 전달 값), 반환 데이터 등이 정해져 있으며
이 방식을 이용하기 위해서는 인증키를 발급 받아야 된다.
-> 웹 애플리케이션 개발 시에는 해당 OpenAPI 방식을 권장한다.

💡 요청 변수 (Request Parameter)

  • OpenAPI 서버에 요청 시 필요한 속성들을 나열한 것
  • 항목구분이 필수인 속성들은 반드시 key=value 형식으로 전달 해야만 함

💡 출력 결과 (Response Element)

  • OpenAPI 서버에 요청 결과 응답메세지에 포함된 데이터의 형식
  • 기본적으로 결과 코드, 결과 메시지 등을 포함하고 있으며, 실제 필요로 하는 값들이 담겨 있는
    형식임
    -> API 문서를 잘 파악해서 구현하고자 하는 application과 연동해야 함!

🌱 데이터 포맷 종류

💡 XML 형식

HTML과 같은 마크업 언어(Markup Language)

웹에서 구조화된 문서를 전송 가능하도록 설계되어 각 요소들의 독립성을 보장함으로써
문서의 호환성, 내용의 독립성, 요소 변경의 용이성 등의 특성을 제공하는 사용자 정의 태그 문서이다.

💡 JSON 형식

자바스크립트의 구문 형식

프로그래밍 언어나 플랫폼에 독립적이기 때문에 C, C++, C#, Java, JavaScript 등 많은 언어에서 이용 가능하다.

💡 CSV 형식

각 항목이나 내용마다 쉼표(comma)로 구분되어 저장

CSV형식의 파일은 텍스트 파일로 보존되며 문서처리기나 편집기에서 열람 및 편집 가능하다.
엑셀에서 ‘다른 이름으로 저장'시 파일 형식을 CSV 포맷으로 변환도 가능하다.

💡 XLS 형식

마이크로소프트(MS)사의 엑셀 문서 형식

스프레드시트를 연결하고 통합하여 다양한 도형과 차트 등 자료를 작성하는 기능을 제공한다.


이제 공공데이터 OpenAPI를 진짜로 사용해 보자!

🌷 공공데이터 OpenAPI 사용 절차

  1. 공공데이터포털 사이트 회원 가입 후 로그인
  2. 사용하고자 하는 공공데이터 조회 및 선택
  3. OpenAPI 개발 계정 신청
  4. 개발하고자 하는 Application에서 공공데이터 연동 기능 구현

지금부터 이 절차를 사진과 함께 자세히 설명해 보도록 하겠다.

🌼 1. 공공데이터 포털 회원 가입 후 로그인

공공데이터포털 사이트로 접속하여 회원 가입 후 로그인을 한다.

🌼 2. 사용하고자 하는 공공데이터 조회 및 선택

내가 사용하고자 하는 공공데이터 이름을 검색해 보자.
나는 '한국환경공단_에어코리아'를 조회해 보았다.

조회하면 다양한 공공데이터를 조회할 수 있는데, 나는 그중 제일 위에 있는 한국환경공단_에어코리아_대기오염정보를 사용해 볼 것이다.
원하는 공공데이터를 눌러 상세 조회 페이지로 이동해 보자.

이렇게 상세 조회를 하면 해당 오픈 API에 대한 정보들을 볼 수 있다.
'요청변수' 항목에서는 이 API를 사용하기 위해 필요한 변수들을 볼 수 있는데,
'항목구분'에서 필수로 표기된 항목들은 꼭 작성을 해야 하는 점 기억해야 한다!

🌼 3. OpenAPI 개발 계정 신청

이 자료들을 사용하기 위해서는 우측 상단의 '활용 신청'을 완료해야만 한다.

내가 활용하기 위한 목적에 따라 '활용 목적'을 선택 및 작성해 준 뒤, 활용 신청 버튼을 클릭하면 신청 완료! 😉

마이페이지 > 데이터 활용 > Open API > 활용신청 현황에 들어가 보면 내가 신청한 Open API가 있는 것을 볼 수가 있다. 여기서 원하는 Open API를 클릭하여 상세 조회해 본다.

'활용신청 상세기능정보'에서 원하는 기능의 '미리보기' 확인 버튼을 클릭하면 내가 원하는 대로 샘플데이터를 커스터마이징해서 미리 볼 수가 있다.
여기서 제일 위에 serviceKey 항목을 볼 수 있는데, 여기에는 내가 발급받은 인증키를 입력해야만 한다.

인증키 확인을 위해 마이페이지 > Open API > 인증키 발급현황으로 들어가 보자.

사진과 같이 내 인증키를 볼 수가 있다.
이처럼 Open API 사용 시 인증키가 꼭 필요하니 이것도 기억해 두자!

다시 원하는 Open API 상세 조회 페이지로 돌아가 '활용신청 상세기능정보'에서 인증키를 입력한 뒤 '미리보기' 확인 버튼을 클릭해 보자.

returnType에 작성한 타입에 따라 (xml 또는 json) 내가 작성한 내용대로 Open API 코드를 미리 볼 수가 있다.

🌼 4. 개발하고자 하는 Application에서 공공데이터 연동 기능 구현

마지막으로 Java ApplicationWeb Application에서의 공공데이터 연동 기능 구현 절차를 알아보자.

🌱 Java Application

💡 HttpUrlConnection 객체 사용 절차

  1. 요청할 주소를 전달해서 java.net.URL 객체 생성하기
  2. 생성된 URL 객체를가지고 HttpUrlConnection 객체 얻어내기
  3. 요청 시 필요한 Header 설정하기
  4. 해당 Open API 서버로 요청 보낸 후 입력 스트림을 통해 응답 데이터 받기
  5. 다 사용한 스트림 객체 반납하기

🌱 Web Application

💡 비동기식으로 웹 애플리케이션에 적용하고자 할 때의 절차

  1. Jsp에서 현재 웹 애플리케이션 서버로 ajax 요청
  2. Controller에서 요청 받기 (이때 요청 시 전달값이 있다면 기록)
  3. HttpURLConnection 객체 활용해서 Open API 서버에 요청하여 응답데이터 받기
  4. 3번 과정에서의 응답 데이터를 Client에게 다시 응답
  5. Client 측에서 돌려받은 응답데이터를 가지고 파싱 작업 후 웹 페이지에 시각화 하기

자, 이제 준비는 끝났다!

Spring에서 코드를 작성해 보자.

👀 json 형식으로 OpenAPI 활용

🌱 index.jsp

<%@ 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>

🌱 OpenAPIController.java

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;
	}

👀 XML 형식으로 OpenAPI 활용

🌱 index.jsp

...
	<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("통신 실패");
							}

						})
					})
		})



🌱 OpenAPIController.java

...
	// 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가 무척 많았다. 잘 활용하면 무궁무진한 개발이 가능할 것 같다. 😉

profile
풀스택 개발자 기록집 📁

1개의 댓글

comment-user-thumbnail
2023년 8월 30일

정리 너무 멋져요!..! 읽기만 해도 완전 찰떡 이해🍳

답글 달기