JSP

JSP(지도 API)_2024-10-01

앵보몬 2024. 10. 2. 11:06
728x90
반응형

카카오 지도 API를 사용하여 지도 정보를 포함한 게시글 작성 기능을 구현했습니다. 지도 검색창에 키워드로 위치 검색 후 나타나는 마커를 클릭하면 지도 아래에 선택된 좌표가 표시됩니다. [저장]버튼 클릭시 게시물 내용과 함께 선택된 좌표가 DB에 저장됩니다.

개발환경 : 서블릿&JSP, 마이바티스, 오라클DB
준비사항 : 게시판 DB, 게시판 모델 DTO

 

① 카카오 App Key 발급받기

카카오 지도 API 가이드 👉 https://apis.map.kakao.com/web/guide/

 

② 사용할 지도 샘플 선택

https://apis.map.kakao.com/web/sample/keywordList/

 

③ JSP페이지에 API 스크립트 삽입

<script type="text/javascript" src="//dapi.kakao.com/v2/maps/sdk.js?appkey=발급받은 APP KEY를 사용하세요&libraries=services"></script>

발급받은 APP KEY를 사용하세요 부분에 1번에서 발급받은 자바스크립트 앱 키를 넣습니다.

 

④ 스타일태그 삽입 : 상단에 있는 아주 긴 스타일 태그를 head에 복붙합니다.

⑤ Body 작성

<%
//로그인 정보 얻어오기
MemberDTO dto = (MemberDTO)session.getAttribute("login");
String userid = dto.getUserID();
%>

회원가입과 로그인기능이 구현되어있을 경우 로그인 정보를 DB에서 얻어옵니다. 작성자명으로 사용하기 위해 사용자 id를 파싱했습니다.

 

⑥ Servlet 작성

FreeBoardWriteServlet

// 데이더 파싱
String title = request.getParameter("title");
String userid = request.getParameter("userid");
String content = request.getParameter("content");
String placeLa = request.getParameter("latitude");
String placeMa = request.getParameter("longitude");
String placeName = request.getParameter("placeName");

폼에서 넘어온 데이터를 파싱합니다.

 

// 게시판DTO 타입으로 객체생성
FreeBoardDTO fDTO = new FreeBoardDTO(0, title, userid, content,null, 0, placeName, placeLa, placeMa);

미리 만들어둔 게시판 DTO 타입으로 생성자 형식에 맞게 파싱한 데이터를 세팅해줍니다.

 

// service 객체 생성 후 db insert 처리
FreeBoardService service = new FreeBoardService();
service.insert(fDTO);

서비스 객체를 생성하고 세팅된 게시판 dto를 insert로직으로 넘겨줍니다.

 

// 게시판 목록으로 이동
response.sendRedirect("FreeBoardListServlet");

insert 처리 후 게시판 목록으로 페이지를 이동시킵니다.

 

⑦ 게시글 데이터 insert

// service
public void insert(FreeBoardDTO dto) {
SqlSession session = OracleSqlSessionFactory.getSession();
  FreeBoardDAO dao = new FreeBoardDAO();
  try {
    dao.insert(session, dto);
    session.commit();
  } catch (Exception e) {
    e.printStackTrace();
  } finally {
    session.close();
  }
}

// dao
public void insert(SqlSession session, FreeBoardDTO dto) {
    session.insert("FreeBoardMapper.insert", dto);
}

