<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>IT 개발 일지</title>
    <link>https://bin4399.tistory.com/</link>
    <description>일생의 개발 기록 저장소</description>
    <language>ko</language>
    <pubDate>Sat, 25 Jul 2026 14:29:29 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>mw41817</managingEditor>
    <image>
      <title>IT 개발 일지</title>
      <url>https://tistory1.daumcdn.net/tistory/7375840/attach/1a53968f0c9748edb204cd6470fedb28</url>
      <link>https://bin4399.tistory.com</link>
    </image>
    <item>
      <title>TinyMCE - 글쓰기 서식 API</title>
      <link>https://bin4399.tistory.com/515</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1565&quot; data-origin-height=&quot;533&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bqZMyJ/btsMy2xMiQx/rThdie0m6G0RykLG6pkkE1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bqZMyJ/btsMy2xMiQx/rThdie0m6G0RykLG6pkkE1/img.png&quot; data-alt=&quot;example&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bqZMyJ/btsMy2xMiQx/rThdie0m6G0RykLG6pkkE1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbqZMyJ%2FbtsMy2xMiQx%2FrThdie0m6G0RykLG6pkkE1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1565&quot; height=&quot;533&quot; data-origin-width=&quot;1565&quot; data-origin-height=&quot;533&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;example&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1887&quot; data-origin-height=&quot;899&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bhTnhx/btsMzgbGONS/s6zPakJTn4csL9Gl83kGPK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bhTnhx/btsMzgbGONS/s6zPakJTn4csL9Gl83kGPK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bhTnhx/btsMzgbGONS/s6zPakJTn4csL9Gl83kGPK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbhTnhx%2FbtsMzgbGONS%2Fs6zPakJTn4csL9Gl83kGPK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1887&quot; height=&quot;899&quot; data-origin-width=&quot;1887&quot; data-origin-height=&quot;899&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1829&quot; data-origin-height=&quot;468&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/75U0f/btsMBUxQlGx/qKHBN0fi3488BziBE5vlck/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/75U0f/btsMBUxQlGx/qKHBN0fi3488BziBE5vlck/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/75U0f/btsMBUxQlGx/qKHBN0fi3488BziBE5vlck/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F75U0f%2FbtsMBUxQlGx%2FqKHBN0fi3488BziBE5vlck%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1829&quot; height=&quot;468&quot; data-origin-width=&quot;1829&quot; data-origin-height=&quot;468&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1879&quot; data-origin-height=&quot;893&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kUgzs/btsMAX9SVom/3FGg68raAlslutG3TH69h0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kUgzs/btsMAX9SVom/3FGg68raAlslutG3TH69h0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kUgzs/btsMAX9SVom/3FGg68raAlslutG3TH69h0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkUgzs%2FbtsMAX9SVom%2F3FGg68raAlslutG3TH69h0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1879&quot; height=&quot;893&quot; data-origin-width=&quot;1879&quot; data-origin-height=&quot;893&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1854&quot; data-origin-height=&quot;885&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lfAXq/btsMBzgoPMi/xz8ijkVzz07gzLjIaRkgok/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lfAXq/btsMBzgoPMi/xz8ijkVzz07gzLjIaRkgok/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lfAXq/btsMBzgoPMi/xz8ijkVzz07gzLjIaRkgok/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlfAXq%2FbtsMBzgoPMi%2Fxz8ijkVzz07gzLjIaRkgok%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1854&quot; height=&quot;885&quot; data-origin-width=&quot;1854&quot; data-origin-height=&quot;885&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1879&quot; data-origin-height=&quot;916&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cvZTzV/btsMyIfdJJl/OR94Stve78kgwx7hJ9eJlk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cvZTzV/btsMyIfdJJl/OR94Stve78kgwx7hJ9eJlk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cvZTzV/btsMyIfdJJl/OR94Stve78kgwx7hJ9eJlk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcvZTzV%2FbtsMyIfdJJl%2FOR94Stve78kgwx7hJ9eJlk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1879&quot; height=&quot;916&quot; data-origin-width=&quot;1879&quot; data-origin-height=&quot;916&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 코드를 삽입하여 사용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;API 키를 발급받아야 사용 가능함&lt;/p&gt;</description>
      <category>기타/유용한 사이트</category>
      <author>mw41817</author>
      <guid isPermaLink="true">https://bin4399.tistory.com/515</guid>
      <comments>https://bin4399.tistory.com/515#entry515comment</comments>
      <pubDate>Tue, 4 Mar 2025 10:52:13 +0900</pubDate>
    </item>
    <item>
      <title>SQL 저장 프로시저</title>
      <link>https://bin4399.tistory.com/513</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1272&quot; data-origin-height=&quot;588&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dGVMuf/btsMvzCnxwN/VDKol1B00lM3h4vatrsXr0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dGVMuf/btsMvzCnxwN/VDKol1B00lM3h4vatrsXr0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dGVMuf/btsMvzCnxwN/VDKol1B00lM3h4vatrsXr0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdGVMuf%2FbtsMvzCnxwN%2FVDKol1B00lM3h4vatrsXr0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1272&quot; height=&quot;588&quot; data-origin-width=&quot;1272&quot; data-origin-height=&quot;588&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1740535453895&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;-- 1. 기존 저장 프로시저 제거
DROP PROCEDURE IF EXISTS insert_boards;

-- 2. 프로시저 생성
CREATE PROCEDURE insert_boards()
BEGIN
    DECLARE i INT DEFAULT 1;

    -- 1000 * 3 == 3,000건의 데이터 삽입
    WHILE i &amp;lt;= 1000 DO
            INSERT INTO boards (title, userid, contents)
                VALUES ('', '', '');
            INSERT INTO boards (title, userid, contents)
                VALUES ('', '', '');
            INSERT INTO boards (title, userid, contents)
                VALUES ('', '', '');
            SET i = i + 1;
        END WHILE;
END;

-- 3. 프로시저 호출
CALL insert_boards();&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용하고 있는 DB, 테이블에 따라 구문을 변경해서 사용하면 됨&lt;/p&gt;</description>
      <category>기타</category>
      <author>mw41817</author>
      <guid isPermaLink="true">https://bin4399.tistory.com/513</guid>
      <comments>https://bin4399.tistory.com/513#entry513comment</comments>
      <pubDate>Wed, 26 Feb 2025 11:07:47 +0900</pubDate>
    </item>
    <item>
      <title>Google Trands(구글 트렌드)</title>
      <link>https://bin4399.tistory.com/510</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1826&quot; data-origin-height=&quot;851&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bnvJyP/btsMv4gls3F/hVERn7P3E8hdFeNOjiqXN0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bnvJyP/btsMv4gls3F/hVERn7P3E8hdFeNOjiqXN0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bnvJyP/btsMv4gls3F/hVERn7P3E8hdFeNOjiqXN0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbnvJyP%2FbtsMv4gls3F%2FhVERn7P3E8hdFeNOjiqXN0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1826&quot; height=&quot;851&quot; data-origin-width=&quot;1826&quot; data-origin-height=&quot;851&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1820&quot; data-origin-height=&quot;861&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/JqDEs/btsMtrdtGiG/WK5WeO9Re2kEONoHxjwrj1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/JqDEs/btsMtrdtGiG/WK5WeO9Re2kEONoHxjwrj1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/JqDEs/btsMtrdtGiG/WK5WeO9Re2kEONoHxjwrj1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJqDEs%2FbtsMtrdtGiG%2FWK5WeO9Re2kEONoHxjwrj1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1820&quot; height=&quot;861&quot; data-origin-width=&quot;1820&quot; data-origin-height=&quot;861&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구글에서 제공하는 검색 순위 통계 사이트&lt;/p&gt;</description>
      <category>기타/유용한 사이트</category>
      <author>mw41817</author>
      <guid isPermaLink="true">https://bin4399.tistory.com/510</guid>
      <comments>https://bin4399.tistory.com/510#entry510comment</comments>
      <pubDate>Mon, 24 Feb 2025 19:17:04 +0900</pubDate>
    </item>
    <item>
      <title>Font Awesome - 아이콘 사이트</title>
      <link>https://bin4399.tistory.com/509</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1900&quot; data-origin-height=&quot;917&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zuBeb/btsMqycP2Gj/jYj7NryvIjuBHqqyDBPjWK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zuBeb/btsMqycP2Gj/jYj7NryvIjuBHqqyDBPjWK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zuBeb/btsMqycP2Gj/jYj7NryvIjuBHqqyDBPjWK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzuBeb%2FbtsMqycP2Gj%2FjYj7NryvIjuBHqqyDBPjWK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1900&quot; height=&quot;917&quot; data-origin-width=&quot;1900&quot; data-origin-height=&quot;917&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://fontawesome.com/icons&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://fontawesome.com/icons&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1740122863510&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Font Awesome&quot; data-og-description=&quot;The internet's icon library + toolkit. Used by millions of designers, devs, &amp;amp; content creators. Open-source. Always free. Always awesome.&quot; data-og-host=&quot;fontawesome.com&quot; data-og-source-url=&quot;https://fontawesome.com/icons&quot; data-og-url=&quot;https://fontawesome.com&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/FqVMP/hyYfD0rfm8/eD5z0kY7W9lWL4uTkB4dw0/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/Fwxc7/hyYjqFbHwL/kXjhoUCZLnge2IjQqXpwIk/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://fontawesome.com/icons&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://fontawesome.com/icons&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/FqVMP/hyYfD0rfm8/eD5z0kY7W9lWL4uTkB4dw0/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/Fwxc7/hyYjqFbHwL/kXjhoUCZLnge2IjQqXpwIk/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Font Awesome&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;The internet's icon library + toolkit. Used by millions of designers, devs, &amp;amp; content creators. Open-source. Always free. Always awesome.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;fontawesome.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;HTML 코드를 이용하여 사용 가능함&lt;/p&gt;</description>
      <category>기타/유용한 사이트</category>
      <author>mw41817</author>
      <guid isPermaLink="true">https://bin4399.tistory.com/509</guid>
      <comments>https://bin4399.tistory.com/509#entry509comment</comments>
      <pubDate>Fri, 21 Feb 2025 16:26:52 +0900</pubDate>
    </item>
    <item>
      <title>Spring Boot_01</title>
      <link>https://bin4399.tistory.com/503</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;2025-02-06&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1040&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d324Kj/btsMaAfFMTv/VatlEjXeg6ylVKN7pP9HBk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d324Kj/btsMaAfFMTv/VatlEjXeg6ylVKN7pP9HBk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d324Kj/btsMaAfFMTv/VatlEjXeg6ylVKN7pP9HBk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd324Kj%2FbtsMaAfFMTv%2FVatlEjXeg6ylVKN7pP9HBk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1920&quot; height=&quot;1040&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1040&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1040&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/RWJ57/btsMagIysIY/Qhab1uVmloiuUvUCsIZOr1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/RWJ57/btsMagIysIY/Qhab1uVmloiuUvUCsIZOr1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/RWJ57/btsMagIysIY/Qhab1uVmloiuUvUCsIZOr1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FRWJ57%2FbtsMagIysIY%2FQhab1uVmloiuUvUCsIZOr1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1920&quot; height=&quot;1040&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1040&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1040&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/VRypn/btsL8l5TEVX/pxsTE4O2EFs670Pz8MTVD0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/VRypn/btsL8l5TEVX/pxsTE4O2EFs670Pz8MTVD0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/VRypn/btsL8l5TEVX/pxsTE4O2EFs670Pz8MTVD0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FVRypn%2FbtsL8l5TEVX%2FpxsTE4O2EFs670Pz8MTVD0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1920&quot; height=&quot;1040&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1040&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1738834691588&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;plugins {
	id 'java'
	id 'org.springframework.boot' version '3.4.2'
	id 'io.spring.dependency-management' version '1.1.7'
}

group = 'com.example'
version = '0.0.1-SNAPSHOT'

java {
	toolchain {
		languageVersion = JavaLanguageVersion.of(17)
	}
}

repositories {
	mavenCentral()
}

dependencies {
	implementation 'org.springframework.boot:spring-boot-starter-web'
	testImplementation 'org.springframework.boot:spring-boot-starter-test'
	testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
}

