๐
2025-05-12
โ
์ค์ต ๊ฐ์
- ์ค์๊ฐ ๋ฒ์ค ๋์ฐฉ์ ๋ณด OpenAPI(XML)๋ฅผ Spring Boot์์ ํธ์ถ
- JAXB๋ก XML์ Java ๊ฐ์ฒด๋ก ์๋ ๋ณํ
- RestTemplate์ ์ด์ฉํ ์ธ๋ถ API ํต์
- JSON ์ถ๋ ฅ ๋ฐ ์ฝ์ ์ถ๋ ฅ ๋ฐฉ์ ์ค์ต
- ํฅํ CSV ์ฐ๊ณ ๋ฐ DB ์ ์ฅ ํ์ฅ ๊ฐ๋ฅ
โ
์ค์ต ์์ ์์ฝ
| ๋จ๊ณ | ์ค๋ช
|
|---|
| 1๏ธโฃ | ํ๋ก์ ํธ ์์ฑ (Web + JAXB + Lombok ํฌํจ) |
| 2๏ธโฃ | API ํค ๋ฐ๊ธ (๊ณต๊ณต๋ฐ์ดํฐํฌํธ) |
| 3๏ธโฃ | XML ๊ตฌ์กฐ ๋ถ์ |
| 4๏ธโฃ | Java ํด๋์ค (JAXB) ์์ฑ |
| 5๏ธโฃ | ์ปจํธ๋กค๋ฌ ๊ตฌ์ฑ ๋ฐ ์์ฒญ ์ํ |
| 6๏ธโฃ | ์๋ต ๊ฒฐ๊ณผ ์ฝ์ ์ถ๋ ฅ / JSON ๋ฐํ |
| 7๏ธโฃ | ์์ธ ์ฒ๋ฆฌ ๋ฐ ํฅํ ํ์ฅ ์ค๋ช
ํฌํจ |
โ
์ฌ์ฉ API ์ ๋ณด
- ์๋น์ค: ๋๊ตฌ๊ด์ญ์ ์ค์๊ฐ ๋ฒ์ค ๋์ฐฉ์ ๋ณด
- ํธ์ถ URL:
https://apis.data.go.kr/6270000/dbmsapi01/getRealtime
?serviceKey=๋ฐ๊ธ๋ฐ์ํค
&bsId=7001001600
&routeNo=649
- ๐ ์์ ์
๋ ฅ๊ฐ:
routeNo = 649 โ ์๋ถ์ ๋ฅ์ฅ ๋ฐฉ๋ฉด
bsId = 7001001600 โ ๋๊ตฌ๊ณ ๋ฑํ๊ต๊ฑด๋ ์ ๋ฅ์ฅ
โ
1. ์์กด์ฑ ์ค์ (build.gradle)
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'jakarta.xml.bind:jakarta.xml.bind-api:4.0.0'
implementation 'org.glassfish.jaxb:jaxb-runtime:4.0.2'
compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
}
โ
2. XML ์๋ต ๋งคํ ํด๋์ค (BUSResult.java)
@XmlRootElement(name = "Result")
@Data
@XmlAccessorType(XmlAccessType.FIELD)
public class BUSResult {
private Header header;
private Body body;
@Data
public static class Header {
private boolean success;
private String resultCode;
private String resultMsg;
}
@Data
public static class Body {
private Items items;
private int totalCount;
}
@Data
public static class Items {
private String routeNo;
@XmlElementWrapper(name = "arrList")
@XmlElement(name = "arrList")
private List<ArrList> arrList;
}
@Data
public static class ArrList {
private String routeId;
private String routeNo;
private int moveDir;
private int bsGap;
private String bsNm;
private String vhcNo2;
private String busTCd2;
private String busTCd3;
private String busAreaCd;
private String arrState;
private int prevBsGap;
}
}
โ
3. ์ค์๊ฐ ๋ฒ์ค ์ ๋ณด ์ปจํธ๋กค๋ฌ (OpenData03Controller.java)
@RestController
@Slf4j
@RequestMapping("/openData")
public class OpenData03Controller {
@GetMapping("/bus/realtime")
public void bus_realtime() throws UnsupportedEncodingException {
try {
BUSResult result = fetchBusData();
if (result != null) {
result.getBody().getItems().getArrList().forEach(bus -> {
System.out.println("์ ๋ฅ์ฅ๋ช
: " + bus.getBsNm());
System.out.println("๋์ฐฉ์์ : " + bus.getArrState());
System.out.println("์ฐจ๋๋ฒํธ: " + bus.getVhcNo2());
System.out.println("--------------------------");
});
} else {
log.warn("์๋ต ๋ณธ๋ฌธ์ด null์
๋๋ค.");
}
} catch (Exception e) {
log.error("์ค์๊ฐ ๋ฒ์ค API ํธ์ถ ์คํจ", e);
}
}
@GetMapping("/bus/json")
public ResponseEntity<BUSResult> bus_json() throws UnsupportedEncodingException {
try {
BUSResult result = fetchBusData();
return ResponseEntity.ok(result);
} catch (Exception e) {
return ResponseEntity.internalServerError().build();
}
}
private BUSResult fetchBusData() throws UnsupportedEncodingException {
String url = "https://apis.data.go.kr/6270000/dbmsapi01/getRealtime";
String serviceKey = "๋ฐ๊ธ๋ฐ์ ๋์ฝ๋ฉ ํค";
String bsId = "7001001600";
String routeNo = "649";
URI uri = UriComponentsBuilder
.fromHttpUrl(url)
.queryParam("serviceKey", URLEncoder.encode(serviceKey, "UTF-8"))
.queryParam("bsId", bsId)
.queryParam("routeNo", routeNo)
.build(true)
.toUri();
RestTemplate rt = new RestTemplate();
ResponseEntity<BUSResult> response = rt.exchange(uri, HttpMethod.GET, null, BUSResult.class);
return response.getBody();
}
}
โ
4. ์คํ ๊ฒฐ๊ณผ ์์
ํธ์ถ ์ฃผ์
http://localhost:8090/openData/bus/realtime
์ฝ์ ์ถ๋ ฅ ๊ฒฐ๊ณผ
์ ๋ฅ์ฅ๋ช
: ๋๊ตฌ๊ณ ๋ฑํ๊ต๊ฑด๋
๋์ฐฉ์์ : 7๋ถ
์ฐจ๋๋ฒํธ: 5266
--------------------------
์ ๋ฅ์ฅ๋ช
: ์๋ถ์ ๋ฅ์ฅ(๊ด๋ฌธ์์ฅ์)
๋์ฐฉ์์ : 18๋ถ
์ฐจ๋๋ฒํธ: 5214
--------------------------
JSON API ํธ์ถ ์์
http://localhost:8090/openData/bus/json
โ
5. ํฅํ ํ์ฅ ์์ด๋์ด
| ํ์ฅ ๋ฐฉํฅ | ์ค๋ช
|
|---|
| โ
ํ๋ฉด ์ถ๋ ฅ | Thymeleaf, React ์ฐ๋์ผ๋ก ๋ฆฌ์คํธ UI ๊ตฌ์ฑ |
| โ
DB ์ ์ฅ | JPA๋ฅผ ์ด์ฉํด ์ ๋ฅ์ ๋์ฐฉ ์ ๋ณด ์์ํ |
| โ
CSV ์ฐ๊ณ | ๊ณต๊ณต๋ฐ์ดํฐ ํฌํธ์์ ๋ค์ด๋ฐ์ ๋
ธ์ /์ ๋ฅ์ ์์น CSV ํ์ผ๊ณผ ์ฐ๊ณํ์ฌ ๊ธฐ์ค ๋ฐ์ดํฐ ํ์ฉ |
| โ
์๋ํ | ์ผ์ ๊ฐ๊ฒฉ์ผ๋ก ๋์ฐฉ์ ๋ณด ๊ฐฑ์ ํ์ฌ ๋ชจ๋ํฐ๋ง ์์คํ
๊ตฌ์ถ |
๐ ์ฐธ๊ณ ์๋ฃ