18. (네트워크) AirApp 만들기

박은서's avatar
Dec 19, 2025
18. (네트워크) AirApp 만들기

AirInfo 클래스

package com.mtcoding.airplane; import lombok.Getter; import lombok.Setter; import java.util.List; @Setter @Getter public class AirInfo { private Response response; @Setter @Getter public static class Response { private Header header; private Body body; @Setter @Getter public static class Header { private String resultCode; private String resultMsg; } @Setter @Getter public static class Body { private Items items; private Integer numOfRows; private Integer pageNo; private Integer totalCount; @Setter @Getter public static class Items { private List<Item> item; @Setter @Getter public static class Item { private String airlineNm; private String arrAirportNm; private String arrPlandTime; private String depAirportNm; private String depPlandTime; private Integer economyCharge; private Integer prestigeCharge; private String vihicleId; } } } } }

PortInfo 클래스

package com.mtcoding.airplane; import lombok.Getter; import lombok.Setter; import java.util.List; @Getter @Setter public class PortInfo { private Response response; @Getter @Setter public static class Response { private Header header; private Body body; @Getter @Setter public static class Header { private String resultCode; private String resultMsg; } @Getter @Setter public static class Body { private Items items; @Getter @Setter public static class Items { private List<Item> item; @Getter @Setter public static class Item { private String airportId; private String airportNm; } } } } }

AirApp (main)

코드

