게시판 만들기(OpenApi 사용 복습)
package com.korea.k1.company;
import lombok.Data;
@Data
public class CompanyVO {
private int idx;
private String rdnmadr;
private String logitude;
private String entrprsNm;
private String rprsntvNm;
private String latitude;
private String mainGoods;
}
package com.korea.k1.company;
import lombok.Data;
@Data
public class EvSearchVO {
private int idx; // 순번
private String csNm; // 충전기 명칭
private String addr; // 충전소 주소
private String cpNm; // 충전기 명칭
private String cpStat; // 충전기 분류
}
CompanyService
package com.korea.k1.company;
import java.util.List;
public interface CompanyService {
void insert(CompanyVO vo);
void evinsert(EvSearchVO vo);
List<EvSearchVO> Ev_list(EvSearchVO vo);
List<CompanyVO> Com_list(CompanyVO vo);
}
------------------------------------------------
package com.korea.k1.company;
import java.util.List;
public interface CompanyDao {
void insert(CompanyVO vo);
void evinsert(EvSearchVO vo);
List<EvSearchVO> Ev_list(EvSearchVO vo);
List<CompanyVO> Com_list(CompanyVO vo);
}
package com.korea.k1.company;
import java.util.List;
import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
@Repository
public class CompanyDaoImpl implements CompanyDao {
@Autowired
private SqlSessionTemplate mybatis;
@Override
public void insert(CompanyVO vo) {
mybatis.insert("CompanyDAO.INSERT",vo);
}
@Override
public void evinsert(EvSearchVO vo) {
mybatis.insert("CompanyDAO.EV_INSERT",vo);
}
@Override
public List<EvSearchVO> Ev_list(EvSearchVO vo) {
return mybatis.selectList("CompanyDAO.EV_LIST");
}
@Override
public List<CompanyVO> Com_list(CompanyVO vo) {
return mybatis.selectList("CompanyDAO.COM_LIST");
}
}
package com.korea.k1.company;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class CompanyServiceImpl implements CompanyService{
@Autowired
private CompanyDao dao;
@Override
public void insert(CompanyVO vo) {
dao.insert(vo);
}
@Override
public void evinsert(EvSearchVO vo) {
dao.evinsert(vo);
}
@Override
public List<EvSearchVO> Ev_list(EvSearchVO vo) {
return dao.Ev_list(vo);
}
@Override
public List<CompanyVO> Com_list(CompanyVO vo) {
return dao.Com_list(vo);
}
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="CompanyDAO">
<insert id="INSERT" parameterType="company" >
insert into company2(idx, rdnmadr, logitude, entrprsNm, rprsntvNm, latitude, mainGoods)
values(idx_company2.nextval, #{rdnmadr}, #{logitude}, #{entrprsNm}, #{rprsntvNm}, #{latitude}, #{mainGoods})
</insert>
<insert id="EV_INSERT" parameterType="ev" >
insert into EvSearch(idx, csNm, addr, cpNm, cpStat)
values(idx_EvSearch.nextval, #{csNm}, #{addr}, #{cpNm}, #{cpStat})
</insert>
<select id="EV_LIST" resultType="ev" parameterType="ev">
SELECT * FROM EvSearch where addr like '%서울특별시%' ORDER BY idx DESC
</select>
<select id="COM_LIST" resultType="company" parameterType="company">
SELECT * FROM company2 ORDER BY idx DESC
</select>
</mapper>
package com.korea.controller;
import java.io.BufferedReader;
import java.io.FileOutputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import com.korea.k1.company.CompanyServiceImpl;
import com.korea.k1.company.CompanyVO;
import com.korea.k1.company.EvSearchVO;
@Controller
public class OpenApiController {
OpenApiController(){
System.out.println("===> 컨트롤러 확인");
}
@Autowired
CompanyServiceImpl service;
@RequestMapping(value = "/OpenApiInsert.do")
public String OpenApiInsert(Model model, CompanyVO vo) throws Exception{
// http://apis.data.go.kr/6480000/ <=== https 를 http 로 변경하기
// url Http에서 s가 붙어있으면 제외시키기
StringBuilder urlBuilder = new StringBuilder("http://apis.data.go.kr/6480000/gyeongnamgoodemploycompany/gyeongnamgoodemploycompanylist"); /*URL*/
urlBuilder.append("?" + URLEncoder.encode("serviceKey","UTF-8") + "=vP4H3hy9P5MkOjE3j4%2Fa1FBnWQEK0m655CFmdCBt46INOFeZupMk8Av4dJREFRiRaBW%2B90TkC79D6FiE3uCqig%3D%3D"); /*Service Key (일반인증키)*/
urlBuilder.append("&" + URLEncoder.encode("pageNo","UTF-8") + "=" + URLEncoder.encode("1", "UTF-8")); /*페이지 번호*/
urlBuilder.append("&" + URLEncoder.encode("numOfRows","UTF-8") + "=" + URLEncoder.encode("25", "UTF-8")); /*한 페이지 결과 수 (최소 10, 최대 9999)*/
urlBuilder.append("&" + URLEncoder.encode("returnType","UTF-8") + "=" + URLEncoder.encode("xml", "UTF-8")); /*상태갱신 조회 범위(분) (기본값 5, 최소 1, 최대 10)*/
URL url = new URL(urlBuilder.toString());
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");
conn.setRequestProperty("Content-type", "application/json");
System.out.println("Response code: " + conn.getResponseCode());
BufferedReader rd;
if(conn.getResponseCode() >= 200 && conn.getResponseCode() <= 300) {
rd = new BufferedReader(new InputStreamReader(conn.getInputStream()));
} else {
rd = new BufferedReader(new InputStreamReader(conn.getErrorStream()));
}
StringBuilder sb = new StringBuilder();
String line;
while ((line = rd.readLine()) != null) {
sb.append(line);
}
rd.close();
conn.disconnect();
// XML 데이터 읽어 오기
System.out.println(sb.toString());
Node data1 = null;
Node data2 = null;
Node data3 = null;
Node data4 = null;
Node data5 = null;
Node data6 = null;
try {
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder dBuilder=dbFactory.newDocumentBuilder();
FileOutputStream output = new FileOutputStream("./ApiExplorer");
output.write(sb.toString().getBytes("UTF-8")); // 전체 데이터 읽어 오기
output.close();
Document doc = dBuilder.parse("./ApiExplorer");
doc.getDocumentElement().normalize();
// getElementsByTagName 태그안에있는 메소드를 다 불러온다.
Element body =(Element) doc.getElementsByTagName("body").item(0);
Element items =(Element) body.getElementsByTagName("items").item(0);
// service.deleteAll();
for(int i=0 ; i<=24 ; i++ ) {
Element item =(Element) items.getElementsByTagName("item").item(i);
// 필요한 데이터 값 추출하기
data1 = item.getElementsByTagName("rdnmadr").item(0); // 주소
data2 = item.getElementsByTagName("entrprsNm").item(0); // 회사명
data3 = item.getElementsByTagName("rprsntvNm").item(0); // 회사대표
data4 = item.getElementsByTagName("mainGoods").item(0); // 주력상품
data5 = item.getElementsByTagName("latitude").item(0); // 위도
data6 = item.getElementsByTagName("logitude").item(0); // 경도
String strData1 = data1.getChildNodes().item(0).getNodeValue();
String strData2 = data2.getChildNodes().item(0).getNodeValue();
String strData3 = data3.getChildNodes().item(0).getNodeValue();
String strData4 = data4.getChildNodes().item(0).getNodeValue();
String strData5 = data5.getChildNodes().item(0).getNodeValue();
String strData6 = data6.getChildNodes().item(0).getNodeValue();
System.out.println( strData1 + " " + strData2 + " " + strData3 + " " + strData4 + " " + strData5 + " " + strData6 );
vo.setRdnmadr(strData1);
vo.setEntrprsNm(strData2);
vo.setRprsntvNm(strData3);
vo.setMainGoods(strData4);
vo.setLatitude(strData5);
vo.setLogitude(strData6);
service.insert(vo);
}
} catch (Exception e) {
e.printStackTrace();
}
return "/index.jsp";
}
@RequestMapping(value = "/Evinsert.do")
public String EvInsert(Model model, EvSearchVO vo) throws Exception{
// http://apis.data.go.kr/6480000/ <=== https 를 http 로 변경하기
// url Http에서 s가 붙어있으면 제외시키기
StringBuilder urlBuilder = new StringBuilder("http://openapi.kepco.co.kr/service/EvInfoServiceV2/getEvSearchList"); /*URL*/
urlBuilder.append("?" + URLEncoder.encode("serviceKey","UTF-8") + "=9fUhHWkn8J23BGz8obUfEF6zSihn8D%2F0juIFYW5quBlH9Ln9LwBqnYYPTpgVjGFvuOxz1s5Yqpmj6YYxEzanQw%3D%3D"); /*Service Key (일반인증키)*/
urlBuilder.append("&" + URLEncoder.encode("pageNo","UTF-8") + "=" + URLEncoder.encode("1", "UTF-8")); /*페이지 번호*/
urlBuilder.append("&" + URLEncoder.encode("numOfRows","UTF-8") + "=" + URLEncoder.encode("1000", "UTF-8")); /*한 페이지 결과 수 (최소 10, 최대 9999)*/
urlBuilder.append("&" + URLEncoder.encode("returnType","UTF-8") + "=" + URLEncoder.encode("xml", "UTF-8")); /*상태갱신 조회 범위(분) (기본값 5, 최소 1, 최대 10)*/
URL url = new URL(urlBuilder.toString());
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");
conn.setRequestProperty("Content-type", "application/json");
System.out.println("Response code: " + conn.getResponseCode());
BufferedReader rd;
if(conn.getResponseCode() >= 200 && conn.getResponseCode() <= 300) {
rd = new BufferedReader(new InputStreamReader(conn.getInputStream()));
} else {
rd = new BufferedReader(new InputStreamReader(conn.getErrorStream()));
}
StringBuilder sb = new StringBuilder();
String line;
while ((line = rd.readLine()) != null) {
sb.append(line);
}
rd.close();
conn.disconnect();
// XML 데이터 읽어 오기
System.out.println(sb.toString());
Node data1 = null;
Node data2 = null;
Node data3 = null;
Node data4 = null;
try {
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder dBuilder=dbFactory.newDocumentBuilder();
FileOutputStream output = new FileOutputStream("./ApiExplorer");
output.write(sb.toString().getBytes("UTF-8")); // 전체 데이터 읽어 오기
output.close();
Document doc = dBuilder.parse("./ApiExplorer");
doc.getDocumentElement().normalize();
// getElementsByTagName 태그안에있는 메소드를 다 불러온다.
Element body =(Element) doc.getElementsByTagName("body").item(0);
Element items =(Element) body.getElementsByTagName("items").item(0);
// service.deleteAll();
for(int i=0 ; i<=999 ; i++ ) {
Element item =(Element) items.getElementsByTagName("item").item(i);
// 필요한 데이터 값 추출하기
data1 = item.getElementsByTagName("addr").item(0); // 주소
data2 = item.getElementsByTagName("cpNm").item(0); // 충전기 명칭
data3 = item.getElementsByTagName("cpStat").item(0); // 충전소 종류
data4 = item.getElementsByTagName("csNm").item(0); // 충전소명
String strData1 = data1.getChildNodes().item(0).getNodeValue();
String strData2 = data2.getChildNodes().item(0).getNodeValue();
String strData3 = data3.getChildNodes().item(0).getNodeValue();
String strData4 = data4.getChildNodes().item(0).getNodeValue();
System.out.println( strData1 + " " + strData2 + " " + strData3 + " " + strData4);
vo.setAddr(strData1);
vo.setCpNm(strData2);
vo.setCpStat(strData3);
vo.setCsNm(strData4);
service.evinsert(vo);
}
} catch (Exception e) {
e.printStackTrace();
}
return "/index.jsp";
}
@RequestMapping(value = "/EVList.do")
public String EVList(
Model model, EvSearchVO vo) {
model.addAttribute("li",service.Ev_list(vo));
return "/EV/Ev_List.jsp";
}
@RequestMapping(value = "/ComList.do")
public String ComList(
Model model, CompanyVO vo) {
model.addAttribute("li",service.Com_list(vo));
return "/Company/Com_List.jsp";
}
}
OpenApi를 사용하기위해 컨트롤러에서의 내용이 중요하다.
리스트와 DB삽입을 위해 mybatis의 insert와 SelectList을 사용했고,
해당 내용을 Jsp파일(view영역)에서 불러와 확인 할 수 있다.
공동데이터포털을 사용해서
전기차 충전소와, 경상남도 고용 우수 기업의 내역을 확인 할 수 있었다.
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib uri="http://java.sun.com/jstl/core_rt" prefix="c" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<c:import url="/include/top.jsp"/>
<section>
<div align="center">
<br>
<div id="map" style="width:95%;height:650px;"></div>
<script type="text/javascript" src="//dapi.kakao.com/v2/maps/sdk.js?appkey=${key}"></script>
<script>
var mapContainer = document.getElementById('map'), // 지도를 표시할 div
mapOption = {
center: new kakao.maps.LatLng(35.2382905, 128.692398), // 지도의 중심좌표
level: 9 // 지도의 확대 레벨 35.2382905 128.692398 (경남도청)
};
var map = new kakao.maps.Map(mapContainer, mapOption); // 지도를 생성합니다
var title = new Array();
var lat = new Array();
var lon = new Array();
var rdnmadr = new Array();
<c:forEach var="k" items="${li}">
title.push("${k.entrprsNm }")
lat.push("${k.latitude}")
lon.push("${k.logitude}")
rdnmadr.push("${k.rdnmadr}")
</c:forEach>
// 마커를 표시할 위치와 내용을 가지고 있는 객체 배열입니다
var positions = [];
for (i=0 ; i <= title.length ; i++ ){
positions[i] = {
content : ' <div style="padding:5px;"> '+ title[i] +' <br> '
+ ' ' + rdnmadr[i] + '<br>'
+ ' <a href=https://map.kakao.com/link/to/'+ title[i] +','+lat[i]+','+ lon[i] + ' style="color:blue" target="_blank">길찾기</a></div>',
latlng : new kakao.maps.LatLng(lat[i], lon[i])
};
}
for (var i = 0; i < positions.length; i ++) {
// 마커를 생성합니다
var marker = new kakao.maps.Marker({
map: map, // 마커를 표시할 지도
position: positions[i].latlng // 마커의 위치
});
// 마커에 표시할 인포윈도우를 생성합니다
var infowindow = new kakao.maps.InfoWindow({
content: positions[i].content // 인포윈도우에 표시할 내용
});
// 마커에 mouseover 이벤트와 mouseout 이벤트를 등록합니다
// 이벤트 리스너로는 클로저를 만들어 등록합니다
// for문에서 클로저를 만들어 주지 않으면 마지막 마커에만 이벤트가 등록됩니다
kakao.maps.event.addListener(marker, 'mouseover', makeOverListener(map, marker, infowindow));
// kakao.maps.event.addListener(marker, 'mouseout', makeOutListener(infowindow));
}
// 인포윈도우를 표시하는 클로저를 만드는 함수입니다
function makeOverListener(map, marker, infowindow) {
return function() {
infowindow.open(map, marker);
};
}
// 인포윈도우를 닫는 클로저를 만드는 함수입니다
function makeOutListener(infowindow) {
return function() {
infowindow.close();
};
}
</script>
</div>
<br>
</section>
<%@ include file ="/include/footer.jsp" %>
카카오디벨롭퍼에서 지도API를 받아와 고용우수기업의 위치를 지도에 마킹하여 볼수 있도록 했다.
기본적인 틀은 구상이 되어있었고 AppKey 값을 받아와 사용할 수 있다.
공공 API를 불러와 게시판을 만들고, View에서 확인까지의 작업을 복습했다.
게시판을 만드는것이 이렇게 동작이 된다는 것을 다시 한번 확인하고 공부할 수 있었다.
다양한 프로젝트를 만들어 확인하고 작성해보도록 해야겠다.