* 삭제 부분 제대로 안 됨
* 코스 추가 부분 구조 전체적으로 재구성 필요
jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" isELIgnored="false" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<script src="https://kit.fontawesome.com/f70c884d31.js"></script>
<script src='https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js'></script>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com">
<link href="https://fonts.googleapis.com/css2?family=Bagel+Fat+One&family=Poppins:wght@100;200;300;400;500;600;700;800;900&display=swap" rel="stylesheet">
<link rel="stylesheet" href="${pageContext.request.contextPath}/resources/css/originalCss.css?=ver3" type="text/css">
<link rel="stylesheet" href="${pageContext.request.contextPath}/resources/css/course.css?=ver3" type="text/css">
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.1/dist/css/bootstrap.min.css?" rel="stylesheet">
<title>지도에서 코스 찾기</title>
</head>
<body onload="selectChanged(); switchUl('#courseUl1');">
<jsp:include page="/WEB-INF/views/module/nav.jsp" flush="false"/>
<div class="d-flex position-relative">
<div id="map" style="width:100%; height:1000px;"></div>
<div style="width: 300px; top: 0px; left: 100%; transform: translateX(-100%); z-index: 5; background-color: rgba(255, 255, 255, 0.5); height: 100%;" class="position-absolute p-4">
<select id="areaName" onchange="selectChanged()" class="input" style="width:100px;">
<option value="강릉시" selected>강릉시
<option value="고성군">고성군
<option value="동해시">동해시
<option value="삼척시">삼척시
<option value="속초시">속초시
<option value="양구군">양구군
<option value="양양군">양양군
<option value="영월군">영월군
<option value="원주시">원주시
<option value="인제군">인제군
<option value="정선군">정선군
<option value="철원군">철원군
<option value="춘천시">춘천시
<option value="태백시">태백시
<option value="평창군">평창군
<option value="홍천군">홍천군
<option value="화천군">화천군
<option value="횡성군">횡성군
</select>
<select id="category" onchange="selectChanged()" class="input" style="width:100px;">
<option value="전체" selected>전체
<option value="숙박">숙소
<option value="관광지">관광지
<option value="식음료">식음료
<option value="체험">체험
</select>
<hr>
<c:choose>
<c:when test="${courseCount eq 10}">
<h5 style="text-align: center;">코스는 10개까지만<br>만들 수 있습니다.</h5>
</c:when>
<c:when test="${empty sessionScope.sessionId}">
<h5 style="text-align: center;">코스 만들기는<br>로그인 후 이용 가능합니다.</h5>
</c:when>
<c:otherwise>
<div>
<input type="text" id="courseName" class="input" placeholder="코스 이름" style="width: 100%;">
<div id="dayBox">
<a onclick="switchUl('#courseUl1')" id="atag1">1일차</a>
<a onclick="switchUl('#courseUl2')" id="atag2">2일차</a>
<a onclick="switchUl('#courseUl3')" id="atag3">3일차</a>
</div>
<ul id="courseUl1">
</ul>
<ul id="courseUl2" style="display: none;">
</ul>
<ul id="courseUl3" style="display: none;">
</ul>
<a onclick="submitCourse();" class="submit-green" style="width: 100%;">코스 만들기</a>
</div>
</c:otherwise>
</c:choose>
</div>
</div>
<script type="text/javascript" src="//dapi.kakao.com/v2/maps/sdk.js?appkey=7a4ab729c1aae3934d705ceb879a263a&libraries=services"></script>
<script type="text/javascript">
/* 카카오 지도 */
var mapContainer = document.getElementById('map'), // 지도를 표시할 div
mapOption = {
center: new kakao.maps.LatLng(37.7091295,128.8324462), // 지도의 중심좌표
level: 8 // 지도의 확대 레벨
};
// 지도 생성
var map = new kakao.maps.Map(mapContainer, mapOption);
let hotelAddrs = [];
let spotAddrs = [];
let hotelMarkers = [];
let spotMarkers = [];
let cafeMarkers = [];
let expMarkers = [];
var markerImageSrc = 'https://t1.daumcdn.net/localimg/localimages/07/mapapidoc/category.png';
let hotelMarkerImageSrc = '/pet_hug/resources/images/map/hotelmarker.png';
let spotMarkerImageSrc = '/pet_hug/resources/images/map/spotmarker.png';
let cafeMarkerImageSrc = '/pet_hug/resources/images/map/cafemarker.png';
let expMarkerImageSrc = '/pet_hug/resources/images/map/expmarker.png';
let currentOverlay = null;
let overlayContet = null;
let newOverlay = null;
let previousMarker = null;
var titleArray1 = [];
var titleArray2 = [];
var titleArray3 = [];
let contentSeqArray1 = [];
let contentSeqArray2 = [];
let contentSeqArray3 = [];
let selectedArray = null;
var selectedUl = null;
let courseName = [];
let miniContentSeqArray = [];
/* 지도 이동, category/areaName 가져옴 */
function selectChanged(){
let areaName = document.getElementById("areaName").value;
console.log("areaValue: ", areaName);
let category = document.getElementById("category").value;
console.log("categoryValue: ", category);
if(areaName == '강릉시'){
moveMap(37.7091295,128.8324462);
}else if(areaName == '고성군'){
moveMap(38.3773762,128.3997526);
}else if(areaName == '동해시'){
moveMap(37.5067666,129.0555852);
}else if(areaName == '삼척시'){
moveMap(37.2773968,129.1220028);
}else if(areaName == '속초시'){
moveMap(38.17601,128.5194615);
}else if(areaName == '양구군'){
moveMap(38.178176,128.001272);
}else if(areaName == '양양군'){
moveMap(38.0045219,128.5950959);
}else if(areaName == '영월군'){
moveMap(37.2039413,128.500649);
}else if(areaName == '원주시'){
moveMap(37.3082307,127.9294889);
}else if(areaName == '인제군'){
moveMap(38.0688048,128.263324);
}else if(areaName == '정선군'){
moveMap(37.3786668,128.7390494);
}else if(areaName == '철원군'){
moveMap(38.2434576,127.4141162);
}else if(areaName == '춘천시'){
moveMap(37.8897796,127.7398952);
}else if(areaName == '태백시'){
moveMap(37.1722939,128.9800161);
}else if(areaName == '평창군'){
moveMap(37.556735,128.4826261);
}else if(areaName == '홍천군'){
moveMap(37.7450683,128.0742344);
}else if(areaName == '화천군'){
moveMap(38.1383179,127.6849292);
}else if(areaName == '횡성군'){
moveMap(37.5089632,128.0770982);
}
//기존 마커 제거
removeMarkers();
requestAddrArray(areaName, category);
}
function requestAddrArray(areaName, category){
$.ajax({
url: '/pet_hug/courses/getAddrArray',
type: 'POST',
contentType: 'application/json',
data: JSON.stringify({areaName: areaName, category: category}),
success: function(data) {
if(category === '숙박'){
displayHotelMarkers(data);
}else if(category === '관광지'){
displaySpotMarkers(data);
}else if(category === '식음료'){
displayCafeMarkers(data);
}else if(category === '체험'){
displayExpMarkers(data);
}else if(category === '전체'){
displayHotelMarkers(data);
displaySpotMarkers(data);
displayCafeMarkers(data);
displayExpMarkers(data);
}
},
error: function(error) {
}
});
}
function moveMap(latitude, longitude){
let center = new kakao.maps.LatLng(latitude, longitude);
map.panTo(center);
}
function removeMarkers(){
for (var i = 0; i < hotelMarkers.length; i++) {
hotelMarkers[i].setMap(null);
}
for (var i = 0; i < spotMarkers.length; i++) {
spotMarkers[i].setMap(null);
}
for (var i = 0; i < cafeMarkers.length; i++) {
cafeMarkers[i].setMap(null);
}
for (var i = 0; i < expMarkers.length; i++) {
expMarkers[i].setMap(null);
}
}
function displayHotelMarkers(data){
hotelAddrs = data[0].map(function(item){
return new kakao.maps.LatLng(item.lat, item.lng);
});
var hotelInfo = data[0];
// 호텔 주소 배열에 있는 좌표를 지도에 표시
for (var i = 0; i < hotelAddrs.length; i++) {
var marker = new kakao.maps.Marker({
position: hotelAddrs[i],
image: new kakao.maps.MarkerImage(hotelMarkerImageSrc, new kakao.maps.Size(42, 42)),
map: map
});
hotelMarkers.push(marker);
// 호텔 마커에 클릭 이벤트 리스너 추가
kakao.maps.event.addListener(marker, 'click', (function(marker, hotel) {
return function() {
// 이전에 클릭된 마커와 현재 클릭된 마커가 다른 경우에만 처리
if (previousMarker !== marker) {
// 이전에 클릭된 마커의 오버레이가 열려있으면 닫음
if (previousMarker && currentOverlay) {
currentOverlay.setMap(null);
}
// 현재 클릭된 마커의 오버레이를 열고, 이전에 클릭된 마커를 저장
overlayContent = getOverlayContent(hotel.p1, hotel.title, hotel.contentSeq, hotel.partName);
var newOverlay = new kakao.maps.CustomOverlay({
position: marker.getPosition(),
content: overlayContent,
xAnchor: 0.3,
yAnchor: 1.2 // 마커보다 약간 위로 이동
});
newOverlay.setMap(map);
// 새로운 오버레이와 클릭된 마커를 저장
currentOverlay = newOverlay;
previousMarker = marker;
moveMap(marker.getPosition().getLat(), marker.getPosition().getLng());
} else {
// 이전에 클릭된 마커와 현재 클릭된 마커가 같으면 오버레이를 닫음
if (currentOverlay) {
closeAllOverlay();
}
}
};
})(marker, hotelInfo[i]));
}
}
function addScheduleInCourse(title){
console.log('addScheduleInCourse() 실행');
var selectedDay = $('.selectedDay'); // 선택된 일자를 가리키는 클래스
var selectedUl = $('.selectedUl'); // 선택된 일자의 다음에 오는 ul 태그
var newSchedule = '<li class="mb-3">' +
'<div class="d-flex justify-content-between scheduleBox">' +
'<p class="scheduleName">' + title + '</p>' +
'<p class="close" onclick="removeSchedule(this)">x</p>' +
'</div>' +
'</li>';
// 최대 7개까지만 li를 추가합니다.
if (selectedUl.children('li').length < 7) {
selectedUl.append(newSchedule);
} else {
alert('최대 7개까지만 추가할 수 있습니다.');
}
}
function getCourseInfo(){
console.log('() 실행')
$.ajax({
url: '/pet_hug/courses/map/courseInfo',
type: 'POST',
contentType: 'application/json',
data: JSON.stringify({ contentSeqArray: miniContentSeqArray }),
success: function (response) {
// 성공적으로 응답을 받았을 때 처리
console.log('서버로 전송 완료:', response);
var convertedDuration = response.convertedDuration;
var convertedDistance = response.convertedDistance;
addCourseInfoToLastLi(convertedDistance, convertedDuration);
},
error: function (error) {
// 오류 발생 시 처리
console.error('서버로 전송 중 오류 발생:', error);
}
});
}
function addCourseInfoToLastLi(convertedDistance, convertedDuration){
var lastSchedule = $('.selectedUl li:last');
var infoHtml = '<p>거리: ' + convertedDistance + ' | 소요 시간: ' + convertedDuration + '</p>';
lastSchedule.before(infoHtml);
}
function closeAllOverlay(){
currentOverlay.setMap(null);
currentOverlay = null;
previousMarker = null;
}
function displaySpotMarkers(data) {
// 관광명소 주소 배열 생성 및 마커 표시
spotAddrs = data[1].map(function(item){
return new kakao.maps.LatLng(item.lat, item.lng);
});
var spotInfo = data[1];
// 호텔 주소 배열에 있는 좌표를 지도에 표시
for (var i = 0; i < spotAddrs.length; i++) {
var marker = new kakao.maps.Marker({
position: spotAddrs[i],
image: new kakao.maps.MarkerImage(spotMarkerImageSrc, new kakao.maps.Size(42, 42)),
map: map
});
spotMarkers.push(marker);
// 호텔 마커에 클릭 이벤트 리스너 추가
kakao.maps.event.addListener(marker, 'click', (function(marker, spot) {
return function() {
// 이전에 클릭된 마커와 현재 클릭된 마커가 다른 경우에만 처리
if (previousMarker !== marker) {
// 이전에 클릭된 마커의 오버레이가 열려있으면 닫음
if (previousMarker && currentOverlay) {
currentOverlay.setMap(null);
}
// 현재 클릭된 마커의 오버레이를 열고, 이전에 클릭된 마커를 저장
overlayContent = getOverlayContent(spot.p1, spot.title, spot.contentSeq, spot.partName);
var newOverlay = new kakao.maps.CustomOverlay({
position: marker.getPosition(),
content: overlayContent,
xAnchor: 0.3,
yAnchor: 1.2 // 마커보다 약간 위로 이동
});
newOverlay.setMap(map);
// 새로운 오버레이와 클릭된 마커를 저장
currentOverlay = newOverlay;
previousMarker = marker;
moveMap(marker.getPosition().getLat(), marker.getPosition().getLng());
} else {
// 이전에 클릭된 마커와 현재 클릭된 마커가 같으면 오버레이를 닫음
if (currentOverlay) {
closeAllOverlay();
}
}
};
})(marker, spotInfo[i]));
}
}
function displayCafeMarkers(data){
//주소 배열 생성 및 마커 표시
cafeAddrs = data[2].map(function(item){
return new kakao.maps.LatLng(item.lat, item.lng);
});
var cafeInfo = data[2];
//주소 배열에 있는 좌표를 지도에 표시
for (var i = 0; i < cafeAddrs.length; i++) {
var marker = new kakao.maps.Marker({
position: cafeAddrs[i],
image: new kakao.maps.MarkerImage(cafeMarkerImageSrc, new kakao.maps.Size(42, 42)),
map: map
});
cafeMarkers.push(marker);
//마커에 클릭 이벤트 리스너 추가
kakao.maps.event.addListener(marker, 'click', (function(marker, cafe) {
return function() {
// 이전에 클릭된 마커와 현재 클릭된 마커가 다른 경우에만 처리
if (previousMarker !== marker) {
// 이전에 클릭된 마커의 오버레이가 열려있으면 닫음
if (previousMarker && currentOverlay) {
currentOverlay.setMap(null);
}
// 현재 클릭된 마커의 오버레이를 열고, 이전에 클릭된 마커를 저장
overlayContent = getOverlayContent(cafe.p1, cafe.title, cafe.contentSeq, cafe.partName);
var newOverlay = new kakao.maps.CustomOverlay({
position: marker.getPosition(),
content: overlayContent,
xAnchor: 0.3,
yAnchor: 1.2 // 마커보다 약간 위로 이동
});
newOverlay.setMap(map);
// 새로운 오버레이와 클릭된 마커를 저장
currentOverlay = newOverlay;
previousMarker = marker;
moveMap(marker.getPosition().getLat(), marker.getPosition().getLng());
} else {
// 이전에 클릭된 마커와 현재 클릭된 마커가 같으면 오버레이를 닫음
if (currentOverlay) {
closeAllOverlay();
}
}
};
})(marker, cafeInfo[i]));
}
}
function displayExpMarkers(data){
//주소 배열 생성 및 마커 표시
expAddrs = data[3].map(function(item){
return new kakao.maps.LatLng(item.lat, item.lng);
});
var expInfo = data[3];
//주소 배열에 있는 좌표를 지도에 표시
for (var i = 0; i < expAddrs.length; i++) {
var marker = new kakao.maps.Marker({
position: expAddrs[i],
image: new kakao.maps.MarkerImage(expMarkerImageSrc, new kakao.maps.Size(42, 42)),
map: map
});
expMarkers.push(marker);
//마커에 클릭 이벤트 리스너 추가
kakao.maps.event.addListener(marker, 'click', (function(marker, exp) {
return function() {
// 이전에 클릭된 마커와 현재 클릭된 마커가 다른 경우에만 처리
if (previousMarker !== marker) {
// 이전에 클릭된 마커의 오버레이가 열려있으면 닫음
if (previousMarker && currentOverlay) {
currentOverlay.setMap(null);
}
// 현재 클릭된 마커의 오버레이를 열고, 이전에 클릭된 마커를 저장
overlayContent = getOverlayContent(exp.p1, exp.title, exp.contentSeq, exp.partName);
var newOverlay = new kakao.maps.CustomOverlay({
position: marker.getPosition(),
content: overlayContent,
xAnchor: 0.3,
yAnchor: 1.2 // 마커보다 약간 위로 이동
});
newOverlay.setMap(map);
// 새로운 오버레이와 클릭된 마커를 저장
currentOverlay = newOverlay;
previousMarker = marker;
moveMap(marker.getPosition().getLat(), marker.getPosition().getLng());
} else {
// 이전에 클릭된 마커와 현재 클릭된 마커가 같으면 오버레이를 닫음
if (currentOverlay) {
closeAllOverlay();
}
}
};
})(marker, expInfo[i]));
}
}
function getOverlayContent(p1, title, contentSeq, partName){
overlayContent = '<div style="width: 320px; height: 280px; background-color: white; border-radius: 0px 0px 5% 5%;" class="border position-relative">' +
'<img src="' + p1 + '" style="width:100%"/>' +
'<div style="padding: 5px;">' +
'<div style="margin: 1px 0; height: 1.5rem; font-size: 1rem;">' +
'<p style="display: inline-block; width: 100%; margin-bottom: 0px;">' + title + '</p><br>' +
'</div>' +
'<div class="d-flex mb-2" style="justify-content: end">' +
'<a href="/pet_hug/' + partName + 's/' + partName + '?num=' + contentSeq + '" style="border-radius: 6px; text-decoration: none; padding: 5px; display: inline-block; width: 75px; margin-right: 3px;" class="background-lightgreen">상세정보</a>' +
'<button onclick="pushContentSeqArray(\'' + contentSeq + '\'); addScheduleInCourse(\'' + title + '\');" style="border-radius: 6px; padding: 5px; border: none;" class="background-green">코스에 추가</button>'
'</div>' +
'</div>' +
'</div>';
return overlayContent;
}
function switchUl(ulId) {
let atag;
if(ulId === '#courseUl1'){
atag = '#atag1';
selectedArray = contentSeqArray1;
}else if(ulId === '#courseUl2'){
atag = '#atag2';
selectedArray = contentSeqArray2;
}else if(ulId === '#courseUl3'){
atag = '#atag3';
selectedArray = contentSeqArray3;
}
$('#courseUl1').hide();
$('#courseUl2').hide();
$('#courseUl3').hide();
$(ulId).show();
$('.selectedDay').removeClass('selectedDay');
$(atag).addClass('selectedDay');
$('.selectedUl').removeClass('selectedUl');
$(ulId).addClass('selectedUl');
}
function pushContentSeqArray(contentSeq){
console.log("pushContentSeqArray() 실행");
if (selectedArray.length < 7) {
selectedArray.push(contentSeq);
if(selectedArray.length >= 2){
console.log("selectedArray 길이 2 이상")
miniContentSeqArray = [];
miniContentSeqArray = selectedArray.slice(-2);
console.log('miniContentSeqArray[0]: ' + miniContentSeqArray[0]);
getCourseInfo(miniContentSeqArray);
}
}
}
function submitCourse(){
console.log("submitCourse() 실행")
courseName.push($('#courseName').val());
console.log(courseName);
var jsontest = JSON.stringify({
courseName: courseName,
contentSeqArray1: contentSeqArray1,
contentSeqArray2: contentSeqArray2,
contentSeqArray3: contentSeqArray3
});
console.log('jsontest: ' + jsontest);
$.ajax({
url: '/pet_hug/courses/submitCourse', // 컨트롤러 URL 설정
type: 'POST',
contentType: 'application/json; charset=utf-8',
data: jsontest,
success: function(response) {
// 성공적으로 응답을 받았을 때 처리
console.log("코스 만들기 성공:", response);
alert("만들어진 코스는 마이페이지에서 확인 가능합니다.");
location.reload();
},
error: function(error) {
// 오류 발생 시 처리
console.error("코스 만들기 오류:", error);
// 오류 처리 로직 추가
}
});
}
function removeSchedule(element) {
console.log("removeSchedule() 실행");
// 클릭된 'x' 버튼의 부모 요소인 <li>를 찾습니다.
var parentLi = $(element).closest('li');
// 해당 리스트 아이템의 순서를 찾음
var index = parentLi.index();
console.log("index: " + index);
// 해당 리스트 아이템을 삭제
parentLi.prev('p').remove();
parentLi.next('p').remove();
parentLi.remove();
// 삭제된 인덱스의 항목을 selectedArray에서 삭제합니다.
selectedArray.splice(index, 1);
console.log('contentSeqArray1: ' + contentSeqArray1);
console.log('contentSeqArray2: ' + contentSeqArray2);
console.log('contentSeqArray3: ' + contentSeqArray3);
miniContentSeqArray = [];
miniContentSeqArray = selectedArray.slice(-2);
console.log('miniContentSeqArray[0]: ' + miniContentSeqArray[0]);
getCourseInfo(miniContentSeqArray);
}
</script>
<jsp:include page="/WEB-INF/views/module/footer.jsp" flush="false"/>
</body>
</html>
2. 마커 띄우기 관련 자바 코드
1) 강원 반려동물 동반관광 API
[스프링] 강원 반려동물 동반관광 API 활용 코드 (tistory.com)
[스프링] 강원 반려동물 동반관광 API 활용 코드
강원 반려동물 동반관광 API 시스템에 공개되어있는 정보를 데이터베이스에 입력하는 코드를 작성했다. 강원 반려동물 동반관광 Open API 링크 Open API 목록 | 강원특별자치도 반려동물 동반관광 API
mangowhale.tistory.com
2)ajax 요청시 매핑되는 컨트롤러
@PostMapping("/getAddrArray")
@ResponseBody
public List<List<LatLng>> getAddrArray(@RequestBody Map<String, String> requestBody) {
System.out.println("CourseController.getAddrArray() 도착");
String areaName = requestBody.get("areaName");
String category = requestBody.get("category");
System.out.println("areaName: " + areaName);
System.out.println("category: " + category);
if(category.equals("숙박")) {
hotelAddrArray = courseService.getOneCategoryAddrList(category, areaName);
}else if(category.equals("관광지")) {
spotAddrArray = courseService.getOneCategoryAddrList(category, areaName);
}else if(category.equals("식음료")) {
cafeAddrArray = courseService.getOneCategoryAddrList(category, areaName);
}else if(category.equals("체험")) {
expAddrArray = courseService.getOneCategoryAddrList(category, areaName);
}else if(category.equals("전체")) {
hotelAddrArray = courseService.getOneCategoryAddrList("숙박", areaName);
spotAddrArray = courseService.getOneCategoryAddrList("관광지", areaName);
cafeAddrArray = courseService.getOneCategoryAddrList("식음료", areaName);
expAddrArray = courseService.getOneCategoryAddrList("체험", areaName);
}
List<List<LatLng>> bigAddrArray = new ArrayList<List<LatLng>>();
bigAddrArray.add(hotelAddrArray);
bigAddrArray.add(spotAddrArray);
bigAddrArray.add(cafeAddrArray);
bigAddrArray.add(expAddrArray);
return bigAddrArray;
}
3) 서비스
@Override
public List<LatLng> getOneCategoryAddrList(String category, String areaName) {
System.out.println("courseService.getOneCategoryAddrList() 도착");
List<LatLng> addrObject = courseRepository.getAddrObjectByCategoryAndAreaName(category, areaName);
return addrObject;
}
4) 리파지토리
@Override
public List<LatLng> getAddrObjectByCategoryAndAreaName(String category, String areaName) {
System.out.println("courseRepository.getAddrObjectByCategoryAndAreaName() 도착");
String SQL = "SELECT latitude, longitude, title, contentSeq, p1, partName FROM content WHERE partName = '" + category +"' AND areaName = ?";
List<LatLng> addrObject = template.query(SQL, new LatLngRowMapper(), areaName);
return addrObject;
}
2. submitCourse() → 코스 DB 저장
1)컨트롤러
@PostMapping("/submitCourse")
@ResponseBody
public void submitCourse(@RequestBody Map<String, String[]> requestBody) {
System.out.println("CourseController.submitCourse() 도착");
String courseName = requestBody.get("courseName")[0];
String[] contentSeqArray1 = requestBody.get("contentSeqArray1");
String[] contentSeqArray2 = requestBody.get("contentSeqArray2");
String[] contentSeqArray3 = requestBody.get("contentSeqArray3");
System.out.println("courseName: " + courseName);
for(int i = 0; i<contentSeqArray1.length; i++) {
System.out.println("contentSeqArray1[" + i + "]: " + contentSeqArray1[i]);
}
System.out.println(contentSeqArray1.toString());
Course course = new Course();
course.setCourseName(courseName);
course.setCourse1(convertArrayIntoString(contentSeqArray1));
course.setCourse2(convertArrayIntoString(contentSeqArray2));
course.setCourse3(convertArrayIntoString(contentSeqArray3));
String sessionId = (String)session.getAttribute("sessionId");
courseService.createNewCourse(sessionId, course);
}
public String convertArrayIntoString(String[] stringArray) {
String convertedString = "{";
for(int i = 0; i<stringArray.length; i++) {
if(i == 0)
convertedString = convertedString + stringArray[i];
else
convertedString = convertedString + ", " + stringArray[i];
}
convertedString = convertedString + "}";
System.out.println("convertedString: " + convertedString);
return convertedString;
}
2) 서비스 생략
3)리파지토리
@Override
public void createNewCourse(String sessionId, Course course) {
System.out.println("courseRepository.createNewCourse() 도착");
System.out.println("sessionId: " + sessionId);
String SQL = "INSERT INTO course (courseNum, courseName, mem_id, course1, course2, course3) values(null, ?, ?, ?, ?, ?)";
template.update(SQL, course.getCourseName(), sessionId, course.getCourse1(), course.getCourse2(), course.getCourse3());
}
3. getCourseInfo() → 스케줄간 CourseInfo
1)컨트롤러
@PostMapping("/map/courseInfo")
@ResponseBody
public CourseInfo getCourseInfoForMap(@RequestBody Map<String, String[]> requestBody){
System.out.println("CourseController.getLatLngList() 도착");
String[] contentSeqArray = requestBody.get("contentSeqArray");
System.out.println("contentSeqArray[0]: " + contentSeqArray[0]);
CourseInfo courseInfo = courseService.getOneCourseInfo(contentSeqArray);
return courseInfo;
}
2)서비스
@Override
public CourseInfo getOneCourseInfo(String[] contentSeqArray) {
System.out.println("courseService.getOneCourseInfo() 도착");
List<LatLng> latLngList = courseRepository.getLatLngListByContentSeqArray(contentSeqArray);
String startLongitude = latLngList.get(0).getLng();
String startLatitude = latLngList.get(0).getLat();
String goalLongitude = latLngList.get(1).getLng();
String goalLatitude = latLngList.get(1).getLat();
CourseInfo courseInfo = getCourseInfoFromAPIByLatLng(startLongitude, startLatitude, goalLongitude, goalLatitude);
return courseInfo;
}
public CourseInfo getCourseInfoFromAPIByLatLng(String startLongitude, String startLatitude, String goalLongitude, String goalLatitude) {
System.out.println("courseService.getCourseInfoFromAPIByLatLng() 도착");
URL url = courseRepository.getCourseInfoUrl(startLongitude, startLatitude, goalLongitude, goalLatitude);
CourseInfo courseInfo = new CourseInfo();
if(url == null) {
return null;
}else {
StringBuffer urlResponse = courseRepository.getStringResponse(url);
if(urlResponse != null) {
courseInfo = courseRepository.getInfoFromDrivingJSON(urlResponse, courseInfo);
}
}
return courseInfo;
}
3)리파지토리
@Override
public URL getCourseInfoUrl(String startLongitude, String startLatitude, String goalLongitude,
String goalLatitude){
System.out.println("getCourseInfoUrl() 도착");
String requestUrl = "https://naveropenapi.apigw.ntruss.com/map-direction/v1/driving?start=" + startLongitude + "," + startLatitude + "&goal=" + goalLongitude + "," + goalLatitude + "&option=traoptimal";
URL url = null;
try {
url = new URL(requestUrl);
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return url;
}
@Override
public StringBuffer getStringResponse(URL url){
System.out.println("getUrlResponse() 도착");
if (url == null) {
// url이 null이면 null을 반환하거나 예외 처리를 수행
return null; // 예시로 null 반환
}
HttpURLConnection con;
BufferedReader br;
StringBuffer urlResponse = null;
try {
con = (HttpURLConnection)url.openConnection();
con.setRequestMethod("GET");
con.setRequestProperty("X-NCP-APIGW-API-KEY-ID", "");
con.setRequestProperty("X-NCP-APIGW-API-KEY", "");
int responseCode = con.getResponseCode();
if(responseCode == 200) {
br = new BufferedReader(new InputStreamReader(con.getInputStream(), "UTF-8"));
}else {
br = new BufferedReader(new InputStreamReader(con.getErrorStream()));
}
String line;
urlResponse = new StringBuffer();
while((line = br.readLine()) != null) {
urlResponse.append(line);
}
br.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return urlResponse;
}
@Override
public CourseInfo getInfoFromDrivingJSON(StringBuffer urlResponse, CourseInfo courseInfo) {
System.out.println("getInfoFromDrivingJSON() 도착");
if(urlResponse == null)
return null;
JSONObject responseObject = new JSONObject(urlResponse.toString());
JSONObject route = responseObject.getJSONObject("route");
JSONArray traoptimal = route.getJSONArray("traoptimal");
JSONObject traoptimalObject = traoptimal.getJSONObject(0);
JSONObject summary = traoptimalObject.getJSONObject("summary");
String duration = summary.get("duration").toString();
String tollFare = summary.get("tollFare").toString();
String distance = summary.get("distance").toString();
String fuelPrice = summary.get("fuelPrice").toString();
int duration_int = Integer.parseInt(duration);
courseInfo.setDuration(duration_int/(60*1000));
courseInfo.setDistance(Integer.parseInt(distance));
courseInfo.setTollFare(Integer.parseInt(tollFare));
courseInfo.convertDuration(courseInfo.getDuration());
courseInfo.convertDistance(courseInfo.getDistance());
courseInfo.setConvertedTollFare(courseInfo.convertPrice(courseInfo.getTollFare()));
courseInfo.setFuelPrice(Integer.parseInt(fuelPrice));
courseInfo.setConvertedFuelPrice(courseInfo.convertPrice(courseInfo.getFuelPrice()));
return courseInfo;
}
도메인
package com.springmvc.domain;
public class CourseInfo {
private int duration;
private String convertedDuration;
private int distance;
private String convertedDistance;
private int tollFare;
private String convertedTollFare;
private int fuelPrice;
private String convertedFuelPrice;
public String getConvertedTollFare() {
return convertedTollFare;
}
public void setConvertedTollFare(String convertedTollFare) {
this.convertedTollFare = convertedTollFare;
}
public String getConvertedFuelPrice() {
return convertedFuelPrice;
}
public void setConvertedFuelPrice(String convertedFuelPrice) {
this.convertedFuelPrice = convertedFuelPrice;
}
public int getDuration() {
return duration;
}
public void setDuration(int duration) {
this.duration = duration;
}
public String getConvertedDuration() {
return convertedDuration;
}
public void setConvertedDuration(String convertedDuration) {
this.convertedDuration = convertedDuration;
}
public int getTollFare() {
return tollFare;
}
public void setTollFare(int tollFare) {
this.tollFare = tollFare;
}
public int getDistance() {
return distance;
}
public void setDistance(int distance) {
this.distance = distance;
}
public String getConvertedDistance() {
return convertedDistance;
}
public void setConvertedDistance(String convertedDistance) {
this.convertedDistance = convertedDistance;
}
public int getFuelPrice() {
return fuelPrice;
}
public void setFuelPrice(int fuelPrice) {
this.fuelPrice = fuelPrice;
}
public void convertDuration(int duration) {
int hour = 0;
while(duration > 60) {
duration = duration - 60;
hour++;
}
if(hour >= 1) {
this.convertedDuration = hour + "시간 " + duration + "분";
}else {
this.convertedDuration = duration + "분";
}
}
public void convertDistance(int distance) {
this.convertedDistance = distance/1000 + "km";
}
public String convertPrice(int price) {
String convertedPrice = String.format("%,d", fuelPrice);
return convertedPrice + "원";
}
}
'정리노트 > 팀프로젝트' 카테고리의 다른 글
[팀 프로젝트] 24.03.18. 노트 (0) | 2024.03.18 |
---|---|
네이버 길찾기 경유지 추가 코드 백업 (0) | 2024.03.18 |
코스 정보 코드 백업 (0) | 2024.03.18 |
[팀 프로젝트] 24.03.15. 노트 (0) | 2024.03.15 |
[팀 프로젝트] 24.03.13. 노트 (0) | 2024.03.13 |