package com.mtcoding.airplane; import com.google.gson.Gson; import com.mtcoding.ex10.Hello; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Scanner; public class AirApp { // key = 무안, value = NAARKJB static Map<String, String> ports = new HashMap(); public static void main(String[] args) { try { // 1. 공항 정보를 다운 - HttpURLConnection으로 URL site1 = new URL("https://apis.data.go.kr/1613000/DmstcFlightNvgInfoService/getArprtList?serviceKey=1d4b60644d4515082456e13d65d46448695cb8a300d92371e3147cbd27160160&_type=json"); HttpURLConnection conn1 = (HttpURLConnection) site1.openConnection(); conn1.setRequestMethod("GET"); Scanner sc1 = new Scanner(conn1.getInputStream()); String json1 = ""; while (sc1.hasNextLine()) { String line = sc1.nextLine(); if (line == null) break; json1 = json1 + line; } // 2. PortInfo로 오브젝트화 시켜!! Gson gson = new Gson(); PortInfo portInfo = gson.fromJson(json1, PortInfo.class); // 3. ports에 airportId에 있는 값, airportNm에 있는 값 넣기 List<PortInfo.Response.Body.Items.Item> itemList = portInfo.getResponse().getBody().getItems().getItem(); String portKey; String portValue; for (int i = 0; i < itemList.size(); i++) { portKey = itemList.get(i).getAirportNm(); portValue = itemList.get(i).getAirportId(); ports.put(portKey,portValue); } String dep = ""; // 무안 String depKey = ""; String arr = ""; // 부산 String arrKey = ""; String time = ""; // 20251219 // 4. 스캐너로 출발지 받기 System.out.println("출발지를 입력하세요."); for (String n : ports.keySet()) { System.out.print(n + " "); } System.out.println(); Scanner keySc = new Scanner(System.in); dep = keySc.nextLine(); depKey = ports.get(dep); // System.out.println(depKey); System.out.println(); // 5. 스캐너로 목적지 받기 System.out.println("목적지를 입력하세요."); for (String n : ports.keySet()) { System.out.print(n + " "); } System.out.println(); arr = keySc.nextLine(); arrKey = ports.get(arr); // System.out.println(arrKey); System.out.println(); // 6. 출발날짜 받기 System.out.println("출발날짜를 입력하세요.YYYYMMDD(예시 : 20251218)"); time = keySc.nextLine(); // System.out.println(time); System.out.println(); // 7. 동적인 URL 만들기 String url = """ https://apis.data.go.kr/1613000/DmstcFlightNvgInfoService/getFlightOpratInfoList?serviceKey=1d4b60644d4515082456e13d65d46448695cb8a300d92371e3147cbd27160160&pageNo=1&numOfRows=10&_type=json&depAirportId=${depKey}&arrAirportId=${arrKey}&depPlandTime=${time} """.replace("${depKey}", depKey).replace("${arrKey}", arrKey).replace("${time}", time); // 8. 항공스케줄 다운 - HttpURLConnection 호출 URL site2 = new URL(url); HttpURLConnection conn2 = (HttpURLConnection) site2.openConnection(); conn2.setRequestMethod("GET"); Scanner sc2 = new Scanner(conn2.getInputStream()); String json2 = ""; while (sc2.hasNextLine()) { String line = sc2.nextLine(); if (line == null) break; json2 = json2 + line; } // 9. 파싱 -> AirInfo로 파싱 AirInfo airInfo = gson.fromJson(json2, AirInfo.class); // 10. 항송 스케줄 예쁘게 전체 출력 List<AirInfo.Response.Body.Items.Item> airList = airInfo.getResponse().getBody().getItems().getItem(); for (int i = 0; i < airList.size(); i++) { System.out.println(i); System.out.println("항공사 : " + airList.get(i).getAirlineNm()); System.out.println("도착공항 : " + airList.get(i).getArrAirportNm()); System.out.println("도착시간 : " + airList.get(i).getArrPlandTime()); System.out.println("출발공항 : " + airList.get(i).getDepAirportNm()); System.out.println("출발시간 : " + airList.get(i).getDepPlandTime()); System.out.println("일반석운임 : " + airList.get(i).getEconomyCharge()); System.out.println("비즈니스석운임 : " + airList.get(i).getPrestigeCharge()); System.out.println("항공편명 : " + airList.get(i).getVihicleId()); System.out.println(); } } catch (Exception e) { e.printStackTrace(); } } }

콘솔

C:\tools\jdk-21\bin\java.exe "-javaagent:C:\Program Files\JetBrains\IntelliJ IDEA Community Edition 2025.2.5\lib\idea_rt.jar=60794" -Dfile.encoding=UTF-8 -Dsun.stdout.encoding=UTF-8 -Dsun.stderr.encoding=UTF-8 -classpath C:\workspace\java_lab\java-network-study\out\production\classes;C:\Users\G\.gradle\caches\modules-2\files-2.1\com.solapi\sdk\1.0.3\7d5cb30cd49c9a49e4bfd4ff5d5e598efb2cbabf\sdk-1.0.3.jar;C:\Users\G\.gradle\caches\modules-2\files-2.1\com.google.code.gson\gson\2.13.2\48b8230771e573b54ce6e867a9001e75977fe78e\gson-2.13.2.jar;C:\Users\G\.gradle\caches\modules-2\files-2.1\com.googlecode.json-simple\json-simple\1.1.1\c9ad4a0850ab676c5c64461a05ca524cdfff59f1\json-simple-1.1.1.jar;C:\Users\G\.gradle\caches\modules-2\files-2.1\com.google.errorprone\error_prone_annotations\2.41.0\4381275efdef6ddfae38f002c31e84cd001c97f0\error_prone_annotations-2.41.0.jar;C:\Users\G\.gradle\caches\modules-2\files-2.1\junit\junit\4.10\e4f1766ce7404a08f45d859fb9c226fc9e41a861\junit-4.10.jar;C:\Users\G\.gradle\caches\modules-2\files-2.1\org.hamcrest\hamcrest-core\1.1\860340562250678d1a344907ac75754e259cdb14\hamcrest-core-1.1.jar;C:\Users\G\.gradle\caches\modules-2\files-2.1\org.jetbrains.kotlin\kotlin-reflect\2.2.10\98d0ca9819d98cb3aa5c0a25793830b6659feee2\kotlin-reflect-2.2.10.jar;C:\Users\G\.gradle\caches\modules-2\files-2.1\com.squareup.okhttp3\logging-interceptor\5.1.0\b23d83d9042b53ef66fc782f6b6485ccf756a91\logging-interceptor-5.1.0.jar;C:\Users\G\.gradle\caches\modules-2\files-2.1\com.squareup.retrofit2\converter-kotlinx-serialization\3.0.0\3541df11c0990f4a25610480c990d0e071a81e48\converter-kotlinx-serialization-3.0.0.jar;C:\Users\G\.gradle\caches\modules-2\files-2.1\com.squareup.retrofit2\retrofit\3.0.0\c0cdf6d243c5187732134129fda05a74f9197874\retrofit-3.0.0.jar;C:\Users\G\.gradle\caches\modules-2\files-2.1\org.jetbrains.kotlin\kotlin-stdlib-jdk8\2.2.10\80cc9a776a058eeda7053731350bc41af8858a5a\kotlin-stdlib-jdk8-2.2.10.jar;C:\Users\G\.gradle\caches\modules-2\files-2.1\commons-codec\commons-codec\1.18.0\ee45d1cf6ec2cc2b809ff04b4dc7aec858e0df8f\commons-codec-1.18.0.jar;C:\Users\G\.gradle\caches\modules-2\files-2.1\org.jetbrains.kotlin\kotlin-stdlib\2.2.10\30de6faa127a4a012db8e71bf1b9c0a99b1402b2\kotlin-stdlib-2.2.10.jar;C:\Users\G\.gradle\caches\modules-2\files-2.1\com.squareup.okhttp3\okhttp-jvm\5.1.0\c17340f19b33c1d28a47b8dc4ae15018aff6dc10\okhttp-jvm-5.1.0.jar;C:\Users\G\.gradle\caches\modules-2\files-2.1\org.jetbrains.kotlinx\kotlinx-serialization-json-jvm\1.9.0\aea6f7d49fe5c458f8963ee6d4bdaf4a459ab3e7\kotlinx-serialization-json-jvm-1.9.0.jar;C:\Users\G\.gradle\caches\modules-2\files-2.1\org.jetbrains.kotlin\kotlin-stdlib-jdk7\2.2.10\18cc96ae090a71726822631e1808c7d329faab5d\kotlin-stdlib-jdk7-2.2.10.jar;C:\Users\G\.gradle\caches\modules-2\files-2.1\org.jetbrains\annotations\13.0\919f0dfe192fb4e063e7dacadee7f8bb9a2672a9\annotations-13.0.jar;C:\Users\G\.gradle\caches\modules-2\files-2.1\org.jetbrains.kotlinx\kotlinx-serialization-core-jvm\1.9.0\91448df39c558f7c6147b8bd8db01debe16e0cc1\kotlinx-serialization-core-jvm-1.9.0.jar;C:\Users\G\.gradle\caches\modules-2\files-2.1\com.squareup.okio\okio-jvm\3.15.0\cb3c285187640f543150fcac1ae012bdd778c0e1\okio-jvm-3.15.0.jar com.mtcoding.airplane.AirApp 출발지를 입력하세요. 울산 김해 무안 사천 여수 원주 군산 청주 양양 제주 김포 대구 포항 인천 광주 김해 목적지를 입력하세요. 울산 김해 무안 사천 여수 원주 군산 청주 양양 제주 김포 대구 포항 인천 광주 김포 출발날짜를 입력하세요.YYYYMMDD(예시 : 20251218) 20251219 0 항공사 : 이스타항공 도착공항 : 김포 도착시간 : 202512190800 출발공항 : 김해 출발시간 : 202512190650 일반석운임 : null 비즈니스석운임 : null 항공편명 : ZE292 1 항공사 : 에어부산 도착공항 : 김포 도착시간 : 202512190825 출발공항 : 김해 출발시간 : 202512190720 일반석운임 : 64000 비즈니스석운임 : 0 항공편명 : BX8802 2 항공사 : 제주항공 도착공항 : 김포 도착시간 : 202512190825 출발공항 : 김해 출발시간 : 202512190720 일반석운임 : null 비즈니스석운임 : null 항공편명 : 7C904 3 항공사 : 진에어 도착공항 : 김포 도착시간 : 202512190835 출발공항 : 김해 출발시간 : 202512190730 일반석운임 : null 비즈니스석운임 : null 항공편명 : LJ602 4 항공사 : 진에어 도착공항 : 김포 도착시간 : 202512190845 출발공항 : 김해 출발시간 : 202512190740 일반석운임 : null 비즈니스석운임 : null 항공편명 : LJ604 5 항공사 : 티웨이항공 도착공항 : 김포 도착시간 : 202512190905 출발공항 : 김해 출발시간 : 202512190800 일반석운임 : null 비즈니스석운임 : null 항공편명 : TW922 6 항공사 : 대한항공 도착공항 : 김포 도착시간 : 202512190950 출발공항 : 김해 출발시간 : 202512190845 일반석운임 : 71900 비즈니스석운임 : 111900 항공편명 : KE1806 7 항공사 : 에어부산 도착공항 : 김포 도착시간 : 202512191005 출발공항 : 김해 출발시간 : 202512190900 일반석운임 : 64000 비즈니스석운임 : 0 항공편명 : BX8804 8 항공사 : 진에어 도착공항 : 김포 도착시간 : 202512191010 출발공항 : 김해 출발시간 : 202512190905 일반석운임 : null 비즈니스석운임 : null 항공편명 : LJ608 9 항공사 : 대한항공 도착공항 : 김포 도착시간 : 202512191050 출발공항 : 김해 출발시간 : 202512190945 일반석운임 : 71900 비즈니스석운임 : 111900 항공편명 : KE1810 종료 코드 0(으)로 완료된 프로세스
notion image
notion image

정답

package com.mtcoding.port; import com.google.gson.Gson; import java.util.HashMap; import java.util.List; import java.util.Scanner; public class PortApp { public static void main(String[] args) { try { // 1. 공항 정보 다운로드 (완) PortRepository repo = new PortRepository(); String portJson = repo.download("https://apis.data.go.kr/1613000/DmstcFlightNvgInfoService/getArprtList?serviceKey=1d4b60644d4515082456e13d65d46448695cb8a300d92371e3147cbd27160160&_type=json"); // System.out.println(1); // 2. PortDTO에 파싱 (완) Gson gson = new Gson(); PortDTO port = gson.fromJson(portJson, PortDTO.class); // System.out.println(2); // 3. HashMap에 옮기기 (완) List<PortDTO.Item> list = port.getResponse().getBody().getItems().getItem(); HashMap<String , String> map = new HashMap<>(); for (PortDTO.Item item : list) { String key = item.getAirportNm(); // 무안 String value = item.getAirportId(); // NAARKJB map.put(key, value); } // System.out.println(3); // map.put("무안","NAARKJB"); // map.put("광주","NAARKJJ"); // 4. 출발지(김해), 목적지(김포), 출발시간(20251220) 키보드로 입력 받기 Scanner sc = new Scanner(System.in); System.out.println("출발지를 입력하세요."); for (PortDTO.Item item : list) { System.out.print(item.getAirportNm()+" "); } System.out.println(); String dep = sc.nextLine(); System.out.println(); System.out.println("목적지를 입력하세요."); for (PortDTO.Item item : list) { System.out.print(item.getAirportNm()+" "); } System.out.println(); String arr = sc.nextLine(); System.out.println(); System.out.println("출발날짜를 입력하세요.YYYYMMDD (예시 : 20251219)"); String time = sc.nextLine(); // 5. 해시맵에서 김해 -> value, 김포 -> value (완) String depId = map.get(dep); String arrId = map.get(arr); // System.out.println(5); // 6. 항공스케줄 주소 만들기 다운로드 (완) String site = "https://apis.data.go.kr/1613000/DmstcFlightNvgInfoService/getFlightOpratInfoList?serviceKey=1d4b60644d4515082456e13d65d46448695cb8a300d92371e3147cbd27160160&pageNo=1&numOfRows=10&_type=json&depAirportId="+depId+"&arrAirportId="+arrId+"&depPlandTime="+time; // System.out.println(6); // 7. 항공스케줄 다운로드 (완) String scheduleJson = repo.download(site); // System.out.println(7); // 8. ScheduleDTO에 파싱 (완) ScheduleDTO schedule = gson.fromJson(scheduleJson, ScheduleDTO.class); // System.out.println(8); // 9. 항공 스케줄 출력 (완) List<ScheduleDTO.Item> list2 = schedule.getResponse().getBody().getItems().getItem(); for (ScheduleDTO.Item item : list2) { if(item.getEconomyCharge() == null) { System.out.println("항공권이 없습니다."); System.out.println(); continue; } System.out.println("출발지 : " + item.getDepAirportNm()); System.out.println("도착지 : " + item.getArrAirportNm()); System.out.println("출발시간 : " + item.getDepPlandTime()); System.out.println("도착시간 : " + item.getArrPlandTime()); System.out.println("이코노미가격 : " + item.getEconomyCharge()); System.out.println(); } } catch (Exception e) { e.printStackTrace(); } } }
C:\tools\jdk-21\bin\java.exe "-javaagent:C:\Program Files\JetBrains\IntelliJ IDEA Community Edition 2025.2.5\lib\idea_rt.jar=59301" -Dfile.encoding=UTF-8 -Dsun.stdout.encoding=UTF-8 -Dsun.stderr.encoding=UTF-8 -classpath C:\workspace\java_lab\java-network-study\out\production\classes;C:\Users\G\.gradle\caches\modules-2\files-2.1\com.solapi\sdk\1.0.3\7d5cb30cd49c9a49e4bfd4ff5d5e598efb2cbabf\sdk-1.0.3.jar;C:\Users\G\.gradle\caches\modules-2\files-2.1\com.google.code.gson\gson\2.13.2\48b8230771e573b54ce6e867a9001e75977fe78e\gson-2.13.2.jar;C:\Users\G\.gradle\caches\modules-2\files-2.1\com.googlecode.json-simple\json-simple\1.1.1\c9ad4a0850ab676c5c64461a05ca524cdfff59f1\json-simple-1.1.1.jar;C:\Users\G\.gradle\caches\modules-2\files-2.1\com.google.errorprone\error_prone_annotations\2.41.0\4381275efdef6ddfae38f002c31e84cd001c97f0\error_prone_annotations-2.41.0.jar;C:\Users\G\.gradle\caches\modules-2\files-2.1\junit\junit\4.10\e4f1766ce7404a08f45d859fb9c226fc9e41a861\junit-4.10.jar;C:\Users\G\.gradle\caches\modules-2\files-2.1\org.hamcrest\hamcrest-core\1.1\860340562250678d1a344907ac75754e259cdb14\hamcrest-core-1.1.jar;C:\Users\G\.gradle\caches\modules-2\files-2.1\org.jetbrains.kotlin\kotlin-reflect\2.2.10\98d0ca9819d98cb3aa5c0a25793830b6659feee2\kotlin-reflect-2.2.10.jar;C:\Users\G\.gradle\caches\modules-2\files-2.1\com.squareup.okhttp3\logging-interceptor\5.1.0\b23d83d9042b53ef66fc782f6b6485ccf756a91\logging-interceptor-5.1.0.jar;C:\Users\G\.gradle\caches\modules-2\files-2.1\com.squareup.retrofit2\converter-kotlinx-serialization\3.0.0\3541df11c0990f4a25610480c990d0e071a81e48\converter-kotlinx-serialization-3.0.0.jar;C:\Users\G\.gradle\caches\modules-2\files-2.1\com.squareup.retrofit2\retrofit\3.0.0\c0cdf6d243c5187732134129fda05a74f9197874\retrofit-3.0.0.jar;C:\Users\G\.gradle\caches\modules-2\files-2.1\org.jetbrains.kotlin\kotlin-stdlib-jdk8\2.2.10\80cc9a776a058eeda7053731350bc41af8858a5a\kotlin-stdlib-jdk8-2.2.10.jar;C:\Users\G\.gradle\caches\modules-2\files-2.1\commons-codec\commons-codec\1.18.0\ee45d1cf6ec2cc2b809ff04b4dc7aec858e0df8f\commons-codec-1.18.0.jar;C:\Users\G\.gradle\caches\modules-2\files-2.1\org.jetbrains.kotlin\kotlin-stdlib\2.2.10\30de6faa127a4a012db8e71bf1b9c0a99b1402b2\kotlin-stdlib-2.2.10.jar;C:\Users\G\.gradle\caches\modules-2\files-2.1\com.squareup.okhttp3\okhttp-jvm\5.1.0\c17340f19b33c1d28a47b8dc4ae15018aff6dc10\okhttp-jvm-5.1.0.jar;C:\Users\G\.gradle\caches\modules-2\files-2.1\org.jetbrains.kotlinx\kotlinx-serialization-json-jvm\1.9.0\aea6f7d49fe5c458f8963ee6d4bdaf4a459ab3e7\kotlinx-serialization-json-jvm-1.9.0.jar;C:\Users\G\.gradle\caches\modules-2\files-2.1\org.jetbrains.kotlin\kotlin-stdlib-jdk7\2.2.10\18cc96ae090a71726822631e1808c7d329faab5d\kotlin-stdlib-jdk7-2.2.10.jar;C:\Users\G\.gradle\caches\modules-2\files-2.1\org.jetbrains\annotations\13.0\919f0dfe192fb4e063e7dacadee7f8bb9a2672a9\annotations-13.0.jar;C:\Users\G\.gradle\caches\modules-2\files-2.1\org.jetbrains.kotlinx\kotlinx-serialization-core-jvm\1.9.0\91448df39c558f7c6147b8bd8db01debe16e0cc1\kotlinx-serialization-core-jvm-1.9.0.jar;C:\Users\G\.gradle\caches\modules-2\files-2.1\com.squareup.okio\okio-jvm\3.15.0\cb3c285187640f543150fcac1ae012bdd778c0e1\okio-jvm-3.15.0.jar com.mtcoding.port.PortApp 출발지를 입력하세요. 무안 광주 군산 여수 원주 양양 제주 김해 사천 울산 인천 김포 포항 대구 청주 김해 목적지를 입력하세요. 무안 광주 군산 여수 원주 양양 제주 김해 사천 울산 인천 김포 포항 대구 청주 김포 출발날짜를 입력하세요.YYYYMMDD (예시 : 20251219) 20251220 항공권이 없습니다. 항공권이 없습니다. 출발지 : 김해 도착지 : 김포 출발시간 : 202512200720 도착시간 : 202512200825 이코노미가격 : 64000 항공권이 없습니다. 항공권이 없습니다. 항공권이 없습니다. 출발지 : 김해 도착지 : 김포 출발시간 : 202512200845 도착시간 : 202512200950 이코노미가격 : 71900 출발지 : 김해 도착지 : 김포 출발시간 : 202512200900 도착시간 : 202512201005 이코노미가격 : 64000 출발지 : 김해 도착지 : 김포 출발시간 : 202512200945 도착시간 : 202512201050 이코노미가격 : 71900 출발지 : 김해 도착지 : 김포 출발시간 : 202512201040 도착시간 : 202512201145 이코노미가격 : 64000 종료 코드 0(으)로 완료된 프로세스
notion image
notion image
Share article