1 분 소요

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에 저장할 수 있었다.
굉장히 뿌듯…
기차역 정보를 다 넣었으니 이제 기차 일정정보를 넣어야겠다.

** 참고한 사이트 : 출처 출처 출처

태그:

카테고리:

업데이트: