반가워요 ~ 미세먼지 마지막 부분인 C 파트 프론트 부분을 설명드리는 날이네요.

포스팅만 하면 좋겠지만 ,, 취업 준비를 하는 과정 중에서 현재 다른 공부도 병행하고 아르바이트지만 일도 하느라 이리저리 치이네요 〆(´ω`●)ゞ

 

프론트 부분 설명드리고 시리즈 포스팅 마무리하겠습니다 ~! (^人^)

 + 스크롤이 매우 깁니다 .. +

 

monitoring_main.jsp 메인 화면에서는 충전기 / 날씨 / 미세먼지를 보여주는데요, 미세먼지 부분을 보시면 됩니다.

<%@page import="java.time.format.DateTimeFormatter"%>
<%@page import="java.time.LocalDateTime"%>
<%@page import="com.project.airquality.AirqualityDTO"%>
<%@page import="java.util.ArrayList"%>
<%@page import="java.util.List"%>
<%@page import="java.time.LocalDate"%>
<%@page import="com.project.weather.WeatherUtil"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html>
<html>
	<head>
		
        ...				
					<div class="card info-card sales-card">
						<div class="card-header">
							<h5 class="card-title">미세먼지 정보</h5>
						</div>
						<div class="card-body">
							<div class="cmp-cmn-para odam-updated" style="padding: 10px; ">
								<a href="/evweb/airquality/getDataDust.do?stationId=${stationId}" class="updated-at">
								<%AirqualityDTO airqualityInfo =(AirqualityDTO)request.getAttribute("airqualityInfo"); 
								  LocalDate airdate = LocalDate.parse(airqualityInfo.getDatatime().substring(0,10), DateTimeFormatter.ISO_DATE);
								  String airtime = airqualityInfo.getDatatime().substring(5,7)+"."+airqualityInfo.getDatatime().substring(8,10)
										  		 +".("+util.getDayOfWeek(airdate)+")"+airqualityInfo.getDatatime().substring(11);
								%>
								<span><%=airtime%></span></a>
							</div>	
							<div class="cmp-cur-weather cmp-cur-weather-air">
							<h3 class="hid">대기질정보</h3>
							<ul id = "wrap-3" class="wrap-2 air-wrap no-underline">
								<li><span class="lbl">초미세먼지<small>(PM2.5)</small></span>
									<strong class="air-level val">
										<c:choose>
											<c:when test="${airqualityInfo.pm25value<=15}"><span class="air-lvv-wrap air-lvv-1"></c:when>
											<c:when test="${airqualityInfo.pm25value<=35}"><span class="air-lvv-wrap air-lvv-2"></c:when>
											<c:when test="${airqualityInfo.pm25value<=75}"><span class="air-lvv-wrap air-lvv-3"></c:when>
											<c:when test="${airqualityInfo.pm25value>=76}"><span class="air-lvv-wrap air-lvv-4"></c:when>
											<c:otherwise><span class="air-lvv-wrap air-lvv-0"></c:otherwise>
										</c:choose>
										<span class="air-lvv">${airqualityInfo.pm25value}</span><small class="unit">㎍/m³</small></span>
										<span class="air-lvt" style="color: #000;">
										<c:choose>
											<c:when test="${airqualityInfo.pm25value<=15}">좋음</c:when>
											<c:when test="${airqualityInfo.pm25value<=35}">보통</c:when>
											<c:when test="${airqualityInfo.pm25value<=75}">나쁨</c:when>
											<c:when test="${airqualityInfo.pm25value>=76}">매우나쁨</c:when>
											<c:otherwise>통신장애</c:otherwise>
										</c:choose>
										<a  href="#legend" data-air-type="pm25">범례보기</a></span>
									</strong>
								</li>
								
								<div class="cmp-cur-weather cmp-cur-weather-air">
									<h3 class="hid">대기질정보</h3>
									<ul class="wrap-2 air-wrap no-underline">
										<li><span class="lbl">초미세먼지<small>(PM2.5)</small></span>
											<strong class="air-level val"><span	class="air-lvv-wrap air-lvv-2"><span class="air-lvv">27</span>
											<small class="unit">㎍/m³</small></span>
											<span class="air-lvt" style="color: #000;">보통<a  href="#legend" data-air-type="pm25">범례보기</a></span></strong></li>
											
										<li><span class="lbl">미세먼지<small>(PM10)</small></span> 
											<strong	class="air-level val"><span	class="air-lvv-wrap air-lvv-2"><span class="air-lvv">68</span>
											<small class="unit">㎍/m³</small></span>
											<span class="air-lvt" style="color: #000;">보통<a href="#legend" data-air-type="pm10">범례보기</a></span></strong></li>
									</ul>
									<div class="cmp-air-legend">
										<div class="shadow-box" data-air-type="pm25">
											<div class="inner">
												<a href="#close" class="close-box">닫기</a>
												<h5>초미세먼지(㎛)</h5>
												<p>입자의 크기가 2.5㎛ 이하인 먼지</p>
												<ul class="air-legend">
													<li class="air-legend-1"><span>좋음<br>(0~15)
													</span></li>
													<li class="air-legend-2"><span>보통<br>(16~35)
													</span></li>
													<li class="air-legend-3"><span>나쁨<br>(36~75)
													</span></li>
													<li class="air-legend-4"><span>매우나쁨<br>(76~)
													</span></li>
												</ul>
											</div>
										</div>
										<div class="shadow-box" data-air-type="pm10">
											<div class="inner">
												<a href="#close" class="close-box">닫기</a>
												<h5>미세먼지(㎛)</h5>
												<p>입자의 크기가 10㎛ 이하인 먼지</p>
												<ul class="air-legend">
													<li class="air-legend-1"><span>좋음<br>(0~30)
													</span></li>
													<li class="air-legend-2"><span>보통<br>(31~80)
													</span></li>
													<li class="air-legend-3"><span>나쁨<br>(81~150)
													</span></li>
													<li class="air-legend-4"><span>매우나쁨<br>(151~)
													</span></li>
												</ul>
											</div>
										</div>
								<li><span class="lbl">미세먼지<small>(PM10)</small></span> 
									<strong class="air-level val">
										<c:choose>
											<c:when test="${airqualityInfo.pm25value<=30}"><span class="air-lvv-wrap air-lvv-1"></c:when>
											<c:when test="${airqualityInfo.pm25value<=80}"><span class="air-lvv-wrap air-lvv-2"></c:when>
											<c:when test="${airqualityInfo.pm25value<=150}"><span class="air-lvv-wrap air-lvv-3"></c:when>
											<c:when test="${airqualityInfo.pm25value>=151}"><span class="air-lvv-wrap air-lvv-4"></c:when>
											<c:otherwise><span class="air-lvv-wrap air-lvv-0"></c:otherwise>
										</c:choose>
										<span class="air-lvv">${airqualityInfo.pm25value}</span><small class="unit">㎍/m³</small></span>
										<span class="air-lvt" style="color: #000;">
										<c:choose>
											<c:when test="${airqualityInfo.pm25value<=30}">좋음</c:when>
											<c:when test="${airqualityInfo.pm25value<=80}">보통</c:when>
											<c:when test="${airqualityInfo.pm25value<=150}">나쁨</c:when>
											<c:when test="${airqualityInfo.pm25value>=151}">매우나쁨</c:when>
											<c:otherwise>통신장애</c:otherwise>
										</c:choose>
										<a  href="#legend" data-air-type="pm10">범례보기</a></span>
									</strong>
								</li>
							</ul>
							<div class="cmp-air-legend">
								<div class="shadow-box" data-air-type="pm25">
									<div class="inner">
										<a href="#close" class="close-box">닫기</a>
										<h5>초미세먼지(㎛)</h5>
										<p>입자의 크기가 2.5㎛ 이하인 먼지</p>
										<ul class="air-legend">
											<li class="air-legend-1"><span>좋음<br>(0~15)
											</span></li>
											<li class="air-legend-2"><span>보통<br>(16~35)
											</span></li>
											<li class="air-legend-3"><span>나쁨<br>(36~75)
											</span></li>
											<li class="air-legend-4"><span>매우나쁨<br>(76~)
											</span></li>
										</ul>
								<li><span class="lbl">미세먼지<small>(PM10)</small></span> 
									<strong class="air-level val">
										<c:choose>
											<c:when test="${airqualityInfo.pm25value<=30}"><span class="air-lvv-wrap air-lvv-1"></c:when>
											<c:when test="${airqualityInfo.pm25value<=80}"><span class="air-lvv-wrap air-lvv-2"></c:when>
											<c:when test="${airqualityInfo.pm25value<=150}"><span class="air-lvv-wrap air-lvv-3"></c:when>
											<c:when test="${airqualityInfo.pm25value>=151}"><span class="air-lvv-wrap air-lvv-4"></c:when>
											<c:otherwise><span class="air-lvv-wrap air-lvv-0"></c:otherwise>
										</c:choose>
										<span class="air-lvv">${airqualityInfo.pm25value}</span><small class="unit">㎍/m³</small></span>
										<span class="air-lvt" style="color: #000;">
										<c:choose>
											<c:when test="${airqualityInfo.pm25value<=30}">좋음</c:when>
											<c:when test="${airqualityInfo.pm25value<=80}">보통</c:when>
											<c:when test="${airqualityInfo.pm25value<=150}">나쁨</c:when>
											<c:when test="${airqualityInfo.pm25value>=151}">매우나쁨</c:when>
											<c:otherwise>통신장애</c:otherwise>
										</c:choose>
										<a  href="#legend" data-air-type="pm10">범례보기</a></span>
									</strong>
								</li>
							</ul>
							<div class="cmp-air-legend">
								<div class="shadow-box" data-air-type="pm25">
									<div class="inner">
										<a href="#close" class="close-box">닫기</a>
										<h5>초미세먼지(㎛)</h5>
										<p>입자의 크기가 2.5㎛ 이하인 먼지</p>
										<ul class="air-legend">
											<li class="air-legend-1"><span>좋음<br>(0~15)
											</span></li>
											<li class="air-legend-2"><span>보통<br>(16~35)
											</span></li>
											<li class="air-legend-3"><span>나쁨<br>(36~75)
											</span></li>
											<li class="air-legend-4"><span>매우나쁨<br>(76~)
											</span></li>
										</ul>
									</div>
								</div>
								<div class="shadow-box" data-air-type="pm10">
									<div class="inner">
										<a href="#close" class="close-box">닫기</a>
										<h5>미세먼지(㎛)</h5>
										<p>입자의 크기가 10㎛ 이하인 먼지</p>
										<ul class="air-legend">
											<li class="air-legend-1"><span>좋음<br>(0~30)
											</span></li>
											<li class="air-legend-2"><span>보통<br>(31~80)
											</span></li>
											<li class="air-legend-3"><span>나쁨<br>(81~150)
											</span></li>
											<li class="air-legend-4"><span>매우나쁨<br>(151~)
											</span></li>
										</ul>
									</div>
								</div>
							</div>
						</div>
						<div class="cmp-cmn-para cmp-cur-weather-air">
							<p class="right spon">
								정보출처: <a href="http://m.airkorea.or.kr" target="_blank"
									title="새창열림">대기질정보(한국환경공단)</a>
							</p>
						</div>
						</div>
					</div>
				</div>
				
				<!-- 충전량 -->
		        <div class="col-md-8 pr-0">
						<div class="card info-card sales-card " style="z-index : 1;">
							<div class="card-header">
								<h5 class="card-title">일간 충전량 <span style="float: right">${chargeAmount}kWh</span></h5>
							</div>
							<div class="card-body">
							<figure class="highcharts-figure">
						    <div id="chargeday"></div>
							</figure>
							</div>
						</div>
						<div class="card info-card sales-card" style="z-index : 0;">
							<div class="card-header">
								<h5 class="card-title">주간 충전량 <span style="float: right">${weekamount}kWh</span></h5>
							</div>
							<div class="card-body">
								<figure class="highcharts-figure">
						   		<div id="chargeweek"></div>
								</figure>
							</div>
						</div>
					</div>
		        </div>
			</div>
		</div>
	</body>
</html>

 

weather.jsp 입니다. 날씨와 미세먼지가 함께 있는데요. 

도저히 .. 길어서 편집했습니다. 모든 내용이 궁금하시다면 1편에 있는 깃허브 주소에 들어가주세요 ~ ❤

<%@page import="com.project.weather.WeatherUtil"%>
<%@page import="java.time.format.DateTimeFormatter"%>
<%@page import="java.time.LocalDate"%>
<%@page import="java.time.DayOfWeek"%>
<%@page import="java.util.ArrayList"%>
<%@page import="com.project.airquality.AirqualityDTO"%>
<%@page import="com.project.weather.WeatherDTO"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="tiles" uri="http://tiles.apache.org/tags-tiles"%>
<!DOCTYPE html>
<html>
<head>
<title>단기예보 - 기상청 날씨누리</title>

...

			<!-- 미세먼지 시작 -->
			<div class="card-body">
				<div class="cmp-cmn-para odam-updated" style="padding: 10px;">
					<a href="/evweb/airquality/getDataDust.do?stationId=${stationId}"
						class="updated-at">
					</a>
				</div>
				<div style="display: flex; justify-content: center;">
					<div class="forecast-body" style="font-family: &amp; amp;">
						<%-- ${airqualityInfo.datatime} --%>
						<div class="forecast-body" style="font-family: &amp; amp;">
							<div class="forecast-body-summary">
								<table>
									<tr class="wf-row-pm25">
									<tr>
										<td>지역</td>

										<c:forEach items="${airqualityInfo}" var="dust">
	
											<!-- 구름 -->
											<td style="padding: px 1px 0px 0px;">
												<div style="display: inline-block; width: 80px;">
													<svg width="80px" height="80px" version="1.1"
														viewBox="0 0 64 52"
														style="filter: transform-origin: 50% 50% 0px;">
														<g>
														<c:choose>
											<c:when test="${dust.pm25value<=15}"><path fill="#099d6e"
															d="M47.165,51.322H16.834c-7.142,0-12.952-5.81-12.952-12.952c0-6.042,4.264-11.29,10.076-12.615 c-0.025-0.298-0.036-0.584-0.036-0.861c0-6.736,5.479-12.216,12.215-12.216c4.756,0,8.986,2.697,11.01,6.941 c5.152-0.822,9.957,1.677,12.398,6.033c6.063,1.131,10.571,6.503,10.571,12.718C60.117,45.513,54.308,51.322,47.165,51.322z"></path>
												</c:when>
											<c:when test="${dust.pm25value<=35}"><path fill="#fbde3d"
															d="M47.165,51.322H16.834c-7.142,0-12.952-5.81-12.952-12.952c0-6.042,4.264-11.29,10.076-12.615 c-0.025-0.298-0.036-0.584-0.036-0.861c0-6.736,5.479-12.216,12.215-12.216c4.756,0,8.986,2.697,11.01,6.941 c5.152-0.822,9.957,1.677,12.398,6.033c6.063,1.131,10.571,6.503,10.571,12.718C60.117,45.513,54.308,51.322,47.165,51.322z"></path>
												</c:when>
											<c:when test="${dust.pm25value<=75}"><path fill="#fb9c3d"
															d="M47.165,51.322H16.834c-7.142,0-12.952-5.81-12.952-12.952c0-6.042,4.264-11.29,10.076-12.615 c-0.025-0.298-0.036-0.584-0.036-0.861c0-6.736,5.479-12.216,12.215-12.216c4.756,0,8.986,2.697,11.01,6.941 c5.152-0.822,9.957,1.677,12.398,6.033c6.063,1.131,10.571,6.503,10.571,12.718C60.117,45.513,54.308,51.322,47.165,51.322z"></path>
												</c:when>
											<c:when test="${dust.pm25value>=76}"><path fill="#cb0b3d"
															d="M47.165,51.322H16.834c-7.142,0-12.952-5.81-12.952-12.952c0-6.042,4.264-11.29,10.076-12.615 c-0.025-0.298-0.036-0.584-0.036-0.861c0-6.736,5.479-12.216,12.215-12.216c4.756,0,8.986,2.697,11.01,6.941 c5.152-0.822,9.957,1.677,12.398,6.033c6.063,1.131,10.571,6.503,10.571,12.718C60.117,45.513,54.308,51.322,47.165,51.322z"></path>
												</c:when>
										<%-- </c:choose> --%>
       											   </c:choose>
        										  
       
            									<text text-anchor="middle" font-family="serif"
															font-size="12" y="42" x="32" fill="#ffffff">${dust.stationname}</hr5>
       											   </g>
      												  </svg>
												</div>
												
												
											</td>
										</c:forEach>
									<tr>
										<td>PM<sub>2.5</sub></td>
										<c:forEach items="${airqualityInfo}" var="dust"><td>
												<pm10box style="">${dust.pm25value}</pm10box>
											</td></c:forEach>
									</tr>
									<tr>
										<td>PM<sub>10</sub></td>
										<c:forEach items="${airqualityInfo}" var="dust"><td>
										<c:choose>
											<c:when test="${dust.pm10value<=30}"><pm10box style="background-color:#099d6e;">${dust.pm10value}</pm10box></c:when>
											<c:when test="${dust.pm10value<=80}"><pm10box style="background-color:#fbde3d;">${dust.pm10value}</pm10box></c:when>
											<c:when test="${dust.pm10value<=150}"><pm10box style="background-color:#fb9c3d;">${dust.pm10value}</pm10box></c:when>
											<c:when test="${dust.pm10value>=151}"><pm10box style="background-color:#cb0b3d;">${dust.pm10value}</pm10box></c:when>
										<%-- </c:choose> --%>
       											   </c:choose>
												
											</td></c:forEach>

									</tr>
									<c:forEach items="${airqualityInfo}" var="dust">
										
									</c:forEach>
								</table>
							</div>
						</div>
					</div>
				</div>
			</div>
		</div>
		<!-- 미세먼지 끝 -->
</body>
</html>

한 화면에서 모든 측정소의 데이터를 보여줄 수 있도록 하였고요 ~

미세먼지 수치에 따라서 구름의 색이 변하도록 하였습니다.

포스팅 후기나 프로젝트 후기는 1편에서 확인 가능합니다. 감사합니다 ~ (✿◠‿◠)

 

안녕하세요 ~ 오늘은 미세먼지에 대해서 설명해드리겠습니다. 백 부분에 대해서 좀 더 설명해드릴 예정입니다 ~ ლ(╹◡╹ლ)

 

제일 먼저 테이블에 있는 내용과 동일하게 작성한 

 

AirqualityDTO 먼저 보여드리겠습니다.

package com.project.airquality;

public class AirqualityDTO {
	private String stationname; //측정소 이름
	private String datatime;	//데이터 시간
	private String pm10value;		//미세먼지
	private String pm25value;		//초미세먼지
	
	public AirqualityDTO() {
		super();
	}

	public AirqualityDTO(String stationname, String datatime, String pm10value, String pm25value) {
		super();
		this.stationname = stationname;
		this.datatime = datatime;
		this.pm10value = pm10value;
		this.pm25value = pm25value;
	}

	@Override
	public String toString() {
		return "AirqualityDTO [stationname=" + stationname + ", datatime=" + datatime + ", pm10value=" + pm10value
				+ ", pm25value=" + pm25value + "]";
	}

	public String getStationname() {
		return stationname;
	}

	public void setStationname(String stationname) {
		this.stationname = stationname;
	}

	public String getDatatime() {
		return datatime;
	}

	public void setDatatime(String datatime) {
		this.datatime = datatime;
	}

	public String getPm10value() {
		return pm10value;
	}

	public void setPm10value(String pm10value) {
		this.pm10value = pm10value;
	}

	public String getPm25value() {
		return pm25value;
	}

	public void setPm25value(String pm25value) {
		this.pm25value = pm25value;
	}
	
	
	
}

 

AirqualityController 입니다.

package com.project.airquality;

import java.io.IOException;
import java.time.LocalDate;
import java.time.LocalTime;
import java.util.List;

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 com.project.station.StationDTO;
import com.project.station.StationService;
import com.project.weather.WeatherUtil;

@Controller
public class AirqualityController {
	AirqualityAPIPull pull;
	StationService stationservice;
	AirqualityService airqualityService;
	
	@Autowired
	public AirqualityController(AirqualityAPIPull pull, StationService stationservice,
			AirqualityService airqualityService) {
		super();
		this.pull = pull;
		this.stationservice = stationservice;
		this.airqualityService = airqualityService;
	}
	
	@RequestMapping("/airquality/getDataDust.do")
	public String WeathergetData(String stationId, String path,Model model) throws IOException{
		String result = pull.GetAPIDataDust();
		airqualityService.delete();
		List<AirqualityDTO> dustList = pull.DataSaveDust(result);
		for (int i = 0; i < dustList.size(); i++) {
			airqualityService.insert(dustList.get(i));
		}
		return "redirect:/monitoring/main?stationId="+stationId;
	}
	
	@RequestMapping("/airquality/getDataDustWeather.do")
	public String WeathergetData2(String stationId, String path,Model model) throws IOException{
		String result = pull.GetAPIDataDust();
		airqualityService.delete();
		List<AirqualityDTO> dustList = pull.DataSaveDust(result);
		for (int i = 0; i < dustList.size(); i++) {
			airqualityService.insert(dustList.get(i));
		}
		return "redirect:/weather/getlistDust.do?stationId="+stationId;
	}
	
}

 

AirqualityDAO입니다 ~

package com.project.airquality;

import java.util.List;

import com.project.station.StationDTO;

public interface AirqualityDAO {
	List<AirqualityDTO> readList(String statilonname);
	int insert(AirqualityDTO dto);
	int delete();
	AirqualityDTO read(String stationname);
	List<AirqualityDTO> allReadList();
}

 

AirqualityDAOImpl 입니다 ~

package com.project.airquality;

import java.util.HashMap;
import java.util.List;

import org.apache.ibatis.session.SqlSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

@Repository
public class AirqualityDAOImpl implements AirqualityDAO{
	SqlSession sqlSession;
	
	@Autowired
	public AirqualityDAOImpl(SqlSession sqlSession) {
		super();
		this.sqlSession = sqlSession;
	}
	
	@Override
	public List<AirqualityDTO> readList(String stationname) {
		return sqlSession.selectList("com.project.airquality.select", stationname);
	}

	@Override
	public int insert(AirqualityDTO dto) {
		return sqlSession.insert("com.project.airquality.insert", dto);
	}

	@Override
	public int delete() {
		return sqlSession.delete("com.project.airquality.delete");
	}

	@Override
	public AirqualityDTO read(String stationname) {
		return sqlSession.selectOne("com.project.airquality.read", stationname);
	}

	@Override
	public List<AirqualityDTO> allReadList() {
		return sqlSession.selectList("com.project.airquality.allreadlist");
	}

}

 

AirqualityService 입니다.

package com.project.airquality;

import java.util.List;

import com.project.station.StationDTO;

public interface AirqualityService {
	List<AirqualityDTO> airqualityList(String stationname);
	int insert(AirqualityDTO dto);
	int delete();
	AirqualityDTO read(StationDTO station);
	List<AirqualityDTO> allReadList();
}

 

AirqualityServiceImpl 입니다.

package com.project.airquality;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.project.station.StationDTO;

@Service
public class AirqualityServiceImpl implements AirqualityService {
	AirqualityDAO dao;

	@Autowired
	public AirqualityServiceImpl(AirqualityDAO dao) {
		super();
		this.dao = dao;
	}

	@Override
	public int insert(AirqualityDTO dto) {
		return dao.insert(dto);
	}

	@Override
	public List<AirqualityDTO> airqualityList(String stationname) {
		return dao.readList(stationname);
	}

	@Override
	public int delete() {
		return dao.delete();
	}

	@Override
	public AirqualityDTO read(StationDTO station) {
		String stationname = "";
		double lon = Double.parseDouble(station.getMap_longtude());
		double lat = Double.parseDouble(station.getMap_latitude());
		String mapaddr = station.getAddr_detail().substring(0,3);
		if(mapaddr.equals("한림읍")) { //주소에서 한번 거름
			stationname = "한림읍";
		}else if(mapaddr.equals("성산읍")){
			stationname = "성산읍";
		}else if(mapaddr.equals("대정읍")){
			stationname = "대정읍";
		}else if(mapaddr.equals("애월읍")){
			stationname = "애월읍";
		}else if(mapaddr.equals("남원읍")){
			stationname = "남원읍";
		}else if(mapaddr.equals("조천읍")){
			stationname = "조천읍";
		}else { //나머지는 좌표로 대략적으로
			if(lon<=126.22) {
				if(lat<33.28) {
					stationname = "대정읍";
				}else {
					stationname = "고산리";
				}
			}else if(lon<=126.27) {
				if(lat<=33.28) {
					stationname = "대정읍";
				}else if(lat<=33.38) {
					stationname = "고산리";
				}else {
					stationname = "한림읍";
				}
			}else if(lat<=33.33) {
				if(lon<=126.37) {
					stationname = "대정읍";
				}else if(lon<=126.54) {
					stationname = "강정동";
				}else if(lon<=126.67) {
					stationname = "동홍동";
				}else {
					stationname = "남원읍";
				}
			}else if(lat>33.33) {
				if(lon<=126.30) {
					stationname = "한림읍";
				}else if(lat<=33.38 && lon<126.37) {
					stationname = "한림읍";
				}else if(lat>33.38 && lon<126.37) {
					stationname = "애월읍";
				}else if(lon<126.42) {
					stationname = "애월읍";
				}else if(lon<126.49) {
					stationname = "노형로";
				}else if(lon<126.53) {
					stationname = "연동";
				}else if(lon<126.55) {
					stationname = "이도동";
				}else if(lon<126.62) {
					stationname = "화북동";
				}else if(lon<126.82) {
					stationname = "조천읍";
				}else {
					stationname = "성산읍";
				}
			}
		}
		return dao.read(stationname);
	}

	@Override
	public List<AirqualityDTO> allReadList() {
		System.out.println("에어퀄리티서비스임플 실행되나?????????????????????????");
		return dao.allReadList();
	}
	

}

 

airquality.xml 메퍼입니다 ~

새로 받아올 경우 기존에 있는 데이터를 삭제하고 새로운 데이터를 받아오도록 하였습니다.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.project.airquality">
	<insert id="insert" parameterType="airquality">
		insert into AIRQUALITY_TB values(
		#{stationname}, #{datatime}, #{pm10value}, #{pm25value})
	</insert>
	<delete id="delete">
		delete from AIRQUALITY_TB 
	</delete>
	<select id="read" parameterType="String" resultType="airquality">
		select * from AIRQUALITY_TB where stationname = #{stationname}
	</select>
	<select id="allreadlist" resultType="airquality">
		select * from AIRQUALITY_TB
	</select>
</mapper>

미세먼지API

미세먼지는 아픈 손가락이에요 ..

포스팅을 할 때 A와 B로 Back과 Front로 계획했습니다만, 미세먼지는 좀 더 복잡하여 한 파트 더 글 작성을 하겠습니다.

제일 중요한 부분만 보여드리겠습니다.

 

package com.project.airquality;

import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.util.ArrayList;
//import java.util.List;
//
//import javax.xml.parsers.DocumentBuilderFactory;
//
//import org.json.simple.JSONObject;
//import org.json.simple.parser.JSONParser;
//
//import com.project.dust.dustDTO;
import java.util.List;

import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import org.json.simple.parser.ParseException;
import org.springframework.stereotype.Service;

import java.io.BufferedReader;
import java.io.IOException;

//시도별 실시간 측정정보 조회
//https://www.data.go.kr/tcs/dss/selectApiDataDetailView.do?publicDataPk=15073861
//요청주소 http://apis.data.go.kr/B552584/ArpltnInforInqireSvc/getCtprvnRltmMesureDnsty
//서비스URL http://apis.data.go.kr/B552584/ArpltnInforInqireSvc

@Service
public class AirqualityAPIPull {
	public String GetAPIDataDust() throws IOException {
		StringBuilder urlBuilder = new StringBuilder(
				"http://apis.data.go.kr/B552584/ArpltnInforInqireSvc/getCtprvnRltmMesureDnsty"); /* URL */
		urlBuilder.append("?" + URLEncoder.encode("serviceKey", "UTF-8")
				+ "=serviceKey"); /*
																																 * 서비스
																																 */
		urlBuilder.append("&" + URLEncoder.encode("returnType", "UTF-8") + "="
				+ URLEncoder.encode("json", "UTF-8")); /* xml 또는 json */
		urlBuilder.append("&" + URLEncoder.encode("numOfRows", "UTF-8") + "="
				+ URLEncoder.encode("100", "UTF-8")); /* 한 페이지 결과 수 */
		urlBuilder
				.append("&" + URLEncoder.encode("pageNo", "UTF-8") + "=" + URLEncoder.encode("1", "UTF-8")); /* 페이지번호 */
		urlBuilder.append("&" + URLEncoder.encode("sidoName", "UTF-8") + "=" + URLEncoder.encode("제주",
				"UTF-8")); /*
							 * 시도 이름(전국, 서울, 부산, 대구, 인천, 광주, 대전, 울산, 경기, 강원, 충북, 충남, 전북, 전남, 경북, 경남, 제주, 세종)
							 */
		urlBuilder.append(
				"&" + URLEncoder.encode("ver", "UTF-8") + "=" + URLEncoder.encode("1.0", "UTF-8")); /* 버전별 상세 결과 참고 */
		URL url = new URL(urlBuilder.toString());
		HttpURLConnection conn = (HttpURLConnection) url.openConnection();
		conn.setRequestMethod("GET");
		conn.setRequestProperty("Content-type", "application/json");
		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();
		return sb.toString();
	}

	public List<AirqualityDTO> DataSaveDust(String result) {
		// Json parser를 만들어 만들어진 문자열 데이터를 객체화
		List<AirqualityDTO> dustList = new ArrayList<AirqualityDTO>();
		JSONParser parser = new JSONParser();
		JSONObject obj;

		try {
			obj = (JSONObject) parser.parse(result);
			// response 키를 가지고 데이터를 파싱
			JSONObject parse_response = (JSONObject) obj.get("response");
			// response 로 부터 body 찾기
			JSONObject parse_body = (JSONObject) parse_response.get("body");
			// body 로 부터 items 찾기
			JSONArray parse_items = (JSONArray) parse_body.get("items");

			String category;
			JSONObject data; // parse_item은 배열형태이기 때문에 하나씩 데이터를 하나씩 가져올때 사용
			// 카테고리와 값만 받아오기
			String dataTime = ((JSONObject) parse_items.get(0)).get("dataTime").toString();
			for (int i = 0; i < parse_items.size(); i++) {
				AirqualityDTO dust = new AirqualityDTO();
				data = (JSONObject) parse_items.get(i);
				Object pm10Value = data.get("pm10Value");
				Object pm25Value = data.get("pm25Value");
				Object stationName = data.get("stationName");
				dust.setPm10value((String) pm10Value);
				dust.setPm25value((String) pm25Value);
				dust.setStationname((String) stationName);
				dust.setDatatime(dataTime);
				dustList.add(dust);
				}
			
		} catch (ParseException e) {
			e.printStackTrace();
		}
		return dustList;
		
	}
}

공공데이터에 있는 코드에서 수정해서 사용했고 xml은 손대기 번거로워서 json으로 받아올 수 있게 작업하였습니다.

 

공공데이터API

https://www.data.go.kr/tcs/dss/selectApiDataDetailView.do?publicDataPk=15073861 

 

한국환경공단_에어코리아_대기오염정보

각 측정소별 대기오염정보를 조회하기 위한 서비스로 기간별, 시도별 대기오염 정보와 통합대기환경지수 나쁨 이상 측정소 내역, 대기질(미세먼지/오존) 예보 통보 내역 등을 조회할 수 있다.

www.data.go.kr

밑에 있는 건 검색해도 정보 없어서 위에 있는 걸로 다시 사용했고, 여기서 '시도별 측정정보조회'로 봤습니다.

시를 '제주'로 설정하여, 제주도에 있는 13곳의 미세먼지 측정소 값을 가져오게 하였습니다.

 

측정소명 / 업데이트 시간 (미세먼지 API는 1시간에 한 번씩 받을 수 있습니다) / 미세먼지 / 초미세먼지 순입니다.

Oracle 테이블
오라클 내 미세먼지 테이블 데이터

 

이렇게 가져온 가져온 데이터를 가공하여 사이트에 뿌릴 수 있게 하였는데요,

https://www.jejudatahub.net/data/view/data/895

 

제주데이터허브

 

www.jejudatahub.net

제주데이터허브를 통해서 측정소의 정보를 가져왔습니다만,

실제로 API로 받아오는 측정소 값은 총 13개, 하지만 제주데이터허브에서는 9개 ..

수기로 미세먼지 측정소의 위치를 찾는 작업을 하였고, 구글 맵을 통해서 측정소의 위치를 경도와 위도로 바꿨습니다만,

 

제주도는 .. 가로가 더 긴 섬이잖아요 .. ?

그래서 경도와 위도를 x와 y로 바꾸는 작업도 하였습니다 .. (흘러내리는 눈물)

 

밑작업은 이 정도 했고 목요일엔 좀 더 상세한 미세먼지 API Back 작업 부분을 보여드리겠습니다 ~! (. ❛ ᴗ ❛.)

 

+ Recent posts