// mybatis Mapper
<insert id="insert" parameterType="FreeBoardDTO">
    insert into freeBoard(num, title, userid, content, writeday,
            readcnt, placeName, placeLa, placeMa)
    values(freeBoard_seq.nextval, #{title}, #{userid}, #{content}, sysdate,
            0, #{placeName}, #{placeLa}, #{placeMa})
</insert>

 

Map.zip
0.01MB

 

webmap.html

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>지도 생성하기</title>
    
</head>
<body>
<!-- 지도를 표시할 div 입니다 -->
<div id="map" style="width:100%;height:350px;"></div>

<script type="text/javascript" src="//dapi.kakao.com/v2/maps/sdk.js?appkey=45436d685fe287550099139230ab9fa3"></script>
<script>
var mapContainer = document.getElementById('map'), // 지도를 표시할 div 
    mapOption = { 
        center: new kakao.maps.LatLng(33.450701, 126.570667), // 지도의 중심좌표
        level: 3 // 지도의 확대 레벨
    };

// 지도를 표시할 div와  지도 옵션으로  지도를 생성합니다
var map = new kakao.maps.Map(mapContainer, mapOption); 
</script>
</body>
</html><!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>지도 생성하기</title>
    
</head>
<body>
<!-- 지도를 표시할 div 입니다 -->
<div id="map" style="width:100%;height:350px;"></div>

<script type="text/javascript" src="//dapi.kakao.com/v2/maps/sdk.js?appkey=45436d685fe287550099139230ab9fa3"></script>
<script>
var mapContainer = document.getElementById('map'), // 지도를 표시할 div 
    mapOption = { 
        center: new kakao.maps.LatLng(37.798704, 128.915402), // 지도의 중심좌표
        level: 10 // 지도의 확대 레벨
    };

// 지도를 표시할 div와  지도 옵션으로  지도를 생성합니다
var map = new kakao.maps.Map(mapContainer, mapOption); 
</script>
</body>
</html>

 

webmap1.html

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>주소로 장소 표시하기</title>
    
</head>
<body>
<p style="margin-top:-12px">
    <em class="link">
        <a href="javascript:void(0);" onclick="window.open('http://fiy.daum.net/fiy/map/CsGeneral.daum', '_blank', 'width=981, height=650')">
            혹시 주소 결과가 잘못 나오는 경우에는 여기에 제보해주세요.
        </a>
    </em>
</p>
<div id="map" style="width:100%;height:350px;"></div>

<script type="text/javascript" src="//dapi.kakao.com/v2/maps/sdk.js?appkey=45436d685fe287550099139230ab9fa3&libraries=services"></script>
<script>
var mapContainer = document.getElementById('map'), // 지도를 표시할 div 
    mapOption = {
        center: new kakao.maps.LatLng(33.450701, 126.570667), // 지도의 중심좌표
        level: 3 // 지도의 확대 레벨
    };  

// 지도를 생성합니다    
var map = new kakao.maps.Map(mapContainer, mapOption); 

// 주소-좌표 변환 객체를 생성합니다
var geocoder = new kakao.maps.services.Geocoder();

// 주소로 좌표를 검색합니다
geocoder.addressSearch('강원특별자치도 강릉시 해안로406번길 2', function(result, status) {

    // 정상적으로 검색이 완료됐으면 
     if (status === kakao.maps.services.Status.OK) {

        var coords = new kakao.maps.LatLng(result[0].y, result[0].x);

        // 결과값으로 받은 위치를 마커로 표시합니다
        var marker = new kakao.maps.Marker({
            map: map,
            position: coords
        });

        // 인포윈도우로 장소에 대한 설명을 표시합니다
        var infowindow = new kakao.maps.InfoWindow({
            content: '<div style="width:150px;text-align:center;padding:6px 0;">우리회사</div>'
        });
        infowindow.open(map, marker);

        // 지도의 중심을 결과값으로 받은 위치로 이동시킵니다
        map.setCenter(coords);
    } 
});    
</script>
</body>
</html>

 

webmap2.html

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>키워드로 장소검색하기</title>
    
</head>
<body>
<div id="map" style="width:100%;height:350px;"></div>

<script type="text/javascript" src="//dapi.kakao.com/v2/maps/sdk.js?appkey=45436d685fe287550099139230ab9fa3&libraries=services"></script>
<input type = "text" id = "address" placeholder="주소를 입력하세요">
<button onclick="searchAddress()">검색</button>

<script>
// 마커를 클릭하면 장소명을 표출할 인포윈도우 입니다
var infowindow = new kakao.maps.InfoWindow({zIndex:1});

var mapContainer = document.getElementById('map'), // 지도를 표시할 div 
    mapOption = {
        center: new kakao.maps.LatLng(35.172320, 126.858133), // 지도의 중심좌표
        level: 3 // 지도의 확대 레벨
    };  

// 지도를 생성합니다    
var map = new kakao.maps.Map(mapContainer, mapOption); 

// 장소 검색 객체를 생성합니다
var ps = new kakao.maps.services.Places(); 

// 키워드로 장소를 검색합니다
ps.keywordSearch('광주광산구 맛집', placesSearchCB); 

// 키워드 검색 완료 시 호출되는 콜백함수 입니다
function placesSearchCB (data, status, pagination) {
    if (status === kakao.maps.services.Status.OK) {

        // 검색된 장소 위치를 기준으로 지도 범위를 재설정하기위해
        // LatLngBounds 객체에 좌표를 추가합니다
        var bounds = new kakao.maps.LatLngBounds();

        for (var i=0; i<data.length; i++) {
            displayMarker(data[i]);    
            bounds.extend(new kakao.maps.LatLng(data[i].y, data[i].x));
        }       

        // 검색된 장소 위치를 기준으로 지도 범위를 재설정합니다
        map.setBounds(bounds);
    } 
}

// 지도에 마커를 표시하는 함수입니다
function displayMarker(place) {
    
    // 마커를 생성하고 지도에 표시합니다
    var marker = new kakao.maps.Marker({
        map: map,
        position: new kakao.maps.LatLng(place.y, place.x) 
    });

    // 마커에 클릭이벤트를 등록합니다
    kakao.maps.event.addListener(marker, 'click', function() {
        // 마커를 클릭하면 장소명이 인포윈도우에 표출됩니다
        infowindow.setContent('<div style="padding:5px;font-size:12px;">' + place.place_name + '</div>');
        infowindow.open(map, marker);
    });
}	
	function searchAddress() {
		// 검색어 입력 필드값 가져오기
		var address = document.getElementById('address').value;
		// 키워드로 장소를 검색합니다
		ps.keywordSearch('address', placesSearchCB); 
	

}
</script>
</body>
</html>
728x90
반응형