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(으)로 완료된 프로세스

정답
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(으)로 완료된 프로세스

Share article