open Api 사용하기
openApi를 사용하여 기차 일정과 역 정보를 가져온다.
***
열차예약 프로그램을 만들기 위해 공공데이터 포털에서 openApi를 사용했다.
처음에 json형식으로 데이터를 주는줄 알았는데 xml이었다.
openApi는 처음 다루는 거라 한번 글로 적어보자.
Api로 얻을 수 있는 정보가 제한적이기 때문에 url로 data를 불러와 db에 일부를 저장하는 식으로 사용했다.
xml으로 얻는 data를 자바 객체로 변환하여 db에 저장하였다.
*** JAXB
JACKSON처럼 xml을 객체로 객체를 xml로 변환해주는 라이브러리다.
jdk11 버전 부터 JAXB에 대한 의존성을 제공하지 않아서 의존성을 주입해야 한다.
<dependency>
<groupId>org.glassfish.jaxb</groupId>
<artifactId>jaxb-runtime</artifactId>
</dependency>
pom.xml에 추가
이제 Annotation을 사용할 수 있다.!
** 사이트로 부터 샘플코드를 가져와서 내가 쓸 용도로 수정하기
| data를 불러와 객체화 한다음 db에 저장
일의 자리수인 값에 대해 앞에 0이 붙도록 수정했다.
urlBuilder.append("&" + URLEncoder.encode("cityCode","UTF-8") + "=" + URLEncoder.encode(String.format("%02d", city.getCode()), "UTF-8")); /*시/도ID*/
api에서 가져온 데이터를 확인 했더니
xml 파일을 이클립스로 가져오면 한글이 깨지는 현상이 발생한다.
if(conn.getResponseCode() >= 200 && conn.getResponseCode() <= 300) {
rd = new BufferedReader(new InputStreamReader(conn.getInputStream(),"UTF-8"));
} else {
rd = new BufferedReader(new InputStreamReader(conn.getErrorStream(),"UTF-8"));
}
,”UTF-8”를 꼭 추가해야 한다.
mybatis에서 insert는 다중 값을 넣지 못한다!
여러 값을 select로 조회할 때, resultParameter의 객체를 타입파라미터로 하는 List에 값을 주입하기 때문에 무의식적으로 당연하게 insert도 되는 줄 알았다.
<insert id="insertTrainStation" parameterType="java.util.List">
insert into trip_train_station
(station_id, station_name, city_code)
values
<foreach collection="list" index="index" item="station" separator=",">
(#{station.id}, #{station.name}, #{station.cityCode})
</foreach>
</insert>
위의 방법은 mysql에서는 되나 아래는 oracle에서 가능한 방식이다.
위의 방법을 계속 했는데 sqlException이 발생하길래 다른 방식을 찾아봤더니 oracle에서는 안되는 방법이였다.
<update id="insertTrainStation" parameterType="java.util.List">
<foreach collection="list" item="station" open="INSERT ALL" close="SELECT * FROM DUAL" separator=" ">
into trip_train_station values (#{station.id}, #{station.name}, #{station.cityCode})
</foreach>
</update>
이렇게 바꿨더니 모든 data를 db에 저장할 수 있었다.
굉장히 뿌듯…
기차역 정보를 다 넣었으니 이제 기차 일정정보를 넣어야겠다.