Server

AJAX STEP 11 - Map

2023. 5. 18. 15:51
728x90

★ 프로젝트 생성

  • Dynamic Web Project
  • MapTest
  • context : map

 

★ 카카오맵 API

  • https://developers.kakao.com/
 

Kakao Developers

카카오 API를 활용하여 다양한 어플리케이션을 개발해보세요. 카카오 로그인, 메시지 보내기, 친구 API, 인공지능 API 등을 제공합니다.

developers.kakao.com

  •  https://apis.map.kakao.com/
  • https://apis.map.kakao.com/web/guide/
  • https://www.flaticon.com/kr/free-icons/map-marker/2?k=1684393535380&log-in=google
  • https://fonts.google.com/icons?selected=Material+Symbols+Outlined:liquor:FILL@0;wght@400;GRAD@0;opsz@48&icon.query=bar

 

■ 필요 파일

- "com.test.map"
    - "Map.java"
    - "MapDAO.java"
    - "PlaceDTO.java"
    - "CategoryDTO.java"

- webapp > WEB-INF > "views"
	- "map.jsp"

 

■ 필요 라이브러리

jackson
json
jstl
lombok
myLibrary
Ojdbc

 

■ 데이터베이스

-- 카테고리
create table tblPlaceCategory (
    seq number primary key,
    name varchar2(100) not null,
    marker varchar2(50) not null
);


-- 장소 등록
create table tblPlace (
    seq number primary key,         -- 번호(PK)
    name varchar2(100) not null,    -- 장소
    lat number not null,                -- 위도
    lng number not null,               -- 경도
    cseq number not null references tblPlaceCategory(seq)
);

create sequence seqPlaceCategory;
create sequence seqPlace;

insert into tblPlaceCategory values (seqPlaceCategory.nextVal, '맛집', 'default');
insert into tblPlaceCategory values (seqPlaceCategory.nextVal, '카페', 'default');
insert into tblPlaceCategory values (seqPlaceCategory.nextVal, '운동', 'default');
insert into tblPlaceCategory values (seqPlaceCategory.nextVal, '빵집', 'default');
insert into tblPlaceCategory values (seqPlaceCategory.nextVal, '술집', 'default');

 

 

■ 소스 코드

  • Map.java
package com.test.map;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/map.do")
public class Map extends HttpServlet {

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

		//Map.java
		
		MapDAO dao = new MapDAO();
		
		List<PlaceDTO> mlist = dao.mlist();		//장소
		List<CategoryDTO> clist = dao.clist();  //카테고리
		
		setIcons(mlist);
		
		req.setAttribute("mlist", mlist);
		req.setAttribute("clist", clist);

		RequestDispatcher dispatcher = req.getRequestDispatcher("/WEB-INF/views/map.jsp");
		dispatcher.forward(req, resp);
	}
	
	private void setIcons(List<PlaceDTO> mlist) {
		
		for (PlaceDTO dto : mlist) {
			
			if (dto.getCesq().equals("1")) {
				dto.setCicon("restaurant_menu");
			} else if (dto.getCesq().equals("2")) {
				dto.setCicon("local_cafe");
			} else if (dto.getCesq().equals("3")) {
				dto.setCicon("fitness_center");
			} else if (dto.getCesq().equals("4")) {
				dto.setCicon("breakfast_dining");
			} else if (dto.getCesq().equals("5")) {
				dto.setCicon("liquor");
			}
			
		}
	}

	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		
		req.setCharacterEncoding("UTF-8");
		
		String name = req.getParameter("name");
		String category = req.getParameter("category");
		String lat = req.getParameter("lat");
		String lng = req.getParameter("lng");
		
		PlaceDTO dto = new PlaceDTO();
		
		dto.setName(name);
		dto.setCesq(category);
		dto.setLat(lat);
		dto.setLng(lng);
		
		
		MapDAO dao = new MapDAO();
		
		int result = dao.add(dto);
		
		if (result == 1) {
			resp.sendRedirect("/map/map.do");
		} else {
			PrintWriter writer = resp.getWriter();
			writer.print("<script>alert('failed');history.back();</scirpt>");
			writer.close();
		}
		
	}

}

 

  • PlaceDTO.java
package com.test.map;

import lombok.Data;

@Data
public class PlaceDTO {
	private String seq;
	private String name;
	private String lat;
	private String lng;
	
	private String cesq;
	private String cicon;
}

 

  • CategoryDTO.java
package com.test.map;

import lombok.Data;

@Data
public class CategoryDTO {
	private String seq;
	private String name;
	private String marker;
}

 

  • MapDAO.java
package com.test.map;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

import com.test.my.DBUtil;

public class MapDAO {

	private Connection conn;
	private Statement stat;
	private PreparedStatement pstat;
	private ResultSet rs;
	
	public MapDAO() {
		this.conn = DBUtil.open();
	}

	public List<CategoryDTO> clist() {
		
		try {
			
			String sql = "select * from tblPlaceCategory order by name asc";
			
			stat = conn.createStatement();
			rs = stat.executeQuery(sql);
			
			List<CategoryDTO> clist = new ArrayList<CategoryDTO>();
			
			while (rs.next()) {
				
				CategoryDTO dto = new CategoryDTO();
				
				dto.setSeq(rs.getString("seq"));
				dto.setName(rs.getString("name"));
				dto.setMarker(rs.getString("marker"));
				
				clist.add(dto);
				
			}
			
			return clist;
			
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		
		return null;
	}

	public int add(PlaceDTO dto) {
		
		try {
			
			String sql = "insert into tblPlace (seq, name, lat, lng, cseq) values (seqPlace.nextVal, ?, ?, ?, ?)";
			
			pstat = conn.prepareStatement(sql);
			pstat.setString(1, dto.getName());
			pstat.setString(2, dto.getLat());
			pstat.setString(3, dto.getLng());
			pstat.setString(4, dto.getCesq());
			
			return pstat.executeUpdate();
			
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		return 0;
	}

	public List<PlaceDTO> mlist() {
		
		try {
			
			String sql = "select * from tblPlace order by name asc";
			
			stat = conn.createStatement();
			rs = stat.executeQuery(sql);
			
			List<PlaceDTO> mlist = new ArrayList<PlaceDTO>();
			
			while (rs.next()) {
				
				PlaceDTO dto = new PlaceDTO();
				
				dto.setSeq(rs.getString("seq"));
				dto.setName(rs.getString("name"));
				dto.setLat(rs.getString("lat"));
				dto.setLng(rs.getString("lng"));
				dto.setCesq(rs.getString("cseq"));
				
				mlist.add(dto);
				
			}
			
			return mlist;
			
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		return null;
	}
	
	
	
}

 

  • map.jsp
<%@ 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>
<meta charset="UTF-8">
<title>Insert title here</title>
<link rel="stylesheet" href="https://me2.do/5BvBFJ57">
<style>

	#main {
		display: flex;
		align-items: flex-start;
	}
	
	#map {
		border: 1px solid #CCC;
		width: 550px;
		height: 400px;
	}
	
	#list {
		width: 200px;
		margin-top: 0;
	}
	
	#add {
	
	}

</style>
</head>
<body>

	<h1>Map <small>Place</small></h1>
	
	<div id="main">
      <div id="map">지도</div>
      <table id="list">
      	<c:forEach items="${mlist}" var="dto">
         <tr>
            <td style="display: flex; cursor:pointer;" data-lat="${dto.lat}" data-lng="${dto.lng}">
            	<span class="material-symbols-outlined">${dto.cicon}</span>
            	<div style="margin-top: 3px; margin-left:5px;">${dto.name}</div>
            </td>
         </tr>
         </c:forEach>
      </table>
   </div>
	
	<hr>
	
	<form method="POST" action="/map/map.do">
		<table id="add" class="vertical">
			<tr>
				<th>장소명</th>
				<td><input type="text" name="name" id="name" class="long"></td>
			</tr>
			<tr>
				<th>카테고리</th>
				<td>
					<select name="category" id="category">
					<c:forEach items="${clist}" var="cdto">
						<option value="${cdto.seq}">${cdto.name}</option>
					</c:forEach>
					</select>
				</td>
			</tr>
			<tr>
				<th>위치</th>
				<td><div id="position"></div></td>
			</tr>
		</table>
	
	<div>
		<input type="submit" value="등록하기" id="btn">
	</div>

	<input type="hidden" name="lat" id="lat">
	<input type="hidden" name="lng" id="lng">
	</form>
