85일차_Spring

서창민·2023년 7월 12일
0

Spring

목록 보기
12/15
post-thumbnail

23.07.12 85일차

게시판 만들기(OpenApi 사용 복습)

  • companyVO
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;
}
  • EvSearchVO
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/Dao
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);
}
  • CompanyDaoImpl
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");
	}

}
  • CompanyServiceImpl
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);
	}

}
  • Mapping(쿼리문)
<?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>
  • OpenApiController
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영역)에서 불러와 확인 할 수 있다.

공동데이터포털을 사용해서
전기차 충전소와, 경상남도 고용 우수 기업의 내역을 확인 할 수 있었다.

  • ComMap.jsp
<%@ 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에서 확인까지의 작업을 복습했다.
게시판을 만드는것이 이렇게 동작이 된다는 것을 다시 한번 확인하고 공부할 수 있었다.

다양한 프로젝트를 만들어 확인하고 작성해보도록 해야겠다.

profile
Back-end Developer Preparation Students

0개의 댓글