tasks.named('test') {
	useJUnitPlatform()
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1738834702422&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.example.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class HelloController {

	@RequestMapping(&quot;/&quot;)
	public String index() {
		return &quot;index&quot;;
	}
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1738834708652&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
&amp;lt;title&amp;gt;Insert title here&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;

	&amp;lt;h2&amp;gt;방가방가&amp;lt;/h2&amp;gt;

&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Spring, Boot/기초 내용 정리</category>
      <author>mw41817</author>
      <guid isPermaLink="true">https://bin4399.tistory.com/503</guid>
      <comments>https://bin4399.tistory.com/503#entry503comment</comments>
      <pubDate>Thu, 6 Feb 2025 18:38:32 +0900</pubDate>
    </item>
    <item>
      <title>Spring Boot_00</title>
      <link>https://bin4399.tistory.com/502</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;2025-02-06&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1040&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bZRkqF/btsL88ED7jD/GG2Ro4k1bzIGfPm8RhOoP1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bZRkqF/btsL88ED7jD/GG2Ro4k1bzIGfPm8RhOoP1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bZRkqF/btsL88ED7jD/GG2Ro4k1bzIGfPm8RhOoP1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbZRkqF%2FbtsL88ED7jD%2FGG2Ro4k1bzIGfPm8RhOoP1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1920&quot; height=&quot;1040&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1040&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1040&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bsCAzg/btsMaOkvdyT/LMXvuR9DXMZkXzqQTQioN1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bsCAzg/btsMaOkvdyT/LMXvuR9DXMZkXzqQTQioN1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bsCAzg/btsMaOkvdyT/LMXvuR9DXMZkXzqQTQioN1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbsCAzg%2FbtsMaOkvdyT%2FLMXvuR9DXMZkXzqQTQioN1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1920&quot; height=&quot;1040&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1040&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1738834520501&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 스프링 부트
  - 스프링의 서브 프로젝트라고도 함.
  - 스프링 MVC 로 진행하는 웹 애플리케이션용 프레임워크를 이용하다 보면
    필요한 라이브러리를 정확하게 설정하지 않으면 안 됨. 또한 기본적인 처리를
    구축하기 위해서는 MVC 의 각 코드를 작성해야 함.  
  - 기존의 스프링 개발 방식에서 불편했던 설정이나 버전 충돌 등의 불편했던
    점들을 없애는 대신에 빠르고 쉬운 서버 환경과 테스트 환경 등을 한 번에
    제공해서 훨씬 간편한 개발 환경을 만들어 줌.
    
# 스프링 부트의 장점
  1. 자동화된 라이브러리 관리.
     - 기존에도 Maven이나 Gradle을 이용해 라이브러리를 추가하는 작업 등을
       해 왔다면 스프링 부트에서는 이 작업을 더욱 간단히 처리할 수 있음.
  2. Spring Boot Auto Cofigure(자동 설정)
     - 스프링 부트에서 현재 프로젝트에 추가된 라이브러리를 이용해 자동으로 
       실행에 필요한 환경을 구성함. 예를 든다면 화면을 구성할 때 특정
       라이브러리를 사용하기로 결정을 했으면 이에 관련된 설정을 자동으로 
       구성해 주기 때문에 개발자는 별다른 설정이 없이도 개발할 수 있도록
       구성됨.
  3. 적당한 라이브러리 자동 설정과 XML이 없는 환경 구축
     - 현재 버전에 맞는 관련 라이브러리들을 자동으로 결정을 함. 이 기능 
       덕분에 라이브러리 버전이 높거나 낮아서 정상적으로 동작이 안 되는 
       상황을 겪을 필요가 없어짐. 이전처럼 XML을 아용해서 라이브러리를
       매번 설정하는 과정을 줄이고 개발자들이 순수한 개발에만 보다 집중할
       수 있는 환경을 제공함.
  4. 테스트 환경과 내장 Tomcat
     - 스프링 부트를 이용해서 생성하는 프로젝트는 기본적으로 Tomcat을
       내장하고 있음. 실행 역시 별도의 설정이 없이 main 메서드를 실행하는
       방식으로 서버를 구동하기 때문에 빠르게 결과를 볼 수 있는 환경을 제공함.
       
# 스프링 부트 구성 요소
  1. src/main/java 폴더
     - 자바 파일을 저장하는 공간임.
     * com.example.sample 하위 패키지
       ==&amp;gt; 스프링 부트의 컨트롤러, DTO, 서비스 등의 자바 파일이 이곳에 위치함.
  2. src/main/resources 폴더
     - 자바 파일을 제외한 HTML, CSS, 자바스트립트, 환경 파일 등을 저장하는 공간임.
     * 하위 디렉토리
       - template 디렉토리
         ==&amp;gt; 템플릿 파일을 저장함.
             템플릿 파일은 자바 코드를 삽입할 수 있는 HTML 형식의 파일로, 스프링 부트에서
             생성한 자바 객체를 HTML 형태로 출력할 수 있음.
             웹 페이지를 구성하는 HTML 파일을 저장함.
       - static 디렉토리
         ==&amp;gt; 스타일시트(css 파일), 자바스크립트(js 파일), 그리고 이미지 파일(jpg 파일,
             png 파일 등) 등을 저장함.
       - application.properties 파일
         ==&amp;gt; application.properties 파일은 프로젝트의 환경을 설정하는 파일임.
             환경 변수, 데이터베이스 등의 설정을 이 파일에 저장함.
  3. src/test/java 디렉토리
     - 프로젝트에서 작성한 파일을 테스트 하는 코드를 작성하는 공간
  4. build.gradle 파일
     - gradle이 사용하는 환경 파일임. 빌드 도구임.
     - maven과 같은 이전 세대의 단점을 보완하고 장점을 취합하여 만들었음.
     - 프로젝트에 필요한 플러그인과 라이브러리를 설치하기 위한 내용을 작성함.&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Spring, Boot/기초 내용 정리</category>
      <author>mw41817</author>
      <guid isPermaLink="true">https://bin4399.tistory.com/502</guid>
      <comments>https://bin4399.tistory.com/502#entry502comment</comments>
      <pubDate>Thu, 6 Feb 2025 18:35:23 +0900</pubDate>
    </item>
    <item>
      <title>Spring(AOP)_01</title>
      <link>https://bin4399.tistory.com/501</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;2025-02-05&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1040&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cE9phG/btsL885Kpvv/yGrwOs6bZbaaBT1MvSHOqK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cE9phG/btsL885Kpvv/yGrwOs6bZbaaBT1MvSHOqK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cE9phG/btsL885Kpvv/yGrwOs6bZbaaBT1MvSHOqK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcE9phG%2FbtsL885Kpvv%2FyGrwOs6bZbaaBT1MvSHOqK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1920&quot; height=&quot;1040&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1040&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1040&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mQael/btsL8THJIDj/mIYGXgqZABApu8S8yWdU20/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mQael/btsL8THJIDj/mIYGXgqZABApu8S8yWdU20/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mQael/btsL8THJIDj/mIYGXgqZABApu8S8yWdU20/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmQael%2FbtsL8THJIDj%2FmIYGXgqZABApu8S8yWdU20%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1920&quot; height=&quot;1040&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1040&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1040&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/XfHtv/btsL9PEBZcF/BZpjQmotQP1ebfekjXSs11/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/XfHtv/btsL9PEBZcF/BZpjQmotQP1ebfekjXSs11/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/XfHtv/btsL9PEBZcF/BZpjQmotQP1ebfekjXSs11/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FXfHtv%2FbtsL9PEBZcF%2FBZpjQmotQP1ebfekjXSs11%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1920&quot; height=&quot;1040&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1040&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1040&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/badKvH/btsL98DUCGF/G4SkTW5Yb31qlLeg7Q5ouk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/badKvH/btsL98DUCGF/G4SkTW5Yb31qlLeg7Q5ouk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/badKvH/btsL98DUCGF/G4SkTW5Yb31qlLeg7Q5ouk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbadKvH%2FbtsL98DUCGF%2FG4SkTW5Yb31qlLeg7Q5ouk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1920&quot; height=&quot;1040&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1040&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1040&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/RDki5/btsL8mKuQIP/UkJzVS0UatZlQm5f2wKqWK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/RDki5/btsL8mKuQIP/UkJzVS0UatZlQm5f2wKqWK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/RDki5/btsL8mKuQIP/UkJzVS0UatZlQm5f2wKqWK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FRDki5%2FbtsL8mKuQIP%2FUkJzVS0UatZlQm5f2wKqWK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1920&quot; height=&quot;1040&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1040&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1040&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lC9EW/btsL9ao0epA/doedaLkzk10X08oWg6eCVK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lC9EW/btsL9ao0epA/doedaLkzk10X08oWg6eCVK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lC9EW/btsL9ao0epA/doedaLkzk10X08oWg6eCVK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlC9EW%2FbtsL9ao0epA%2FdoedaLkzk10X08oWg6eCVK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1920&quot; height=&quot;1040&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1040&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1040&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ZAyRN/btsL960pzsb/yQyAywgNFuss6wJkzjBnQk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ZAyRN/btsL960pzsb/yQyAywgNFuss6wJkzjBnQk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ZAyRN/btsL960pzsb/yQyAywgNFuss6wJkzjBnQk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZAyRN%2FbtsL960pzsb%2FyQyAywgNFuss6wJkzjBnQk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1920&quot; height=&quot;1040&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1040&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1040&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b8OxhS/btsMaiM4pCJ/m17kFGkKCNdk4OtQOMYwpk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b8OxhS/btsMaiM4pCJ/m17kFGkKCNdk4OtQOMYwpk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b8OxhS/btsMaiM4pCJ/m17kFGkKCNdk4OtQOMYwpk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb8OxhS%2FbtsMaiM4pCJ%2Fm17kFGkKCNdk4OtQOMYwpk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1920&quot; height=&quot;1040&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1040&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1040&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dIvzo7/btsL97rwapX/E9YVxKDPQjXY0mqnfUt2V1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dIvzo7/btsL97rwapX/E9YVxKDPQjXY0mqnfUt2V1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dIvzo7/btsL97rwapX/E9YVxKDPQjXY0mqnfUt2V1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdIvzo7%2FbtsL97rwapX%2FE9YVxKDPQjXY0mqnfUt2V1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1920&quot; height=&quot;1040&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1040&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1738834210570&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;===[Before Logic]===
[사전 처리] 비지니스 로직 수행 전 동작
==&amp;gt; JDBC 기반으로 insert() 메서드 기능 처리 완료
insertBoard() 메서드에서 소요된 시간 &amp;gt;&amp;gt;&amp;gt; 254(ms)초
===[Before Logic]===
[사전 처리] 비지니스 로직 수행 전 동작
==&amp;gt; JDBC 기반으로 getBoardList() 메서드 기능 처리 완료
getBoardList() 메서드에서 소요된 시간 &amp;gt;&amp;gt;&amp;gt; 17(ms)초
[사후 처리] 비지니스 로직 수행 후 리턴 값 &amp;gt;&amp;gt;&amp;gt; [BoardDTO(seq=22, title=스프링 AOP 테스트, writer=관리자, content=스프링 AOP 테스트 중입니다..., regdate=2025-02-06 18:27:16, cnt=0), BoardDTO(seq=21, title=스프링 AOP 테스트, writer=관리자, content=스프링 AOP 테스트 중입니다..., regdate=2025-02-06 18:24:58, cnt=0), BoardDTO(seq=20, title=스프링 AOP 테스트, writer=관리자, content=스프링 AOP 테스트 중입니다..., regdate=2025-02-06 18:18:20, cnt=0), BoardDTO(seq=19, title=스프링 AOP 테스트, writer=관리자, content=스프링 AOP 테스트 중입니다..., regdate=2025-02-06 18:09:57, cnt=0), BoardDTO(seq=18, title=스프링 AOP 테스트, writer=관리자, content=스프링 AOP 테스트 중입니다..., regdate=2025-02-06 18:07:05, cnt=0), BoardDTO(seq=17, title=스프링 AOP 테스트, writer=관리자, content=스프링 AOP 테스트 중입니다..., regdate=2025-02-06 18:06:54, cnt=0), BoardDTO(seq=16, title=스프링 AOP 테스트, writer=관리자, content=스프링 AOP 테스트 중입니다..., regdate=2025-02-06 09:33:18, cnt=0), BoardDTO(seq=15, title=스프링 AOP 테스트, writer=관리자, content=스프링 AOP 테스트 중입니다..., regdate=2025-02-06 09:26:46, cnt=0), BoardDTO(seq=14, title=스프링 AOP 테스트, writer=관리자, content=스프링 AOP 테스트 중입니다..., regdate=2025-02-05 16:47:23, cnt=0), BoardDTO(seq=13, title=스프링 AOP 테스트, writer=관리자, content=스프링 AOP 테스트 중입니다..., regdate=2025-02-05 16:43:23, cnt=0), BoardDTO(seq=12, title=스프링 AOP 테스트, writer=관리자, content=스프링 AOP 테스트 중입니다..., regdate=2025-02-05 16:38:25, cnt=0), BoardDTO(seq=11, title=스프링 AOP 테스트, writer=관리자, content=스프링 AOP 테스트 중입니다..., regdate=2025-02-05 15:45:06, cnt=0), BoardDTO(seq=10, title=스프링 AOP 테스트, writer=관리자, content=스프링 AOP 테스트 중입니다..., regdate=2025-02-05 15:39:29, cnt=0), BoardDTO(seq=9, title=스프링 AOP 테스트, writer=관리자, content=스프링 AOP 테스트 중입니다..., regdate=2025-02-05 15:35:28, cnt=0), BoardDTO(seq=8, title=스프링 AOP 테스트, writer=관리자, content=스프링 AOP 테스트 중입니다..., regdate=2025-02-05 15:32:13, cnt=0), BoardDTO(seq=7, title=스프링 AOP 테스트, writer=관리자, content=스프링 AOP 테스트 중입니다..., regdate=2025-02-05 15:14:52, cnt=0), BoardDTO(seq=6, title=스프링 AOP 테스트, writer=관리자, content=스프링 AOP 테스트 중입니다..., regdate=2025-02-05 15:13:46, cnt=0), BoardDTO(seq=5, title=스프링 AOP 테스트, writer=관리자, content=스프링 AOP 테스트 중입니다..., regdate=2025-02-05 15:08:09, cnt=0), BoardDTO(seq=4, title=스프링 AOP 테스트, writer=관리자, content=스프링 AOP 테스트 중입니다..., regdate=2025-02-05 14:43:39, cnt=0), BoardDTO(seq=3, title=스프링 AOP 테스트, writer=관리자, content=스프링 AOP 테스트 중입니다..., regdate=2025-02-05 14:43:37, cnt=0), BoardDTO(seq=2, title=스프링 AOP 테스트, writer=관리자, content=스프링 AOP 테스트 중입니다..., regdate=2025-02-05 14:41:50, cnt=0), BoardDTO(seq=1, title=스프링 AOP 테스트, writer=관리자, content=스프링 AOP 테스트 중입니다..., regdate=2025-02-05 14:26:03, cnt=0)]
board &amp;gt;&amp;gt;&amp;gt; BoardDTO(seq=22, title=스프링 AOP 테스트, writer=관리자, content=스프링 AOP 테스트 중입니다..., regdate=2025-02-06 18:27:16, cnt=0)
board &amp;gt;&amp;gt;&amp;gt; BoardDTO(seq=21, title=스프링 AOP 테스트, writer=관리자, content=스프링 AOP 테스트 중입니다..., regdate=2025-02-06 18:24:58, cnt=0)
board &amp;gt;&amp;gt;&amp;gt; BoardDTO(seq=20, title=스프링 AOP 테스트, writer=관리자, content=스프링 AOP 테스트 중입니다..., regdate=2025-02-06 18:18:20, cnt=0)
board &amp;gt;&amp;gt;&amp;gt; BoardDTO(seq=19, title=스프링 AOP 테스트, writer=관리자, content=스프링 AOP 테스트 중입니다..., regdate=2025-02-06 18:09:57, cnt=0)
board &amp;gt;&amp;gt;&amp;gt; BoardDTO(seq=18, title=스프링 AOP 테스트, writer=관리자, content=스프링 AOP 테스트 중입니다..., regdate=2025-02-06 18:07:05, cnt=0)
board &amp;gt;&amp;gt;&amp;gt; BoardDTO(seq=17, title=스프링 AOP 테스트, writer=관리자, content=스프링 AOP 테스트 중입니다..., regdate=2025-02-06 18:06:54, cnt=0)
board &amp;gt;&amp;gt;&amp;gt; BoardDTO(seq=16, title=스프링 AOP 테스트, writer=관리자, content=스프링 AOP 테스트 중입니다..., regdate=2025-02-06 09:33:18, cnt=0)
board &amp;gt;&amp;gt;&amp;gt; BoardDTO(seq=15, title=스프링 AOP 테스트, writer=관리자, content=스프링 AOP 테스트 중입니다..., regdate=2025-02-06 09:26:46, cnt=0)
board &amp;gt;&amp;gt;&amp;gt; BoardDTO(seq=14, title=스프링 AOP 테스트, writer=관리자, content=스프링 AOP 테스트 중입니다..., regdate=2025-02-05 16:47:23, cnt=0)
board &amp;gt;&amp;gt;&amp;gt; BoardDTO(seq=13, title=스프링 AOP 테스트, writer=관리자, content=스프링 AOP 테스트 중입니다..., regdate=2025-02-05 16:43:23, cnt=0)
board &amp;gt;&amp;gt;&amp;gt; BoardDTO(seq=12, title=스프링 AOP 테스트, writer=관리자, content=스프링 AOP 테스트 중입니다..., regdate=2025-02-05 16:38:25, cnt=0)
board &amp;gt;&amp;gt;&amp;gt; BoardDTO(seq=11, title=스프링 AOP 테스트, writer=관리자, content=스프링 AOP 테스트 중입니다..., regdate=2025-02-05 15:45:06, cnt=0)
board &amp;gt;&amp;gt;&amp;gt; BoardDTO(seq=10, title=스프링 AOP 테스트, writer=관리자, content=스프링 AOP 테스트 중입니다..., regdate=2025-02-05 15:39:29, cnt=0)
board &amp;gt;&amp;gt;&amp;gt; BoardDTO(seq=9, title=스프링 AOP 테스트, writer=관리자, content=스프링 AOP 테스트 중입니다..., regdate=2025-02-05 15:35:28, cnt=0)
board &amp;gt;&amp;gt;&amp;gt; BoardDTO(seq=8, title=스프링 AOP 테스트, writer=관리자, content=스프링 AOP 테스트 중입니다..., regdate=2025-02-05 15:32:13, cnt=0)
board &amp;gt;&amp;gt;&amp;gt; BoardDTO(seq=7, title=스프링 AOP 테스트, writer=관리자, content=스프링 AOP 테스트 중입니다..., regdate=2025-02-05 15:14:52, cnt=0)
board &amp;gt;&amp;gt;&amp;gt; BoardDTO(seq=6, title=스프링 AOP 테스트, writer=관리자, content=스프링 AOP 테스트 중입니다..., regdate=2025-02-05 15:13:46, cnt=0)
board &amp;gt;&amp;gt;&amp;gt; BoardDTO(seq=5, title=스프링 AOP 테스트, writer=관리자, content=스프링 AOP 테스트 중입니다..., regdate=2025-02-05 15:08:09, cnt=0)
board &amp;gt;&amp;gt;&amp;gt; BoardDTO(seq=4, title=스프링 AOP 테스트, writer=관리자, content=스프링 AOP 테스트 중입니다..., regdate=2025-02-05 14:43:39, cnt=0)
board &amp;gt;&amp;gt;&amp;gt; BoardDTO(seq=3, title=스프링 AOP 테스트, writer=관리자, content=스프링 AOP 테스트 중입니다..., regdate=2025-02-05 14:43:37, cnt=0)
board &amp;gt;&amp;gt;&amp;gt; BoardDTO(seq=2, title=스프링 AOP 테스트, writer=관리자, content=스프링 AOP 테스트 중입니다..., regdate=2025-02-05 14:41:50, cnt=0)
board &amp;gt;&amp;gt;&amp;gt; BoardDTO(seq=1, title=스프링 AOP 테스트, writer=관리자, content=스프링 AOP 테스트 중입니다..., regdate=2025-02-05 14:26:03, cnt=0)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1738834227761&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;		&amp;lt;!-- 스프링 AOP aspectjweaver 라이브러리 --&amp;gt;
		&amp;lt;dependency&amp;gt;
		    &amp;lt;groupId&amp;gt;org.aspectj&amp;lt;/groupId&amp;gt;
		    &amp;lt;artifactId&amp;gt;aspectjweaver&amp;lt;/artifactId&amp;gt;
		    &amp;lt;version&amp;gt;1.9.7&amp;lt;/version&amp;gt;
		    &amp;lt;scope&amp;gt;runtime&amp;lt;/scope&amp;gt;
		&amp;lt;/dependency&amp;gt;
		    
		&amp;lt;!-- lombok 라이브러리 --&amp;gt;
		&amp;lt;dependency&amp;gt;
		    &amp;lt;groupId&amp;gt;org.projectlombok&amp;lt;/groupId&amp;gt;
		    &amp;lt;artifactId&amp;gt;lombok&amp;lt;/artifactId&amp;gt;
		    &amp;lt;version&amp;gt;1.18.36&amp;lt;/version&amp;gt;
		    &amp;lt;scope&amp;gt;provided&amp;lt;/scope&amp;gt;
		&amp;lt;/dependency&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1738834236276&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&amp;gt;
&amp;lt;beans xmlns=&quot;http://www.springframework.org/schema/beans&quot;
	xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;
	xmlns:context=&quot;http://www.springframework.org/schema/context&quot;
	xmlns:aop=&quot;http://www.springframework.org/schema/aop&quot;
	xsi:schemaLocation=&quot;http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd
		http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.1.xsd&quot;&amp;gt;

	&amp;lt;context:component-scan base-package=&quot;com.spring&quot; /&amp;gt;
	
	&amp;lt;!-- 횡단 관심에 해당하는 Advice 클래스를 Bean으로 등록을 하자 --&amp;gt;
	&amp;lt;!-- 
		 &amp;lt;bean id=&quot;log&quot; class=&quot;com.spring.model.LogAdvice&quot; /&amp;gt;
		 &amp;lt;bean id=&quot;afterReturning&quot; class=&quot;com.spring.model.AfterReturningAdvice&quot; /&amp;gt;
		 &amp;lt;bean id=&quot;afterThrowing&quot; class=&quot;com.spring.model.AfterThrowingAdvice&quot; /&amp;gt;
		 &amp;lt;bean id=&quot;around&quot; class=&quot;com.spring.model.AroundAdvice&quot; /&amp;gt;
	--&amp;gt;
	&amp;lt;!-- @Service 애노테이션으로 Bean 등록 가능 --&amp;gt;
	
	
	&amp;lt;!-- AOP 설정 --&amp;gt;
	&amp;lt;aop:aspectj-autoproxy /&amp;gt;
	&amp;lt;!-- 여기서 부터 AOP를 설정하겠다는 의미 --&amp;gt;
	&amp;lt;!-- &amp;lt;aop:config&amp;gt;								*Impl.*(..) =&amp;gt; 클래스 이름, 모든 메서드, 인자 0개 이상
												* com.spring... =&amp;gt; 모든 반환타입 참조
			&amp;lt;aop:pointcut id=&quot;allPointCut&quot; expression=&quot;execution(* com.spring..*Impl.*(..))&quot;/&amp;gt;pointcut : 핵심 로직 필터링
			&amp;lt;aop:pointcut id=&quot;getPointCut&quot; expression=&quot;execution(* com.spring..*Impl.get*(..))&quot;/&amp;gt;
			
			&amp;lt;aop:aspect ref=&quot;log&quot;&amp;gt;		aspect : 공통기능을 의미method=&quot;printLog&quot; =&amp;gt; 공통 로직 메서드
				&amp;lt;aop:before method=&quot;printLog&quot; pointcut-ref=&quot;allPointCut&quot;/&amp;gt;
			&amp;lt;/aop:aspect&amp;gt;
			
			&amp;lt;aop:aspect ref=&quot;afterReturning&quot;&amp;gt;
				&amp;lt;aop:after-returning method=&quot;afterLog&quot; pointcut-ref=&quot;getPointCut&quot; returning=&quot;returnObj&quot;/&amp;gt;
			&amp;lt;/aop:aspect&amp;gt;
			
			&amp;lt;aop:aspect ref=&quot;afterThrowing&quot;&amp;gt;
				&amp;lt;aop:after-throwing method=&quot;exceptionLog&quot; pointcut-ref=&quot;allPointCut&quot; throwing=&quot;exceptionObj&quot;/&amp;gt;
			&amp;lt;/aop:aspect&amp;gt;
			
			&amp;lt;aop:aspect ref=&quot;around&quot;&amp;gt;
				&amp;lt;aop:around method=&quot;aroundLog&quot; pointcut-ref=&quot;allPointCut&quot;/&amp;gt;
			&amp;lt;/aop:aspect&amp;gt;
		&amp;lt;/aop:config&amp;gt; 
	--&amp;gt;
	&amp;lt;!-- 여기서 부터 AOP를 종료하겠다는 의미 --&amp;gt;
	
&amp;lt;/beans&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1738834247245&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.spring.model;

import java.util.List;

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

@Service(&quot;boardService&quot;)
public class BoardServiceImpl implements BoardService {

	@Autowired
	private BoardDAO dao;
	
	
	@Override
	public void insertBoard(BoardDTO dto) {
		// 사전 처리 작업이 로그 출력 또는 입력 값에 대한 학인 작업
		// 보안과 관련된 작업 코드 등이 해당이 될 수 있음
		//System.out.println(&quot;[사전 처리] 비지니스 로직 수행 전 동작&quot;);
		
		//LogAdvice log = new LogAdvice();
		//log.printLog();
		/*
		 * if (dto.getSeq() == 0) { throw new IllegalArgumentException(); }
		 */
		
		this.dao.inserBoard(dto);    // 비지니스 로직
	}

	@Override
	public List&amp;lt;BoardDTO&amp;gt; getBoardList() {
		//System.out.println(&quot;[사전 처리] 비지니스 로직 수행 전 동작&quot;);
		
		//LogAdvice log = new LogAdvice();
		//log.printLog();
		
		return this.dao.getBoardList();    // 비지니스 로직
	}

}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1738834254960&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.spring.model;

import java.util.List;

import org.springframework.context.support.GenericXmlApplicationContext;

public class BoardServiceClient {

	public static void main(String[] args) {
		
		GenericXmlApplicationContext container = new GenericXmlApplicationContext(&quot;business.xml&quot;);
		
		BoardService boards = (BoardService)container.getBean(&quot;boardService&quot;);
		
		BoardDTO dto = new BoardDTO();
		
		//dto.setSeq(0);
		dto.setTitle(&quot;스프링 AOP 테스트&quot;);
		dto.setWriter(&quot;관리자&quot;);
		dto.setContent(&quot;스프링 AOP 테스트 중입니다...&quot;);

		boards.insertBoard(dto);    // 비지니스 로직
		List&amp;lt;BoardDTO&amp;gt; list = boards.getBoardList();	// 비지니스 로직
		
		for (BoardDTO board : list) {
			System.out.println(&quot;board &amp;gt;&amp;gt;&amp;gt; &quot; + board.toString());
		}
		
		container.close();
	}

}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1738834262092&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.spring.model;

import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Service;

@Service
@Aspect		// Aspect = Pointcut(핵심 로직) + Advice(공통 관심사항)
public class LogAdvice {

	// Pointcut을 만들어 주자
	@Pointcut(&quot;execution(* com.spring..*Impl.*(..))&quot;)
	public void allPointcut() { }	// body에 내용이 없는 메서드를 선언
	
	// printLog() 메서드가 Advice(공통 관심사항)
	@Before(&quot;allPointcut()&quot;)
	public void printLog() {
		System.out.println(&quot;[사전 처리] 비지니스 로직 수행 전 동작&quot;);
	}
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1738834268417&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.spring.model;

import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Service;

@Service
@Aspect
public class AfterReturningAdvice {

	// Pointcut을 만들어 주자
	@Pointcut(&quot;execution(* com.spring..*Impl.get*(..))&quot;)
	public void allPointcut() { }	// body에 내용이 없는 메서드를 선언
	
	@AfterReturning(pointcut = &quot;allPointcut()&quot;, returning=&quot;returnObj&quot;)	
	public void afterLog(Object returnObj) {
		System.out.println(&quot;[사후 처리] 비지니스 로직 수행 후 리턴 값 &amp;gt;&amp;gt;&amp;gt; &quot; + returnObj.toString());
	}
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1738834275110&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.spring.model;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Service;

@Service
@Aspect
public class AroundAdvice {

	// Pointcut을 만들어 주자
	@Pointcut(&quot;execution(* com.spring..*Impl.*(..))&quot;)
	public void allPointcut() { }	// body에 내용이 없는 메서드를 선언
	
	
	// around로 등록되는 Advice는 리턴타입과 매개변수가 고정이 되어야 함.
	// 반환타입은 Object 타입, 매개변수는 ProceedingJoinPoint 타입이어야 함.
	@Around(&quot;allPointcut()&quot;)
	public Object aroundLog(ProceedingJoinPoint jp) throws Throwable {
		Object obj = null;
		
		long startTime = System.currentTimeMillis();
		System.out.println(&quot;===[Before Logic]===&quot;);
		
		// 이 시점에 클라이언트가 호출한 비지니스 메서드가 실행이 됨
		obj = jp.proceed();
		
		long endTime = System.currentTimeMillis();
		
		// getSignature() : 호출되는 메서드에 대한 정보를 구해주는 메서드
		String method = jp.getSignature().getName();
		System.out.println(method + &quot;() 메서드에서 소요된 시간 &amp;gt;&amp;gt;&amp;gt; &quot; + (endTime - startTime) + &quot;(ms)초&quot;);
		
		return obj;
	}
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1738834282035&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.spring.model;

import java.sql.SQLException;

import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Service;

@Service
@Aspect
public class AfterThrowingAdvice {

	// Pointcut을 만들어 주자
	@Pointcut(&quot;execution(* com.spring..*Impl.*(..))&quot;)
	public void allPointcut() { }	// body에 내용이 없는 메서드를 선언
	
	@AfterThrowing(pointcut = &quot;allPointcut()&quot;, throwing=&quot;exceptionObj&quot;)
	public void exceptionLog(Object exceptionObj) {
		System.out.println(&quot;[예외 처리] 비지니스 로직 수행 중 예외 발생&quot;);
		
		// 발생된 예외의 타입에 따라 예외 처리 로직을 분기시켜 주면 됨
		if (exceptionObj instanceof IllegalArgumentException) {
			System.out.println(&quot;0번 글을 등록할 수 없습니다.&quot;);
		} else if (exceptionObj instanceof ArithmeticException) {
			System.out.println(&quot;0으로 숫자를 나눌 수 없습니다.&quot;);
		} else if (exceptionObj instanceof SQLException) {
			System.out.println(&quot;DB연동 과정에 문제가 있습니다.&quot;);
		} else {
			System.out.println(&quot;문제발생&quot;);
		}
	}
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Spring, Boot/기초 내용 정리</category>
      <author>mw41817</author>
      <guid isPermaLink="true">https://bin4399.tistory.com/501</guid>
      <comments>https://bin4399.tistory.com/501#entry501comment</comments>
      <pubDate>Thu, 6 Feb 2025 18:31:28 +0900</pubDate>
    </item>
    <item>
      <title>Spring(AOP)_00</title>
      <link>https://bin4399.tistory.com/500</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;2025-02-05&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1040&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cwOdfr/btsL90TqxQd/LuDmVHBFdtw1frJqcs6JLK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cwOdfr/btsL90TqxQd/LuDmVHBFdtw1frJqcs6JLK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cwOdfr/btsL90TqxQd/LuDmVHBFdtw1frJqcs6JLK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcwOdfr%2FbtsL90TqxQd%2FLuDmVHBFdtw1frJqcs6JLK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1920&quot; height=&quot;1040&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1040&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1040&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/30G3G/btsMagobbgx/ijJj2QjTWQT4AEnV60IUDK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/30G3G/btsMagobbgx/ijJj2QjTWQT4AEnV60IUDK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/30G3G/btsMagobbgx/ijJj2QjTWQT4AEnV60IUDK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F30G3G%2FbtsMagobbgx%2FijJj2QjTWQT4AEnV60IUDK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1920&quot; height=&quot;1040&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1040&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1040&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/LLhTu/btsL8Gu2sII/FnkoyzimCJbCed2ybpDRj0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/LLhTu/btsL8Gu2sII/FnkoyzimCJbCed2ybpDRj0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/LLhTu/btsL8Gu2sII/FnkoyzimCJbCed2ybpDRj0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLLhTu%2FbtsL8Gu2sII%2FFnkoyzimCJbCed2ybpDRj0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1920&quot; height=&quot;1040&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1040&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1738830718745&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# AOP(Aspect Oriented Programming)?

  - 관점 지향 프로그래밍
  
  - 코드 상에 핵심기능 + 공통 기능이 있는데 핵심 기능과 
    공통 기능을 분리해 놓는 것을 관점 지향 프로그래밍이라 함.
    즉, 핵심 사항과 공통관심사항을 분리하여 구현하는 것을 말함.
    
  - 문제를 바라보는 관점을 기준으로 프로그래밍을 하는 기법을 말함.
  
  - AOP는 문제를 해결하기 위한 핵심 사항과 코드 전체에 적용되는
    공통관심사항을 기준으로 프로그래밍 함으로써 공통 모듈을 여러 
    코드에 쉽게 적용할 수 있도록 도와줌.
    
  - AOP는 핵심사항과 공통관심사항을 별도의 코드로 구현해서 최종적으로
    이 둘을 조합하여 완성하는 것을 말함.


# AOP의 장점
  - 전체 코드에 흩어져 있는 공통 관심 사항이 하나의 장소에 
    집중(응집)이 된다는 점.
    
  - 서비스 모듈이 자신의 주요 관심 사항(핵심 사항)에 대한 코드만 
    집중하고, 그 외의 공통 관심 사항은 모두 빠지므로 코드가 깔끔해
    진다는 장점.
    
# AOP 주요 용어 - 용어가 어려움(중요).   
  - target(핵심 관심 사항) : 비지니스 로직(주된 업무)
                          어떤 대상에 공통 관심 사항(부가 기능)을 적용할 것인가?
  - advice(공통 관심 사항) - 횡단 관심 사항 
    : 부가적인 업무(보조 업무). 공통 관심 사항은 누군가에게 맡겨
      버리는 것이 좋음.
      공통 관심 사항 내용을 정의하고 언제 그 작업을 수행할지를 정의
      하는 것을 말함. 즉, 언제 공통 관심 기능을 핵심 로직에 적용할
      지를 정의하고 있어야 함.
      언제 ==&amp;gt; Before, AfterReturning, AfterThrowing, After, Around
  - aspect : 무엇을 언제 어디서 할지 즉, 필요한 정보가 정의되어 
             있음. 즉, 여러 객체에 공통으로 적용되고 있는 공통 
             관심 사항을 말함. 트랜잭션이나 보안, 로그 등이 좋은 
             예임. ==&amp;gt; aspect = advice + pointcut  
  - joinpoint : advice가 추가될 대상(메서드)
                핵심 관심 사항과 공통 관심 사항을 연결해 주는
                설정 정보를 말함.
                어디에 적용할 것인가? 스프링에서는 메서드가 실행될 때만 적용이 됨.
  - pointcut : join point 들을 정의한 패턴.
               실제 공통 관심 사항(advice)이 적용되는 지점(join point)를 
               말함. 스프링에서는 정규 표현식이나 aspectj 문법을 이용하여 정의함.
  - weaving : code, advice, pointcut 등을 조합해서 
              애플리케이션을 만들어 가는 과정을 말함.
              
              
# 스프링에서 AOP를 구현하는 방법
  - 설정 파일을 이용하는 방법(XML 기반의 구현 방법)
  - 애노테이션을 이용하는 방법(@AspectJ 애노테이션 기반의 AOP 구현)
  
  - 스프링 AOP 사용 시 필요한 라이브러리 등록(pom.xml)
    * artifactId가 aspectjweaver 인 라이브러리를 등록해야 함. 
     
  - 스프링 AOP 프록시 사용 시 필요한 라이브러리 등록(pom.xml)
    * artifactId가 cglib 인 라이브러리를 등록해야 함. 
  
  - 공통 기능 클래스 제작 - Advice 역할을 하는 클래스.  
 
 
# xml(설정 파일을 이용하는 방법) 파일에서 advice 종류
  - &amp;lt;aop:before&amp;gt; : 핵심 기능이 실행되기 전에 advice(공통관심사항)를 실행.
  - &amp;lt;aop:after-returning&amp;gt; : 정상적으로 핵심 기능이 실행된 후에 
                            advice(공통관심사항)를 실행.
                            모든 실행이 정상적으로 이루어진 후에 
                            동작하는 코드임.
  - &amp;lt;aop:after-throwing&amp;gt; : 핵심 기능 실행 중에 Exception이 발생 
                           시 advice(공통관심사항)를 실행.
                           예외가 발생한 후에 동작하는 코드임.
  - &amp;lt;aop:after&amp;gt; : 핵심 기능 실행 후에 advice(공통관심사항)를 실행 
                  ==&amp;gt; Exception이 발생하더라도
                      정상적으로 실행되거나 예외가 발생했을 
                      때 구분 없이 실행되는 코드임.
  - &amp;lt;aop:around&amp;gt; : 핵심 기능 실행 전 / 후 및 Exception 발생 
                   시 advice(공통관심사항)를 실행
                   ==&amp;gt; 가장 많이 사용됨.
                   

# Aspect pointcut 표현식
  - pointcut 을 지정할 때 사용하는 표현식으로 AspectJ 문법을 
    사용함.
    pointcut으로 표현할 수 있는 명시자에는 여러 종류가 있지만 
    일반적으로 가장 많이 사용하는 명시자는 execution 명시자임. 
    그 외에도 within, bean 명시자가 있음.
    
    - execution 명시자 : advice를 적용할 메서드를 명시할 때 
                        사용함.
      
      - * : 모든
      - . : 현재
      - .. : 0개 이상
      
           예시)
           * execution(public void get*(..))
             ==&amp;gt; public void 이고, 메서드 이름이 get으로 
                 시작하는 메서드이고, 인자가 있는 경우.
                 
           * execution(* com.test.aop.*.*())
             ==&amp;gt; com.test.aop 패키지의 모든 클래스에 
                 파라미터(인자)가 없는 모든 메서드.
                 
           * execution(* com.test.aop..*.*())
             ==&amp;gt; com.test.aop 패키지 및 com.test.aop 
                 패키지의 하위 패키지의 모든 클래스의 파라미터
                 (인자)가 없는 모든 메서드.
                 
           * execution(* com.test.aop.Staff.*())
             ==&amp;gt; com.test.aop 패키지 안의 Staff 클래스 
                 안에 파라미터(인자)가 없는 모든 메서드.&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Spring, Boot/기초 내용 정리</category>
      <author>mw41817</author>
      <guid isPermaLink="true">https://bin4399.tistory.com/500</guid>
      <comments>https://bin4399.tistory.com/500#entry500comment</comments>
      <pubDate>Thu, 6 Feb 2025 17:32:02 +0900</pubDate>
    </item>
    <item>
      <title>Spring(FileUpload)_01</title>
      <link>https://bin4399.tistory.com/499</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;2025-02-05&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1040&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eG4Eo6/btsMai0wuvo/HEjRzNNcR7mgcGZexNjWPk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eG4Eo6/btsMai0wuvo/HEjRzNNcR7mgcGZexNjWPk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eG4Eo6/btsMai0wuvo/HEjRzNNcR7mgcGZexNjWPk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeG4Eo6%2FbtsMai0wuvo%2FHEjRzNNcR7mgcGZexNjWPk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1920&quot; height=&quot;1040&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1040&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1040&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/A79Bl/btsL8WRUEtL/NJqBPYzpcDXf59QABIrP90/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/A79Bl/btsL8WRUEtL/NJqBPYzpcDXf59QABIrP90/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/A79Bl/btsL8WRUEtL/NJqBPYzpcDXf59QABIrP90/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FA79Bl%2FbtsL8WRUEtL%2FNJqBPYzpcDXf59QABIrP90%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1920&quot; height=&quot;1040&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1040&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1040&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cWJYyw/btsL9NmuTnj/AlANIhpNOj30qN7YyQHM70/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cWJYyw/btsL9NmuTnj/AlANIhpNOj30qN7YyQHM70/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cWJYyw/btsL9NmuTnj/AlANIhpNOj30qN7YyQHM70/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcWJYyw%2FbtsL9NmuTnj%2FAlANIhpNOj30qN7YyQHM70%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1920&quot; height=&quot;1040&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1040&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1040&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bbFrDN/btsL8GBOH71/IKhvEjsKtmkTzbXWrqSKk0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bbFrDN/btsL8GBOH71/IKhvEjsKtmkTzbXWrqSKk0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bbFrDN/btsL8GBOH71/IKhvEjsKtmkTzbXWrqSKk0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbbFrDN%2FbtsL8GBOH71%2FIKhvEjsKtmkTzbXWrqSKk0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1920&quot; height=&quot;1040&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1040&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1040&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zrc4L/btsL88Eyu8V/3ebmpa8t600AkyjB8PNLu1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zrc4L/btsL88Eyu8V/3ebmpa8t600AkyjB8PNLu1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zrc4L/btsL88Eyu8V/3ebmpa8t600AkyjB8PNLu1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fzrc4L%2FbtsL88Eyu8V%2F3ebmpa8t600AkyjB8PNLu1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1920&quot; height=&quot;1040&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1040&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1738830591254&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;		&amp;lt;!-- 스프링 첨부파일 관련 commons-fileupload 라이브러리 --&amp;gt;
		&amp;lt;dependency&amp;gt;
		    &amp;lt;groupId&amp;gt;commons-fileupload&amp;lt;/groupId&amp;gt;
		    &amp;lt;artifactId&amp;gt;commons-fileupload&amp;lt;/artifactId&amp;gt;
		    &amp;lt;version&amp;gt;1.5&amp;lt;/version&amp;gt;
		&amp;lt;/dependency&amp;gt;		
		
		&amp;lt;!-- 스프링 첨부파일 관련 commons-io 라이브러리 --&amp;gt;
		&amp;lt;dependency&amp;gt;
		    &amp;lt;groupId&amp;gt;commons-io&amp;lt;/groupId&amp;gt;
		    &amp;lt;artifactId&amp;gt;commons-io&amp;lt;/artifactId&amp;gt;
		    &amp;lt;version&amp;gt;2.11.0&amp;lt;/version&amp;gt;
		&amp;lt;/dependency&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1738830601568&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&amp;gt;
&amp;lt;beans xmlns=&quot;http://www.springframework.org/schema/beans&quot;
	xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;
	xsi:schemaLocation=&quot;http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd&quot;&amp;gt;
	
	&amp;lt;!-- Root Context: defines shared resources visible to all other web components --&amp;gt;
	&amp;lt;!-- 스프링 설정과 관련된 파일 설정 공간 --&amp;gt;
	
	&amp;lt;!-- 파일 업로드 관련 설정 작업 --&amp;gt;
	&amp;lt;bean id=&quot;multipartResolver&quot; class=&quot;org.springframework.web.multipart.commons.CommonsMultipartResolver&quot;&amp;gt;
		&amp;lt;property name=&quot;maxInMemorySize&quot; value=&quot;10485760&quot; /&amp;gt;	&amp;lt;!-- 10MB --&amp;gt;
		&amp;lt;property name=&quot;defaultEncoding&quot; value=&quot;UTF-8&quot; /&amp;gt;
	&amp;lt;/bean&amp;gt;
&amp;lt;/beans&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1738830609701&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=UTF-8&quot;
    pageEncoding=&quot;UTF-8&quot;%&amp;gt;
&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
&amp;lt;title&amp;gt;Insert title here&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;

	&amp;lt;div align=&quot;center&quot;&amp;gt;
		&amp;lt;hr width=&quot;30%&quot; color=&quot;gray&quot;&amp;gt;
			&amp;lt;h3&amp;gt;파일 업로드 폼 페이지&amp;lt;/h3&amp;gt;
		&amp;lt;hr width=&quot;30%&quot; color=&quot;gray&quot;&amp;gt;
		&amp;lt;br&amp;gt; &amp;lt;br&amp;gt;
		
		&amp;lt;%-- input type이 &quot;file&quot;이라면 method는 무조건 &quot;post&quot;방식으로 하고 enctype=&quot;multipart/form-data&quot; 입력 --%&amp;gt;
		&amp;lt;form method=&quot;post&quot; enctype=&quot;multipart/form-data&quot; 
				action=&quot;&amp;lt;%=request.getContextPath() %&amp;gt;/upload_ok.go&quot;&amp;gt;
			&amp;lt;table border=&quot;1&quot; width=&quot;400&quot;&amp;gt;
				&amp;lt;tr&amp;gt;
					&amp;lt;th&amp;gt;첨부파일 1&amp;lt;/th&amp;gt;
					&amp;lt;td&amp;gt;&amp;lt;input type=&quot;file&quot; name=&quot;file1&quot;&amp;gt;&amp;lt;/td&amp;gt;
				&amp;lt;/tr&amp;gt;
				
				&amp;lt;tr&amp;gt;
					&amp;lt;th&amp;gt;첨부파일 2&amp;lt;/th&amp;gt;
					&amp;lt;td&amp;gt;&amp;lt;input type=&quot;file&quot; name=&quot;file2&quot;&amp;gt;&amp;lt;/td&amp;gt;
				&amp;lt;/tr&amp;gt;
				
				&amp;lt;tr&amp;gt;
					&amp;lt;th&amp;gt;첨부파일 3&amp;lt;/th&amp;gt;
					&amp;lt;td&amp;gt;&amp;lt;input type=&quot;file&quot; name=&quot;file3&quot;&amp;gt;&amp;lt;/td&amp;gt;
				&amp;lt;/tr&amp;gt;
				
				&amp;lt;tr&amp;gt;
					&amp;lt;td colspan=&quot;2&quot; align=&quot;center&quot;&amp;gt;
						&amp;lt;input type=&quot;submit&quot; value=&quot;파일전송&quot;&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;
						&amp;lt;input type=&quot;reset&quot; value=&quot;다시작성&quot;&amp;gt;
					&amp;lt;/td&amp;gt;
				&amp;lt;/tr&amp;gt;
			&amp;lt;/table&amp;gt;
		&amp;lt;/form&amp;gt;
	&amp;lt;/div&amp;gt;

&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1738830620989&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.spring.fileupload;

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 org.springframework.web.multipart.MultipartHttpServletRequest;

@Controller
public class UploadController {

	@Autowired
	private Upload upload;
	
	
	@RequestMapping(&quot;upload.go&quot;)
	public String upload() {
		return &quot;upload_form&quot;;
	}
	
	
	// MultipartHttpServletRequest : 첨부파일이 여러 개인 경우
	@RequestMapping(&quot;upload_ok.go&quot;)
	public String uploadOk(Model model, MultipartHttpServletRequest mRequest) {
		if (this.upload.fileUpload(mRequest)) {
			model.addAttribute(&quot;result&quot;, &quot;파일 업로드 성공&quot;);
		} else {
			model.addAttribute(&quot;result&quot;, &quot;파일 업로드 실패&quot;);
		}
		
		return &quot;upload_result&quot;; 
	}
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1738830628269&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.spring.fileupload;

import java.io.File;
import java.io.IOException;
import java.util.Calendar;
import java.util.Iterator;

import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;

@Service
public class Upload {

	public boolean fileUpload(MultipartHttpServletRequest mRequest) {
		
		boolean isUpload = false;
		String uploadPath = &quot;D:\\NCS\\workspace(spring)\\12_FileUpload\\src\\main\\webapp\\resources\\upload\\&quot;;
		
		Calendar cal = Calendar.getInstance();
		
		int year = cal.get(Calendar.YEAR);
		int month = cal.get(Calendar.MONTH) + 1;
		int day = cal.get(Calendar.DAY_OF_MONTH);
		
		Iterator&amp;lt;String&amp;gt; iterator = mRequest.getFileNames();
		
		while (iterator.hasNext()) {
			String uploadFileName = iterator.next();
			System.out.println(&quot;uploadFileName &amp;gt;&amp;gt;&amp;gt; &quot; + uploadFileName);
			
			MultipartFile mFile = mRequest.getFile(uploadFileName);
			
			// getOriginalFilename() : 업로드 되는 파일에서 확장자를 포함한 파일의 이름을 반환해주는 메서드.
			String originalFileName = mFile.getOriginalFilename();
			System.out.println(&quot;originalFileName &amp;gt;&amp;gt;&amp;gt; &quot; + originalFileName);
			
			// 실제로 폴더를 만들어 보자
			// .......\\resources\\upload\\2025-02-05
			String homeDir = uploadPath + year + &quot;-&quot; + month + &quot;-&quot; + day;
			
			File path1 = new File(homeDir);
			
			if (!path1.exists()) {
				path1.mkdirs();	// 실제로 폴더를 만들어 주는 메서드
			}
			// 파일을 만들어 보자
			String saveFileName = originalFileName;
			
			// 파일명 중복 방지 작업
			if (!saveFileName.equals(&quot;&quot;)) {
				saveFileName = System.currentTimeMillis() + &quot;_&quot; + saveFileName;
				
				File origin = new File(homeDir + &quot;/&quot; + saveFileName);
				
				try {
					// transferTo() : 실제로 파일 데이터를 지정한 폴더에 저장시키는 메서드
					mFile.transferTo(origin);
					
					isUpload = true;
				} catch (IllegalStateException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		} // while 문 end
		
		return isUpload;
	}
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Spring, Boot/기초 내용 정리</category>
      <author>mw41817</author>
      <guid isPermaLink="true">https://bin4399.tistory.com/499</guid>
      <comments>https://bin4399.tistory.com/499#entry499comment</comments>
      <pubDate>Thu, 6 Feb 2025 17:30:30 +0900</pubDate>
    </item>
    <item>
      <title>Spring(MyBatis)_04</title>
      <link>https://bin4399.tistory.com/498</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;2025-02-03&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1040&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/W7zZx/btsL75AXr76/kCZwkUMXySjJkGGkEvhKr0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/W7zZx/btsL75AXr76/kCZwkUMXySjJkGGkEvhKr0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/W7zZx/btsL75AXr76/kCZwkUMXySjJkGGkEvhKr0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FW7zZx%2FbtsL75AXr76%2FkCZwkUMXySjJkGGkEvhKr0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1920&quot; height=&quot;1040&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1040&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1040&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/coy9bE/btsL72xwt8S/jGY8eS34X7XKDyhQCAOAvK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/coy9bE/btsL72xwt8S/jGY8eS34X7XKDyhQCAOAvK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/coy9bE/btsL72xwt8S/jGY8eS34X7XKDyhQCAOAvK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcoy9bE%2FbtsL72xwt8S%2FjGY8eS34X7XKDyhQCAOAvK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1920&quot; height=&quot;1040&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1040&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1040&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kWa6A/btsL7ek7AbC/4DmbTy7kT3p2eB4A8EVdP0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kWa6A/btsL7ek7AbC/4DmbTy7kT3p2eB4A8EVdP0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kWa6A/btsL7ek7AbC/4DmbTy7kT3p2eB4A8EVdP0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkWa6A%2FbtsL7ek7AbC%2F4DmbTy7kT3p2eB4A8EVdP0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1920&quot; height=&quot;1040&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1040&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1040&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dCFqTR/btsL76fyeXl/4gQZjuDRsN9TrvHxqwvDd1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dCFqTR/btsL76fyeXl/4gQZjuDRsN9TrvHxqwvDd1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dCFqTR/btsL76fyeXl/4gQZjuDRsN9TrvHxqwvDd1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdCFqTR%2FbtsL76fyeXl%2F4gQZjuDRsN9TrvHxqwvDd1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1920&quot; height=&quot;1040&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1040&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1040&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bGOmPB/btsL7xqXWWP/lMiKPVXeW1arGtfQB8K1uK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bGOmPB/btsL7xqXWWP/lMiKPVXeW1arGtfQB8K1uK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bGOmPB/btsL7xqXWWP/lMiKPVXeW1arGtfQB8K1uK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbGOmPB%2FbtsL7xqXWWP%2FlMiKPVXeW1arGtfQB8K1uK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1920&quot; height=&quot;1040&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1040&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1040&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lbWUl/btsL7LQihkj/MLlZwG7AkViwm1zk3YDkcK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lbWUl/btsL7LQihkj/MLlZwG7AkViwm1zk3YDkcK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lbWUl/btsL7LQihkj/MLlZwG7AkViwm1zk3YDkcK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlbWUl%2FbtsL7LQihkj%2FMLlZwG7AkViwm1zk3YDkcK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1920&quot; height=&quot;1040&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1040&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1040&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bjoEp8/btsL7dT6CNO/rp6yNxXCXQvYhIcK34aNYk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bjoEp8/btsL7dT6CNO/rp6yNxXCXQvYhIcK34aNYk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bjoEp8/btsL7dT6CNO/rp6yNxXCXQvYhIcK34aNYk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbjoEp8%2FbtsL7dT6CNO%2Frp6yNxXCXQvYhIcK34aNYk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1920&quot; height=&quot;1040&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1040&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1040&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/XIOSP/btsL75ucGgL/OazUyffg9BUX8BTgY1KQ2K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/XIOSP/btsL75ucGgL/OazUyffg9BUX8BTgY1KQ2K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/XIOSP/btsL75ucGgL/OazUyffg9BUX8BTgY1KQ2K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FXIOSP%2FbtsL75ucGgL%2FOazUyffg9BUX8BTgY1KQ2K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1920&quot; height=&quot;1040&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1040&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1040&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cKmF0V/btsL7keqCh1/5xPKupkYh1KQrmKedVrlw1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cKmF0V/btsL7keqCh1/5xPKupkYh1KQrmKedVrlw1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cKmF0V/btsL7keqCh1/5xPKupkYh1KQrmKedVrlw1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcKmF0V%2FbtsL7keqCh1%2F5xPKupkYh1KQrmKedVrlw1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1920&quot; height=&quot;1040&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1040&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1040&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yiT6X/btsL8dS5LAP/IZKMeYKwxgOqTAx38cjjfK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yiT6X/btsL8dS5LAP/IZKMeYKwxgOqTAx38cjjfK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yiT6X/btsL8dS5LAP/IZKMeYKwxgOqTAx38cjjfK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyiT6X%2FbtsL8dS5LAP%2FIZKMeYKwxgOqTAx38cjjfK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1920&quot; height=&quot;1040&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1040&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1040&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/egW95d/btsL6Wx2yUr/uJdXmXQSUGpVaCkCFCUgP1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/egW95d/btsL6Wx2yUr/uJdXmXQSUGpVaCkCFCUgP1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/egW95d/btsL6Wx2yUr/uJdXmXQSUGpVaCkCFCUgP1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FegW95d%2FbtsL6Wx2yUr%2FuJdXmXQSUGpVaCkCFCUgP1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1920&quot; height=&quot;1040&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1040&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1040&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bDqqro/btsL87xQPzs/zg5FVP1cuHztJ2R6qOqB80/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bDqqro/btsL87xQPzs/zg5FVP1cuHztJ2R6qOqB80/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bDqqro/btsL87xQPzs/zg5FVP1cuHztJ2R6qOqB80/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbDqqro%2FbtsL87xQPzs%2Fzg5FVP1cuHztJ2R6qOqB80%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1920&quot; height=&quot;1040&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1040&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1040&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bzMSsP/btsL7DLwpe4/FNAJ0t2kWvcSUCI5lUmri0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bzMSsP/btsL7DLwpe4/FNAJ0t2kWvcSUCI5lUmri0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bzMSsP/btsL7DLwpe4/FNAJ0t2kWvcSUCI5lUmri0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbzMSsP%2FbtsL7DLwpe4%2FFNAJ0t2kWvcSUCI5lUmri0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1920&quot; height=&quot;1040&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1040&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1040&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dapxfZ/btsL7Tm4yET/nLOlAKkP5gTXikhNEojKN0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dapxfZ/btsL7Tm4yET/nLOlAKkP5gTXikhNEojKN0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dapxfZ/btsL7Tm4yET/nLOlAKkP5gTXikhNEojKN0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdapxfZ%2FbtsL7Tm4yET%2FnLOlAKkP5gTXikhNEojKN0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1920&quot; height=&quot;1040&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1040&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1040&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ccH3RW/btsL7xqY4Ho/prAczGclb4yk9lDrgU0ark/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ccH3RW/btsL7xqY4Ho/prAczGclb4yk9lDrgU0ark/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ccH3RW/btsL7xqY4Ho/prAczGclb4yk9lDrgU0ark/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FccH3RW%2FbtsL7xqY4Ho%2FprAczGclb4yk9lDrgU0ark%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1920&quot; height=&quot;1040&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1040&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1040&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cmh35w/btsL7zI9MD9/CDLvNs5sRdniNRBdfkrdiK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cmh35w/btsL7zI9MD9/CDLvNs5sRdniNRBdfkrdiK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cmh35w/btsL7zI9MD9/CDLvNs5sRdniNRBdfkrdiK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcmh35w%2FbtsL7zI9MD9%2FCDLvNs5sRdniNRBdfkrdiK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1920&quot; height=&quot;1040&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1040&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1040&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/daxNuq/btsL7qyTEsn/BoVNpqoSwonxIJ5Rmh299k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/daxNuq/btsL7qyTEsn/BoVNpqoSwonxIJ5Rmh299k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/daxNuq/btsL7qyTEsn/BoVNpqoSwonxIJ5Rmh299k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdaxNuq%2FbtsL7qyTEsn%2FBoVNpqoSwonxIJ5Rmh299k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1920&quot; height=&quot;1040&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1040&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1738745361020&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;		&amp;lt;!-- lombok 라이브러리 --&amp;gt;
		&amp;lt;dependency&amp;gt;
		    &amp;lt;groupId&amp;gt;org.projectlombok&amp;lt;/groupId&amp;gt;
		    &amp;lt;artifactId&amp;gt;lombok&amp;lt;/artifactId&amp;gt;
		    &amp;lt;version&amp;gt;1.18.36&amp;lt;/version&amp;gt;
		    &amp;lt;scope&amp;gt;provided&amp;lt;/scope&amp;gt;
		&amp;lt;/dependency&amp;gt;
		
		&amp;lt;!-- spring-jdbc 라이브러리 --&amp;gt;
		&amp;lt;dependency&amp;gt;
		    &amp;lt;groupId&amp;gt;org.springframework&amp;lt;/groupId&amp;gt;
		    &amp;lt;artifactId&amp;gt;spring-jdbc&amp;lt;/artifactId&amp;gt;
		    &amp;lt;version&amp;gt;${org.springframework-version}&amp;lt;/version&amp;gt;
		&amp;lt;/dependency&amp;gt;
		
		&amp;lt;!-- mybatis framework 라이브러리 --&amp;gt;
		&amp;lt;dependency&amp;gt;
		    &amp;lt;groupId&amp;gt;org.mybatis&amp;lt;/groupId&amp;gt;
		    &amp;lt;artifactId&amp;gt;mybatis&amp;lt;/artifactId&amp;gt;
		    &amp;lt;version&amp;gt;3.4.6&amp;lt;/version&amp;gt;
		&amp;lt;/dependency&amp;gt;
		
		&amp;lt;!-- mybatis-spring 라이브러리 --&amp;gt;
		&amp;lt;dependency&amp;gt;
		    &amp;lt;groupId&amp;gt;org.mybatis&amp;lt;/groupId&amp;gt;
		    &amp;lt;artifactId&amp;gt;mybatis-spring&amp;lt;/artifactId&amp;gt;
		    &amp;lt;version&amp;gt;1.3.1&amp;lt;/version&amp;gt;
		&amp;lt;/dependency&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1738745373889&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=UTF-8&quot;
    pageEncoding=&quot;UTF-8&quot;%&amp;gt;
&amp;lt;%@ taglib prefix=&quot;c&quot; uri=&quot;http://java.sun.com/jsp/jstl/core&quot; %&amp;gt;
&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
&amp;lt;title&amp;gt;Insert title here&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;

	&amp;lt;div align=&quot;center&quot;&amp;gt;
		&amp;lt;hr width=&quot;30%&quot; color=&quot;maroon&quot;&amp;gt;
			&amp;lt;h3&amp;gt;BOARD 테이블 게시물 전체 리스트 페이지&amp;lt;/h3&amp;gt;
		&amp;lt;hr width=&quot;30%&quot; color=&quot;maroon&quot;&amp;gt;
		&amp;lt;br&amp;gt; &amp;lt;br&amp;gt;
		
		&amp;lt;table border=&quot;1&quot; width=&quot;600&quot;&amp;gt;
			&amp;lt;c:set var=&quot;list&quot; value=&quot;${List }&quot; /&amp;gt;
			&amp;lt;c:set var=&quot;paging&quot; value=&quot;${Paging }&quot; /&amp;gt;
			
			&amp;lt;tr&amp;gt;
				&amp;lt;td colspan=&quot;5&quot; align=&quot;right&quot;&amp;gt;
					전체 게시물 수 : ${paging.totalRecord } 개
				&amp;lt;/td&amp;gt;
			&amp;lt;/tr&amp;gt;
			
			&amp;lt;tr&amp;gt;
				&amp;lt;th&amp;gt;게시글 No.&amp;lt;/th&amp;gt; &amp;lt;th&amp;gt;게시글 제목&amp;lt;/th&amp;gt; &amp;lt;th&amp;gt;게시글 작성자&amp;lt;/th&amp;gt;
				&amp;lt;th&amp;gt;게시글 조회수&amp;lt;/th&amp;gt; &amp;lt;th&amp;gt;게시글 작성일자&amp;lt;/th&amp;gt;
			&amp;lt;/tr&amp;gt;
			
			&amp;lt;c:if test=&quot;${!empty list }&quot;&amp;gt;
				&amp;lt;c:forEach items=&quot;${list }&quot; var=&quot;dto&quot;&amp;gt;
					&amp;lt;tr&amp;gt;
						&amp;lt;td&amp;gt;${dto.board_no }&amp;lt;/td&amp;gt;
						&amp;lt;td&amp;gt;&amp;lt;a href=&quot;&amp;lt;%=request.getContextPath() %&amp;gt;
								/board_content.go?no=${dto.board_no }&amp;amp;page=${paging.page }&quot;&amp;gt;
							${dto.board_title }&amp;lt;/a&amp;gt;&amp;lt;/td&amp;gt;
						&amp;lt;td&amp;gt;${dto.board_writer }&amp;lt;/td&amp;gt;
						&amp;lt;td&amp;gt;${dto.board_hit }&amp;lt;/td&amp;gt;
						&amp;lt;td&amp;gt;${dto.board_date.substring(0, 10) }&amp;lt;/td&amp;gt;
					&amp;lt;/tr&amp;gt;
				&amp;lt;/c:forEach&amp;gt;
			&amp;lt;/c:if&amp;gt;
			
			&amp;lt;c:if test=&quot;${empty list }&quot;&amp;gt;
				&amp;lt;tr&amp;gt;
					&amp;lt;td colspan=&quot;5&quot; align=&quot;center&quot;&amp;gt;
						&amp;lt;h3&amp;gt;게시물 목록이 없습니다...&amp;lt;/h3&amp;gt;
					&amp;lt;/td&amp;gt;
				&amp;lt;/tr&amp;gt;
			&amp;lt;/c:if&amp;gt;
		&amp;lt;/table&amp;gt;
		&amp;lt;br&amp;gt; &amp;lt;br&amp;gt;
		
		&amp;lt;input type=&quot;button&quot; value=&quot;글쓰기&quot;
				onclick=&quot;location.href='board_write.go'&quot;&amp;gt;
		&amp;lt;br&amp;gt; &amp;lt;br&amp;gt;
		
		&amp;lt;%-- 페이징 처리 --%&amp;gt;
		&amp;lt;c:if test=&quot;${paging.page &amp;gt; paging.block }&quot;&amp;gt;
			&amp;lt;a href=&quot;&amp;lt;%=request.getContextPath() %&amp;gt;/board_list.go?page=1&quot;&amp;gt;[처음]&amp;lt;/a&amp;gt;
			&amp;lt;a href=&quot;&amp;lt;%=request.getContextPath() %&amp;gt;/board_list.go?page=${paging.startBlock - 1 }&quot;&amp;gt;◀&amp;lt;/a&amp;gt;
		&amp;lt;/c:if&amp;gt;
		
		&amp;lt;c:forEach begin=&quot;${paging.startBlock }&quot; end=&quot;${paging.endBlock }&quot; var=&quot;i&quot;&amp;gt;
			&amp;lt;c:if test=&quot;${i == paging.page }&quot;&amp;gt;
				&amp;lt;b&amp;gt;&amp;lt;a href=&quot;&amp;lt;%=request.getContextPath() %&amp;gt;/board_list.go?page=${i }&quot;&amp;gt;${i }&amp;lt;/a&amp;gt;&amp;lt;/b&amp;gt;
			&amp;lt;/c:if&amp;gt;
			
			&amp;lt;c:if test=&quot;${i != paging.page }&quot;&amp;gt;
				&amp;lt;a href=&quot;&amp;lt;%=request.getContextPath() %&amp;gt;/board_list.go?page=${i }&quot;&amp;gt;${i }&amp;lt;/a&amp;gt;
			&amp;lt;/c:if&amp;gt;
		&amp;lt;/c:forEach&amp;gt;
		
		&amp;lt;c:if test=&quot;${paging.allPage &amp;gt; paging.endBlock }&quot;&amp;gt;
			&amp;lt;a href=&quot;&amp;lt;%=request.getContextPath() %&amp;gt;/board_list.go?page=${paging.endBlock + 1 }&quot;&amp;gt;▶&amp;lt;/a&amp;gt;
			&amp;lt;a href=&quot;&amp;lt;%=request.getContextPath() %&amp;gt;/board_list.go?page=${paging.allPage }&quot;&amp;gt;[마지막]&amp;lt;/a&amp;gt;
		&amp;lt;/c:if&amp;gt;
		&amp;lt;br&amp;gt;
		
		&amp;lt;hr width=&quot;30%&quot; color=&quot;maroon&quot;&amp;gt;
		&amp;lt;br&amp;gt;
		
		&amp;lt;%-- 검색 폼 영역 --%&amp;gt;
		&amp;lt;form method=&quot;post&quot; action=&quot;&amp;lt;%=request.getContextPath() %&amp;gt;/board_search.go&quot;&amp;gt;
			&amp;lt;select name=&quot;field&quot;&amp;gt;
				&amp;lt;option value=&quot;title&quot;&amp;gt;제목&amp;lt;/option&amp;gt;
				&amp;lt;option value=&quot;cont&quot;&amp;gt;내용&amp;lt;/option&amp;gt;
				&amp;lt;option value=&quot;writer&quot;&amp;gt;작성자&amp;lt;/option&amp;gt;
			&amp;lt;/select&amp;gt;
			
			&amp;lt;input name=&quot;keyword&quot;&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;
			&amp;lt;input type=&quot;submit&quot; value=&quot;검색&quot;&amp;gt;
		&amp;lt;/form&amp;gt;
	&amp;lt;/div&amp;gt;

&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1738745381073&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&amp;gt;

&amp;lt;!DOCTYPE configuration
  PUBLIC &quot;-//mybatis.org//DTD Config 3.0//EN&quot;
  &quot;https://mybatis.org/dtd/mybatis-3-config.dtd&quot;&amp;gt;
  
&amp;lt;configuration&amp;gt;

	&amp;lt;typeAliases&amp;gt;
		&amp;lt;typeAlias type=&quot;com.spring.model.BoardDAO&quot; alias=&quot;boardDao&quot; /&amp;gt;
		&amp;lt;typeAlias type=&quot;com.spring.model.BoardVO&quot; alias=&quot;boardVo&quot; /&amp;gt;
		&amp;lt;typeAlias type=&quot;com.spring.model.PageVO&quot; alias=&quot;pageVo&quot; /&amp;gt;
	&amp;lt;/typeAliases&amp;gt;

&amp;lt;/configuration&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1738745388849&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&amp;gt;

&amp;lt;!DOCTYPE mapper
    PUBLIC &quot;-//mybatis.org//DTD Mapper 3.0//EN&quot;
    &quot;https://mybatis.org/dtd/mybatis-3-mapper.dtd&quot;&amp;gt;
    
&amp;lt;mapper namespace=&quot;boardDao&quot;&amp;gt; &amp;lt;!-- mybatis-config에서 설정한 별칭 입력 --&amp;gt;

	&amp;lt;select id=&quot;cnt&quot; resultType=&quot;int&quot;&amp;gt;
		select count(*) from board
	&amp;lt;/select&amp;gt;
	
	&amp;lt;select id=&quot;list&quot; parameterType=&quot;pageVo&quot; resultType=&quot;boardVo&quot;&amp;gt;
		&amp;lt;![CDATA[select * from (select row_number() over(order by board_no desc) rnum, b.* from board b)
				where rnum &amp;gt;= #{startNo} and rnum &amp;lt;= #{endNo}]]&amp;gt;
	&amp;lt;/select&amp;gt;
	
	&amp;lt;!-- 
		 일반적으로 DB 작업을 하다 보면 먼저 사전에 어떤 값을 가져와서 해당 값을
		 증가시킨 후에 DB에 저장하거나, 혹은 입력된 후에 증가값을 가져올 필요가
		 있는 경우가 많이 발생을 함.
		 이런 경우에는 MyBatis 에서 제공하는 selectKey 하는 태그를 이용하여
		 별도의 쿼리 로직을 사용할 필요 없이 일괄 처리 작업을 할 수 있게 해줌. 
		 
		 * KeyProperty 속성 : 해당 결과 값이 들어갈 DTO(VO) 객체의 멤버 변수명을
		 					 작성하면 됨.
		 * order 속성 : 해당 쿼리문의 실행 순서를 의미함.
		 		- BEFORE : 원래 실행할 쿼리문 이전에 selectKey 태그가 실행이 됨.
		 		- AFTER : 원래 실행할 쿼리문 이후에 selectKey 태그가 실행이 됨.
		 			  
		 ※ 주의사항 : 반드시 멤버변수에 해당하는 setter() 와 getter() 메서드가 존재해야 함.
	 --&amp;gt;
	
	&amp;lt;insert id=&quot;add&quot; parameterType=&quot;boardVo&quot;&amp;gt;
		&amp;lt;selectKey resultType=&quot;int&quot; keyProperty=&quot;board_no&quot; order=&quot;BEFORE&quot;&amp;gt;
			select max(board_no) from board 
		&amp;lt;/selectKey&amp;gt;
		insert into board values(#{board_no} + 1, #{board_writer}, 
			#{board_title}, #{board_cont}, #{board_pwd}, default, sysdate, '')
	&amp;lt;/insert&amp;gt;
	
	&amp;lt;select id=&quot;cont&quot; parameterType=&quot;int&quot; resultType=&quot;boardVo&quot;&amp;gt;
		select * from board where board_no = #{no}
	&amp;lt;/select&amp;gt;
	
	&amp;lt;update id=&quot;read&quot; parameterType=&quot;int&quot;&amp;gt;
		update board set board_hit = board_hit + 1 where board_no = #{no} 
	&amp;lt;/update&amp;gt;
	
	&amp;lt;update id=&quot;modify&quot; parameterType=&quot;boardVo&quot;&amp;gt;
		update board set board_title = #{board_title}, board_cont = #{board_cont}, 
			board_update = sysdate where board_no = #{board_no}
	&amp;lt;/update&amp;gt;
	
	&amp;lt;delete id=&quot;del&quot; parameterType=&quot;int&quot;&amp;gt;
		delete from board where board_no = #{no} 
	&amp;lt;/delete&amp;gt;

	&amp;lt;update id=&quot;seq&quot; parameterType=&quot;int&quot;&amp;gt;
		&amp;lt;![CDATA[update board set board_no = board_no - 1 where board_no &amp;gt; #{board_no}]]&amp;gt;
	&amp;lt;/update&amp;gt;
	
	&amp;lt;select id=&quot;count&quot; parameterType=&quot;map&quot; resultType=&quot;int&quot;&amp;gt;
		select count(*) from board 
		&amp;lt;if test=&quot;Field == 'title'&quot;&amp;gt;
			where board_title 
		&amp;lt;/if&amp;gt;
		&amp;lt;if test=&quot;Field == 'cont'&quot;&amp;gt;
			where board_cont
		&amp;lt;/if&amp;gt;
		&amp;lt;if test=&quot;Field == 'writer'&quot;&amp;gt;
			where board_writer
		&amp;lt;/if&amp;gt;
		like '%' || #{Keyword} || '%'
	&amp;lt;/select&amp;gt;

	&amp;lt;select id=&quot;search&quot; parameterType=&quot;pageVo&quot; resultType=&quot;boardVo&quot;&amp;gt;
		select * from (select row_number() over(order by board_no desc) rnum, b.* from board b
			&amp;lt;choose&amp;gt;
				&amp;lt;when test=&quot;field == 'title'&quot;&amp;gt;
					where board_title
				&amp;lt;/when&amp;gt;
				&amp;lt;when test=&quot;field == 'cont'&quot;&amp;gt;
					where board_cont
				&amp;lt;/when&amp;gt;
				&amp;lt;when test=&quot;field == 'writer'&quot;&amp;gt;
					where board_writer
				&amp;lt;/when&amp;gt;
			&amp;lt;/choose&amp;gt;
			&amp;lt;![CDATA[
				like '%' || #{keyword} || '%') where rnum &amp;gt;= #{startNo} and rnum &amp;lt;= #{endNo}
			]]&amp;gt;
	&amp;lt;/select&amp;gt;

&amp;lt;/mapper&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1738745397874&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.spring.model;

import lombok.Data;
import lombok.NoArgsConstructor;

// 페이징 처리 작업 시 작업할 내용을 설정하는 객체
@Data
@NoArgsConstructor	// 기본 생성자
public class PageVO {

	// 페이징 처리 관련 멤버 선언
	private int page;			// 현재 페이지
	private int rowsize;		// 한 페이지당 보여질 게시물의 수
	private int totalRecord;	// DB 상의 board 테이블 전체 게시물 수
	private int startNo;		// 해당 페이지의 시작 글 번호
	private int endNo;			// 해당 페이지의 끝 글 번호
	private int startBlock;		// 해당 페이지의 시작 블럭
	private int endBlock;		// 해당 페이지의 끝 블럭
	private int allPage;		// 전체 페이지 수
	private int block = 3;		// 아래의 보여질 최대 페이지 수
	
	// 검색 관련 멤버 선언
	private String field;
	private String keyword;
	
	
	// 일반적인 페이징 처리 인자 생성자
	public PageVO(int page, int rowsize, int totalRecord) {
		
		this.page = page;
		this.rowsize = rowsize;
		this.totalRecord = totalRecord;
		
		// 해당 페이지에서 시작 글 번호
		this.startNo = (this.page * this.rowsize) - (this.rowsize - 1);
		
		// 해당 페이지에서 끝 글 번호
		this.endNo = (this.page * this.rowsize);
		
		// 해당 페이지에서 시작 블럭
		this.startBlock = (((this.page - 1) / this.block) * this.block) + 1;
		
		// 해당 페이지에서 끝 블럭
		this.endBlock = (((this.page - 1) / this.block) * this.block) + this.block;
		
		// 전체 페이지 수를 얻어오는 과정
		this.allPage = (int)Math.ceil(this.totalRecord / (double)this.rowsize);
		
		if (this.endBlock &amp;gt; this.allPage) {
			this.endBlock = this.allPage;
		}
	} // 인자 생성자
	
	
	// 검색 페이징 처리 인자 생성자
	public PageVO(int page, int rowsize, int totalRecord, String field, String keyword) {
	
		// this를 이용하여 위에 인자 생성자를 불러옴
		this(page, rowsize, totalRecord);
		
		this.field = field;
		this.keyword = keyword;
	}
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1738745406336&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.spring.board;

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

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

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 org.springframework.web.bind.annotation.RequestParam;

import com.spring.model.BoardDAO;
import com.spring.model.BoardVO;
import com.spring.model.PageVO;

@Controller
public class BoardController {

	@Autowired
	private BoardDAO dao;
	
	
	// 한 페이지당 보여질 게시물의 수
	private final int rowsize = 3;
	
	// DB 상의 전체 게시물의 수
	private int totalRecord = 0;
	
	
	@RequestMapping(&quot;board_list.go&quot;)
	public String list(HttpServletRequest request, Model model) {
		int page;		// 현재 페이지 변수
		
		// 페이징 처리 작업
		if (request.getParameter(&quot;page&quot;) != null) {
			page = Integer.parseInt(request.getParameter(&quot;page&quot;));
		} else {
			// 처음으로 &quot;게시물 전체 목록&quot; a 링크를 클릭한 경우
			page = 1;
		}
		
		// DB 상의 전체 게시물의 수를 확인하는 메서드 호출
		totalRecord = this.dao.getListCount();
		
		PageVO vo = new PageVO(page, rowsize, totalRecord);
		
		// 현재 페이지에 해당하는 게시물을 가져오는 메서드 호출
		List&amp;lt;BoardVO&amp;gt; boardList = this.dao.getBoardList(vo);
		
		model.addAttribute(&quot;List&quot;, boardList)
			 .addAttribute(&quot;Paging&quot;, vo);
		
		return &quot;board_list&quot;;
	}
	  
	
	@RequestMapping(&quot;board_write.go&quot;)
	public String write() {
		return &quot;board_write&quot;;
	}
	
	
	@RequestMapping(&quot;board_write_ok.go&quot;)
	public void writerOk(BoardVO vo, HttpServletResponse response) throws IOException {
		int chk = this.dao.insertBoard(vo);
		
		response.setContentType(&quot;text/html; charset=UTF-8&quot;);
		
		PrintWriter out = response.getWriter();
		
		if (chk &amp;gt; 0) {
			out.println(&quot;&amp;lt;script&amp;gt;&quot;);
			out.println(&quot;alert('게시글 등록 성공')&quot;);
			out.println(&quot;location.href='board_list.go'&quot;);
			out.println(&quot;&amp;lt;/script&amp;gt;&quot;);
		} else {
			out.println(&quot;&amp;lt;script&amp;gt;&quot;);
			out.println(&quot;alert('게시글 등록 실패')&quot;);
			out.println(&quot;history.back()&quot;);
			out.println(&quot;&amp;lt;/script&amp;gt;&quot;);
		}
	}
	
	
	@RequestMapping(&quot;board_content.go&quot;)
	public String content(@RequestParam(&quot;no&quot;) int no, 
							@RequestParam(&quot;page&quot;) int nowPage, Model model) {
		// 조회수를 증가 시켜주는 메서드 호출
		this.dao.readCount(no);
		
		// 게시글 번호에 해당하는 게시글의 상세 내역을 조회하는 메서드 호출
		BoardVO cont = this.dao.boardContent(no);
		
		model.addAttribute(&quot;Content&quot;, cont)
			 .addAttribute(&quot;Paging&quot;, nowPage);
		
		return &quot;board_content&quot;;
	}
	
	
	@RequestMapping(&quot;board_modify.go&quot;)
	public String modify(@RequestParam(&quot;no&quot;) int no, 
							@RequestParam(&quot;page&quot;) int nowPage, Model model) {
		// 게시글 번호에 해당하는 게시글의 상세 내역을 조회하는 메서드 호출
		BoardVO vo = this.dao.boardContent(no);
		
		model.addAttribute(&quot;Modify&quot;, vo)
			 .addAttribute(&quot;Page&quot;, nowPage);
		
		return &quot;board_modify&quot;;
	}
	
	
	@RequestMapping(&quot;board_modify_ok.go&quot;)
	public void modifyOk(BoardVO vo, @RequestParam(&quot;db_pwd&quot;) String db_pwd, 
						@RequestParam(&quot;page&quot;) int nowPage, HttpServletResponse response) throws IOException {
		response.setContentType(&quot;text/html; charset=UTF-8&quot;);
		
		PrintWriter out = response.getWriter();
		
		if (vo.getBoard_pwd().equals(db_pwd)) {
			// 비밀번호가 일치하는 경우
			int chk = this.dao.updateBoard(vo);
			
			if (chk &amp;gt; 0) {
				out.println(&quot;&amp;lt;script&amp;gt;&quot;);
				out.println(&quot;alert('게시글 수정 성공')&quot;);
				out.println(&quot;location.href='board_content.go?no=&quot; + vo.getBoard_no() + 
															&quot;&amp;amp;page=&quot; + nowPage + &quot;'&quot;);
				out.println(&quot;&amp;lt;/script&amp;gt;&quot;);
			} else {
				out.println(&quot;&amp;lt;script&amp;gt;&quot;);
				out.println(&quot;alert('게시글 수정 실패')&quot;);
				out.println(&quot;history.back()&quot;);
				out.println(&quot;&amp;lt;/script&amp;gt;&quot;);
			}
		} else {
			// 비밀번호가 틀린 경우
			out.println(&quot;&amp;lt;script&amp;gt;&quot;);
			out.println(&quot;alert('비밀번호가 틀립니다.')&quot;);
			out.println(&quot;history.back()&quot;);
			out.println(&quot;&amp;lt;/script&amp;gt;&quot;);			
		}		
	}
	
	
	@RequestMapping(&quot;board_delete.go&quot;)
	public String delete(@RequestParam(&quot;no&quot;) int no, 
						@RequestParam(&quot;page&quot;) int nowPage, Model model) {
		BoardVO vo = this.dao.boardContent(no);
		
		model.addAttribute(&quot;Delete&quot;, vo)
			 .addAttribute(&quot;Page&quot;, nowPage);
		
		return &quot;board_delete&quot;;
	}
	
	
	@RequestMapping(&quot;board_delete_ok.go&quot;)
	public void deleteOk(BoardVO vo, @RequestParam(&quot;db_pwd&quot;) String db_pwd, 
						@RequestParam(&quot;page&quot;) int nowPage, HttpServletResponse response) throws IOException {
		response.setContentType(&quot;text/html; charset=UTF-8&quot;);
		
		PrintWriter out = response.getWriter();
		
		if (vo.getBoard_pwd().equals(db_pwd)) {
			// 비밀번호가 일치하는 경우
			int res = this.dao.deleteBoard(vo.getBoard_no());
			
			if (res &amp;gt; 0) {
				this.dao.updateSequence(vo.getBoard_no());
				
				out.println(&quot;&amp;lt;script&amp;gt;&quot;);
				out.println(&quot;alert('게시글 삭제 성공')&quot;);
				out.println(&quot;location.href='board_list.go?page=&quot; + nowPage + &quot;'&quot;);
				out.println(&quot;&amp;lt;/script&amp;gt;&quot;);
			} else {
				out.println(&quot;&amp;lt;script&amp;gt;&quot;);
				out.println(&quot;alert('게시글 삭제 실패')&quot;);
				out.println(&quot;history.back()&quot;);
				out.println(&quot;&amp;lt;/script&amp;gt;&quot;);
			}
		} else {
			// 비밀번호가 틀린 경우
			out.println(&quot;&amp;lt;script&amp;gt;&quot;);
			out.println(&quot;alert('비밀번호가 틀립니다.')&quot;);
			out.println(&quot;history.back()&quot;);
			out.println(&quot;&amp;lt;/script&amp;gt;&quot;);			
		}		
	}
	
	
	@RequestMapping(&quot;board_search.go&quot;)
	public String search(@RequestParam(&quot;field&quot;) String field, @RequestParam(&quot;keyword&quot;) String keyword,
						HttpServletRequest request, Model model) {
		// 검색 결과 페이징 처리 작업
		int page;		// 현재 페이지 변수
		
		if (request.getParameter(&quot;page&quot;) != null) {
			page = Integer.parseInt(request.getParameter(&quot;page&quot;));
		} else {
			// &quot;검색&quot; 버튼을 클릭한 경우 - 검색 요청
			page = 1;
		}
		
		// 검색 분류(field)와 검색어(keyword)에 해당하는 게시글의 수를 DB에서 확인하는 작업
		Map&amp;lt;String, String&amp;gt; map = new HashMap&amp;lt;String, String&amp;gt;();
		
		map.put(&quot;Field&quot;, field);
		map.put(&quot;Keyword&quot;, keyword);
		
		totalRecord = this.dao.searchBoardCount(map);
		
		PageVO pVo = new PageVO(page, rowsize, totalRecord, field, keyword);
		
		// 검색 시 한 페이지 당 보여질 게시물의 수 만큼 검색한 게시물을 List로 가져오는 메서드
		List&amp;lt;BoardVO&amp;gt; searchList = this.dao.searchBoardList(pVo);
		
		model.addAttribute(&quot;SearchPageList&quot;, searchList)
			 .addAttribute(&quot;Paging&quot;, pVo);
			 
		return &quot;board_search_list&quot;;
	}
	
	
	@RequestMapping(&quot;board_search_cont.go&quot;)
	public String searchCont(Model model, @RequestParam(&quot;no&quot;) int no, 
					@RequestParam(&quot;page&quot;) int nowPage, @RequestParam(&quot;field&quot;) String field,
					@RequestParam(&quot;keyword&quot;) String keyword) {
		// 조회수 증가 메서드
		this.dao.readCount(no);
		
		// 게시글 번호에 해당하는 게시글을 조회하는 메서드 호출
		BoardVO searchCont = this.dao.boardContent(no);
		
		model.addAttribute(&quot;sCont&quot;, searchCont)
			 .addAttribute(&quot;Page&quot;, nowPage)
			 .addAttribute(&quot;Field&quot;, field)
			 .addAttribute(&quot;Keyword&quot;, keyword);
		
		return &quot;board_search_cont&quot;;
	}
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Spring, Boot/기초 내용 정리</category>
      <author>mw41817</author>
      <guid isPermaLink="true">https://bin4399.tistory.com/498</guid>
      <comments>https://bin4399.tistory.com/498#entry498comment</comments>
      <pubDate>Wed, 5 Feb 2025 17:50:12 +0900</pubDate>
    </item>
  </channel>
</rss>