<script type="text/javascript" src="//dapi.kakao.com/v2/maps/sdk.js?appkey=7b34a8317f5befe832f9eefe047ae818"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.4/jquery.min.js"></script>
<script>

	var container = document.getElementById('map'); //지도를 담을 영역의 DOM 레퍼런스
	
	var options = { //지도를 생성할 때 필요한 기본 옵션
		center: new kakao.maps.LatLng(37.4993, 127.0331), //지도의 중심좌표.
		level: 3 //지도의 레벨(확대, 축소 정도)
	};
	
	var map = new kakao.maps.Map(container, options); //지도 생성 및 객체 리턴	
	
	let m = null;
	
	kakao.maps.event.addListener(map, 'click', function(event) {
		
		if (m != null){
			m.setMap(null);
		}
		
		$('#position').text(event.latLng);
		
		$('#lat').val(event.latLng.getLat());
		$('#lng').val(event.latLng.getLng());
		
		m = new kakao.maps.Marker({
			position: event.latLng
		});
		
		m.setMap(map);
		
	});
	
	$('#list td').click(function() {
		
		//alert($(this).data('lat'));
		
		if (m != null){
			m.setMap(null);
		}
		
		let p = new kakao.maps.LatLng($(this).data('lat'), $(this).data('lng'));
		
		m = new kakao.maps.Marker({
			position: p
		});
		
		m.setMap(map);
		
		map.panTo(p);
		
		$('#list td').css('background-color', 'transparent');
		$(this).css('background-color', 'gold');
		
	});

</script>
</body>
</html>

 

 

■ 실행 결과

실행 결과

  • 마커를 튜닝

  • 모두 보기 기능 추가

모두보기

 

  • 카운트 하여, 마커가 찍히는 색상 표시

현재 지도에 찍히는 마커가 존재하면, count 및 색상

728x90
저작자표시 비영리 변경금지 (새창열림)

'Server' 카테고리의 다른 글

게시판 개발 STEP 2 - Board  (0) 2023.05.31
게시판 개발 STEP 1 - Ajax, Json, Oracle, JDBC etc..  (0) 2023.05.31
AJAX STEP 10 - 게시판 목록 보기  (0) 2023.05.18
AJAX STEP 9 - 상품 목록 페이지  (0) 2023.05.17
AJAX STEP 8 - 일기장 AJAX  (0) 2023.05.17
'Server' 카테고리의 다른 글
  • 게시판 개발 STEP 2 - Board
  • 게시판 개발 STEP 1 - Ajax, Json, Oracle, JDBC etc..
  • AJAX STEP 10 - 게시판 목록 보기
  • AJAX STEP 9 - 상품 목록 페이지
IT의 큰손
IT의 큰손
IT계의 큰손이 되고 싶은 개린이의 Log 일지
Developer Story HouseIT계의 큰손이 되고 싶은 개린이의 Log 일지
IT의 큰손
Developer Story House
IT의 큰손
전체
오늘
어제
  • 분류 전체보기 (457)
    • 정보처리기사 필기 (18)
    • 정보처리기사 실기 (12)
    • 정보처리기사 통합 QUIZ (12)
    • 빅데이터 (11)
    • 안드로이드 (11)
    • 웹페이지 (108)
    • 자바 (49)
    • SQLD (3)
    • 백준 알고리즘 (76)
    • 데이터베이스 (41)
    • 깃허브 (2)
    • Library (14)
    • Server (31)
    • 크롤링&스크래핑 (3)
    • Spring (23)
    • Vue.js (13)
    • React (27)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

  • Developer Stroy House

인기 글

태그

  • css
  • 웹개발자
  • jsp
  • 백준
  • 코딩테스트
  • 개발자
  • html
  • React
  • 자바
  • DBA
  • 웹페이지
  • IT자격증공부
  • 정보처리기사
  • 알고리즘
  • jquery
  • IT개발자
  • 정보처리기사필기
  • it
  • java
  • 백엔드
  • ajax
  • 웹개발
  • JavaScript
  • 정보보안전문가
  • 프론트엔드
  • 개발블로그
  • 데이터베이스
  • 앱개발자
  • DB
  • IT자격증

최근 댓글

최근 글

Designed By hELLO
IT의 큰손
AJAX STEP 11 - Map
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.