본문 바로가기
JAVA

JAVA 실습 10. 공공데이터를 이용하여 코로나 공공마스크 지원 약국 주소찾기.

by 김마리님 2020. 4. 10.

원형 클래스

package mask;

import java.util.ArrayList;

import lombok.Data;

@Data
class MaskList {
	private int count;
	private int page;
	ArrayList<StoreInfos> storeInfos;
	@Data
	class StoreInfos {
		String addr;
		String code;
		Double lat;
		Double lng;
		String name;
		String type;
	}

	private int totalCount;
	private int totalPages;
}

 

먼저, 공공데이터포털에서 코로나 관련 공적 마스크 페이지를 불러온다.

https://www.data.go.kr/dataset/15043025/openapi.do

 

공공데이터포털

국가에서 보유하고 있는 다양한 데이터를『공공데이터의 제공 및 이용 활성화에 관한 법률(제11956호)』에 따라 개방하여 국민들이 보다 쉽고 용이하게 공유•활용할 수 있도록 공공데이터(Dataset)와 Open API로 제공하는 사이트입니다.

www.data.go.kr

이 소스는 허가를 필요로 하지 않는 데이터로, 오픈 url이 있다.

이 url 데이터를 바탕으로 자바로 데이터 파일을 불러온다.

만들어진 json 페이지를 바탕으로 원형 클래스를 만든다.

이 때, storeInfo는 데이터 내부에 key-value 형태이므로 배열로 제작한다.

 


 

메인 매서드가 있는 자바 파일

package mask;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.ArrayList;
import java.util.Scanner;

import com.google.gson.Gson;

import mask.MaskList.StoreInfos;

public class MaskApp {
	public static int getTotalPages() {
		try {
			URL url = new URL("https://8oi9s0nnth.apigw.ntruss.com/corona19-masks/v1/stores/json?page=1");
			HttpURLConnection con = (HttpURLConnection) url.openConnection();
			BufferedReader br = new BufferedReader(new InputStreamReader(con.getInputStream(), "UTF-8"));
			StringBuilder sb = new StringBuilder();
			String input = "";
			while ((input = br.readLine()) != null) {
				sb.append(input);
			}
			br.close();
			con.disconnect();
			Gson gson = new Gson();
			MaskList maskList = gson.fromJson(sb.toString(), MaskList.class);

			return maskList.getTotalPages();

		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return 0;
	}

	public static MaskList GetPharmacyInfo(int page) {
		try {
			URL url = new URL("https://8oi9s0nnth.apigw.ntruss.com/corona19-masks/v1/stores/json?page=" + page);
			HttpURLConnection con = (HttpURLConnection) url.openConnection();
			BufferedReader br = new BufferedReader(new InputStreamReader(con.getInputStream(), "UTF-8"));
			StringBuilder sb = new StringBuilder();
			String input = "";
			while ((input = br.readLine()) != null) {
				sb.append(input);
			}
			br.close();
			con.disconnect();
			Gson gson = new Gson();
			MaskList maskList = gson.fromJson(sb.toString(), MaskList.class);
			return maskList;

		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return null;
	}

	public static void main(String[] args) {

		ArrayList<MaskList> Pharmacy = new ArrayList<>();
		int total = getTotalPages();
		for (int i = 1; i <= total; i++) {
			MaskList GetPharmacy = GetPharmacyInfo(i);
			Pharmacy.add(GetPharmacy);
		}
		System.out.println("지역을 입력해주세요.");
		Scanner sc=new Scanner(System.in);
		String area=sc.next();
		for (MaskList m : Pharmacy) {
			for (StoreInfos storyInfo : m.getStoreInfos()) {
				if(storyInfo.getAddr().contains(area)) {
					System.out.println(storyInfo.getAddr());
				}
			}
		}
		sc.close();
	}

}

이 페이지의 질의 스트링은 하나 뿐이다. 페이지이다.

따라서, 페이지 넘버를 변수로 가져올 수 있는 메서드 하나, 데이터 전체를 가져올 수 있는 매서드 하나, 총 두 개의 매서드를 필요로 한다. 

url과 httpopenconnection을 통해 스트림을 연결 후, bufferreader을 통해 버퍼를 연결한다.

readline을 통해 읽어온 데이터를 stringbuilder을 이용해 쌓아올린다.

이 받아온 json 데이터를 gson을 통해 자바 언어로 변경 한다.

 

메인 메서드는 빈 배열을 만들고, for이 있는 것이 stack 함수이기 때문에 지역변수가 된 값을 전역변수인 빈 배열로 끌어올린다. 이렇게 도출된 데이터를 contain을 통해 주소 내부에서 일치하는 값을 찾아내서 도출한다.

 

이 때, Pharmacy도 배열, StoreInfo도 다 배열이기 때문에 foreach 구문을 통해 두 변수를 다 반복시켜 모든 배열의 상태를 확인한다.

 

결과

반응형

'JAVA' 카테고리의 다른 글

17. 멀티 스레드  (0) 2020.04.13
16. 익명 클래스  (0) 2020.04.13
JAVA 실습 9. 공공데이터와 Json을 이용한 항공데이터 조회하기  (0) 2020.04.07
웹과 OSI 7계층  (0) 2020.04.07
14. Json  (0) 2020.04.06