ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • ์นด์นด์˜ค ์ง€๋„ API๋กœ ์„œ๋ธ”๋ฆฟ&JSP ๊ฒŒ์‹œํŒ ๊ธ€์“ฐ๊ธฐ ๊ตฌํ˜„ํ•˜๊ธฐ
    JAVA 2020. 12. 4. 22:10

    ๐ŸŽฏ ์„œ๋ธ”๋ฆฟ&JSP ๊ฒŒ์‹œํŒ์— ์นด์นด์˜ค ์ง€๋„ API๋ฅผ ์‚ฌ์šฉํ•œ ๊ธ€์“ฐ๊ธฐ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•ด๋ณธ๋‹ค.

     

    ์นด์นด์˜ค ์ง€๋„ API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ง€๋„ ์ •๋ณด๋ฅผ ํฌํ•จํ•œ ๊ฒŒ์‹œ๊ธ€ ์ž‘์„ฑ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ง€๋„ ๊ฒ€์ƒ‰์ฐฝ์— ํ‚ค์›Œ๋“œ๋กœ ์œ„์น˜ ๊ฒ€์ƒ‰ ํ›„ ๋‚˜ํƒ€๋‚˜๋Š” ๋งˆ์ปค๋ฅผ ํด๋ฆญํ•˜๋ฉด ์ง€๋„ ์•„๋ž˜์— ์„ ํƒ๋œ ์ขŒํ‘œ๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. [์ €์žฅ]๋ฒ„ํŠผ ํด๋ฆญ์‹œ ๊ฒŒ์‹œ๋ฌผ ๋‚ด์šฉ๊ณผ ํ•จ๊ป˜ ์„ ํƒ๋œ ์ขŒํ‘œ๊ฐ€ DB์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.

     

     
    ๊ฐœ๋ฐœํ™˜๊ฒฝ: ์„œ๋ธ”๋ฆฟ&JSP, ๋งˆ์ด๋ฐ”ํ‹ฐ์Šค, ์˜ค๋ผํดDB
    ์ค€๋น„์‚ฌํ•ญ: ๊ฒŒ์‹œํŒ DB, ๊ฒŒ์‹œํŒ ๋ชจ๋ธ DTO
     
     

    1. ์นด์นด์˜ค App Key ๋ฐœ๊ธ‰๋ฐ›๊ธฐ

    ์นด์นด์˜ค ์ง€๋„ API ๊ฐ€์ด๋“œ ๐Ÿ‘‰ https://apis.map.kakao.com/web/guide/
    [์ค€๋น„ํ•˜๊ธฐ] ์˜์—ญ์„ ์ฝ์–ด๋ณด๊ณ  ์นด์นด์˜ค ๊ฐœ๋ฐœ์ž ์‚ฌ์ดํŠธ์—์„œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ App Key๋ฅผ ๋ฐœ๊ธ‰๋ฐ›์œผ์„ธ์š”.

     

     

    2. ์‚ฌ์šฉํ•  ์ง€๋„ ์ƒ˜ํ”Œ ์„ ํƒ

    ์ €๋Š” ํ‚ค์›Œ๋“œ ๊ฒ€์ƒ‰๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด [ํ‚ค์›Œ๋“œ๋กœ ์žฅ์†Œ๊ฒ€์ƒ‰ํ•˜๊ณ  ๋ชฉ๋ก์œผ๋กœ ํ‘œ์ถœํ•˜๊ธฐ] ์ƒ˜ํ”Œ์„ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.

    HTML์„ ํฌํ•จํ•œ ์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ๋ฅผ ์ฐธ๊ณ ํ–ˆ์Šต๋‹ˆ๋‹ค.

     

     

    3. JSPํŽ˜์ด์ง€์— API ์Šคํฌ๋ฆฝํŠธ ์‚ฝ์ž…

    freeBoardWrite.jsp:
    <script type="text/javascript" src="//dapi.kakao.com/v2/maps/sdk.js?appkey=๋ฐœ๊ธ‰๋ฐ›์€ APP KEY๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”&libraries=services"></script>
    ๋ฐœ๊ธ‰๋ฐ›์€ APP KEY๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š” ๋ถ€๋ถ„์— 1๋ฒˆ์—์„œ ๋ฐœ๊ธ‰๋ฐ›์€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์•ฑ ํ‚ค๋ฅผ ๋„ฃ์Šต๋‹ˆ๋‹ค.

     

     

    4. ์Šคํƒ€์ผํƒœ๊ทธ ์‚ฝ์ž…

    ์ƒ๋‹จ์— ์žˆ๋Š” ์•„์ฃผ ๊ธด ์Šคํƒ€์ผ ํƒœ๊ทธ๋ฅผ head์— ๋ณต๋ถ™ํ•ฉ๋‹ˆ๋‹ค.

     

     

    5. Body ์ž‘์„ฑ

    <%
    //๋กœ๊ทธ์ธ ์ •๋ณด ์–ป์–ด์˜ค๊ธฐ
    MemberDTO dto = (MemberDTO)session.getAttribute("login");
    String userid = dto.getUserID();
    %>
    ํšŒ์›๊ฐ€์ž…๊ณผ ๋กœ๊ทธ์ธ๊ธฐ๋Šฅ์ด ๊ตฌํ˜„๋˜์–ด์žˆ์„ ๊ฒฝ์šฐ ๋กœ๊ทธ์ธ ์ •๋ณด๋ฅผ DB์—์„œ ์–ป์–ด์˜ต๋‹ˆ๋‹ค. ์ž‘์„ฑ์ž๋ช…์œผ๋กœ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ์ž id๋ฅผ ํŒŒ์‹ฑํ–ˆ์Šต๋‹ˆ๋‹ค.

     

     

    ๊ฒŒ์‹œ๋ฌผ ์ž‘์„ฑ ํผ ๋งŒ๋“ค๊ธฐ

    <form action="FreeBoardWriteServlet" method="post">
    ํผ ๋ฐ์ดํ„ฐ ์ž…๋ ฅ ํ›„ submit ํ•˜๋ฉด FreeBoardWriteServlet์—์„œ ๊ฒŒ์‹œ๋ฌผ insert ๋กœ์ง์„ ์ฒ˜๋ฆฌํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
     
    <label for="title">์ œ๋ชฉ</label>
    <input type="text" name="title" id="title">
    ์ œ๋ชฉ์˜์—ญ์ž…๋‹ˆ๋‹ค. ์„œ๋ธ”๋ฆฟ์—์„œ ํŒŒ์‹ฑํ•  ์ˆ˜ ์žˆ๊ฒŒ name ์†์„ฑ์„ ๊ผญ ์ง€์ •ํ•ด์ค๋‹ˆ๋‹ค.
     
    <label for="userid">์ž‘์„ฑ์ž</label>
    <input type="text" name="userid" id="userid" value="<%= userid %>" readonly>
    ์ž‘์„ฑ์ž ์˜์—ญ์ž…๋‹ˆ๋‹ค. ์œ„์—์„œ ํŒŒ์‹ฑํ•œ userid๋ฅผ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์ง€์ •ํ•ด์ฃผ๊ณ  ์ˆ˜์ • ๋ถˆ๊ฐ€๋Šฅํ•˜๊ฒŒ readonly๋ฅผ ์ง€์ •ํ•ด์ค๋‹ˆ๋‹ค.
     
    <label for="content">๋‚ด์šฉ</label>
    <textarea name="content" id="content" cols="30" rows="7" style="padding:20px"></textarea>
    ๊ธ€๋‚ด์šฉ ์˜์—ญ์ž…๋‹ˆ๋‹ค.

     

     

    ์ง€๋„ ํ‘œ์‹œ ์˜์—ญ ๋งŒ๋“ค๊ธฐ

    ์ด ๋ถ€๋ถ„์„ ๋ณต๋ถ™ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฏธ ์ง€๋„์˜์—ญ์ด form ํƒœ๊ทธ ์•ˆ์— ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด ๋ถ€๋ถ„์— ์žˆ๋Š” form ํƒœ๊ทธ๋Š” ์ง€์šฐ๊ณ  ๊ฒ€์ƒ‰๋ฒ„ํŠผ์— ํด๋ฆญ์ด๋ฒคํŠธ ์†์„ฑ์„ ์ง€์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.
    <input type="button" id="searchBtn" onclick="searchPlaces()" value="๊ฒ€์ƒ‰">
    searchPlaces() ์ด ํ•จ์ˆ˜๋Š” ์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ์— ์žˆ๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค.

     

     

    ์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ ์ „์ฒด ์‚ฝ์ž…

    ์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ๋ฅผ ์ „์ฒด ๋ณต๋ถ™ํ•˜๊ณ  ํ•„์š”ํ•œ ๋ถ€๋ถ„์„ ์ˆ˜์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.
     
    for ( var i=0; i<places.length; i++ ) {
    ๋ฐ˜๋ชฉ๋ฌธ ๋Œ์•„๊ฐ€๊ณ  ์žˆ๋Š” ์ด ๋ถ€๋ถ„ ์‚ดํŽด๋ณด๊ธฐ

     

     

       Error !    

    ์ขŒํ‘œ ์ •๋ณด์™€ ์œ„์น˜์ด๋ฆ„์„ ๊ฐ€์ ธ์˜ค๊ธฐ ์œ„ํ•ด ๋งˆ์ปค์— ํด๋ฆญ์ด๋ฒคํŠธ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ธฐ๋กœ ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์ด ๋ถ€๋ถ„์—์„œ mouseover๋ฅผ ๋‹จ์ˆœํžˆ 'click'์œผ๋กœ ๋ฐ”๊พผ๋‹ค๊ณ  ์›ํ•˜๋Š” ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜ค์ง„ ์•Š์•˜์Šต๋‹ˆ๋‹ค.
     

    ๋ฐ˜๋ณต๋ฌธ ์•ˆ์— ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํด๋ฆญ ์ด๋ฒคํŠธ๋ฅผ ๊ฑธ์—ˆ์„ ๊ฒฝ์šฐ ๋งˆ์ง€๋ง‰ ๋งˆ์ปค์—๋งŒ ์ด๋ฒคํŠธ๊ฐ€ ๋“ฑ๋ก๋˜์–ด์„œ ๊ณ„์† ๋˜‘๊ฐ™์€ ์ขŒํ‘œ๋งŒ ์ฐ๊ณ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ฒ€์ƒ‰ํ•ด๋ณด๋‹ˆ ํด๋กœ์ € ํ˜•ํƒœ๊ฐ€ ํ•„์š”ํ–ˆ์Šต๋‹ˆ๋‹ค.

     

     

       Fix !   

    (function (marker, title) {
        kakao.maps.event.addListener(marker, 'click', (function(placePosition) {
        displayInfowindow(marker, title);
        return function() {
            // ์ขŒํ‘œ์ •๋ณด๋ฅผ ํŒŒ์‹ฑํ•˜๊ธฐ ์œ„ํ•ด hidden input์— ๊ฐ’ ์ง€์ •
            $("#latitude").val(placePosition.La);
            $("#longitude").val(placePosition.Ma);
            $("#placeName").val(title);
            // #result ์˜์—ญ์— ์ขŒํ‘œ์ •๋ณด ์ถœ๋ ฅ
            var resultDiv = document.getElementById('result');
            resultDiv.innerHTML = '์„ ํƒํ•˜์‹  ์œ„์น˜๋Š” ' +'"'+title+'"' +placePosition+' ์ž…๋‹ˆ๋‹ค';
        }
    })(placePosition));
    ์ด ์œ ์šฉํ•œ ๋Œ“๊ธ€ ๋•๋ถ„์— ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.
    ํ•ธ๋“ค๋Ÿฌ ํ•จ์ˆ˜๋Š” ์ขŒํ‘œ์ •๋ณด๊ฐ€ ๋‹ด๊ธด placePosition ๋ณ€์ˆ˜๋ฅผ ๋ฐ›์•„์˜ค๊ณ  ํ•จ์ˆ˜๋ฅผ ๋ฆฌํ„ดํ•ฉ๋‹ˆ๋‹ค.
    placePosition ๊ฐ์ฒด๋ฅผ ์ฝ˜์†”์— ์ฐ์–ด๋ณด๋‹ˆ La์™€ Ma๋กœ ๊ฒฝ๋„ ์œ„๋„ ์ •๋ณด๋ฅผ ๊ฐ–๊ณ ์žˆ์–ด์„œ ๊ทธ ๋ฐ์ดํ„ฐ๋ฅผ ์„œ๋ธ”๋ฆฟ์— ๋„˜๊ฒจ์ฃผ๊ธฐ ์œ„ํ•ด hidden input์˜ value๊ฐ’์œผ๋กœ ์ง€์ •ํ•ด์คฌ์Šต๋‹ˆ๋‹ค.
    ํด๋ฆญํ•œ ์œ„์น˜์ •๋ณด๋ฅผ div ์˜์—ญ์— innerHTML๋กœ ์ถœ๋ ฅ๊นŒ์ง€ ํ•˜๊ณ  ํด๋ฆญํ•ธ๋“ค๋Ÿฌ๋Š” ์ฆ‰์‹œํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.

     

     
    // ํ‚ค์›Œ๋“œ ๊ฒ€์ƒ‰์ฐฝ์—์„œ ์—”ํ„ฐ ์น  ๊ฒฝ์šฐ ํŽ˜์ด์ง€ ์ด๋™ ๋ฐฉ์ง€
    $("#keyword").on("keydown", () => {
        if (event.keyCode === 13) {
            event.preventDefault();
        }
    })
    ์ง€๋„ ๊ฒ€์ƒ‰์ฐฝ์—์„œ ์Šต๊ด€์ ์œผ๋กœ ์—”ํ„ฐ๋ฅผ ์ณค๋‹ค๊ฐ€ ํŽ˜์ด์ง€๊ฐ€ ์ „ํ™˜๋˜๋Š” ๊ฒฝ์šฐ๋ฅผ ๋ง‰๊ธฐ ์œ„ํ•ด ๊ฒ€์ƒ‰์ฐฝ์— ์ด๋ฒคํŠธ๋ฅผ ํ•˜๋‚˜ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด์ œ ์Šคํฌ๋ฆฝํŠธ ์•ˆ์—์„œ ์ˆ˜์ •ํ•  ๋ถ€๋ถ„์€ ๋๋‚ฌ์Šต๋‹ˆ๋‹ค.

     

    <input type="hidden" id="placeName" name="placeName" value="">
    <input type="hidden" id="latitude" name="latitude" value="">
    <input type="hidden" id="longitude" name="longitude" value="">
    <div id="result"></div>
    ์—ฌ์ „ํžˆ ํผ ์•ˆ์—์„œ ํ•„์š”ํ•œ ์š”์†Œ๋ฅผ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค. ์œ„์—์„œ selectํ–ˆ๋˜ hidden ์ธํ’‹๊ณผ ์œ„์น˜๊ฒฐ๊ณผ๋ฅผ ์ถœ๋ ฅํ•˜๋Š” div ์˜์—ญ์ž…๋‹ˆ๋‹ค.

     

    <input type="submit" value="์ €์žฅ">
    </form>
    ๋งˆ์ง€๋ง‰์œผ๋กœ submit ๋ฒ„ํŠผ๊นŒ์ง€ ๋งŒ๋“ค๊ณ  ํผ์ด ๋๋‚ฌ์Šต๋‹ˆ๋‹ค.
     
     

    6. 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 ์ฒ˜๋ฆฌ ํ›„ ๊ฒŒ์‹œํŒ ๋ชฉ๋ก์œผ๋กœ ํŽ˜์ด์ง€๋ฅผ ์ด๋™์‹œํ‚ต๋‹ˆ๋‹ค.

     

     

    7.  ๊ฒŒ์‹œ๊ธ€ ๋ฐ์ดํ„ฐ 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>

     

    DB์— ์ž˜ ๋“ค์–ด๊ฐ”๋‚˜์š”? ์ด์ œ ๋ชจ๋“  ๊ธ€์“ฐ๊ธฐ ๊ธฐ๋Šฅ์ด ๋๋‚ฌ์Šต๋‹ˆ๋‹ค ๐Ÿ‘

     

     
     

    ๐Ÿ˜œ NEXT : ์นด์นด์˜ค ์ง€๋„ API๋กœ ์„œ๋ธ”๋ฆฟ&JSP ๊ฒŒ์‹œ๋ฌผ ์ƒ์„ธ๋ณด๊ธฐ ๊ตฌํ˜„ํ•ด๋ณด๊ธฐ

    ๋ฐ˜์‘ํ˜•

    ๋Œ“๊ธ€

๊ฐœ๋ฐœ๊ณต๋ถ€