<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>새로비</title>
    <link>https://engkimbs.tistory.com/</link>
    <description>#IT #재테크</description>
    <language>ko</language>
    <pubDate>Wed, 15 Apr 2026 01:50:14 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>새로비</managingEditor>
    <image>
      <title>새로비</title>
      <url>https://tistory1.daumcdn.net/tistory/2735062/attach/e99fbd9826a5400b994a197a7160d1dd</url>
      <link>https://engkimbs.tistory.com</link>
    </image>
    <item>
      <title>그래핀이란 무엇인가?</title>
      <link>https://engkimbs.tistory.com/entry/%EA%B7%B8%EB%9E%98%ED%95%80%EC%9D%B4%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80</link>
      <description>&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;1080&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/4Fwzl/btsLBZ1qAHl/6hwZcdmQfYA0uWVFJ8hvq1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/4Fwzl/btsLBZ1qAHl/6hwZcdmQfYA0uWVFJ8hvq1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/4Fwzl/btsLBZ1qAHl/6hwZcdmQfYA0uWVFJ8hvq1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F4Fwzl%2FbtsLBZ1qAHl%2F6hwZcdmQfYA0uWVFJ8hvq1%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;1080&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&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;
&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;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;그래핀이란?&lt;/h3&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;span style=&quot;color: #444444; text-align: start;&quot;&gt;최근 몇 년간의 연구를 통해 새롭고, 지속 가능한 소재들이 개발되고 있습니다. 그 중 하나가 포스팅에서 소개할 '미래의 소재'로 알려진&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;그래핀&lt;/b&gt;&lt;span style=&quot;color: #444444; text-align: start;&quot;&gt;입니다.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #444444; text-align: start;&quot;&gt;&amp;nbsp;재밌는 것은 이 그래핀은 원래 흑연 덩어리에 스카치테이프를 붙였다가 떼어내면서 우연히 발견된 물질이였죠.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #444444; text-align: start;&quot;&gt;그래핀은 2010년 노벨 물리학상을 받으면서 본격적으로 주목받기 시작했고, 흔히&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;&amp;lsquo;꿈의 신소재&lt;/b&gt;&lt;span style=&quot;color: #444444; text-align: start;&quot;&gt;&amp;rsquo;라고 불리고 있습니다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #444444; text-align: start;&quot;&gt;현재 응용 연구 확대 및 상용화 진전, 대량 생산 기술의 발전으로 산업적 활용이 더욱 확대되고 있죠.&lt;/span&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://cbbs.co.kr/contents/06_news/ADVERTISEMENT?board_id=board_advertisement&amp;amp;mode=view&amp;amp;no=1&amp;amp;cate=&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://cbbs.co.kr/contents/06_news/ADVERTISEMENT?board_id=board_advertisement&amp;amp;mode=view&amp;amp;no=1&amp;amp;cate=&lt;/a&gt;&lt;/p&gt;</description>
      <author>새로비</author>
      <guid isPermaLink="true">https://engkimbs.tistory.com/1094</guid>
      <comments>https://engkimbs.tistory.com/entry/%EA%B7%B8%EB%9E%98%ED%95%80%EC%9D%B4%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80#entry1094comment</comments>
      <pubDate>Sun, 29 Dec 2024 20:43:30 +0900</pubDate>
    </item>
    <item>
      <title>SEO 최적화 체크리스트</title>
      <link>https://engkimbs.tistory.com/entry/SEO-%EC%B5%9C%EC%A0%81%ED%99%94-%EC%B2%B4%ED%81%AC%EB%A6%AC%EC%8A%A4%ED%8A%B8</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;제목을-입력해주세요_-001 (3).png&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;1080&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kzHTU/btsv9J7PsMM/BWFEr7cTye5jhsB8u6xPVK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kzHTU/btsv9J7PsMM/BWFEr7cTye5jhsB8u6xPVK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kzHTU/btsv9J7PsMM/BWFEr7cTye5jhsB8u6xPVK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkzHTU%2Fbtsv9J7PsMM%2FBWFEr7cTye5jhsB8u6xPVK%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;504&quot; height=&quot;504&quot; data-filename=&quot;제목을-입력해주세요_-001 (3).png&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;1080&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://developers.google.com/search/docs/fundamentals/seo-starter-guide?hl=ko&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;SEO(검색 엔진 최적화)&lt;/a&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;저도 블로그를 운영하면서 SEO를 제대로 적용했을 때와 글을 막 쓰면서 적용하지 않았을 때 구글 검색엔진 노출 순위가 너무나도 차이가 많이 났던 경우가 많았었습니다.&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;SEO는 ON-PAGE SEO, OFF-PAGE 이렇게 크게 두 가지 카테고리로 나누는데, 어느 블로거한테나 적용가능한 ON-PAGE SEO를 기준으로 SEO를 어떻게 적용할 지 알아보도록 하겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;SEO 최적화 체크리스트&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;키워드 연구 (Keyword Research)&lt;/b&gt;&lt;/h4&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-filename=&quot;제목을-입력해주세요_-003 (3).png&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;1080&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bne03g/btswarlxxkW/DRgtyiFoDM0gKgcr11gYr0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bne03g/btswarlxxkW/DRgtyiFoDM0gKgcr11gYr0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bne03g/btswarlxxkW/DRgtyiFoDM0gKgcr11gYr0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbne03g%2FbtswarlxxkW%2FDRgtyiFoDM0gKgcr11gYr0%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;502&quot; height=&quot;502&quot; data-filename=&quot;제목을-입력해주세요_-003 (3).png&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;1080&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;키워드 연구는 SEO 작업의 거의 반이라고 해도 과언이 아닙니다. 키워드를 맞춰서 글을 써야 원하는 키워드로 검색엔진에 상위 노출됩니다. 또한 키워드 작업을 할 때 너무 경쟁도가 강한 키워드를 기준으로 글을 작성하면 타깃 키워드로 노출이 안 될 가능성이 굉장히 큽니다.&amp;nbsp;&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;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이때 핵심 포인트는 '비트코인'같은 짧고 핵심적인 키워드가 아닌 '비트코인 가격 전망', '비트코인 사는 법' 같은 상대적으로 경쟁도가 덜 하면서 월간 트래픽은 최소 500이상이 나오는 키워드들을 공략해야합니다.&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;중요한 점은 애드센스 수익을 바라는 것이 아닌 잠재 고객이나 독자층을 확보하는 목적으로 SEO 작업을 진행하는 분들이라면 '비트코인'을 검색하는 사람들의 니즈와 '비트코인 가격 전망', '비트코인 사는 법'같은 키워드를 검색하는 사람들의 니즈가 겹치는 지를 확인해야합니다. 그래야 나중에 이 페이지 지수를 적용하여 Internal Link를 통해 '비트코인'을 타깃 키워드로 쓴 페이지의 지수를 높이는 데 큰 도움을 줄 수 있죠.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;ON-PAGE SEO&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;제목을-입력해주세요_-003 (4).png&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;1080&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bbDcMA/btsv7kHIsb4/1kMVkLLJweBO0GQAXofwO1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bbDcMA/btsv7kHIsb4/1kMVkLLJweBO0GQAXofwO1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bbDcMA/btsv7kHIsb4/1kMVkLLJweBO0GQAXofwO1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbbDcMA%2Fbtsv7kHIsb4%2F1kMVkLLJweBO0GQAXofwO1%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;590&quot; height=&quot;590&quot; data-filename=&quot;제목을-입력해주세요_-003 (4).png&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;1080&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;키워드를 선정하고 콘텐츠를 작성한 뒤에는 ON-PAGE SEO를 적용하여 검색엔진이 좋아하는 페이지의 구조와 메타데이터를 생성해야합니다.&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;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Title&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Meta description&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;URL 최적화(URL 뒤에 키워드가 포함 됬는지)&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;H1~H6 계층적 구조&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt; 소제목 안에 키워드 삽입&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt; 이미지 및 동영상 같은 멀티미디어 구성&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;UX 향상(UI 및 site loading, 모바일 친화적)&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;내부 링크 구축&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;SSL 적용 여부&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;OFF-PAGE SEO(백링크 구축)&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;OFF-PAGE SEO는 보통 &lt;a href=&quot;https://ko.wikipedia.org/wiki/%EB%B0%B1%EB%A7%81%ED%81%AC&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;백링크&lt;/a&gt; 구축이라하여 검색엔진에서 페이지를 평가할 때 정말 중요한 요소 중 하나입니다. 이 백링크를 통해 검색엔진은 웹페이지를 빠르게 찾아내서 인덱싱하고 얼마나 신뢰도가 높고 퀄리티가 좋은 지를 평가합니다.&amp;nbsp;&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;사실 ON-PAGE SEO만큼 바로 적용하기가 굉장히 어렵고 효과도 즉각적으로 나타내는 것이 아니기 때문에 굉장히 까다로운 최적화 작업 중 하나입니다. 저도 이 부분에 대해서 굉장히 공부를 많이 했는데 다음 포스팅에서 이 OFF-PAGE SEO에 대해 자세하게 다뤄 보겠습니다.&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;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;참고 자료&lt;/b&gt;&lt;/h3&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://www.upsecretseo.com/insights/backlink&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;b&gt;백링크에가 검색엔진에 중요한 이유&lt;/b&gt;&lt;/a&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;http://xn--seo-ht8lex.org/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;b&gt;구글 SEO 체크리스트&lt;/b&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>SEO</category>
      <author>새로비</author>
      <guid isPermaLink="true">https://engkimbs.tistory.com/1092</guid>
      <comments>https://engkimbs.tistory.com/entry/SEO-%EC%B5%9C%EC%A0%81%ED%99%94-%EC%B2%B4%ED%81%AC%EB%A6%AC%EC%8A%A4%ED%8A%B8#entry1092comment</comments>
      <pubDate>Fri, 29 Sep 2023 23:55:27 +0900</pubDate>
    </item>
    <item>
      <title>DDD(도메인 주도 개발) 이란? 그리고 실제 적용한 사례</title>
      <link>https://engkimbs.tistory.com/entry/DDD%EB%8F%84%EB%A9%94%EC%9D%B8-%EC%A3%BC%EB%8F%84-%EA%B0%9C%EB%B0%9C-%EC%9D%B4%EB%9E%80-%EA%B7%B8%EB%A6%AC%EA%B3%A0-%EC%8B%A4%EC%A0%9C-%EC%A0%81%EC%9A%A9%ED%95%9C-%EC%82%AC%EB%A1%80</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;DDD(도메인&amp;nbsp;주도&amp;nbsp;개발)&amp;nbsp;이란?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DDD(도메인 주도 설계)는 소프트웨어 시스템을 개발할 때 도메인(업무 영역 또는 비즈니스 영역)을 중심으로 설계하는 소프트웨어 개발 방법론입니다. 이 방법론은 복잡한 시스템을 이해하고 관리하기 쉽도록 도메인과 관련된 지식을 효과적으로 모델링하고 사용하는 방법을 제공하죠.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;실제 MSA 전환 작업을 하면서 DDD를 적용&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 차세대 프로젝트를 맡으면서 레가시 시스템을 MSA 아키텍처로 변환하는 중에 이 DDD 방법론을 써서 아키텍처 및 프로젝트 구조를 리뉴얼 하는 중인데요. 이것 때문에 정말 미친 듯이 바쁘고 힘든 나날을 보냈습니다ㅠ (특히 읽혀지지도 않는 레가시 코드는 정말 건강에 해롭습니다)&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;DDD는 1년 반 쯤 전에 접했을 때는 조금 생소한 개념이었습니다. 그때 &lt;a href=&quot;https://www.yes24.com/Product/Goods/108431347&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;최범균님의 도메인 주도 개발&lt;/a&gt;이라는 책을 한 4번 쯤 읽고 여러 외국 포스팅이나 MSA와 연관지어 보니 어떻게 적용해야 될 지 윤곽이 보였습니다.&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;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;Event storming은 구성원이 DDD와 MSA에 대한 이해가 제대로 되어 있는 구성원이 모여서 해야 한다. 만약 그렇지 못할 경우 서로 커뮤니케이션에 대한 비용만 들어 애꿋은 시간만 낭비할 가능성이 높음.&lt;/li&gt;
&lt;li&gt;공통 언어(Ubiquitous language)는 도메인 전문가의 말을 우선적으로 따라야 한다. 이것까지는 당연하지만 프로젝트와 클래스명을 구성할 때도 공통 언어에서 쓰는 명칭을 기준으로 클래스와 메서드, 멤버 변수명을 꼭 작성하는 것이 좋다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;DDD의 핵심은 Domain와 그 Aggregate를 어떻게 나눌 것인가가 핵심이라고 생각. 잘못 나눴을 경우 로직이 복잡해 지고 의존성이 오히려 꼬이게 되는 사태가 일어날 수 있다. 하지만 잘 나눴을 경우 프로젝트 구조가 명확해지고 각 Aggregate의 역할과 의존성 파악이 명확해줘서 유지보수하기 쉬운 코드가 생성된다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;자칫하면 Aggregate에 도메인 로직에 필요한 멤버 변수와 메서드가 집중되어 클래스가 굉장히 비대해질 수 있다. 단일 책임 원칙이라고 할 수 는 있는데 코드량이 한 클래스에 집중되어 가독성과 유지보수가 급격하게 떨어지는 경험을 많이 했음. 그에 대한 대안으로 도메인 로직이 복잡한 경우 각각의 서브 도메인 로직에 해당하는 domain service를 두는 것이 유지보수 하는 데 경험적으로 굉장히 좋았다.&lt;/li&gt;
&lt;li&gt;MSA는 Aggregate를 잘 나눴을 경우 MSA를 어떻게 나눌 것인지 의사결정하기 굉장히 수월해진다. Aggregate의 집합인 Bounded Context가 결국 MSA의 단위가 되므로 팀 구성원들과 합을 맞추어 서비스를 나누기가 편한 함&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 밖에도 여러 가지가 있는 데 생각날 때마다 추가적으로 공유하도록 하겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;차세대 프로젝트의 DDD 실천 방법론 및 주의 사항&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 보통 DDD의 첫 번째 과정은 Event storming이라는 과정을 거치게 되는 데 차세대 프로젝트를 할 시에는 이 과정이 어떻게 보면 불필요한 과정일 수 있습니다. 차라리 아키텍처들과 도메인 전문가가 서로 협업하여 요구사항을 확실하게 정리해 나가고 그에 따라 프로젝트 구성 및 개발 테스트 검증, 수정 과정을 계속해서 돌리는 것이 오히려 일처리가 더 빠르게 진행됬었습니다. 만일 도메인 전문가(IT운영자) 들과 MSA를 나누자고 서비스를 먼저 나누는 시도를 했다가는 그 부분에 대해 모르는 사람들이 앉아서 실효성 없는 문서만 작성하다가 시간만 낭비할 가능성이 굉장히 높습니다. (저같은 경우 매니저가 그런식으로 일을 진행했다가 애꿎은 1개월만 별 소득 없이 시간만 날렸던 기억이 있습니다.)&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;차세대 프로젝트로 레가시 프로젝트를 MSA로 전환할 시에는 보통 도메인 지식과 MSA 시스템 디자인이 가능한 개발 실력이 출중한 사람이 있다면 금상첨화겠지만 보통은 둘 중 하나의 역량을 가진 경우가 많습니다. 이럴 때 고려했던 방안은 도메인 전문가가 시스템 아키텍트와 계속해서 커뮤니케이션 하면서 요구사항을 정립하는 방향으로 진행했습니다. 물론 100% 요구사항이 정리가 될 수가 없기에 요구사항이 리스팅 될 때마다 애자일 프로세스(디자인 -&amp;gt; 개발 -&amp;gt;&amp;nbsp; 테스트 -&amp;gt; 검증 -&amp;gt; 피드백 -&amp;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;다음에 시간이 있을 때는 어떻게 요구사항을 반영하여 DDD 방법론을 가지고 프로젝트를 구현해 나갔는 지에 대해서 구체적으로 포스팅 하도록 하겠습니다.&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;Reference&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://microservices.io/articles/index.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://microservices.io/articles/index.html&lt;/a&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 data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>System Design</category>
      <category>ddd</category>
      <category>msa</category>
      <category>시스템 디자인</category>
      <author>새로비</author>
      <guid isPermaLink="true">https://engkimbs.tistory.com/1091</guid>
      <comments>https://engkimbs.tistory.com/entry/DDD%EB%8F%84%EB%A9%94%EC%9D%B8-%EC%A3%BC%EB%8F%84-%EA%B0%9C%EB%B0%9C-%EC%9D%B4%EB%9E%80-%EA%B7%B8%EB%A6%AC%EA%B3%A0-%EC%8B%A4%EC%A0%9C-%EC%A0%81%EC%9A%A9%ED%95%9C-%EC%82%AC%EB%A1%80#entry1091comment</comments>
      <pubDate>Mon, 18 Sep 2023 00:12:35 +0900</pubDate>
    </item>
    <item>
      <title>아파치 카프카(Apache Kafka) 아키텍처 및 동작 방식</title>
      <link>https://engkimbs.tistory.com/entry/691</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;151&quot; data-origin-height=&quot;151&quot;&gt;&lt;span data-url=&quot;https://t1.daumcdn.net/cfile/tistory/99B52B4D5C04D4D633?original&quot; data-phocus=&quot;https://t1.daumcdn.net/cfile/tistory/99B52B4D5C04D4D633?original&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/99B52B4D5C04D4D633&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F99B52B4D5C04D4D633&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;151&quot; height=&quot;151&quot; data-origin-width=&quot;151&quot; data-origin-height=&quot;151&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 style=&quot;float: none; text-align: justify; clear: none;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-size: 18pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #1fda11;&quot;&gt;| &lt;/span&gt;아파치 카프카(Apache Kafka)란?&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아파치 카프카(Apache Kafka)는 분산 스트리밍 플랫폼이며 데이터 파이프 라인을 만들 때 주로 사용되는 오픈소스 솔루션입니다. 카프카는 대용량의 실시간 로그처리에 특화되어 있는 솔루션이며&amp;nbsp;데이터를 유실없이 안전하게 전달하는 것이 주목적인&amp;nbsp;메세지 시스템에서&amp;nbsp;&lt;b&gt;Fault-Tolerant&lt;/b&gt;한 안정적인 아키텍처와&amp;nbsp;빠른 퍼포먼스로 데이터를 처리할 수 있습니다.&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;아파치 카프카는 현재 2.x 버전까지 나와있고 초기에 &lt;b&gt;Producer&lt;/b&gt;, &lt;b&gt;Consumer&lt;/b&gt; 기능에서 0.10.x 버전에서부터 &lt;b&gt;Connectors&lt;/b&gt;와 &lt;b&gt;Stream&lt;/b&gt; &lt;b&gt;Processors&lt;/b&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;b&gt;Producer&lt;/b&gt;, &lt;b&gt;Consumer&lt;/b&gt;에 대해서만 다룰 것이며&amp;nbsp;카프카가 어떤 아키텍처로 구성되어 있고&amp;nbsp;어떻게 동작하는 지 간략하게 설명하도록 하겠습니다.&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;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-size: 18pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #1fda11;&quot;&gt;| &lt;/span&gt;아파치 카프카의 특징(Apache Kafka Features)&lt;/b&gt;&lt;/span&gt;&lt;/h3&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;span style=&quot;font-family: Arial Black;&quot;&gt;&lt;span style=&quot;font-family: Arial Black;&quot;&gt;■&lt;/span&gt;Publisher Subscriber 모델 : Publisher Subscriber 모델은 데이터 큐를 중간에 두고 서로 간 독립적으로 데이터를 생산하고 소비합니다. 이런 느슨한 결합을 통해 Publisher나 Subscriber가 죽을 시, 서로 간에 의존성이 없으므로 안정적으로 데이터를 처리할 수 있습니다. 또한 설정 역시 간단하게 할 수 있다는 장점이 있습니다.&lt;/span&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;span style=&quot;font-family: Arial Black;&quot;&gt;&lt;span style=&quot;font-family: Arial Black;&quot;&gt;■&lt;/span&gt;고가용성(High availability) 및 확장성(Scalability)&amp;nbsp;: 카프카는 클러스터로서 작동합니다. 클러스터로서 작동하므로 Fault-tolerant 한 고가용성 서비스를 제공할 수 있고 분산 처리를 통해 빠른 데이터 처리를 가능하게 합니다. 또한 서버를 수평적으로 늘려 안정성 및 성능을 향상시키는 Scale-out이 가능합니다.&lt;/span&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;span style=&quot;font-family: Arial Black;&quot;&gt;&lt;span style=&quot;font-family: Arial Black;&quot;&gt;■&lt;/span&gt;디스크 순차 저장 및 처리(Sequential Store and Process in Disk) : 메세지를 메모리 큐에 적재하는 기존 메세지 시스템과 다르게 카프카는 메세지를 디스크에 순차적으로 저장합니다. 이로서 얻는 이점은 두 가지입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;margin-left: 2em;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: Arial Black;&quot;&gt;1. 서버에 장애가 나도 메세지가 디스크에 저장되어 있으므로 유실걱정이 없습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;margin-left: 2em;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: Arial Black;&quot;&gt;2. 디스크가 순차적으로 저장되어 있으므로 디스크 I/O가 줄어들어 성능이 빨라집니다. &lt;/span&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;span style=&quot;font-family: Arial Black;&quot;&gt;&lt;span style=&quot;font-family: Arial Black;&quot;&gt;■&lt;/span&gt;분산 처리(Distributed Processing) : 카프카는 파티션(Partition)이란 개념을 도입하여 여러개의 파티션을 서버들에 분산시켜 나누어 처리할 수 있습니다. 이로서 메세지를 상황에 맞추어 빠르게 처리할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-size: 18pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #1fda11;&quot;&gt;|&lt;/span&gt;&lt;span&gt; 아파치 카프카 사용 이유&lt;/span&gt;(The reason why we use kafka)&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&amp;nbsp;&lt;b&gt;병렬처리에 의한 데이터 처리율 향상&lt;/b&gt; : 카프카는 아래 보실 아키텍처에 보면 데이터를 병렬로 처리함으로서 데이터를 빠르고 효과적으로 처리할 수 있습니다. disk에 순차적으로 데이터를 적재하기 때문에 임의 접근(random access) 방식보다 훨씬 더 빠르게 데이터를 처리합니다.&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&lt;b&gt;데이터 유실 방지&lt;/b&gt; : disk에 적재되기 때문에 만약 불의의 사고로 서버가 다운되었을 시에도 데이터가 유실되는 일 없이 재시작하여 기존 데이터를 안정적으로 처리 가능합니다.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&lt;b&gt;클러스터링에 의한 고가용성 서비스&lt;/b&gt; : Scale-out이 가능하여 시스템 확장이 용이하며 어떤 하나 혹은 몇 개의 서버가 다운되도 서비스 자체가 중단될 일 없이 시스템이 운용가능합니다.&amp;nbsp;&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-size: 18pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #1fda11;&quot;&gt;|&lt;/span&gt; 아키텍처 및 구성(Architecture and Components) &lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;카프카 공식 문서에 나온 카프카를 나타내는 간단한 아키텍처입니다. (0.9.x 기준)&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;313&quot; data-origin-height=&quot;209&quot;&gt;&lt;span data-url=&quot;https://t1.daumcdn.net/cfile/tistory/99C4604A5C04D88805?original&quot; data-phocus=&quot;https://t1.daumcdn.net/cfile/tistory/99C4604A5C04D88805?original&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/99C4604A5C04D88805&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F99C4604A5C04D88805&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;313&quot; height=&quot;209&quot; data-origin-width=&quot;313&quot; data-origin-height=&quot;209&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;lt;출처: &lt;a href=&quot;https://kafka.apache.org/090/documentation.html&quot;&gt;https://kafka.apache.org/090/documentation.html&lt;/a&gt;&amp;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;b&gt;push&lt;/b&gt;하고 &lt;b&gt;pull&lt;/b&gt;하는 구조입니다. &lt;b&gt;Producer&lt;/b&gt;, &lt;b&gt;Consumer&lt;/b&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;692&quot; data-origin-height=&quot;530&quot;&gt;&lt;span data-url=&quot;https://t1.daumcdn.net/cfile/tistory/99725F4F5C04E42B35?original&quot; data-phocus=&quot;https://t1.daumcdn.net/cfile/tistory/99725F4F5C04E42B35?original&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/99725F4F5C04E42B35&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F99725F4F5C04E42B35&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;692&quot; height=&quot;530&quot; data-origin-width=&quot;692&quot; data-origin-height=&quot;530&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 data-ke-size=&quot;size16&quot;&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;span style=&quot;font-family: Arial Black;&quot;&gt;■프로듀서(Producer) : 데이터를 발생시키고 카프카 클러스터(Kafka Cluster)에 적재하는 프로세스입니다. &lt;/span&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;span style=&quot;font-family: Arial Black;&quot;&gt;■카프카 클러스터(Kafka Cluster) : 카프카 서버로 이루어진 클러스터를 말합니다. 카프카 클러스터를 이루는 각 요소는 다음과 같습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: Arial Black;&quot;&gt;&amp;nbsp;- 브로커(Broker) : 카프카 서버를 말합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: Arial Black;&quot;&gt;&amp;nbsp;- &lt;a class=&quot;tx-link&quot; href=&quot;http://engkimbs.tistory.com/660&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;주키퍼(Zookeeper)&lt;/a&gt; : 주키퍼(Zookeeper)는 분산 코디네이션 시스템입니다. 카프카 브로커를 하나의 클러스터로 코디네이팅하는 역할을 하며 나중에 이야기할 카프카 클러스터의 리더(Leader)를 발탁하는 방식도 주키퍼가 제공하는 기능을 이용합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: Arial Black;&quot;&gt;&amp;nbsp;- 토픽(Topic) : 카프카 클러스터에 데이터를&amp;nbsp;관리할 시&amp;nbsp;그 기준이 되는 개념입니다. 토픽은 카프카 클러스터에서 여러개 만들 수 있으며 하나의 토픽은 1개 이상의 파티션(Partition)으로 구성되어 있습니다. 어떤 데이터를 관리하는 하나의 그룹이라 생각하시면 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: Arial Black;&quot;&gt;&amp;nbsp;- 파티션(Partition)&amp;nbsp;: 각 토픽 당 데이터를 분산 처리하는 단위입니다. 카프카에서는 토픽 안에 파티션을 나누어 그 수대로 데이터를&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: 'Arial Black';&quot;&gt;분산처리합니다. 카프카 옵션에서 지정한&amp;nbsp;replica의 수만큼 파티션이 각 서버들에게 복제됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: Arial Black;&quot;&gt;&amp;nbsp;- 리더, 팔로워(Leader, Follower) : 카프카에서는 각 파티션당 복제된 파티션 중에서 하나의 리더가 선출됩니다. 이 리더는 모든 읽기, 쓰기 연산을 담당하게 됩니다. 리더를 제외한 나머지는 팔로워가 되고 이 팔로워들은 단순히 리더의 데이터를 복사하는 역할만 하게 됩니다.&lt;/span&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;span style=&quot;font-family: Arial Black;&quot;&gt;■컨슈머그룹(Consumer Group) : 컨슈머의 집합을 구성하는 단위입니다. 카프카에서는 컨슈머 그룹으로서 데이터를 처리하며 컨슈머 그룹 안의 컨슈머 수만큼 파티션의 데이터를 분산처리하게 됩니다.&lt;/span&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;b&gt;Producer&lt;/b&gt;가 데이터를 카프카에 적재하고 있으며 그 저장된 데이터를 &lt;b&gt;Consumer Group A&lt;/b&gt;와 &lt;b&gt;B&lt;/b&gt;가 각각 자신이 처리해야될 &lt;b&gt;Topic Foo&lt;/b&gt;와 &lt;b&gt;Bar&lt;/b&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;b&gt;Foo&lt;/b&gt;와 &lt;b&gt;Bar&lt;/b&gt;은 각각 3개의 파티션으로 나뉘어져 있으며 이 각각의 파티션들은 3개의 복제본으로 복제됩니다. 3개의 복제본 중에는 하나의 리더가 선출되게 되고(하늘색으로 칠해진 파티션) 이 리더가 모든 데이터의 읽기, 쓰기 연산을 담당하게 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;중요한 것은 이 파티션들은 운영 도중 그 수를 늘릴 수 있지만 &lt;b&gt;&lt;span style=&quot;color: #000000; background-color: #8cfccb;&quot;&gt;절대 줄일 수 없습니다&lt;/span&gt;&lt;/b&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;b&gt;&lt;span style=&quot;color: #000000; background-color: #8cfccb;&quot;&gt;컨슈머 그룹(Consumer Group)단위로 가져오게 됩니다&lt;/span&gt;&lt;/b&gt;. 이 컨슈머 그룹은 자신이 가져와야하는 토픽 안의 파티션의 데이터를 &lt;b&gt;Pull&lt;/b&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;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-size: 18pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #1fda11;&quot;&gt;|&lt;/span&gt; 파티션 읽기, 쓰기(Kafka Partition, Read, Write)&lt;/b&gt;&lt;/span&gt;&lt;/h3&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;728&quot; data-origin-height=&quot;412&quot;&gt;&lt;span data-url=&quot;https://t1.daumcdn.net/cfile/tistory/9975B44F5C04E3290F?original&quot; data-phocus=&quot;https://t1.daumcdn.net/cfile/tistory/9975B44F5C04E3290F?original&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/9975B44F5C04E3290F&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F9975B44F5C04E3290F&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;728&quot; height=&quot;413&quot; data-origin-width=&quot;728&quot; data-origin-height=&quot;412&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;b&gt;&lt;span style=&quot;color: #000000; background-color: #8cfccb;&quot;&gt;아파치 카프카에서의 쓰기, 읽기&lt;/span&gt;&lt;span style=&quot;color: #000000; background-color: #8cfccb;&quot;&gt;&amp;nbsp;연산은 카프카 클러스터 내의 리더 파티션들에게만 적용됩니다.&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;color: #000000; background-color: #8cfccb;&quot;&gt; &lt;/span&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;b&gt;Write&lt;/b&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;504&quot; data-origin-height=&quot;445&quot;&gt;&lt;span data-url=&quot;https://t1.daumcdn.net/cfile/tistory/9911C9475C04EAFA05?original&quot; data-phocus=&quot;https://t1.daumcdn.net/cfile/tistory/9911C9475C04EAFA05?original&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/9911C9475C04EAFA05&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F9911C9475C04EAFA05&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;504&quot; height=&quot;446&quot; data-origin-width=&quot;504&quot; data-origin-height=&quot;445&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위에서 언급했듯 카프카는 데이터를 순차적으로 디스크에 저장합니다. 따라서 프로듀서는 순차적으로 저장된 데이터 뒤에 붙이는 &lt;b&gt;append&lt;/b&gt; 형식으로 &lt;b&gt;write&lt;/b&gt; 연산을 진행하게 됩니다. 이 때 파티션들은 각각의 데이터들의 순차적인 집합인 &lt;b&gt;오프셋(offset)&lt;/b&gt;으로 구성되어 있습니다.&lt;/p&gt;
&lt;p style=&quot;float: none; text-align: center; clear: none;&quot; 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;624&quot; data-origin-height=&quot;421&quot;&gt;&lt;span data-url=&quot;https://t1.daumcdn.net/cfile/tistory/99BD59475C04E2D832?original&quot; data-phocus=&quot;https://t1.daumcdn.net/cfile/tistory/99BD59475C04E2D832?original&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/99BD59475C04E2D832&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F99BD59475C04E2D832&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;624&quot; height=&quot;421&quot; data-origin-width=&quot;624&quot; data-origin-height=&quot;421&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;컨슈머그룹의 각 컨슈머들은 파티션의 오프셋을 기준으로 데이터를 순차적으로 처리하게 됩니다. (먼저 들어온 순서부터)&amp;nbsp;중요한 것은, 컨슈머들은 컨슈머 그룹으로 나뉘어서 데이터를 분산 처리하게 되고 같은&amp;nbsp;컨슈머 그룹 내에 있는 컨슈머끼리 같은 파티션의 데이터를 처리할 수 없습니다. &amp;nbsp;&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;b&gt;(2.x 기준 default 7일)&lt;/b&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;656&quot; data-origin-height=&quot;297&quot;&gt;&lt;span data-url=&quot;https://t1.daumcdn.net/cfile/tistory/9983E5495C04EF1D19?original&quot; data-phocus=&quot;https://t1.daumcdn.net/cfile/tistory/9983E5495C04EF1D19?original&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/9983E5495C04EF1D19&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F9983E5495C04EF1D19&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;656&quot; height=&quot;297&quot; data-origin-width=&quot;656&quot; data-origin-height=&quot;297&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;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만일 컨슈머와 파티션의 개수가 같다면 컨슈머는 각 파티션을 1:1로 맡게 됩니다. 만일 컨슈머 그룹 안의 컨슈머의 개수가 파티션의 개수보다 적을 경우 컨슈머 중 하나가&amp;nbsp;남는 파티션의 데이터를 처리하게 됩니다. 눈여겨 볼 것은 만일 컨슈머의 개수가 파티션의&amp;nbsp; 개수보다 많을 경우 남는 컨슈머는 파티션이 개수가 많아질 때까지 대기하게 됩니다.&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 data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Language &amp;amp; Solution/Kafka</category>
      <category>Kafka</category>
      <category>아파치 카프카</category>
      <author>새로비</author>
      <guid isPermaLink="true">https://engkimbs.tistory.com/691</guid>
      <comments>https://engkimbs.tistory.com/entry/691#entry691comment</comments>
      <pubDate>Wed, 23 Mar 2022 13:53:56 +0900</pubDate>
    </item>
    <item>
      <title>Vue vs React</title>
      <link>https://engkimbs.tistory.com/entry/%EB%8D%B0%EC%9D%B4%ED%84%B0-%EC%97%94%EC%A7%80%EB%8B%88%EC%96%B4%EA%B0%80-%EC%93%B0%EB%A9%B4%EC%84%9C-%EB%8A%90%EB%82%80-Vue-vs-React</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;지금까지 회사에서 기존 flume, kafka 로 이루어진 데이터 파이프라이닝 구축하고 운영하면서 프론트 제작이 필요해지는 시점이 왔다.&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;Spring boot의 thymeleaf를 이용하는 부분도 고려해봤으나 이번에 프론트 기술 스택도 경험하고 및 프로덕트로 팔아볼만한 사이드 프로젝트 개발도 할 겸해서 Vue랑 React를 학습하기로 했다. 여담이지만 서버만 만지고서는 내가 혼자 서비스를 개발하기 참 어렵다. 어떤 서비스든 사용자에게 보여지는 화면이 있어야하는 데 그걸 잘 못하니ㅠ&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;둘 다 써보면서 (간단한 프로젝트 개발하는 정도) 느낀 점은 Vue가 훨씬 편했다. React 같은 경우는 개인적으로 느끼기에는 양방향 바인딩 같은 기본적인 기능을 구현하는 데 좀 더 신경을 써야되는 부분이 많았던 반면에 Vue는 model로 데이터를 바인딩만 해주면 되서 굉장히 개발시간이 단축되는 경험을 하였다.&amp;nbsp;&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;물론 React가 인기가 더 많고 native 모바일도 개발할 수 있는 등 범용성이 더 높지만 현재로서는 Vue를 가지고 쭉 프론트 개발을 진행할 것 같다.&amp;nbsp;&lt;/p&gt;</description>
      <author>새로비</author>
      <guid isPermaLink="true">https://engkimbs.tistory.com/1073</guid>
      <comments>https://engkimbs.tistory.com/entry/%EB%8D%B0%EC%9D%B4%ED%84%B0-%EC%97%94%EC%A7%80%EB%8B%88%EC%96%B4%EA%B0%80-%EC%93%B0%EB%A9%B4%EC%84%9C-%EB%8A%90%EB%82%80-Vue-vs-React#entry1073comment</comments>
      <pubDate>Sun, 9 Jan 2022 22:35:42 +0900</pubDate>
    </item>
    <item>
      <title>[Spring] 스프링 AOP (Spring AOP) 총정리 : 개념, 프록시 기반 AOP, @AOP</title>
      <link>https://engkimbs.tistory.com/entry/%EC%8A%A4%ED%94%84%EB%A7%81AOP</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;225&quot; data-origin-height=&quot;225&quot;&gt;&lt;span data-url=&quot;https://t1.daumcdn.net/cfile/tistory/99DD5B505C1B8A5B35?original&quot; data-phocus=&quot;https://t1.daumcdn.net/cfile/tistory/99DD5B505C1B8A5B35?original&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/99DD5B505C1B8A5B35&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F99DD5B505C1B8A5B35&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;225&quot; height=&quot;225&quot; data-origin-width=&quot;225&quot; data-origin-height=&quot;225&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-size: 18pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #1fda11;&quot;&gt;| &lt;/span&gt;스프링 AOP ( Aspect Oriented Programming )&lt;/b&gt;&lt;/span&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;b&gt;AOP&lt;/b&gt;는 &lt;b&gt;Aspect Oriented Programming&lt;/b&gt;의 약자로 &lt;b&gt;관점 지향 프로그래밍&lt;/b&gt;이라고 불린다. 관점 지향은 쉽게 말해 &lt;span style=&quot;background-color: #8cfccb; color: #000000;&quot;&gt;&lt;b&gt;어떤 로직을 기준으로 핵심적인 관점, 부가적인 관점으로 나누어서 보고 그 관점을 기준으로 각각&amp;nbsp;모듈화하겠다는 것이다&lt;/b&gt;&lt;/span&gt;. 여기서 모듈화란 어떤 공통된 로직이나 기능을 하나의 단위로 묶는 것을 말한다.&amp;nbsp;&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 data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;AOP&lt;/b&gt;에서 각 관점을 기준으로 로직을 모듈화한다는 것은 코드들을 부분적으로 나누어서 모듈화하겠다는 의미다. 이때, 소스 코드상에서&amp;nbsp;다른 부분에 계속 반복해서 쓰는 코드들을 발견할 수 있는 데 이것을 &lt;b&gt;흩어진 관심사 (Crosscutting Concerns)&lt;/b&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;443&quot; data-origin-height=&quot;500&quot;&gt;&lt;span data-url=&quot;https://t1.daumcdn.net/cfile/tistory/994AA3335C1B8C9D28?original&quot; data-phocus=&quot;https://t1.daumcdn.net/cfile/tistory/994AA3335C1B8C9D28?original&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/994AA3335C1B8C9D28&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F994AA3335C1B8C9D28&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;443&quot; height=&quot;500&quot; data-origin-width=&quot;443&quot; data-origin-height=&quot;500&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;b&gt;&lt;span style=&quot;background-color: #8cfccb; color: #000000;&quot;&gt;Aspect로 모듈화하고 핵심적인 비즈니스 로직에서 분리하여 재사용하겠다는 것이 AOP의 취지&lt;/span&gt;&lt;/b&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;b&gt;&lt;span style=&quot;font-size: 18pt;&quot;&gt;&lt;span style=&quot;color: #1fda11;&quot;&gt;|&lt;/span&gt; AOP 주요 개념&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Arial Black';&quot;&gt;Aspect : 위에서 설명한 흩어진 관심사를 모듈화 한 것. 주로 부가기능을 모듈화함.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Arial Black';&quot;&gt;Target : Aspect를 적용하는 곳 (클래스, 메서드 .. )&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Arial Black';&quot;&gt;Advice : 실질적으로 어떤 일을 해야할 지에 대한 것, 실질적인 부가기능을 담은 구현체&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Arial Black';&quot;&gt;JointPoint : Advice가 적용될 위치, 끼어들 수 있는 지점. 메서드 진입 지점, 생성자 호출 시점, 필드에서 값을 꺼내올 때 등 다양한 시점에 적용가능&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Arial Black';&quot;&gt;PointCut : JointPoint의 상세한 스펙을 정의한 것. 'A란 메서드의 진입 시점에 호출할 것'과 같이 더욱 구체적으로 Advice가 실행될 지점을 정할 수 있음&lt;/span&gt;&lt;/li&gt;
&lt;/ul&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;b&gt;&lt;span style=&quot;font-size: 18pt;&quot;&gt;&lt;span style=&quot;color: #1fda11;&quot;&gt;|&lt;/span&gt; 스프링 AOP 특징&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Arial Black';&quot;&gt;프록시 패턴 기반의 AOP 구현체, 프록시 객체를 쓰는 이유는 접근 제어 및 부가기능을 추가하기 위해서임&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Arial Black';&quot;&gt;스프링 빈에만 AOP를 적용 가능&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Arial Black';&quot;&gt;모든 AOP 기능을 제공하는 것이 아닌 스프링 IoC와 연동하여 엔터프라이즈 애플리케이션에서 가장 흔한 문제(중복코드, 프록시 클래스 작성의 번거로움, 객체들 간 관계 복잡도 증가 ...)에 대한 해결책을 지원하는 것이 목적&lt;/span&gt;&lt;/li&gt;
&lt;/ul&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;span style=&quot;font-size: 18pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #1fda11;&quot;&gt;| &lt;/span&gt;스프링 AOP : @AOP&lt;/b&gt;&lt;/span&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;b&gt;@AOP&lt;/b&gt;를 사용하기 위해서는 다음과 같은 의존성을 추가해야 한다.&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;xml&quot; style=&quot;background-color: #2b2b2b; color: #a9b7c6; font-family: '굴림체'; font-size: 9.0pt;&quot;&gt;&lt;code&gt;&amp;lt;dependency&amp;gt;
    &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;spring-boot-starter-aop&amp;lt;/artifactId&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;p data-ke-size=&quot;size16&quot;&gt;다음에는 아래와 같이 &lt;b&gt;@Aspect &lt;/b&gt;어노테이션을 붙여 이 클래스가 &lt;b&gt;Aspect&lt;/b&gt;를 나타내는 클래스라는 것을 명시하고 &lt;b&gt;@Component&lt;/b&gt;를 붙여 스프링 빈으로 등록한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #bbb529;&quot;&gt;@Component&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #bbb529;&quot;&gt;@Aspect&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;public class &lt;/span&gt;PerfAspect {&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #bbb529;&quot;&gt;@Around&lt;/span&gt;(&lt;span style=&quot;color: #6a8759;&quot;&gt;&quot;execution(* com.saelobi..*.EventService.*(..))&quot;&lt;/span&gt;)&lt;br /&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;public &lt;/span&gt;Object &lt;span style=&quot;color: #ffc66d;&quot;&gt;logPerf&lt;/span&gt;(ProceedingJoinPoint pjp) &lt;span style=&quot;color: #cc7832;&quot;&gt;throws &lt;/span&gt;Throwable{&lt;br /&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;long &lt;/span&gt;begin = System.&lt;span style=&quot;font-style: italic;&quot;&gt;currentTimeMillis&lt;/span&gt;()&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt; &lt;/span&gt;Object retVal = pjp.proceed()&lt;span style=&quot;color: #cc7832;&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;// 메서드 호출 자체를 감쌈&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt; &lt;/span&gt;System.&lt;span style=&quot;color: #9876aa; font-style: italic;&quot;&gt;out&lt;/span&gt;.println(System.&lt;span style=&quot;font-style: italic;&quot;&gt;currentTimeMillis&lt;/span&gt;() - begin)&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt; return &lt;/span&gt;retVal&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt; &lt;/span&gt;}&lt;span style=&quot;color: #808080;&quot;&gt;&lt;br /&gt;&lt;/span&gt;}&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;@Around &lt;/b&gt;어노테이션은 타겟 메서드를 감싸서 특정 &lt;b&gt;Advice&lt;/b&gt;를 실행한다는 의미이다. 위 코드의 &lt;b&gt;Advice&lt;/b&gt;는 타겟 메서드가 실행된 시간을 측정하기 위한 로직을 구현하였다. 추가적으로 &lt;b&gt;execution(* com.saelobi..*.EventService.*(..))&lt;/b&gt;가 의미하는 바는 &lt;b&gt;com.saelobi &lt;/b&gt;아래의 패키지 경로의 &lt;b&gt;EventService &lt;/b&gt;객체의 모든 메서드에 이 &lt;b&gt;Aspect&lt;/b&gt;를 적용하겠다는 의미다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;routeros&quot; style=&quot;background-color: #2b2b2b; color: #a9b7c6; font-family: '굴림체'; font-size: 9.0pt;&quot;&gt;&lt;code&gt;public interface EventService {

    void createEvent();

    void publishEvent();

    void deleteEvent();
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;java&quot; style=&quot;background-color: #2b2b2b; color: #a9b7c6; font-family: '굴림체'; font-size: 9.0pt;&quot;&gt;&lt;code&gt;@Component
public class SimpleEventService implements EventService {

    @Override
    public void createEvent() {
        try {
            Thread.sleep(1000);
        } catch(InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(&quot;Created an event&quot;);
    }

    @Override
    public void publishEvent() {
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e){
            e.printStackTrace();;
        }
        System.out.println(&quot;Published an event&quot;);
    }

    public void deleteEvent() {
        System.out.println(&quot;Delete an event&quot;);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;java&quot; style=&quot;background-color: #2b2b2b; color: #a9b7c6; font-family: '굴림체'; font-size: 9.0pt;&quot;&gt;&lt;code&gt;@Service
public class AppRunner implements ApplicationRunner {

    @Autowired
    EventService eventService;

    @Override
    public void run(ApplicationArguments args) throws Exception {
        eventService.createEvent();
        eventService.publishEvent();
        eventService.deleteEvent();
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;oxygene&quot; style=&quot;background-color: #2b2b2b; color: #a9b7c6; font-family: '굴림체'; font-size: 9.0pt;&quot;&gt;&lt;code&gt;Created an event
1003
Published an event
1000
Delete an event
0&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;또한 경로지정 방식말고 특정 어노테이션이 붙은 포인트에 해당 &lt;b&gt;Aspect&lt;/b&gt;를 실행할 수 있는 기능도 제공한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #bbb529;&quot;&gt;@Component&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #bbb529;&quot;&gt;@Aspect&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;public class &lt;/span&gt;PerfAspect {&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #bbb529;&quot;&gt;@Around&lt;/span&gt;(&lt;span style=&quot;color: #6a8759;&quot;&gt;&quot;@annotation(PerLogging)&quot;&lt;/span&gt;)&lt;br /&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;public &lt;/span&gt;Object &lt;span style=&quot;color: #ffc66d;&quot;&gt;logPerf&lt;/span&gt;(ProceedingJoinPoint pjp) &lt;span style=&quot;color: #cc7832;&quot;&gt;throws &lt;/span&gt;Throwable{&lt;br /&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;long &lt;/span&gt;begin = System.&lt;span style=&quot;font-style: italic;&quot;&gt;currentTimeMillis&lt;/span&gt;()&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt; &lt;/span&gt;Object retVal = pjp.proceed()&lt;span style=&quot;color: #cc7832;&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;// 메서드 호출 자체를 감쌈&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt; &lt;/span&gt;System.&lt;span style=&quot;color: #9876aa; font-style: italic;&quot;&gt;out&lt;/span&gt;.println(System.&lt;span style=&quot;font-style: italic;&quot;&gt;currentTimeMillis&lt;/span&gt;() - begin)&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt; return &lt;/span&gt;retVal&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt; &lt;/span&gt;}&lt;span style=&quot;color: #808080;&quot;&gt;&lt;br /&gt;&lt;/span&gt;}&lt;/p&gt;
&lt;pre class=&quot;less&quot; style=&quot;background-color: #2b2b2b; color: #a9b7c6; font-family: '굴림체'; font-size: 9.0pt;&quot;&gt;&lt;code&gt;@Target(ElementType.METHOD)
@Retention(RetentionPolicy.CLASS)
public @interface PerLogging {
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;java&quot; style=&quot;background-color: #2b2b2b; color: #a9b7c6; font-family: '굴림체'; font-size: 9.0pt;&quot;&gt;&lt;code&gt;@Component
public class SimpleEventService implements EventService {

    @PerLogging
    @Override
    public void createEvent() {
        try {
            Thread.sleep(1000);
        } catch(InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(&quot;Created an event&quot;);
    }

    @Override
    public void publishEvent() {
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e){
            e.printStackTrace();;
        }
        System.out.println(&quot;Published an event&quot;);
    }

    @PerLogging
    @Override
    public void deleteEvent() {
        System.out.println(&quot;Delete an event&quot;);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;oxygene&quot; style=&quot;background-color: #2b2b2b; color: #a9b7c6; font-family: '굴림체'; font-size: 9.0pt;&quot;&gt;&lt;code&gt;Created an event
1003
Published an event
Delete an event
0&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 출력 결과에서&lt;b&gt; @PerLogging &lt;/b&gt;어노테이션이 붙은 메서드만 &lt;b&gt;Aspect&lt;/b&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;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #bbb529;&quot;&gt;@Component&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #bbb529;&quot;&gt;@Aspect&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;public class &lt;/span&gt;PerfAspect {&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #bbb529;&quot;&gt;@Around&lt;/span&gt;(&lt;span style=&quot;color: #6a8759;&quot;&gt;&quot;bean(simpleEventService)&quot;&lt;/span&gt;)&lt;br /&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;public &lt;/span&gt;Object &lt;span style=&quot;color: #ffc66d;&quot;&gt;logPerf&lt;/span&gt;(ProceedingJoinPoint pjp) &lt;span style=&quot;color: #cc7832;&quot;&gt;throws &lt;/span&gt;Throwable{&lt;br /&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;long &lt;/span&gt;begin = System.&lt;span style=&quot;font-style: italic;&quot;&gt;currentTimeMillis&lt;/span&gt;()&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt; &lt;/span&gt;Object retVal = pjp.proceed()&lt;span style=&quot;color: #cc7832;&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;// 메서드 호출 자체를 감쌈&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt; &lt;/span&gt;System.&lt;span style=&quot;color: #9876aa; font-style: italic;&quot;&gt;out&lt;/span&gt;.println(System.&lt;span style=&quot;font-style: italic;&quot;&gt;currentTimeMillis&lt;/span&gt;() - begin)&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt; return &lt;/span&gt;retVal&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt; &lt;/span&gt;}&lt;span style=&quot;color: #808080;&quot;&gt;&lt;br /&gt;&lt;/span&gt;}&lt;/p&gt;
&lt;pre class=&quot;java&quot; style=&quot;background-color: #2b2b2b; color: #a9b7c6; font-family: '굴림체'; font-size: 9.0pt;&quot;&gt;&lt;code&gt;@Component
public class SimpleEventService implements EventService {

    @Override
    public void createEvent() {
        try {
            Thread.sleep(1000);
        } catch(InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(&quot;Created an event&quot;);
    }

    @Override
    public void publishEvent() {
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e){
            e.printStackTrace();;
        }
        System.out.println(&quot;Published an event&quot;);
    }
    
    @Override
    public void deleteEvent() {
        System.out.println(&quot;Delete an event&quot;);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;java&quot; style=&quot;background-color: #2b2b2b; color: #a9b7c6; font-family: '굴림체'; font-size: 9.0pt;&quot;&gt;&lt;code&gt;@Service
public class AppRunner implements ApplicationRunner {

    @Autowired
    EventService eventService;

    @Override
    public void run(ApplicationArguments args) throws Exception {
        eventService.createEvent();
        eventService.publishEvent();
        eventService.deleteEvent();
    } }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Created an event&lt;br /&gt;&lt;span style=&quot;color: #6897bb;&quot;&gt;1002&lt;br /&gt;&lt;/span&gt;Published an event&lt;br /&gt;&lt;span style=&quot;color: #6897bb;&quot;&gt;1001&lt;br /&gt;&lt;/span&gt;Delete an event&lt;br /&gt;&lt;span style=&quot;color: #6897bb;&quot;&gt;0&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 출력결과로 &lt;b&gt;SimpleEventService&lt;/b&gt;의 모든 메서드에 해당 &lt;b&gt;Aspect&lt;/b&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;b&gt;@Around&lt;/b&gt; 외에 타겟 메서드의 &lt;b&gt;Aspect &lt;/b&gt;실행 시점을 지정할 수 있는 어노테이션이 있다.&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Arial Black';&quot;&gt;@Before (이전) : 어드바이스 타겟 메소드가 호출되기 전에 어드바이스 기능을 수행&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Arial Black';&quot;&gt;@After (이후) : 타겟 메소드의 결과에 관계없이(즉 성공, 예외 관계없이) 타겟 메소드가 완료 되면 어드바이스 기능을 수행&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Arial Black';&quot;&gt;@AfterReturning (정상적 반환 이후)타겟 메소드가 성공적으로 결과값을 반환 후에 어드바이스 기능을 수행&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Arial Black';&quot;&gt;@AfterThrowing (예외 발생 이후) : 타겟 메소드가 수행 중 예외를 던지게 되면 어드바이스 기능을 수행&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Arial Black';&quot;&gt;@Around (메소드 실행 전후) : 어드바이스가 타겟 메소드를 감싸서 타겟 메소드 호출전과 후에 어드바이스 기능을 수행&lt;/span&gt;&lt;/li&gt;
&lt;/ul&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;https://www.inflearn.com/course/spring-framework_core&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 data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Spring/Spring 입문 - 개념 및 핵심</category>
      <category>Spring</category>
      <author>새로비</author>
      <guid isPermaLink="true">https://engkimbs.tistory.com/746</guid>
      <comments>https://engkimbs.tistory.com/entry/%EC%8A%A4%ED%94%84%EB%A7%81AOP#entry746comment</comments>
      <pubDate>Sun, 9 Jan 2022 22:16:49 +0900</pubDate>
    </item>
    <item>
      <title>청주 복대동, 가경동, 율량지구 임장 후기</title>
      <link>https://engkimbs.tistory.com/entry/%EC%B2%AD%EC%A3%BC-%EB%B3%B5%EB%8C%80%EB%8F%99-%EA%B0%80%EA%B2%BD%EB%8F%99-%EC%9C%A8%EB%9F%89%EC%A7%80%EA%B5%AC-%EC%9E%84%EC%9E%A5-%ED%9B%84%EA%B8%B0</link>
      <description>&lt;p&gt;&lt;/p&gt;&lt;p &gt;&lt;b&gt;&lt;a name=&quot;_Hlk36974105&quot;&gt;&lt;/a&gt;&lt;span style=&quot;font-size: 18pt;&quot;&gt;청주 임장 후기&lt;/span&gt;&lt;/b&gt;&lt;span &gt;&lt;/span&gt;&lt;/p&gt;

&lt;p &gt;&lt;span &gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;

&lt;p &gt;오늘은
기분전환도 할 겸&lt;span &gt;, &lt;/span&gt;청주로 임장을 떠나보았습니다&lt;span &gt;. &lt;/span&gt;한 때
갭투자자들의 성지였던 청주는 그동안 엄청난 물량 공급과 주변 세종시의 영향으로 가격이 지지부진 하였는데 청주의 앞으로의 모습은 어떨까 궁금한 마음에
한 걸음에 달려가 보았습니다&lt;span &gt;!!&lt;/span&gt;&lt;/p&gt;

&lt;p &gt;&lt;span &gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;

&lt;p &gt;&lt;span &gt;[&lt;/span&gt;청주 임장 후기 &lt;span &gt;1&lt;/span&gt;탄
&lt;span &gt;– 2019.10&lt;/span&gt;월 청주 복대동 방문 후기&lt;span &gt;]&lt;/span&gt;&lt;/p&gt;

&lt;p &gt;&lt;span &gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;

&lt;p &gt;지난 &lt;span &gt;10&lt;/span&gt;월&lt;span &gt;, &lt;/span&gt;복대동 두산
지웰위브 &lt;span &gt;2&lt;/span&gt;차를 중심으로 부동산 탐방을 다녀 온 뒤&lt;span &gt;, &lt;/span&gt;두
번째 방문입니다&lt;span &gt;.&lt;/span&gt;&lt;/p&gt;

&lt;p &gt;&lt;span &gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;

&lt;p &gt;먼저&lt;span &gt;, &lt;/span&gt;지난 방문을 간략하게 복귀해보자면 &lt;span &gt;SK&lt;/span&gt;하이닉스를 비롯한 대한민국 굴지의 대기업이 대농지구를 중심으로 뒷편에 자리잡고 있으며&lt;span &gt;, &lt;/span&gt;그 앞에 바로 &lt;span &gt;1&lt;/span&gt;차 신영지웰시티 아파트와 지웰두산위브가 자리잡고
있습니다&lt;span &gt;.&lt;/span&gt;&lt;/p&gt;

&lt;p &gt;&lt;span &gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;

&lt;p &gt;첫 방문 당시&lt;span &gt;, &lt;/span&gt;지웰시티몰과 현대백화점 같은 슬리퍼 상권 형성이 너무
잘 되어 있지만&lt;span &gt;, &lt;/span&gt;그럼에도 불구하고&lt;span &gt;, &lt;/span&gt;공장이 이렇게 밀집되어
있는데 소음이나 공해 때문에 사람들이 선호할까&lt;span &gt;? &lt;/span&gt;라는 저의 얕은 지식을 후회해 봅니다&lt;span &gt;…&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 598px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/9978FB345E92CDF903&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F9978FB345E92CDF903&quot; width=&quot;598&quot; height=&quot;447&quot; filename=&quot;캡처_2020_04_12_17_12_42_856.png&quot; filemime=&quot;image/jpeg&quot; style=&quot;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 593px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/9951E3385E92CE1D21&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F9951E3385E92CE1D21&quot; width=&quot;593&quot; height=&quot;421&quot; filename=&quot;캡처_2020_04_12_17_12_48_314.png&quot; filemime=&quot;image/jpeg&quot; style=&quot;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p &gt;아래 호갱 노노에서 &lt;span &gt;2019.10&lt;/span&gt;월 대비&lt;span &gt; 2020.04&lt;/span&gt;월 자료입니다&lt;span &gt;. &lt;/span&gt;&lt;/p&gt;&lt;p &gt;&lt;span &gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p &gt;전세가는 오히려 주변의 공급물량 영향으로 약간 떨어진 반면&lt;span &gt;, &lt;/span&gt;매매가는
&lt;span &gt;6&lt;/span&gt;개월 조금 넘는 기간동안&lt;span &gt;, 20%&lt;/span&gt;가량 상승하였네요&lt;span &gt;.&lt;/span&gt;&lt;/p&gt;&lt;p &gt;&lt;span &gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p  style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 360px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/99AE7C385E92CE302E&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F99AE7C385E92CE302E&quot; width=&quot;360&quot; height=&quot;870&quot; filename=&quot;캡처_2020_04_12_17_12_57_353.png&quot; filemime=&quot;image/jpeg&quot; style=&quot;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p &gt;&lt;span &gt;수많은 부동산 책을 읽어보면 강조하는 공통된 내용이 나무가 아닌 숲을 봐야 한다는 점입니다&lt;span &gt;. &lt;/span&gt;그 지역이 오르면 너도 나도 살고 싶어하는 좋은 입지에 자리잡은 랜드마크 아파트를 중심으로 꽃이 봉우리를 싹트고&lt;span &gt;, &lt;/span&gt;개화하듯 퍼져 나갑니다&lt;span &gt;.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p &gt;&lt;span &gt;&lt;/span&gt;&lt;/p&gt;&lt;p &gt;&lt;span &gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p &gt;&lt;span &gt;&lt;/span&gt;&lt;/p&gt;&lt;p &gt;그래서 오늘은 복대동 지웰이 과연 청주 상승의 신호탄이었는가&lt;span &gt;? &lt;/span&gt;이
주변 분위기는 어떨까&lt;span &gt;? &lt;/span&gt;라는 의문을 가지고 주변 일대 가경동 아파트와 분위기를 살펴보러 가보았습니다&lt;span &gt;.&lt;/span&gt;&lt;/p&gt;&lt;p &gt;&lt;span &gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p &gt;&lt;span &gt;&lt;b&gt;&lt;span style=&quot;font-size: 18pt;&quot;&gt;임장 루트&lt;/span&gt;&lt;/b&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p &gt;&lt;span &gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p  style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 601px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/994886355E92CE5737&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F994886355E92CE5737&quot; width=&quot;601&quot; height=&quot;403&quot; filename=&quot;캡처_2020_04_12_17_13_12_681.png&quot; filemime=&quot;image/jpeg&quot; style=&quot;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p &gt;&lt;span &gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p &gt;경로&lt;span &gt;: &lt;/span&gt;가경 아이파크 &lt;span &gt;2&lt;/span&gt;단지
&lt;span &gt;-&amp;gt; &lt;/span&gt;가경푸르지오 &lt;span &gt;-&amp;gt; &lt;/span&gt;가경 뜨란채 &lt;span &gt;7,8&lt;/span&gt;단지 &lt;span &gt;-&amp;gt; &lt;/span&gt;가경주공 &lt;span &gt;2&lt;/span&gt;단지
&lt;span &gt;&lt;/span&gt;&lt;/p&gt;&lt;p &gt;&lt;span &gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p &gt;가경동 아이파크 시리즈&lt;span &gt;!!! &lt;/span&gt;올해 &lt;span &gt;2&lt;/span&gt;차까지
입주를 완료하였고&lt;span &gt;, 2020&lt;/span&gt;년 &lt;span &gt;9&lt;/span&gt;월에 &lt;span &gt;5&lt;/span&gt;단지까지 청약이 진행될 예정이다&lt;span &gt;. &lt;/span&gt;과연&lt;span &gt;, 1&lt;/span&gt;군 건설사 답게 고급스러운 외관과 시설이 잘 갖추어져 있었다&lt;span &gt;. &lt;/span&gt;&lt;/p&gt;&lt;p &gt;투자를 할 때&lt;span &gt;, &lt;/span&gt;중요하게 생각하는 것 중 하나가 내가 살고 싶은 생각이
드는지 여부이다&lt;span &gt;. &lt;/span&gt;이 곳은 단지 내 조경과 커뮤니티 시설이 잘 갖추어져 있어&lt;span &gt;, &lt;/span&gt;신혼 부부는 물론 아이들 키우기에도 너무 좋을 거 같다&lt;span &gt;!!! &lt;/span&gt;아이파크
&lt;span &gt;2&lt;/span&gt;단지를 돌면서 옆 &lt;span &gt;3&lt;/span&gt;단지 공사 현장을 보니 순항하고 있었다&lt;span &gt;.&lt;/span&gt;&lt;/p&gt;&lt;p &gt;&lt;span &gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p &gt;&lt;span &gt;









&lt;/span&gt;&lt;/p&gt;&lt;p &gt;차를 타고&lt;span &gt;, &lt;/span&gt;가경 푸르지오로 이동하였다&lt;span &gt;. &lt;/span&gt;중대형 평형 위주의 공급으로 바로 홈플러스와 학원을 이용하기 편할 만큼 동네 상권이 잘 형성되어 있었다&lt;span &gt;. &lt;/span&gt;중간에 뜨란채 &lt;span &gt;7&lt;/span&gt;단지와 가경 주공&lt;span &gt;4&lt;/span&gt;단지
및 &lt;span &gt;2&lt;/span&gt;단지를 경유하였는데&lt;span &gt;, &lt;/span&gt;구축이지만 홈플러스를 비롯하여&lt;span &gt;, &lt;/span&gt;동네 자체가 안정적인 상권과 학원가가 형성되어 있다는 느낌을 받았다&lt;span &gt;.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;p &gt;&lt;span style=&quot;background:yellow;mso-highlight:yellow&quot;&gt;가경 아이파크
&lt;span &gt;2&lt;/span&gt;차&lt;/span&gt; &lt;span &gt;&lt;/span&gt;&lt;/p&gt;&lt;p &gt;&lt;span style=&quot;background:yellow;mso-highlight:yellow&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 522px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/99C7CF395E92CE6D35&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F99C7CF395E92CE6D35&quot; width=&quot;522&quot; height=&quot;394&quot; filename=&quot;캡처_2020_04_12_17_13_19_857.png&quot; filemime=&quot;image/jpeg&quot; style=&quot;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;p &gt;&lt;span style=&quot;background:yellow;mso-highlight:yellow&quot;&gt;가경 푸르지오&lt;span &gt;&amp;amp; &lt;/span&gt;가경주공&lt;span &gt;4&lt;/span&gt;단지에서 보이는 홈플러스&lt;/span&gt;&lt;span &gt;&lt;span style=&quot;mso-spacerun:yes&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 522px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/991CBA335E92CE7D32&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F991CBA335E92CE7D32&quot; width=&quot;522&quot; height=&quot;346&quot; filename=&quot;캡처_2020_04_12_17_13_22_950.png&quot; filemime=&quot;image/jpeg&quot; style=&quot;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p &gt;&lt;span style=&quot;background:yellow;mso-highlight:yellow&quot;&gt;뜨란채 &lt;span &gt;7&lt;/span&gt;단지 및 &lt;span &gt;8&lt;/span&gt;단지&lt;/span&gt;&lt;span &gt;&lt;span style=&quot;mso-spacerun:yes&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p &gt;&lt;span &gt;&lt;span style=&quot;mso-spacerun:yes&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p  style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 537px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/99DF453C5E92CE8D34&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F99DF453C5E92CE8D34&quot; width=&quot;537&quot; height=&quot;400&quot; filename=&quot;캡처_2020_04_12_17_13_28_953.png&quot; filemime=&quot;image/jpeg&quot; style=&quot;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p &gt;&lt;span &gt;&lt;span style=&quot;mso-spacerun:yes&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p  style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 603px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/9989453D5E92CEA230&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F9989453D5E92CEA230&quot; width=&quot;603&quot; height=&quot;524&quot; filename=&quot;캡처_2020_04_12_17_13_35_596.png&quot; filemime=&quot;image/jpeg&quot; style=&quot;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p &gt;&lt;span &gt;&lt;span style=&quot;mso-spacerun:yes&quot;&gt;&lt;/span&gt;&lt;span style=&quot;background-color: yellow; font-family: &amp;quot;맑은 고딕&amp;quot;; font-size: 10pt;&quot;&gt;서경초&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p &gt;&lt;span &gt;&lt;span style=&quot;background-color: yellow; font-family: &amp;quot;맑은 고딕&amp;quot;; font-size: 10pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p  style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 444px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/991DE4415E92CEB301&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F991DE4415E92CEB301&quot; width=&quot;444&quot; height=&quot;329&quot; filename=&quot;캡처_2020_04_12_17_13_46_199.png&quot; filemime=&quot;image/jpeg&quot; style=&quot;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p  style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p &gt;&lt;span style=&quot;background:yellow;mso-highlight:yellow&quot;&gt;율량 &lt;span &gt;2&lt;/span&gt;지구&lt;/span&gt;&lt;span &gt;&lt;/span&gt;&lt;/p&gt;&lt;p &gt;&lt;span style=&quot;background:yellow;mso-highlight:yellow&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p  style=&quot;text-align: center; clear: none; float: none;&quot;&gt;

&lt;/p&gt;&lt;p &gt;가경동을 거쳐&lt;span &gt;, &lt;/span&gt;우리가 이동한 곳은 율량&lt;span &gt;2&lt;/span&gt;지구이다&lt;span &gt;. &lt;/span&gt;율량&lt;span &gt; 2&lt;/span&gt;지구의
주요 일자리는 오창산업단지에서 &lt;span &gt;20&lt;/span&gt;분 거리에 위치에 있으며&lt;span &gt;, &lt;/span&gt;국도
혹은 오창 &lt;span &gt;IC&lt;/span&gt;를 거쳐 서울로 가기에 교통도 편리하다&lt;span &gt;.&lt;/span&gt;&lt;/p&gt;&lt;p &gt;&lt;span &gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p &gt;&lt;span &gt;&lt;/span&gt;&lt;/p&gt;&lt;p &gt;율량&lt;span &gt;2&lt;/span&gt;지구는 주중동&lt;span &gt;, &lt;/span&gt;주성동&lt;span &gt;, &lt;/span&gt;율량동 일대를 개발한 곳이며 도시 전체가 &lt;span &gt;2006&lt;/span&gt;년부터 개발이 시작되어
깨끗한 신도시의 느낌이 난다&lt;span &gt;.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p &gt;&lt;span &gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p  style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 594px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/998212415E92CEB437&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F998212415E92CEB437&quot; width=&quot;594&quot; height=&quot;306&quot; filename=&quot;캡처_2020_04_12_17_13_56_882.png&quot; filemime=&quot;image/jpeg&quot; style=&quot;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p  style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p  style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 594px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/995805415E92CEB405&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F995805415E92CEB405&quot; width=&quot;594&quot; height=&quot;382&quot; filename=&quot;캡처_2020_04_12_17_14_03_686.png&quot; filemime=&quot;image/jpeg&quot; style=&quot;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p  style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p  style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 594px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/995807415E92CEB505&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F995807415E92CEB505&quot; width=&quot;594&quot; height=&quot;726&quot; filename=&quot;캡처_2020_04_12_17_14_10_305.png&quot; filemime=&quot;image/jpeg&quot; style=&quot;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p  style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p  style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 629px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/9936D4415E92CEB506&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F9936D4415E92CEB506&quot; width=&quot;629&quot; height=&quot;467&quot; filename=&quot;캡처_2020_04_12_17_14_16_144.png&quot; filemime=&quot;image/jpeg&quot; style=&quot;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p  style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p &gt;&lt;span style=&quot;background:yellow;mso-highlight:yellow&quot;&gt;율량 &lt;span &gt;2&lt;/span&gt;지구 주중동&lt;span &gt;&amp;amp;&lt;/span&gt;주성동 상권&lt;/span&gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p &gt;&lt;span &gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p  style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 589px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/997C3A415E92CEB504&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F997C3A415E92CEB504&quot; width=&quot;589&quot; height=&quot;443&quot; filename=&quot;캡처_2020_04_12_17_14_22_401.png&quot; filemime=&quot;image/jpeg&quot; style=&quot;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p  style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p  style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 589px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/99E613415E92CEB62E&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F99E613415E92CEB62E&quot; width=&quot;589&quot; height=&quot;443&quot; filename=&quot;캡처_2020_04_12_17_14_25_574.png&quot; filemime=&quot;image/jpeg&quot; style=&quot;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p  style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p  style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p &gt;&lt;span style=&quot;background:yellow;mso-highlight:yellow&quot;&gt;주중동 대원칸타빌&lt;span &gt; 2&lt;/span&gt;차&lt;/span&gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p &gt;&lt;span &gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p  style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 598px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/990F19415E92CEB607&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F990F19415E92CEB607&quot; width=&quot;598&quot; height=&quot;414&quot; filename=&quot;캡처_2020_04_12_17_14_31_950.png&quot; filemime=&quot;image/jpeg&quot; style=&quot;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p &gt;&lt;span &gt;&lt;span style=&quot;background-color: yellow; font-family: &amp;quot;맑은 고딕&amp;quot;; font-size: 10pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p &gt;&lt;span &gt;&lt;span style=&quot;background-color: yellow; font-family: &amp;quot;맑은 고딕&amp;quot;; font-size: 10pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p &gt;&lt;span &gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoListParagraph&quot; style=&quot;margin-left:38.0pt;mso-para-margin-left:0gd;
text-indent:-18.0pt;mso-list:l0 level1 lfo1&quot;&gt;&lt;!--[if !supportLists]--&gt;&lt;span &gt;1.&lt;span style=&quot;font-variant-numeric: normal; font-variant-east-asian: normal; font-stretch: normal; font-size: 7pt; line-height: normal; font-family: &amp;quot;Times New Roman&amp;quot;;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;주중동 &lt;span &gt;: &lt;/span&gt;주성동과 큰 도로를 사이로 상권 및
학원가 형성되어 있음&lt;span &gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoListParagraph&quot; style=&quot;margin-left:38.0pt;mso-para-margin-left:0gd;
text-indent:-18.0pt;mso-list:l0 level1 lfo1&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p  style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 438px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/999D9C375E92CF0B2E&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F999D9C375E92CF0B2E&quot; width=&quot;438&quot; height=&quot;385&quot; filename=&quot;캡처_2020_04_12_17_19_02_953.png&quot; filemime=&quot;image/jpeg&quot; style=&quot;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p  style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p &gt;&lt;span &gt;2. &lt;/span&gt;주성동&lt;span &gt;&lt;/span&gt;&lt;/p&gt;&lt;p  style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 464px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/9989F8375E92CF0B2A&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F9989F8375E92CF0B2A&quot; width=&quot;464&quot; height=&quot;385&quot; filename=&quot;캡처_2020_04_12_17_19_07_261.png&quot; filemime=&quot;image/jpeg&quot; style=&quot;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p  style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p &gt;&lt;span &gt;3.&lt;/span&gt;율량동 &lt;span &gt;: &lt;/span&gt;주중&lt;span &gt;, &lt;/span&gt;주성동과 비교해 비교적 연식이 찬 아파트들이 밀집 되어 있음&lt;span &gt;&lt;/span&gt;&lt;/p&gt;&lt;p &gt;&lt;br /&gt;&lt;/p&gt;&lt;p  style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 534px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/996008375E92CF0B2F&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F996008375E92CF0B2F&quot; width=&quot;534&quot; height=&quot;339&quot; filename=&quot;캡처_2020_04_12_17_19_11_822.png&quot; filemime=&quot;image/jpeg&quot; style=&quot;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p &gt;&lt;span &gt;&lt;span style=&quot;background-color: yellow; font-family: &amp;quot;맑은 고딕&amp;quot;; font-size: 10pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;</description>
      <category>부동산/입지 분석</category>
      <category>부동산</category>
      <author>새로비</author>
      <guid isPermaLink="true">https://engkimbs.tistory.com/968</guid>
      <comments>https://engkimbs.tistory.com/entry/%EC%B2%AD%EC%A3%BC-%EB%B3%B5%EB%8C%80%EB%8F%99-%EA%B0%80%EA%B2%BD%EB%8F%99-%EC%9C%A8%EB%9F%89%EC%A7%80%EA%B5%AC-%EC%9E%84%EC%9E%A5-%ED%9B%84%EA%B8%B0#entry968comment</comments>
      <pubDate>Sun, 12 Apr 2020 17:20:10 +0900</pubDate>
    </item>
    <item>
      <title>[파이썬 크롤링/부동산 데이터] scrapy를 이용하여 부동산 공공 데이터 DB에 저장하기</title>
      <link>https://engkimbs.tistory.com/entry/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%ED%81%AC%EB%A1%A4%EB%A7%81%EB%B6%80%EB%8F%99%EC%82%B0-%EB%8D%B0%EC%9D%B4%ED%84%B0-scrapy%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%98%EC%97%AC-%EB%B6%80%EB%8F%99%EC%82%B0-%EA%B3%B5%EA%B3%B5-%EB%8D%B0%EC%9D%B4%ED%84%B0-DB%EC%97%90-%EC%A0%80%EC%9E%A5%ED%95%98%EA%B8%B0</link>
      <description>&lt;p&gt;&lt;span style=&quot;font-size: 18pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(31, 218, 17);&quot;&gt;|&lt;/span&gt;&amp;nbsp;들어가기 전에&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://github.com/Lucorda/python-tutorial&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;GIT 저장소&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;지금 포스팅은 국토교통부에서 제공하는 부동산 공공데이터 API를 사용합니다. 아래 포스팅&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;을 보시고 먼저 부동산 공공데이터 API를 신청해주시길 바래요!&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://engkimbs.tistory.com/899&quot; target=&quot;_blank&quot;&gt;[유용한 정보들] - 국토교통부 공공데이터 부동산 실거래가 API 신청 방법&lt;/a&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;이전 포스팅&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://engkimbs.tistory.com/961&quot; target=&quot;_blank&quot;&gt;[파이썬/파이썬 웹 크롤링 - 부동산 공공데이터] - [파이썬 크롤링/부동산 데이터] 스크래피(scrapy) startproject로 초기 프로젝트 구성하기&lt;/a&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://engkimbs.tistory.com/962&quot; target=&quot;_blank&quot;&gt;[파이썬/파이썬 웹 크롤링 - 부동산 공공데이터] - [파이썬 크롤링/부동산 데이터] scrapy를 이용한 부동산 공공 데이터 간단하게 받아오기&lt;/a&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://engkimbs.tistory.com/963&quot; target=&quot;_blank&quot;&gt;[파이썬/파이썬 웹 크롤링 - 부동산 공공데이터] - [파이썬 크롤링/부동산 데이터] scrapy를 이용한 부동산 공공 데이터 파싱 및 추출하기&lt;/a&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://engkimbs.tistory.com/964&quot; target=&quot;_blank&quot;&gt;[파이썬/파이썬 웹 크롤링 - 부동산 공공데이터] - [파이썬 크롤링/부동산 데이터] scrapy를 이용한 부동산 공공 데이터 저장하기(csv/excel)&lt;/a&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://engkimbs.tistory.com/966&quot; target=&quot;_blank&quot;&gt;[파이썬/파이썬 웹 크롤링 - 부동산 공공데이터] - [파이썬 크롤링/부동산 데이터] scrapy를 이용하여 재귀적으로 부동산 공공 데이터 연속적으로 가져오기 및 excel 저장&lt;/a&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;포스팅에 있는 내용을&amp;nbsp;따라하기 위해서는 sqlalchemy 패키지를 설치해야합니다. sqlalchemy는 쉽게 설명하자면&amp;nbsp;python으로&amp;nbsp;DB에 접근해서&amp;nbsp;데이터를 저장, 삭제, 갱신 등 데이터를 조작할 수 있게 도와주는 &lt;a href=&quot;https://engkimbs.tistory.com/673&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;라&lt;/a&gt;&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;&lt;a href=&quot;https://engkimbs.tistory.com/673&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;이브러리&lt;/a&gt;&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;입니다.&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;&amp;nbsp;자세히 설명하자면 포스팅의 내용이 길어질 수 있기 때문에 이렇게 짧게 설명하도록 하겠습니다.&lt;/span&gt;&lt;/p&gt;&lt;pre style=&quot;background-color:#2b2b2b;color:#a9b7c6;font-family:'굴림체';font-size:9.0pt;&quot;&gt;pip install sqlalchemy&lt;/pre&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;또한 이번에는 DataFrame에 저장된 데이터를 SQLite&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;라는 &lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;DB에 저장할 것입니다. 이 DB의 데이터를 보려면 해당 DB에 접속하는 툴이 필요합니다. 여기서는 DB Browser for &lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;SQLite를 써서 DB에 접속해 볼 것입니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;해당 툴 다운로드는 &lt;/span&gt;&lt;a href=&quot;https://sqlitebrowser.org/&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;여기&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;를 방문해서 다운로드 받으시면 됩니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 18pt; font-weight: bold; color: rgb(31, 218, 17);&quot;&gt;|&amp;nbsp;&lt;/span&gt;&lt;b style=&quot;font-size: 18pt;&quot;&gt;&amp;nbsp;&lt;/b&gt;&lt;span style=&quot;font-size: 24px;&quot;&gt;&lt;b&gt;재귀적으로&lt;/b&gt;&lt;/span&gt;&lt;b style=&quot;font-size: 18pt;&quot;&gt;&amp;nbsp;이용해서 공공데이터를 연속적으로 가져오기&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;&lt;b&gt;프로젝트 구조&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;pre style=&quot;background-color: rgb(43, 43, 43); color: rgb(169, 183, 198); font-family: 굴림체; font-size: 9pt;&quot;&gt;&lt;p&gt;|   scrapy.cfg&lt;br /&gt;\---invest_crawler&lt;br /&gt;    |   consts.py&lt;br /&gt;    |   settings.py&lt;br /&gt;    |   __init__.py&lt;br /&gt;    |&lt;br /&gt;    +---items&lt;br /&gt;    |   |   apt_trade.py&lt;br /&gt;    |   |   __init__.py&lt;br /&gt;    |&lt;br /&gt;    +---spiders&lt;br /&gt;    |   |   apt_trade_spiders.py&lt;br /&gt;    |   |   __init__.py&lt;/p&gt;&lt;/pre&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;&lt;b&gt;소스 코드&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;consts.py&lt;/b&gt;&lt;/p&gt;&lt;pre style=&quot;background-color: rgb(43, 43, 43); color: rgb(169, 183, 198); font-family: 굴림체; font-size: 9pt;&quot;&gt;&lt;p&gt;&lt;span style=&quot;color: rgb(128, 128, 128);&quot;&gt;# 샘플 더미 데이터 입니다. 어떻게 세팅하는 지 보여드리기 위해 넣은 데이터이기 때문에 그대로 사용하시면 에러가 납니다.&lt;br /&gt;&lt;/span&gt;APT_DETAIL_ENDPOINT = &lt;span style=&quot;color: rgb(106, 135, 89);&quot;&gt;&quot;http://openapi.molit.go.kr:8081/OpenAPI_ToolInstallPackage/service/rest/RTMSOBJSvc/getRTMSDataSvcAptTrade?serviceKey=asdsdfsdfWiZGAJkCsr3wM0YkDO%2BssYpNXZ%2FEWZfuIW5k%2FcHFtD5k1zcCVasdfEtBQID5rIcjXsg%3D%3D&amp;amp;&quot;&lt;/span&gt;&lt;/p&gt;&lt;/pre&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;apt_trade.py&lt;/b&gt;&lt;/p&gt;&lt;pre style=&quot;background-color: rgb(43, 43, 43); color: rgb(169, 183, 198); font-family: 굴림체; font-size: 9pt;&quot;&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;import &lt;/span&gt;scrapy&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;class &lt;/span&gt;AptTradeScrapy(scrapy.Item):&lt;br /&gt;&lt;br /&gt;    apt_name = scrapy.Field()&lt;br /&gt;    address_1 = scrapy.Field()&lt;br /&gt;    address_2 = scrapy.Field()&lt;br /&gt;    address_3 = scrapy.Field()&lt;br /&gt;    address_4 = scrapy.Field()&lt;br /&gt;    address = scrapy.Field()&lt;br /&gt;    age = scrapy.Field()&lt;br /&gt;    level = scrapy.Field()&lt;br /&gt;    available_space = scrapy.Field()&lt;br /&gt;    trade_date = scrapy.Field()&lt;br /&gt;    trade_amount = scrapy.Field()&lt;br /&gt;&lt;br /&gt;    &lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;def &lt;/span&gt;&lt;span style=&quot;color: rgb(255, 198, 109);&quot;&gt;to_dict&lt;/span&gt;(&lt;span style=&quot;color: rgb(148, 85, 141);&quot;&gt;self&lt;/span&gt;):&lt;br /&gt;        &lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;return &lt;/span&gt;{&lt;br /&gt;            &lt;span style=&quot;color: rgb(106, 135, 89);&quot;&gt;'아파트'&lt;/span&gt;: &lt;span style=&quot;color: rgb(148, 85, 141);&quot;&gt;self&lt;/span&gt;[&lt;span style=&quot;color: rgb(106, 135, 89);&quot;&gt;'apt_name'&lt;/span&gt;]&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;,&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color: rgb(106, 135, 89);&quot;&gt;'시/도'&lt;/span&gt;: &lt;span style=&quot;color: rgb(148, 85, 141);&quot;&gt;self&lt;/span&gt;[&lt;span style=&quot;color: rgb(106, 135, 89);&quot;&gt;'address_1'&lt;/span&gt;]&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;,&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color: rgb(106, 135, 89);&quot;&gt;'군/구'&lt;/span&gt;: &lt;span style=&quot;color: rgb(148, 85, 141);&quot;&gt;self&lt;/span&gt;[&lt;span style=&quot;color: rgb(106, 135, 89);&quot;&gt;'address_2'&lt;/span&gt;]&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;,&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color: rgb(106, 135, 89);&quot;&gt;'동/읍/면'&lt;/span&gt;: &lt;span style=&quot;color: rgb(148, 85, 141);&quot;&gt;self&lt;/span&gt;[&lt;span style=&quot;color: rgb(106, 135, 89);&quot;&gt;'address_3'&lt;/span&gt;]&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;,&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color: rgb(106, 135, 89);&quot;&gt;'번지'&lt;/span&gt;: &lt;span style=&quot;color: rgb(148, 85, 141);&quot;&gt;self&lt;/span&gt;[&lt;span style=&quot;color: rgb(106, 135, 89);&quot;&gt;'address_4'&lt;/span&gt;]&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;,&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color: rgb(106, 135, 89);&quot;&gt;'전체주소'&lt;/span&gt;: &lt;span style=&quot;color: rgb(148, 85, 141);&quot;&gt;self&lt;/span&gt;[&lt;span style=&quot;color: rgb(106, 135, 89);&quot;&gt;'address'&lt;/span&gt;]&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;,&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color: rgb(106, 135, 89);&quot;&gt;'연식'&lt;/span&gt;: &lt;span style=&quot;color: rgb(148, 85, 141);&quot;&gt;self&lt;/span&gt;[&lt;span style=&quot;color: rgb(106, 135, 89);&quot;&gt;'age'&lt;/span&gt;]&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;,&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color: rgb(106, 135, 89);&quot;&gt;'층'&lt;/span&gt;: &lt;span style=&quot;color: rgb(148, 85, 141);&quot;&gt;self&lt;/span&gt;[&lt;span style=&quot;color: rgb(106, 135, 89);&quot;&gt;'level'&lt;/span&gt;]&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;,&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color: rgb(106, 135, 89);&quot;&gt;'면적'&lt;/span&gt;: &lt;span style=&quot;color: rgb(148, 85, 141);&quot;&gt;self&lt;/span&gt;[&lt;span style=&quot;color: rgb(106, 135, 89);&quot;&gt;'available_space'&lt;/span&gt;]&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;,&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color: rgb(106, 135, 89);&quot;&gt;'거래일자'&lt;/span&gt;: &lt;span style=&quot;color: rgb(148, 85, 141);&quot;&gt;self&lt;/span&gt;[&lt;span style=&quot;color: rgb(106, 135, 89);&quot;&gt;'trade_date'&lt;/span&gt;]&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;,&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color: rgb(106, 135, 89);&quot;&gt;'매매가격'&lt;/span&gt;: &lt;span style=&quot;color: rgb(148, 85, 141);&quot;&gt;self&lt;/span&gt;[&lt;span style=&quot;color: rgb(106, 135, 89);&quot;&gt;'trade_amount'&lt;/span&gt;]&lt;br /&gt;        }&lt;/pre&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;apt_trade_spiders.py&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;&lt;pre style=&quot;background-color:#2b2b2b;color:#a9b7c6;font-family:'굴림체';font-size:9.0pt;&quot;&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;import &lt;/span&gt;datetime &lt;span style=&quot;color:#cc7832;&quot;&gt;as &lt;/span&gt;dt&lt;br /&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;from &lt;/span&gt;urllib.parse &lt;span style=&quot;color:#cc7832;&quot;&gt;import &lt;/span&gt;urlencode&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;import &lt;/span&gt;pandas &lt;span style=&quot;color:#cc7832;&quot;&gt;as &lt;/span&gt;pd&lt;br /&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;import &lt;/span&gt;scrapy&lt;br /&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;from &lt;/span&gt;dateutil.relativedelta &lt;span style=&quot;color:#cc7832;&quot;&gt;import &lt;/span&gt;relativedelta&lt;br /&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;from &lt;/span&gt;openpyxl &lt;span style=&quot;color:#cc7832;&quot;&gt;import &lt;/span&gt;Workbook&lt;br /&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;from &lt;/span&gt;scrapy &lt;span style=&quot;color:#cc7832;&quot;&gt;import &lt;/span&gt;Selector&lt;br /&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;from &lt;/span&gt;sqlalchemy &lt;span style=&quot;color:#cc7832;&quot;&gt;import &lt;/span&gt;create_engine&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;import &lt;/span&gt;invest_crawler.consts &lt;span style=&quot;color:#cc7832;&quot;&gt;as &lt;/span&gt;CONST&lt;br /&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;from &lt;/span&gt;invest_crawler.items.apt_trade &lt;span style=&quot;color:#cc7832;&quot;&gt;import &lt;/span&gt;AptTradeScrapy&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;class &lt;/span&gt;TradeSpider(scrapy.spiders.XMLFeedSpider):&lt;br /&gt;    name = &lt;span style=&quot;color:#6a8759;&quot;&gt;'trade'&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#6a8759;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#6a8759;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;def &lt;/span&gt;&lt;span style=&quot;color:#ffc66d;&quot;&gt;start_requests&lt;/span&gt;(&lt;span style=&quot;color:#94558d;&quot;&gt;self&lt;/span&gt;):&lt;br /&gt;        &lt;span style=&quot;color:#94558d;&quot;&gt;self&lt;/span&gt;.engine = create_engine(&lt;span style=&quot;color:#6a8759;&quot;&gt;'sqlite:///CRAWLER.DB'&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#aa4926;&quot;&gt;echo&lt;/span&gt;=&lt;span style=&quot;color:#cc7832;&quot;&gt;False&lt;/span&gt;)&lt;br /&gt;        date = dt.datetime(&lt;span style=&quot;color:#6897bb;&quot;&gt;2006&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#6897bb;&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#6897bb;&quot;&gt;1&lt;/span&gt;)&lt;br /&gt;        Workbook().save(&lt;span style=&quot;color:#6a8759;&quot;&gt;'APT_TRADE.xlsx'&lt;/span&gt;)&lt;br /&gt;        &lt;span style=&quot;color:#cc7832;&quot;&gt;yield from &lt;/span&gt;&lt;span style=&quot;color:#94558d;&quot;&gt;self&lt;/span&gt;.get_realestate_trade_data(date)&lt;br /&gt;&lt;br /&gt;    &lt;span style=&quot;color:#cc7832;&quot;&gt;def &lt;/span&gt;&lt;span style=&quot;color:#ffc66d;&quot;&gt;get_realestate_trade_data&lt;/span&gt;(&lt;span style=&quot;color:#94558d;&quot;&gt;self&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;date):&lt;br /&gt;        page_num = &lt;span style=&quot;color:#6897bb;&quot;&gt;1&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#6897bb;&quot;&gt;        &lt;/span&gt;urls = [&lt;br /&gt;            CONST.APT_DETAIL_ENDPOINT&lt;br /&gt;        ]&lt;br /&gt;        params = {&lt;br /&gt;            &lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;pageNo&quot;&lt;/span&gt;: &lt;span style=&quot;color:#8888c6;&quot;&gt;str&lt;/span&gt;(page_num)&lt;span style=&quot;color:#cc7832;&quot;&gt;,&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;numOfRows&quot;&lt;/span&gt;: &lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;999&quot;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;,&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;LAWD_CD&quot;&lt;/span&gt;: &lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;44133&quot;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;,&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;DEAL_YMD&quot;&lt;/span&gt;: date.strftime(&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;%Y%m&quot;&lt;/span&gt;)&lt;span style=&quot;color:#cc7832;&quot;&gt;,&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;        &lt;/span&gt;}&lt;br /&gt;        &lt;span style=&quot;color:#cc7832;&quot;&gt;for &lt;/span&gt;url &lt;span style=&quot;color:#cc7832;&quot;&gt;in &lt;/span&gt;urls:&lt;br /&gt;            url += urlencode(params)&lt;br /&gt;            &lt;span style=&quot;color:#cc7832;&quot;&gt;yield &lt;/span&gt;scrapy.Request(&lt;span style=&quot;color:#aa4926;&quot;&gt;url&lt;/span&gt;=url&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#aa4926;&quot;&gt;callback&lt;/span&gt;=&lt;span style=&quot;color:#94558d;&quot;&gt;self&lt;/span&gt;.parse&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#aa4926;&quot;&gt;cb_kwargs&lt;/span&gt;=&lt;span style=&quot;color:#8888c6;&quot;&gt;dict&lt;/span&gt;(&lt;span style=&quot;color:#aa4926;&quot;&gt;page_num&lt;/span&gt;=page_num&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#aa4926;&quot;&gt;date&lt;/span&gt;=date))&lt;br /&gt;&lt;br /&gt;    &lt;span style=&quot;color:#cc7832;&quot;&gt;def &lt;/span&gt;&lt;span style=&quot;color:#ffc66d;&quot;&gt;parse&lt;/span&gt;(&lt;span style=&quot;color:#94558d;&quot;&gt;self&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;response&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;page_num&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;date):&lt;br /&gt;        selector = Selector(response&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#aa4926;&quot;&gt;type&lt;/span&gt;=&lt;span style=&quot;color:#6a8759;&quot;&gt;'xml'&lt;/span&gt;)&lt;br /&gt;        items = selector.xpath(&lt;span style=&quot;color:#6a8759;&quot;&gt;'//%s' &lt;/span&gt;% &lt;span style=&quot;color:#94558d;&quot;&gt;self&lt;/span&gt;.itertag)  &lt;span style=&quot;color:#808080;&quot;&gt;# self.intertag는 기본적으로 item으로 되어 있음
&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#808080;&quot;&gt;        &lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;if not &lt;/span&gt;items:&lt;br /&gt;            &lt;span style=&quot;color:#cc7832;&quot;&gt;return&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;        &lt;/span&gt;&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;&quot;&quot;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#6a8759;&quot;&gt;            To save to Excel Sheet&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#6a8759;&quot;&gt;        &quot;&quot;&quot;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#6a8759;&quot;&gt;        &lt;/span&gt;&lt;span style=&quot;color:#808080;&quot;&gt;# To remove 'Sheet' worksheet created automatically&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#808080;&quot;&gt;        # if date.strftime(&quot;%Y%m&quot;) == &quot;200604&quot;:&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#808080;&quot;&gt;        #     wb = load_workbook('APT_TRADE.xlsx')&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#808080;&quot;&gt;        #     wb.remove(wb['Sheet'])&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#808080;&quot;&gt;        #     wb.save('APT_TRADE.xlsx')&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#808080;&quot;&gt;        #     return&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#808080;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#808080;&quot;&gt;        # apt_trades = [self.parse_item(item) for item in items]&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#808080;&quot;&gt;        # apt_dataframe = pd.DataFrame.from_records([apt_trade.to_dict() for apt_trade in apt_trades])&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#808080;&quot;&gt;        #&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#808080;&quot;&gt;        # writer = pd.ExcelWriter('APT_TRADE.xlsx', engine='openpyxl', mode='a')&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#808080;&quot;&gt;        # apt_dataframe.to_excel(writer, sheet_name='천안-' + date.strftime(&quot;%Y%m&quot;), index=False)&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#808080;&quot;&gt;        # writer.save()&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#808080;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#808080;&quot;&gt;        &lt;/span&gt;apt_trades = [&lt;span style=&quot;color:#94558d;&quot;&gt;self&lt;/span&gt;.parse_item(item) &lt;span style=&quot;color:#cc7832;&quot;&gt;for &lt;/span&gt;item &lt;span style=&quot;color:#cc7832;&quot;&gt;in &lt;/span&gt;items]&lt;br /&gt;        apt_dataframe = pd.DataFrame.from_records([apt_trade.to_dict() &lt;span style=&quot;color:#cc7832;&quot;&gt;for &lt;/span&gt;apt_trade &lt;span style=&quot;color:#cc7832;&quot;&gt;in &lt;/span&gt;apt_trades])&lt;br /&gt;        apt_dataframe.to_sql(&lt;span style=&quot;color:#6a8759;&quot;&gt;'APT_TRADE'&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#aa4926;&quot;&gt;con&lt;/span&gt;=&lt;span style=&quot;color:#94558d;&quot;&gt;self&lt;/span&gt;.engine&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#aa4926;&quot;&gt;if_exists&lt;/span&gt;=&lt;span style=&quot;color:#6a8759;&quot;&gt;'append'&lt;/span&gt;)&lt;br /&gt;&lt;br /&gt;        date += relativedelta(&lt;span style=&quot;color:#aa4926;&quot;&gt;months&lt;/span&gt;=&lt;span style=&quot;color:#6897bb;&quot;&gt;1&lt;/span&gt;)&lt;br /&gt;        &lt;span style=&quot;color:#cc7832;&quot;&gt;yield from &lt;/span&gt;&lt;span style=&quot;color:#94558d;&quot;&gt;self&lt;/span&gt;.get_realestate_trade_data(date)&lt;br /&gt;&lt;br /&gt;    &lt;span style=&quot;color:#cc7832;&quot;&gt;def &lt;/span&gt;&lt;span style=&quot;color:#ffc66d;&quot;&gt;parse_item&lt;/span&gt;(&lt;span style=&quot;color:#94558d;&quot;&gt;self&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;item):&lt;br /&gt;        state = &lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;천안시&quot;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#6a8759;&quot;&gt;        &lt;/span&gt;district = &lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;서북구&quot;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#6a8759;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#6a8759;&quot;&gt;        &lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;try&lt;/span&gt;:&lt;br /&gt;            apt_trade_data = AptTradeScrapy(&lt;br /&gt;                &lt;span style=&quot;color:#aa4926;&quot;&gt;apt_name&lt;/span&gt;=item.xpath(&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;./아파트/text()&quot;&lt;/span&gt;).get()&lt;span style=&quot;color:#cc7832;&quot;&gt;,&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;                &lt;/span&gt;&lt;span style=&quot;color:#aa4926;&quot;&gt;address_1&lt;/span&gt;=state&lt;span style=&quot;color:#cc7832;&quot;&gt;,&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;                &lt;/span&gt;&lt;span style=&quot;color:#aa4926;&quot;&gt;address_2&lt;/span&gt;=district&lt;span style=&quot;color:#cc7832;&quot;&gt;,&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;                &lt;/span&gt;&lt;span style=&quot;color:#aa4926;&quot;&gt;address_3&lt;/span&gt;=item.xpath(&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;./법정동/text()&quot;&lt;/span&gt;).get().strip()&lt;span style=&quot;color:#cc7832;&quot;&gt;,&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;                &lt;/span&gt;&lt;span style=&quot;color:#aa4926;&quot;&gt;address_4&lt;/span&gt;=item.xpath(&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;./지번/text()&quot;&lt;/span&gt;).get()&lt;span style=&quot;color:#cc7832;&quot;&gt;,&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;                &lt;/span&gt;&lt;span style=&quot;color:#aa4926;&quot;&gt;address&lt;/span&gt;=state + &lt;span style=&quot;color:#6a8759;&quot;&gt;&quot; &quot; &lt;/span&gt;+ district + &lt;span style=&quot;color:#6a8759;&quot;&gt;&quot; &quot; &lt;/span&gt;+ item.xpath(&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;./법정동/text()&quot;&lt;/span&gt;).get().strip() + &lt;span style=&quot;color:#6a8759;&quot;&gt;&quot; &quot; &lt;/span&gt;+&lt;br /&gt;                        item.xpath(&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;./지번/text()&quot;&lt;/span&gt;).get()&lt;span style=&quot;color:#cc7832;&quot;&gt;,&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;                &lt;/span&gt;&lt;span style=&quot;color:#aa4926;&quot;&gt;age&lt;/span&gt;=item.xpath(&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;./건축년도/text()&quot;&lt;/span&gt;).get()&lt;span style=&quot;color:#cc7832;&quot;&gt;,&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;                &lt;/span&gt;&lt;span style=&quot;color:#aa4926;&quot;&gt;level&lt;/span&gt;=item.xpath(&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;./층/text()&quot;&lt;/span&gt;).get()&lt;span style=&quot;color:#cc7832;&quot;&gt;,&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;                &lt;/span&gt;&lt;span style=&quot;color:#aa4926;&quot;&gt;available_space&lt;/span&gt;=item.xpath(&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;./전용면적/text()&quot;&lt;/span&gt;).get()&lt;span style=&quot;color:#cc7832;&quot;&gt;,&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;                &lt;/span&gt;&lt;span style=&quot;color:#aa4926;&quot;&gt;trade_date&lt;/span&gt;=item.xpath(&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;./년/text()&quot;&lt;/span&gt;).get() + &lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;/&quot; &lt;/span&gt;+&lt;br /&gt;                           item.xpath(&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;./월/text()&quot;&lt;/span&gt;).get() + &lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;/&quot; &lt;/span&gt;+&lt;br /&gt;                           item.xpath(&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;./일/text()&quot;&lt;/span&gt;).get()&lt;span style=&quot;color:#cc7832;&quot;&gt;,&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;                &lt;/span&gt;&lt;span style=&quot;color:#aa4926;&quot;&gt;trade_amount&lt;/span&gt;=item.xpath(&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;./거래금액/text()&quot;&lt;/span&gt;).get().strip().replace(&lt;span style=&quot;color:#6a8759;&quot;&gt;','&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#6a8759;&quot;&gt;''&lt;/span&gt;)&lt;span style=&quot;color:#cc7832;&quot;&gt;,&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;            &lt;/span&gt;)&lt;br /&gt;&lt;br /&gt;        &lt;span style=&quot;color:#cc7832;&quot;&gt;except &lt;/span&gt;&lt;span style=&quot;color:#8888c6;&quot;&gt;Exception &lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;as &lt;/span&gt;e:&lt;br /&gt;            &lt;span style=&quot;color:#8888c6;&quot;&gt;print&lt;/span&gt;(e)&lt;br /&gt;            &lt;span style=&quot;color:#94558d;&quot;&gt;self&lt;/span&gt;.logger.error(item)&lt;br /&gt;            &lt;span style=&quot;color:#94558d;&quot;&gt;self&lt;/span&gt;.logger.error(item.xpath(&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;./아파트/text()&quot;&lt;/span&gt;).get())&lt;br /&gt;&lt;br /&gt;        &lt;span style=&quot;color:#cc7832;&quot;&gt;return &lt;/span&gt;apt_trade_data&lt;/pre&gt;&lt;ul&gt;&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;start_requests 메서드에 self.engine = create_engine('sqlite:///CRAWLER.DB', echo=False)라는 코드 한 줄이 추가되었습니다. create_engine은 SQLAlchemy에서&amp;nbsp;mysql, oracle, sqlite 같은 DB의 접속과 메타데이터 생성 등을 수행하는 역할을 하는 객체를 반환합니다.&amp;nbsp;&lt;br /&gt;참고로 echo=False의 의미는 SQLAlchemy가 관련 engine을 생성하면서 나오는 로그를 콘솔창에 출력하지 않게 만드는 설정 옵션입니다.&lt;br /&gt;&lt;pre style=&quot;background-color: rgb(43, 43, 43); color: rgb(169, 183, 198); font-family: 굴림체; font-size: 9pt;&quot;&gt; &lt;span style=&quot;color: rgb(148, 85, 141);&quot;&gt;self&lt;/span&gt;.engine = create_engine(&lt;span style=&quot;color: rgb(106, 135, 89);&quot;&gt;'sqlite:///CRAWLER.DB'&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: rgb(170, 73, 38);&quot;&gt;echo&lt;/span&gt;=&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;False&lt;/span&gt;)&lt;br /&gt;&lt;/pre&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;parse 메서드에서 아래와 같이 딱 한 줄의 파이썬 코드가 추가되었습니다.&amp;nbsp; 이 한 줄로 천안의 2006~2020 년도의 데이터를 sqlite DB에 저장할 수 있습니다. 'APT_TRADE' 은 데이터가 저장될 DB의 &lt;a href=&quot;https://engkimbs.tistory.com/936&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;테이블&lt;/a&gt;의 이름을 나타냅니다. con은 pandas의 DataFrame이 저장될 DB의 엔진을 의미합니다. if_exists는 만약 DB에 같은 테이블이 있을 시 그 테이블에 데이터를 이어 붙이겠다는 뜻입니다.&amp;nbsp;&lt;br /&gt;&lt;pre style=&quot;background-color: rgb(43, 43, 43); color: rgb(169, 183, 198); font-family: 굴림체; font-size: 9pt;&quot;&gt;apt_dataframe.to_sql(&lt;span style=&quot;color: rgb(106, 135, 89);&quot;&gt;'APT_TRADE'&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: rgb(170, 73, 38);&quot;&gt;con&lt;/span&gt;=&lt;span style=&quot;color: rgb(148, 85, 141);&quot;&gt;self&lt;/span&gt;.engine&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: rgb(170, 73, 38);&quot;&gt;if_exists&lt;/span&gt;=&lt;span style=&quot;color: rgb(106, 135, 89);&quot;&gt;'append'&lt;/span&gt;)&lt;/pre&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 18pt; font-weight: bold; color: rgb(31, 218, 17);&quot;&gt;|&amp;nbsp;&lt;/span&gt;&lt;b style=&quot;font-size: 18pt;&quot;&gt;&amp;nbsp;&lt;/b&gt;&lt;b style=&quot;font-size: 18pt;&quot;&gt;DB Browser로 데이터 보기&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;먼저 DB Browser를 실행합니다. 실행하게되면 다음과 같은 화면을 볼 수 있을 겁니다. 여기서 데이터베이스 열기를 클릭합니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 728px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/991BF7425E88BCA022&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F991BF7425E88BCA022&quot; width=&quot;728&quot; height=&quot;412&quot; filename=&quot;1.PNG&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;그리고 위 코드를 실행하고&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;&amp;nbsp;나온 sqlite db file을 클릭합니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 728px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/99899E505E88BCD211&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F99899E505E88BCD211&quot; width=&quot;728&quot; height=&quot;410&quot; filename=&quot;2.PNG&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;아래와 같이 데이터보기를 클릭하게 되면 2006~2020 천안의 &lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;공공데이터가 들어있는 것을 볼 수 있습니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 728px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/99AE1C4B5E88BD0D1A&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F99AE1C4B5E88BD0D1A&quot; width=&quot;728&quot; height=&quot;410&quot; filename=&quot;3.PNG&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;font face=&quot;Arial Black&quot;&gt;&lt;br /&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font face=&quot;Arial Black&quot;&gt;이렇게 DB를 이용하여 데이터를 저장하게 되면 Excel를 통해서 저장할 내용을 체계적으로 저장하는 것이 가능합니다. 또한 데이터를 저장할 때의 속도도 Excel보다 훨씬 빠르죠 ( DB : 2~3분 vs Excel : 50~60분)&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;지금까지 scrapy를 이용하여 부동산 공공데이터를 크롤링하고 저장하는 내용을 다뤘습니다. 다음 포스팅에서는 Jupyter Notebook으로 이 데이터들을 어떻게 분석해볼 수 있을 지 다뤄보도록 하겠습니다.&lt;/span&gt;&lt;/p&gt;</description>
      <category>파이썬/파이썬 웹 크롤링 - 부동산 공공데이터</category>
      <category>scrapy</category>
      <category>부동산</category>
      <category>부동산 공공데이터</category>
      <category>파이썬 크롤링</category>
      <author>새로비</author>
      <guid isPermaLink="true">https://engkimbs.tistory.com/967</guid>
      <comments>https://engkimbs.tistory.com/entry/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%ED%81%AC%EB%A1%A4%EB%A7%81%EB%B6%80%EB%8F%99%EC%82%B0-%EB%8D%B0%EC%9D%B4%ED%84%B0-scrapy%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%98%EC%97%AC-%EB%B6%80%EB%8F%99%EC%82%B0-%EA%B3%B5%EA%B3%B5-%EB%8D%B0%EC%9D%B4%ED%84%B0-DB%EC%97%90-%EC%A0%80%EC%9E%A5%ED%95%98%EA%B8%B0#entry967comment</comments>
      <pubDate>Sun, 5 Apr 2020 02:11:41 +0900</pubDate>
    </item>
    <item>
      <title>[파이썬 크롤링/부동산 데이터] scrapy를 이용하여 재귀적으로 부동산 공공 데이터 연속적으로 가져오기 및 excel 저장</title>
      <link>https://engkimbs.tistory.com/entry/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%ED%81%AC%EB%A1%A4%EB%A7%81%EB%B6%80%EB%8F%99%EC%82%B0-%EB%8D%B0%EC%9D%B4%ED%84%B0-scrapy%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%98%EC%97%AC-%EC%9E%AC%EA%B7%80%EC%A0%81%EC%9C%BC%EB%A1%9C-%EB%B6%80%EB%8F%99%EC%82%B0-%EA%B3%B5%EA%B3%B5-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EC%97%B0%EC%86%8D%EC%A0%81%EC%9C%BC%EB%A1%9C-%EA%B0%80%EC%A0%B8%EC%98%A4%EA%B8%B0-%EB%B0%8F-excel-%EC%A0%80%EC%9E%A5</link>
      <description>&lt;p&gt;&lt;span style=&quot;font-size: 18pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(31, 218, 17);&quot;&gt;|&lt;/span&gt;&amp;nbsp;들어가기 전에&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://github.com/Lucorda/python-tutorial/tree/0c0dd91a86db7ce7eb839fcc4217530a7d27c958&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;GIT 저장소&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;지금 포스팅은 국토교통부에서 제공하는 부동산 공공데이터 API를 사용합니다. 아래 포스팅&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;을 보시고 먼저 부동산 공공데이터 API를 신청해주시길 바래요!&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://engkimbs.tistory.com/899&quot; target=&quot;_blank&quot;&gt;[유용한 정보들] - 국토교통부 공공데이터 부동산 실거래가 API 신청 방법&lt;/a&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;이전 포스팅&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://engkimbs.tistory.com/961&quot; target=&quot;_blank&quot;&gt;[파이썬/파이썬 웹 크롤링 - 부동산 공공데이터] - [파이썬 크롤링/부동산 데이터] 스크래피(scrapy) startproject로 초기 프로젝트 구성하기&lt;/a&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://engkimbs.tistory.com/962&quot; target=&quot;_blank&quot;&gt;[파이썬/파이썬 웹 크롤링 - 부동산 공공데이터] - [파이썬 크롤링/부동산 데이터] scrapy를 이용한 부동산 공공 데이터 간단하게 받아오기&lt;/a&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://engkimbs.tistory.com/963&quot; target=&quot;_blank&quot;&gt;[파이썬/파이썬 웹 크롤링 - 부동산 공공데이터] - [파이썬 크롤링/부동산 데이터] scrapy를 이용한 부동산 공공 데이터 파싱 및 추출하기&lt;/a&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://engkimbs.tistory.com/964&quot; target=&quot;_blank&quot;&gt;[파이썬/파이썬 웹 크롤링 - 부동산 공공데이터] - [파이썬 크롤링/부동산 데이터] scrapy를 이용한 부동산 공공 데이터 저장하기(csv/excel)&lt;/a&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;포스팅에 있는 내용을&amp;nbsp;따라하기 위해서는 openpyxl&amp;nbsp;패키지를 설치해야합니다. openpyxl은 DataFrame 타입의 파이썬 객체를&amp;nbsp; excel 파일로 저장할 때 쓰이는 engine입니다. 전에 쓰였던 xlsxwriter를 쓰지 않는 이유는 아래에 설명하겠습니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;pre style=&quot;background-color: rgb(43, 43, 43); color: rgb(169, 183, 198); font-family: 굴림체; font-size: 9pt;&quot;&gt;&lt;p&gt;pip install openpyxl&lt;/p&gt;&lt;/pre&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 18pt; font-weight: bold; color: rgb(31, 218, 17);&quot;&gt;|&amp;nbsp;&lt;/span&gt;&lt;b style=&quot;font-size: 18pt;&quot;&gt;&amp;nbsp;&lt;/b&gt;&lt;span style=&quot;font-size: 24px;&quot;&gt;&lt;b&gt;재귀적으로&lt;/b&gt;&lt;/span&gt;&lt;b style=&quot;font-size: 18pt;&quot;&gt;&amp;nbsp;이용해서 공공데이터를 연속적으로 가져오기&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;&lt;b&gt;프로젝트 구조&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;pre style=&quot;background-color: rgb(43, 43, 43); color: rgb(169, 183, 198); font-family: 굴림체; font-size: 9pt;&quot;&gt;&lt;p&gt;|   scrapy.cfg&lt;br /&gt;\---invest_crawler&lt;br /&gt;    |   consts.py&lt;br /&gt;    |   settings.py&lt;br /&gt;    |   __init__.py&lt;br /&gt;    |&lt;br /&gt;    +---items&lt;br /&gt;    |   |   apt_trade.py&lt;br /&gt;    |   |   __init__.py&lt;br /&gt;    |&lt;br /&gt;    +---spiders&lt;br /&gt;    |   |   apt_trade_spiders.py&lt;br /&gt;    |   |   __init__.py&lt;/p&gt;&lt;/pre&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;&lt;b&gt;소스 코드&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;consts.py&lt;/b&gt;&lt;/p&gt;&lt;pre style=&quot;background-color: rgb(43, 43, 43); color: rgb(169, 183, 198); font-family: 굴림체; font-size: 9pt;&quot;&gt;&lt;p&gt;&lt;span style=&quot;color: rgb(128, 128, 128);&quot;&gt;# 샘플 더미 데이터 입니다. 어떻게 세팅하는 지 보여드리기 위해 넣은 데이터이기 때문에 그대로 사용하시면 에러가 납니다.&lt;br /&gt;&lt;/span&gt;APT_DETAIL_ENDPOINT = &lt;span style=&quot;color: rgb(106, 135, 89);&quot;&gt;&quot;http://openapi.molit.go.kr:8081/OpenAPI_ToolInstallPackage/service/rest/RTMSOBJSvc/getRTMSDataSvcAptTrade?serviceKey=asdsdfsdfWiZGAJkCsr3wM0YkDO%2BssYpNXZ%2FEWZfuIW5k%2FcHFtD5k1zcCVasdfEtBQID5rIcjXsg%3D%3D&amp;amp;&quot;&lt;/span&gt;&lt;/p&gt;&lt;/pre&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;apt_trade.py&lt;/b&gt;&lt;/p&gt;&lt;pre style=&quot;background-color: rgb(43, 43, 43); color: rgb(169, 183, 198); font-family: 굴림체; font-size: 9pt;&quot;&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;import &lt;/span&gt;scrapy&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;class &lt;/span&gt;AptTradeScrapy(scrapy.Item):&lt;br /&gt;&lt;br /&gt;    apt_name = scrapy.Field()&lt;br /&gt;    address_1 = scrapy.Field()&lt;br /&gt;    address_2 = scrapy.Field()&lt;br /&gt;    address_3 = scrapy.Field()&lt;br /&gt;    address_4 = scrapy.Field()&lt;br /&gt;    address = scrapy.Field()&lt;br /&gt;    age = scrapy.Field()&lt;br /&gt;    level = scrapy.Field()&lt;br /&gt;    available_space = scrapy.Field()&lt;br /&gt;    trade_date = scrapy.Field()&lt;br /&gt;    trade_amount = scrapy.Field()&lt;br /&gt;&lt;br /&gt;    &lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;def &lt;/span&gt;&lt;span style=&quot;color: rgb(255, 198, 109);&quot;&gt;to_dict&lt;/span&gt;(&lt;span style=&quot;color: rgb(148, 85, 141);&quot;&gt;self&lt;/span&gt;):&lt;br /&gt;        &lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;return &lt;/span&gt;{&lt;br /&gt;            &lt;span style=&quot;color: rgb(106, 135, 89);&quot;&gt;'아파트'&lt;/span&gt;: &lt;span style=&quot;color: rgb(148, 85, 141);&quot;&gt;self&lt;/span&gt;[&lt;span style=&quot;color: rgb(106, 135, 89);&quot;&gt;'apt_name'&lt;/span&gt;]&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;,&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color: rgb(106, 135, 89);&quot;&gt;'시/도'&lt;/span&gt;: &lt;span style=&quot;color: rgb(148, 85, 141);&quot;&gt;self&lt;/span&gt;[&lt;span style=&quot;color: rgb(106, 135, 89);&quot;&gt;'address_1'&lt;/span&gt;]&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;,&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color: rgb(106, 135, 89);&quot;&gt;'군/구'&lt;/span&gt;: &lt;span style=&quot;color: rgb(148, 85, 141);&quot;&gt;self&lt;/span&gt;[&lt;span style=&quot;color: rgb(106, 135, 89);&quot;&gt;'address_2'&lt;/span&gt;]&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;,&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color: rgb(106, 135, 89);&quot;&gt;'동/읍/면'&lt;/span&gt;: &lt;span style=&quot;color: rgb(148, 85, 141);&quot;&gt;self&lt;/span&gt;[&lt;span style=&quot;color: rgb(106, 135, 89);&quot;&gt;'address_3'&lt;/span&gt;]&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;,&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color: rgb(106, 135, 89);&quot;&gt;'번지'&lt;/span&gt;: &lt;span style=&quot;color: rgb(148, 85, 141);&quot;&gt;self&lt;/span&gt;[&lt;span style=&quot;color: rgb(106, 135, 89);&quot;&gt;'address_4'&lt;/span&gt;]&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;,&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color: rgb(106, 135, 89);&quot;&gt;'전체주소'&lt;/span&gt;: &lt;span style=&quot;color: rgb(148, 85, 141);&quot;&gt;self&lt;/span&gt;[&lt;span style=&quot;color: rgb(106, 135, 89);&quot;&gt;'address'&lt;/span&gt;]&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;,&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color: rgb(106, 135, 89);&quot;&gt;'연식'&lt;/span&gt;: &lt;span style=&quot;color: rgb(148, 85, 141);&quot;&gt;self&lt;/span&gt;[&lt;span style=&quot;color: rgb(106, 135, 89);&quot;&gt;'age'&lt;/span&gt;]&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;,&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color: rgb(106, 135, 89);&quot;&gt;'층'&lt;/span&gt;: &lt;span style=&quot;color: rgb(148, 85, 141);&quot;&gt;self&lt;/span&gt;[&lt;span style=&quot;color: rgb(106, 135, 89);&quot;&gt;'level'&lt;/span&gt;]&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;,&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color: rgb(106, 135, 89);&quot;&gt;'면적'&lt;/span&gt;: &lt;span style=&quot;color: rgb(148, 85, 141);&quot;&gt;self&lt;/span&gt;[&lt;span style=&quot;color: rgb(106, 135, 89);&quot;&gt;'available_space'&lt;/span&gt;]&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;,&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color: rgb(106, 135, 89);&quot;&gt;'거래일자'&lt;/span&gt;: &lt;span style=&quot;color: rgb(148, 85, 141);&quot;&gt;self&lt;/span&gt;[&lt;span style=&quot;color: rgb(106, 135, 89);&quot;&gt;'trade_date'&lt;/span&gt;]&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;,&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color: rgb(106, 135, 89);&quot;&gt;'매매가격'&lt;/span&gt;: &lt;span style=&quot;color: rgb(148, 85, 141);&quot;&gt;self&lt;/span&gt;[&lt;span style=&quot;color: rgb(106, 135, 89);&quot;&gt;'trade_amount'&lt;/span&gt;]&lt;br /&gt;        }&lt;/pre&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;apt_trade_spiders.py&lt;/b&gt;&lt;/p&gt;&lt;pre style=&quot;background-color:#2b2b2b;color:#a9b7c6;font-family:'굴림체';font-size:9.0pt;&quot;&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;import &lt;/span&gt;datetime &lt;span style=&quot;color:#cc7832;&quot;&gt;as &lt;/span&gt;dt&lt;br /&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;from &lt;/span&gt;urllib.parse &lt;span style=&quot;color:#cc7832;&quot;&gt;import &lt;/span&gt;urlencode&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;import &lt;/span&gt;scrapy&lt;br /&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;from &lt;/span&gt;dateutil.relativedelta &lt;span style=&quot;color:#cc7832;&quot;&gt;import &lt;/span&gt;relativedelta&lt;br /&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;from &lt;/span&gt;openpyxl &lt;span style=&quot;color:#cc7832;&quot;&gt;import &lt;/span&gt;Workbook&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;load_workbook&lt;br /&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;from &lt;/span&gt;scrapy &lt;span style=&quot;color:#cc7832;&quot;&gt;import &lt;/span&gt;Selector&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;import &lt;/span&gt;invest_crawler.consts &lt;span style=&quot;color:#cc7832;&quot;&gt;as &lt;/span&gt;CONST&lt;br /&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;from &lt;/span&gt;invest_crawler.items.apt_trade &lt;span style=&quot;color:#cc7832;&quot;&gt;import &lt;/span&gt;AptTradeScrapy&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;import &lt;/span&gt;pandas &lt;span style=&quot;color:#cc7832;&quot;&gt;as &lt;/span&gt;pd&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;class &lt;/span&gt;TradeSpider(scrapy.spiders.XMLFeedSpider):&lt;br /&gt;    name = &lt;span style=&quot;color:#6a8759;&quot;&gt;'trade'&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#6a8759;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#6a8759;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;def &lt;/span&gt;&lt;span style=&quot;color:#ffc66d;&quot;&gt;start_requests&lt;/span&gt;(&lt;span style=&quot;color:#94558d;&quot;&gt;self&lt;/span&gt;):&lt;br /&gt;        date = dt.datetime(&lt;span style=&quot;color:#6897bb;&quot;&gt;2006&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#6897bb;&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#6897bb;&quot;&gt;1&lt;/span&gt;)&lt;br /&gt;        Workbook().save(&lt;span style=&quot;color:#6a8759;&quot;&gt;'APT_TRADE.xlsx'&lt;/span&gt;)&lt;br /&gt;        &lt;span style=&quot;color:#cc7832;&quot;&gt;yield from &lt;/span&gt;&lt;span style=&quot;color:#94558d;&quot;&gt;self&lt;/span&gt;.get_realestate_trade_data(date)&lt;br /&gt;&lt;br /&gt;    &lt;span style=&quot;color:#cc7832;&quot;&gt;def &lt;/span&gt;&lt;span style=&quot;color:#ffc66d;&quot;&gt;get_realestate_trade_data&lt;/span&gt;(&lt;span style=&quot;color:#94558d;&quot;&gt;self&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;date):&lt;br /&gt;        page_num = &lt;span style=&quot;color:#6897bb;&quot;&gt;1&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#6897bb;&quot;&gt;        &lt;/span&gt;urls = [&lt;br /&gt;            CONST.APT_DETAIL_ENDPOINT&lt;br /&gt;        ]&lt;br /&gt;        params = {&lt;br /&gt;            &lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;pageNo&quot;&lt;/span&gt;: &lt;span style=&quot;color:#8888c6;&quot;&gt;str&lt;/span&gt;(page_num)&lt;span style=&quot;color:#cc7832;&quot;&gt;,&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;numOfRows&quot;&lt;/span&gt;: &lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;999&quot;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;,&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;LAWD_CD&quot;&lt;/span&gt;: &lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;44133&quot;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;,&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;DEAL_YMD&quot;&lt;/span&gt;: date.strftime(&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;%Y%m&quot;&lt;/span&gt;)&lt;span style=&quot;color:#cc7832;&quot;&gt;,&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;        &lt;/span&gt;}&lt;br /&gt;        &lt;span style=&quot;color:#cc7832;&quot;&gt;for &lt;/span&gt;url &lt;span style=&quot;color:#cc7832;&quot;&gt;in &lt;/span&gt;urls:&lt;br /&gt;            url += urlencode(params)&lt;br /&gt;            &lt;span style=&quot;color:#cc7832;&quot;&gt;yield &lt;/span&gt;scrapy.Request(&lt;span style=&quot;color:#aa4926;&quot;&gt;url&lt;/span&gt;=url&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#aa4926;&quot;&gt;callback&lt;/span&gt;=&lt;span style=&quot;color:#94558d;&quot;&gt;self&lt;/span&gt;.parse&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#aa4926;&quot;&gt;cb_kwargs&lt;/span&gt;=&lt;span style=&quot;color:#8888c6;&quot;&gt;dict&lt;/span&gt;(&lt;span style=&quot;color:#aa4926;&quot;&gt;page_num&lt;/span&gt;=page_num&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#aa4926;&quot;&gt;date&lt;/span&gt;=date))&lt;br /&gt;&lt;br /&gt;    &lt;span style=&quot;color:#cc7832;&quot;&gt;def &lt;/span&gt;&lt;span style=&quot;color:#ffc66d;&quot;&gt;parse&lt;/span&gt;(&lt;span style=&quot;color:#94558d;&quot;&gt;self&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;response&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;page_num&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;date):&lt;br /&gt;        selector = Selector(response&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#aa4926;&quot;&gt;type&lt;/span&gt;=&lt;span style=&quot;color:#6a8759;&quot;&gt;'xml'&lt;/span&gt;)&lt;br /&gt;        items = selector.xpath(&lt;span style=&quot;color:#6a8759;&quot;&gt;'//%s' &lt;/span&gt;% &lt;span style=&quot;color:#94558d;&quot;&gt;self&lt;/span&gt;.itertag)  &lt;span style=&quot;color:#808080;&quot;&gt;# self.intertag는 기본적으로 item으로 되어 있음&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#808080;&quot;&gt;        &lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;if not &lt;/span&gt;items:&lt;br /&gt;            &lt;span style=&quot;color:#cc7832;&quot;&gt;return&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;        &lt;/span&gt;&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;&quot;&quot;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#6a8759;&quot;&gt;            To remove 'Sheet' worksheet created automatically&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#6a8759;&quot;&gt;        &quot;&quot;&quot;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#6a8759;&quot;&gt;        &lt;/span&gt;&lt;span style=&quot;color:#808080;&quot;&gt;# if date.strftime(&quot;%Y%m&quot;) == &quot;200604&quot;:&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#808080;&quot;&gt;        #     wb = load_workbook('APT_TRADE.xlsx')&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#808080;&quot;&gt;        #     wb.remove(wb['Sheet'])&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#808080;&quot;&gt;        #     wb.save('APT_TRADE.xlsx')&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#808080;&quot;&gt;        #     return&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#808080;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#808080;&quot;&gt;        &lt;/span&gt;apt_trades = [&lt;span style=&quot;color:#94558d;&quot;&gt;self&lt;/span&gt;.parse_item(item) &lt;span style=&quot;color:#cc7832;&quot;&gt;for &lt;/span&gt;item &lt;span style=&quot;color:#cc7832;&quot;&gt;in &lt;/span&gt;items]&lt;br /&gt;        apt_dataframe = pd.DataFrame.from_records([apt_trade.to_dict() &lt;span style=&quot;color:#cc7832;&quot;&gt;for &lt;/span&gt;apt_trade &lt;span style=&quot;color:#cc7832;&quot;&gt;in &lt;/span&gt;apt_trades])&lt;br /&gt;&lt;br /&gt;        writer = pd.ExcelWriter(&lt;span style=&quot;color:#6a8759;&quot;&gt;'APT_TRADE.xlsx'&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#aa4926;&quot;&gt;engine&lt;/span&gt;=&lt;span style=&quot;color:#6a8759;&quot;&gt;'openpyxl'&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#aa4926;&quot;&gt;mode&lt;/span&gt;=&lt;span style=&quot;color:#6a8759;&quot;&gt;'a'&lt;/span&gt;)&lt;br /&gt;        apt_dataframe.to_excel(writer&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#aa4926;&quot;&gt;sheet_name&lt;/span&gt;=&lt;span style=&quot;color:#6a8759;&quot;&gt;'천안-' &lt;/span&gt;+ date.strftime(&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;%Y%m&quot;&lt;/span&gt;)&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#aa4926;&quot;&gt;index&lt;/span&gt;=&lt;span style=&quot;color:#cc7832;&quot;&gt;False&lt;/span&gt;)&lt;br /&gt;        writer.save()&lt;br /&gt;&lt;br /&gt;        date += relativedelta(&lt;span style=&quot;color:#aa4926;&quot;&gt;months&lt;/span&gt;=&lt;span style=&quot;color:#6897bb;&quot;&gt;1&lt;/span&gt;)&lt;br /&gt;        &lt;span style=&quot;color:#cc7832;&quot;&gt;yield from &lt;/span&gt;&lt;span style=&quot;color:#94558d;&quot;&gt;self&lt;/span&gt;.get_realestate_trade_data(date)&lt;br /&gt;&lt;br /&gt;    &lt;span style=&quot;color:#cc7832;&quot;&gt;def &lt;/span&gt;&lt;span style=&quot;color:#ffc66d;&quot;&gt;parse_item&lt;/span&gt;(&lt;span style=&quot;color:#94558d;&quot;&gt;self&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;item):&lt;br /&gt;        state = &lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;천안시&quot;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#6a8759;&quot;&gt;        &lt;/span&gt;district = &lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;서북구&quot;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#6a8759;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#6a8759;&quot;&gt;        &lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;try&lt;/span&gt;:&lt;br /&gt;            apt_trade_data = AptTradeScrapy(&lt;br /&gt;                &lt;span style=&quot;color:#aa4926;&quot;&gt;apt_name&lt;/span&gt;=item.xpath(&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;./아파트/text()&quot;&lt;/span&gt;).get()&lt;span style=&quot;color:#cc7832;&quot;&gt;,&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;                &lt;/span&gt;&lt;span style=&quot;color:#aa4926;&quot;&gt;address_1&lt;/span&gt;=state&lt;span style=&quot;color:#cc7832;&quot;&gt;,&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;                &lt;/span&gt;&lt;span style=&quot;color:#aa4926;&quot;&gt;address_2&lt;/span&gt;=district&lt;span style=&quot;color:#cc7832;&quot;&gt;,&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;                &lt;/span&gt;&lt;span style=&quot;color:#aa4926;&quot;&gt;address_3&lt;/span&gt;=item.xpath(&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;./법정동/text()&quot;&lt;/span&gt;).get().strip()&lt;span style=&quot;color:#cc7832;&quot;&gt;,&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;                &lt;/span&gt;&lt;span style=&quot;color:#aa4926;&quot;&gt;address_4&lt;/span&gt;=item.xpath(&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;./지번/text()&quot;&lt;/span&gt;).get()&lt;span style=&quot;color:#cc7832;&quot;&gt;,&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;                &lt;/span&gt;&lt;span style=&quot;color:#aa4926;&quot;&gt;address&lt;/span&gt;=state + &lt;span style=&quot;color:#6a8759;&quot;&gt;&quot; &quot; &lt;/span&gt;+ district + &lt;span style=&quot;color:#6a8759;&quot;&gt;&quot; &quot; &lt;/span&gt;+ item.xpath(&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;./법정동/text()&quot;&lt;/span&gt;).get().strip() + &lt;span style=&quot;color:#6a8759;&quot;&gt;&quot; &quot; &lt;/span&gt;+&lt;br /&gt;                        item.xpath(&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;./지번/text()&quot;&lt;/span&gt;).get()&lt;span style=&quot;color:#cc7832;&quot;&gt;,&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;                &lt;/span&gt;&lt;span style=&quot;color:#aa4926;&quot;&gt;age&lt;/span&gt;=item.xpath(&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;./건축년도/text()&quot;&lt;/span&gt;).get()&lt;span style=&quot;color:#cc7832;&quot;&gt;,&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;                &lt;/span&gt;&lt;span style=&quot;color:#aa4926;&quot;&gt;level&lt;/span&gt;=item.xpath(&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;./층/text()&quot;&lt;/span&gt;).get()&lt;span style=&quot;color:#cc7832;&quot;&gt;,&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;                &lt;/span&gt;&lt;span style=&quot;color:#aa4926;&quot;&gt;available_space&lt;/span&gt;=item.xpath(&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;./전용면적/text()&quot;&lt;/span&gt;).get()&lt;span style=&quot;color:#cc7832;&quot;&gt;,&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;                &lt;/span&gt;&lt;span style=&quot;color:#aa4926;&quot;&gt;trade_date&lt;/span&gt;=item.xpath(&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;./년/text()&quot;&lt;/span&gt;).get() + &lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;/&quot; &lt;/span&gt;+&lt;br /&gt;                           item.xpath(&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;./월/text()&quot;&lt;/span&gt;).get() + &lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;/&quot; &lt;/span&gt;+&lt;br /&gt;                           item.xpath(&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;./일/text()&quot;&lt;/span&gt;).get()&lt;span style=&quot;color:#cc7832;&quot;&gt;,&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;                &lt;/span&gt;&lt;span style=&quot;color:#aa4926;&quot;&gt;trade_amount&lt;/span&gt;=item.xpath(&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;./거래금액/text()&quot;&lt;/span&gt;).get().strip().replace(&lt;span style=&quot;color:#6a8759;&quot;&gt;','&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#6a8759;&quot;&gt;''&lt;/span&gt;)&lt;span style=&quot;color:#cc7832;&quot;&gt;,&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;            &lt;/span&gt;)&lt;br /&gt;&lt;br /&gt;        &lt;span style=&quot;color:#cc7832;&quot;&gt;except &lt;/span&gt;&lt;span style=&quot;color:#8888c6;&quot;&gt;Exception &lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;as &lt;/span&gt;e:&lt;br /&gt;            &lt;span style=&quot;color:#8888c6;&quot;&gt;print&lt;/span&gt;(e)&lt;br /&gt;            &lt;span style=&quot;color:#94558d;&quot;&gt;self&lt;/span&gt;.logger.error(item)&lt;br /&gt;            &lt;span style=&quot;color:#94558d;&quot;&gt;self&lt;/span&gt;.logger.error(item.xpath(&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;./아파트/text()&quot;&lt;/span&gt;).get())&lt;br /&gt;&lt;br /&gt;        &lt;span style=&quot;color:#cc7832;&quot;&gt;return &lt;/span&gt;apt_trade_data&lt;/pre&gt;&lt;ul&gt;&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;아래 scrapy crawl가 시작되는 start_requests에서 APT_TRADE.xlsx 파일을 생성하는 코드와 2006/1/1 을 나타내는 date를 정의했습니다. 부동산 공공데이터는 2006년 1월 데이터부터 제공하기 때문에 그렇습니다.&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;yield from 키워드의 역할은 간단합니다. yield 로 데이터를 산출하는 메서드의 값을 반환받아 다시 반환하는 역할을 할 뿐입니다. 이 yield from 키워드로 get_realestate_trade_data 메서드의 반환값을 반환합니다.&lt;br /&gt;&lt;pre style=&quot;background-color: rgb(43, 43, 43); color: rgb(169, 183, 198); font-family: 굴림체; font-size: 9pt;&quot;&gt;&lt;span style=&quot;color: rgb(106, 135, 89);&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;def &lt;/span&gt;&lt;span style=&quot;color: rgb(255, 198, 109);&quot;&gt;start_requests&lt;/span&gt;(&lt;span style=&quot;color: rgb(148, 85, 141);&quot;&gt;self&lt;/span&gt;):&lt;br /&gt;        date = dt.datetime(&lt;span style=&quot;color: rgb(104, 151, 187);&quot;&gt;2006&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: rgb(104, 151, 187);&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: rgb(104, 151, 187);&quot;&gt;1&lt;/span&gt;)&lt;br /&gt;        Workbook().save(&lt;span style=&quot;color: rgb(106, 135, 89);&quot;&gt;'APT_TRADE.xlsx'&lt;/span&gt;)&lt;br /&gt;        &lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;yield from &lt;/span&gt;&lt;span style=&quot;color: rgb(148, 85, 141);&quot;&gt;self&lt;/span&gt;.get_realestate_trade_data(date)&lt;/pre&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;get_realestate_trade_data에서 눈여겨 봐야할 것은 scrapy.Request 부분입니다.&amp;nbsp;여기서 callback과 cb_kwargs라는 인수가 들어가 있는 것을 알 수 있습니다. callback은 Request 요청을 통해 온 응답을 처리하는 콜백 메서드를 정의하는 인수입니다. cb_kwargs는 callback 메서드에 들어가는 인수와 그에 해당하는 인수값을 정의하는 데 쓰입니다.&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;cb_kwargs를 통해 parse 메서드에 page_num과 date 값을 전달할 수 있습니다.&lt;br /&gt;&lt;pre style=&quot;background-color: rgb(43, 43, 43); color: rgb(169, 183, 198); font-family: 굴림체; font-size: 9pt;&quot;&gt;    &lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;def &lt;/span&gt;&lt;span style=&quot;color: rgb(255, 198, 109);&quot;&gt;get_realestate_trade_data&lt;/span&gt;(&lt;span style=&quot;color: rgb(148, 85, 141);&quot;&gt;self&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;, &lt;/span&gt;date):&lt;br /&gt;        page_num = &lt;span style=&quot;color: rgb(104, 151, 187);&quot;&gt;1&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(104, 151, 187);&quot;&gt;        &lt;/span&gt;urls = [&lt;br /&gt;            CONST.APT_DETAIL_ENDPOINT&lt;br /&gt;        ]&lt;br /&gt;        params = {&lt;br /&gt;            &lt;span style=&quot;color: rgb(106, 135, 89);&quot;&gt;&quot;pageNo&quot;&lt;/span&gt;: &lt;span style=&quot;color: rgb(136, 136, 198);&quot;&gt;str&lt;/span&gt;(page_num)&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;,&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color: rgb(106, 135, 89);&quot;&gt;&quot;numOfRows&quot;&lt;/span&gt;: &lt;span style=&quot;color: rgb(106, 135, 89);&quot;&gt;&quot;999&quot;&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;,&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color: rgb(106, 135, 89);&quot;&gt;&quot;LAWD_CD&quot;&lt;/span&gt;: &lt;span style=&quot;color: rgb(106, 135, 89);&quot;&gt;&quot;44133&quot;&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;,&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color: rgb(106, 135, 89);&quot;&gt;&quot;DEAL_YMD&quot;&lt;/span&gt;: date.strftime(&lt;span style=&quot;color: rgb(106, 135, 89);&quot;&gt;&quot;%Y%m&quot;&lt;/span&gt;)&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;,&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;        &lt;/span&gt;}&lt;br /&gt;        &lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;for &lt;/span&gt;url &lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;in &lt;/span&gt;urls:&lt;br /&gt;            url += urlencode(params)&lt;br /&gt;            &lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;yield &lt;/span&gt;scrapy.Request(&lt;span style=&quot;color: rgb(170, 73, 38);&quot;&gt;url&lt;/span&gt;=url&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: rgb(170, 73, 38);&quot;&gt;callback&lt;/span&gt;=&lt;span style=&quot;color: rgb(148, 85, 141);&quot;&gt;self&lt;/span&gt;.parse&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: rgb(170, 73, 38);&quot;&gt;cb_kwargs&lt;/span&gt;=&lt;span style=&quot;color: rgb(136, 136, 198);&quot;&gt;dict&lt;/span&gt;(&lt;span style=&quot;color: rgb(170, 73, 38);&quot;&gt;page_num&lt;/span&gt;=page_num&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: rgb(170, 73, 38);&quot;&gt;date&lt;/span&gt;=date))&lt;/pre&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;parse 메서드에서 pandas의 ExcelWriter 객체를 통해 DataFrame 객체를 excel 형태로 저장하는 것을 볼 수 있습니다. 중요한 것은 excel에 다가 매번 save() 메서드로 저장하기 때문에 IO 횟수가 많아져서 속도가 느려질 것입니다. 하지만 save 메서드를 사용하지 않으면 2006~2020년도까지의 방대한 데이터가 메모리에 올라가게 되어 크롤러가 제대로 동작하지 않게 됩니다. 따라서 속도가 상당히 느려지더라도 save&amp;nbsp;메서드를 통해 요청때마다 데이터를 저장합니다. ( memory가 엄청나신 분들은 save 메서드를 크롤링이 끝나는 마지막에 추가하여 속도를 높여보세요 ㅎㅎ&amp;nbsp;)&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;relativedelta 메서드를 통해 date에 한 달씩 추가하여 정보를 요청하는 것을 볼 수 있습니다. 만약 200601 데이터를 받았다면 get_realestate_trade_data 메서드를 통해 그 다음 200602로 부동산 매매 데이터를 요청할 것입니다. 이러한 재귀적인 해결방식으로 코드를 길게 짜지 않고 깔끔하게 데이터를 받아올 수 있습니다. 202004&amp;nbsp;이후로 데이터를 받게 되면 if not items 구문에 의해 받아오는 item이 없어지게 되므로 이 크롤러는 종료될 것입니다.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;ExcelWriter에서 쓰는 engine을 openpyxl을 쓰는 이유는 xlsxwriter 엔진이 2배 정도 빠르지만 아직 ExcelWriter에서 append mode ( mode='a' ) 를 지원하지 않기 때문입니다. 물론 xlsxwriter로 다른 처리를 하면 같은 excel파일에 여러 sheet를 저장할 수 있지만 코드량이 많아지고 유지보수 하기 어려워지는 단점이 있습니다.&lt;br /&gt;&lt;pre style=&quot;background-color: rgb(43, 43, 43); color: rgb(169, 183, 198); font-family: 굴림체; font-size: 9pt;&quot;&gt;    &lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;def &lt;/span&gt;&lt;span style=&quot;color: rgb(255, 198, 109);&quot;&gt;parse&lt;/span&gt;(&lt;span style=&quot;color: rgb(148, 85, 141);&quot;&gt;self&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;, &lt;/span&gt;response&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;, &lt;/span&gt;page_num&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;, &lt;/span&gt;date):&lt;br /&gt;        selector = Selector(response&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: rgb(170, 73, 38);&quot;&gt;type&lt;/span&gt;=&lt;span style=&quot;color: rgb(106, 135, 89);&quot;&gt;'xml'&lt;/span&gt;)&lt;br /&gt;        items = selector.xpath(&lt;span style=&quot;color: rgb(106, 135, 89);&quot;&gt;'//%s' &lt;/span&gt;% &lt;span style=&quot;color: rgb(148, 85, 141);&quot;&gt;self&lt;/span&gt;.itertag)  &lt;span style=&quot;color: rgb(128, 128, 128);&quot;&gt;# self.intertag는 기본적으로 item으로 되어 있음&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 128, 128);&quot;&gt;        &lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;if not &lt;/span&gt;items:&lt;br /&gt;            &lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;return&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;        &lt;/span&gt;&lt;span style=&quot;color: rgb(106, 135, 89);&quot;&gt;&quot;&quot;&quot;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(106, 135, 89);&quot;&gt;            To remove 'Sheet' worksheet created automatically&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(106, 135, 89);&quot;&gt;        &quot;&quot;&quot;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(106, 135, 89);&quot;&gt;        &lt;/span&gt;&lt;span style=&quot;color: rgb(128, 128, 128);&quot;&gt;# if date.strftime(&quot;%Y%m&quot;) == &quot;200604&quot;:&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 128, 128);&quot;&gt;        #     wb = load_workbook('APT_TRADE.xlsx')&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 128, 128);&quot;&gt;        #     wb.remove(wb['Sheet'])&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 128, 128);&quot;&gt;        #     wb.save('APT_TRADE.xlsx')&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 128, 128);&quot;&gt;        #     return&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 128, 128);&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 128, 128);&quot;&gt;        &lt;/span&gt;apt_trades = [&lt;span style=&quot;color: rgb(148, 85, 141);&quot;&gt;self&lt;/span&gt;.parse_item(item) &lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;for &lt;/span&gt;item &lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;in &lt;/span&gt;items]&lt;br /&gt;        apt_dataframe = pd.DataFrame.from_records([apt_trade.to_dict() &lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;for &lt;/span&gt;apt_trade &lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;in &lt;/span&gt;apt_trades])&lt;br /&gt;&lt;br /&gt;        writer = pd.ExcelWriter(&lt;span style=&quot;color: rgb(106, 135, 89);&quot;&gt;'APT_TRADE.xlsx'&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: rgb(170, 73, 38);&quot;&gt;engine&lt;/span&gt;=&lt;span style=&quot;color: rgb(106, 135, 89);&quot;&gt;'openpyxl'&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: rgb(170, 73, 38);&quot;&gt;mode&lt;/span&gt;=&lt;span style=&quot;color: rgb(106, 135, 89);&quot;&gt;'a'&lt;/span&gt;)&lt;br /&gt;        apt_dataframe.to_excel(writer&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: rgb(170, 73, 38);&quot;&gt;sheet_name&lt;/span&gt;=&lt;span style=&quot;color: rgb(106, 135, 89);&quot;&gt;'천안-' &lt;/span&gt;+ date.strftime(&lt;span style=&quot;color: rgb(106, 135, 89);&quot;&gt;&quot;%Y%m&quot;&lt;/span&gt;)&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: rgb(170, 73, 38);&quot;&gt;index&lt;/span&gt;=&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;False&lt;/span&gt;)&lt;br /&gt;        writer.save()&lt;br /&gt;&lt;br /&gt;        date += relativedelta(&lt;span style=&quot;color: rgb(170, 73, 38);&quot;&gt;months&lt;/span&gt;=&lt;span style=&quot;color: rgb(104, 151, 187);&quot;&gt;1&lt;/span&gt;)&lt;br /&gt;        &lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;yield from &lt;/span&gt;&lt;span style=&quot;color: rgb(148, 85, 141);&quot;&gt;self&lt;/span&gt;.get_realestate_trade_data(date)&lt;/pre&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;결과 화면&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 728px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/991EEB375E861F2E26&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F991EEB375E861F2E26&quot; width=&quot;728&quot; height=&quot;637&quot; filename=&quot;123.PNG&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;위의 코드를 실행할 때의 크나큰&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;&amp;nbsp;단점은 메모리 용량 때문에 데이터를 받아올 때마다 E&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;xcel에 저장하여 속도가 매우 느려진다는 데에 있습니다( 제 local 컴퓨터 기준 40~50분). 또한 200601 부터 202004&amp;nbsp;년도까지의 데이터를 받아와 엑셀시트에 저장하면 이 많은 데이터를 관리하고 분석하기가 매우 어려워집니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;이 부분을 해소하기 위해서 쓰이는 것이 바로 우리가 흔히 알고 있는 Database System입니다. 전문용어로 RDBMS( Relational Database Management System ) 이라 하죠&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;. Excel이 가지고 있는 위 문제를 Database System은&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;&amp;nbsp;수월하게 해결할 수 있습니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;다음 포스팅에는 scrapy를 통해 공공데이터를 Excel이 아닌 DB에 저장하는 지 알아보도록 하겠습니다.&lt;/span&gt;&lt;/p&gt;</description>
      <category>파이썬/파이썬 웹 크롤링 - 부동산 공공데이터</category>
      <category>scrapy</category>
      <category>부동산 데이터</category>
      <category>웹 크롤링</category>
      <author>새로비</author>
      <guid isPermaLink="true">https://engkimbs.tistory.com/966</guid>
      <comments>https://engkimbs.tistory.com/entry/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%ED%81%AC%EB%A1%A4%EB%A7%81%EB%B6%80%EB%8F%99%EC%82%B0-%EB%8D%B0%EC%9D%B4%ED%84%B0-scrapy%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%98%EC%97%AC-%EC%9E%AC%EA%B7%80%EC%A0%81%EC%9C%BC%EB%A1%9C-%EB%B6%80%EB%8F%99%EC%82%B0-%EA%B3%B5%EA%B3%B5-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EC%97%B0%EC%86%8D%EC%A0%81%EC%9C%BC%EB%A1%9C-%EA%B0%80%EC%A0%B8%EC%98%A4%EA%B8%B0-%EB%B0%8F-excel-%EC%A0%80%EC%9E%A5#entry966comment</comments>
      <pubDate>Fri, 3 Apr 2020 01:57:52 +0900</pubDate>
    </item>
    <item>
      <title>[파이썬 크롤링/부동산 데이터] scrapy를 이용한 부동산 공공 데이터 저장하기(csv/excel)</title>
      <link>https://engkimbs.tistory.com/entry/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%ED%81%AC%EB%A1%A4%EB%A7%81%EB%B6%80%EB%8F%99%EC%82%B0-%EB%8D%B0%EC%9D%B4%ED%84%B0-scrapy%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%9C-%EB%B6%80%EB%8F%99%EC%82%B0-%EA%B3%B5%EA%B3%B5-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EC%A0%80%EC%9E%A5%ED%95%98%EA%B8%B0csvexcel</link>
      <description>&lt;p&gt;&lt;span style=&quot;font-size: 18pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(31, 218, 17);&quot;&gt;|&lt;/span&gt;&amp;nbsp;들어가기 전에&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://github.com/Lucorda/python-tutorial/tree/87af3be738bc739d0ba35e88e482ebfdc9d2ed56&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;GIT 저장소&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;지금 포스팅은 국토교통부에서 제공하는 부동산 공공데이터 API를 사용합니다. 아래 포스팅&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;을 보시고 먼저 부동산 공공데이터 API를 신청해주시길 바래요!&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://engkimbs.tistory.com/899&quot; target=&quot;_blank&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;[유용한 정보들] - 국토교통부 공공데이터 부동산 실거래가 API 신청 방법&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;이전 포스팅&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://engkimbs.tistory.com/961&quot; target=&quot;_blank&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;[파이썬/파이썬 웹 크롤링 - 부동산 공공데이터] - [파이썬 크롤링/부동산 데이터] 스크래피(scrapy) startproject로 초기 프로젝트 구성하기&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://engkimbs.tistory.com/962&quot; target=&quot;_blank&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;[파이썬/파이썬 웹 크롤링 - 부동산 공공데이터] - [파이썬 크롤링/부동산 데이터] scrapy를 이용한 부동산 공공 데이터 간단하게 받아오기&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://engkimbs.tistory.com/963&quot; target=&quot;_blank&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;[파이썬/파이썬 웹 크롤링 - 부동산 공공데이터] - [파이썬 크롤링/부동산 데이터] scrapy를 이용한 부동산 공공 데이터 파싱 및 추출하기&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;포스팅에 있는 내용을&amp;nbsp;따라하기 위해서는 pandas 패키지를 설치해야합니다. p&lt;/span&gt;&lt;span style=&quot;font-size: 12pt; font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;andas는 파이썬에서 사용하는 데이터분석 라이브러리로, 행과 열로 이루어진 데이터 객체를 만들어 다룰 수 있게 되며 보다 안정적으로 대용량의 데이터들을 처리하는데 매우 편리한 도구 입니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 12pt; font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;이 &lt;a href=&quot;https://engkimbs.tistory.com/672?category=763908&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;pandas의 DataFrame 자료구조&lt;/a&gt;를&amp;nbsp;이용해서 파이썬의 객체들을 csv파일 혹은 excel 파일로 쉽게 저장할 수 있습니다.&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;; font-size: 12pt;&quot;&gt;또한 DataFrame을&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;; font-size: 12pt;&quot;&gt;&amp;nbsp;통해 &lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;; font-size: 12pt;&quot;&gt;excel 파일로 데이터를 저장하기 위한 엔진이 필요한데, 이를 위해서 xlsxwriter 패키지도 같이 설치해줘야 합니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;pre style=&quot;background-color:#2b2b2b;color:#a9b7c6;font-family:'굴림체';font-size:9.0pt;&quot;&gt;&lt;p&gt;pip install pandas xlsxwriter&lt;/p&gt;&lt;/pre&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 18pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(31, 218, 17);&quot;&gt;| &lt;/span&gt;&amp;nbsp;Pandas를 이용해서 공공데이터를&amp;nbsp;csv, excel 형태로 저장하기&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;&lt;b&gt;프로젝트 구조&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;pre style=&quot;background-color:#2b2b2b;color:#a9b7c6;font-family:'굴림체';font-size:9.0pt;&quot;&gt;&lt;p&gt;|   scrapy.cfg&lt;br /&gt;\---invest_crawler&lt;br /&gt;    |   consts.py&lt;br /&gt;    |   settings.py&lt;br /&gt;    |   __init__.py&lt;br /&gt;    |&lt;br /&gt;    +---items&lt;br /&gt;    |   |   apt_trade.py&lt;br /&gt;    |   |   __init__.py&lt;br /&gt;    |&lt;br /&gt;    +---spiders&lt;br /&gt;    |   |   apt_trade_spiders.py&lt;br /&gt;    |   |   __init__.py&lt;/p&gt;&lt;/pre&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;&lt;b&gt;소스 코드&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;consts.py&lt;/b&gt;&lt;/p&gt;&lt;pre style=&quot;background-color: rgb(43, 43, 43); color: rgb(169, 183, 198); font-family: 굴림체; font-size: 9pt;&quot;&gt;&lt;p&gt;&lt;span style=&quot;color: rgb(128, 128, 128);&quot;&gt;# 샘플 더미 데이터 입니다. 어떻게 세팅하는 지 보여드리기 위해 넣은 데이터이기 때문에 그대로 사용하시면 에러가 납니다.&lt;br /&gt;&lt;/span&gt;APT_DETAIL_ENDPOINT = &lt;span style=&quot;color: rgb(106, 135, 89);&quot;&gt;&quot;http://openapi.molit.go.kr:8081/OpenAPI_ToolInstallPackage/service/rest/RTMSOBJSvc/getRTMSDataSvcAptTrade?serviceKey=asdsdfsdfWiZGAJkCsr3wM0YkDO%2BssYpNXZ%2FEWZfuIW5k%2FcHFtD5k1zcCVasdfEtBQID5rIcjXsg%3D%3D&amp;amp;&quot;&lt;/span&gt;&lt;/p&gt;&lt;/pre&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;apt_trade.py&lt;/b&gt;&lt;/p&gt;&lt;pre style=&quot;background-color:#2b2b2b;color:#a9b7c6;font-family:'굴림체';font-size:9.0pt;&quot;&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;import &lt;/span&gt;scrapy&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;class &lt;/span&gt;AptTradeScrapy(scrapy.Item):&lt;br /&gt;&lt;br /&gt;    apt_name = scrapy.Field()&lt;br /&gt;    address_1 = scrapy.Field()&lt;br /&gt;    address_2 = scrapy.Field()&lt;br /&gt;    address_3 = scrapy.Field()&lt;br /&gt;    address_4 = scrapy.Field()&lt;br /&gt;    address = scrapy.Field()&lt;br /&gt;    age = scrapy.Field()&lt;br /&gt;    level = scrapy.Field()&lt;br /&gt;    available_space = scrapy.Field()&lt;br /&gt;    trade_date = scrapy.Field()&lt;br /&gt;    trade_amount = scrapy.Field()&lt;br /&gt;&lt;br /&gt;    &lt;span style=&quot;color:#cc7832;&quot;&gt;def &lt;/span&gt;&lt;span style=&quot;color:#ffc66d;&quot;&gt;to_dict&lt;/span&gt;(&lt;span style=&quot;color:#94558d;&quot;&gt;self&lt;/span&gt;):&lt;br /&gt;        &lt;span style=&quot;color:#cc7832;&quot;&gt;return &lt;/span&gt;{&lt;br /&gt;            &lt;span style=&quot;color:#6a8759;&quot;&gt;'아파트'&lt;/span&gt;: &lt;span style=&quot;color:#94558d;&quot;&gt;self&lt;/span&gt;[&lt;span style=&quot;color:#6a8759;&quot;&gt;'apt_name'&lt;/span&gt;]&lt;span style=&quot;color:#cc7832;&quot;&gt;,&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color:#6a8759;&quot;&gt;'시/도'&lt;/span&gt;: &lt;span style=&quot;color:#94558d;&quot;&gt;self&lt;/span&gt;[&lt;span style=&quot;color:#6a8759;&quot;&gt;'address_1'&lt;/span&gt;]&lt;span style=&quot;color:#cc7832;&quot;&gt;,&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color:#6a8759;&quot;&gt;'군/구'&lt;/span&gt;: &lt;span style=&quot;color:#94558d;&quot;&gt;self&lt;/span&gt;[&lt;span style=&quot;color:#6a8759;&quot;&gt;'address_2'&lt;/span&gt;]&lt;span style=&quot;color:#cc7832;&quot;&gt;,&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color:#6a8759;&quot;&gt;'동/읍/면'&lt;/span&gt;: &lt;span style=&quot;color:#94558d;&quot;&gt;self&lt;/span&gt;[&lt;span style=&quot;color:#6a8759;&quot;&gt;'address_3'&lt;/span&gt;]&lt;span style=&quot;color:#cc7832;&quot;&gt;,&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color:#6a8759;&quot;&gt;'번지'&lt;/span&gt;: &lt;span style=&quot;color:#94558d;&quot;&gt;self&lt;/span&gt;[&lt;span style=&quot;color:#6a8759;&quot;&gt;'address_4'&lt;/span&gt;]&lt;span style=&quot;color:#cc7832;&quot;&gt;,&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color:#6a8759;&quot;&gt;'전체주소'&lt;/span&gt;: &lt;span style=&quot;color:#94558d;&quot;&gt;self&lt;/span&gt;[&lt;span style=&quot;color:#6a8759;&quot;&gt;'address'&lt;/span&gt;]&lt;span style=&quot;color:#cc7832;&quot;&gt;,&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color:#6a8759;&quot;&gt;'연식'&lt;/span&gt;: &lt;span style=&quot;color:#94558d;&quot;&gt;self&lt;/span&gt;[&lt;span style=&quot;color:#6a8759;&quot;&gt;'age'&lt;/span&gt;]&lt;span style=&quot;color:#cc7832;&quot;&gt;,&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color:#6a8759;&quot;&gt;'층'&lt;/span&gt;: &lt;span style=&quot;color:#94558d;&quot;&gt;self&lt;/span&gt;[&lt;span style=&quot;color:#6a8759;&quot;&gt;'level'&lt;/span&gt;]&lt;span style=&quot;color:#cc7832;&quot;&gt;,&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color:#6a8759;&quot;&gt;'면적'&lt;/span&gt;: &lt;span style=&quot;color:#94558d;&quot;&gt;self&lt;/span&gt;[&lt;span style=&quot;color:#6a8759;&quot;&gt;'available_space'&lt;/span&gt;]&lt;span style=&quot;color:#cc7832;&quot;&gt;,&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color:#6a8759;&quot;&gt;'거래일자'&lt;/span&gt;: &lt;span style=&quot;color:#94558d;&quot;&gt;self&lt;/span&gt;[&lt;span style=&quot;color:#6a8759;&quot;&gt;'trade_date'&lt;/span&gt;]&lt;span style=&quot;color:#cc7832;&quot;&gt;,&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color:#6a8759;&quot;&gt;'매매가격'&lt;/span&gt;: &lt;span style=&quot;color:#94558d;&quot;&gt;self&lt;/span&gt;[&lt;span style=&quot;color:#6a8759;&quot;&gt;'trade_amount'&lt;/span&gt;]&lt;br /&gt;        }&lt;/pre&gt;&lt;ul style=&quot;list-style-type: disc;&quot;&gt;&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;to_dict 메서드를 AptTradeScrapy item에 추가하였습니다. 이 메서드를 작성한 목적은 pandas에서 지원하는 DataFrame 자료구조로 item을 쉽게 변환하기 위해 추가한 것입니다.&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;여기서 조금 헷갈리실 수 있는 부분은 to_dict에서 self 키워드일 것입니다. 이 self 키워드는 객체 자기자신을 나타냅니다. scrapy에서 item의 속성값은 [ ] 같이 대괄호를 통해 접근할 수 있습니다. 따라서 자기자신을 나타내는 키워드인 self에 [ ] 안에 속성명을 집어넣어 데이터를 구성하는 것입니다.&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;apt_trade_spiders.py&lt;/b&gt;&lt;/p&gt;&lt;pre style=&quot;background-color:#2b2b2b;color:#a9b7c6;font-family:'굴림체';font-size:9.0pt;&quot;&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;import &lt;/span&gt;datetime &lt;span style=&quot;color:#cc7832;&quot;&gt;as &lt;/span&gt;dt&lt;br /&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;from &lt;/span&gt;urllib.parse &lt;span style=&quot;color:#cc7832;&quot;&gt;import &lt;/span&gt;urlencode&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;import &lt;/span&gt;scrapy&lt;br /&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;from &lt;/span&gt;scrapy &lt;span style=&quot;color:#cc7832;&quot;&gt;import &lt;/span&gt;Selector&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;import &lt;/span&gt;invest_crawler.consts &lt;span style=&quot;color:#cc7832;&quot;&gt;as &lt;/span&gt;CONST&lt;br /&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;from &lt;/span&gt;invest_crawler.items.apt_trade &lt;span style=&quot;color:#cc7832;&quot;&gt;import &lt;/span&gt;AptTradeScrapy&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;import &lt;/span&gt;pandas &lt;span style=&quot;color:#cc7832;&quot;&gt;as &lt;/span&gt;pd&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;class &lt;/span&gt;TradeSpider(scrapy.spiders.XMLFeedSpider):&lt;br /&gt;    name = &lt;span style=&quot;color:#6a8759;&quot;&gt;'trade'&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#6a8759;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#6a8759;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;def &lt;/span&gt;&lt;span style=&quot;color:#ffc66d;&quot;&gt;start_requests&lt;/span&gt;(&lt;span style=&quot;color:#94558d;&quot;&gt;self&lt;/span&gt;):&lt;br /&gt;        page_num = &lt;span style=&quot;color:#6897bb;&quot;&gt;1&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#6897bb;&quot;&gt;        &lt;/span&gt;date = dt.datetime(&lt;span style=&quot;color:#6897bb;&quot;&gt;2006&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#6897bb;&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#6897bb;&quot;&gt;1&lt;/span&gt;)&lt;br /&gt;        urls = [&lt;br /&gt;            CONST.APT_DETAIL_ENDPOINT&lt;br /&gt;        ]&lt;br /&gt;        params = {&lt;br /&gt;            &lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;pageNo&quot;&lt;/span&gt;: &lt;span style=&quot;color:#8888c6;&quot;&gt;str&lt;/span&gt;(page_num)&lt;span style=&quot;color:#cc7832;&quot;&gt;,&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;numOfRows&quot;&lt;/span&gt;: &lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;999&quot;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;,&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;LAWD_CD&quot;&lt;/span&gt;: &lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;44133&quot;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;,&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;DEAL_YMD&quot;&lt;/span&gt;: date.strftime(&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;%Y%m&quot;&lt;/span&gt;)&lt;span style=&quot;color:#cc7832;&quot;&gt;,&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;        &lt;/span&gt;}&lt;br /&gt;        &lt;span style=&quot;color:#cc7832;&quot;&gt;for &lt;/span&gt;url &lt;span style=&quot;color:#cc7832;&quot;&gt;in &lt;/span&gt;urls:&lt;br /&gt;            url += urlencode(params)&lt;br /&gt;            &lt;span style=&quot;color:#cc7832;&quot;&gt;yield &lt;/span&gt;scrapy.Request(&lt;span style=&quot;color:#aa4926;&quot;&gt;url&lt;/span&gt;=url)&lt;br /&gt;&lt;br /&gt;    &lt;span style=&quot;color:#cc7832;&quot;&gt;def &lt;/span&gt;&lt;span style=&quot;color:#ffc66d;&quot;&gt;parse&lt;/span&gt;(&lt;span style=&quot;color:#94558d;&quot;&gt;self&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;response):&lt;br /&gt;        selector = Selector(response&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#aa4926;&quot;&gt;type&lt;/span&gt;=&lt;span style=&quot;color:#6a8759;&quot;&gt;'xml'&lt;/span&gt;)&lt;br /&gt;        items = selector.xpath(&lt;span style=&quot;color:#6a8759;&quot;&gt;'//%s' &lt;/span&gt;% &lt;span style=&quot;color:#94558d;&quot;&gt;self&lt;/span&gt;.itertag)  &lt;span style=&quot;color:#808080;&quot;&gt;# self.intertag는 기본적으로 item으로 되어 있음&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#808080;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#808080;&quot;&gt;        &lt;/span&gt;apt_trades = [&lt;span style=&quot;color:#94558d;&quot;&gt;self&lt;/span&gt;.parse_item(item) &lt;span style=&quot;color:#cc7832;&quot;&gt;for &lt;/span&gt;item &lt;span style=&quot;color:#cc7832;&quot;&gt;in &lt;/span&gt;items]&lt;br /&gt;        apt_dataframe = pd.DataFrame.from_records([apt_trade.to_dict() &lt;span style=&quot;color:#cc7832;&quot;&gt;for &lt;/span&gt;apt_trade &lt;span style=&quot;color:#cc7832;&quot;&gt;in &lt;/span&gt;apt_trades])&lt;br /&gt;&lt;br /&gt;        writer = pd.ExcelWriter(&lt;span style=&quot;color:#6a8759;&quot;&gt;'APT_TRADE.xlsx'&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#aa4926;&quot;&gt;engine&lt;/span&gt;=&lt;span style=&quot;color:#6a8759;&quot;&gt;'xlsxwriter'&lt;/span&gt;)&lt;br /&gt;        apt_dataframe.to_excel(writer&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#aa4926;&quot;&gt;sheet_name&lt;/span&gt;=&lt;span style=&quot;color:#6a8759;&quot;&gt;'Cheonan'&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#aa4926;&quot;&gt;index&lt;/span&gt;=&lt;span style=&quot;color:#cc7832;&quot;&gt;False&lt;/span&gt;)&lt;br /&gt;        writer.save()&lt;br /&gt;&lt;br /&gt;    &lt;span style=&quot;color:#cc7832;&quot;&gt;def &lt;/span&gt;&lt;span style=&quot;color:#ffc66d;&quot;&gt;parse_item&lt;/span&gt;(&lt;span style=&quot;color:#94558d;&quot;&gt;self&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;item):&lt;br /&gt;        state = &lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;천안시&quot;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#6a8759;&quot;&gt;        &lt;/span&gt;district = &lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;서북구&quot;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#6a8759;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#6a8759;&quot;&gt;        &lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;try&lt;/span&gt;:&lt;br /&gt;            apt_trade_data = AptTradeScrapy(&lt;br /&gt;                &lt;span style=&quot;color:#aa4926;&quot;&gt;apt_name&lt;/span&gt;=item.xpath(&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;./아파트/text()&quot;&lt;/span&gt;).get()&lt;span style=&quot;color:#cc7832;&quot;&gt;,&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;                &lt;/span&gt;&lt;span style=&quot;color:#aa4926;&quot;&gt;address_1&lt;/span&gt;=state&lt;span style=&quot;color:#cc7832;&quot;&gt;,&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;                &lt;/span&gt;&lt;span style=&quot;color:#aa4926;&quot;&gt;address_2&lt;/span&gt;=district&lt;span style=&quot;color:#cc7832;&quot;&gt;,&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;                &lt;/span&gt;&lt;span style=&quot;color:#aa4926;&quot;&gt;address_3&lt;/span&gt;=item.xpath(&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;./법정동/text()&quot;&lt;/span&gt;).get().strip()&lt;span style=&quot;color:#cc7832;&quot;&gt;,&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;                &lt;/span&gt;&lt;span style=&quot;color:#aa4926;&quot;&gt;address_4&lt;/span&gt;=item.xpath(&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;./지번/text()&quot;&lt;/span&gt;).get()&lt;span style=&quot;color:#cc7832;&quot;&gt;,&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;                &lt;/span&gt;&lt;span style=&quot;color:#aa4926;&quot;&gt;address&lt;/span&gt;=state + &lt;span style=&quot;color:#6a8759;&quot;&gt;&quot; &quot; &lt;/span&gt;+ district + &lt;span style=&quot;color:#6a8759;&quot;&gt;&quot; &quot; &lt;/span&gt;+ item.xpath(&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;./법정동/text()&quot;&lt;/span&gt;).get().strip() + &lt;span style=&quot;color:#6a8759;&quot;&gt;&quot; &quot; &lt;/span&gt;+&lt;br /&gt;                        item.xpath(&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;./지번/text()&quot;&lt;/span&gt;).get()&lt;span style=&quot;color:#cc7832;&quot;&gt;,&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;                &lt;/span&gt;&lt;span style=&quot;color:#aa4926;&quot;&gt;age&lt;/span&gt;=item.xpath(&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;./건축년도/text()&quot;&lt;/span&gt;).get()&lt;span style=&quot;color:#cc7832;&quot;&gt;,&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;                &lt;/span&gt;&lt;span style=&quot;color:#aa4926;&quot;&gt;level&lt;/span&gt;=item.xpath(&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;./층/text()&quot;&lt;/span&gt;).get()&lt;span style=&quot;color:#cc7832;&quot;&gt;,&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;                &lt;/span&gt;&lt;span style=&quot;color:#aa4926;&quot;&gt;available_space&lt;/span&gt;=item.xpath(&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;./전용면적/text()&quot;&lt;/span&gt;).get()&lt;span style=&quot;color:#cc7832;&quot;&gt;,&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;                &lt;/span&gt;&lt;span style=&quot;color:#aa4926;&quot;&gt;trade_date&lt;/span&gt;=item.xpath(&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;./년/text()&quot;&lt;/span&gt;).get() + &lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;/&quot; &lt;/span&gt;+&lt;br /&gt;                           item.xpath(&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;./월/text()&quot;&lt;/span&gt;).get() + &lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;/&quot; &lt;/span&gt;+&lt;br /&gt;                           item.xpath(&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;./일/text()&quot;&lt;/span&gt;).get()&lt;span style=&quot;color:#cc7832;&quot;&gt;,&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;                &lt;/span&gt;&lt;span style=&quot;color:#aa4926;&quot;&gt;trade_amount&lt;/span&gt;=item.xpath(&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;./거래금액/text()&quot;&lt;/span&gt;).get().strip().replace(&lt;span style=&quot;color:#6a8759;&quot;&gt;','&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#6a8759;&quot;&gt;''&lt;/span&gt;)&lt;span style=&quot;color:#cc7832;&quot;&gt;,&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;            &lt;/span&gt;)&lt;br /&gt;&lt;br /&gt;        &lt;span style=&quot;color:#cc7832;&quot;&gt;except &lt;/span&gt;&lt;span style=&quot;color:#8888c6;&quot;&gt;Exception &lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;as &lt;/span&gt;e:&lt;br /&gt;            &lt;span style=&quot;color:#8888c6;&quot;&gt;print&lt;/span&gt;(e)&lt;br /&gt;            &lt;span style=&quot;color:#94558d;&quot;&gt;self&lt;/span&gt;.logger.error(item)&lt;br /&gt;            &lt;span style=&quot;color:#94558d;&quot;&gt;self&lt;/span&gt;.logger.error(item.xpath(&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;./아파트/text()&quot;&lt;/span&gt;).get())&lt;br /&gt;&lt;br /&gt;        &lt;span style=&quot;color:#cc7832;&quot;&gt;return &lt;/span&gt;apt_trade_data&lt;/pre&gt;&lt;ul&gt;&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;아래 코드에서는 파이썬의 LC(List Comprehension)을 통해 파이썬의 리스트에 담길 item들을 손쉽게 구성하는 것을 볼 수 있습니다.&lt;br /&gt;&lt;pre style=&quot;background-color:#2b2b2b;color:#a9b7c6;font-family:'굴림체';font-size:9.0pt;&quot;&gt;apt_trades = [&lt;span style=&quot;color:#94558d;&quot;&gt;self&lt;/span&gt;.parse_item(item) &lt;span style=&quot;color:#cc7832;&quot;&gt;for &lt;/span&gt;item &lt;span style=&quot;color:#cc7832;&quot;&gt;in &lt;/span&gt;items]&lt;/pre&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul style=&quot;list-style-type: disc;&quot;&gt;&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;또한 위에서 정의해둔 to_dict 메서드를 통해 파이썬 객체 리스트를 손쉽게 pandas에서 제공하는 DataFrame 자료구조로 변환하는 모습입니다.&lt;br /&gt;&lt;pre style=&quot;background-color:#2b2b2b;color:#a9b7c6;font-family:'굴림체';font-size:9.0pt;&quot;&gt;apt_dataframe = pd.DataFrame.from_records([apt_trade.to_dict() &lt;span style=&quot;color:#cc7832;&quot;&gt;for &lt;/span&gt;apt_trade &lt;span style=&quot;color:#cc7832;&quot;&gt;in &lt;/span&gt;apt_trades])&lt;/pre&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;DataFrame으로 자료를 구성했다면 DataFrame에서 제공하는 저장기능으로 csv 혹은 excel 파일 형식으로 손쉽게 저장할 수 있습니다. 저장하는 코드는 아래와 같습니다. 파일 이름과 sheet_name을 지정하는 것을 눈여겨 봐주셔야 합니다.&lt;br /&gt;&lt;pre style=&quot;background-color:#2b2b2b;color:#a9b7c6;font-family:'굴림체';font-size:9.0pt;&quot;&gt;&lt;br /&gt;writer = pd.ExcelWriter(&lt;span style=&quot;color:#6a8759;&quot;&gt;'APT_TRADE.xlsx'&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#aa4926;&quot;&gt;engine&lt;/span&gt;=&lt;span style=&quot;color:#6a8759;&quot;&gt;'xlsxwriter'&lt;/span&gt;)&lt;br /&gt;apt_dataframe.to_excel(writer&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#aa4926;&quot;&gt;sheet_name&lt;/span&gt;=&lt;span style=&quot;color:#6a8759;&quot;&gt;'Cheonan'&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#aa4926;&quot;&gt;index&lt;/span&gt;=&lt;span style=&quot;color:#cc7832;&quot;&gt;False&lt;/span&gt;)&lt;br /&gt;writer.save()&lt;/pre&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;결과 화면&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 728px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/99B32B385E78E3F23E&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F99B32B385E78E3F23E&quot; width=&quot;728&quot; height=&quot;757&quot; filename=&quot;12.PNG&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;다음 포스팅에는 scrapy를 통해 공공데이터를 어떻게 연속적으로 쉽게 가져올 수 있을 지를 보겠습니다.&lt;/span&gt;&lt;/p&gt;</description>
      <category>파이썬/파이썬 웹 크롤링 - 부동산 공공데이터</category>
      <category>scrapy</category>
      <category>부동산 공공데이터</category>
      <category>부동산 데이터</category>
      <author>새로비</author>
      <guid isPermaLink="true">https://engkimbs.tistory.com/964</guid>
      <comments>https://engkimbs.tistory.com/entry/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%ED%81%AC%EB%A1%A4%EB%A7%81%EB%B6%80%EB%8F%99%EC%82%B0-%EB%8D%B0%EC%9D%B4%ED%84%B0-scrapy%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%9C-%EB%B6%80%EB%8F%99%EC%82%B0-%EA%B3%B5%EA%B3%B5-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EC%A0%80%EC%9E%A5%ED%95%98%EA%B8%B0csvexcel#entry964comment</comments>
      <pubDate>Tue, 24 Mar 2020 01:36:35 +0900</pubDate>
    </item>
    <item>
      <title>[파이썬 크롤링/부동산 데이터] scrapy를 이용한 부동산 공공 데이터 파싱 및 추출하기</title>
      <link>https://engkimbs.tistory.com/entry/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%ED%81%AC%EB%A1%A4%EB%A7%81%EB%B6%80%EB%8F%99%EC%82%B0-%EB%8D%B0%EC%9D%B4%ED%84%B0-scrapy%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%9C-%EB%B6%80%EB%8F%99%EC%82%B0-%EA%B3%B5%EA%B3%B5-%EB%8D%B0%EC%9D%B4%ED%84%B0-%ED%8C%8C%EC%8B%B1-%EB%B0%8F-%EC%B6%94%EC%B6%9C%ED%95%98%EA%B8%B0</link>
      <description>&lt;p&gt;&lt;span style=&quot;font-size: 18pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(31, 218, 17);&quot;&gt;|&lt;/span&gt;&amp;nbsp;들어가기 전에&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://github.com/Lucorda/python-tutorial/tree/f83b57e892f80a89d62eaba122de82aa7f195859&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;GIT 저장소&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;지금 포스팅은 국토교통부에서 제공하는 부동산 공공데이터 API를 사용합니다. 아래 포스팅&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;을 보시고 먼저 부동산 공공데이터 API를 신청해주시길 바래요!&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://engkimbs.tistory.com/899&quot; target=&quot;_blank&quot;&gt;[유용한 정보들] - 국토교통부 공공데이터 부동산 실거래가 API 신청 방법&lt;/a&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;이전 포스팅&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://engkimbs.tistory.com/961&quot; target=&quot;_blank&quot;&gt;[파이썬/파이썬 웹 크롤링 - 부동산 공공데이터] - [파이썬 크롤링/부동산 데이터] 스크래피(scrapy) startproject로 초기 프로젝트 구성하기&lt;/a&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://engkimbs.tistory.com/962&quot; target=&quot;_blank&quot;&gt;[파이썬/파이썬 웹 크롤링 - 부동산 공공데이터] - [파이썬 크롤링/부동산 데이터] scrapy를 이용한 부동산 공공 데이터 간단하게 받아오기&lt;/a&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 18pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(31, 218, 17);&quot;&gt;|&amp;nbsp;&lt;/span&gt;국토교통부 부동산 매매데이터 분석 및 추출&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;국토교통부에서 제공하는 공공 데이터 포맷은 다음과 같이 xml 포맷으로 전송됩니다.&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 728px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/99C0A1435E6F4CD205&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F99C0A1435E6F4CD205&quot; width=&quot;728&quot; height=&quot;692&quot; filename=&quot;캡처_2020_03_14_17_38_51_650.png&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;이번 포스팅에서는 위 xml 데이터에서&amp;nbsp;거래금액, 건축년도, 년 등의 데이터를 추출하는 방법을 다룰 것입니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 18pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(31, 218, 17);&quot;&gt;| &lt;/span&gt;Selector와 xpath를 이용해서 매매데이터 쉽게 추출하기&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;&lt;b&gt;프로젝트 구조&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;pre style=&quot;background-color:#2b2b2b;color:#a9b7c6;font-family:'굴림체';font-size:9.0pt;&quot;&gt;|   scrapy.cfg&lt;br /&gt;|&lt;br /&gt;\---invest_crawler&lt;br /&gt;    |   consts.py&lt;br /&gt;    |   settings.py&lt;br /&gt;    |   __init__.py&lt;br /&gt;    |&lt;br /&gt;    +---items&lt;br /&gt;    |   |   apt_trade.py&lt;br /&gt;    |   |   __init__.py&lt;br /&gt;    +---spiders&lt;br /&gt;    |   |   apt_trade_spiders.py&lt;br /&gt;    |   |   __init__.py&lt;/pre&gt;&lt;ul&gt;&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;간단한 items 파이썬 패키지를 추가했습니다. item은 scrapy에서 데이터를 담아두는 바구니 역할을 합니다. 프로그래밍 세계에서 쓰는 고급진 말로 DTO(Data Transfer Object)라고 합니다.&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;&lt;b&gt;소스 코드&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;consts.py&lt;/b&gt;&lt;/p&gt;&lt;pre style=&quot;background-color: rgb(43, 43, 43); color: rgb(169, 183, 198); font-family: 굴림체; font-size: 9pt;&quot;&gt;&lt;p&gt;&lt;span style=&quot;color: rgb(128, 128, 128);&quot;&gt;# 샘플 더미 데이터 입니다. 어떻게 세팅하는 지 보여드리기 위해 넣은 데이터이기 때문에 그대로 사용하시면 에러가 납니다.&lt;br /&gt;&lt;/span&gt;APT_DETAIL_ENDPOINT = &lt;span style=&quot;color: rgb(106, 135, 89);&quot;&gt;&quot;http://openapi.molit.go.kr:8081/OpenAPI_ToolInstallPackage/service/rest/RTMSOBJSvc/getRTMSDataSvcAptTrade?serviceKey=asdsdfsdfWiZGAJkCsr3wM0YkDO%2BssYpNXZ%2FEWZfuIW5k%2FcHFtD5k1zcCVasdfEtBQID5rIcjXsg%3D%3D&amp;amp;&quot;&lt;/span&gt;&lt;/p&gt;&lt;/pre&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;apt_trade.py&lt;/b&gt;&lt;/p&gt;&lt;pre style=&quot;background-color:#2b2b2b;color:#a9b7c6;font-family:'굴림체';font-size:9.0pt;&quot;&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;import &lt;/span&gt;scrapy&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;class &lt;/span&gt;AptTradeScrapy(scrapy.Item):&lt;br /&gt;&lt;br /&gt;    apt_name = scrapy.Field()&lt;br /&gt;    address_1 = scrapy.Field()&lt;br /&gt;    address_2 = scrapy.Field()&lt;br /&gt;    address_3 = scrapy.Field()&lt;br /&gt;    address_4 = scrapy.Field()&lt;br /&gt;    address = scrapy.Field()&lt;br /&gt;    age = scrapy.Field()&lt;br /&gt;    level = scrapy.Field()&lt;br /&gt;    available_space = scrapy.Field()&lt;br /&gt;    trade_date = scrapy.Field()&lt;br /&gt;    trade_amount = scrapy.Field()&lt;/pre&gt;&lt;ul style=&quot;list-style-type: disc;&quot;&gt;&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;매매 데이터를 담는 item인 인스턴스의 설계도인 AptTradeScrapy 클래스를 작성했습니다. scrapy.Item을 상속받았은 것에 주목하세요! 또한 scrapy.Field를 통해 파이썬의 각 속성이 scrapy의 필드라는 것을 명시해야 합니다.&lt;/span&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;apt_trade_spiders.py&lt;/b&gt;&lt;/p&gt;&lt;pre style=&quot;background-color:#2b2b2b;color:#a9b7c6;font-family:'굴림체';font-size:9.0pt;&quot;&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;import &lt;/span&gt;datetime &lt;span style=&quot;color:#cc7832;&quot;&gt;as &lt;/span&gt;dt&lt;br /&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;from &lt;/span&gt;urllib.parse &lt;span style=&quot;color:#cc7832;&quot;&gt;import &lt;/span&gt;urlencode&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;import &lt;/span&gt;scrapy&lt;br /&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;from &lt;/span&gt;scrapy &lt;span style=&quot;color:#cc7832;&quot;&gt;import &lt;/span&gt;Selector&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;import &lt;/span&gt;invest_crawler.consts &lt;span style=&quot;color:#cc7832;&quot;&gt;as &lt;/span&gt;CONST&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;class &lt;/span&gt;TradeSpider(scrapy.spiders.XMLFeedSpider):&lt;br /&gt;    name = &lt;span style=&quot;color:#6a8759;&quot;&gt;'trade'&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#6a8759;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#6a8759;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;def &lt;/span&gt;&lt;span style=&quot;color:#ffc66d;&quot;&gt;start_requests&lt;/span&gt;(&lt;span style=&quot;color:#94558d;&quot;&gt;self&lt;/span&gt;):&lt;br /&gt;        page_num = &lt;span style=&quot;color:#6897bb;&quot;&gt;1&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#6897bb;&quot;&gt;        &lt;/span&gt;date = dt.datetime(&lt;span style=&quot;color:#6897bb;&quot;&gt;2006&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#6897bb;&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#6897bb;&quot;&gt;1&lt;/span&gt;)&lt;br /&gt;        urls = [&lt;br /&gt;            CONST.APT_DETAIL_ENDPOINT&lt;br /&gt;        ]&lt;br /&gt;        params = {&lt;br /&gt;            &lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;pageNo&quot;&lt;/span&gt;: &lt;span style=&quot;color:#8888c6;&quot;&gt;str&lt;/span&gt;(page_num)&lt;span style=&quot;color:#cc7832;&quot;&gt;,&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;numOfRows&quot;&lt;/span&gt;: &lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;999&quot;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;,&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;LAWD_CD&quot;&lt;/span&gt;: &lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;44133&quot;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;,&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;DEAL_YMD&quot;&lt;/span&gt;: date.strftime(&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;%Y%m&quot;&lt;/span&gt;)&lt;span style=&quot;color:#cc7832;&quot;&gt;,&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;        &lt;/span&gt;}&lt;br /&gt;        &lt;span style=&quot;color:#cc7832;&quot;&gt;for &lt;/span&gt;url &lt;span style=&quot;color:#cc7832;&quot;&gt;in &lt;/span&gt;urls:&lt;br /&gt;            url += urlencode(params)&lt;br /&gt;            &lt;span style=&quot;color:#8888c6;&quot;&gt;print&lt;/span&gt;(url)&lt;br /&gt;            &lt;span style=&quot;color:#cc7832;&quot;&gt;yield &lt;/span&gt;scrapy.Request(&lt;span style=&quot;color:#aa4926;&quot;&gt;url&lt;/span&gt;=url)&lt;br /&gt;&lt;br /&gt;    &lt;span style=&quot;color:#cc7832;&quot;&gt;def &lt;/span&gt;&lt;span style=&quot;color:#ffc66d;&quot;&gt;parse&lt;/span&gt;(&lt;span style=&quot;color:#94558d;&quot;&gt;self&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;response):&lt;br /&gt;        selector = Selector(response&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#aa4926;&quot;&gt;type&lt;/span&gt;=&lt;span style=&quot;color:#6a8759;&quot;&gt;'xml'&lt;/span&gt;)&lt;br /&gt;        items = selector.xpath(&lt;span style=&quot;color:#6a8759;&quot;&gt;'//%s' &lt;/span&gt;% &lt;span style=&quot;color:#94558d;&quot;&gt;self&lt;/span&gt;.itertag)  &lt;span style=&quot;color:#808080;&quot;&gt;# self.intertag는 기본적으로 item으로 되어 있음&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#808080;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#808080;&quot;&gt;        &lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;for &lt;/span&gt;item &lt;span style=&quot;color:#cc7832;&quot;&gt;in &lt;/span&gt;items:&lt;br /&gt;            &lt;span style=&quot;color:#8888c6;&quot;&gt;print&lt;/span&gt;(item)&lt;/pre&gt;&lt;ul&gt;&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;parse 메서드에 scrapy에서 데이터를 추출하는 데 쓰이는 객체인 Selector가 코드에 들어있는 것을 볼 수 있습니다. 이 Selector는 xml, html&amp;nbsp;같은 HTTP 응답 포맷에 따라 데이터를 추출하는 데 유용하게 사용할 수 있습니다.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;font face=&quot;Arial Black&quot;&gt;xpath란 xml 포맷에서 각 데이터가 위치한 경로를 효과적으로 나타내기 위한 방식입니다. 이 xpath를 이용하면 여러 개로 나뉘어진 xml 태그들을 쉽게 추출할 수 있는 것은 물론 다소 까다로운 조건으로 추출해야하는 xml 태그들도 손쉽게 뽑아낼 수 있습니다.&amp;nbsp;&lt;br /&gt;여기서 xpath는 위 코드에서 selector.xpath('//item')으로 해석되어 집니다. 이 의미는 xml 포맷 데이터에서 모든 item 태그들을 선택하라라는 의미와 같습니다.&amp;nbsp;&lt;/font&gt;&lt;/li&gt;&lt;li&gt;&lt;font face=&quot;Arial Black&quot;&gt;for .. in 구문을 이용하여 xpath를 통해 추출된 item들을 순회하는 코드입니다. 위 코드를 아래 실행 명령어를 통해 실행하게 되면 다음과 같은 결과값이 콘솔에 나올 것 입니다.&amp;nbsp;&lt;/font&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;실행 명령어&lt;/b&gt;&lt;/p&gt;&lt;pre style=&quot;background-color: rgb(43, 43, 43); color: rgb(169, 183, 198); font-family: 굴림체; font-size: 9pt;&quot;&gt;scrapy crawl trade&lt;/pre&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;결과 화면&lt;/b&gt;&lt;/p&gt;&lt;pre style=&quot;background-color:#2b2b2b;color:#a9b7c6;font-family:'굴림체';font-size:9.0pt;&quot;&gt;&lt;p&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;[... 생략 ...]
&amp;lt;Selector &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;xpath=&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;'//item' &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;data=&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;'&amp;lt;item&amp;gt;&amp;lt;거래금액&amp;gt;     8,950&amp;lt;/거래금액&amp;gt;&amp;lt;건축년도&amp;gt;19...'&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;Selector &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;xpath=&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;'//item' &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;data=&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;'&amp;lt;item&amp;gt;&amp;lt;거래금액&amp;gt;     9,100&amp;lt;/거래금액&amp;gt;&amp;lt;건축년도&amp;gt;19...'&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;Selector &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;xpath=&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;'//item' &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;data=&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;'&amp;lt;item&amp;gt;&amp;lt;거래금액&amp;gt;    14,000&amp;lt;/거래금액&amp;gt;&amp;lt;건축년도&amp;gt;19...'&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;Selector &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;xpath=&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;'//item' &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;data=&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;'&amp;lt;item&amp;gt;&amp;lt;거래금액&amp;gt;    13,000&amp;lt;/거래금액&amp;gt;&amp;lt;건축년도&amp;gt;19...'&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;Selector &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;xpath=&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;'//item' &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;data=&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;'&amp;lt;item&amp;gt;&amp;lt;거래금액&amp;gt;    10,000&amp;lt;/거래금액&amp;gt;&amp;lt;건축년도&amp;gt;19...'&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;Selector &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;xpath=&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;'//item' &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;data=&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;'&amp;lt;item&amp;gt;&amp;lt;거래금액&amp;gt;     9,050&amp;lt;/거래금액&amp;gt;&amp;lt;건축년도&amp;gt;19...'&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;Selector &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;xpath=&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;'//item' &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;data=&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;'&amp;lt;item&amp;gt;&amp;lt;거래금액&amp;gt;     9,200&amp;lt;/거래금액&amp;gt;&amp;lt;건축년도&amp;gt;19...'&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;Selector &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;xpath=&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;'//item' &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;data=&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;'&amp;lt;item&amp;gt;&amp;lt;거래금액&amp;gt;     9,500&amp;lt;/거래금액&amp;gt;&amp;lt;건축년도&amp;gt;19...'&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;Selector &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;xpath=&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;'//item' &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;data=&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;'&amp;lt;item&amp;gt;&amp;lt;거래금액&amp;gt;     9,350&amp;lt;/거래금액&amp;gt;&amp;lt;건축년도&amp;gt;19...'&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;Selector &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;xpath=&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;'//item' &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;data=&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;'&amp;lt;item&amp;gt;&amp;lt;거래금액&amp;gt;    10,000&amp;lt;/거래금액&amp;gt;&amp;lt;건축년도&amp;gt;19...'&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;Selector &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;xpath=&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;'//item' &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;data=&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;'&amp;lt;item&amp;gt;&amp;lt;거래금액&amp;gt;     9,300&amp;lt;/거래금액&amp;gt;&amp;lt;건축년도&amp;gt;19...'&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;Selector &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;xpath=&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;'//item' &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;data=&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;'&amp;lt;item&amp;gt;&amp;lt;거래금액&amp;gt;    13,100&amp;lt;/거래금액&amp;gt;&amp;lt;건축년도&amp;gt;19...'&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;Selector &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;xpath=&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;'//item' &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;data=&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;'&amp;lt;item&amp;gt;&amp;lt;거래금액&amp;gt;     7,800&amp;lt;/거래금액&amp;gt;&amp;lt;건축년도&amp;gt;19...'&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;Selector &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;xpath=&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;'//item' &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;data=&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;'&amp;lt;item&amp;gt;&amp;lt;거래금액&amp;gt;     8,500&amp;lt;/거래금액&amp;gt;&amp;lt;건축년도&amp;gt;19...'&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;Selector &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;xpath=&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;'//item' &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;data=&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;'&amp;lt;item&amp;gt;&amp;lt;거래금액&amp;gt;    21,600&amp;lt;/거래금액&amp;gt;&amp;lt;건축년도&amp;gt;20...'&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;Selector &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;xpath=&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;'//item' &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;data=&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;'&amp;lt;item&amp;gt;&amp;lt;거래금액&amp;gt;     9,500&amp;lt;/거래금액&amp;gt;&amp;lt;건축년도&amp;gt;19...'&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;Selector &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;xpath=&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;'//item' &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;data=&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;'&amp;lt;item&amp;gt;&amp;lt;거래금액&amp;gt;    20,250&amp;lt;/거래금액&amp;gt;&amp;lt;건축년도&amp;gt;20...'&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;Selector &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;xpath=&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;'//item' &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;data=&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;'&amp;lt;item&amp;gt;&amp;lt;거래금액&amp;gt;     9,000&amp;lt;/거래금액&amp;gt;&amp;lt;건축년도&amp;gt;19...'&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;gt;
[... 생략 ...]&lt;/span&gt;&lt;/p&gt;&lt;/pre&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 18pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(31, 218, 17);&quot;&gt;|&lt;/span&gt; Scrapy의 item 객체에 데이터 집어넣기&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;위에서 한 대로 Selector 객체 형태로만 데이터를 처리하려고 하면 코딩하는 데 시간도 많이 걸릴 뿐더러 코드도 난잡해질 가능성이 커집니다! 이 때 위에서 설명한 Item 객체에 데이터를 넣어 처리하게 되면 scrapy를 통해 아주 손쉽게 데이터를 처리할 수 있습니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;apt_trade_spiders.py&lt;/b&gt;&lt;/p&gt;&lt;pre style=&quot;background-color:#2b2b2b;color:#a9b7c6;font-family:'굴림체';font-size:9.0pt;&quot;&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;import &lt;/span&gt;datetime &lt;span style=&quot;color:#cc7832;&quot;&gt;as &lt;/span&gt;dt&lt;br /&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;from &lt;/span&gt;urllib.parse &lt;span style=&quot;color:#cc7832;&quot;&gt;import &lt;/span&gt;urlencode&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;import &lt;/span&gt;scrapy&lt;br /&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;from &lt;/span&gt;scrapy &lt;span style=&quot;color:#cc7832;&quot;&gt;import &lt;/span&gt;Selector&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;import &lt;/span&gt;invest_crawler.consts &lt;span style=&quot;color:#cc7832;&quot;&gt;as &lt;/span&gt;CONST&lt;br /&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;from &lt;/span&gt;invest_crawler.items.apt_trade &lt;span style=&quot;color:#cc7832;&quot;&gt;import &lt;/span&gt;AptTradeScrapy&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;class &lt;/span&gt;TradeSpider(scrapy.spiders.XMLFeedSpider):&lt;br /&gt;    name = &lt;span style=&quot;color:#6a8759;&quot;&gt;'trade'&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#6a8759;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#6a8759;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;def &lt;/span&gt;&lt;span style=&quot;color:#ffc66d;&quot;&gt;start_requests&lt;/span&gt;(&lt;span style=&quot;color:#94558d;&quot;&gt;self&lt;/span&gt;):&lt;br /&gt;        page_num = &lt;span style=&quot;color:#6897bb;&quot;&gt;1&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#6897bb;&quot;&gt;        &lt;/span&gt;date = dt.datetime(&lt;span style=&quot;color:#6897bb;&quot;&gt;2006&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#6897bb;&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#6897bb;&quot;&gt;1&lt;/span&gt;)&lt;br /&gt;        urls = [&lt;br /&gt;            CONST.APT_DETAIL_ENDPOINT&lt;br /&gt;        ]&lt;br /&gt;        params = {&lt;br /&gt;            &lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;pageNo&quot;&lt;/span&gt;: &lt;span style=&quot;color:#8888c6;&quot;&gt;str&lt;/span&gt;(page_num)&lt;span style=&quot;color:#cc7832;&quot;&gt;,&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;numOfRows&quot;&lt;/span&gt;: &lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;999&quot;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;,&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;LAWD_CD&quot;&lt;/span&gt;: &lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;44133&quot;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;,&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;DEAL_YMD&quot;&lt;/span&gt;: date.strftime(&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;%Y%m&quot;&lt;/span&gt;)&lt;span style=&quot;color:#cc7832;&quot;&gt;,&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;        &lt;/span&gt;}&lt;br /&gt;        &lt;span style=&quot;color:#cc7832;&quot;&gt;for &lt;/span&gt;url &lt;span style=&quot;color:#cc7832;&quot;&gt;in &lt;/span&gt;urls:&lt;br /&gt;            url += urlencode(params)&lt;br /&gt;            &lt;span style=&quot;color:#8888c6;&quot;&gt;print&lt;/span&gt;(url)&lt;br /&gt;            &lt;span style=&quot;color:#cc7832;&quot;&gt;yield &lt;/span&gt;scrapy.Request(&lt;span style=&quot;color:#aa4926;&quot;&gt;url&lt;/span&gt;=url)&lt;br /&gt;&lt;br /&gt;    &lt;span style=&quot;color:#cc7832;&quot;&gt;def &lt;/span&gt;&lt;span style=&quot;color:#ffc66d;&quot;&gt;parse&lt;/span&gt;(&lt;span style=&quot;color:#94558d;&quot;&gt;self&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;response):&lt;br /&gt;        selector = Selector(response&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#aa4926;&quot;&gt;type&lt;/span&gt;=&lt;span style=&quot;color:#6a8759;&quot;&gt;'xml'&lt;/span&gt;)&lt;br /&gt;        items = selector.xpath(&lt;span style=&quot;color:#6a8759;&quot;&gt;'//%s' &lt;/span&gt;% &lt;span style=&quot;color:#94558d;&quot;&gt;self&lt;/span&gt;.itertag)  &lt;span style=&quot;color:#808080;&quot;&gt;# self.intertag는 기본적으로 item으로 되어 있음&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#808080;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#808080;&quot;&gt;        &lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;for &lt;/span&gt;item &lt;span style=&quot;color:#cc7832;&quot;&gt;in &lt;/span&gt;items:&lt;br /&gt;            apt_trade = &lt;span style=&quot;color:#94558d;&quot;&gt;self&lt;/span&gt;.parse_item(item)&lt;br /&gt;            &lt;span style=&quot;color:#8888c6;&quot;&gt;print&lt;/span&gt;(apt_trade)&lt;br /&gt;&lt;br /&gt;    &lt;span style=&quot;color:#cc7832;&quot;&gt;def &lt;/span&gt;&lt;span style=&quot;color:#ffc66d;&quot;&gt;parse_item&lt;/span&gt;(&lt;span style=&quot;color:#94558d;&quot;&gt;self&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;item):&lt;br /&gt;        state = &lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;천안시&quot;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#6a8759;&quot;&gt;        &lt;/span&gt;district = &lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;서북구&quot;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#6a8759;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#6a8759;&quot;&gt;        &lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;try&lt;/span&gt;:&lt;br /&gt;            apt_trade_data = AptTradeScrapy(&lt;br /&gt;                &lt;span style=&quot;color:#aa4926;&quot;&gt;apt_name&lt;/span&gt;=item.xpath(&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;./아파트/text()&quot;&lt;/span&gt;).get()&lt;span style=&quot;color:#cc7832;&quot;&gt;,&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;                &lt;/span&gt;&lt;span style=&quot;color:#aa4926;&quot;&gt;address_1&lt;/span&gt;=state&lt;span style=&quot;color:#cc7832;&quot;&gt;,&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;                &lt;/span&gt;&lt;span style=&quot;color:#aa4926;&quot;&gt;address_2&lt;/span&gt;=district&lt;span style=&quot;color:#cc7832;&quot;&gt;,&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;                &lt;/span&gt;&lt;span style=&quot;color:#aa4926;&quot;&gt;address_3&lt;/span&gt;=item.xpath(&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;./법정동/text()&quot;&lt;/span&gt;).get().strip()&lt;span style=&quot;color:#cc7832;&quot;&gt;,&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;                &lt;/span&gt;&lt;span style=&quot;color:#aa4926;&quot;&gt;address_4&lt;/span&gt;=item.xpath(&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;./지번/text()&quot;&lt;/span&gt;).get()&lt;span style=&quot;color:#cc7832;&quot;&gt;,&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;                &lt;/span&gt;&lt;span style=&quot;color:#aa4926;&quot;&gt;address&lt;/span&gt;=state + &lt;span style=&quot;color:#6a8759;&quot;&gt;&quot; &quot; &lt;/span&gt;+ district + &lt;span style=&quot;color:#6a8759;&quot;&gt;&quot; &quot; &lt;/span&gt;+ item.xpath(&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;./법정동/text()&quot;&lt;/span&gt;).get().strip() + &lt;span style=&quot;color:#6a8759;&quot;&gt;&quot; &quot; &lt;/span&gt;+&lt;br /&gt;                        item.xpath(&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;./지번/text()&quot;&lt;/span&gt;).get()&lt;span style=&quot;color:#cc7832;&quot;&gt;,&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;                &lt;/span&gt;&lt;span style=&quot;color:#aa4926;&quot;&gt;age&lt;/span&gt;=item.xpath(&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;./건축년도/text()&quot;&lt;/span&gt;).get()&lt;span style=&quot;color:#cc7832;&quot;&gt;,&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;                &lt;/span&gt;&lt;span style=&quot;color:#aa4926;&quot;&gt;level&lt;/span&gt;=item.xpath(&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;./층/text()&quot;&lt;/span&gt;).get()&lt;span style=&quot;color:#cc7832;&quot;&gt;,&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;                &lt;/span&gt;&lt;span style=&quot;color:#aa4926;&quot;&gt;available_space&lt;/span&gt;=item.xpath(&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;./전용면적/text()&quot;&lt;/span&gt;).get()&lt;span style=&quot;color:#cc7832;&quot;&gt;,&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;                &lt;/span&gt;&lt;span style=&quot;color:#aa4926;&quot;&gt;trade_date&lt;/span&gt;=item.xpath(&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;./년/text()&quot;&lt;/span&gt;).get() + &lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;/&quot; &lt;/span&gt;+&lt;br /&gt;                           item.xpath(&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;./월/text()&quot;&lt;/span&gt;).get() + &lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;/&quot; &lt;/span&gt;+&lt;br /&gt;                           item.xpath(&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;./일/text()&quot;&lt;/span&gt;).get()&lt;span style=&quot;color:#cc7832;&quot;&gt;,&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;                &lt;/span&gt;&lt;span style=&quot;color:#aa4926;&quot;&gt;trade_amount&lt;/span&gt;=item.xpath(&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;./거래금액/text()&quot;&lt;/span&gt;).get().strip().replace(&lt;span style=&quot;color:#6a8759;&quot;&gt;','&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#6a8759;&quot;&gt;''&lt;/span&gt;)&lt;span style=&quot;color:#cc7832;&quot;&gt;,&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;            &lt;/span&gt;)&lt;br /&gt;        &lt;span style=&quot;color:#cc7832;&quot;&gt;except &lt;/span&gt;&lt;span style=&quot;color:#8888c6;&quot;&gt;Exception &lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;as &lt;/span&gt;e:&lt;br /&gt;            &lt;span style=&quot;color:#8888c6;&quot;&gt;print&lt;/span&gt;(e)&lt;br /&gt;            &lt;span style=&quot;color:#94558d;&quot;&gt;self&lt;/span&gt;.logger.error(item)&lt;br /&gt;            &lt;span style=&quot;color:#94558d;&quot;&gt;self&lt;/span&gt;.logger.error(item.xpath(&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;./아파트/text()&quot;&lt;/span&gt;).get())&lt;br /&gt;&lt;br /&gt;        &lt;span style=&quot;color:#cc7832;&quot;&gt;return &lt;/span&gt;apt_trade_data&lt;/pre&gt;&lt;ul style=&quot;list-style-type: disc;&quot;&gt;&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;item에 있는 데이터를 추출하는 p&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;arse_item 메서드를 추가하였습니다.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;item에서 xpath를 사용하여 xml에 있는 데이터를 추출하는 작업을 하는 코드를 작성했습니다. text()는 xml 태그 안에 있는 텍스트로 된 데이터를 의미합니다.&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;크롤링에서&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;&amp;nbsp;예기치 못한 공백 문자가 생겨서 같은 데이터라도 다르게 판단되거나 제대로 데이터가 처리되지 않는 경우가 종종 발생합니다. 따라서 strip 메서드를 써서 앞 뒤 공백 문자를 제거하는 작업을 하는 것이 좋습니다.&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;결과 화면&lt;/b&gt;&lt;/p&gt;&lt;pre style=&quot;background-color:#2b2b2b;color:#a9b7c6;font-family:'굴림체';font-size:9.0pt;&quot;&gt;&lt;p&gt;[... 생략...]
{'address': '천안시 서북구 쌍용동 889',&lt;br /&gt; 'address_1': '천안시',&lt;br /&gt; 'address_2': '서북구',&lt;br /&gt; 'address_3': '쌍용동',&lt;br /&gt; 'address_4': '889',&lt;br /&gt; 'age': '1994',&lt;br /&gt; 'apt_name': '대우타워',&lt;br /&gt; 'available_space': '59.76',&lt;br /&gt; 'level': '17',&lt;br /&gt; 'trade_amount': '8450',&lt;br /&gt; 'trade_date': '2006/1/4'}&lt;br /&gt;{'address': '천안시 서북구 쌍용동 1920',&lt;br /&gt; 'address_1': '천안시',&lt;br /&gt; 'address_2': '서북구',&lt;br /&gt; 'address_3': '쌍용동',&lt;br /&gt; 'address_4': '1920',&lt;br /&gt; 'age': '1999',&lt;br /&gt; 'apt_name': '쌍용마을 뜨란채,주공아파트',&lt;br /&gt; 'available_space': '84.61',&lt;br /&gt; 'level': '14',&lt;br /&gt; 'trade_amount': '14500',&lt;br /&gt; 'trade_date': '2006/1/5'}
[... 생략...]&lt;/p&gt;&lt;/pre&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;다음 포스팅에는 이 xml 데이터를 csv 파일 형태 혹은 excel에다가 저장하는 법을 다루도록 하겠습니다.&lt;/span&gt;&lt;/p&gt;</description>
      <category>파이썬/파이썬 웹 크롤링 - 부동산 공공데이터</category>
      <category>scrapy</category>
      <category>부동산</category>
      <category>부동산 공공 데이터</category>
      <category>파이썬 크롤링</category>
      <author>새로비</author>
      <guid isPermaLink="true">https://engkimbs.tistory.com/963</guid>
      <comments>https://engkimbs.tistory.com/entry/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%ED%81%AC%EB%A1%A4%EB%A7%81%EB%B6%80%EB%8F%99%EC%82%B0-%EB%8D%B0%EC%9D%B4%ED%84%B0-scrapy%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%9C-%EB%B6%80%EB%8F%99%EC%82%B0-%EA%B3%B5%EA%B3%B5-%EB%8D%B0%EC%9D%B4%ED%84%B0-%ED%8C%8C%EC%8B%B1-%EB%B0%8F-%EC%B6%94%EC%B6%9C%ED%95%98%EA%B8%B0#entry963comment</comments>
      <pubDate>Mon, 16 Mar 2020 21:47:30 +0900</pubDate>
    </item>
    <item>
      <title>[파이썬 크롤링/부동산 데이터] scrapy를 이용한 부동산 공공 데이터 간단하게 받아오기</title>
      <link>https://engkimbs.tistory.com/entry/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%ED%81%AC%EB%A1%A4%EB%A7%81%EB%B6%80%EB%8F%99%EC%82%B0-%EB%8D%B0%EC%9D%B4%ED%84%B0-scrapy%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%9C-%EB%B6%80%EB%8F%99%EC%82%B0-%EA%B3%B5%EA%B3%B5-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EA%B0%84%EB%8B%A8%ED%95%98%EA%B2%8C-%EB%B0%9B%EC%95%84%EC%98%A4%EA%B8%B0</link>
      <description>&lt;p&gt;&lt;span style=&quot;font-size: 18pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(31, 218, 17);&quot;&gt;|&lt;/span&gt; 들어가기 전에&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://github.com/Lucorda/python-tutorial/tree/bfb6e0028d9114688b61218e52ee5ad5706302bf&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;GIT 저장소&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;지금 포스팅은 국토교통부에서 제공하는 부동산 공공데이터 API를 사용합니다. 아래 포스팅&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;을 보시고 먼저 부동산 공공데이터 API를 신청해주시길 바래요!&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://engkimbs.tistory.com/899&quot; target=&quot;_blank&quot;&gt;[유용한 정보들] - 국토교통부 공공데이터 부동산 실거래가 API 신청 방법&lt;/a&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;이전 포스팅&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://engkimbs.tistory.com/961&quot; target=&quot;_blank&quot;&gt;[파이썬/파이썬 웹 크롤링 - 부동산 공공데이터] - [파이썬 크롤링/부동산 데이터] 스크래피(scrapy) startproject로 초기 프로젝트 구성하기&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 18pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(31, 218, 17);&quot;&gt;| &lt;/span&gt;부동산 매매 데이터 간단하게 받아오기&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;국토교통부 사이트에 접속해서 로그인을 하신다음 마이페이지의 오픈 API를 클릭합니다. 그러면 전에 신청했던 API의 목록이 나오며 API에서 데이터를 얻기 위한 일반 인증키와 End Point를 다음과 같이 제공합니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;이 일반 인증키와 End Point를 조합해서 URL을 만든 후 scrapy로 데이터를 간단하게 받아와서 파싱하는 작업을 할 것입니다. 여기서는 아파트매매 실거래 자료를 받아오도록 하겠습니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 728px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/99D17C4D5E6C8ED827&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F99D17C4D5E6C8ED827&quot; width=&quot;728&quot; height=&quot;486&quot; filename=&quot;캡처_2020_03_14_15_38_57_480.png&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 18pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(31, 218, 17);&quot;&gt;| &lt;/span&gt;프로젝트 구성&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;&lt;b&gt;프로젝트 구조&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;pre style=&quot;background-color:#2b2b2b;color:#a9b7c6;font-family:'굴림체';font-size:9.0pt;&quot;&gt;&lt;p&gt;|   scrapy.cfg&lt;br /&gt;\---invest_crawler&lt;br /&gt;    |   consts.py&lt;br /&gt;    |   settings.py&lt;br /&gt;    |   __init__.py&lt;br /&gt;    |&lt;br /&gt;    +---spiders&lt;br /&gt;    |   |   apt_trade_spiders.py&lt;br /&gt;    |   |   __init__.py&lt;/p&gt;&lt;/pre&gt;&lt;ul style=&quot;list-style-type: disc;&quot;&gt;&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;간단한 예시를 들기 위해 전에 startproject에서 있었던 items.py, middleswares.py, pipelines.py 파일들을 삭제했습니다. 추후 예제 프로젝트에 기능을 추가할 때마다 item, middlesware&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;, pipeline 모듈을 추가하여 프로젝트를 구성할 예정입니다.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;웹에서&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;&amp;nbsp;데이터를 요청하고 받아오는 핵심 모듈을 spider라고 합니다. 공공데이터를 받아오는 spider 코드가 있는 &lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;apt_trade_spiders.py 파일을 추가했습니다.&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;&lt;b&gt;소스 코드&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;consts.py&lt;/b&gt;&lt;/p&gt;&lt;pre style=&quot;background-color:#2b2b2b;color:#a9b7c6;font-family:'굴림체';font-size:9.0pt;&quot;&gt;&lt;p&gt;&lt;span style=&quot;color:#808080;&quot;&gt;# 샘플 더미 데이터 입니다. 어떻게 세팅하는 지 보여드리기 위해 넣은 데이터이기 때문에 그대로 사용하시면 에러가 납니다.&lt;br /&gt;&lt;/span&gt;APT_DETAIL_ENDPOINT = &lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;http://openapi.molit.go.kr:8081/OpenAPI_ToolInstallPackage/service/rest/RTMSOBJSvc/getRTMSDataSvcAptTrade?serviceKey=aWiZGAJkCsr3wM0YasdfawefkDO%2BssYpNXZ%2FEWZfuIW5k%2FcHFtD5k1zcCVasdfEtBQID5rIcjXsg%3D%3D&amp;amp;&quot;&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;&lt;/pre&gt;&lt;ul style=&quot;list-style-type: disc;&quot;&gt;&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;위에서 받아온 일반 인증키와 End Point를 조합하여 위와 같은 ENDPOINT URL을 구성해야 합니다. 이 URL에 &lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;LAWD_CD와 DEAL_YMD, pageNo, n&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;umOfRows 파라미터를 추가하여야 데이터를 받아올 수 있습니다.&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;apt_trade_spiders.py&lt;/b&gt;&lt;/p&gt;&lt;pre style=&quot;background-color:#2b2b2b;color:#a9b7c6;font-family:'굴림체';font-size:9.0pt;&quot;&gt;&lt;p&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;import &lt;/span&gt;datetime &lt;span style=&quot;color:#cc7832;&quot;&gt;as &lt;/span&gt;dt&lt;br /&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;from &lt;/span&gt;urllib.parse &lt;span style=&quot;color:#cc7832;&quot;&gt;import &lt;/span&gt;urlencode&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;import &lt;/span&gt;scrapy&lt;br /&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;from &lt;/span&gt;scrapy &lt;span style=&quot;color:#cc7832;&quot;&gt;import &lt;/span&gt;Selector&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;import &lt;/span&gt;invest_crawler.consts &lt;span style=&quot;color:#cc7832;&quot;&gt;as &lt;/span&gt;CONST&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;class &lt;/span&gt;TradeSpider(scrapy.spiders.XMLFeedSpider):&lt;br /&gt;    name = &lt;span style=&quot;color:#6a8759;&quot;&gt;'trade'&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#6a8759;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#6a8759;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;def &lt;/span&gt;&lt;span style=&quot;color:#ffc66d;&quot;&gt;start_requests&lt;/span&gt;(&lt;span style=&quot;color:#94558d;&quot;&gt;self&lt;/span&gt;):&lt;br /&gt;        page_num = &lt;span style=&quot;color:#6897bb;&quot;&gt;1&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#6897bb;&quot;&gt;        &lt;/span&gt;date = dt.datetime(&lt;span style=&quot;color:#6897bb;&quot;&gt;2006&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#6897bb;&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#6897bb;&quot;&gt;1&lt;/span&gt;)&lt;br /&gt;        urls = [&lt;br /&gt;            CONST.APT_DETAIL_ENDPOINT&lt;br /&gt;        ]&lt;br /&gt;        params = {&lt;br /&gt;            &lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;pageNo&quot;&lt;/span&gt;: &lt;span style=&quot;color:#8888c6;&quot;&gt;str&lt;/span&gt;(page_num)&lt;span style=&quot;color:#cc7832;&quot;&gt;,&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;numOfRows&quot;&lt;/span&gt;: &lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;999&quot;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;,&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;LAWD_CD&quot;&lt;/span&gt;: &lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;44133&quot;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;,&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;DEAL_YMD&quot;&lt;/span&gt;: date.strftime(&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;%Y%m&quot;&lt;/span&gt;)&lt;span style=&quot;color:#cc7832;&quot;&gt;,&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;        &lt;/span&gt;}&lt;br /&gt;        &lt;span style=&quot;color:#cc7832;&quot;&gt;for &lt;/span&gt;url &lt;span style=&quot;color:#cc7832;&quot;&gt;in &lt;/span&gt;urls:&lt;br /&gt;            url += urlencode(params)&lt;br /&gt;            &lt;span style=&quot;color:#cc7832;&quot;&gt;yield &lt;/span&gt;scrapy.Request(&lt;span style=&quot;color:#aa4926;&quot;&gt;url&lt;/span&gt;=url)&lt;br /&gt;&lt;br /&gt;    &lt;span style=&quot;color:#cc7832;&quot;&gt;def &lt;/span&gt;&lt;span style=&quot;color:#ffc66d;&quot;&gt;parse&lt;/span&gt;(&lt;span style=&quot;color:#94558d;&quot;&gt;self&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;response):&lt;br /&gt;&lt;br /&gt;        &lt;span style=&quot;color:#8888c6;&quot;&gt;print&lt;/span&gt;(response.body)&lt;br /&gt;&lt;/p&gt;&lt;/pre&gt;&lt;ul style=&quot;list-style-type: disc;&quot;&gt;&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;부동산 공공데이터를 핵심 로직이 담겨있는 TradeSpider 클래스 코드입니다. scrapy의 spiders.XMLFeedSpider를 상속받아서 크롤러를 만들었습니다.&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;name 속성은 scrapy에서 spider의 이름을 나타냅니다. 이때 각 name은 spider마다 유일한 값이며 각 spider를 식별합니다.&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;start_requests 메서드는 scrapy가 크롤링을 시도할 때 제일 먼저 요청되는 로직을 구현하는 곳입니다. 이 최초 요청을 시점으로 spider가 다른 새로운 요청을 생성하여 크롤링을 진행할 수 있습니다.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;start_requests를 보면 urls 변수에 APT_DETAIL_ENDPOINT 값을 볼 수 있습니다. 이 값은 매매데이터의 URL을 나타낸 것입니다. 또한 params 변수에 각 파라미터들을 추가하여 url에 파라미터를 더해 특정 데이터를 요청할 수 있습니다. 위에서는 LAWD_CD 파라미터에 44133(충청남도 천안시를 나타내는 코드)와 DEAL_YMD에 20060101 날짜를 집어넣어서 충청남도 천안시의 2006년 1월 1일에 거래된 부동산 매매 데이터를 받아 올 수 있습니다. pageNo와 numOfRows는 각각 데이터를 받아올 때 몇 번째 page 데이터를 받아올 것인지와 &lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;얼마만큼의 행 데이터를 받아올 것인지를 나타냅니다. numOfRows를 999로 해놓으면 한 번에 많은 데이터를 받아올 수 있습니다.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;font face=&quot;Arial Black&quot;&gt;참고로 각 지역의 지역코드는 아래 링크를 통해 확인할 수 있습니다.&lt;br /&gt;&lt;a href=&quot;https://github.com/drtagkim/kor_gg_code/blob/master/region_code5.csv&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;https://github.com/drtagkim/kor_gg_code/blob/master/region_code5.csv&lt;/a&gt;&lt;/font&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;parse 메서드는&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;&amp;nbsp;요청한 데이터가 들어올 때 그 데이터를 분석하는 로직을 구현하는 메서드입니다. 요청한 데이터가 들어올 시 특정 이벤트가 발생하며 이 이벤트가 발생함에 따라 parse 메서드가 호출됩니다. 이 요청한 데이터는 response 인수에 담겨져 오며 이 response를 중심으로 데이터를 처리해야합니다.&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;settings.py&lt;/b&gt;&lt;/p&gt;&lt;pre style=&quot;background-color:#2b2b2b;color:#a9b7c6;font-family:'굴림체';font-size:9.0pt;&quot;&gt;&lt;span style=&quot;color:#808080;&quot;&gt;# Automatically created by: scrapy startproject&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#808080;&quot;&gt;#&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#808080;&quot;&gt;# For more information about the [deploy] section see:&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#808080;&quot;&gt;# https://scrapyd.readthedocs.io/en/latest/deploy.html&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#808080;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;font-weight:bold;&quot;&gt;[settings]&lt;br /&gt;&lt;/span&gt;default = &lt;span style=&quot;color:#6a8759;&quot;&gt;invest_crawler.settings&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#6a8759;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;font-weight:bold;&quot;&gt;[deploy]&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#808080;&quot;&gt;#url = http://localhost:6800/&lt;br /&gt;&lt;/span&gt;project = &lt;span style=&quot;color:#6a8759;&quot;&gt;invest_crawler&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;실행 명령어&lt;/b&gt;&lt;/p&gt;&lt;pre style=&quot;background-color:#2b2b2b;color:#a9b7c6;font-family:'굴림체';font-size:9.0pt;&quot;&gt;scrapy crawl trade&lt;/pre&gt;&lt;ul style=&quot;list-style-type: disc;&quot;&gt;&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;crawl이란 명령어를 통해 scrapy spider를 실행하여 데이터를 받아옵니다. crawl 명령어 다음에는 spider의&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;&amp;nbsp;이름을 적어 어떤 spider를 실행할 것인지를 나타냅니다. ( 이 명령어는 scrapy 프로젝트 안에서 꼭 실행해야 합니다! 안 그러면 정상적으로 spider가 실행되지 않습니다.&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;)&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;결과 화면&lt;/b&gt;&lt;/p&gt;&lt;pre style=&quot;background-color:#2b2b2b;color:#a9b7c6;font-family:'굴림체';font-size:9.0pt;&quot;&gt;&lt;p&gt;2020-03-14 17:34:15 [scrapy.utils.log] INFO: Scrapy 1.8.0 started (bot: invest_crawler)&lt;br /&gt;2020-03-14 17:34:15 [scrapy.utils.log] INFO: Versions: lxml 4.4.2.0, libxml2 2.9.5, cssselect 1.1.0, parsel 1.5.2, w3lib 1.21.0, Twisted 19.10.0, Python 3.8.1 (tags/v3.8.1:1b293b6, Dec 18 2019, 23:11:46) [MSC v.1916 64 bit (AMD64)], pyOpenSSL 19.1.0 (OpenSSL 1.1.1d  10 Sep 2019), cryptography 2.8,&lt;br /&gt;Platform Windows-10-10.0.18362-SP0&lt;br /&gt;2020-03-14 17:34:15 [scrapy.crawler] INFO: Overridden settings: {'BOT_NAME': 'invest_crawler', 'NEWSPIDER_MODULE': 'invest_crawler.spiders', 'ROBOTSTXT_OBEY': True, 'SPIDER_MODULES': ['invest_crawler.spiders']}&lt;br /&gt;2020-03-14 17:34:15 [scrapy.extensions.telnet] INFO: Telnet Password: 4f49a8ba194b9dbf&lt;br /&gt;2020-03-14 17:34:15 [scrapy.middleware] INFO: Enabled extensions:&lt;br /&gt;['scrapy.extensions.corestats.CoreStats',&lt;br /&gt; 'scrapy.extensions.telnet.TelnetConsole',&lt;br /&gt; 'scrapy.extensions.logstats.LogStats']&lt;br /&gt;2020-03-14 17:34:16 [scrapy.middleware] INFO: Enabled downloader middlewares:&lt;br /&gt;['scrapy.downloadermiddlewares.robotstxt.RobotsTxtMiddleware',&lt;br /&gt; 'scrapy.downloadermiddlewares.httpauth.HttpAuthMiddleware',&lt;br /&gt; 'scrapy.downloadermiddlewares.downloadtimeout.DownloadTimeoutMiddleware',&lt;br /&gt; 'scrapy.downloadermiddlewares.defaultheaders.DefaultHeadersMiddleware',&lt;br /&gt; 'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware',&lt;br /&gt; 'scrapy.downloadermiddlewares.retry.RetryMiddleware',&lt;br /&gt; 'scrapy.downloadermiddlewares.redirect.MetaRefreshMiddleware',&lt;br /&gt; 'scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware',&lt;br /&gt; 'scrapy.downloadermiddlewares.redirect.RedirectMiddleware',&lt;br /&gt; 'scrapy.downloadermiddlewares.cookies.CookiesMiddleware',&lt;br /&gt; 'scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware',&lt;br /&gt; 'scrapy.downloadermiddlewares.stats.DownloaderStats']&lt;br /&gt;2020-03-14 17:34:16 [scrapy.middleware] INFO: Enabled spider middlewares:&lt;br /&gt;['scrapy.spidermiddlewares.httperror.HttpErrorMiddleware',&lt;br /&gt; 'scrapy.spidermiddlewares.offsite.OffsiteMiddleware',&lt;br /&gt; 'scrapy.spidermiddlewares.referer.RefererMiddleware',&lt;br /&gt; 'scrapy.spidermiddlewares.urllength.UrlLengthMiddleware',&lt;br /&gt; 'scrapy.spidermiddlewares.depth.DepthMiddleware']&lt;br /&gt;2020-03-14 17:34:16 [scrapy.middleware] INFO: Enabled item pipelines:&lt;br /&gt;[]&lt;br /&gt;2020-03-14 17:34:16 [scrapy.core.engine] INFO: Spider opened&lt;br /&gt;2020-03-14 17:34:16 [scrapy.extensions.logstats] INFO: Crawled 0 pages (at 0 pages/min), scraped 0 items (at 0 items/min)&lt;br /&gt;2020-03-14 17:34:16 [scrapy.extensions.telnet] INFO: Telnet console listening on 127.0.0.1:6023&lt;br /&gt;2020-03-14 17:34:16 [scrapy.core.engine] DEBUG: Crawled (404) &lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;GET &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;http:&lt;/span&gt;//openapi.molit.go.kr:8081/robots.txt&amp;gt; (referer: None)&lt;br /&gt;2020-03-14 17:34:16 [scrapy.core.engine] DEBUG: Crawled (200) &lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;GET &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;http:&lt;/span&gt;//openapi.molit.go.kr:8081/OpenAPI_ToolInstallPackage/service/rest/RTMSOBJSvc/getRTMSDataSvcAptTrade?serviceKey=aWiZGAJkCsr3wM0YkDO%2BssYpNXZ%2Fawefawdpoj5k1zcCVRBTfThOHm57USjgxOgfvaBEtBQID5rIcjXsg%3D%3D&amp;amp;pageNo=1&amp;amp;numOfRo&lt;br /&gt;ws=999&amp;amp;LAWD_CD=44133&amp;amp;DEAL_YMD=200601&amp;gt; (referer: None)&lt;br /&gt;b'&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;yes&quot;?&amp;gt;&amp;lt;response&amp;gt;&amp;lt;header&amp;gt;&amp;lt;resultCode&amp;gt;&lt;/span&gt;00&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/resultCode&amp;gt;&amp;lt;resultMsg&amp;gt;&lt;/span&gt;NORMAL SERVICE.&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/resultMsg&amp;gt;&amp;lt;/header&amp;gt;&amp;lt;body&amp;gt;&amp;lt;items&amp;gt;&amp;lt;item&amp;gt;&lt;/span&gt;&amp;lt;\xea\xb1\xb0\xeb\x9e\x98\xea\xb8\x88\xec\x95\xa1&amp;gt;     8,950&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/&lt;/span&gt;\xea\xb1\xb0\xeb\x9e\x98\xea\xb8\x88\xec\x95\xa1&amp;gt;&amp;lt;\xea\xb1\xb4\xec\xb&lt;br /&gt;6\x95\xeb\x85\x84\xeb\x8f\x84&amp;gt;1993&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/&lt;/span&gt;\xea\xb1\xb4\xec\xb6\x95\xeb\x85\x84\xeb\x8f\x84&amp;gt;&amp;lt;\xeb\x85\x84&amp;gt;2006&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/&lt;/span&gt;\xeb\x85\x84&amp;gt;&amp;lt;\xeb\xb2\x95\xec\xa0\x95\xeb\x8f\x99&amp;gt; \xec\x84\xb1\xec\xa0\x95\xeb\x8f\x99&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/&lt;/span&gt;\xeb\xb2\x95\xec\xa0\x95\xeb\x8f\x99&amp;gt;&amp;lt;\xec\x95\x84\xed\x8c\x8c\xed\x8a\xb8&amp;gt;\xed\x99\x9c\xeb\xa6\xbc1\xec&lt;br /&gt;\xb0\xa8&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/&lt;/span&gt;\xec\x95\x84\xed\x8c\x8c\xed\x8a\xb8&amp;gt;&amp;lt;\xec\x9b\x94&amp;gt;1&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/&lt;/span&gt;\xec\x9b\x94&amp;gt;&amp;lt;\xec\x9d\xbc&amp;gt;7&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/&lt;/span&gt;\xec\x9d\xbc&amp;gt;&amp;lt;\xec\xa0\x84\xec\x9a\xa9\xeb\xa9\xb4\xec\xa0\x81&amp;gt;84.15&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/&lt;/span&gt;\xec\xa0\x84\xec\x9a\xa9\xeb\xa9\xb4\xec\xa0\x81&amp;gt;&amp;lt;\xec\xa7\x80\xeb\xb2\x88&amp;gt;141-3&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/&lt;/span&gt;\xec\xa7\x80\xeb\xb2\x88&amp;gt;&amp;lt;\xec\xa7\x80\xec\x97\xad\xe&lt;br /&gt;c\xbd\x94\xeb\x93\x9c&amp;gt;44133&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/&lt;/span&gt;\xec\xa7\x80\xec\x97\xad\xec\xbd\x94\xeb\x93\x9c&amp;gt;&amp;lt;\xec\xb8\xb5&amp;gt;4&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/&lt;/span&gt;\xec\xb8\xb5&amp;gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/item&amp;gt;&amp;lt;item&amp;gt;&lt;/span&gt;&amp;lt;\xea\xb1\xb0\xeb\x9e\x98\xea\xb8\x88\xec\x95\xa1&amp;gt;     9,100&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/&lt;/span&gt;\xea\xb1\xb0\xeb\x9e\x98\xea\xb8\x88\xec\x95\xa1&amp;gt;&amp;lt;\xea\xb1\xb4\xec\xb6\x95\xeb\x85\x84\xeb\x8f\x84&amp;gt;1991&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/&lt;/span&gt;\xea\xb1\xb&lt;br /&gt;4\xec\xb6\x95\xeb\x85\x84\xeb\x8f\x84&amp;gt;&amp;lt;\xeb\x85\x84&amp;gt;2006&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/&lt;/span&gt;\xeb\x85\x84&amp;gt;&amp;lt;\xeb\xb2\x95\xec\xa0\x95\xeb\x8f\x99&amp;gt; \xec\x84\xb1\xec\xa0\x95\xeb\x8f\x99&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/&lt;/span&gt;\xeb\xb2\x95\xec\xa0\x95\xeb\x8f\x99&amp;gt;&amp;lt;\xec\x95\x84\xed\x8c\x8c\xed\x8a\xb8&amp;gt;\xec\xa3\xbc\xea\xb3\xb56-3&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/&lt;/span&gt;\xec\x95\x84\xed\x8c\x8c\xed\x8a\xb8&amp;gt;&amp;lt;\xec\x9b\&lt;br /&gt;x94&amp;gt;1&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/&lt;/span&gt;\xec\x9b\x94&amp;gt;&amp;lt;\xec\x9d\xbc&amp;gt;12&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/&lt;/span&gt;\xec\x9d\xbc&amp;gt;&amp;lt;\xec\xa0\x84\xec\x9a\xa9\xeb\xa9\xb4\xec\xa0\x81&amp;gt;46.99&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/&lt;/span&gt;\xec\xa0\x84\xec\x9a\xa9\xeb\xa9\xb4\xec\xa0\x81&amp;gt;&amp;lt;\xec\xa7\x80\xeb\xb2\x88&amp;gt;789&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/&lt;/span&gt;\xec\xa7\x80\xeb\xb2\x88&amp;gt;&amp;lt;\xec\xa7\x80\xec\x97\xad\xec\xbd\x94\xeb\x93\x9c&amp;gt;44133&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/&lt;/span&gt;\xec\xa7\x80\xec\x97\xad\xec\&lt;br /&gt;xbd\x94\xeb\x93\x9c&amp;gt;&amp;lt;\xec\xb8\xb5&amp;gt;4&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/&lt;/span&gt;\xec\xb8\xb5&amp;gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/item&amp;gt;&amp;lt;item&amp;gt;&lt;/span&gt;&amp;lt;\xea\xb1\xb0\xeb\x9e\x98\xea\xb8\x88\xec\x95\xa1&amp;gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;....&lt;/p&gt;&lt;p&gt;[생략]&lt;/p&gt;&lt;p&gt;...&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;\xeb\x85\x84&amp;gt;&amp;lt;\xeb\xb2\x95\xec\xa0\x95\xeb\x8f\x99&amp;gt; \xec\x84\xb1\xec\xa0\x95\xeb\x8f\x99&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/&lt;/span&gt;\xeb\xb2\x95\xec\xa0\x95\xeb\x8f\x99&amp;gt;&amp;lt;\xec\x95\x84\xed\x8c\x8c\xed\x8a\xb8&amp;gt;\xeb\x8c\x80\xec\x9a\xb0\xeb\xaa\xa9\xed\x99\x942&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/&lt;/span&gt;\xec\x95\x84\xed\x8c\x8c\xed\x8a\xb8&amp;gt;&amp;lt;\xec\x9b\x94&amp;gt;1&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/&lt;/span&gt;\xec\x9b\x94&amp;gt;&amp;lt;\xec\x9d\xbc&amp;gt;16&lt;br /&gt;\x94\xeb\x93\x9c&amp;gt;&amp;lt;\xec\xb8\xb5&amp;gt;7&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/&lt;/span&gt;\xec\xb8\xb5&amp;gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/item&amp;gt;&amp;lt;item&amp;gt;&lt;/span&gt;&amp;lt;\xea\xb1\xb0\xeb\x9e\x98\xea\xb8\x88\xec\x95\xa1&amp;gt;     4,500&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/&lt;/span&gt;\xea\xb1\xb0\xeb\x9e\x98\xea\xb8\x88\xec\x95\xa1&amp;gt;&amp;lt;\xea\xb1\xb4\xec\xb6\x95\xeb\x85\x8&lt;br /&gt;4\xeb\x8f\x84&amp;gt;1996&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/&lt;/span&gt;\xea\xb1\xb4\xec\xb6\x95\xeb\x85\x84\xeb\x8f\x84&amp;gt;&amp;lt;\xeb\x85\x84&amp;gt;2006&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/&lt;/span&gt;\xeb\x85\x84&amp;gt;&amp;lt;\xeb\xb2\x95\xec\xa0\x95\xeb\x8f\x99&amp;gt;\xec\x9e\x85\xec\x9e\xa5\xeb\xa9\xb4 \xed\x95\x98\xec\x9e\xa5\xeb\xa6\xac&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/&lt;/span&gt;\xeb\xb2\x95\xec\xa0\x95\xeb\x8f\x99&amp;gt;&amp;lt;\xec\x95\x84\xed\x8c\x8c\xed\x8a\xb8&amp;gt;\xec\x97\&lt;br /&gt;xb0\xed\x95\xa9\xec\xb4\x88\xec\x9b\x90&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/&lt;/span&gt;\xec\x95\x84\xed\x8c\x8c\xed\x8a\xb8&amp;gt;&amp;lt;\xec\x9b\x94&amp;gt;1&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/&lt;/span&gt;\xec\x9b\x94&amp;gt;&amp;lt;\xec\x9d\xbc&amp;gt;26&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/&lt;/span&gt;\xec\x9d\xbc&amp;gt;&amp;lt;\xec\xa0\x84\xec\x9a\xa9\xeb\xa9\xb4\xec\xa0\x81&amp;gt;53.82&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/&lt;/span&gt;\xec\xa0\x84\xec\x9a\xa9\xeb\xa9\xb4\xec\xa0\x81&amp;gt;&amp;lt;\xec\xa7\x80\xeb\xb2\x88&amp;gt;84&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/&lt;/span&gt;\xec\xa7\x80\xeb\xb2\x88&lt;br /&gt;&amp;gt;&amp;lt;\xec\xa7\x80\xec\x97\xad\xec\xbd\x94\xeb\x93\x9c&amp;gt;44133&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/&lt;/span&gt;\xec\xa7\x80\xec\x97\xad\xec\xbd\x94\xeb\x93\x9c&amp;gt;&amp;lt;\xec\xb8\xb5&amp;gt;3&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/&lt;/span&gt;\xec\xb8\xb5&amp;gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/item&amp;gt;&amp;lt;item&amp;gt;&lt;/span&gt;&amp;lt;\xea\xb1\xb0\xeb\x9e\x98\xea\xb8\x88\xec\x95\xa1&amp;gt;     2,910&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/&lt;/span&gt;\xea\xb1\xb0\xeb\x9e\x98\xea\xb8\x88\xec\x95\xa1&amp;gt;&amp;lt;\xea\xb1\xb4\xec\xb6\x95\xeb\x85\x84\&lt;br /&gt;xeb\x8f\x84&amp;gt;1992&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/&lt;/span&gt;\xea\xb1\xb4\xec\xb6\x95\xeb\x85\x84\xeb\x8f\x84&amp;gt;&amp;lt;\xeb\x85\x84&amp;gt;2006&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/&lt;/span&gt;\xeb\x85\x84&amp;gt;&amp;lt;\xeb\xb2\x95\xec\xa0\x95\xeb\x8f\x99&amp;gt;\xec\x9e\x85\xec\x9e\xa5\xeb\xa9\xb4 \xec\x8b\xa0\xeb\x8d\x95\xeb\xa6\xac&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/&lt;/span&gt;\xeb\xb2\x95\xec\xa0\x95\xeb\x8f\x99&amp;gt;&amp;lt;\xec\x95\x84\xed\x8c\x8c\xed\x8a\xb8&amp;gt;\xec\x97\xb&lt;br /&gt;0\xed\x95\xa9&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/&lt;/span&gt;\xec\x95\x84\xed\x8c\x8c\xed\x8a\xb8&amp;gt;&amp;lt;\xec\x9b\x94&amp;gt;1&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/&lt;/span&gt;\xec\x9b\x94&amp;gt;&amp;lt;\xec\x9d\xbc&amp;gt;16&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/&lt;/span&gt;\xec\x9d\xbc&amp;gt;&amp;lt;\xec\xa0\x84\xec\x9a\xa9\xeb\xa9\xb4\xec\xa0\x81&amp;gt;59.52&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/&lt;/span&gt;\xec\xa0\x84\xec\x9a\xa9\xeb\xa9\xb4\xec\xa0\x81&amp;gt;&amp;lt;\xec\xa7\x80\xeb\xb2\x88&amp;gt;200-21&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/&lt;/span&gt;\xec\xa7\x80\xeb\xb2\x88&amp;gt;&amp;lt;\xec\xa7\x80\xec\x97&lt;br /&gt;\xad\xec\xbd\x94\xeb\x93\x9c&amp;gt;44133&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/&lt;/span&gt;\xec\xa7\x80\xec\x97\xad\xec\xbd\x94\xeb\x93\x9c&amp;gt;&amp;lt;\xec\xb8\xb5&amp;gt;1&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/&lt;/span&gt;\xec\xb8\xb5&amp;gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/item&amp;gt;&amp;lt;/items&amp;gt;&amp;lt;numOfRows&amp;gt;&lt;/span&gt;999&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/numOfRows&amp;gt;&amp;lt;pageNo&amp;gt;&lt;/span&gt;1&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/pageNo&amp;gt;&amp;lt;totalCount&amp;gt;&lt;/span&gt;161&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/totalCount&amp;gt;&amp;lt;/body&amp;gt;&amp;lt;/response&amp;gt;&lt;/span&gt;'&lt;br /&gt;2020-03-14 17:34:16 [scrapy.core.engine] INFO: Closing spider (finished)&lt;br /&gt;2020-03-14 17:34:16 [scrapy.statscollectors] INFO: Dumping Scrapy stats:&lt;br /&gt;{'downloader/request_bytes': 706,&lt;br /&gt; 'downloader/request_count': 2,&lt;br /&gt; 'downloader/request_method_count/GET': 2,&lt;br /&gt; 'downloader/response_bytes': 48422,&lt;br /&gt; 'downloader/response_count': 2,&lt;br /&gt; 'downloader/response_status_count/200': 1,&lt;br /&gt; 'downloader/response_status_count/404': 1,&lt;br /&gt; 'elapsed_time_seconds': 0.307194,&lt;br /&gt; 'finish_reason': 'finished',&lt;br /&gt; 'finish_time': datetime.datetime(2020, 3, 14, 8, 34, 16, 622155),&lt;br /&gt; 'log_count/DEBUG': 2,&lt;br /&gt; 'log_count/INFO': 10,&lt;br /&gt; 'response_received_count': 2,&lt;br /&gt; 'robotstxt/request_count': 1,&lt;br /&gt; 'robotstxt/response_count': 1,&lt;br /&gt; 'robotstxt/response_status_count/404': 1,&lt;br /&gt; 'scheduler/dequeued': 1,&lt;br /&gt; 'scheduler/dequeued/memory': 1,&lt;br /&gt; 'scheduler/enqueued': 1,&lt;br /&gt; 'scheduler/enqueued/memory': 1,&lt;br /&gt; 'start_time': datetime.datetime(2020, 3, 14, 8, 34, 16, 314961)}&lt;br /&gt;2020-03-14 17:34:16 [scrapy.core.engine] INFO: Spider closed (finished)&lt;br /&gt;&lt;/p&gt;&lt;/pre&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;위는 스크래피를 그대로 실행했을 때의 결과 화면입니다. 위에서 보듯이 국토교통부에서 제공하는 공공데이터를 xml형식으로 그대로 받아오는 것을 알 수 있습니다. 주목할 부분은 아래와 같이 공공데이터 API에 데이터를 요청하는 부분입니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;pre style=&quot;background-color:#2b2b2b;color:#a9b7c6;font-family:'굴림체';font-size:9.0pt;&quot;&gt;&lt;p&gt;2020-03-14 17:34:16 [scrapy.core.engine] DEBUG: Crawled (200) &lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;GET &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;http:&lt;/span&gt;//openapi.molit.go.kr:8081/OpenAPI_ToolInstallPackage/service/rest/RTMSOBJSvc/getRTMSDataSvcAptTrade?serviceKey=aWiZGAJkCsr3wM0YkDO%2BssYpNXZ%2FEWZfuIW5k%2FcHFtD5k1zcCVRBTfThOHmawefasdfwBEtBQID5rIcjXsg%3D%3D&amp;amp;pageNo=1&amp;amp;numOfRo&lt;br /&gt;ws=999&amp;amp;LAWD_CD=44133&amp;amp;DEAL_YMD=200601&amp;gt;&lt;/p&gt;&lt;/pre&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;이 요청부분을 그대로 복사하여 브라우저의 검색창에 복사하면 아래와 같은 요청 데이터가 웹 브라우저 상에 나타납니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 728px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/99912C4B5E6C985A2D&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F99912C4B5E6C985A2D&quot; width=&quot;728&quot; height=&quot;692&quot; filename=&quot;캡처_2020_03_14_17_38_51_650.png&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;다음 시간에는 이 xml 데이터에서 유용한 정보를 어떻게 추출해서 가공하는 지 알아보겠습니다.&lt;/span&gt;&lt;/p&gt;</description>
      <category>파이썬/파이썬 웹 크롤링 - 부동산 공공데이터</category>
      <category>scrapy</category>
      <category>부동산</category>
      <category>부동산 공공데이터</category>
      <category>부동산 데이터</category>
      <category>파이썬</category>
      <author>새로비</author>
      <guid isPermaLink="true">https://engkimbs.tistory.com/962</guid>
      <comments>https://engkimbs.tistory.com/entry/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%ED%81%AC%EB%A1%A4%EB%A7%81%EB%B6%80%EB%8F%99%EC%82%B0-%EB%8D%B0%EC%9D%B4%ED%84%B0-scrapy%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%9C-%EB%B6%80%EB%8F%99%EC%82%B0-%EA%B3%B5%EA%B3%B5-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EA%B0%84%EB%8B%A8%ED%95%98%EA%B2%8C-%EB%B0%9B%EC%95%84%EC%98%A4%EA%B8%B0#entry962comment</comments>
      <pubDate>Sat, 14 Mar 2020 17:41:22 +0900</pubDate>
    </item>
    <item>
      <title>[파이썬 크롤링/부동산 데이터] 스크래피(scrapy) startproject로 초기 프로젝트 구성하기</title>
      <link>https://engkimbs.tistory.com/entry/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%ED%81%AC%EB%A1%A4%EB%A7%81%EB%B6%80%EB%8F%99%EC%82%B0-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EC%8A%A4%ED%81%AC%EB%9E%98%ED%94%BCscrapy-startproject%EB%A1%9C-%EC%B4%88%EA%B8%B0-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EA%B5%AC%EC%84%B1%ED%95%98%EA%B8%B0</link>
      <description>&lt;p&gt;&lt;span style=&quot;font-size: 18pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(31, 218, 17);&quot;&gt;| &lt;/span&gt;들어가기 전에&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;본 포스팅을 제대로 따라가려면&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://engkimbs.tistory.com/893&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;scrapy&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;가 설치되어 있어야 합니다. 아래 링크를 참조하셔서 scrapy 설치를 먼저 진행해주세요!&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://engkimbs.tistory.com/897&quot; target=&quot;_blank&quot;&gt;[Python/파이썬 프로그래밍] - 스크래피(scrapy) 설치 및 scrapy 프로젝트 시작하기&lt;/a&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;또한 부동산 공공데이터 사이트에서 공공데이터 API를 신청한 후 해당 API가 사용가능한 상태가 되어야 합니다.&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://engkimbs.tistory.com/899&quot; target=&quot;_blank&quot;&gt;[유용한 정보들] - 국토교통부 공공데이터 부동산 실거래가 API 신청 방법&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;또한 본 포스팅은 다음 실행환경을 기반으로합니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;table class=&quot;txc-table&quot; width=&quot;692&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; border=&quot;0&quot; style=&quot;border:none;border-collapse:collapse;;font-family:&quot; 맑은=&quot;&quot; 고딕&quot;,=&quot;&quot; sans-serif;font-size:16px&quot;=&quot;&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;width: 692px; height: 54px; border-width: 1px; border-style: solid; border-color: rgb(204, 204, 204); background-color: rgb(212, 244, 250);&quot;&gt;&lt;p&gt;&lt;b&gt;&amp;nbsp; 1. window 10&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&amp;nbsp; 2. Python 3.8.1&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&amp;nbsp; 3. Scrapy 1.8.0&lt;/b&gt;&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 18pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(31, 218, 17);&quot;&gt;|&lt;/span&gt; scrapy 프로젝트 만들기&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;아래와 같은 커맨드를 치게되면 scrapy에 대한 프로젝트가 만들어 집니다.&lt;/span&gt;&lt;/p&gt;&lt;pre style=&quot;background-color:#2b2b2b;color:#a9b7c6;font-family:'굴림체';font-size:9.0pt;&quot;&gt;C:\Users\user\Desktop\python-tutorial&amp;gt;scrapy startproject invest_crawler&lt;br /&gt;New Scrapy project 'invest_crawler', using template directory 'c:\users\user\appdata\local\programs\python\python38\lib\site-packages\scrapy\templates\project', created in:&lt;br /&gt;    C:\Users\user\Desktop\python-tutorial\invest_crawler&lt;br /&gt;&lt;br /&gt;You can start your first spider with:&lt;br /&gt;    cd invest_crawler&lt;br /&gt;    scrapy genspider example example.com&lt;/pre&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;프로젝트의 구성은 다음과 같습니다.&lt;/p&gt;&lt;pre style=&quot;background-color:#2b2b2b;color:#a9b7c6;font-family:'굴림체';font-size:9.0pt;&quot;&gt;|   scrapy.cfg&lt;br /&gt;|&lt;br /&gt;\---invest_crawler&lt;br /&gt;    |   items.py&lt;br /&gt;    |   middlewares.py&lt;br /&gt;    |   pipelines.py&lt;br /&gt;    |   settings.py&lt;br /&gt;    |   __init__.py&lt;br /&gt;    |&lt;br /&gt;    +---spiders&lt;br /&gt;    |   |   __init__.py&lt;br /&gt;    |   |&lt;br /&gt;    |   \---__pycache__&lt;br /&gt;    \---__pycache__&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;scrapy에 대한 구성은 전 포스팅에서 설명했지만 다시 정리하면&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;ul style=&quot;list-style-type: disc;&quot;&gt;&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;__pycache__, __init__.py&amp;nbsp;: 파이썬에서 파생된 파일들입니다. &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;__pycache__는 파이썬에서 .py 파일을 인터프리트할 때 중복된 파일을 해석하는 일이 없도록 인터프리트된 결과를 캐싱한 파일입니다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;__init__.py 는 간단히 설명하면 파이썬에서 단순 디렉터리인지 아니면 파이썬 패키지인지 판별하는 역할을 하는 파일이라고 보시면 됩니다. 자세한 것은 &lt;/span&gt;&lt;a href=&quot;https://wikidocs.net/1418#9595init9595py&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;여기&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;를 참조하시면 됩니다.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;scrapy.cfg : scrapy가 어떤 크롤러 프로젝트와 어떤 세팅을 따를 것인지 혹은 어떤 프로젝트를 기본 크롤러로 지정할 지에 대한 정보를 저장하는 파일입니다. 이 포스팅에서는 크게 자세히 다루지는 않을 것입니다.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;items.py : scrapy에서는 크롤링된 데이터를 item이라는 DTO(Data Transfer Object)에 담아서 로직을 처리합니다. 이 item은 scrapy.Item을 상속받아서 만들 수 있습니다.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;middlewares.py : scrapy는 크롤링된 데이터를 item에 담아서 처리합니다. 이때,&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;&amp;nbsp;데이터를 처리할&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;어떤 특정 요청과 응답을 구현하는 로직을 만들어야 하는데 이것은 scrapy의 middleware라는 모듈에서 처리하게 됩니다. middlewares.py는 이 middleware를 구현하는 파이썬 파일이라고 생각하면 됩니다.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;pipelines.py : scrapy가 데이터를 처리할 때 어떤 특정 통로를 통해서 데이터를 순차적인 로직에 의해서 처리하게 만듭니다. 이 통로를 pipeline이라고 부르며 여러 개의 pipeline을 따라서 scrapy의 데이터의 요청과 응답을 처리하게 됩니다.&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;위의 내용 중에 이해하기 어렵거나 모자란 부분이 있다면은 &lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;아래의 scrapy 아키텍처를 설명한 포스팅을 참고하시면 감사하겠습니다.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;a href=&quot;https://engkimbs.tistory.com/893&quot; target=&quot;_blank&quot;&gt;[Python/파이썬 프로그래밍] - 파이썬 웹 스크래핑할 때 이거 쓰세요. 최고의 파이썬 웹 스크래핑 솔루션 scrapy&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;다음 시간에는 기본적인 scrapy project를 이용하여 부동산 데이터를 어떻게 가져오는 지 알아보도록 하겠습니다.&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>파이썬/파이썬 웹 크롤링 - 부동산 공공데이터</category>
      <category>scrapy</category>
      <category>공공 데이터</category>
      <category>부동산 데이터</category>
      <author>새로비</author>
      <guid isPermaLink="true">https://engkimbs.tistory.com/961</guid>
      <comments>https://engkimbs.tistory.com/entry/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%ED%81%AC%EB%A1%A4%EB%A7%81%EB%B6%80%EB%8F%99%EC%82%B0-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EC%8A%A4%ED%81%AC%EB%9E%98%ED%94%BCscrapy-startproject%EB%A1%9C-%EC%B4%88%EA%B8%B0-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EA%B5%AC%EC%84%B1%ED%95%98%EA%B8%B0#entry961comment</comments>
      <pubDate>Thu, 2 Jan 2020 22:01:17 +0900</pubDate>
    </item>
    <item>
      <title>[HTML&amp;amp;CSS] column 속성으로 다단으로 편집 (multi-layout edit)</title>
      <link>https://engkimbs.tistory.com/entry/HTMLCSS-column-%EC%86%8D%EC%84%B1%EC%9C%BC%EB%A1%9C-%EB%8B%A4%EB%8B%A8%EC%9C%BC%EB%A1%9C-%ED%8E%B8%EC%A7%91-multi-layout-edit</link>
      <description>&lt;p&gt;&lt;span style=&quot;font-size: 18pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;column 속성으로 다단으로 편집&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;텍스트 단을 column 속성으로 다단으로 편집할 수 있습니다. 다단으로 편집한다는 의미는 어떤 레이아웃을 여러 개의 컬럼으로 쪼개서 구성한다는 것을 의미합니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;보통 다단으로 편집하려면 table 요소를 사용하여 구성하기도 하지만 css의 column 속성으로&amp;nbsp;간편하게 구현할 수 있습니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;; font-size: 18pt;&quot;&gt;column-width&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;column-width를 통해 column으로 표현되는 단의 너비를 고정해 놓고 구성할 수 있습니다. column 즉, 단을 고정시켜 놓았을 경우 화면이 커지면 단의 개수가 많아질 것이고 화면이 작아지면 단의 개수가 줄어드는 원리입니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: rgb(140, 252, 203); color: rgb(0, 0, 0);&quot;&gt;&lt;span style=&quot;background-color: rgb(255, 255, 255); color: rgb(0, 0, 0);&quot;&gt;&lt;/span&gt;&lt;span style=&quot;background-color: rgb(255, 255, 255); color: rgb(0, 0, 0);&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: rgb(255, 255, 255); color: rgb(0, 0, 0); font-size: 14pt;&quot;&gt;column-width: &amp;lt;크기&amp;gt; | auto&lt;/span&gt;&lt;/b&gt;&lt;i&gt;&lt;span style=&quot;background-color: rgb(255, 255, 255); color: rgb(0, 0, 0);&quot;&gt;&lt;/span&gt;&lt;span style=&quot;background-color: rgb(255, 255, 255); color: rgb(0, 0, 0);&quot;&gt;&lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;table class=&quot;txc-table&quot; width=&quot;692&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; border=&quot;0&quot; style=&quot;border: none; border-collapse: collapse; width: 692px;&quot; 맑은=&quot;&quot; 고딕&quot;,=&quot;&quot; sans-serif;font-size:16px&quot;=&quot;&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;width: 160px; height: 24px; border-width: 1px; border-style: solid; border-color: rgb(204, 204, 204); background-color: rgb(217, 229, 255);&quot;&gt;&lt;p&gt;&lt;b&gt;&amp;nbsp;&amp;lt;크기&amp;gt;&amp;nbsp;&lt;/b&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td style=&quot;width: 531px; height: 24px; border-bottom: 1px solid rgb(204, 204, 204); border-right: 1px solid rgb(204, 204, 204); border-top: 1px solid rgb(204, 204, 204);&quot;&gt;&lt;p&gt;&amp;nbsp;단 너비를 직접 지정할 수 있습니다.&amp;nbsp;&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td style=&quot;width: 160px; height: 24px; border-bottom: 1px solid rgb(204, 204, 204); border-right: 1px solid rgb(204, 204, 204); border-left: 1px solid rgb(204, 204, 204); background-color: rgb(217, 229, 255);&quot;&gt;&lt;p&gt;&lt;b&gt;&amp;nbsp;auto&lt;/b&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td style=&quot;width: 531px; height: 24px; border-bottom: 1px solid rgb(204, 204, 204); border-right: 1px solid rgb(204, 204, 204);&quot;&gt;&lt;p&gt;&amp;nbsp;단의 개수 같은 다른 속성에 따라 단 너비가 자&amp;nbsp; &amp;nbsp;동 계산됩니다.&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;pre style=&quot;background-color:#2b2b2b;color:#a9b7c6;font-family:'Source Code Pro';font-size:9.8pt;&quot;&gt;&lt;p&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;!DOCTYPE &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;html&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;html &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;lang&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;=&quot;ko&quot;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;head&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;    &amp;lt;meta &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;charset&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;=&quot;utf-8&quot;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;    &amp;lt;title&amp;gt;&lt;/span&gt;&lt;span style=&quot;font-family:'Arial';&quot;&gt;배경 이미지&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/title&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;    &amp;lt;style&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &lt;/span&gt;.&lt;span style=&quot;color:#e8bf6a;&quot;&gt;multi-layout &lt;/span&gt;{&lt;br /&gt;            &lt;span style=&quot;color:#bababa;&quot;&gt;column-width&lt;/span&gt;: &lt;span style=&quot;color:#6897bb;&quot;&gt;120&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;px&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;        &lt;/span&gt;}&lt;br /&gt;    &lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/style&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/head&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;body&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;div &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;=&quot;multi-layout&quot;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;    &amp;lt;p&amp;gt; &amp;lt;strong&amp;gt;&lt;/span&gt;&lt;span style=&quot;font-family:'Arial';&quot;&gt;토마토 &lt;/span&gt;: &lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/strong&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &lt;/span&gt;&lt;span style=&quot;font-family:'Arial';&quot;&gt;토마토는 비타민&lt;/span&gt;A, C&lt;span style=&quot;font-family:'Arial';&quot;&gt;가 풍부할 뿐 아니라 희귀한 성분인 비타민 &lt;/span&gt;H&lt;span style=&quot;font-family:'Arial';&quot;&gt;와 &lt;/span&gt;P&lt;span style=&quot;font-family:'Arial';&quot;&gt;까지 포함된 과일이다&lt;/span&gt;.&lt;br /&gt;        &lt;span style=&quot;font-family:'Arial';&quot;&gt;칼륨과 같은 각종 미네랄은 혈액의 산성도를 낮추는 역할을 해주며&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family:'Arial';&quot;&gt;        토마토에 들어있는 피코펜이라는 성분은 뛰어난 항암 작용을 보이며&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family:'Arial';&quot;&gt;        잘 알려져 있듯이 블루베리와 함께 대표적인 항산화 음식이기도 하다&lt;/span&gt;.&lt;br /&gt;    &lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/p&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;    &amp;lt;p&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &amp;lt;strong&amp;gt;&lt;/span&gt;&lt;span style=&quot;font-family:'Arial';&quot;&gt;토마토 &lt;/span&gt;: &lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/strong&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &lt;/span&gt;&lt;span style=&quot;font-family:'Arial';&quot;&gt;토마토는 비타민&lt;/span&gt;A, C&lt;span style=&quot;font-family:'Arial';&quot;&gt;가 풍부할 뿐 아니라 희귀한 성분인 비타민 &lt;/span&gt;H&lt;span style=&quot;font-family:'Arial';&quot;&gt;와 &lt;/span&gt;P&lt;span style=&quot;font-family:'Arial';&quot;&gt;까지 포함된 과일이다&lt;/span&gt;.&lt;br /&gt;        &lt;span style=&quot;font-family:'Arial';&quot;&gt;칼륨과 같은 각종 미네랄은 혈액의 산성도를 낮추는 역할을 해주며&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family:'Arial';&quot;&gt;        토마토에 들어있는 피코펜이라는 성분은 뛰어난 항암 작용을 보이며&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family:'Arial';&quot;&gt;        잘 알려져 있듯이 블루베리와 함께 대표적인 항산화 음식이기도 하다&lt;/span&gt;.&lt;br /&gt;    &lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/p&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;    &amp;lt;p&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &amp;lt;strong&amp;gt;&lt;/span&gt;&lt;span style=&quot;font-family:'Arial';&quot;&gt;토마토 &lt;/span&gt;: &lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/strong&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &lt;/span&gt;&lt;span style=&quot;font-family:'Arial';&quot;&gt;토마토는 비타민&lt;/span&gt;A, C&lt;span style=&quot;font-family:'Arial';&quot;&gt;가 풍부할 뿐 아니라 희귀한 성분인 비타민 &lt;/span&gt;H&lt;span style=&quot;font-family:'Arial';&quot;&gt;와 &lt;/span&gt;P&lt;span style=&quot;font-family:'Arial';&quot;&gt;까지 포함된 과일이다&lt;/span&gt;.&lt;br /&gt;        &lt;span style=&quot;font-family:'Arial';&quot;&gt;칼륨과 같은 각종 미네랄은 혈액의 산성도를 낮추는 역할을 해주며&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family:'Arial';&quot;&gt;        토마토에 들어있는 피코펜이라는 성분은 뛰어난 항암 작용을 보이며&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family:'Arial';&quot;&gt;        잘 알려져 있듯이 블루베리와 함께 대표적인 항산화 음식이기도 하다&lt;/span&gt;.&lt;br /&gt;    &lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/p&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/body&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;/pre&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 495px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/996521455DAEF26520&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F996521455DAEF26520&quot; width=&quot;495&quot; height=&quot;343&quot; filename=&quot;1.PNG&quot; filemime=&quot;image/jpeg&quot; style=&quot;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 18pt;&quot;&gt;&lt;b&gt;column-count&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;column-count 속성으로 단의 개수를 고정할 수 있습니다. 만일 개수를 고정할 경우 화면의 커지면 단의 넓이가 커지게 되고 화면이 작아지면 단의 넓이가 작아지게 됩니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-size: 14pt; font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-size: 14pt; font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;colunn-count: &amp;lt;숫자&amp;gt; | auto&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;table class=&quot;txc-table&quot; width=&quot;692&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; border=&quot;0&quot; style=&quot;border:none;border-collapse:collapse;;font-family:&quot; 맑은=&quot;&quot; 고딕&quot;,=&quot;&quot; sans-serif;font-size:16px&quot;=&quot;&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;width: 121px; height: 24px; border-width: 1px; border-style: solid; border-color: rgb(204, 204, 204); background-color: rgb(217, 229, 255);&quot;&gt;&lt;p&gt;&lt;b&gt;&amp;nbsp;&amp;lt;숫자&amp;gt;&amp;nbsp;&lt;/b&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td style=&quot;width: 570px; height: 24px; border-bottom: 1px solid rgb(204, 204, 204); border-right: 1px solid rgb(204, 204, 204); border-top: 1px solid rgb(204, 204, 204);&quot;&gt;&lt;p&gt;&amp;nbsp;콘텐츠가 들어갈 단의 개수를 지정합니다.&amp;nbsp;&amp;nbsp;&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td style=&quot;width: 121px; height: 24px; border-bottom: 1px solid rgb(204, 204, 204); border-right: 1px solid rgb(204, 204, 204); border-left: 1px solid rgb(204, 204, 204); background-color: rgb(217, 229, 255);&quot;&gt;&lt;p&gt;&lt;b&gt;&amp;nbsp;auto&lt;/b&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td style=&quot;width: 570px; height: 24px; border-bottom: 1px solid rgb(204, 204, 204); border-right: 1px solid rgb(204, 204, 204);&quot;&gt;&lt;p&gt;&amp;nbsp;단의 너비 같은 다른 속성에 따라 단의 개수가&amp;nbsp; &amp;nbsp;자동 계산 됩니다.&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;pre style=&quot;background-color:#2b2b2b;color:#a9b7c6;font-family:'Source Code Pro';font-size:9.8pt;&quot;&gt;&lt;p&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;!DOCTYPE &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;html&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;html &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;lang&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;=&quot;ko&quot;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;head&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;    &amp;lt;meta &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;charset&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;=&quot;utf-8&quot;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;    &amp;lt;title&amp;gt;&lt;/span&gt;&lt;span style=&quot;font-family:'Arial';&quot;&gt;배경 이미지&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/title&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;    &amp;lt;style&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &lt;/span&gt;.&lt;span style=&quot;color:#e8bf6a;&quot;&gt;multi-layout &lt;/span&gt;{&lt;br /&gt;            &lt;span style=&quot;color:#bababa;&quot;&gt;column-count&lt;/span&gt;: &lt;span style=&quot;color:#6897bb;&quot;&gt;3&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;        &lt;/span&gt;}&lt;br /&gt;    &lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/style&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/head&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;body&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;div &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;=&quot;multi-layout&quot;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;    &amp;lt;p&amp;gt; &amp;lt;strong&amp;gt;&lt;/span&gt;&lt;span style=&quot;font-family:'Arial';&quot;&gt;토마토 &lt;/span&gt;: &lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/strong&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &lt;/span&gt;&lt;span style=&quot;font-family:'Arial';&quot;&gt;토마토는 비타민&lt;/span&gt;A, C&lt;span style=&quot;font-family:'Arial';&quot;&gt;가 풍부할 뿐 아니라 희귀한 성분인 비타민 &lt;/span&gt;H&lt;span style=&quot;font-family:'Arial';&quot;&gt;와 &lt;/span&gt;P&lt;span style=&quot;font-family:'Arial';&quot;&gt;까지 포함된 과일이다&lt;/span&gt;.&lt;br /&gt;        &lt;span style=&quot;font-family:'Arial';&quot;&gt;칼륨과 같은 각종 미네랄은 혈액의 산성도를 낮추는 역할을 해주며&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family:'Arial';&quot;&gt;        토마토에 들어있는 피코펜이라는 성분은 뛰어난 항암 작용을 보이며&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family:'Arial';&quot;&gt;        잘 알려져 있듯이 블루베리와 함께 대표적인 항산화 음식이기도 하다&lt;/span&gt;.&lt;br /&gt;    &lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/p&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;    &amp;lt;p&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &amp;lt;strong&amp;gt;&lt;/span&gt;&lt;span style=&quot;font-family:'Arial';&quot;&gt;토마토 &lt;/span&gt;: &lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/strong&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &lt;/span&gt;&lt;span style=&quot;font-family:'Arial';&quot;&gt;토마토는 비타민&lt;/span&gt;A, C&lt;span style=&quot;font-family:'Arial';&quot;&gt;가 풍부할 뿐 아니라 희귀한 성분인 비타민 &lt;/span&gt;H&lt;span style=&quot;font-family:'Arial';&quot;&gt;와 &lt;/span&gt;P&lt;span style=&quot;font-family:'Arial';&quot;&gt;까지 포함된 과일이다&lt;/span&gt;.&lt;br /&gt;        &lt;span style=&quot;font-family:'Arial';&quot;&gt;칼륨과 같은 각종 미네랄은 혈액의 산성도를 낮추는 역할을 해주며&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family:'Arial';&quot;&gt;        토마토에 들어있는 피코펜이라는 성분은 뛰어난 항암 작용을 보이며&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family:'Arial';&quot;&gt;        잘 알려져 있듯이 블루베리와 함께 대표적인 항산화 음식이기도 하다&lt;/span&gt;.&lt;br /&gt;    &lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/p&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;    &amp;lt;p&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &amp;lt;strong&amp;gt;&lt;/span&gt;&lt;span style=&quot;font-family:'Arial';&quot;&gt;토마토 &lt;/span&gt;: &lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/strong&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &lt;/span&gt;&lt;span style=&quot;font-family:'Arial';&quot;&gt;토마토는 비타민&lt;/span&gt;A, C&lt;span style=&quot;font-family:'Arial';&quot;&gt;가 풍부할 뿐 아니라 희귀한 성분인 비타민 &lt;/span&gt;H&lt;span style=&quot;font-family:'Arial';&quot;&gt;와 &lt;/span&gt;P&lt;span style=&quot;font-family:'Arial';&quot;&gt;까지 포함된 과일이다&lt;/span&gt;.&lt;br /&gt;        &lt;span style=&quot;font-family:'Arial';&quot;&gt;칼륨과 같은 각종 미네랄은 혈액의 산성도를 낮추는 역할을 해주며&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family:'Arial';&quot;&gt;        토마토에 들어있는 피코펜이라는 성분은 뛰어난 항암 작용을 보이며&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family:'Arial';&quot;&gt;        잘 알려져 있듯이 블루베리와 함께 대표적인 항산화 음식이기도 하다&lt;/span&gt;.&lt;br /&gt;    &lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/p&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/body&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;/pre&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 492px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/9995A8435DAEF29C19&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F9995A8435DAEF29C19&quot; width=&quot;492&quot; height=&quot;319&quot; filename=&quot;2.PNG&quot; filemime=&quot;image/jpeg&quot; style=&quot;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 18pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;column-gap&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;column-gap 속성은 단과 단 사이의 여백을 지정하는 속성입니다. 단과 단 사이에 구분 선을 넣는다면 구분선도 여백 안에 들어가게 됩니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;b style=&quot;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-size: 14pt; font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-size: 14pt; font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;column-gap : &amp;lt;크기&amp;gt; | normal&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;table class=&quot;txc-table&quot; width=&quot;692&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; border=&quot;0&quot; style=&quot;border:none;border-collapse:collapse;;font-family:&quot; 맑은=&quot;&quot; 고딕&quot;,=&quot;&quot; sans-serif;font-size:16px&quot;=&quot;&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;width: 171px; height: 24px; border-width: 1px; border-style: solid; border-color: rgb(204, 204, 204); background-color: rgb(217, 229, 255);&quot;&gt;&lt;p&gt;&lt;b&gt;&amp;nbsp;&amp;lt;크기&amp;gt;&lt;/b&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td style=&quot;width: 520px; height: 24px; border-bottom: 1px solid rgb(204, 204, 204); border-right: 1px solid rgb(204, 204, 204); border-top: 1px solid rgb(204, 204, 204);&quot;&gt;&lt;p&gt;&amp;nbsp;단과 단 사이의 여백을 숫자로 지정합니다.&amp;nbsp;&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td style=&quot;width: 171px; height: 24px; border-bottom: 1px solid rgb(204, 204, 204); border-right: 1px solid rgb(204, 204, 204); border-left: 1px solid rgb(204, 204, 204); background-color: rgb(217, 229, 255);&quot;&gt;&lt;p&gt;&lt;b&gt;&amp;nbsp;normal&lt;/b&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td style=&quot;width: 520px; height: 24px; border-bottom: 1px solid rgb(204, 204, 204); border-right: 1px solid rgb(204, 204, 204);&quot;&gt;&lt;p&gt;&amp;nbsp;여백을 자동으로 지정합니다.&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;pre style=&quot;background-color:#2b2b2b;color:#a9b7c6;font-family:'Source Code Pro';font-size:9.8pt;&quot;&gt;&lt;p&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;!DOCTYPE &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;html&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;html &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;lang&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;=&quot;ko&quot;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;head&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;    &amp;lt;meta &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;charset&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;=&quot;utf-8&quot;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;    &amp;lt;title&amp;gt;&lt;/span&gt;&lt;span style=&quot;font-family:'Arial';&quot;&gt;배경 이미지&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/title&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;    &amp;lt;style&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &lt;/span&gt;.&lt;span style=&quot;color:#e8bf6a;&quot;&gt;multi-layout &lt;/span&gt;{&lt;br /&gt;            &lt;span style=&quot;color:#bababa;&quot;&gt;column-count&lt;/span&gt;: &lt;span style=&quot;color:#6897bb;&quot;&gt;3&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;column-gap&lt;/span&gt;: &lt;span style=&quot;color:#6897bb;&quot;&gt;50&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;px&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;        &lt;/span&gt;}&lt;br /&gt;    &lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/style&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/head&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;body&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;div &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;=&quot;multi-layout&quot;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;    &amp;lt;p&amp;gt; &amp;lt;strong&amp;gt;&lt;/span&gt;&lt;span style=&quot;font-family:'Arial';&quot;&gt;토마토 &lt;/span&gt;: &lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/strong&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &lt;/span&gt;&lt;span style=&quot;font-family:'Arial';&quot;&gt;토마토는 비타민&lt;/span&gt;A, C&lt;span style=&quot;font-family:'Arial';&quot;&gt;가 풍부할 뿐 아니라 희귀한 성분인 비타민 &lt;/span&gt;H&lt;span style=&quot;font-family:'Arial';&quot;&gt;와 &lt;/span&gt;P&lt;span style=&quot;font-family:'Arial';&quot;&gt;까지 포함된 과일이다&lt;/span&gt;.&lt;br /&gt;        &lt;span style=&quot;font-family:'Arial';&quot;&gt;칼륨과 같은 각종 미네랄은 혈액의 산성도를 낮추는 역할을 해주며&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family:'Arial';&quot;&gt;        토마토에 들어있는 피코펜이라는 성분은 뛰어난 항암 작용을 보이며&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family:'Arial';&quot;&gt;        잘 알려져 있듯이 블루베리와 함께 대표적인 항산화 음식이기도 하다&lt;/span&gt;.&lt;br /&gt;    &lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/p&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;    &amp;lt;p&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &amp;lt;strong&amp;gt;&lt;/span&gt;&lt;span style=&quot;font-family:'Arial';&quot;&gt;토마토 &lt;/span&gt;: &lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/strong&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &lt;/span&gt;&lt;span style=&quot;font-family:'Arial';&quot;&gt;토마토는 비타민&lt;/span&gt;A, C&lt;span style=&quot;font-family:'Arial';&quot;&gt;가 풍부할 뿐 아니라 희귀한 성분인 비타민 &lt;/span&gt;H&lt;span style=&quot;font-family:'Arial';&quot;&gt;와 &lt;/span&gt;P&lt;span style=&quot;font-family:'Arial';&quot;&gt;까지 포함된 과일이다&lt;/span&gt;.&lt;br /&gt;        &lt;span style=&quot;font-family:'Arial';&quot;&gt;칼륨과 같은 각종 미네랄은 혈액의 산성도를 낮추는 역할을 해주며&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family:'Arial';&quot;&gt;        토마토에 들어있는 피코펜이라는 성분은 뛰어난 항암 작용을 보이며&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family:'Arial';&quot;&gt;        잘 알려져 있듯이 블루베리와 함께 대표적인 항산화 음식이기도 하다&lt;/span&gt;.&lt;br /&gt;    &lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/p&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;    &amp;lt;p&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &amp;lt;strong&amp;gt;&lt;/span&gt;&lt;span style=&quot;font-family:'Arial';&quot;&gt;토마토 &lt;/span&gt;: &lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/strong&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &lt;/span&gt;&lt;span style=&quot;font-family:'Arial';&quot;&gt;토마토는 비타민&lt;/span&gt;A, C&lt;span style=&quot;font-family:'Arial';&quot;&gt;가 풍부할 뿐 아니라 희귀한 성분인 비타민 &lt;/span&gt;H&lt;span style=&quot;font-family:'Arial';&quot;&gt;와 &lt;/span&gt;P&lt;span style=&quot;font-family:'Arial';&quot;&gt;까지 포함된 과일이다&lt;/span&gt;.&lt;br /&gt;        &lt;span style=&quot;font-family:'Arial';&quot;&gt;칼륨과 같은 각종 미네랄은 혈액의 산성도를 낮추는 역할을 해주며&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family:'Arial';&quot;&gt;        토마토에 들어있는 피코펜이라는 성분은 뛰어난 항암 작용을 보이며&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family:'Arial';&quot;&gt;        잘 알려져 있듯이 블루베리와 함께 대표적인 항산화 음식이기도 하다&lt;/span&gt;.&lt;br /&gt;    &lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/p&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/body&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;/pre&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 500px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/99794A4C5DAEF2EE1A&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F99794A4C5DAEF2EE1A&quot; width=&quot;500&quot; height=&quot;356&quot; filename=&quot;3.PNG&quot; filemime=&quot;image/jpeg&quot; style=&quot;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 18pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;column-rule&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;column-rule 속성을 통해 단과 단 사이를 구분할 수 있는 수직선을 넣을 수 있습니다. 이때의 구분선은 color, style, width 같은 속성을 추가로 작성하여 꾸밀 수 있습니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;; font-size: 14pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;column-rule-color&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;: &amp;lt;색상&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;; font-size: 14pt;&quot;&gt;column-rule-style : none | hidden | dotted | dashed | solid | double | groove | ridge | inset | outset&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;; font-size: 14pt;&quot;&gt;column-rule-width : &amp;lt;크기&amp;gt; | thin | medium | thick&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;; font-size: 14pt;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;column-rule : &amp;lt;너비&amp;gt; | &amp;lt;스타일&amp;gt; | &amp;lt;색상&amp;gt;&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;pre style=&quot;background-color: rgb(43, 43, 43); color: rgb(169, 183, 198); font-family: &amp;quot;Source Code Pro&amp;quot;; font-size: 9.8pt;&quot;&gt;&lt;p&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;&amp;lt;!DOCTYPE &lt;/span&gt;&lt;span style=&quot;color: rgb(186, 186, 186);&quot;&gt;html&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;&amp;lt;html &lt;/span&gt;&lt;span style=&quot;color: rgb(186, 186, 186);&quot;&gt;lang&lt;/span&gt;&lt;span style=&quot;color: rgb(165, 194, 97);&quot;&gt;=&quot;ko&quot;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;&amp;lt;head&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;    &amp;lt;meta &lt;/span&gt;&lt;span style=&quot;color: rgb(186, 186, 186);&quot;&gt;charset&lt;/span&gt;&lt;span style=&quot;color: rgb(165, 194, 97);&quot;&gt;=&quot;utf-8&quot;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;    &amp;lt;title&amp;gt;&lt;/span&gt;&lt;span style=&quot;font-family: Arial;&quot;&gt;배경 이미지&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;&amp;lt;/title&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;    &amp;lt;style&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;        &lt;/span&gt;.&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;multi-layout &lt;/span&gt;{&lt;br /&gt;            &lt;span style=&quot;color: rgb(186, 186, 186);&quot;&gt;column-count&lt;/span&gt;: &lt;span style=&quot;color: rgb(104, 151, 187);&quot;&gt;3&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color: rgb(186, 186, 186);&quot;&gt;column-gap&lt;/span&gt;: &lt;span style=&quot;color: rgb(104, 151, 187);&quot;&gt;50&lt;/span&gt;&lt;span style=&quot;color: rgb(165, 194, 97);&quot;&gt;px&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color: rgb(186, 186, 186);&quot;&gt;column-rule-color&lt;/span&gt;: &lt;span style=&quot;color: rgb(165, 194, 97);&quot;&gt;lightslategray&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color: rgb(186, 186, 186);&quot;&gt;column-rule-style&lt;/span&gt;: &lt;span style=&quot;color: rgb(165, 194, 97);&quot;&gt;dotted&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color: rgb(186, 186, 186);&quot;&gt;column-width&lt;/span&gt;: &lt;span style=&quot;color: rgb(104, 151, 187);&quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color: rgb(165, 194, 97);&quot;&gt;px&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;        &lt;/span&gt;}&lt;br /&gt;    &lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;&amp;lt;/style&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;&amp;lt;/head&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;&amp;lt;body&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;&amp;lt;div &lt;/span&gt;&lt;span style=&quot;color: rgb(186, 186, 186);&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color: rgb(165, 194, 97);&quot;&gt;=&quot;multi-layout&quot;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;    &amp;lt;p&amp;gt; &amp;lt;strong&amp;gt;&lt;/span&gt;&lt;span style=&quot;font-family: Arial;&quot;&gt;토마토 &lt;/span&gt;: &lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;&amp;lt;/strong&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;        &lt;/span&gt;&lt;span style=&quot;font-family: Arial;&quot;&gt;토마토는 비타민&lt;/span&gt;A, C&lt;span style=&quot;font-family: Arial;&quot;&gt;가 풍부할 뿐 아니라 희귀한 성분인 비타민 &lt;/span&gt;H&lt;span style=&quot;font-family: Arial;&quot;&gt;와 &lt;/span&gt;P&lt;span style=&quot;font-family: Arial;&quot;&gt;까지 포함된 과일이다&lt;/span&gt;.&lt;br /&gt;        &lt;span style=&quot;font-family: Arial;&quot;&gt;칼륨과 같은 각종 미네랄은 혈액의 산성도를 낮추는 역할을 해주며&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: Arial;&quot;&gt;        토마토에 들어있는 피코펜이라는 성분은 뛰어난 항암 작용을 보이며&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: Arial;&quot;&gt;        잘 알려져 있듯이 블루베리와 함께 대표적인 항산화 음식이기도 하다&lt;/span&gt;.&lt;br /&gt;    &lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;&amp;lt;/p&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;    &amp;lt;p&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;        &amp;lt;strong&amp;gt;&lt;/span&gt;&lt;span style=&quot;font-family: Arial;&quot;&gt;토마토 &lt;/span&gt;: &lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;&amp;lt;/strong&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;        &lt;/span&gt;&lt;span style=&quot;font-family: Arial;&quot;&gt;토마토는 비타민&lt;/span&gt;A, C&lt;span style=&quot;font-family: Arial;&quot;&gt;가 풍부할 뿐 아니라 희귀한 성분인 비타민 &lt;/span&gt;H&lt;span style=&quot;font-family: Arial;&quot;&gt;와 &lt;/span&gt;P&lt;span style=&quot;font-family: Arial;&quot;&gt;까지 포함된 과일이다&lt;/span&gt;.&lt;br /&gt;        &lt;span style=&quot;font-family: Arial;&quot;&gt;칼륨과 같은 각종 미네랄은 혈액의 산성도를 낮추는 역할을 해주며&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: Arial;&quot;&gt;        토마토에 들어있는 피코펜이라는 성분은 뛰어난 항암 작용을 보이며&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: Arial;&quot;&gt;        잘 알려져 있듯이 블루베리와 함께 대표적인 항산화 음식이기도 하다&lt;/span&gt;.&lt;br /&gt;    &lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;&amp;lt;/p&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;    &amp;lt;p&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;        &amp;lt;strong&amp;gt;&lt;/span&gt;&lt;span style=&quot;font-family: Arial;&quot;&gt;토마토 &lt;/span&gt;: &lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;&amp;lt;/strong&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;        &lt;/span&gt;&lt;span style=&quot;font-family: Arial;&quot;&gt;토마토는 비타민&lt;/span&gt;A, C&lt;span style=&quot;font-family: Arial;&quot;&gt;가 풍부할 뿐 아니라 희귀한 성분인 비타민 &lt;/span&gt;H&lt;span style=&quot;font-family: Arial;&quot;&gt;와 &lt;/span&gt;P&lt;span style=&quot;font-family: Arial;&quot;&gt;까지 포함된 과일이다&lt;/span&gt;.&lt;br /&gt;        &lt;span style=&quot;font-family: Arial;&quot;&gt;칼륨과 같은 각종 미네랄은 혈액의 산성도를 낮추는 역할을 해주며&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: Arial;&quot;&gt;        토마토에 들어있는 피코펜이라는 성분은 뛰어난 항암 작용을 보이며&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: Arial;&quot;&gt;        잘 알려져 있듯이 블루베리와 함께 대표적인 항산화 음식이기도 하다&lt;/span&gt;.&lt;br /&gt;    &lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;&amp;lt;/p&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;&amp;lt;/body&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;/pre&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 578px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/99A7FB4C5DAEF32E22&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F99A7FB4C5DAEF32E22&quot; width=&quot;578&quot; height=&quot;326&quot; filename=&quot;캡처.PNG&quot; filemime=&quot;image/jpeg&quot; style=&quot;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;; font-size: 18pt;&quot;&gt;column-span&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;column-span 속성으로 단을 여러개로 합칠 수도 있습니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;column-span : 1 | all&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;table class=&quot;txc-table&quot; width=&quot;692&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; border=&quot;0&quot; 맑은=&quot;&quot; 고딕&quot;,=&quot;&quot; sans-serif;font-size:16px&quot;=&quot;&quot; style=&quot;border: none; border-collapse: collapse;&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;width: 114px; height: 24px; border-width: 1px; border-style: solid; border-color: rgb(204, 204, 204); background-color: rgb(217, 229, 255);&quot;&gt;&lt;p&gt;&lt;b&gt;&amp;nbsp;1&amp;nbsp;&lt;/b&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style=&quot;width: 577px; height: 24px; border-bottom: 1px solid rgb(204, 204, 204); border-right: 1px solid rgb(204, 204, 204); border-top: 1px solid rgb(204, 204, 204);&quot;&gt;&lt;p&gt;&amp;nbsp;단을 하나만 합치는 것이기 때문에 그대로 두&amp;nbsp; &amp;nbsp;는&amp;nbsp;것과 같습니다.&amp;nbsp;(기본값)&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width: 114px; height: 24px; border-bottom: 1px solid rgb(204, 204, 204); border-right: 1px solid rgb(204, 204, 204); border-left: 1px solid rgb(204, 204, 204); background-color: rgb(217, 229, 255);&quot;&gt;&lt;p&gt;&lt;b&gt;&amp;nbsp;all&lt;/b&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style=&quot;width: 577px; height: 24px; border-bottom: 1px solid rgb(204, 204, 204); border-right: 1px solid rgb(204, 204, 204);&quot;&gt;&lt;p&gt;&amp;nbsp;전체 단을 하나로 합칩니다.&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;pre style=&quot;background-color: rgb(43, 43, 43); color: rgb(169, 183, 198); font-family: &amp;quot;Source Code Pro&amp;quot;; font-size: 9.8pt;&quot;&gt;&lt;p&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;&amp;lt;!DOCTYPE &lt;/span&gt;&lt;span style=&quot;color: rgb(186, 186, 186);&quot;&gt;html&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;&amp;lt;html &lt;/span&gt;&lt;span style=&quot;color: rgb(186, 186, 186);&quot;&gt;lang&lt;/span&gt;&lt;span style=&quot;color: rgb(165, 194, 97);&quot;&gt;=&quot;ko&quot;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;&amp;lt;head&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;    &amp;lt;meta &lt;/span&gt;&lt;span style=&quot;color: rgb(186, 186, 186);&quot;&gt;charset&lt;/span&gt;&lt;span style=&quot;color: rgb(165, 194, 97);&quot;&gt;=&quot;utf-8&quot;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;    &amp;lt;title&amp;gt;&lt;/span&gt;&lt;span style=&quot;font-family: Arial;&quot;&gt;배경 이미지&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;&amp;lt;/title&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;    &amp;lt;style&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;        &lt;/span&gt;.&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;multi-layout &lt;/span&gt;{&lt;br /&gt;            &lt;span style=&quot;color: rgb(186, 186, 186);&quot;&gt;column-count&lt;/span&gt;: &lt;span style=&quot;color: rgb(104, 151, 187);&quot;&gt;3&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color: rgb(186, 186, 186);&quot;&gt;column-gap&lt;/span&gt;: &lt;span style=&quot;color: rgb(104, 151, 187);&quot;&gt;50&lt;/span&gt;&lt;span style=&quot;color: rgb(165, 194, 97);&quot;&gt;px&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color: rgb(186, 186, 186);&quot;&gt;column-rule-color&lt;/span&gt;: &lt;span style=&quot;color: rgb(165, 194, 97);&quot;&gt;lightslategray&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color: rgb(186, 186, 186);&quot;&gt;column-rule-style&lt;/span&gt;: &lt;span style=&quot;color: rgb(165, 194, 97);&quot;&gt;dotted&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color: rgb(186, 186, 186);&quot;&gt;column-width&lt;/span&gt;: &lt;span style=&quot;color: rgb(104, 151, 187);&quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color: rgb(165, 194, 97);&quot;&gt;px&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;        &lt;/span&gt;}&lt;br /&gt;        .&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;col-merge &lt;/span&gt;{&lt;br /&gt;            &lt;span style=&quot;color: rgb(186, 186, 186);&quot;&gt;column-span&lt;/span&gt;:&lt;span style=&quot;color: rgb(165, 194, 97);&quot;&gt;all&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;        &lt;/span&gt;}&lt;br /&gt;    &lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;&amp;lt;/style&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;&amp;lt;/head&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;&amp;lt;body&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;&amp;lt;h1&amp;gt; &lt;/span&gt;&lt;span style=&quot;font-family: Arial;&quot;&gt;건강에 좋은 식품&lt;/span&gt;!&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;&amp;lt;/h1&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;&amp;lt;h3&amp;gt; &lt;/span&gt;&lt;span style=&quot;font-family: Arial;&quot;&gt;너에게 좋은 음식 토마토 토마토 토마토&lt;/span&gt;!!&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;&amp;lt;/h3&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;&amp;lt;div &lt;/span&gt;&lt;span style=&quot;color: rgb(186, 186, 186);&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color: rgb(165, 194, 97);&quot;&gt;=&quot;multi-layout&quot;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;    &amp;lt;strong&amp;gt;&lt;/span&gt;&lt;span style=&quot;font-family: Arial;&quot;&gt;토마토 &lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;&amp;lt;/strong&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;    &amp;lt;p&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;        &lt;/span&gt;&lt;span style=&quot;font-family: Arial;&quot;&gt;토마토는 비타민&lt;/span&gt;A, C&lt;span style=&quot;font-family: Arial;&quot;&gt;가 풍부할 뿐 아니라 희귀한 성분인 비타민 &lt;/span&gt;H&lt;span style=&quot;font-family: Arial;&quot;&gt;와 &lt;/span&gt;P&lt;span style=&quot;font-family: Arial;&quot;&gt;까지 포함된 과일이다&lt;/span&gt;.&lt;br /&gt;        &lt;span style=&quot;font-family: Arial;&quot;&gt;칼륨과 같은 각종 미네랄은 혈액의 산성도를 낮추는 역할을 해주며&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: Arial;&quot;&gt;        토마토에 들어있는 피코펜이라는 성분은 뛰어난 항암 작용을 보이며&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: Arial;&quot;&gt;        잘 알려져 있듯이 블루베리와 함께 대표적인 항산화 음식이기도 하다&lt;/span&gt;.&lt;br /&gt;    &lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;&amp;lt;/p&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;    &amp;lt;strong&amp;gt;&lt;/span&gt;&lt;span style=&quot;font-family: Arial;&quot;&gt;토마토 &lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;&amp;lt;/strong&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;    &amp;lt;p&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;        &lt;/span&gt;&lt;span style=&quot;font-family: Arial;&quot;&gt;토마토는 비타민&lt;/span&gt;A, C&lt;span style=&quot;font-family: Arial;&quot;&gt;가 풍부할 뿐 아니라 희귀한 성분인 비타민 &lt;/span&gt;H&lt;span style=&quot;font-family: Arial;&quot;&gt;와 &lt;/span&gt;P&lt;span style=&quot;font-family: Arial;&quot;&gt;까지 포함된 과일이다&lt;/span&gt;.&lt;br /&gt;        &lt;span style=&quot;font-family: Arial;&quot;&gt;칼륨과 같은 각종 미네랄은 혈액의 산성도를 낮추는 역할을 해주며&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: Arial;&quot;&gt;        토마토에 들어있는 피코펜이라는 성분은 뛰어난 항암 작용을 보이며&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: Arial;&quot;&gt;        잘 알려져 있듯이 블루베리와 함께 대표적인 항산화 음식이기도 하다&lt;/span&gt;.&lt;br /&gt;    &lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;&amp;lt;/p&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;    &amp;lt;strong&amp;gt;&lt;/span&gt;&lt;span style=&quot;font-family: Arial;&quot;&gt;토마토 &lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;&amp;lt;/strong&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;    &amp;lt;p&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;        &lt;/span&gt;&lt;span style=&quot;font-family: Arial;&quot;&gt;토마토는 비타민&lt;/span&gt;A, C&lt;span style=&quot;font-family: Arial;&quot;&gt;가 풍부할 뿐 아니라 희귀한 성분인 비타민 &lt;/span&gt;H&lt;span style=&quot;font-family: Arial;&quot;&gt;와 &lt;/span&gt;P&lt;span style=&quot;font-family: Arial;&quot;&gt;까지 포함된 과일이다&lt;/span&gt;.&lt;br /&gt;        &lt;span style=&quot;font-family: Arial;&quot;&gt;칼륨과 같은 각종 미네랄은 혈액의 산성도를 낮추는 역할을 해주며&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: Arial;&quot;&gt;        토마토에 들어있는 피코펜이라는 성분은 뛰어난 항암 작용을 보이며&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: Arial;&quot;&gt;        잘 알려져 있듯이 블루베리와 함께 대표적인 항산화 음식이기도 하다&lt;/span&gt;.&lt;br /&gt;    &lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;&amp;lt;/p&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;    &amp;lt;div &lt;/span&gt;&lt;span style=&quot;color: rgb(186, 186, 186);&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color: rgb(165, 194, 97);&quot;&gt;=&quot;col-merge&quot;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;        &amp;lt;strong &amp;gt; &lt;/span&gt;&lt;span style=&quot;font-family: Arial;&quot;&gt;코코넛 &lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;&amp;lt;/strong&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;        &amp;lt;p&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;font-family: Arial;&quot;&gt;내륙 지방과 위도가 높은 지역을 제외한 모든 곳에 서식한다&lt;/span&gt;. &lt;span style=&quot;font-family: Arial;&quot;&gt;코코넛 나무 같은 야자수는 햇빛에 노출되는 시간이 길어야 잘 자란다&lt;/span&gt;. &lt;span style=&quot;font-family: Arial;&quot;&gt;또한 높은 염분은 잘 견디나 삼투압 작용으로 인하여 빠져나가는 수분을 포충할 수분이 필요하기 때문에 강수량도 높아야 한다&lt;/span&gt;. &lt;span style=&quot;font-family: Arial;&quot;&gt;내륙 지역 중 건조하고 위도가 높은 곳은 적도보다 햇볕을 덜 받는다&lt;/span&gt;. &lt;span style=&quot;font-family: Arial;&quot;&gt;즉&lt;/span&gt;, &lt;span style=&quot;font-family: Arial;&quot;&gt;아열대도 아니고 거의 열대기후 지역에서만 산다&lt;/span&gt;. &lt;span style=&quot;font-family: Arial;&quot;&gt;모래가 많은 토질에서는 열매가 해류를 따라 다른 곳으로 퍼져 나가기도 한다&lt;/span&gt;. &lt;span style=&quot;font-family: Arial;&quot;&gt;이렇게 열매가 바다 위에서도 장시간 생존할 수 있는 이유는 질긴 섬유질 과피는 물에 뜨고&lt;/span&gt;, &lt;span style=&quot;font-family: Arial;&quot;&gt;씨앗에는 안쪽에 물과 영양분이 저장&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: Arial;&quot;&gt;        &lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;&amp;lt;/p&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;    &amp;lt;/div&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;&amp;lt;/body&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;/pre&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 728px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/9988224C5DAEF3A236&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F9988224C5DAEF3A236&quot; width=&quot;728&quot; height=&quot;396&quot; filename=&quot;캡처.PNG&quot; filemime=&quot;image/jpeg&quot; style=&quot;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>Language &amp;amp; Solution/HTML&amp;amp;CSS</category>
      <category>CSS</category>
      <category>다단 편집</category>
      <author>새로비</author>
      <guid isPermaLink="true">https://engkimbs.tistory.com/940</guid>
      <comments>https://engkimbs.tistory.com/entry/HTMLCSS-column-%EC%86%8D%EC%84%B1%EC%9C%BC%EB%A1%9C-%EB%8B%A4%EB%8B%A8%EC%9C%BC%EB%A1%9C-%ED%8E%B8%EC%A7%91-multi-layout-edit#entry940comment</comments>
      <pubDate>Tue, 22 Oct 2019 18:23:11 +0900</pubDate>
    </item>
    <item>
      <title>[오라클 DB] 오라클 테이블 생성하기</title>
      <link>https://engkimbs.tistory.com/entry/%EC%98%A4%EB%9D%BC%ED%81%B4-DB-%EC%98%A4%EB%9D%BC%ED%81%B4-%ED%85%8C%EC%9D%B4%EB%B8%94-%EC%83%9D%EC%84%B1%ED%95%98%EA%B8%B0</link>
      <description>&lt;p&gt;&lt;span style=&quot;font-size: 18pt;&quot;&gt;&lt;b&gt;오라클 테이블 생성&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 12pt; font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;테이블은 DBMS에서 가장 기본적인 객체로 로우(행), 컬럼(열)로 구성된 2차원 형태의 객체로 엑셀의 워크시트의 구조와 유사합니다. SQL을 이용해 데이터를 조회, 삭제, 입력, 수정할 수 있으며&amp;nbsp;그 결과로 생성되거나 삭제된 데이터가 반영되는 곳이 테이블입니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 12pt; font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;테이블은 DBMS에서 가장 필수적인 요소입니다. 따라서&amp;nbsp;테이블의 논리적, 물리적 구조를 제대로 알아야 나중에 DBMS를 운영할 때 효율적이고 안전하게 운영할 수 있습니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 18pt;&quot;&gt;&lt;b&gt;테이블&amp;nbsp;생성 구문&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;테이블은 CREATE 문으로 생성할 수 있습니다. CREATE 구문에는 정말 많은 옵션이 있지만 그 중 핵심적인 것만 적어보면 아래와 같습니다&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;pre style=&quot;background-color:#2b2b2b;color:#a9b7c6;font-family:'굴림체';font-size:9.0pt;&quot;&gt;&lt;span style=&quot;color:#cc7832;font-weight:bold;&quot;&gt;CREATE TABLE &lt;/span&gt;[&lt;span style=&quot;color:#cc7832;font-weight:bold;&quot;&gt;SCHEMA&lt;/span&gt;.] 테이블명 (&lt;br /&gt;    컬럼1 데이터타입 [&lt;span style=&quot;color:#cc7832;font-weight:bold;&quot;&gt;DEFAULT &lt;/span&gt;표현식] [컬럼 제약] ...&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;    &lt;/span&gt;컬럼2 데이터타입 [&lt;span style=&quot;color:#cc7832;font-weight:bold;&quot;&gt;DEFAULT &lt;/span&gt;표현식] [컬럼 제약] ...&lt;span style=&quot;color:#cc7832;&quot;&gt;,&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;    &lt;/span&gt;...&lt;br /&gt;    CONSTRAINT [제약이름] [제약종류] 컬럼1 [&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;컬러2] ... &lt;br /&gt;) [&lt;span style=&quot;color:#cc7832;font-weight:bold;&quot;&gt;TABLESPACE &lt;/span&gt;테이블 스페이스명]&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;/span&gt;&lt;/pre&gt;&lt;ul style=&quot;list-style-type: disc;&quot;&gt;&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;SCHEMA&amp;nbsp;: 스키마는 임의의 사용자가 생성한 데이터베이스 객체를 말하며 그 스키마 이름은 사용자 이름과 같습니다. 쉽게 말하면 스키마는 테이블같은 객체가 생성되는 영역입니다.&amp;nbsp;만약 유저 이름이 saelobi라면 이 사용자가 테이블, 인덱스, 뷰 등 여러 객체를 생성했을 시 그 객체의 소유자는 saelobi가 됩니다. 이때, 이 객체들은 saelobi.test_table, saelobi.test_index 같이 스키마로 구분되어 집니다. 참고로 기존 시스템 테이블 같은 시스템 객체들의 소유자는 sys입니다.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;DEFAULT : 아무런 컬럼값이 들어가지 않을 때 기본적으로 들어가는 값을 표현합니다. 보통 DATE 컬럼에 SYSDATE&amp;nbsp;같이 현재 시간을 나타내는 값을 넣습니다.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;CONSTRAINT : 제약조건을 나타내는 키워드입니다. 제약조건에 대해서는 다음에 자세히 설명하도록 하겠습니다. 여기서는 테이블에 데이터를 저장할 때 어떤 제약을 건다고 생각하시면 됩니다.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;TABLESPACE : 테이블스페이스는 실제 테이블이 저장되는 지점입니다. 여러 테이블 스페이스 공간이 있으며 그중 하나의 테입르 스페이스 공간을 선택하여 저장할 수 있습니다.&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;참고로 테이블스페이스와 스키마와의 관계를 헷갈려 하실 수 있습니다. 간단하게 설명하자면 테이블스페이스는&amp;nbsp;테이블스페이스는 하나의 저장공간으로 생각하면 됩니다. 이 테이블스페이스 안에서 오라클 유저(user)는 자신만의 테이블 생성 공간(schema)를 가지게 됩니다. 이 스키마는 유저 이름과 매핑되죠. 오라클에서는 스키마가 유저단위로 자동 생성되고 변경할 수 있습니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;blockquote class=&quot;tx-quote-tistory&quot;&gt;&lt;p&gt;&lt;b&gt;테이블 스페이스는 오라클 서버 단위로 생성됩니다. 이 오라클 서버라는 것은 오라클 DBMS 프로그램이 가동되고 있는 서버를 말하죠.&lt;/b&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;아래는 데이터베이스, 테이블스페이스, 스키마, 테이블과의 관계를 간략하게 나타내고 있습니다. 자세하게 들어가면 더 많은 것들이 그림에 포함되어야 겠지만&amp;nbsp;논리적인 관점에서 간략하게 보면 대략 아래의 그림이라 생각하면 개념 잡기 쉬울 것 입니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 728px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/99DAFF365DA5BE1303&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F99DAFF365DA5BE1303&quot; width=&quot;728&quot; height=&quot;460&quot; filename=&quot;캡처_2019_10_15_21_39_32_176.png&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;따라서 같은 테이블스페이스 내라도 스키마가 다르면 같은 테이블 명을 쓸 수 있습니다&lt;/span&gt;.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 18pt;&quot;&gt;&lt;b&gt;오라클 테이블 생성 예제&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;pre style=&quot;background-color:#2b2b2b;color:#a9b7c6;font-family:'굴림체';font-size:9.0pt;&quot;&gt;&lt;span style=&quot;color:#cc7832;font-weight:bold;&quot;&gt;CREATE TABLE &lt;/span&gt;SAELOBI.EMPLOYEE (&lt;br /&gt;    EMPID &lt;span style=&quot;color:#cc7832;font-weight:bold;&quot;&gt;NUMBER&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;,&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;    &lt;/span&gt;ENAME&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;VARCHAR2(&lt;span style=&quot;color:#6897bb;&quot;&gt;100&lt;/span&gt;)&lt;span style=&quot;color:#cc7832;&quot;&gt;,&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;    &lt;/span&gt;DEPARTMENT_ID &lt;span style=&quot;color:#cc7832;font-weight:bold;&quot;&gt;NUMBER&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;,&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;    &lt;/span&gt;SALARY &lt;span style=&quot;color:#cc7832;font-weight:bold;&quot;&gt;NUMBER&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;,&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;    &lt;/span&gt;JOB_ID &lt;span style=&quot;color:#cc7832;font-weight:bold;&quot;&gt;VARCHAR&lt;/span&gt;(&lt;span style=&quot;color:#6897bb;&quot;&gt;3&lt;/span&gt;)&lt;span style=&quot;color:#cc7832;&quot;&gt;,&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;    &lt;/span&gt;HIREDATE &lt;span style=&quot;color:#cc7832;font-weight:bold;&quot;&gt;DATE&lt;br /&gt;&lt;/span&gt;)&lt;/pre&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;테이블을 만들 때는 컬럼의 특성에 맞게 NUMBER, VARCHAR2같은 데이터 타입을 명시해야합니다. 데이터 타입은 나중에 자세히 다루겠지만 간단히 위에서 나온 것을 설명하자면&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;table class=&quot;txc-table&quot; width=&quot;692&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; border=&quot;0&quot; style=&quot;border:none;border-collapse:collapse;;font-family:&quot; 맑은=&quot;&quot; 고딕&quot;,=&quot;&quot; sans-serif;font-size:16px&quot;=&quot;&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;width: 113px; height: 24px; border-width: 1px; border-style: solid; border-color: rgb(204, 204, 204); background-color: rgb(218, 217, 255);&quot;&gt;&lt;p&gt;&lt;b&gt;&amp;nbsp;NUMBER&amp;nbsp;&lt;/b&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td style=&quot;width: 578px; height: 24px; border-bottom: 1px solid rgb(204, 204, 204); border-right: 1px solid rgb(204, 204, 204); border-top: 1px solid rgb(204, 204, 204);&quot;&gt;&lt;p&gt;&amp;nbsp;가변 숫자를 나타냅니다.&amp;nbsp;&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td style=&quot;width: 113px; height: 23px; border-bottom: 1px solid rgb(204, 204, 204); border-right: 1px solid rgb(204, 204, 204); border-left: 1px solid rgb(204, 204, 204); background-color: rgb(218, 217, 255);&quot;&gt;&lt;p&gt;&lt;b&gt;&amp;nbsp;VARCHAR2&lt;/b&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td style=&quot;width: 578px; height: 23px; border-bottom: 1px solid rgb(204, 204, 204); border-right: 1px solid rgb(204, 204, 204);&quot;&gt;&lt;p&gt;&amp;nbsp;가변 문자열을 나타냅니다. 위 숫자는 byte&amp;nbsp;크기를 나타낸 것입니다.&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td style=&quot;width: 113px; height: 24px; border-bottom: 1px solid rgb(204, 204, 204); border-right: 1px solid rgb(204, 204, 204); border-left: 1px solid rgb(204, 204, 204); background-color: rgb(218, 217, 255);&quot;&gt;&lt;p&gt;&lt;b&gt;&amp;nbsp;DATE&lt;/b&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td style=&quot;width: 578px; height: 24px; border-bottom: 1px solid rgb(204, 204, 204); border-right: 1px solid rgb(204, 204, 204);&quot;&gt;&lt;p&gt;&amp;nbsp;날짜를 나타냅니다.&amp;nbsp;&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 18pt;&quot;&gt;&lt;b&gt;오라클 테이블 생성 규약&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;오라클 DB에는 다음과 같은 테이블명&amp;nbsp;규칙이 있습니다. 아래의 규칙을 참고하셔서 테이블, 컬럼, 인덱스 네이밍을 하시기 바랍니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;ul style=&quot;list-style-type: disc;&quot;&gt;&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;테이블명, 컬럼명의 최대 크기는 30byte&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;예약어를 이용하여 테이블명, 컬럼명을 만들 수 없음 (ex) SYSDATE, ASC, COUNT&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;테이블명 첫글자는 문자&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;한 테이블에 사용 가능한 컬럼은 최대 255개&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;&lt;b&gt;참고자료&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;ol style=&quot;list-style-type: decimal;&quot;&gt;&lt;li&gt;&lt;a href=&quot;https://m.blog.naver.com/PostView.nhn?blogId=seotaji&amp;amp;logNo=80199874344&amp;amp;proxyReferer=https%3A%2F%2Fwww.google.com%2F&quot;&gt;https://m.blog.naver.com/PostView.nhn?blogId=seotaji&amp;amp;logNo=80199874344&amp;amp;proxyReferer=https%3A%2F%2Fwww.google.com%2F&lt;/a&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>Language &amp;amp; Solution/RDBMS</category>
      <category>오라클 db</category>
      <category>오라클 테이블</category>
      <author>새로비</author>
      <guid isPermaLink="true">https://engkimbs.tistory.com/936</guid>
      <comments>https://engkimbs.tistory.com/entry/%EC%98%A4%EB%9D%BC%ED%81%B4-DB-%EC%98%A4%EB%9D%BC%ED%81%B4-%ED%85%8C%EC%9D%B4%EB%B8%94-%EC%83%9D%EC%84%B1%ED%95%98%EA%B8%B0#entry936comment</comments>
      <pubDate>Tue, 15 Oct 2019 10:13:03 +0900</pubDate>
    </item>
    <item>
      <title>[MariaDB] MariaDB 다운로드 및 설치 - windows, ubuntu</title>
      <link>https://engkimbs.tistory.com/entry/MariaDB-MariaDB-%EB%8B%A4%EC%9A%B4%EB%A1%9C%EB%93%9C-%EB%B0%8F-%EC%84%A4%EC%B9%98-windows-ubuntu</link>
      <description>&lt;p&gt;&lt;span style=&quot;font-size: 18pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(102, 0, 255);&quot;&gt;■&lt;/span&gt; MariaDB&amp;nbsp;다운로드&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 12pt; font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;MairaDB 설치 프로그램은 여기 &lt;/span&gt;&lt;a href=&quot;https://mariadb.org/download/&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;&lt;span style=&quot;font-size: 12pt; font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;MariaDB 사이트&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;font-size: 12pt; font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;에서 다운로드 받을 수 있습니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 12pt; font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;다운로드 페이지에 가면 현재 다음과 같은 페이지 창이 나타납니다. 아래 최신 stable 버전을 클릭합니다. (현재 10.4)&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 728px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/990D1F395DA314B02C&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F990D1F395DA314B02C&quot; width=&quot;728&quot; height=&quot;630&quot; filename=&quot;다운로드1.PNG&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;만약 최신 버전이 아닌 그 이전 버전의 MariaDB 서버를 내려받으려면 우측 &quot;View All MariaDB&quot;를 클릭하면 됩니다. 이 버튼을 클릭하면&amp;nbsp;메인 버전의 예전 release 버전을 목록으로 표시해줍니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 18pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(102, 0, 255);&quot;&gt;■&lt;/span&gt; windows&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;windows 운영체제의 비트 버전에 맞게 해당 다운로드 패키지를 클릭합니다. 참고로 winx32는 32비트 운영체제, winx64는 64비트 운영체제입니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;여기서는&amp;nbsp;msi 패키지를 다운로드&amp;nbsp;쉽게 설치를 진행하는 방법을 알아보겠습니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 490px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/99AC113F5DA30F2A35&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F99AC113F5DA30F2A35&quot; width=&quot;490&quot; height=&quot;379&quot; filename=&quot;캡처_2019_10_13_19_45_58_86.png&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;ul style=&quot;list-style-type: disc;&quot;&gt;&lt;li&gt;&lt;p style=&quot;text-align: justify; clear: none; float: none;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;설치 시작 부분입니다. Next 버튼을 클릭합니다.&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 490px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/99AC833F5DA30F2A35&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F99AC833F5DA30F2A35&quot; width=&quot;490&quot; height=&quot;379&quot; filename=&quot;캡처_2019_10_13_19_46_05_4.png&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;ul style=&quot;list-style-type: disc;&quot;&gt;&lt;li&gt;&lt;p style=&quot;text-align: justify; clear: none; float: none;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;설치 시작 부분입니다. 라이센스 동의 체크하시고 Next 버튼을 클릭합니다.&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 490px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/99E0FE3F5DA30F2B1B&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F99E0FE3F5DA30F2B1B&quot; width=&quot;490&quot; height=&quot;379&quot; filename=&quot;캡처_2019_10_13_19_46_09_736.png&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;ul style=&quot;list-style-type: disc;&quot;&gt;&lt;li&gt;&lt;p style=&quot;text-align: justify; clear: none; float: none;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;새로 설치하는 것이기 때문에 Create new database instance 를 체크하고 Next를 누릅니다.&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 490px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/9960D73F5DA30F2B37&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F9960D73F5DA30F2B37&quot; width=&quot;490&quot; height=&quot;379&quot; filename=&quot;캡처_2019_10_13_19_46_22_755.png&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;ul style=&quot;list-style-type: disc;&quot;&gt;&lt;li&gt;&lt;p style=&quot;text-align: justify; clear: none; float: none;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;MariaDB에서 어느 곳에 설치할 것인지 정하는 창입니다. 만약 C&amp;nbsp;드라이브의 용량이 여유롭지 않은 경우 Browse... 버튼을 눌러 D 드라이브나 다른 드라이브에 설치하는 것이 좋습니다.&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 490px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/99B52B3F5DA30F2B2D&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F99B52B3F5DA30F2B2D&quot; width=&quot;490&quot; height=&quot;379&quot; filename=&quot;캡처_2019_10_13_19_47_09_534.png&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;ul style=&quot;list-style-type: disc;&quot;&gt;&lt;li&gt;&lt;p style=&quot;text-align: justify; clear: none; float: none;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;root 패스워드를 입력하는 창입니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&quot;text-align: justify; clear: none; float: none;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;패스워드를 입력한 후 Use UTF8 as defualt server's character set을 클릭합니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 490px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/99C8293F5DA30F2B34&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F99C8293F5DA30F2B34&quot; width=&quot;490&quot; height=&quot;379&quot; filename=&quot;캡처_2019_10_13_19_53_30_70.png&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;ul style=&quot;list-style-type: disc;&quot;&gt;&lt;li&gt;&lt;p style=&quot;text-align: justify; clear: none; float: none;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;MariaDB의 윈도우 서비스 네임 및 TCP Port를 설정하는 창입니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&quot;text-align: justify; clear: none; float: none;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;또한 Buffer pool size를 설정할 수 있는데 개발용일 경우 60~100MB면 적절하지만 윈도우 서버에서 서비스를 할 경우에는 이보다 더 큰 Buffer pool size를 설정해야 합니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&quot;text-align: justify; clear: none; float: none;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;(전체 서버 메모리 50~80%)&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&quot;text-align: justify; clear: none; float: none;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;Page size는 그대로 16KB로 놓고 진행합니다.&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 490px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/9990513F5DA30F2C2E&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F9990513F5DA30F2C2E&quot; width=&quot;490&quot; height=&quot;379&quot; filename=&quot;캡처_2019_10_13_19_54_01_570.png&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;ul style=&quot;list-style-type: disc;&quot;&gt;&lt;li&gt;&lt;p style=&quot;text-align: justify; clear: none; float: none;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;위의 Enable 설정은 MariaDB에서 정보를 주기적으로 mariadb.org 사이트로 업로드 하는 옵션입니다. 만약 이 업로드 옵션을 주기 싫을 경우 그냥 넘어가셔도 무방합니다.&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 490px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/9964293F5DA30F2C2F&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F9964293F5DA30F2C2F&quot; width=&quot;490&quot; height=&quot;379&quot; filename=&quot;캡처_2019_10_13_19_54_05_567.png&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;ul style=&quot;list-style-type: disc;&quot;&gt;&lt;li&gt;&lt;p style=&quot;text-align: justify; clear: none; float: none;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;Install 버튼을 누르면 해당 설치가 진행됩니다.&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 18pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(102, 0, 255);&quot;&gt;■&lt;/span&gt; ubuntu&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 728px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/9955D33E5DA312D606&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F9955D33E5DA312D606&quot; width=&quot;728&quot; height=&quot;480&quot; filename=&quot;캡처_2019_10_13_20_14_04_929.png&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;ul style=&quot;list-style-type: disc;&quot;&gt;&lt;li&gt;&lt;p style=&quot;text-align: justify; clear: none; float: none;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;sudo apt-get install mariadb-server 를 입력합니다.&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li style=&quot;text-align: justify;&quot;&gt;&lt;p style=&quot;text-align: justify; clear: none; float: none;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;Y를 눌러 설치를 진행합니다.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 726px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/99E9C23E5DA312D60B&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F99E9C23E5DA312D60B&quot; width=&quot;726&quot; height=&quot;139&quot; filename=&quot;캡처_2019_10_13_20_18_31_314.png&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 726px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/99A8883E5DA312D633&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F99A8883E5DA312D633&quot; width=&quot;726&quot; height=&quot;332&quot; filename=&quot;캡처_2019_10_13_20_19_13_598.png&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;ul style=&quot;list-style-type: disc;&quot;&gt;&lt;li&gt;&lt;p style=&quot;text-align: justify; clear: none; float: none;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;netstat -tnlp | grep 3306 명령어를&amp;nbsp;입력하여&amp;nbsp;서비스가 제대로 작동하는 지 확인합니다.&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&quot;text-align: justify; clear: none; float: none;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;sudo mysql 명령어를&amp;nbsp;입력하여&amp;nbsp;local에서 접속되는지 확인합니다.&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 542px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/99E2193A5DA3161B06&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F99E2193A5DA3161B06&quot; width=&quot;542&quot; height=&quot;949&quot; filename=&quot;asd.png&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;ul style=&quot;list-style-type: disc;&quot;&gt;&lt;li&gt;&lt;p style=&quot;text-align: justify; clear: none; float: none;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;sudo mysql_secure_installation 을 입력하여 MariaDB 보안 설정을 합니다.&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&quot;text-align: justify; clear: none; float: none;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;위에서는 기존의 root passowrd가 존재하여 Change the root password라 되어 있지만 원래는 Set root password 질의가 뜨게 됩니다. 어떤 것이 든지 Y를 누른 후 새로운 비밀번호를 세팅해야 합니다.&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&quot;text-align: justify; clear: none; float: none;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;Remove anonymous users 를 Y로 클릭합니다. 익명의 사용자는 보통 DB에서 세팅하지 않기 때문입니다.&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&quot;text-align: justify; clear: none; float: none;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;Disallow root login remotely를 n으로 입력합니다. 원격 조종이 가능하는 지 여부인데 n으로 해야지 원격에서 MariaDB에 접속할 수 있습니다.&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&quot;text-align: justify; clear: none; float: none;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;다른 사항들은 Y로 누른뒤 세팅을 마칩니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>Language &amp;amp; Solution/RDBMS</category>
      <category>mariaDB</category>
      <category>mariadb 다운로드</category>
      <category>mariadb 설치</category>
      <author>새로비</author>
      <guid isPermaLink="true">https://engkimbs.tistory.com/932</guid>
      <comments>https://engkimbs.tistory.com/entry/MariaDB-MariaDB-%EB%8B%A4%EC%9A%B4%EB%A1%9C%EB%93%9C-%EB%B0%8F-%EC%84%A4%EC%B9%98-windows-ubuntu#entry932comment</comments>
      <pubDate>Sun, 13 Oct 2019 19:55:15 +0900</pubDate>
    </item>
    <item>
      <title>[MariaDB] MariaDB란 무엇일까? MariaDB 소개 (MariaDB Overview)</title>
      <link>https://engkimbs.tistory.com/entry/MariaDB-MariaDB%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%BC%EA%B9%8C-MariaDB-%EC%86%8C%EA%B0%9C-MariaDB-Overview</link>
      <description>&lt;p&gt;&lt;span style=&quot;background-color: rgb(255, 255, 255); color: rgb(102, 0, 255);&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 18pt;&quot;&gt;■ &lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 0); font-size: 18pt;&quot;&gt;MariaDB&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 0); font-size: 18pt;&quot;&gt;란?&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;background-color: rgb(255, 255, 255); color: rgb(102, 0, 255);&quot;&gt;&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;MariaDB는 MariaDB사가 제작한 오픈소스 RDMBS 소프트웨어입니다. MariaDB가 무엇인지 알기위해서는 MySQL이란 유명 RDBMS를 알아야합니다. 왜냐하면 MySQL에서 떨어져나온&amp;nbsp;RDBMS가 MariaDB이기&amp;nbsp;때문이죠.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;MySQL은 AB사에서 제작했던 소프트웨어 입니다. 썬 마이크로시스템스에서 당시 10억 달러, 우리나라 돈 1조 가량에 인수했다가 양복기업의 대표주자 오라클이 썬 마이크로 시스템스를 2010년에 72억 달러&lt;/span&gt;&lt;span style=&quot;color: rgb(213, 213, 213); font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;strike&gt;&lt;span style=&quot;color: rgb(166, 166, 166); font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;8조 ㅎㄷㄷ&lt;/span&gt;&lt;/strike&gt;&lt;span style=&quot;color: rgb(213, 213, 213); font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;에 인수해가면서 오라클 것이 되었죠. 오라클은 MySQL을 인수하면서 상업적으로 MySQL을 이용할 시 사용료를 내도록 정책을 바꾸어 버렸습니다ㅠㅠ&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;그러나 오라클의 정책에 반발한 AB사에서 핵심 창업자중 한 명이었던 몬티 와이드니어스가 2009년 동료들과 나와 MySQL코드 기반으로한 오픈소스 RDBMS를 개발한 것이 지금의 MariaDB입니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 504px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/997B663D5DA453DA26&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F997B663D5DA453DA26&quot; width=&quot;504&quot; height=&quot;608&quot; filename=&quot;Monty_Widenius.jpg&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;b&gt;&amp;lt;이 형님이십니다ㅎㅎ&lt;/b&gt;&amp;gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;상용으로 사용하기 위해서 돈을 내야하는 MySQL과 다르게 (교육용, 개발용은 상관 없음) MariaDB는 무료로 사용할 수 있습니다. 그래서인지 오픈소스와 친숙한 리눅스(linux) 진영에서는 MySQL 대신에 MariaDB를 표준으로 채택하고 있습니다. 오픈 소스 진영에서는 오라클같은 패쇄적인 기업을 싫어하기도 하구요.&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: rgb(102, 0, 255);&quot;&gt;&lt;span style=&quot;font-size: 18pt;&quot;&gt;■&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt;&lt;b&gt; Maria&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span style=&quot;font-size: 18pt; color: rgb(0, 0, 0);&quot;&gt;DB 특징&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;; font-size: 14pt;&quot;&gt;&lt;span style=&quot;color: rgb(31, 218, 17);&quot;&gt;| &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;; font-size: 14pt;&quot;&gt;오픈소스&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;MySQL도 상업적인 용도를 제외하고는 교육, 개발용인 커뮤니티 버전은 무료로 제공하고 있습니다. 하지만 커뮤니티 버전은 실제 서비스에 사용하기에는 성능이 따라주질 않죠. 하지만 MariaDB는 상업용을 사용해야 더 좋은 성능을 내는 그런 개념없이 무료로 모든 기능을 사용할 수 있습니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;; color: rgb(31, 218, 17);&quot;&gt;| &lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;MySQL 친화적인 &lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;RDBMS&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;MySQL에서 Fork된 RDBMS인만큼 MySQL과 친화적이기 때문에 마이그레이션할 때도 손쉽게 진행할 수 있습니다. 실제로 MySQL에서 사용하고 있는 SQL문이나 명령문들을 그대로 MariaDB에서 채택하고 있는 경우가 많습니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;; color: rgb(31, 218, 17);&quot;&gt;| &lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;MySQL 코드 베이스지만 MySQL과는 독립적인 RDBMS&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;InnoDB와 같이 MySQL RDBMS에서 어떤 플러그인 형태로 끼웠다가 빼서 쓸 수 있는 것이 아닌 그 자체로 독립적인 RDBMS라는 것을 의미합니다. 또한 RDBMS에서 Fork 되었지만 이제 MySQL에서 제공하지 않는 독자적인 기능 및 구문을 제공하고 있다는 것이기도 합니다.&lt;/span&gt;&lt;/p&gt;</description>
      <category>Language &amp;amp; Solution/RDBMS</category>
      <category>mariaDB</category>
      <author>새로비</author>
      <guid isPermaLink="true">https://engkimbs.tistory.com/931</guid>
      <comments>https://engkimbs.tistory.com/entry/MariaDB-MariaDB%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%BC%EA%B9%8C-MariaDB-%EC%86%8C%EA%B0%9C-MariaDB-Overview#entry931comment</comments>
      <pubDate>Sun, 13 Oct 2019 19:30:49 +0900</pubDate>
    </item>
    <item>
      <title>[책 리뷰] - 우리 돈은 가짜일까요? FAKE 책 리뷰</title>
      <link>https://engkimbs.tistory.com/entry/%EC%B1%85-%EB%A6%AC%EB%B7%B0-%EC%9A%B0%EB%A6%AC-%EB%8F%88%EC%9D%80-%EA%B0%80%EC%A7%9C%EC%9D%BC%EA%B9%8C%EC%9A%94-FAKE-%EC%B1%85-%EB%A6%AC%EB%B7%B0</link>
      <description>&lt;p style=&quot;MARGIN: 0cm 0cm 8pt&quot;&gt;&lt;font size=&quot;2&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 18pt;&quot;&gt;&lt;span style=&quot;color: rgb(102, 0, 255);&quot;&gt;■&lt;/span&gt; FAKE – &lt;/span&gt;&lt;span style=&quot;font-size: 18pt;&quot;&gt;가짜뉴스와 정보에서 진짜 돈과 자산을 지켜라&lt;/span&gt;&lt;/b&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p style=&quot;MARGIN: 0cm 0cm 8pt&quot;&gt;&lt;span&gt;&lt;font size=&quot;2&quot;&gt;&amp;nbsp;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0cm 0cm 8pt; text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 547px; text-align: center; width: 547px; height: 400px;; height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/99D4224C5DA29DD31A&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F99D4224C5DA29DD31A&quot; width=&quot;547&quot; height=&quot;400&quot; filename=&quot;피노키오 페이크.jpg&quot; filemime=&quot;image/jpeg&quot; style=&quot;text-align: center; width: 547px; height: 400px;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;MARGIN: 0cm 0cm 8pt&quot;&gt;&lt;span&gt;&lt;font size=&quot;2&quot;&gt;&lt;br /&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-top: 0cm; margin-right: 0cm; margin-bottom: 8pt;&quot;&gt;&lt;span&gt;&lt;font size=&quot;2&quot;&gt;&lt;br /&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;MARGIN: 0cm 0cm 8pt&quot;&gt;&lt;font size=&quot;2&quot;&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;자본주의계의 교주&lt;/span&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;로버트 기요사키님의 최신작 &lt;/span&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;FAKE&lt;/span&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;를 얼마 전 읽어 보았습니다&lt;/span&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;. &lt;/span&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;자본주의가 무너지는 핵심 원인과 이런 위기를 어떻게 극복해 나가야 하는지 두 축을 중심으로 전개가 진행되고 있는데요&lt;/span&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;. &lt;/span&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;기요사키님이 말하고자 한 핵심이 무엇이었는지 말씀드리도록 하겠습니다&lt;/span&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;. &lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;
&lt;/span&gt;&lt;p style=&quot;MARGIN: 0cm 0cm 8pt&quot;&gt;&lt;span&gt;&lt;font size=&quot;2&quot;&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;MARGIN: 0cm 0cm 8pt&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size:18pt;&quot;&gt;&lt;span style=&quot;color: rgb(102, 0, 255);&quot;&gt;■&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;font size=&quot;2&quot;&gt;&lt;span style=&quot;font-size: 18pt;&quot;&gt;자본주의 시스템의 붕괴 원인,&lt;/span&gt;&lt;span style=&quot;font-size: 18pt;&quot;&gt;&amp;nbsp;2&lt;/span&gt;&lt;span style=&quot;font-size: 18pt;&quot;&gt;가지&lt;/span&gt;&lt;/font&gt;&lt;/b&gt;&lt;/p&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;
&lt;/span&gt;&lt;p style=&quot;margin-top: 0cm; margin-right: 0cm; margin-bottom: 8pt;&quot;&gt;&lt;font size=&quot;2&quot;&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p style=&quot;MARGIN: 0cm 0cm 8pt&quot;&gt;&lt;font size=&quot;2&quot;&gt;&lt;b&gt;&lt;u&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;첫 번째는 자본주의의 중심축인 미국의 화폐 조달은 신용&lt;/span&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;, &lt;/span&gt;&lt;/u&gt;&lt;/b&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;&lt;b&gt;&lt;u&gt;즉 부채를 통해 유지되어 온 취약한 경제 시스템&lt;/u&gt;&lt;/b&gt;이라는 점입니다&lt;/span&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;. &lt;/span&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;신용이라는 것은 &lt;/span&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;“&lt;/span&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;미국은 기축통화를 발행하는 핵심국가&lt;/span&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;”&lt;/span&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;라는 전제를 사람들이 지속적으로 &lt;/span&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;“&lt;/span&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;그렇다&lt;/span&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;”&lt;/span&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;고 믿고 있을 때 유지 된다는 것인데요&lt;/span&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;이러한 시스템이 &lt;/span&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;1971&lt;/span&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;년 닉슨 대통령의 금태환 포기 선헌을 포기한 이래로 부채를 통해 계속해서 경제를 팽창시켰기 때문에 언제 무너질 지 모르는 상황에 도달했다는 점입니다&lt;/span&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;. &lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p style=&quot;MARGIN: 0cm 0cm 8pt&quot;&gt;&lt;font size=&quot;2&quot;&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;
&lt;/span&gt;&lt;p style=&quot;MARGIN: 0cm 0cm 8pt&quot;&gt;&lt;font size=&quot;2&quot;&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;&lt;b&gt;&lt;u&gt;두 번째는 부채 문제입니다&lt;/u&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;&lt;b&gt;&lt;u&gt;.&lt;/u&gt;&lt;/b&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;각 연방정부가 운영하고 있는 연금자폭이 커져가면서 연금 시스템은 지급 불능에 빠지게 될 것이란 전망입니다&lt;/span&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;. &lt;/span&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;이에 따라 은퇴 이후에 연금에 의존해 살아가는 노년층의 빈곤 문제가 더욱 심각해질 것입니다&lt;/span&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;. &lt;/span&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;이와 더불어&lt;/span&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;젊은 세대가 과도한 학자금 대출 부담을 지고 있어 대학을 졸업하고도 장기간 대출을 상황 해야하는 문제도 점점 커지고 있다고 합니다&lt;/span&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;.&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p style=&quot;MARGIN: 0cm 0cm 8pt&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;FLOAT: none; TEXT-ALIGN: center; CLEAR: none; MARGIN: 0cm 0cm 8pt&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 728px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/993F62475DA28FD006&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F993F62475DA28FD006&quot; width=&quot;728&quot; height=&quot;390&quot; filename=&quot;new worth.jpg&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;MARGIN: 0cm 0cm 8pt&quot;&gt;&lt;/p&gt;
&lt;p style=&quot;MARGIN: 0cm 0cm 8pt&quot;&gt;&lt;font size=&quot;2&quot;&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p style=&quot;MARGIN: 0cm 0cm 8pt&quot;&gt;&lt;font size=&quot;2&quot;&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;이러한 문제는 비단 미국 경제에만 국한된 것이 아니라&lt;/span&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;우리가 마주한 현실이 아닐까 하는 생각이 듭니다&lt;/span&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;. &lt;/span&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;기요사키는 위기를 다음과 같은 방법으로 극복하라고 강조하고 있습니다&lt;/span&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;. &lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p style=&quot;MARGIN: 0cm 0cm 8pt&quot;&gt;&lt;font size=&quot;2&quot;&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;
&lt;/span&gt;&lt;ol style=&quot;list-style-type: decimal;&quot;&gt;&lt;li&gt;&lt;p style=&quot;margin-top: 0cm; margin-right: 0cm; margin-bottom: 8pt;&quot;&gt;&lt;font size=&quot;2&quot;&gt;&lt;span style=&quot;font-size: 14pt; font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;“&lt;/span&gt;&lt;span style=&quot;font-size: 14pt; font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;화폐 가치 폭락을 대비한 신의 돈&lt;/span&gt;&lt;span style=&quot;font-size: 14pt; font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;font-size: 14pt; font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;금&lt;/span&gt;&lt;span style=&quot;font-size: 14pt; font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;font-size: 14pt; font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;은&lt;/span&gt;&lt;span style=&quot;font-size: 14pt; font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;font-size: 14pt; font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;을 소유하자&lt;/span&gt;&lt;span style=&quot;font-size: 14pt; font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;!” &lt;/span&gt;&lt;span style=&quot;font-size: 14pt; font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;신의 돈이란 인간이 원한다고 하여 마음대로 찍어낼 수 있는 화폐가 아닌 일정량만 채굴 할 수 있는 금과 은을 의미합니다&lt;/span&gt;&lt;span style=&quot;font-size: 14pt; font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;.&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&quot;margin-top: 0cm; margin-right: 0cm; margin-bottom: 8pt;&quot;&gt;&lt;font size=&quot;2&quot;&gt;&lt;span style=&quot;font-size: 14pt; font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;무한 수익을 창출할 수 있는 사업 시스템을 구축하자는 것 입니다&lt;/span&gt;&lt;span style=&quot;font-size: 14pt; font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;. &lt;/span&gt;&lt;span style=&quot;font-size: 14pt; font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;기요사키 아저씨가 강조하는 무한 수익률인 &lt;/span&gt;&lt;span style=&quot;font-size: 14pt; font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/ROI&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;ROI(Return on Information)&lt;/a&gt;&lt;/span&gt;&lt;span style=&quot;font-size: 14pt; font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;은 우리가 흔히 알고 있는 &lt;/span&gt;&lt;span style=&quot;font-size: 14pt; font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;ROI(Return on Investment)&lt;/span&gt;&lt;span style=&quot;font-size: 14pt; font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;와는 다른 개념인데요&lt;/span&gt;&lt;span style=&quot;font-size: 14pt; font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;font-size: 14pt; font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;이는 레버리지를 적극적으로 활용하여 내 주머니에 돈을 넣어주는 투자 혹은 사업 시스템으로부터 얻은 결과를 의미합니다&lt;/span&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt; &lt;/span&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;span style=&quot;font-size: 14pt; font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;
&lt;/span&gt;&lt;p style=&quot;MARGIN: 0cm 0cm 8pt&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;MARGIN: 0cm 0cm 8pt&quot;&gt;&lt;b style=&quot;font-size: small;&quot;&gt;&lt;span style=&quot;font-size: 18pt;&quot;&gt;&lt;span style=&quot;color: rgb(102, 0, 255);&quot;&gt;■&lt;span style=&quot;font-size: 18pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;b style=&quot;&quot;&gt;&lt;span style=&quot;font-size: 18pt;&quot;&gt;금 &amp;amp; 은 시세 정보&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0cm 0cm 8pt; text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 728px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/9939F4365DA29E360A&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F9939F4365DA29E360A&quot; width=&quot;728&quot; height=&quot;331&quot; filename=&quot;금시세.jpg&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0cm 0cm 8pt; text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 728px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/99FEB4365DA29E3711&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F99FEB4365DA29E3711&quot; width=&quot;728&quot; height=&quot;346&quot; filename=&quot;은 동향.jpg&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-top: 0cm; margin-right: 0cm; margin-bottom: 8pt; text-align: center; clear: none; float: none;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size:18pt;&quot;&gt;&lt;span style=&quot;color: rgb(102, 0, 255); font-size: 18pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;margin-top: 0cm; margin-right: 0cm; margin-bottom: 8pt; text-align: justify; clear: none; float: none;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size:18pt;&quot;&gt;&lt;span style=&quot;color: rgb(102, 0, 255); font-size: 18pt;&quot;&gt;■&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-size: 18pt;&quot;&gt;마치며&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;margin-top: 0cm; margin-right: 0cm; margin-bottom: 8pt; text-align: center; clear: none; float: none;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;
&lt;/span&gt;&lt;p style=&quot;MARGIN: 0cm 0cm 8pt&quot;&gt;&lt;font size=&quot;2&quot;&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;지금까지 &lt;/span&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;FAKE&lt;/span&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;에 대한 핵심 내용을 말씀드렸습니다&lt;/span&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;. &lt;/span&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;여러분은 앞으로 다가올 위기를 어떻게 준비하고 계신가요&lt;/span&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;? &lt;/span&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;위기가 정말로 올지&lt;/span&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;온다면 언제 올지 예측하는 건 신의 영역이라고 합니다&lt;/span&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;. &lt;/span&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;다만&lt;/span&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;최악의 상황을 생각하고&lt;/span&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;대비하는 것만이 최선일 뿐&lt;/span&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;! &lt;/span&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;현명하게 대응해 나갈 수 있는 꿀팁을 얻으셨기를 바랍니다&lt;/span&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;. &lt;/span&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;그럼&lt;/span&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;이것으로 &lt;/span&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;FAKE &lt;/span&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;후기를 마치도록 하겠습니다&lt;/span&gt;&lt;span&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;. &lt;/span&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>부동산/투자 공부</category>
      <author>새로비</author>
      <guid isPermaLink="true">https://engkimbs.tistory.com/930</guid>
      <comments>https://engkimbs.tistory.com/entry/%EC%B1%85-%EB%A6%AC%EB%B7%B0-%EC%9A%B0%EB%A6%AC-%EB%8F%88%EC%9D%80-%EA%B0%80%EC%A7%9C%EC%9D%BC%EA%B9%8C%EC%9A%94-FAKE-%EC%B1%85-%EB%A6%AC%EB%B7%B0#entry930comment</comments>
      <pubDate>Sun, 13 Oct 2019 12:42:26 +0900</pubDate>
    </item>
    <item>
      <title>[HTML&amp;amp;CSS] position 속성 정리하기!</title>
      <link>https://engkimbs.tistory.com/entry/HTMLCSS-position-%EC%86%8D%EC%84%B1-%EC%A0%95%EB%A6%AC%ED%95%98%EA%B8%B0</link>
      <description>&lt;p&gt;&lt;span style=&quot;font-size: 18pt;&quot;&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;b&gt;&lt;b&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;*아래를 누르시면 HTML, CSS 코드 실행환경을 만드실 수 있습니다.&lt;/span&gt;&lt;/b&gt;&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;b&gt;&lt;a href=&quot;https://engkimbs.tistory.com/802&quot; target=&quot;_blank&quot;&gt;[Language &amp;amp; Solution/Node.js] - npm과 lite-server로 HTML, CSS 실습관경 만들기&lt;/a&gt;&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;/p&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 18pt;&quot;&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 18pt;&quot;&gt;&lt;b&gt;position 속성&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;position 속성은 웹 문서 안 요소들을 어떻게 배치할 지를 정하는 속성입니다. position 속성을 이용하면 텍스트나 이미지를 원하는 위치로 배치할 수 있고 어떤 방식으로 놓을 지를 결정할 수 있죠.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;티스토리를 하다보면 css를 수정해야하는 일이 잦습니다. 만약 position 속성에 대한 이해없이&amp;nbsp;css를 수정한다면 예상치도 못하게 블로그&amp;nbsp;레이아웃이 이상해지거나 망가질 수 있습니다( Wordpress나 서비스 UI, 프론트엔드쪽 만질 때도 마찬가지!). 딴 건 몰라도 화면단과 관련된 일을 한다면 position 속성에 대한 것은 제대로 집고 넘어가야한다고 생각합니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 18pt;&quot;&gt;&lt;b&gt;position 사용법&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;position 속성 사용법은 다음과 같습니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;b style=&quot;font-family: Arial; font-size: 14pt; text-align: center;&quot;&gt;&lt;span style=&quot;background-color: rgb(140, 252, 203);&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;b style=&quot;font-family: Arial; font-size: 14pt; text-align: center;&quot;&gt;&lt;span style=&quot;background-color: rgb(140, 252, 203);&quot;&gt;&lt;/span&gt;&lt;span style=&quot;background-color: rgb(140, 252, 203);&quot;&gt;&lt;/span&gt;&lt;i&gt;&lt;span style=&quot;background-color: rgb(255, 255, 255); color: rgb(0, 0, 0);&quot;&gt;position: static | relative | absolute | fixed | sticky&lt;/span&gt;&lt;span style=&quot;background-color: rgb(255, 255, 255); color: rgb(0, 0, 0);&quot;&gt;&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;table class=&quot;txc-table&quot; width=&quot;692&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; border=&quot;0&quot; style=&quot;border:none;border-collapse:collapse;;font-family:&quot; 맑은=&quot;&quot; 고딕&quot;,=&quot;&quot; sans-serif;font-size:16px&quot;=&quot;&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;width: 102px; height: 4px; border-width: 1px; border-style: solid; border-color: rgb(204, 204, 204); background-color: rgb(217, 229, 255);&quot;&gt;&lt;p&gt;&lt;b&gt;&amp;nbsp;static&lt;/b&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td style=&quot;width: 589px; height: 4px; border-bottom: 1px solid rgb(204, 204, 204); border-right: 1px solid rgb(204, 204, 204); border-top: 1px solid rgb(204, 204, 204);&quot;&gt;&lt;p&gt;&amp;nbsp;요소를 문서 흐름에 맞추어 배치.&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td style=&quot;width: 102px; height: 24px; border-bottom: 1px solid rgb(204, 204, 204); border-right: 1px solid rgb(204, 204, 204); border-left: 1px solid rgb(204, 204, 204); background-color: rgb(217, 229, 255);&quot;&gt;&lt;p&gt;&lt;b&gt;&amp;nbsp;relative&lt;/b&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td style=&quot;width: 589px; height: 24px; border-bottom: 1px solid rgb(204, 204, 204); border-right: 1px solid rgb(204, 204, 204);&quot;&gt;&lt;p&gt;&amp;nbsp;이전 요소(주로 부모 요소)에 자연스럽게 연결하여 위치를 지정.&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td style=&quot;width: 102px; height: 24px; border-bottom: 1px solid rgb(204, 204, 204); border-right: 1px solid rgb(204, 204, 204); border-left: 1px solid rgb(204, 204, 204); background-color: rgb(217, 229, 255);&quot;&gt;&lt;p&gt;&lt;b&gt;&amp;nbsp;absolute&lt;/b&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td style=&quot;width: 589px; height: 24px; border-bottom: 1px solid rgb(204, 204, 204); border-right: 1px solid rgb(204, 204, 204);&quot;&gt;&lt;p&gt;&amp;nbsp;원하는 위치를&amp;nbsp;지정해 배치.&amp;nbsp;&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td style=&quot;width: 102px; height: 24px; border-bottom: 1px solid rgb(204, 204, 204); border-right: 1px solid rgb(204, 204, 204); border-left: 1px solid rgb(204, 204, 204); background-color: rgb(217, 229, 255);&quot;&gt;&lt;p&gt;&lt;b&gt;&amp;nbsp;fixed&lt;/b&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td style=&quot;width: 589px; height: 24px; border-bottom: 1px solid rgb(204, 204, 204); border-right: 1px solid rgb(204, 204, 204);&quot;&gt;&lt;p&gt;&amp;nbsp;지정한 위치에 고정하여 배치.&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td style=&quot;width: 102px; height: 24px; border-bottom: 1px solid rgb(204, 204, 204); border-right: 1px solid rgb(204, 204, 204); border-left: 1px solid rgb(204, 204, 204); background-color: rgb(217, 229, 255);&quot;&gt;&lt;p&gt;&lt;b&gt;&amp;nbsp;sticky&lt;/b&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td style=&quot;width: 589px; height: 24px; border-bottom: 1px solid rgb(204, 204, 204); border-right: 1px solid rgb(204, 204, 204);&quot;&gt;&lt;p&gt;&amp;nbsp;위치에 따라서 동작방식이 달라짐. 요소가 임계점(scroll 박스 기준) 이전에&amp;nbsp; &amp;nbsp;는&amp;nbsp;relative와 같이 동작. 그 이후에는 fixed와 같이 동작.&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;static을 제외한 나머지 속성값들은 top, left, bottom, right 와 같이 어느 위치에 요소를 위치시킬 건지 지정할 수 있습니다. 각 값들은 그 방향에서 얼마만큼 떨어져 위치시킬 것인 지를 나타냅니다. 예로들어 top: 15px 면 기준위치 위에서 15px 떨어져 있는 곳에 위치시키라는 뜻입니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 18pt;&quot;&gt;static&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;static은 position 속성의 기본값입니다. 요소를 나열한 순서대로 배치하며 top, right, bottom, left와 같은 속성을 사용할 수 없습니다. (float 속성은 가능!)&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 18pt;&quot;&gt;&lt;b&gt;relative&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;static이었을 때 배치되는 위치를 기준으로 상대적 위치를 지정할 수 있는 속성값입니다. 예로들어, static일 때 기준으로 왼쪽으로부터 50px, 위쪽으로부터 30px에 위치해 있다면 style=&quot;top:5px;&amp;nbsp;left: 5px;&quot; 을 적용하면 왼쪽으로부터 55px, 위쪽으로부터 35px 이동하는 형식입니다. 상대적 위치는 top, right, bottom, left 속성을 써서 나타낼 수 있습니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 18pt;&quot;&gt;&lt;b&gt;static, relative 예제&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;pre style=&quot;background-color:#2b2b2b;color:#a9b7c6;font-family:'Source Code Pro';font-size:9.8pt;&quot;&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;!DOCTYPE &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;html&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;html &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;lang&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;=&quot;en&quot;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;head&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;    &amp;lt;meta &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;charset&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;=&quot;UTF-8&quot;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;    &amp;lt;title&amp;gt;&amp;lt;/title&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;    &amp;lt;style&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;div &lt;/span&gt;{&lt;br /&gt;            &lt;span style=&quot;color:#bababa;&quot;&gt;margin &lt;/span&gt;: &lt;span style=&quot;color:#6897bb;&quot;&gt;10&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;px&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;display&lt;/span&gt;: &lt;span style=&quot;color:#a5c261;&quot;&gt;inline-block&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;width&lt;/span&gt;: &lt;span style=&quot;color:#6897bb;&quot;&gt;300&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;px&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;height&lt;/span&gt;: &lt;span style=&quot;color:#6897bb;&quot;&gt;100&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;px&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;border&lt;/span&gt;: &lt;span style=&quot;color:#6897bb;&quot;&gt;3&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;px solid black&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;        &lt;/span&gt;}&lt;br /&gt;        .&lt;span style=&quot;color:#e8bf6a;&quot;&gt;box1 &lt;/span&gt;{&lt;br /&gt;            &lt;span style=&quot;color:#bababa;&quot;&gt;background&lt;/span&gt;: &lt;span style=&quot;color:#a5c261;&quot;&gt;firebrick&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;        &lt;/span&gt;}&lt;br /&gt;        .&lt;span style=&quot;color:#e8bf6a;&quot;&gt;box2 &lt;/span&gt;{&lt;br /&gt;            &lt;span style=&quot;color:#bababa;&quot;&gt;background&lt;/span&gt;: &lt;span style=&quot;color:#a5c261;&quot;&gt;cornflowerblue&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;        &lt;/span&gt;}&lt;br /&gt;    &lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/style&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/head&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;body&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;    &amp;lt;div &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;=&quot;box1&quot;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;    &amp;lt;/div&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;    &amp;lt;div &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;=&quot;box2&quot;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;    &amp;lt;/div&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/body&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 604px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/998B25415DAD976321&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F998B25415DAD976321&quot; width=&quot;604&quot; height=&quot;128&quot; filename=&quot;1.PNG&quot; filemime=&quot;image/jpeg&quot; style=&quot;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;ul style=&quot;list-style-type: disc;&quot;&gt;&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;위에 명시적으로 position 속성을 써서 나타내지는 않았지만 position: static 속성이라 보시면 됩니다. (기본값)&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;static 속성은 브라우저에서 자연스럽게 해당 요소들의 위치를 결정하게 됩니다. 보통 display 속성에 따라 배치가 결정됩니다.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;위의 요소들은 display: inline-block 에 따라 왼쪽에서 오른쪽으로 요소의 위치가 결정된 걸 볼 수 있습니다.&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;pre style=&quot;background-color:#2b2b2b;color:#a9b7c6;font-family:'Source Code Pro';font-size:9.8pt;&quot;&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;style&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;div &lt;/span&gt;{&lt;br /&gt;        &lt;span style=&quot;color:#bababa;&quot;&gt;margin &lt;/span&gt;: &lt;span style=&quot;color:#6897bb;&quot;&gt;10&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;px&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;        &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;display&lt;/span&gt;: &lt;span style=&quot;color:#a5c261;&quot;&gt;inline-block&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;        &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;width&lt;/span&gt;: &lt;span style=&quot;color:#6897bb;&quot;&gt;300&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;px&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;        &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;height&lt;/span&gt;: &lt;span style=&quot;color:#6897bb;&quot;&gt;100&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;px&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;        &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;border&lt;/span&gt;: &lt;span style=&quot;color:#6897bb;&quot;&gt;3&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;px solid black&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;    &lt;/span&gt;}&lt;br /&gt;    .&lt;span style=&quot;color:#e8bf6a;&quot;&gt;box1 &lt;/span&gt;{&lt;br /&gt;        &lt;span style=&quot;color:#bababa;&quot;&gt;background&lt;/span&gt;: &lt;span style=&quot;color:#a5c261;&quot;&gt;firebrick&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;    &lt;/span&gt;}&lt;br /&gt;    .&lt;span style=&quot;color:#e8bf6a;&quot;&gt;box2 &lt;/span&gt;{&lt;br /&gt;        &lt;span style=&quot;color:#bababa;&quot;&gt;background&lt;/span&gt;: &lt;span style=&quot;color:#a5c261;&quot;&gt;cornflowerblue&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;        &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;position&lt;/span&gt;: &lt;span style=&quot;color:#a5c261;&quot;&gt;relative&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;        &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;top&lt;/span&gt;: &lt;span style=&quot;color:#6897bb;&quot;&gt;30&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;px&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;        &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;right&lt;/span&gt;: &lt;span style=&quot;color:#6897bb;&quot;&gt;150&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;px&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;    &lt;/span&gt;}&lt;br /&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/style&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 485px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/99554D395DAD98501D&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F99554D395DAD98501D&quot; width=&quot;485&quot; height=&quot;179&quot; filename=&quot;2.PNG&quot; filemime=&quot;image/jpeg&quot; style=&quot;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;ul style=&quot;list-style-type: disc;&quot;&gt;&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;위 static에서 쓴 코드에서 위 &amp;lt;style&amp;gt; 태그를 교체하면 위와 같이 겹친 요소가 나타나는 것을 볼 수 있습니다.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;static과 다르게 relative는 static 이었을 때 어느 위치였는지를&amp;nbsp;기준으로 상대적인 요소의 위치를 결정합니다.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;위 그림에서는 파란색 요소가 원래 static 위치를&amp;nbsp;기준으로&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;&amp;nbsp;위에서 30px, &lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;오른쪽에서 150px 떨어진 것을 알 수 있습니다.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 18pt;&quot;&gt;&lt;b&gt;absolute&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;absolute 속성값은 브라우저가 문서의 흐름과 상관없이 (요소를 수직으로 쭉 놓을지, 수평으로 쭉 놓을지 등을 결정하는 것) left, right, top, bottom 속성값을 이용하여 요소를 위치시키는 속성값입니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;이때 기준이 되는 위치는 가장 가까운 부모 요소 혹은 조상 요소 중 position 속성이 relative인 요소입니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 18pt;&quot;&gt;&lt;b&gt;absolute 예제&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;pre style=&quot;background-color:#2b2b2b;color:#a9b7c6;font-family:'Source Code Pro';font-size:9.8pt;&quot;&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;!DOCTYPE &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;html&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;html &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;lang&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;=&quot;en&quot;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;head&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;    &amp;lt;meta &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;charset&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;=&quot;UTF-8&quot;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;    &amp;lt;title&amp;gt;&amp;lt;/title&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;    &amp;lt;style&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;div &lt;/span&gt;{&lt;br /&gt;            &lt;span style=&quot;color:#bababa;&quot;&gt;display&lt;/span&gt;: &lt;span style=&quot;color:#a5c261;&quot;&gt;inline-block&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;border&lt;/span&gt;: &lt;span style=&quot;color:#6897bb;&quot;&gt;3&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;px solid black&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;        &lt;/span&gt;}&lt;br /&gt;        .&lt;span style=&quot;color:#e8bf6a;&quot;&gt;container &lt;/span&gt;{&lt;br /&gt;            &lt;span style=&quot;color:#bababa;&quot;&gt;margin&lt;/span&gt;: &lt;span style=&quot;color:#6897bb;&quot;&gt;40&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;px&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;width&lt;/span&gt;: &lt;span style=&quot;color:#6897bb;&quot;&gt;800&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;px&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;height&lt;/span&gt;: &lt;span style=&quot;color:#6897bb;&quot;&gt;1000&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;px&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;        &lt;/span&gt;}&lt;br /&gt;        .&lt;span style=&quot;color:#e8bf6a;&quot;&gt;box1 &lt;/span&gt;{&lt;br /&gt;            &lt;span style=&quot;color:#bababa;&quot;&gt;width&lt;/span&gt;: &lt;span style=&quot;color:#6897bb;&quot;&gt;200&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;px&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;height&lt;/span&gt;: &lt;span style=&quot;color:#6897bb;&quot;&gt;100&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;px&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;background&lt;/span&gt;: &lt;span style=&quot;color:#a5c261;&quot;&gt;red&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;position&lt;/span&gt;: &lt;span style=&quot;color:#a5c261;&quot;&gt;relative&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;top&lt;/span&gt;: &lt;span style=&quot;color:#6897bb;&quot;&gt;100&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;px&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;left&lt;/span&gt;: &lt;span style=&quot;color:#6897bb;&quot;&gt;100&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;px&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;        &lt;/span&gt;}&lt;br /&gt;        .&lt;span style=&quot;color:#e8bf6a;&quot;&gt;box2 &lt;/span&gt;{&lt;br /&gt;            &lt;span style=&quot;color:#bababa;&quot;&gt;width&lt;/span&gt;: &lt;span style=&quot;color:#6897bb;&quot;&gt;200&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;px&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;height&lt;/span&gt;: &lt;span style=&quot;color:#6897bb;&quot;&gt;100&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;px&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;background&lt;/span&gt;: &lt;span style=&quot;color:#a5c261;&quot;&gt;blue&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;position&lt;/span&gt;: &lt;span style=&quot;color:#a5c261;&quot;&gt;absolute&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;top&lt;/span&gt;: &lt;span style=&quot;color:#6897bb;&quot;&gt;100&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;px&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;left&lt;/span&gt;: &lt;span style=&quot;color:#6897bb;&quot;&gt;100&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;px&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;        &lt;/span&gt;}&lt;br /&gt;    &lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/style&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/head&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;body&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;    &amp;lt;div &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;=&quot;container&quot;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &amp;lt;div &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;=&quot;box1&quot;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &amp;lt;/div&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &amp;lt;div &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;=&quot;box2&quot;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &amp;lt;/div&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;    &amp;lt;/div&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/body&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 728px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/99DA3F3C5DAD99B217&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F99DA3F3C5DAD99B217&quot; width=&quot;728&quot; height=&quot;883&quot; filename=&quot;3.PNG&quot; filemime=&quot;image/jpeg&quot; style=&quot;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;ul style=&quot;list-style-type: disc;&quot;&gt;&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;위에서 볼 수 있듯 빨간색 요소 box1는 position: relative 이기 때문에 원래 static 이었을 때의 자리로부터 위로부터&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;&amp;nbsp;100px, 왼쪽으로부터 100px 떨어져 있는 모습을 볼 수 있습니다.&lt;/span&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;반면에 파란 요소 box2는 position: absolute이기 때문에 브라우저 왼쪽 상단 기준 위로부터 100px, 왼쪽으로부터 100px 떨어져 있는 모습을 볼 수 있습니다.&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;만약 container 요소가 position: relative 였다면 파란요소와 빨간요소는 완벽히 겹친 형태로 나타날 것 입니다. (위 코드를 가지고 테스트해보시면 금방 알 수 있습니다&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;)&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;pre style=&quot;background-color:#2b2b2b;color:#a9b7c6;font-family:'Source Code Pro';font-size:9.8pt;&quot;&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;!DOCTYPE &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;html&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;html &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;lang&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;=&quot;en&quot;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;head&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;    &amp;lt;meta &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;charset&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;=&quot;UTF-8&quot;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;    &amp;lt;title&amp;gt;&amp;lt;/title&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;    &amp;lt;style&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        #wrap &lt;/span&gt;{&lt;br /&gt;            &lt;span style=&quot;color:#bababa;&quot;&gt;position&lt;/span&gt;: &lt;span style=&quot;color:#a5c261;&quot;&gt;relative&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;width&lt;/span&gt;: &lt;span style=&quot;color:#6897bb;&quot;&gt;300&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;px&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;height&lt;/span&gt;: &lt;span style=&quot;color:#6897bb;&quot;&gt;300&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;px&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;border&lt;/span&gt;: &lt;span style=&quot;color:#6897bb;&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;px solid &lt;/span&gt;&lt;span style=&quot;color:#6897bb;&quot;&gt;#ccc&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;        &lt;/span&gt;}&lt;br /&gt;        .&lt;span style=&quot;color:#e8bf6a;&quot;&gt;box &lt;/span&gt;{&lt;br /&gt;            &lt;span style=&quot;color:#bababa;&quot;&gt;position&lt;/span&gt;: &lt;span style=&quot;color:#a5c261;&quot;&gt;absolute&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;width&lt;/span&gt;: &lt;span style=&quot;color:#6897bb;&quot;&gt;50&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;px&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;height&lt;/span&gt;: &lt;span style=&quot;color:#6897bb;&quot;&gt;50&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;px&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;background&lt;/span&gt;: &lt;span style=&quot;color:#6897bb;&quot;&gt;#0094ff&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;        &lt;/span&gt;}&lt;br /&gt;        &lt;span style=&quot;color:#e8bf6a;&quot;&gt;#crd1 &lt;/span&gt;{&lt;br /&gt;            &lt;span style=&quot;color:#bababa;&quot;&gt;top&lt;/span&gt;:&lt;span style=&quot;color:#6897bb;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;left&lt;/span&gt;:&lt;span style=&quot;color:#6897bb;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;        &lt;/span&gt;}&lt;br /&gt;        &lt;span style=&quot;color:#e8bf6a;&quot;&gt;#crd2 &lt;/span&gt;{&lt;br /&gt;            &lt;span style=&quot;color:#bababa;&quot;&gt;top&lt;/span&gt;:&lt;span style=&quot;color:#6897bb;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;right&lt;/span&gt;:&lt;span style=&quot;color:#6897bb;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;        &lt;/span&gt;}&lt;br /&gt;        &lt;span style=&quot;color:#e8bf6a;&quot;&gt;#crd3 &lt;/span&gt;{&lt;br /&gt;            &lt;span style=&quot;color:#bababa;&quot;&gt;bottom&lt;/span&gt;: &lt;span style=&quot;color:#6897bb;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;left&lt;/span&gt;: &lt;span style=&quot;color:#6897bb;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;        &lt;/span&gt;}&lt;br /&gt;        &lt;span style=&quot;color:#e8bf6a;&quot;&gt;#crd4 &lt;/span&gt;{&lt;br /&gt;            &lt;span style=&quot;color:#bababa;&quot;&gt;bottom&lt;/span&gt;: &lt;span style=&quot;color:#6897bb;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;right&lt;/span&gt;: &lt;span style=&quot;color:#6897bb;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;        &lt;/span&gt;}&lt;br /&gt;        &lt;span style=&quot;color:#e8bf6a;&quot;&gt;#crd5 &lt;/span&gt;{&lt;br /&gt;            &lt;span style=&quot;color:#bababa;&quot;&gt;top&lt;/span&gt;:&lt;span style=&quot;color:#6897bb;&quot;&gt;100&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;px&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;left&lt;/span&gt;:&lt;span style=&quot;color:#6897bb;&quot;&gt;100&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;px&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;        &lt;/span&gt;}&lt;br /&gt;    &lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/style&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/head&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;body&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;    &amp;lt;div &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;id&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;=&quot;wrap&quot;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &amp;lt;div &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;=&quot;box&quot; &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;id&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;=&quot;crd1&quot;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &amp;lt;/div&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &amp;lt;div &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;=&quot;box&quot; &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;id&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;=&quot;crd2&quot;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &amp;lt;/div&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &amp;lt;div &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;=&quot;box&quot; &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;id&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;=&quot;crd3&quot;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &amp;lt;/div&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &amp;lt;div &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;=&quot;box&quot; &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;id&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;=&quot;crd4&quot;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &amp;lt;/div&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &amp;lt;div &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;=&quot;box&quot; &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;id&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;=&quot;crd5&quot;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &amp;lt;/div&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;    &amp;lt;/div&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/body&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 288px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/99D3273C5DAD9B1324&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F99D3273C5DAD9B1324&quot; width=&quot;288&quot; height=&quot;292&quot; filename=&quot;4.PNG&quot; filemime=&quot;image/jpeg&quot; style=&quot;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;ul style=&quot;list-style-type: disc;&quot;&gt;&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;부모 요소가 position: relative일 때 그 자식요소에 absolute 속성값을 넣고 부모 요소 안에서 자식 요소들을 원할 하게 배치하고 있는 모습입니다.&lt;/span&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;참고로 top, left, right, bottom은 그 기준으로부터 얼마만큼 떨어졌나를 나타낸 것입니다. 이 점 헷갈리지 않게 참고하시면서 요소를 배치하는 것이 중요합니다.&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 18pt;&quot;&gt;&lt;b&gt;fixed&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;fixed 속성값은 absolute 속성값과 마찬가지로 문서의 흐름과 상관없이 위치를 좌표로 결정합니다. 하지만 position:relative인 제일 가까운 부모 혹은 조상 요소가 아닌 브라우저 창이 기준이 됩니다. 따라서 브라우저 창을 어디로 스크롤 하더라도 계속 고정되어 표시되게 됩니다. (기준점: 브라우저 왼쪽 위 꼭지점)&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;; font-size: 18pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;fixed 예제&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;pre style=&quot;background-color: rgb(43, 43, 43); color: rgb(169, 183, 198); font-family: &amp;quot;Source Code Pro&amp;quot;; font-size: 9.8pt;&quot;&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;&amp;lt;!DOCTYPE &lt;/span&gt;&lt;span style=&quot;color: rgb(186, 186, 186);&quot;&gt;html&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;&amp;lt;html &lt;/span&gt;&lt;span style=&quot;color: rgb(186, 186, 186);&quot;&gt;lang&lt;/span&gt;&lt;span style=&quot;color: rgb(165, 194, 97);&quot;&gt;=&quot;en&quot;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;&amp;lt;head&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;    &amp;lt;meta &lt;/span&gt;&lt;span style=&quot;color: rgb(186, 186, 186);&quot;&gt;charset&lt;/span&gt;&lt;span style=&quot;color: rgb(165, 194, 97);&quot;&gt;=&quot;UTF-8&quot;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;    &amp;lt;title&amp;gt;&amp;lt;/title&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;    &amp;lt;style&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;        #content &lt;/span&gt;{&lt;br /&gt;            &lt;span style=&quot;color: rgb(186, 186, 186);&quot;&gt;margin&lt;/span&gt;: &lt;span style=&quot;color: rgb(104, 151, 187);&quot;&gt;20&lt;/span&gt;&lt;span style=&quot;color: rgb(165, 194, 97);&quot;&gt;px&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color: rgb(186, 186, 186);&quot;&gt;padding&lt;/span&gt;: &lt;span style=&quot;color: rgb(104, 151, 187);&quot;&gt;20&lt;/span&gt;&lt;span style=&quot;color: rgb(165, 194, 97);&quot;&gt;px&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color: rgb(186, 186, 186);&quot;&gt;position&lt;/span&gt;: &lt;span style=&quot;color: rgb(165, 194, 97);&quot;&gt;relative&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color: rgb(186, 186, 186);&quot;&gt;width&lt;/span&gt;: &lt;span style=&quot;color: rgb(104, 151, 187);&quot;&gt;300&lt;/span&gt;&lt;span style=&quot;color: rgb(165, 194, 97);&quot;&gt;px&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color: rgb(186, 186, 186);&quot;&gt;height&lt;/span&gt;: &lt;span style=&quot;color: rgb(165, 194, 97);&quot;&gt;auto&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color: rgb(186, 186, 186);&quot;&gt;border&lt;/span&gt;: &lt;span style=&quot;color: rgb(104, 151, 187);&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: rgb(165, 194, 97);&quot;&gt;px solid &lt;/span&gt;&lt;span style=&quot;color: rgb(104, 151, 187);&quot;&gt;#ccc&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;        &lt;/span&gt;}&lt;br /&gt;        &lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;#ask-icon &lt;/span&gt;{&lt;br /&gt;            &lt;span style=&quot;color: rgb(186, 186, 186);&quot;&gt;border&lt;/span&gt;: &lt;span style=&quot;color: rgb(165, 194, 97);&quot;&gt;none&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color: rgb(186, 186, 186);&quot;&gt;width&lt;/span&gt;: &lt;span style=&quot;color: rgb(104, 151, 187);&quot;&gt;100&lt;/span&gt;&lt;span style=&quot;color: rgb(165, 194, 97);&quot;&gt;px&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color: rgb(186, 186, 186);&quot;&gt;height&lt;/span&gt;: &lt;span style=&quot;color: rgb(104, 151, 187);&quot;&gt;100&lt;/span&gt;&lt;span style=&quot;color: rgb(165, 194, 97);&quot;&gt;px&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color: rgb(186, 186, 186);&quot;&gt;position&lt;/span&gt;: &lt;span style=&quot;color: rgb(165, 194, 97);&quot;&gt;fixed&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color: rgb(186, 186, 186);&quot;&gt;bottom&lt;/span&gt;: &lt;span style=&quot;color: rgb(104, 151, 187);&quot;&gt;30&lt;/span&gt;&lt;span style=&quot;color: rgb(165, 194, 97);&quot;&gt;px&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color: rgb(186, 186, 186);&quot;&gt;right&lt;/span&gt;: &lt;span style=&quot;color: rgb(104, 151, 187);&quot;&gt;30&lt;/span&gt;&lt;span style=&quot;color: rgb(165, 194, 97);&quot;&gt;px&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color: rgb(186, 186, 186);&quot;&gt;border-radius&lt;/span&gt;: &lt;span style=&quot;color: rgb(104, 151, 187);&quot;&gt;30&lt;/span&gt;&lt;span style=&quot;color: rgb(165, 194, 97);&quot;&gt;px&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color: rgb(186, 186, 186);&quot;&gt;background&lt;/span&gt;: &lt;span style=&quot;color: rgb(165, 194, 97);&quot;&gt;cornflowerblue&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color: rgb(186, 186, 186);&quot;&gt;line-height&lt;/span&gt;: &lt;span style=&quot;color: rgb(104, 151, 187);&quot;&gt;100&lt;/span&gt;&lt;span style=&quot;color: rgb(165, 194, 97);&quot;&gt;px&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color: rgb(186, 186, 186);&quot;&gt;text-align&lt;/span&gt;: &lt;span style=&quot;color: rgb(165, 194, 97);&quot;&gt;center&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color: rgb(186, 186, 186);&quot;&gt;color&lt;/span&gt;: &lt;span style=&quot;color: rgb(165, 194, 97);&quot;&gt;white&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color: rgb(186, 186, 186);&quot;&gt;font-weight&lt;/span&gt;: &lt;span style=&quot;color: rgb(165, 194, 97);&quot;&gt;bold&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;        &lt;/span&gt;}&lt;br /&gt;    &lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;&amp;lt;/style&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;&amp;lt;/head&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;&amp;lt;body&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;&amp;lt;div &lt;/span&gt;&lt;span style=&quot;color: rgb(186, 186, 186);&quot;&gt;id&lt;/span&gt;&lt;span style=&quot;color: rgb(165, 194, 97);&quot;&gt;=&quot;content&quot;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;    &amp;lt;p&amp;gt;&lt;/span&gt;&lt;span style=&quot;font-family: Arial;&quot;&gt;대통령은 헌법과 법률이 정하는 바에 의하여 공무원을 임면한다&lt;/span&gt;. &lt;span style=&quot;font-family: Arial;&quot;&gt;의무교육은 무상으로 한다&lt;/span&gt;. &lt;span style=&quot;font-family: Arial;&quot;&gt;신체장애자 및 질병&lt;/span&gt;·&lt;span style=&quot;font-family: Arial;&quot;&gt;노령 기타의 사유로 생활능력이 없는 국민은 법률이 정하는 바에 의하여 국가의 보호를 받는다&lt;/span&gt;. &lt;span style=&quot;font-family: Arial;&quot;&gt;모든 국민은 인간으로서의 존엄과 가치를 가지며&lt;/span&gt;, &lt;span style=&quot;font-family: Arial;&quot;&gt;행복을 추구할 권리를 가진다&lt;/span&gt;. &lt;span style=&quot;font-family: Arial;&quot;&gt;국가는 개인이 가지는 불가침의 기본적 인권을 확인하고 이를 보장할 의무를 진다&lt;/span&gt;. &lt;span style=&quot;font-family: Arial;&quot;&gt;이 헌법시행 당시의 법령과 조약은 이 헌법에 위배되지 아니하는 한 그 효력을 지속한다&lt;/span&gt;. &lt;span style=&quot;font-family: Arial;&quot;&gt;근로자는 근로조건의 향상을 위하여 자주적인 단결권&lt;/span&gt;·&lt;span style=&quot;font-family: Arial;&quot;&gt;단체교섭권 및 단체행동권을 가진다&lt;/span&gt;. &lt;span style=&quot;font-family: Arial;&quot;&gt;국가는 노인과 청소년의 복지향상을 위한 정책을 실시할 의무를 진다&lt;/span&gt;.&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;&amp;lt;/p&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;    &amp;lt;p&amp;gt;&lt;/span&gt;&lt;span style=&quot;font-family: Arial;&quot;&gt;모든 국민은 법률이 정하는 바에 의하여 국가기관에 문서로 청원할 권리를 가진다&lt;/span&gt;. &lt;span style=&quot;font-family: Arial;&quot;&gt;국교는 인정되지 아니하며&lt;/span&gt;, &lt;span style=&quot;font-family: Arial;&quot;&gt;종교와 정치는 분리된다&lt;/span&gt;. &lt;span style=&quot;font-family: Arial;&quot;&gt;국회의원의 선거구와 비례대표제 기타 선거에 관한 사항은 법률로 정한다&lt;/span&gt;. &lt;span style=&quot;font-family: Arial;&quot;&gt;헌법재판소의 장은 국회의 동의를 얻어 재판관중에서 대통령이 임명한다&lt;/span&gt;. &lt;span style=&quot;font-family: Arial;&quot;&gt;국민의 자유와 권리는 헌법에 열거되지 아니한 이유로 경시되지 아니한다&lt;/span&gt;. &lt;span style=&quot;font-family: Arial;&quot;&gt;이 헌법시행 당시의 대법원장과 대법원판사가 아닌 법관은 제&lt;/span&gt;1&lt;span style=&quot;font-family: Arial;&quot;&gt;항 단서의 규정에 불구하고 이 헌법에 의하여 임명된 것으로 본다&lt;/span&gt;. &lt;span style=&quot;font-family: Arial;&quot;&gt;훈장등의 영전은 이를 받은 자에게만 효력이 있고&lt;/span&gt;, &lt;span style=&quot;font-family: Arial;&quot;&gt;어떠한 특권도 이에 따르지 아니한다&lt;/span&gt;. &lt;span style=&quot;font-family: Arial;&quot;&gt;국무회의는 대통령&lt;/span&gt;·&lt;span style=&quot;font-family: Arial;&quot;&gt;국무총리와 &lt;/span&gt;15&lt;span style=&quot;font-family: Arial;&quot;&gt;인 이상 &lt;/span&gt;30&lt;span style=&quot;font-family: Arial;&quot;&gt;인 이하의 국무위원으로 구성한다&lt;/span&gt;.&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;&amp;lt;/p&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;    &amp;lt;p&amp;gt;&lt;/span&gt;&lt;span style=&quot;font-family: Arial;&quot;&gt;혼인과 가족생활은 개인의 존엄과 양성의 평등을 기초로 성립되고 유지되어야 하며&lt;/span&gt;, &lt;span style=&quot;font-family: Arial;&quot;&gt;국가는 이를 보장한다&lt;/span&gt;. &lt;span style=&quot;font-family: Arial;&quot;&gt;정당의 설립은 자유이며&lt;/span&gt;, &lt;span style=&quot;font-family: Arial;&quot;&gt;복수정당제는 보장된다&lt;/span&gt;. &lt;span style=&quot;font-family: Arial;&quot;&gt;각급 선거관리위원회는 선거인명부의 작성등 선거사무와 국민투표사무에 관하여 관계 행정기관에 필요한 지시를 할 수 있다&lt;/span&gt;. &lt;span style=&quot;font-family: Arial;&quot;&gt;국가는 농수산물의 수급균형과 유통구조의 개선에 노력하여 가격안정을 도모함으로써 농&lt;/span&gt;·&lt;span style=&quot;font-family: Arial;&quot;&gt;어민의 이익을 보호한다&lt;/span&gt;. &lt;span style=&quot;font-family: Arial;&quot;&gt;국군의 조직과 편성은 법률로 정한다&lt;/span&gt;. &lt;span style=&quot;font-family: Arial;&quot;&gt;모든 국민은 주거의 자유를 침해받지 아니한다&lt;/span&gt;. &lt;span style=&quot;font-family: Arial;&quot;&gt;주거에 대한 압수나 수색을 할 때에는 검사의 신청에 의하여 법관이 발부한 영장을 제시하여야 한다&lt;/span&gt;. &lt;span style=&quot;font-family: Arial;&quot;&gt;국가안전보장회의는 대통령이 주재한다&lt;/span&gt;.&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;&amp;lt;/p&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;    &amp;lt;p&amp;gt;&lt;/span&gt;&lt;span style=&quot;font-family: Arial;&quot;&gt;헌법재판소의 조직과 운영 기타 필요한 사항은 법률로 정한다&lt;/span&gt;. &lt;span style=&quot;font-family: Arial;&quot;&gt;헌법개정안은 국회가 의결한 후 &lt;/span&gt;30&lt;span style=&quot;font-family: Arial;&quot;&gt;일 이내에 국민투표에 붙여 국회의원선거권자 과반수의 투표와 투표자 과반수의 찬성을 얻어야 한다&lt;/span&gt;. &lt;span style=&quot;font-family: Arial;&quot;&gt;대통령은 필요하다고 인정할 때에는 외교&lt;/span&gt;·&lt;span style=&quot;font-family: Arial;&quot;&gt;국방&lt;/span&gt;·&lt;span style=&quot;font-family: Arial;&quot;&gt;통일 기타 국가안위에 관한 중요정책을 국민투표에 붙일 수 있다&lt;/span&gt;. &lt;span style=&quot;font-family: Arial;&quot;&gt;대통령이 궐위되거나 사고로 인하여 직무를 수행할 수 없을 때에는 국무총리&lt;/span&gt;, &lt;span style=&quot;font-family: Arial;&quot;&gt;법률이 정한 국무위원의 순서로 그 권한을 대행한다&lt;/span&gt;. &lt;span style=&quot;font-family: Arial;&quot;&gt;법원은 최고법원인 대법원과 각급법원으로 조직된다&lt;/span&gt;. &lt;span style=&quot;font-family: Arial;&quot;&gt;국무위원은 국정에 관하여 대통령을 보좌하며&lt;/span&gt;, &lt;span style=&quot;font-family: Arial;&quot;&gt;국무회의의 구성원으로서 국정을 심의한다&lt;/span&gt;. &lt;span style=&quot;font-family: Arial;&quot;&gt;모든 국민은 건강하고 쾌적한 환경에서 생활할 권리를 가지며&lt;/span&gt;, &lt;span style=&quot;font-family: Arial;&quot;&gt;국가와 국민은 환경보전을 위하여 노력하여야 한다&lt;/span&gt;.&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;&amp;lt;/p&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;    &amp;lt;p&amp;gt;&lt;/span&gt;&lt;span style=&quot;font-family: Arial;&quot;&gt;모든 국민은 고문을 받지 아니하며&lt;/span&gt;, &lt;span style=&quot;font-family: Arial;&quot;&gt;형사상 자기에게 불리한 진술을 강요당하지 아니한다&lt;/span&gt;. &lt;span style=&quot;font-family: Arial;&quot;&gt;대법원장의 임기는 &lt;/span&gt;6&lt;span style=&quot;font-family: Arial;&quot;&gt;년으로 하며&lt;/span&gt;, &lt;span style=&quot;font-family: Arial;&quot;&gt;중임할 수 없다&lt;/span&gt;. &lt;span style=&quot;font-family: Arial;&quot;&gt;공무원은 국민전체에 대한 봉사자이며&lt;/span&gt;, &lt;span style=&quot;font-family: Arial;&quot;&gt;국민에 대하여 책임을 진다&lt;/span&gt;. &lt;span style=&quot;font-family: Arial;&quot;&gt;모든 국민은 인간다운 생활을 할 권리를 가진다&lt;/span&gt;. &lt;span style=&quot;font-family: Arial;&quot;&gt;공무원의 직무상 불법행위로 손해를 받은 국민은 법률이 정하는 바에 의하여 국가 또는 공공단체에 정당한 배상을 청구할 수 있다&lt;/span&gt;. &lt;span style=&quot;font-family: Arial;&quot;&gt;이 경우 공무원 자신의 책임은 면제되지 아니한다&lt;/span&gt;. &lt;span style=&quot;font-family: Arial;&quot;&gt;헌법에 의하여 체결&lt;/span&gt;·&lt;span style=&quot;font-family: Arial;&quot;&gt;공포된 조약과 일반적으로 승인된 국제법규는 국내법과 같은 효력을 가진다&lt;/span&gt;. &lt;span style=&quot;font-family: Arial;&quot;&gt;국가는 농지에 관하여 경자유전의 원칙이 달성될 수 있도록 노력하여야 하며&lt;/span&gt;, &lt;span style=&quot;font-family: Arial;&quot;&gt;농지의 소작제도는 금지된다&lt;/span&gt;.&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;&amp;lt;/p&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;&amp;lt;div &lt;/span&gt;&lt;span style=&quot;color: rgb(186, 186, 186);&quot;&gt;id&lt;/span&gt;&lt;span style=&quot;color: rgb(165, 194, 97);&quot;&gt;=&quot;ask-icon&quot;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;font-family: Arial;&quot;&gt;문의하기&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;&amp;lt;/body&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 678px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/99BCE1395DAD9BCB16&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F99BCE1395DAD9BCB16&quot; width=&quot;678&quot; height=&quot;531&quot; filename=&quot;5.PNG&quot; filemime=&quot;image/jpeg&quot; style=&quot;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;ul style=&quot;list-style-type: disc;&quot;&gt;&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;'문의하기' 요소가 브라우저를 위에서 아래로 스크롤 해도 브라우저 창에 붙어있는 것을 볼 수 있습니다.&lt;/span&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;이 fixed 요소를 가지고 문의하기, Q&amp;amp;A, 대화창 등 서비스 사용자에게 계속적으로 노출해야하는 요소를 브라우저 창에 삽입할 수 있습니다.&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 18pt;&quot;&gt;&lt;b&gt;sticky&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;sticky 속성은 기준점을 이상을 넘지 않을 때는 relative 포지션처럼 동작하다 그 이상을 넘게 될 시에는 fixed 속성과 같이 동작하게 됩니다. 그러다 스크롤이 scroll 박스 밖으로 벗어나게 될 경우에는 그 위치에서 정지하게 됩니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;기준점을 설명하자면&amp;nbsp;top:50px인 sticky 속성을&amp;nbsp;예로 들어 보겠습니다.&amp;nbsp;스크롤를 내렸을 때&amp;nbsp;뷰포트(viewport)와 요소 사이의 거리가&amp;nbsp;50px 이상이면 relative처럼 동작하다 50px 이하가 됬을 때&amp;nbsp;기준점을 넘은 것으로 보고 그때부터 fixed 요소처럼 동작하게 됩니다. 뷰포트(viewport)는 현재 사용자에게 보이는 브라우저 창이라고 생각하시면 됩니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;scroll 박스는 overflow 속성이 존재하는 부모요소를 뜻합니다. 여기서 부모요소가 overflow를 특별히 명시하지 않았다면 부모요소가 바로 scroll 박스가 됩니다!&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;만일, scroll 박스 사이에 overflow: hidden 이 적용되있는 요소가 있을 경우에는 sticky 속성이 제대로 동작하지 않으므로 주의해야 합니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 18pt;&quot;&gt;&lt;b&gt;sticky 예제&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;pre style=&quot;background-color:#2b2b2b;color:#a9b7c6;font-family:'굴림체';font-size:9.0pt;&quot;&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;!DOCTYPE &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;html&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;html &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;lang&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;=&quot;en&quot;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;head&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;    &amp;lt;meta &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;charset&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;=&quot;UTF-8&quot;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;    &amp;lt;title&amp;gt;&amp;lt;/title&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;    &amp;lt;style&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;div &lt;/span&gt;{&lt;br /&gt;            &lt;span style=&quot;color:#bababa;&quot;&gt;width&lt;/span&gt;: &lt;span style=&quot;color:#6897bb;&quot;&gt;800&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;px&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;height&lt;/span&gt;: &lt;span style=&quot;color:#6897bb;&quot;&gt;1000&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;px&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;border&lt;/span&gt;: &lt;span style=&quot;color:#a5c261;&quot;&gt;black solid &lt;/span&gt;&lt;span style=&quot;color:#6897bb;&quot;&gt;5&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;px&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;margin&lt;/span&gt;: &lt;span style=&quot;color:#6897bb;&quot;&gt;30&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;px&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;display&lt;/span&gt;: &lt;span style=&quot;color:#a5c261;&quot;&gt;inline-block&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;color&lt;/span&gt;: &lt;span style=&quot;color:#a5c261;&quot;&gt;white&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;        &lt;/span&gt;}&lt;br /&gt;        .&lt;span style=&quot;color:#e8bf6a;&quot;&gt;scroll &lt;/span&gt;{&lt;br /&gt;            &lt;span style=&quot;color:#bababa;&quot;&gt;overflow&lt;/span&gt;:&lt;span style=&quot;color:#a5c261;&quot;&gt;visible&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;display&lt;/span&gt;: &lt;span style=&quot;color:#a5c261;&quot;&gt;block&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;        &lt;/span&gt;}&lt;br /&gt;        .&lt;span style=&quot;color:#e8bf6a;&quot;&gt;static &lt;/span&gt;{&lt;br /&gt;            &lt;span style=&quot;color:#bababa;&quot;&gt;width&lt;/span&gt;: &lt;span style=&quot;color:#6897bb;&quot;&gt;150&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;px&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;height&lt;/span&gt;: &lt;span style=&quot;color:#6897bb;&quot;&gt;150&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;px&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;border&lt;/span&gt;: &lt;span style=&quot;color:#a5c261;&quot;&gt;none&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;background&lt;/span&gt;: &lt;span style=&quot;color:#a5c261;&quot;&gt;gray&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;text-align&lt;/span&gt;: &lt;span style=&quot;color:#a5c261;&quot;&gt;center&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;line-height&lt;/span&gt;: &lt;span style=&quot;color:#6897bb;&quot;&gt;150&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;px&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;        &lt;/span&gt;}&lt;br /&gt;        .&lt;span style=&quot;color:#e8bf6a;&quot;&gt;sticky &lt;/span&gt;{&lt;br /&gt;            &lt;span style=&quot;color:#bababa;&quot;&gt;width&lt;/span&gt;: &lt;span style=&quot;color:#6897bb;&quot;&gt;150&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;px&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;height&lt;/span&gt;: &lt;span style=&quot;color:#6897bb;&quot;&gt;150&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;px&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;border&lt;/span&gt;: &lt;span style=&quot;color:#a5c261;&quot;&gt;none&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;background&lt;/span&gt;: &lt;span style=&quot;color:#a5c261;&quot;&gt;blue&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;text-align&lt;/span&gt;: &lt;span style=&quot;color:#a5c261;&quot;&gt;center&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;line-height&lt;/span&gt;: &lt;span style=&quot;color:#6897bb;&quot;&gt;150&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;px&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;position&lt;/span&gt;: &lt;span style=&quot;color:#a5c261;&quot;&gt;sticky&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;top&lt;/span&gt;: &lt;span style=&quot;color:#6897bb;&quot;&gt;50&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;px&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;        &lt;/span&gt;}&lt;br /&gt;        .&lt;span style=&quot;color:#e8bf6a;&quot;&gt;fixed &lt;/span&gt;{&lt;br /&gt;            &lt;span style=&quot;color:#bababa;&quot;&gt;width&lt;/span&gt;: &lt;span style=&quot;color:#6897bb;&quot;&gt;150&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;px&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;height&lt;/span&gt;: &lt;span style=&quot;color:#6897bb;&quot;&gt;150&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;px&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;border&lt;/span&gt;: &lt;span style=&quot;color:#a5c261;&quot;&gt;none&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;background&lt;/span&gt;: &lt;span style=&quot;color:#a5c261;&quot;&gt;red&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;text-align&lt;/span&gt;: &lt;span style=&quot;color:#a5c261;&quot;&gt;center&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;line-height&lt;/span&gt;: &lt;span style=&quot;color:#6897bb;&quot;&gt;150&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;px&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;position&lt;/span&gt;: &lt;span style=&quot;color:#a5c261;&quot;&gt;fixed&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;bottom&lt;/span&gt;: &lt;span style=&quot;color:#6897bb;&quot;&gt;150&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;px&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;        &lt;/span&gt;}&lt;br /&gt;    &lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/style&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/head&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;body&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;div &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;=&quot;scroll&quot;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;    &amp;lt;div &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;=&quot;static&quot;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &lt;/span&gt;.static&lt;br /&gt;    &lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;    &amp;lt;div &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;=&quot;sticky&quot;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &lt;/span&gt;.sticky&lt;br /&gt;    &lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;    &amp;lt;div &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;=&quot;fixed&quot;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &lt;/span&gt;.fixed&lt;br /&gt;    &lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;div &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;=&quot;scroll&quot;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;    &amp;lt;div &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;=&quot;static&quot;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &lt;/span&gt;.static&lt;br /&gt;    &lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;    &amp;lt;div &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;=&quot;sticky&quot;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &lt;/span&gt;.sticky&lt;br /&gt;    &lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;div &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;=&quot;scroll&quot;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/body&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/html&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 728px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/9902E73A5DAD9C7F22&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F9902E73A5DAD9C7F22&quot; width=&quot;728&quot; height=&quot;881&quot; filename=&quot;캡처.PNG&quot; filemime=&quot;image/jpeg&quot; style=&quot;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;ul style=&quot;list-style-type: disc;&quot;&gt;&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;fixed 와 sticky 요소를 혼합한 예제입니다. 스크롤를 내리면 fixed 요소는 브라우저 특정 위치에 그대로 있는 반면에 sticky요소는 특정 시점에서 fixed 요소처럼 행동하다 자신의 부모 요소와 만나게 되면 멈추는 모습을 볼 수 있습니다.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;sticky 요소가 중간에 멈추는 기준은 부모 요소의 크기 내에서 멈추게 됩니다. sticky 요소는 부모 요소 정확히 override: hidden 이 아닌 요소의 크기 밖으로 나갈 수 없습니다.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;만약 sticky 요소가 모든 조건을 충족 (위치지정 및 override: hidden 요소 없음) 했는 데도 불구하고 제대로 동작하지 않는다면 부모 요소의 크기가 어떤지를 먼저 체크해봐야 할 것입니다.&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>Language &amp;amp; Solution/HTML&amp;amp;CSS</category>
      <category>CSS</category>
      <category>position</category>
      <author>새로비</author>
      <guid isPermaLink="true">https://engkimbs.tistory.com/922</guid>
      <comments>https://engkimbs.tistory.com/entry/HTMLCSS-position-%EC%86%8D%EC%84%B1-%EC%A0%95%EB%A6%AC%ED%95%98%EA%B8%B0#entry922comment</comments>
      <pubDate>Thu, 10 Oct 2019 14:18:15 +0900</pubDate>
    </item>
    <item>
      <title>[HTML&amp;amp;CSS] box-sizing, float, clear</title>
      <link>https://engkimbs.tistory.com/entry/HTMLCSS-box-sizing-float-clear</link>
      <description>&lt;p&gt;&lt;span style=&quot;font-size: 18pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(31, 218, 17);&quot;&gt;| &lt;/span&gt;box-sizing&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;box-sizing 속성은 width의 크기를 어떤 기준으로 할 것인지를 정하는&amp;nbsp;속성입니다. 박스 모델에서 width의 값을 토대로 콘텐츠 영역의 크기를 결정하는 것이죠. 처음 감을 잘 못잡을 수도 있지만 천천히 포스팅을 따라오다보면 쉽게 이해할 것입니다!&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;box-sizing에서 사용할 수있는 값은 다음과 같습니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;; text-align: center; background-color: rgb(255, 255, 255); color: rgb(0, 0, 0); font-size: 14pt;&quot;&gt;&lt;i&gt;box-sizing : content-box | border-box&lt;/i&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; margin-left: 2em;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;table class=&quot;txc-table&quot; width=&quot;568&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; border=&quot;0&quot; style=&quot;border: none; border-collapse: collapse; width: 568px;&quot; 맑은=&quot;&quot; 고딕&quot;,=&quot;&quot; sans-serif;font-size:16px&quot;=&quot;&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;width: 113px; height: 41px; border-width: 1px; border-style: solid; border-color: rgb(204, 204, 204); background-color: rgb(217, 229, 255);&quot;&gt;&lt;p&gt;&amp;nbsp;&lt;b&gt;content-box&lt;/b&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td style=&quot;width: 454px; height: 41px; border-bottom: 1px solid rgb(204, 204, 204); border-right: 1px solid rgb(204, 204, 204); border-top: 1px solid rgb(204, 204, 204);&quot;&gt;&lt;p&gt;&amp;nbsp;width 속성값을 콘텐츠 영역 너비 값으로 사용합니다. (기본값)&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td style=&quot;width: 113px; height: 24px; border-bottom: 1px solid rgb(204, 204, 204); border-right: 1px solid rgb(204, 204, 204); border-left: 1px solid rgb(204, 204, 204); background-color: rgb(217, 229, 255);&quot;&gt;&lt;p&gt;&amp;nbsp;&lt;b&gt;border-box&lt;/b&gt;&amp;nbsp;&lt;/p&gt;&lt;/td&gt;
&lt;td style=&quot;width: 454px; height: 24px; border-bottom: 1px solid rgb(204, 204, 204); border-right: 1px solid rgb(204, 204, 204);&quot;&gt;&lt;p&gt;&amp;nbsp;width 속성값을 콘텐츠 영역 및 테두리(border)까지 포함한 박스 모델 전체 너비 값으로 사용합니다.&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&lt;br /&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;참고로 content-box보다는 border-box가 width를 통해 콘텐츠 영역의 크기를 계산하기 쉽기 때문에 콘텐츠 영역의 크기를&amp;nbsp;요구사항에 정확히 맞추기 위해서는 border-box를 이용하는 게 더 좋을 것입니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 18pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(31, 218, 17);&quot;&gt;|&lt;/span&gt; box-sizing 예제&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;pre style=&quot;background-color:#2b2b2b;color:#a9b7c6;font-family:'Source Code Pro';font-size:9.8pt;&quot;&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;!DOCTYPE &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;html&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;html &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;lang&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;=&quot;en&quot;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;head&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;    &amp;lt;meta &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;charset&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;=&quot;UTF-8&quot;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;    &amp;lt;title&amp;gt;&amp;lt;/title&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;    &amp;lt;style&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &lt;/span&gt;.&lt;span style=&quot;color:#e8bf6a;&quot;&gt;box &lt;/span&gt;{&lt;br /&gt;            &lt;span style=&quot;color:#bababa;&quot;&gt;box-sizing&lt;/span&gt;: &lt;span style=&quot;color:#a5c261;&quot;&gt;content-box&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;width&lt;/span&gt;: &lt;span style=&quot;color:#6897bb;&quot;&gt;300&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;px&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;height&lt;/span&gt;: &lt;span style=&quot;color:#6897bb;&quot;&gt;150&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;px&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;margin&lt;/span&gt;: &lt;span style=&quot;color:#6897bb;&quot;&gt;10&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;px&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;padding&lt;/span&gt;: &lt;span style=&quot;color:#6897bb;&quot;&gt;30&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;px&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;border&lt;/span&gt;: &lt;span style=&quot;color:#6897bb;&quot;&gt;3&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;px solid red&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;        &lt;/span&gt;}&lt;br /&gt;        .&lt;span style=&quot;color:#e8bf6a;&quot;&gt;box2 &lt;/span&gt;{&lt;br /&gt;            &lt;span style=&quot;color:#bababa;&quot;&gt;box-sizing&lt;/span&gt;: &lt;span style=&quot;color:#a5c261;&quot;&gt;border-box&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;width&lt;/span&gt;: &lt;span style=&quot;color:#6897bb;&quot;&gt;300&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;px&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;height&lt;/span&gt;: &lt;span style=&quot;color:#6897bb;&quot;&gt;150&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;px&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;maring&lt;/span&gt;: &lt;span style=&quot;color:#6897bb;&quot;&gt;10&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;px&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;padding&lt;/span&gt;: &lt;span style=&quot;color:#6897bb;&quot;&gt;30&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;px&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;border&lt;/span&gt;: &lt;span style=&quot;color:#6897bb;&quot;&gt;3&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;px solid red&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;        &lt;/span&gt;}&lt;br /&gt;    &lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/style&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/head&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;body&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;    &amp;lt;div &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;=&quot;box&quot;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &lt;/span&gt;box-sizing = &quot;content-box&quot;&lt;br /&gt;    &lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;    &amp;lt;div &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;=&quot;box2&quot;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &lt;/span&gt;box-sizing = &quot;border-box&quot;&lt;br /&gt;    &lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/body&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 349px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/99A7533D5DA71EF61A&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F99A7533D5DA71EF61A&quot; width=&quot;349&quot; height=&quot;341&quot; filename=&quot;1.PNG&quot; filemime=&quot;image/jpeg&quot; style=&quot;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;ul style=&quot;list-style-type: disc;&quot;&gt;&lt;li&gt;&lt;p style=&quot;text-align: justify; clear: none; float: none;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;content-box와 border-box의 차이를 위 예시에서 보여줍니다. 같&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;은 width, height, margin, padding 및 border 사이즈를 똑같이 정해줬어도 서로 다른 크기가 되는 것을 알 수 있습니다.&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&quot;text-align: justify; clear: none; float: none;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;이 경우는 content-box는&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;&amp;nbsp;width 속성값을 딱 컨텐츠 크기만을 정해서 된 것이고 border-box는 경계선까지 포함해서 생긴 현상입니다.&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 318px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/998B453D5DA71EF61C&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F998B453D5DA71EF61C&quot; width=&quot;318&quot; height=&quot;190&quot; filename=&quot;2.PNG&quot; filemime=&quot;image/jpeg&quot; style=&quot;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;b&gt;&amp;lt;content-box 사이즈 - width는 300&amp;gt;&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 277px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/99A86F3D5DA71EF611&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F99A86F3D5DA71EF611&quot; width=&quot;277&quot; height=&quot;185&quot; filename=&quot;3.PNG&quot; filemime=&quot;image/jpeg&quot; style=&quot;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-left: 12em; text-align: justify;&quot;&gt;&lt;b&gt;&amp;lt;border-box 사이즈 - width 포함 border까지 300&amp;gt;&lt;/b&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 18pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;&lt;span style=&quot;color: rgb(31, 218, 17);&quot;&gt;|&lt;/span&gt; float&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;float 속성은 웹 요소를 문서 위에 떠 있게 만듭니다. '떠 있다'는 것은 왼쪽 구석 혹은 오른쪽 구석에 해당 요소가 배치된다는 뜻입니다. float에서 사용할 수 있는 값은 다음과 같습니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;i style=&quot;&quot;&gt;&lt;b style=&quot;&quot;&gt;&lt;span style=&quot;font-size: 14pt; font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-size: 14pt; font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;float: left | right | none&lt;/span&gt;&lt;/b&gt;&lt;/i&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;table class=&quot;txc-table&quot; width=&quot;692&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; border=&quot;0&quot; style=&quot;border:none;border-collapse:collapse;;font-family:&quot; 맑은=&quot;&quot; 고딕&quot;,=&quot;&quot; sans-serif;font-size:16px&quot;=&quot;&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;width: 127px; height: 24px; border-width: 1px; border-style: solid; border-color: rgb(204, 204, 204); background-color: rgb(217, 229, 255);&quot;&gt;&lt;p&gt;&lt;b&gt;&amp;nbsp;left&lt;/b&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td style=&quot;width: 564px; height: 24px; border-bottom: 1px solid rgb(204, 204, 204); border-right: 1px solid rgb(204, 204, 204); border-top: 1px solid rgb(204, 204, 204);&quot;&gt;&lt;p&gt;&amp;nbsp;해당 요소를 문서의 왼쪽으로 배치&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td style=&quot;width: 127px; height: 24px; border-bottom: 1px solid rgb(204, 204, 204); border-right: 1px solid rgb(204, 204, 204); border-left: 1px solid rgb(204, 204, 204); background-color: rgb(217, 229, 255);&quot;&gt;&lt;p&gt;&lt;b&gt;&amp;nbsp;right&lt;/b&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td style=&quot;width: 564px; height: 24px; border-bottom: 1px solid rgb(204, 204, 204); border-right: 1px solid rgb(204, 204, 204);&quot;&gt;&lt;p&gt;&amp;nbsp;해당 요소를 문서의 오른쪽으로 배치&amp;nbsp;&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td style=&quot;width: 127px; height: 24px; border-bottom: 1px solid rgb(204, 204, 204); border-right: 1px solid rgb(204, 204, 204); border-left: 1px solid rgb(204, 204, 204); background-color: rgb(217, 229, 255);&quot;&gt;&lt;p&gt;&lt;b&gt;&amp;nbsp;none&lt;/b&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td style=&quot;width: 564px; height: 24px; border-bottom: 1px solid rgb(204, 204, 204); border-right: 1px solid rgb(204, 204, 204);&quot;&gt;&lt;p&gt;&amp;nbsp;좌우 어느 쪽으로도 배치하지 않음&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 18pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(31, 218, 17);&quot;&gt;|&lt;/span&gt; float 예제&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;pre style=&quot;background-color:#2b2b2b;color:#a9b7c6;font-family:'Source Code Pro';font-size:9.8pt;&quot;&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;!DOCTYPE &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;html&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;html &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;lang&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;=&quot;en&quot;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;head&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;    &amp;lt;meta &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;charset&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;=&quot;UTF-8&quot;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;    &amp;lt;title&amp;gt;&amp;lt;/title&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;    &amp;lt;style&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &lt;/span&gt;.&lt;span style=&quot;color:#e8bf6a;&quot;&gt;left-symbol &lt;/span&gt;{&lt;br /&gt;            &lt;span style=&quot;color:#bababa;&quot;&gt;float&lt;/span&gt;: &lt;span style=&quot;color:#a5c261;&quot;&gt;left&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;border-radius&lt;/span&gt;: &lt;span style=&quot;color:#6897bb;&quot;&gt;30&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;px&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;width&lt;/span&gt;: &lt;span style=&quot;color:#6897bb;&quot;&gt;300&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;px&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;height&lt;/span&gt;: &lt;span style=&quot;color:#6897bb;&quot;&gt;300&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;px&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;background&lt;/span&gt;: &lt;span style=&quot;color:#6897bb;&quot;&gt;#F46075&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;margin &lt;/span&gt;: &lt;span style=&quot;color:#6897bb;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;px &lt;/span&gt;&lt;span style=&quot;color:#6897bb;&quot;&gt;50&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;px&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;        &lt;/span&gt;}&lt;br /&gt;    &lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/style&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/head&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;body&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;    &amp;lt;div &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;=&quot;left-symbol&quot;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;    &amp;lt;/div&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;    &amp;lt;h1&amp;gt;&lt;/span&gt;This is pink symbol: CIRCLE &lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/h1&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;    &amp;lt;p&amp;gt; &lt;/span&gt;PINK&lt;span style=&quot;font-family:'Arial Unicode MS';&quot;&gt;는 정말 아름답고 예술적인 색상이다&lt;/span&gt;.&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/p&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/body&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 728px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/9954ED455DA720101B&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F9954ED455DA720101B&quot; width=&quot;728&quot; height=&quot;320&quot; filename=&quot;3.PNG&quot; filemime=&quot;image/jpeg&quot; style=&quot;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;ul style=&quot;list-style-type: disc;&quot;&gt;&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;style 태그에서 지정한 .left-symbol 클래스를 보면 float: left 속성이 들어가 있습니다. 이 클래스의 float 속성에 따라서 해당 요소는 왼쪽으로 자연스럽게 위치하게 됩니다.&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;pre style=&quot;background-color:#2b2b2b;color:#a9b7c6;font-family:'Source Code Pro';font-size:9.8pt;&quot;&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;!DOCTYPE &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;html&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;html &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;lang&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;=&quot;en&quot;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;head&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;    &amp;lt;meta &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;charset&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;=&quot;UTF-8&quot;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;    &amp;lt;title&amp;gt;&amp;lt;/title&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;    &amp;lt;style&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &lt;/span&gt;.&lt;span style=&quot;color:#e8bf6a;&quot;&gt;box1 &lt;/span&gt;{&lt;br /&gt;            &lt;span style=&quot;color:#bababa;&quot;&gt;padding&lt;/span&gt;: &lt;span style=&quot;color:#6897bb;&quot;&gt;20&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;px&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;margin&lt;/span&gt;: &lt;span style=&quot;color:#6897bb;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;px &lt;/span&gt;&lt;span style=&quot;color:#6897bb;&quot;&gt;10&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;px&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;background&lt;/span&gt;: &lt;span style=&quot;color:#6897bb;&quot;&gt;#F46075&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;float&lt;/span&gt;: &lt;span style=&quot;color:#a5c261;&quot;&gt;left&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;        &lt;/span&gt;}&lt;br /&gt;        .&lt;span style=&quot;color:#e8bf6a;&quot;&gt;box2 &lt;/span&gt;{&lt;br /&gt;            &lt;span style=&quot;color:#bababa;&quot;&gt;padding&lt;/span&gt;: &lt;span style=&quot;color:#6897bb;&quot;&gt;20&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;px&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;margin&lt;/span&gt;: &lt;span style=&quot;color:#6897bb;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;px &lt;/span&gt;&lt;span style=&quot;color:#6897bb;&quot;&gt;10&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;px&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;background&lt;/span&gt;: &lt;span style=&quot;color:#6897bb;&quot;&gt;#ffcc33&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;float&lt;/span&gt;: &lt;span style=&quot;color:#a5c261;&quot;&gt;left&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;        &lt;/span&gt;}&lt;br /&gt;        .&lt;span style=&quot;color:#e8bf6a;&quot;&gt;box3 &lt;/span&gt;{&lt;br /&gt;            &lt;span style=&quot;color:#bababa;&quot;&gt;padding&lt;/span&gt;: &lt;span style=&quot;color:#6897bb;&quot;&gt;20&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;px&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;margin&lt;/span&gt;: &lt;span style=&quot;color:#6897bb;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;px &lt;/span&gt;&lt;span style=&quot;color:#6897bb;&quot;&gt;10&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;px&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;background&lt;/span&gt;: &lt;span style=&quot;color:#a5c261;&quot;&gt;purple&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;float&lt;/span&gt;: &lt;span style=&quot;color:#a5c261;&quot;&gt;right&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;        &lt;/span&gt;}&lt;br /&gt;    &lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/style&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/head&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;body&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;    &amp;lt;div &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;=&quot;box1&quot;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;    &amp;lt;div &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;=&quot;box2&quot;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;    &amp;lt;div &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;=&quot;box3&quot;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/body&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 384px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/99E8174F5DA720CF11&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F99E8174F5DA720CF11&quot; width=&quot;384&quot; height=&quot;71&quot; filename=&quot;4.PNG&quot; filemime=&quot;image/jpeg&quot; style=&quot;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;style 태그에서 지정한 box1, box2, box3클래스를 보면 각각 float에 left, left,&amp;nbsp;right&amp;nbsp;속성이 들어가 있습니다. 이 클래스의 float 속성에 따라서 left&amp;nbsp;요소는 왼쪽으로 자연스럽게 위치하게 됩니다. 또한 right 요소는 자연스럽게 오른쪽에 위치하게 됩니다.&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 18pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(31, 218, 17);&quot;&gt;|&lt;/span&gt; clear&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;float 속성을 이용해 웹 페이지 요소를 왼쪽이나 오른쪽에 배치하면 그 다음에 float 속성을 사용하지 않은 요소는 float 요소 밑에 파묻히게 됩니다. (float가 적용된 요소가 '부유'한다는 뜻이 바로 이런 뜻입니다! float가 적용되지 않은&amp;nbsp;요소의 위로 떠다닌다는 것이죠)&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;따라서 float가 아닌 다음 요소가 이런 취급을 받지 않게 하려면 float 속성을 해제해 줘야하는 데 그것이 바로 clear 속성입니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;clear 속성은 다음과 같은 값이 들어가게 됩니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;&lt;i&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;&lt;b&gt;clear : none | left | right | both&lt;/b&gt;&lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;table class=&quot;txc-table&quot; width=&quot;692&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; border=&quot;0&quot; style=&quot;border:none;border-collapse:collapse;;font-family:&quot; 맑은=&quot;&quot; 고딕&quot;,=&quot;&quot; sans-serif;font-size:16px&quot;=&quot;&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;width: 121px; height: 24px; border-width: 1px; border-style: solid; border-color: rgb(204, 204, 204); background-color: rgb(217, 229, 255);&quot;&gt;&lt;p&gt;&lt;b&gt;&amp;nbsp;none&lt;/b&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td style=&quot;width: 570px; height: 24px; border-bottom: 1px solid rgb(204, 204, 204); border-right: 1px solid rgb(204, 204, 204); border-top: 1px solid rgb(204, 204, 204);&quot;&gt;&lt;p&gt;&amp;nbsp;float 속성을 해제 하지 않습니다. (기본값)&amp;nbsp;&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td style=&quot;width: 121px; height: 24px; border-bottom: 1px solid rgb(204, 204, 204); border-right: 1px solid rgb(204, 204, 204); border-left: 1px solid rgb(204, 204, 204); background-color: rgb(217, 229, 255);&quot;&gt;&lt;p&gt;&lt;b&gt;&amp;nbsp;left&lt;/b&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td style=&quot;width: 570px; height: 24px; border-bottom: 1px solid rgb(204, 204, 204); border-right: 1px solid rgb(204, 204, 204);&quot;&gt;&lt;p&gt;&amp;nbsp;float의 left 속성을 해제 합니다.&amp;nbsp;&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td style=&quot;width: 121px; height: 24px; border-bottom: 1px solid rgb(204, 204, 204); border-right: 1px solid rgb(204, 204, 204); border-left: 1px solid rgb(204, 204, 204); background-color: rgb(217, 229, 255);&quot;&gt;&lt;p&gt;&lt;b&gt;&amp;nbsp;right&lt;/b&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td style=&quot;width: 570px; height: 24px; border-bottom: 1px solid rgb(204, 204, 204); border-right: 1px solid rgb(204, 204, 204);&quot;&gt;&lt;p&gt;&amp;nbsp;float의 right 속성을 해제 합니다.&amp;nbsp;&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td style=&quot;width: 121px; height: 24px; border-bottom: 1px solid rgb(204, 204, 204); border-right: 1px solid rgb(204, 204, 204); border-left: 1px solid rgb(204, 204, 204); background-color: rgb(217, 229, 255);&quot;&gt;&lt;p&gt;&lt;b&gt;&amp;nbsp;both&lt;/b&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td style=&quot;width: 570px; height: 24px; border-bottom: 1px solid rgb(204, 204, 204); border-right: 1px solid rgb(204, 204, 204);&quot;&gt;&lt;p&gt;&amp;nbsp;float의 모든 속성을 해제 합니다.&amp;nbsp;&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 18pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(31, 218, 17);&quot;&gt;| &lt;/span&gt;clear 예제&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;pre style=&quot;background-color:#2b2b2b;color:#a9b7c6;font-family:'Source Code Pro';font-size:9.8pt;&quot;&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;!DOCTYPE &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;html&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;html &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;lang&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;=&quot;en&quot;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;head&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;    &amp;lt;meta &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;charset&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;=&quot;UTF-8&quot;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;    &amp;lt;title&amp;gt;&amp;lt;/title&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;    &amp;lt;style&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &lt;/span&gt;.&lt;span style=&quot;color:#e8bf6a;&quot;&gt;box1 &lt;/span&gt;{&lt;br /&gt;            &lt;span style=&quot;color:#bababa;&quot;&gt;padding&lt;/span&gt;: &lt;span style=&quot;color:#6897bb;&quot;&gt;40&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;px&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;margin&lt;/span&gt;: &lt;span style=&quot;color:#6897bb;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;px &lt;/span&gt;&lt;span style=&quot;color:#6897bb;&quot;&gt;10&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;px&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;background&lt;/span&gt;: &lt;span style=&quot;color:#6897bb;&quot;&gt;#F46075&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;float&lt;/span&gt;: &lt;span style=&quot;color:#a5c261;&quot;&gt;left&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;        &lt;/span&gt;}&lt;br /&gt;        .&lt;span style=&quot;color:#e8bf6a;&quot;&gt;box2 &lt;/span&gt;{&lt;br /&gt;            &lt;span style=&quot;color:#bababa;&quot;&gt;padding&lt;/span&gt;: &lt;span style=&quot;color:#6897bb;&quot;&gt;40&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;px&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;margin&lt;/span&gt;: &lt;span style=&quot;color:#6897bb;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;px &lt;/span&gt;&lt;span style=&quot;color:#6897bb;&quot;&gt;10&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;px&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;background&lt;/span&gt;: &lt;span style=&quot;color:#6897bb;&quot;&gt;#ffcc33&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;float&lt;/span&gt;: &lt;span style=&quot;color:#a5c261;&quot;&gt;left&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;        &lt;/span&gt;}&lt;br /&gt;        .&lt;span style=&quot;color:#e8bf6a;&quot;&gt;box3 &lt;/span&gt;{&lt;br /&gt;            &lt;span style=&quot;color:#bababa;&quot;&gt;padding&lt;/span&gt;: &lt;span style=&quot;color:#6897bb;&quot;&gt;40&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;px&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;margin&lt;/span&gt;: &lt;span style=&quot;color:#6897bb;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;px &lt;/span&gt;&lt;span style=&quot;color:#6897bb;&quot;&gt;10&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;px&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;background&lt;/span&gt;: &lt;span style=&quot;color:#a5c261;&quot;&gt;purple&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;float&lt;/span&gt;: &lt;span style=&quot;color:#a5c261;&quot;&gt;right&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;        &lt;/span&gt;}&lt;br /&gt;        .&lt;span style=&quot;color:#e8bf6a;&quot;&gt;plain-box &lt;/span&gt;{&lt;br /&gt;            &lt;span style=&quot;color:#bababa;&quot;&gt;padding&lt;/span&gt;: &lt;span style=&quot;color:#6897bb;&quot;&gt;20&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;px&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;margin&lt;/span&gt;: &lt;span style=&quot;color:#6897bb;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;px &lt;/span&gt;&lt;span style=&quot;color:#6897bb;&quot;&gt;10&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;px&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;background&lt;/span&gt;: &lt;span style=&quot;color:#a5c261;&quot;&gt;blue&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;        &lt;/span&gt;}&lt;br /&gt;        .&lt;span style=&quot;color:#e8bf6a;&quot;&gt;clear-box &lt;/span&gt;{&lt;br /&gt;            &lt;span style=&quot;color:#bababa;&quot;&gt;padding&lt;/span&gt;: &lt;span style=&quot;color:#6897bb;&quot;&gt;20&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;px&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;margin&lt;/span&gt;: &lt;span style=&quot;color:#6897bb;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;px &lt;/span&gt;&lt;span style=&quot;color:#6897bb;&quot;&gt;10&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;px&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;background&lt;/span&gt;: &lt;span style=&quot;color:#a5c261;&quot;&gt;crimson&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;clear&lt;/span&gt;: &lt;span style=&quot;color:#a5c261;&quot;&gt;both&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;        &lt;/span&gt;}&lt;br /&gt;    &lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/style&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/head&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;body&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;    &amp;lt;div &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;=&quot;box1&quot;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;gt;&lt;/span&gt;box1&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;    &amp;lt;div &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;=&quot;box2&quot;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;gt;&lt;/span&gt;box2&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;    &amp;lt;div &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;=&quot;box3&quot;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;gt;&lt;/span&gt;box3&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;    &amp;lt;div &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;=&quot;plain-box&quot;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;gt;&lt;/span&gt;no float&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;    &amp;lt;div &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;=&quot;clear-box&quot;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;gt;&lt;/span&gt;float removed&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/body&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 728px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/992572485DA7215718&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F992572485DA7215718&quot; width=&quot;728&quot; height=&quot;143&quot; filename=&quot;5.PNG&quot; filemime=&quot;image/jpeg&quot; style=&quot;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;style 태그에서 지정한&amp;nbsp;box1, box2, box3클래스를 보면 각각 float에 left, left,&amp;nbsp;right&amp;nbsp;속성이 들어가 있습니다. 이 클래스의 float 속성에 따라서 left&amp;nbsp;요소는 왼쪽으로 자연스럽게 위치하게 됩니다. 또한 right 요소는 자연스럽게 오른쪽에 위치하게 됩니다. (위 float 예제와 동일)&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;font face=&quot;Arial Black&quot;&gt;주목해야 할 것은 clear 속성의 여부 입니다. plain-box, clear-box 클래스를 보시면 plain-box는 clear 속성을 사용하지 않고 float 속성도 사용하지 않았기 때문에 float 속성인 요소들 밑에 가라앉게 됩니다. 반면에 clear 속성을 써서 float 속성의 영향이 미치지 않도록 한 clear-box 클래스는 밑으로 가라앉지 않고 동등한 위치를 차지하게 됩니다. (display: block과 같이 동작)&lt;/font&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>Language &amp;amp; Solution/HTML&amp;amp;CSS</category>
      <category>box-sizing</category>
      <category>clear</category>
      <category>CSS</category>
      <category>float</category>
      <author>새로비</author>
      <guid isPermaLink="true">https://engkimbs.tistory.com/920</guid>
      <comments>https://engkimbs.tistory.com/entry/HTMLCSS-box-sizing-float-clear#entry920comment</comments>
      <pubDate>Tue, 8 Oct 2019 17:55:18 +0900</pubDate>
    </item>
    <item>
      <title>[HTML&amp;amp;CSS] 마진(margin) 속성, 패딩(padding) 속성</title>
      <link>https://engkimbs.tistory.com/entry/HTMLCSS-%EB%A7%88%EC%A7%84margin-%EC%86%8D%EC%84%B1-%ED%8C%A8%EB%94%A9padding-%EC%86%8D%EC%84%B1</link>
      <description>&lt;p style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;font-size: 18pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(31, 218, 17);&quot;&gt;&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;*아래 링크를&lt;/span&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;&amp;nbsp;누르시면 HTML, CSS 코드 실행환경을 만들 수 있습니다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://engkimbs.tistory.com/802&quot; target=&quot;_blank&quot;&gt;[Language &amp;amp; Solution/Node.js] - npm과 lite-server로 HTML, CSS 실습관경 만들기&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 18pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(31, 218, 17);&quot;&gt;|&lt;/span&gt; 마진(margin)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;마진(margin)은 요소 주변 여백을 뜻합니다. 마진의 크기를 조절함으로서 다른 요소 사이에 간격을 남겨 유저 친화적인 UI를 구사할 수 있죠.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 239px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/990698345D9F3C9002&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F990698345D9F3C9002&quot; width=&quot;239&quot; height=&quot;218&quot; filename=&quot;마진.jpg&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;마진 속성에는 margin-top, margin-right, margin-bottom, margin-left가 있습니다. 이름에서 알 수 있듯 위, 오른쪽, 아래쪽, 왼쪽 여백들을 가리키는 속성들이며 이를 한 번에 표기할 수 있는 margin이란 속성도 있습니다. 사용법은 다음과 같습니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;; background-color: rgb(140, 252, 203); color: rgb(0, 0, 0);&quot;&gt;margin&amp;nbsp;: &amp;lt;크기&amp;gt; | &amp;lt;백분율&amp;gt; | auto&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;; background-color: rgb(140, 252, 203); color: rgb(0, 0, 0);&quot;&gt;margin-top : &amp;lt;크기&amp;gt; | &amp;lt;백분율&amp;gt; | auto&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;; background-color: rgb(140, 252, 203); color: rgb(0, 0, 0);&quot;&gt;margin-right&amp;nbsp;: &amp;lt;크기&amp;gt; | &amp;lt;백분율&amp;gt; | auto&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;; background-color: rgb(140, 252, 203); color: rgb(0, 0, 0);&quot;&gt;margin-bottom&amp;nbsp;: &amp;lt;크기&amp;gt; | &amp;lt;백분율&amp;gt; | auto&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;; background-color: rgb(140, 252, 203); color: rgb(0, 0, 0);&quot;&gt;margin-left&amp;nbsp;: &amp;lt;크기&amp;gt; | &amp;lt;백분율&amp;gt; | auto&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;table class=&quot;txc-table&quot; width=&quot;692&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; border=&quot;0&quot; style=&quot;border:none;border-collapse:collapse;;font-family:&quot; 맑은=&quot;&quot; 고딕&quot;,=&quot;&quot; sans-serif;font-size:16px&quot;=&quot;&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;width: 113px; height: 24px; border-width: 1px; border-style: solid; border-color: rgb(204, 204, 204); background-color: rgb(217, 229, 255);&quot;&gt;&lt;p&gt;&lt;b&gt;&amp;nbsp;크기&lt;/b&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td style=&quot;width: 578px; height: 24px; border-bottom: 1px solid rgb(204, 204, 204); border-right: 1px solid rgb(204, 204, 204); border-top: 1px solid rgb(204, 204, 204);&quot;&gt;&lt;p&gt;&amp;nbsp;px 혹은 cm 단위와 함께 수치 지정&amp;nbsp;&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td style=&quot;width: 113px; height: 24px; border-bottom: 1px solid rgb(204, 204, 204); border-right: 1px solid rgb(204, 204, 204); border-left: 1px solid rgb(204, 204, 204); background-color: rgb(217, 229, 255);&quot;&gt;&lt;p&gt;&lt;b&gt;&amp;nbsp;백분율&amp;nbsp;&lt;/b&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td style=&quot;width: 578px; height: 24px; border-bottom: 1px solid rgb(204, 204, 204); border-right: 1px solid rgb(204, 204, 204);&quot;&gt;&lt;p&gt;&amp;nbsp;박스 모델을 포함한 부모 요소를 기준으로 % 지정&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td style=&quot;width: 113px; height: 24px; border-bottom: 1px solid rgb(204, 204, 204); border-right: 1px solid rgb(204, 204, 204); border-left: 1px solid rgb(204, 204, 204); background-color: rgb(217, 229, 255);&quot;&gt;&lt;p&gt;&lt;b&gt;&amp;nbsp;auto&lt;/b&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td style=&quot;width: 578px; height: 24px; border-bottom: 1px solid rgb(204, 204, 204); border-right: 1px solid rgb(204, 204, 204);&quot;&gt;&lt;p&gt;&amp;nbsp;display 속성에서 지정한 값에 맞게 자동으로 크기 조절&amp;nbsp;&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b style=&quot;font-size: 24px;&quot;&gt;&lt;span style=&quot;color: rgb(31, 218, 17);&quot;&gt;|&lt;/span&gt;&amp;nbsp;마진(margin) 예제&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;&lt;pre style=&quot;background-color:#2b2b2b;color:#a9b7c6;font-family:'굴림체';font-size:9.0pt;&quot;&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;!DOCTYPE &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;html&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;html &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;lang&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;=&quot;en&quot;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;head&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;    &amp;lt;meta &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;charset&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;=&quot;UTF-8&quot;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;    &amp;lt;title&amp;gt;&amp;lt;/title&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;    &amp;lt;style&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;div &lt;/span&gt;{&lt;br /&gt;            &lt;span style=&quot;color:#bababa;&quot;&gt;width&lt;/span&gt;: &lt;span style=&quot;color:#6897bb;&quot;&gt;200&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;px&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;height&lt;/span&gt;: &lt;span style=&quot;color:#6897bb;&quot;&gt;100&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;px&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;background&lt;/span&gt;: &lt;span style=&quot;color:#6897bb;&quot;&gt;#ffbc8a&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;        &lt;/span&gt;}&lt;br /&gt;        .&lt;span style=&quot;color:#e8bf6a;&quot;&gt;box1 &lt;/span&gt;{ &lt;span style=&quot;color:#bababa;&quot;&gt;margin&lt;/span&gt;: &lt;span style=&quot;color:#6897bb;&quot;&gt;30&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;px &lt;/span&gt;&lt;span style=&quot;color:#6897bb;&quot;&gt;50&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;px &lt;/span&gt;&lt;span style=&quot;color:#6897bb;&quot;&gt;30&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;px &lt;/span&gt;&lt;span style=&quot;color:#6897bb;&quot;&gt;50&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;px&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;/span&gt;}&lt;br /&gt;        .&lt;span style=&quot;color:#e8bf6a;&quot;&gt;box2 &lt;/span&gt;{ &lt;span style=&quot;color:#bababa;&quot;&gt;margin&lt;/span&gt;: &lt;span style=&quot;color:#6897bb;&quot;&gt;30&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;px &lt;/span&gt;&lt;span style=&quot;color:#6897bb;&quot;&gt;50&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;px&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;/span&gt;}&lt;br /&gt;        .&lt;span style=&quot;color:#e8bf6a;&quot;&gt;box3 &lt;/span&gt;{ &lt;span style=&quot;color:#bababa;&quot;&gt;margin&lt;/span&gt;: &lt;span style=&quot;color:#6897bb;&quot;&gt;50&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;px&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;/span&gt;}&lt;br /&gt;        .&lt;span style=&quot;color:#e8bf6a;&quot;&gt;box4 &lt;/span&gt;{ &lt;span style=&quot;color:#bababa;&quot;&gt;margin&lt;/span&gt;: &lt;span style=&quot;color:#6897bb;&quot;&gt;30&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;px &lt;/span&gt;&lt;span style=&quot;color:#6897bb;&quot;&gt;5&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;px &lt;/span&gt;&lt;span style=&quot;color:#6897bb;&quot;&gt;10&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;px&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;/span&gt;}&lt;br /&gt;        .&lt;span style=&quot;color:#e8bf6a;&quot;&gt;box-auto &lt;/span&gt;{&lt;br /&gt;            &lt;span style=&quot;color:#bababa;&quot;&gt;margin&lt;/span&gt;:&lt;span style=&quot;color:#6897bb;&quot;&gt;0 &lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;auto&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;  &lt;/span&gt;&lt;span style=&quot;color:#808080;&quot;&gt;/* 너비 값을 뺀 나머지 공간의 좌우 마진을 똑같이 맞춥니다. */&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#808080;&quot;&gt;        &lt;/span&gt;}&lt;br /&gt;    &lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/style&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/head&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;body&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;div &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;=&quot;box1&quot;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;div &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;=&quot;box2&quot;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;div &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;=&quot;box3&quot;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;div &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;=&quot;box4&quot;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;div &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;=&quot;box-auto&quot;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/body&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 654px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/9903203B5D9F3DD106&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F9903203B5D9F3DD106&quot; width=&quot;654&quot; height=&quot;655&quot; filename=&quot;1.jpg&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 18pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(31, 218, 17);&quot;&gt;|&lt;/span&gt; 패딩(padding)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;패딩(padding)은 콘텐츠 영역과 테두리 사이의 여백입니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 239px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/99DA3F335D9F3D432E&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F99DA3F335D9F3D432E&quot; width=&quot;239&quot; height=&quot;218&quot; filename=&quot;패딩.jpg&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;패딩과 관련된 css속성에는 padding-top, padding-right, padding-bottom, padding-left, padding 있으며 각각 위, 오른쪽, 아래, 왼쪽, 네 방향 패딩을 한꺼번에 지정할 수 있습니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;패딩을 사용하는 방법은 margin과 같으므로 여기서는 생략하도록 하겠습니&lt;/span&gt;다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b style=&quot;font-size: 24px;&quot;&gt;&lt;span style=&quot;color: rgb(31, 218, 17);&quot;&gt;|&lt;/span&gt;&amp;nbsp;패딩(padding) 예제&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;pre style=&quot;background-color:#2b2b2b;color:#a9b7c6;font-family:'Source Code Pro';font-size:9.8pt;&quot;&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;!DOCTYPE &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;html&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;html &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;lang&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;=&quot;en&quot;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;head&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;    &amp;lt;meta &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;charset&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;=&quot;UTF-8&quot;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;    &amp;lt;title&amp;gt;&amp;lt;/title&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;    &amp;lt;style&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;div &lt;/span&gt;{&lt;br /&gt;            &lt;span style=&quot;color:#bababa;&quot;&gt;width&lt;/span&gt;: &lt;span style=&quot;color:#6897bb;&quot;&gt;200&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;px&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;height&lt;/span&gt;: &lt;span style=&quot;color:#6897bb;&quot;&gt;100&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;px&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;background&lt;/span&gt;: &lt;span style=&quot;color:#6897bb;&quot;&gt;#ffbc8a&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;margin&lt;/span&gt;: &lt;span style=&quot;color:#6897bb;&quot;&gt;20&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;px&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;color&lt;/span&gt;: &lt;span style=&quot;color:#6897bb;&quot;&gt;#F46075&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;        &lt;/span&gt;}&lt;br /&gt;        .&lt;span style=&quot;color:#e8bf6a;&quot;&gt;box1 &lt;/span&gt;{ &lt;span style=&quot;color:#bababa;&quot;&gt;padding&lt;/span&gt;: &lt;span style=&quot;color:#6897bb;&quot;&gt;10&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;px &lt;/span&gt;&lt;span style=&quot;color:#6897bb;&quot;&gt;30&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;px &lt;/span&gt;&lt;span style=&quot;color:#6897bb;&quot;&gt;10&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;px &lt;/span&gt;&lt;span style=&quot;color:#6897bb;&quot;&gt;30&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;px&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;/span&gt;}&lt;br /&gt;        .&lt;span style=&quot;color:#e8bf6a;&quot;&gt;box2 &lt;/span&gt;{ &lt;span style=&quot;color:#bababa;&quot;&gt;padding&lt;/span&gt;: &lt;span style=&quot;color:#6897bb;&quot;&gt;30&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;px &lt;/span&gt;&lt;span style=&quot;color:#6897bb;&quot;&gt;50&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;px&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;/span&gt;}&lt;br /&gt;        .&lt;span style=&quot;color:#e8bf6a;&quot;&gt;box3 &lt;/span&gt;{ &lt;span style=&quot;color:#bababa;&quot;&gt;padding&lt;/span&gt;: &lt;span style=&quot;color:#6897bb;&quot;&gt;50&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;px&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;/span&gt;}&lt;br /&gt;    &lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/style&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/head&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;body&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;    &amp;lt;div &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;=&quot;box1&quot;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &lt;/span&gt;&lt;span style=&quot;font-family:'Arial Unicode MS';&quot;&gt;패딩의 여백&lt;/span&gt;1&lt;br /&gt;    &lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;    &amp;lt;div &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;=&quot;box2&quot;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &lt;/span&gt;&lt;span style=&quot;font-family:'Arial Unicode MS';&quot;&gt;패딩의 여백&lt;/span&gt;2&lt;br /&gt;    &lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;    &amp;lt;div &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;=&quot;box3&quot;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &lt;/span&gt;&lt;span style=&quot;font-family:'Arial Unicode MS';&quot;&gt;패딩의 여백&lt;/span&gt;3&lt;br /&gt;    &lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/body&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 356px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/997C1D365D9F3D7C2C&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F997C1D365D9F3D7C2C&quot; width=&quot;356&quot; height=&quot;560&quot; filename=&quot;1.jpg&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>Language &amp;amp; Solution/HTML&amp;amp;CSS</category>
      <category>CSS</category>
      <category>margin</category>
      <category>padding</category>
      <author>새로비</author>
      <guid isPermaLink="true">https://engkimbs.tistory.com/919</guid>
      <comments>https://engkimbs.tistory.com/entry/HTMLCSS-%EB%A7%88%EC%A7%84margin-%EC%86%8D%EC%84%B1-%ED%8C%A8%EB%94%A9padding-%EC%86%8D%EC%84%B1#entry919comment</comments>
      <pubDate>Tue, 8 Oct 2019 16:50:37 +0900</pubDate>
    </item>
    <item>
      <title>[HTML&amp;amp;CSS] 콘텐츠(content) 영역</title>
      <link>https://engkimbs.tistory.com/entry/HTMLCSS-%EC%BD%98%ED%85%90%EC%B8%A0content-%EC%98%81%EC%97%AD</link>
      <description>&lt;p style=&quot;box-sizing: border-box; color: rgb(51, 51, 51); font-family: &amp;quot;Malgun Gothic&amp;quot;, sans-serif; font-size: 15px; letter-spacing: -0.4px;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;; font-size: 18pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(31, 218, 17);&quot;&gt;|&lt;/span&gt; 콘텐츠 영역&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; color: rgb(51, 51, 51); font-family: &amp;quot;Malgun Gothic&amp;quot;, sans-serif; font-size: 15px; letter-spacing: -0.4px;&quot;&gt;&lt;br style=&quot;box-sizing: border-box;&quot;&gt;&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; color: rgb(51, 51, 51); font-family: &amp;quot;Malgun Gothic&amp;quot;, sans-serif; font-size: 15px; letter-spacing: -0.4px;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;콘텐츠 영역(content area)은 콘텐츠 경계(content edge)가 감싼 영역으로 텍스트, 이미지, 비디오 등 실제 내용을 포함하는 부분입니다. 콘텐츠 영역의 크기는 콘텐츠 너비 및 콘텐츠 높이로 결정되며 width와 height 속성으로 설정할 수 있습니다.&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; color: rgb(51, 51, 51); font-family: &amp;quot;Malgun Gothic&amp;quot;, sans-serif; font-size: 15px; letter-spacing: -0.4px;&quot;&gt;&lt;br style=&quot;box-sizing: border-box;&quot;&gt;&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; color: rgb(51, 51, 51); font-family: &amp;quot;Malgun Gothic&amp;quot;, sans-serif; font-size: 15px; letter-spacing: -0.4px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;&lt;span style=&quot;background-color: rgb(140, 252, 203); color: rgb(0, 0, 0);&quot;&gt;&lt;/span&gt;&lt;span style=&quot;background-color: rgb(140, 252, 203); color: rgb(0, 0, 0);&quot;&gt;width: &amp;lt;크기&amp;gt; | &amp;lt;백분율&amp;gt; | auto&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; color: rgb(51, 51, 51); font-family: &amp;quot;Malgun Gothic&amp;quot;, sans-serif; font-size: 15px; letter-spacing: -0.4px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;; background-color: rgb(140, 252, 203); color: rgb(0, 0, 0);&quot;&gt;height: &amp;lt;크기&amp;gt; | &amp;lt;백분율&amp;gt; | auto&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; color: rgb(51, 51, 51); font-family: &amp;quot;Malgun Gothic&amp;quot;, sans-serif; font-size: 15px; letter-spacing: -0.4px; text-align: center;&quot;&gt;&lt;br style=&quot;box-sizing: border-box;&quot;&gt;&lt;/p&gt;&lt;ul style=&quot;list-style-type: disc;&quot;&gt;&lt;li&gt;&lt;p style=&quot;box-sizing: border-box; color: rgb(51, 51, 51); font-family: &amp;quot;Malgun Gothic&amp;quot;, sans-serif; font-size: 15px; letter-spacing: -0.4px;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;&amp;lt;크기&amp;gt; : px이나 cm 같은 단위로 지정합니다.&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&quot;box-sizing: border-box; color: rgb(51, 51, 51); font-family: &amp;quot;Malgun Gothic&amp;quot;, sans-serif; font-size: 15px; letter-spacing: -0.4px;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;&amp;lt;백분율&amp;gt; : 박스모델을 포함하는 부모 요소 기준으로 너비나 높이값을 백분율로 지정합니다. (부모가 없을 때는 viewport 기준)&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&quot;box-sizing: border-box; color: rgb(51, 51, 51); font-family: &amp;quot;Malgun Gothic&amp;quot;, sans-serif; font-size: 15px; letter-spacing: -0.4px;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;auto : 박스모델의 크기가 콘텐츠 양에 따라 자동으로 결정됩니다. (기본값)&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;font color=&quot;#333333&quot; face=&quot;Arial Black&quot;&gt;&lt;span style=&quot;font-size: 15px; letter-spacing: -0.4px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/font&gt;&lt;/div&gt;&lt;div&gt;&lt;font color=&quot;#333333&quot; face=&quot;Arial Black&quot;&gt;&lt;span style=&quot;font-size: 15px; letter-spacing: -0.4px;&quot;&gt;&lt;/span&gt;&lt;/font&gt;&lt;font color=&quot;#333333&quot; face=&quot;Arial Black&quot;&gt;&lt;span style=&quot;font-size: 15px; letter-spacing: -0.4px;&quot;&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 197px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/99C5DD485DA87D8523&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F99C5DD485DA87D8523&quot; width=&quot;197&quot; height=&quot;176&quot; filename=&quot;4444.PNG&quot; filemime=&quot;image/jpeg&quot; style=&quot;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/div&gt;&lt;p style=&quot;box-sizing: border-box; color: rgb(51, 51, 51); font-family: &amp;quot;Malgun Gothic&amp;quot;, sans-serif; font-size: 15px; letter-spacing: -0.4px;&quot;&gt;&lt;br style=&quot;box-sizing: border-box;&quot;&gt;&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; color: rgb(51, 51, 51); font-family: &amp;quot;Malgun Gothic&amp;quot;, sans-serif; font-size: 15px; letter-spacing: -0.4px;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;참고로 CSS 박스 모델의 width 속성은 콘텐츠 영역의 너비를 말합니다. 이때 콘텐츠 영역를 계산하는 방식은 어떤 &lt;u&gt;box-sizing 속성에 어떤 값을 넣었느냐&lt;/u&gt;에 따라 다릅니다. (box-sizing에 관한 것은 아래 링크를&amp;nbsp;참조)&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; color: rgb(51, 51, 51); font-family: &amp;quot;Malgun Gothic&amp;quot;, sans-serif; font-size: 15px; letter-spacing: -0.4px;&quot;&gt;&lt;br style=&quot;box-sizing: border-box;&quot;&gt;&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; color: rgb(51, 51, 51); font-family: &amp;quot;Malgun Gothic&amp;quot;, sans-serif; font-size: 15px; letter-spacing: -0.4px; text-align: center;&quot;&gt;&lt;a href=&quot;https://engkimbs.tistory.com/920&quot; target=&quot;_blank&quot;&gt;[Language &amp;amp; Solution/HTML&amp;amp;CSS] - [HTML&amp;amp;CSS] box-sizing, float, clear&lt;/a&gt;&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; color: rgb(51, 51, 51); font-family: &amp;quot;Malgun Gothic&amp;quot;, sans-serif; font-size: 15px; letter-spacing: -0.4px;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; color: rgb(51, 51, 51); font-family: &amp;quot;Malgun Gothic&amp;quot;, sans-serif; font-size: 15px; letter-spacing: -0.4px;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; color: rgb(51, 51, 51); font-family: &amp;quot;Malgun Gothic&amp;quot;, sans-serif; font-size: 15px; letter-spacing: -0.4px;&quot;&gt;&lt;b style=&quot;font-family: &amp;quot;Arial Black&amp;quot;; font-size: 24px; letter-spacing: -0.4px;&quot;&gt;&lt;span style=&quot;color: rgb(31, 218, 17);&quot;&gt;|&lt;/span&gt;&amp;nbsp;콘텐츠 영역 예제&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; color: rgb(51, 51, 51); font-family: &amp;quot;Malgun Gothic&amp;quot;, sans-serif; font-size: 15px; letter-spacing: -0.4px;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;pre style=&quot;box-sizing: border-box; overflow: auto; font-family: &amp;quot;Source Code Pro&amp;quot;; font-size: 9.8pt; padding: 5px 10px; background-color: rgb(43, 43, 43); white-space: pre-wrap; letter-spacing: -0.4px; color: rgb(169, 183, 198);&quot;&gt;&lt;span style=&quot;box-sizing: border-box; color: rgb(232, 191, 106);&quot;&gt;&amp;lt;!DOCTYPE &lt;/span&gt;&lt;span style=&quot;box-sizing: border-box; color: rgb(186, 186, 186);&quot;&gt;html&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box; color: rgb(232, 191, 106);&quot;&gt;&amp;gt;&lt;br style=&quot;box-sizing: border-box;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box; color: rgb(232, 191, 106);&quot;&gt;&amp;lt;html &lt;/span&gt;&lt;span style=&quot;box-sizing: border-box; color: rgb(186, 186, 186);&quot;&gt;lang&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box; color: rgb(165, 194, 97);&quot;&gt;=&quot;en&quot;&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box; color: rgb(232, 191, 106);&quot;&gt;&amp;gt;&lt;br style=&quot;box-sizing: border-box;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box; color: rgb(232, 191, 106);&quot;&gt;&amp;lt;head&amp;gt;&lt;br style=&quot;box-sizing: border-box;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box; color: rgb(232, 191, 106);&quot;&gt;    &amp;lt;meta &lt;/span&gt;&lt;span style=&quot;box-sizing: border-box; color: rgb(186, 186, 186);&quot;&gt;charset&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box; color: rgb(165, 194, 97);&quot;&gt;=&quot;UTF-8&quot;&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box; color: rgb(232, 191, 106);&quot;&gt;&amp;gt;&lt;br style=&quot;box-sizing: border-box;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box; color: rgb(232, 191, 106);&quot;&gt;    &amp;lt;title&amp;gt;&lt;/span&gt;CSS &lt;span style=&quot;box-sizing: border-box; font-family: &amp;quot;Arial Unicode MS&amp;quot;;&quot;&gt;우선순위&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box; color: rgb(232, 191, 106);&quot;&gt;&amp;lt;/title&amp;gt;&lt;br style=&quot;box-sizing: border-box;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box; color: rgb(232, 191, 106);&quot;&gt;    &amp;lt;style&amp;gt;&lt;br style=&quot;box-sizing: border-box;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box; color: rgb(232, 191, 106);&quot;&gt;        &lt;/span&gt;.&lt;span style=&quot;box-sizing: border-box; color: rgb(232, 191, 106);&quot;&gt;box1 &lt;/span&gt;{&lt;br style=&quot;box-sizing: border-box;&quot;&gt;            &lt;span style=&quot;box-sizing: border-box; color: rgb(186, 186, 186);&quot;&gt;width&lt;/span&gt;: &lt;span style=&quot;box-sizing: border-box; color: rgb(104, 151, 187);&quot;&gt;200&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box; color: rgb(165, 194, 97);&quot;&gt;px&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box; color: rgb(204, 120, 50);&quot;&gt;;&lt;br style=&quot;box-sizing: border-box;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box; color: rgb(204, 120, 50);&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;box-sizing: border-box; color: rgb(186, 186, 186);&quot;&gt;height&lt;/span&gt;: &lt;span style=&quot;box-sizing: border-box; color: rgb(104, 151, 187);&quot;&gt;100&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box; color: rgb(165, 194, 97);&quot;&gt;px&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box; color: rgb(204, 120, 50);&quot;&gt;;&lt;br style=&quot;box-sizing: border-box;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box; color: rgb(204, 120, 50);&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;box-sizing: border-box; color: rgb(186, 186, 186);&quot;&gt;background&lt;/span&gt;: &lt;span style=&quot;box-sizing: border-box; color: rgb(104, 151, 187);&quot;&gt;#ff362f&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box; color: rgb(204, 120, 50);&quot;&gt;;&lt;br style=&quot;box-sizing: border-box;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box; color: rgb(204, 120, 50);&quot;&gt;        &lt;/span&gt;}&lt;br style=&quot;box-sizing: border-box;&quot;&gt;        .&lt;span style=&quot;box-sizing: border-box; color: rgb(232, 191, 106);&quot;&gt;box2 &lt;/span&gt;{&lt;br style=&quot;box-sizing: border-box;&quot;&gt;            &lt;span style=&quot;box-sizing: border-box; color: rgb(186, 186, 186);&quot;&gt;width&lt;/span&gt;: &lt;span style=&quot;box-sizing: border-box; color: rgb(104, 151, 187);&quot;&gt;50&lt;/span&gt;%&lt;span style=&quot;box-sizing: border-box; color: rgb(204, 120, 50);&quot;&gt;;&lt;br style=&quot;box-sizing: border-box;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box; color: rgb(204, 120, 50);&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;box-sizing: border-box; color: rgb(186, 186, 186);&quot;&gt;height&lt;/span&gt;: &lt;span style=&quot;box-sizing: border-box; color: rgb(104, 151, 187);&quot;&gt;100&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box; color: rgb(165, 194, 97);&quot;&gt;px&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box; color: rgb(204, 120, 50);&quot;&gt;;&lt;br style=&quot;box-sizing: border-box;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box; color: rgb(204, 120, 50);&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;box-sizing: border-box; color: rgb(186, 186, 186);&quot;&gt;background&lt;/span&gt;: &lt;span style=&quot;box-sizing: border-box; color: rgb(104, 151, 187);&quot;&gt;#0041ff&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box; color: rgb(204, 120, 50);&quot;&gt;;&lt;br style=&quot;box-sizing: border-box;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box; color: rgb(204, 120, 50);&quot;&gt;        &lt;/span&gt;}&lt;br style=&quot;box-sizing: border-box;&quot;&gt;        &lt;span style=&quot;box-sizing: border-box; color: rgb(204, 120, 50);&quot;&gt;div &lt;/span&gt;{&lt;br style=&quot;box-sizing: border-box;&quot;&gt;            &lt;span style=&quot;box-sizing: border-box; color: rgb(186, 186, 186);&quot;&gt;margin&lt;/span&gt;: &lt;span style=&quot;box-sizing: border-box; color: rgb(104, 151, 187);&quot;&gt;10&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box; color: rgb(165, 194, 97);&quot;&gt;px&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box; color: rgb(204, 120, 50);&quot;&gt;;&lt;br style=&quot;box-sizing: border-box;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box; color: rgb(204, 120, 50);&quot;&gt;        &lt;/span&gt;}&lt;br style=&quot;box-sizing: border-box;&quot;&gt;    &lt;span style=&quot;box-sizing: border-box; color: rgb(232, 191, 106);&quot;&gt;&amp;lt;/style&amp;gt;&lt;br style=&quot;box-sizing: border-box;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box; color: rgb(232, 191, 106);&quot;&gt;&amp;lt;/head&amp;gt;&lt;br style=&quot;box-sizing: border-box;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box; color: rgb(232, 191, 106);&quot;&gt;&amp;lt;body&amp;gt;&lt;br style=&quot;box-sizing: border-box;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box; color: rgb(232, 191, 106);&quot;&gt;    &amp;lt;div &lt;/span&gt;&lt;span style=&quot;box-sizing: border-box; color: rgb(186, 186, 186);&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box; color: rgb(165, 194, 97);&quot;&gt;=&quot;box1&quot;&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box; color: rgb(232, 191, 106);&quot;&gt;&amp;gt;&amp;lt;/div&amp;gt;&lt;br style=&quot;box-sizing: border-box;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box; color: rgb(232, 191, 106);&quot;&gt;    &amp;lt;div &lt;/span&gt;&lt;span style=&quot;box-sizing: border-box; color: rgb(186, 186, 186);&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box; color: rgb(165, 194, 97);&quot;&gt;=&quot;box2&quot;&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box; color: rgb(232, 191, 106);&quot;&gt;&amp;gt;&amp;lt;/div&amp;gt;&lt;br style=&quot;box-sizing: border-box;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box; color: rgb(232, 191, 106);&quot;&gt;&amp;lt;/body&amp;gt;&lt;br style=&quot;box-sizing: border-box;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box; color: rgb(232, 191, 106);&quot;&gt;&amp;lt;/html&amp;gt;&lt;br style=&quot;box-sizing: border-box;&quot;&gt;&lt;/span&gt;&lt;/pre&gt;&lt;p style=&quot;box-sizing: border-box; color: rgb(51, 51, 51); font-family: &amp;quot;Malgun Gothic&amp;quot;, sans-serif; font-size: 15px; letter-spacing: -0.4px;&quot;&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 500px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/99E9AD435DA87E2022&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F99E9AD435DA87E2022&quot; width=&quot;500&quot; height=&quot;228&quot; filename=&quot;444.PNG&quot; filemime=&quot;image/jpeg&quot; style=&quot;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br style=&quot;box-sizing: border-box; color: rgb(51, 51, 51); font-family: &amp;quot;Malgun Gothic&amp;quot;, sans-serif; font-size: 15px; letter-spacing: -0.4px;&quot;&gt;&lt;br style=&quot;box-sizing: border-box; color: rgb(51, 51, 51); font-family: &amp;quot;Malgun Gothic&amp;quot;, sans-serif; font-size: 15px; letter-spacing: -0.4px;&quot;&gt;&lt;span style=&quot;color: rgb(51, 51, 51); font-family: &amp;quot;Malgun Gothic&amp;quot;, sans-serif; font-size: 15px; letter-spacing: -0.4px;&quot;&gt;출처:&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://engkimbs.tistory.com/914&quot; style=&quot;box-sizing: border-box; background-color: transparent; color: rgb(51, 122, 183); transition: all 0.12s ease-in 0s; font-family: &amp;quot;Malgun Gothic&amp;quot;, sans-serif; font-size: 15px; letter-spacing: -0.4px;&quot;&gt;https://engkimbs.tistory.com/914&lt;/a&gt;&lt;span style=&quot;color: rgb(51, 51, 51); font-family: &amp;quot;Malgun Gothic&amp;quot;, sans-serif; font-size: 15px; letter-spacing: -0.4px;&quot;&gt;&amp;nbsp;[새로비 지식 저장소]&lt;/span&gt;&lt;/p&gt;</description>
      <category>Language &amp;amp; Solution/HTML&amp;amp;CSS</category>
      <category>content</category>
      <category>CSS</category>
      <category>콘텐츠</category>
      <author>새로비</author>
      <guid isPermaLink="true">https://engkimbs.tistory.com/918</guid>
      <comments>https://engkimbs.tistory.com/entry/HTMLCSS-%EC%BD%98%ED%85%90%EC%B8%A0content-%EC%98%81%EC%97%AD#entry918comment</comments>
      <pubDate>Mon, 7 Oct 2019 21:38:10 +0900</pubDate>
    </item>
    <item>
      <title>[HTML&amp;amp;CSS] 테두리(border) 영역</title>
      <link>https://engkimbs.tistory.com/entry/HTMLCSS-%ED%85%8C%EB%91%90%EB%A6%ACborder-%EC%98%81%EC%97%AD</link>
      <description>&lt;p style=&quot;line-height: 2;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;*현 포스팅의 HTML 코드의 실행환경을 만들고 싶으신 분들은 아래 포스팅을 참고하시면 좋을 것 같습니다.&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;line-height: 2;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;line-height: 2; text-align: center;&quot;&gt;&lt;a href=&quot;https://engkimbs.tistory.com/802&quot; target=&quot;_blank&quot;&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;[Language &amp;amp; Solution/Node.js] - npm과 lite-server로 HTML, CSS 실습관경 만들기&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 18pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(31, 218, 17);&quot;&gt;| &lt;/span&gt;테두리(border) 영역&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;박스 모델(box model)에서 테두리는 텍스트 단락 뿐만 아니라 그림이나 표, 양식 등 사각 형태를 가진 어떤 요소에나 적용할 수 있습니다. 테두리와 관련된 속성에는 테두리 두께, 테두리 스타일, 테두리 색상 등이 있습니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 18pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(31, 218, 17);&quot;&gt;|&lt;/span&gt; border-style : 테두리 스타일&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;border-style은 테두리의 스타일을 정하는 속성으로 쓰이며 다음과 같은 값을 지정할 수 있습니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;table class=&quot;txc-table&quot; width=&quot;692&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; border=&quot;0&quot; style=&quot;border:none;border-collapse:collapse;;font-family:&quot; 맑은=&quot;&quot; 고딕&quot;,=&quot;&quot; sans-serif;font-size:16px&quot;=&quot;&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;width: 72px; height: 24px; border-width: 1px; border-style: solid; border-color: rgb(204, 204, 204); background-color: rgb(225, 233, 244);&quot;&gt;&lt;p&gt;&lt;b&gt;&amp;nbsp;none&lt;/b&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td style=&quot;width: 619px; height: 24px; border-bottom: 1px solid rgb(204, 204, 204); border-right: 1px solid rgb(204, 204, 204); border-top: 1px solid rgb(204, 204, 204);&quot;&gt;&lt;p&gt;&amp;nbsp;테두리가 나타나지 않습니다. (기본값)&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td style=&quot;width: 72px; height: 24px; border-bottom: 1px solid rgb(204, 204, 204); border-right: 1px solid rgb(204, 204, 204); border-left: 1px solid rgb(204, 204, 204); background-color: rgb(225, 233, 244);&quot;&gt;&lt;p&gt;&lt;b&gt;&amp;nbsp;hidden&lt;/b&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td style=&quot;width: 619px; height: 24px; border-bottom: 1px solid rgb(204, 204, 204); border-right: 1px solid rgb(204, 204, 204);&quot;&gt;&lt;p&gt;&amp;nbsp;테두리가 나타나지 않습니다. none과 같다고 보시면 됩니다.&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td style=&quot;width: 72px; height: 24px; border-bottom: 1px solid rgb(204, 204, 204); border-right: 1px solid rgb(204, 204, 204); border-left: 1px solid rgb(204, 204, 204); background-color: rgb(225, 233, 244);&quot;&gt;&lt;p&gt;&lt;b&gt;&amp;nbsp;dashed&lt;/b&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td style=&quot;width: 619px; height: 24px; border-bottom: 1px solid rgb(204, 204, 204); border-right: 1px solid rgb(204, 204, 204);&quot;&gt;&lt;p&gt;&amp;nbsp;테두리를 짧은선으로 표시합니다.&amp;nbsp;&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td style=&quot;width: 72px; height: 24px; border-bottom: 1px solid rgb(204, 204, 204); border-right: 1px solid rgb(204, 204, 204); border-left: 1px solid rgb(204, 204, 204); background-color: rgb(225, 233, 244);&quot;&gt;&lt;p&gt;&lt;b&gt;&amp;nbsp;dotted&lt;/b&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td style=&quot;width: 619px; height: 24px; border-bottom: 1px solid rgb(204, 204, 204); border-right: 1px solid rgb(204, 204, 204);&quot;&gt;&lt;p&gt;&amp;nbsp;테두리를 점선으로 표시합니다.&amp;nbsp;&amp;nbsp;&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td style=&quot;width: 72px; height: 24px; border-bottom: 1px solid rgb(204, 204, 204); border-right: 1px solid rgb(204, 204, 204); border-left: 1px solid rgb(204, 204, 204); background-color: rgb(225, 233, 244);&quot;&gt;&lt;p&gt;&lt;b&gt;&amp;nbsp;double&lt;/b&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td style=&quot;width: 619px; height: 24px; border-bottom: 1px solid rgb(204, 204, 204); border-right: 1px solid rgb(204, 204, 204);&quot;&gt;&lt;p&gt;&amp;nbsp;테두리를 겹선으로 표시합니다. 두 선 사이의 간격은 border-width로 정합니다.&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td style=&quot;width: 72px; height: 24px; border-bottom: 1px solid rgb(204, 204, 204); border-right: 1px solid rgb(204, 204, 204); border-left: 1px solid rgb(204, 204, 204); background-color: rgb(225, 233, 244);&quot;&gt;&lt;p&gt;&lt;b&gt;&amp;nbsp;groove&lt;/b&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td style=&quot;width: 619px; height: 24px; border-bottom: 1px solid rgb(204, 204, 204); border-right: 1px solid rgb(204, 204, 204);&quot;&gt;&lt;p&gt;&amp;nbsp;테두리를 창에 조각한 것처럼 표시합니다.&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td style=&quot;width: 72px; height: 24px; border-bottom: 1px solid rgb(204, 204, 204); border-right: 1px solid rgb(204, 204, 204); border-left: 1px solid rgb(204, 204, 204); background-color: rgb(225, 233, 244);&quot;&gt;&lt;p&gt;&lt;b&gt;&amp;nbsp;inset&lt;/b&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td style=&quot;width: 619px; height: 24px; border-bottom: 1px solid rgb(204, 204, 204); border-right: 1px solid rgb(204, 204, 204);&quot;&gt;&lt;p&gt;&amp;nbsp;테두리를 창에 박혀 있는 것처럼 표시합니다. (좌측 음영)&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td style=&quot;width: 72px; height: 24px; border-bottom: 1px solid rgb(204, 204, 204); border-right: 1px solid rgb(204, 204, 204); border-left: 1px solid rgb(204, 204, 204); background-color: rgb(225, 233, 244);&quot;&gt;&lt;p&gt;&lt;b&gt;&amp;nbsp;outset&lt;/b&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td style=&quot;width: 619px; height: 24px; border-bottom: 1px solid rgb(204, 204, 204); border-right: 1px solid rgb(204, 204, 204);&quot;&gt;&lt;p&gt;&amp;nbsp;테두리를 창에 박혀 있는 것처럼 표시합니다. (우측 음영)&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td style=&quot;width: 72px; height: 24px; border-bottom: 1px solid rgb(204, 204, 204); border-right: 1px solid rgb(204, 204, 204); border-left: 1px solid rgb(204, 204, 204); background-color: rgb(225, 233, 244);&quot;&gt;&lt;p&gt;&lt;b&gt;&amp;nbsp;ridge&lt;/b&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td style=&quot;width: 619px; height: 24px; border-bottom: 1px solid rgb(204, 204, 204); border-right: 1px solid rgb(204, 204, 204);&quot;&gt;&lt;p&gt;&amp;nbsp;테두리를 창에 조각한 것처럼 표시합니다. (groove 와 반대음영)&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td style=&quot;width: 72px; height: 24px; border-bottom: 1px solid rgb(204, 204, 204); border-right: 1px solid rgb(204, 204, 204); border-left: 1px solid rgb(204, 204, 204); background-color: rgb(225, 233, 244);&quot;&gt;&lt;p&gt;&lt;b&gt;&amp;nbsp;solid&lt;/b&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td style=&quot;width: 619px; height: 24px; border-bottom: 1px solid rgb(204, 204, 204); border-right: 1px solid rgb(204, 204, 204);&quot;&gt;&lt;p&gt;&amp;nbsp;테두리를 선으로 표시합니다.&amp;nbsp;&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 18pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(31, 218, 17);&quot;&gt;|&lt;/span&gt;&amp;nbsp;border-style : 테두리 스타일 예제&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 231px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/999A9B395D9DE67A03&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F999A9B395D9DE67A03&quot; width=&quot;231&quot; height=&quot;903&quot; filename=&quot;border1.jpg&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;pre style=&quot;background-color:#2b2b2b;color:#a9b7c6;font-family:'Source Code Pro';font-size:9.8pt;&quot;&gt;&lt;p&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;!DOCTYPE &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;html&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;html &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;lang&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;=&quot;en&quot;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;head&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;    &amp;lt;meta &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;charset&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;=&quot;UTF-8&quot;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;    &amp;lt;title&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/title&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;    &amp;lt;style&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;div &lt;/span&gt;{&lt;br /&gt;            &lt;span style=&quot;color:#bababa;&quot;&gt;text-align &lt;/span&gt;: &lt;span style=&quot;color:#a5c261;&quot;&gt;center&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;border-width &lt;/span&gt;: &lt;span style=&quot;color:#6897bb;&quot;&gt;15&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;px&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;width&lt;/span&gt;: &lt;span style=&quot;color:#6897bb;&quot;&gt;150&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;px&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;height&lt;/span&gt;: &lt;span style=&quot;color:#6897bb;&quot;&gt;50&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;px&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;margin&lt;/span&gt;: &lt;span style=&quot;color:#6897bb;&quot;&gt;20&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;px&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;        &lt;/span&gt;}&lt;br /&gt;        .&lt;span style=&quot;color:#e8bf6a;&quot;&gt;box-none &lt;/span&gt;{&lt;br /&gt;            &lt;span style=&quot;color:#bababa;&quot;&gt;border-style&lt;/span&gt;: &lt;span style=&quot;color:#a5c261;&quot;&gt;none&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;        &lt;/span&gt;}&lt;br /&gt;        .&lt;span style=&quot;color:#e8bf6a;&quot;&gt;box-hidden &lt;/span&gt;{&lt;br /&gt;            &lt;span style=&quot;color:#bababa;&quot;&gt;border-style&lt;/span&gt;: &lt;span style=&quot;color:#a5c261;&quot;&gt;hidden&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;        &lt;/span&gt;}&lt;br /&gt;        .&lt;span style=&quot;color:#e8bf6a;&quot;&gt;box-dotted &lt;/span&gt;{&lt;br /&gt;            &lt;span style=&quot;color:#bababa;&quot;&gt;border-style&lt;/span&gt;: &lt;span style=&quot;color:#a5c261;&quot;&gt;dotted&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;        &lt;/span&gt;}&lt;br /&gt;        .&lt;span style=&quot;color:#e8bf6a;&quot;&gt;box-dashed &lt;/span&gt;{&lt;br /&gt;            &lt;span style=&quot;color:#bababa;&quot;&gt;border-style&lt;/span&gt;: &lt;span style=&quot;color:#a5c261;&quot;&gt;dashed&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;        &lt;/span&gt;}&lt;br /&gt;        .&lt;span style=&quot;color:#e8bf6a;&quot;&gt;box-dotted &lt;/span&gt;{&lt;br /&gt;            &lt;span style=&quot;color:#bababa;&quot;&gt;border-style&lt;/span&gt;: &lt;span style=&quot;color:#a5c261;&quot;&gt;dotted&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;        &lt;/span&gt;}&lt;br /&gt;        .&lt;span style=&quot;color:#e8bf6a;&quot;&gt;box-double &lt;/span&gt;{&lt;br /&gt;            &lt;span style=&quot;color:#bababa;&quot;&gt;border-style&lt;/span&gt;: &lt;span style=&quot;color:#a5c261;&quot;&gt;double&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;        &lt;/span&gt;}&lt;br /&gt;        .&lt;span style=&quot;color:#e8bf6a;&quot;&gt;box-groove &lt;/span&gt;{&lt;br /&gt;            &lt;span style=&quot;color:#bababa;&quot;&gt;border-style&lt;/span&gt;: &lt;span style=&quot;color:#a5c261;&quot;&gt;groove&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;        &lt;/span&gt;}&lt;br /&gt;        .&lt;span style=&quot;color:#e8bf6a;&quot;&gt;box-inset &lt;/span&gt;{&lt;br /&gt;            &lt;span style=&quot;color:#bababa;&quot;&gt;border-style&lt;/span&gt;: &lt;span style=&quot;color:#a5c261;&quot;&gt;inset&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;        &lt;/span&gt;}&lt;br /&gt;        .&lt;span style=&quot;color:#e8bf6a;&quot;&gt;box-outset &lt;/span&gt;{&lt;br /&gt;            &lt;span style=&quot;color:#bababa;&quot;&gt;border-style&lt;/span&gt;: &lt;span style=&quot;color:#a5c261;&quot;&gt;outset&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;        &lt;/span&gt;}&lt;br /&gt;        .&lt;span style=&quot;color:#e8bf6a;&quot;&gt;box-ridge &lt;/span&gt;{&lt;br /&gt;            &lt;span style=&quot;color:#bababa;&quot;&gt;border-style&lt;/span&gt;: &lt;span style=&quot;color:#a5c261;&quot;&gt;ridge&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;        &lt;/span&gt;}&lt;br /&gt;        .&lt;span style=&quot;color:#e8bf6a;&quot;&gt;box-solid &lt;/span&gt;{&lt;br /&gt;            &lt;span style=&quot;color:#bababa;&quot;&gt;border-style&lt;/span&gt;: &lt;span style=&quot;color:#a5c261;&quot;&gt;solid&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;        &lt;/span&gt;}&lt;br /&gt;    &lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/style&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/head&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;body&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;    &amp;lt;div &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;=&quot;box-none&quot;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;gt;&lt;/span&gt;none&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;    &amp;lt;div &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;=&quot;box-hidden&quot;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;gt;&lt;/span&gt;hidden&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;    &amp;lt;div &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;=&quot;box-dashed&quot;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;gt;&lt;/span&gt;dashed&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;    &amp;lt;div &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;=&quot;box-dotted&quot;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;gt;&lt;/span&gt;dotted&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;    &amp;lt;div &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;=&quot;box-double&quot;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;gt;&lt;/span&gt;double&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;    &amp;lt;div &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;=&quot;box-groove&quot;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;gt;&lt;/span&gt;groove&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;    &amp;lt;div &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;=&quot;box-inset&quot;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;gt;&lt;/span&gt;inset&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;    &amp;lt;div &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;=&quot;box-outset&quot;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;gt;&lt;/span&gt;outset&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;    &amp;lt;div &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;=&quot;box-ridge&quot;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;gt;&lt;/span&gt;ridge&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;    &amp;lt;div &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;=&quot;box-solid&quot;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;gt;&lt;/span&gt;solid&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/body&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/html&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;/pre&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;; font-size: 18pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(31, 218, 17);&quot;&gt;| &lt;/span&gt;border-width : 테두리 두께 지정&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;border-width는 테두리 두께를 지정하는 속성입니다. 테두리의 두께를 지정하는 속성들은 다음과 같습니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;아래의 속성들은 &amp;lt;크기&amp;gt;, thin, medium, thick 중 하나의 속성값으로 지정하는 것이 가능합니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;table class=&quot;txc-table&quot; width=&quot;692&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; border=&quot;0&quot; style=&quot;border:none;border-collapse:collapse;;font-family:&quot; 맑은=&quot;&quot; 고딕&quot;,=&quot;&quot; sans-serif;font-size:16px&quot;=&quot;&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;width: 197px; height: 24px; border-width: 1px; border-style: solid; border-color: rgb(204, 204, 204); background-color: rgb(225, 233, 244);&quot;&gt;&lt;p&gt;&lt;b&gt;&amp;nbsp;border-top-width&lt;/b&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td style=&quot;width: 494px; height: 24px; border-bottom: 1px solid rgb(204, 204, 204); border-right: 1px solid rgb(204, 204, 204); border-top: 1px solid rgb(204, 204, 204);&quot;&gt;&lt;p&gt;&amp;nbsp;위 테두리 두께&amp;nbsp;지정&amp;nbsp;&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td style=&quot;width: 197px; height: 24px; border-bottom: 1px solid rgb(204, 204, 204); border-right: 1px solid rgb(204, 204, 204); border-left: 1px solid rgb(204, 204, 204); background-color: rgb(225, 233, 244);&quot;&gt;&lt;p&gt;&lt;b&gt;&amp;nbsp;border-right-width&amp;nbsp;&lt;/b&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td style=&quot;width: 494px; height: 24px; border-bottom: 1px solid rgb(204, 204, 204); border-right: 1px solid rgb(204, 204, 204);&quot;&gt;&lt;p&gt;&amp;nbsp;오른쪽 테두리 두께&amp;nbsp;지정&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td style=&quot;width: 197px; height: 24px; border-bottom: 1px solid rgb(204, 204, 204); border-right: 1px solid rgb(204, 204, 204); border-left: 1px solid rgb(204, 204, 204); background-color: rgb(225, 233, 244);&quot;&gt;&lt;p&gt;&lt;b&gt;&amp;nbsp;border-bottom-width&lt;/b&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td style=&quot;width: 494px; height: 24px; border-bottom: 1px solid rgb(204, 204, 204); border-right: 1px solid rgb(204, 204, 204);&quot;&gt;&lt;p&gt;&amp;nbsp;아래쪽&amp;nbsp;테두리 두께&amp;nbsp;지정&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td style=&quot;width: 197px; height: 24px; border-bottom: 1px solid rgb(204, 204, 204); border-right: 1px solid rgb(204, 204, 204); border-left: 1px solid rgb(204, 204, 204); background-color: rgb(225, 233, 244);&quot;&gt;&lt;p&gt;&lt;b&gt;&amp;nbsp;border-left-width&lt;/b&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td style=&quot;width: 494px; height: 24px; border-bottom: 1px solid rgb(204, 204, 204); border-right: 1px solid rgb(204, 204, 204);&quot;&gt;&lt;p&gt;&amp;nbsp;왼쪽&amp;nbsp;테두리 두께&amp;nbsp;지정&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td style=&quot;width: 197px; height: 24px; border-bottom: 1px solid rgb(204, 204, 204); border-right: 1px solid rgb(204, 204, 204); border-left: 1px solid rgb(204, 204, 204); background-color: rgb(225, 233, 244);&quot;&gt;&lt;p&gt;&lt;b&gt;&amp;nbsp;border-width&lt;/b&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td style=&quot;width: 494px; height: 24px; border-bottom: 1px solid rgb(204, 204, 204); border-right: 1px solid rgb(204, 204, 204);&quot;&gt;&lt;p&gt;&amp;nbsp;한꺼번에&amp;nbsp;테두리 두께를 지정. 속성값의 개수에 따라 달리 적용&lt;/p&gt;&lt;p&gt;&amp;nbsp;- 한 개 : 전체 테두리 두께&lt;/p&gt;&lt;p&gt;&amp;nbsp;- 두 개 : 위아래와 좌우를 묶어 지정&lt;/p&gt;&lt;p&gt;&amp;nbsp;- 세 개 : 첫 번째 : 위쪽, 두 번째 : 좌우 동시 적용, 세 번째 : 아래쪽&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;- 네 개 : 위 -&amp;gt; 오른쪽 -&amp;gt; 아래쪽 -&amp;gt;&amp;nbsp;왼쪽&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 219px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/99B6B63D5D9DE6D320&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F99B6B63D5D9DE6D320&quot; width=&quot;219&quot; height=&quot;397&quot; filename=&quot;2.jpg&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;pre style=&quot;background-color:#2b2b2b;color:#a9b7c6;font-family:'Source Code Pro';font-size:9.8pt;&quot;&gt;&lt;p&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;!DOCTYPE &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;html&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;html &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;lang&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;=&quot;en&quot;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;head&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;    &amp;lt;meta &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;charset&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;=&quot;UTF-8&quot;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;    &amp;lt;title&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/title&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;    &amp;lt;style&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;div &lt;/span&gt;{&lt;br /&gt;            &lt;span style=&quot;color:#bababa;&quot;&gt;text-align &lt;/span&gt;: &lt;span style=&quot;color:#a5c261;&quot;&gt;center&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;width&lt;/span&gt;: &lt;span style=&quot;color:#6897bb;&quot;&gt;150&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;px&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;height&lt;/span&gt;: &lt;span style=&quot;color:#6897bb;&quot;&gt;50&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;px&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;margin&lt;/span&gt;: &lt;span style=&quot;color:#6897bb;&quot;&gt;20&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;px&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;border-style&lt;/span&gt;: &lt;span style=&quot;color:#a5c261;&quot;&gt;solid&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;        &lt;/span&gt;}&lt;br /&gt;        .&lt;span style=&quot;color:#e8bf6a;&quot;&gt;div1 &lt;/span&gt;{&lt;br /&gt;            &lt;span style=&quot;color:#bababa;&quot;&gt;border-width&lt;/span&gt;: &lt;span style=&quot;color:#6897bb;&quot;&gt;5&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;px&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;        &lt;/span&gt;}&lt;br /&gt;        .&lt;span style=&quot;color:#e8bf6a;&quot;&gt;div2 &lt;/span&gt;{&lt;br /&gt;            &lt;span style=&quot;color:#bababa;&quot;&gt;border-width&lt;/span&gt;: &lt;span style=&quot;color:#a5c261;&quot;&gt;thick thin&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;        &lt;/span&gt;}&lt;br /&gt;        .&lt;span style=&quot;color:#e8bf6a;&quot;&gt;div3 &lt;/span&gt;{&lt;br /&gt;            &lt;span style=&quot;color:#bababa;&quot;&gt;border-width&lt;/span&gt;: &lt;span style=&quot;color:#6897bb;&quot;&gt;5&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;px &lt;/span&gt;&lt;span style=&quot;color:#6897bb;&quot;&gt;10&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;px &lt;/span&gt;&lt;span style=&quot;color:#6897bb;&quot;&gt;20&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;px&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;        &lt;/span&gt;}&lt;br /&gt;        .&lt;span style=&quot;color:#e8bf6a;&quot;&gt;div4 &lt;/span&gt;{&lt;br /&gt;            &lt;span style=&quot;color:#bababa;&quot;&gt;border-width&lt;/span&gt;: &lt;span style=&quot;color:#6897bb;&quot;&gt;5&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;px &lt;/span&gt;&lt;span style=&quot;color:#6897bb;&quot;&gt;10&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;px &lt;/span&gt;&lt;span style=&quot;color:#6897bb;&quot;&gt;15&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;px &lt;/span&gt;&lt;span style=&quot;color:#6897bb;&quot;&gt;20&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;px&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;        &lt;/span&gt;}&lt;br /&gt;    &lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/style&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/head&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;body&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;    &amp;lt;div &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;=&quot;div1&quot;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;    &amp;lt;div &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;=&quot;div2&quot;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;    &amp;lt;div &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;=&quot;div3&quot;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;    &amp;lt;div &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;=&quot;div4&quot;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/body&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;/pre&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 18pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(31, 218, 17);&quot;&gt;|&lt;/span&gt; border-color&amp;nbsp;: 테두리 색상 지정&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;border-color는 테두리 색상을&amp;nbsp;지정하는 속성입니다. 테두리의 색상을&amp;nbsp;지정하는 속성들은 다음과 같습니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;table class=&quot;txc-table&quot; width=&quot;692&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; border=&quot;0&quot; 맑은=&quot;&quot; 고딕&quot;,=&quot;&quot; sans-serif;font-size:16px&quot;=&quot;&quot; style=&quot;border: none; border-collapse: collapse;&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;width: 223px; height: 24px; border-width: 1px; border-style: solid; border-color: rgb(204, 204, 204); background-color: rgb(214, 230, 255);&quot;&gt;&lt;p&gt;&lt;b&gt;&amp;nbsp;border-top-color&lt;/b&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style=&quot;width: 468px; height: 24px; border-bottom: 1px solid rgb(204, 204, 204); border-right: 1px solid rgb(204, 204, 204); border-top: 1px solid rgb(204, 204, 204);&quot;&gt;&lt;p&gt;&amp;nbsp;위쪽 테두리 색상 결정&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width: 223px; height: 24px; border-bottom: 1px solid rgb(204, 204, 204); border-right: 1px solid rgb(204, 204, 204); border-left: 1px solid rgb(204, 204, 204); background-color: rgb(214, 230, 255);&quot;&gt;&lt;p&gt;&lt;b&gt;&amp;nbsp;border-right-color&lt;/b&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style=&quot;width: 468px; height: 24px; border-bottom: 1px solid rgb(204, 204, 204); border-right: 1px solid rgb(204, 204, 204);&quot;&gt;&lt;p&gt;&amp;nbsp;오른쪽&amp;nbsp;테두리 색상 결정&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width: 223px; height: 24px; border-bottom: 1px solid rgb(204, 204, 204); border-right: 1px solid rgb(204, 204, 204); border-left: 1px solid rgb(204, 204, 204); background-color: rgb(214, 230, 255);&quot;&gt;&lt;p&gt;&lt;b&gt;&amp;nbsp;border-bottom-color&lt;/b&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style=&quot;width: 468px; height: 24px; border-bottom: 1px solid rgb(204, 204, 204); border-right: 1px solid rgb(204, 204, 204);&quot;&gt;&lt;p&gt;&amp;nbsp;아래쪽&amp;nbsp;테두리 색상 결정&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width: 223px; height: 24px; border-bottom: 1px solid rgb(204, 204, 204); border-right: 1px solid rgb(204, 204, 204); border-left: 1px solid rgb(204, 204, 204); background-color: rgb(214, 230, 255);&quot;&gt;&lt;p&gt;&lt;b&gt;&amp;nbsp;border-left-color&lt;/b&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style=&quot;width: 468px; height: 24px; border-bottom: 1px solid rgb(204, 204, 204); border-right: 1px solid rgb(204, 204, 204);&quot;&gt;&lt;p&gt;&amp;nbsp;왼쪽&amp;nbsp;테두리 색상 결정&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width: 223px; height: 24px; border-bottom: 1px solid rgb(204, 204, 204); border-right: 1px solid rgb(204, 204, 204); border-left: 1px solid rgb(204, 204, 204); background-color: rgb(214, 230, 255);&quot;&gt;&lt;p&gt;&lt;b&gt;&amp;nbsp;border-color&lt;/b&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style=&quot;width: 468px; height: 24px; border-bottom: 1px solid rgb(204, 204, 204); border-right: 1px solid rgb(204, 204, 204);&quot;&gt;&lt;p&gt;&amp;nbsp;한꺼번에 테두리 색상을 결정. 속성값에 개수에 따라 달리 적용&lt;/p&gt;&lt;p&gt;&amp;nbsp;규칙은 border-width와 동일&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;b style=&quot;font-size: 24px;&quot;&gt;&lt;span style=&quot;color: rgb(31, 218, 17);&quot;&gt;|&lt;/span&gt;&amp;nbsp;border-color&amp;nbsp;예제&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 201px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/99A1B93D5D9DE7DE2C&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F99A1B93D5D9DE7DE2C&quot; width=&quot;201&quot; height=&quot;433&quot; filename=&quot;4.jpg&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;pre style=&quot;background-color: rgb(43, 43, 43); color: rgb(169, 183, 198); font-family: &amp;quot;Source Code Pro&amp;quot;; font-size: 9.8pt;&quot;&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;&amp;lt;!DOCTYPE &lt;/span&gt;&lt;span style=&quot;color: rgb(186, 186, 186);&quot;&gt;html&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;&amp;lt;html &lt;/span&gt;&lt;span style=&quot;color: rgb(186, 186, 186);&quot;&gt;lang&lt;/span&gt;&lt;span style=&quot;color: rgb(165, 194, 97);&quot;&gt;=&quot;en&quot;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;&amp;lt;head&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;    &amp;lt;meta &lt;/span&gt;&lt;span style=&quot;color: rgb(186, 186, 186);&quot;&gt;charset&lt;/span&gt;&lt;span style=&quot;color: rgb(165, 194, 97);&quot;&gt;=&quot;UTF-8&quot;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;    &amp;lt;title&amp;gt;&amp;lt;/title&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;    &amp;lt;style&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;        &lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;div &lt;/span&gt;{&lt;br /&gt;            &lt;span style=&quot;color: rgb(186, 186, 186);&quot;&gt;text-align &lt;/span&gt;: &lt;span style=&quot;color: rgb(165, 194, 97);&quot;&gt;center&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color: rgb(186, 186, 186);&quot;&gt;width&lt;/span&gt;: &lt;span style=&quot;color: rgb(104, 151, 187);&quot;&gt;150&lt;/span&gt;&lt;span style=&quot;color: rgb(165, 194, 97);&quot;&gt;px&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color: rgb(186, 186, 186);&quot;&gt;height&lt;/span&gt;: &lt;span style=&quot;color: rgb(104, 151, 187);&quot;&gt;50&lt;/span&gt;&lt;span style=&quot;color: rgb(165, 194, 97);&quot;&gt;px&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color: rgb(186, 186, 186);&quot;&gt;margin&lt;/span&gt;: &lt;span style=&quot;color: rgb(104, 151, 187);&quot;&gt;20&lt;/span&gt;&lt;span style=&quot;color: rgb(165, 194, 97);&quot;&gt;px&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color: rgb(186, 186, 186);&quot;&gt;border-style&lt;/span&gt;: &lt;span style=&quot;color: rgb(165, 194, 97);&quot;&gt;solid&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color: rgb(186, 186, 186);&quot;&gt;border-width&lt;/span&gt;: &lt;span style=&quot;color: rgb(104, 151, 187);&quot;&gt;5&lt;/span&gt;&lt;span style=&quot;color: rgb(165, 194, 97);&quot;&gt;px&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;        &lt;/span&gt;}&lt;br /&gt;        .&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;div1 &lt;/span&gt;{&lt;br /&gt;            &lt;span style=&quot;color: rgb(186, 186, 186);&quot;&gt;border-color&lt;/span&gt;: &lt;span style=&quot;color: rgb(165, 194, 97);&quot;&gt;red&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;        &lt;/span&gt;}&lt;br /&gt;        .&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;div2 &lt;/span&gt;{&lt;br /&gt;            &lt;span style=&quot;color: rgb(186, 186, 186);&quot;&gt;border-color&lt;/span&gt;: &lt;span style=&quot;color: rgb(165, 194, 97);&quot;&gt;red blue&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;        &lt;/span&gt;}&lt;br /&gt;        .&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;div3 &lt;/span&gt;{&lt;br /&gt;            &lt;span style=&quot;color: rgb(186, 186, 186);&quot;&gt;border-color&lt;/span&gt;: &lt;span style=&quot;color: rgb(165, 194, 97);&quot;&gt;red green purple&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;        &lt;/span&gt;}&lt;br /&gt;        .&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;div4 &lt;/span&gt;{&lt;br /&gt;            &lt;span style=&quot;color: rgb(186, 186, 186);&quot;&gt;border-color&lt;/span&gt;: &lt;span style=&quot;color: rgb(165, 194, 97);&quot;&gt;red green purple blue&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;        &lt;/span&gt;}&lt;br /&gt;        .&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;div5 &lt;/span&gt;{&lt;br /&gt;            &lt;span style=&quot;color: rgb(186, 186, 186);&quot;&gt;border-top-color&lt;/span&gt;: &lt;span style=&quot;color: rgb(165, 194, 97);&quot;&gt;brown&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color: rgb(186, 186, 186);&quot;&gt;border-bottom-color&lt;/span&gt;: &lt;span style=&quot;color: rgb(165, 194, 97);&quot;&gt;red&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color: rgb(186, 186, 186);&quot;&gt;border-left-color&lt;/span&gt;: &lt;span style=&quot;color: rgb(165, 194, 97);&quot;&gt;purple&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color: rgb(186, 186, 186);&quot;&gt;border-right-color&lt;/span&gt;: &lt;span style=&quot;color: rgb(165, 194, 97);&quot;&gt;yellow&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;        &lt;/span&gt;}&lt;br /&gt;    &lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;&amp;lt;/style&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;&amp;lt;/head&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;&amp;lt;body&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;    &amp;lt;div &lt;/span&gt;&lt;span style=&quot;color: rgb(186, 186, 186);&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color: rgb(165, 194, 97);&quot;&gt;=&quot;div1&quot;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;    &amp;lt;div &lt;/span&gt;&lt;span style=&quot;color: rgb(186, 186, 186);&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color: rgb(165, 194, 97);&quot;&gt;=&quot;div2&quot;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;    &amp;lt;div &lt;/span&gt;&lt;span style=&quot;color: rgb(186, 186, 186);&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color: rgb(165, 194, 97);&quot;&gt;=&quot;div3&quot;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;    &amp;lt;div &lt;/span&gt;&lt;span style=&quot;color: rgb(186, 186, 186);&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color: rgb(165, 194, 97);&quot;&gt;=&quot;div4&quot;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;    &amp;lt;div &lt;/span&gt;&lt;span style=&quot;color: rgb(186, 186, 186);&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color: rgb(165, 194, 97);&quot;&gt;=&quot;div5&quot;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;&amp;lt;/body&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;&amp;lt;/html&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 18pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(31, 218, 17);&quot;&gt;| &lt;/span&gt;border : 테두리 두께, 색상, 스타일&amp;nbsp;묶어 지정&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;border는 테두리의 두께, 색상, 스타일을 묶어서 지정하는 속성입니다. border 속성은 아래와 같이 쓰입니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;table class=&quot;txc-table&quot; width=&quot;692&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; border=&quot;0&quot; style=&quot;border:none;border-collapse:collapse;;font-family:&quot; 맑은=&quot;&quot; 고딕&quot;,=&quot;&quot; sans-serif;font-size:16px&quot;=&quot;&quot;&gt;&lt;tbody&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: rgb(140, 252, 203); color: rgb(0, 0, 0);&quot;&gt;border : &amp;lt;두께&amp;gt; | &amp;lt;색상&amp;gt; | &amp;lt;스타일&amp;gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;&lt;span style=&quot;background-color: rgb(154, 165, 234);&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;border말고도 각 위치에 각각 적용할 수 있는 border-top, border-right, border-left, border-bottom 속성을 지정하여 쓸 수 있습니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b style=&quot;font-size: 24px;&quot;&gt;&lt;span style=&quot;color: rgb(31, 218, 17);&quot;&gt;|&amp;nbsp;&lt;/span&gt;border 예제&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 748px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/993A683E5D9DE76E17&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F993A683E5D9DE76E17&quot; width=&quot;748&quot; height=&quot;394&quot; filename=&quot;3.jpg&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;pre style=&quot;background-color: rgb(43, 43, 43); color: rgb(169, 183, 198); font-family: &amp;quot;Source Code Pro&amp;quot;; font-size: 9.8pt;&quot;&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;&amp;lt;!DOCTYPE &lt;/span&gt;&lt;span style=&quot;color: rgb(186, 186, 186);&quot;&gt;html&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;&amp;lt;html &lt;/span&gt;&lt;span style=&quot;color: rgb(186, 186, 186);&quot;&gt;lang&lt;/span&gt;&lt;span style=&quot;color: rgb(165, 194, 97);&quot;&gt;=&quot;en&quot;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;&amp;lt;head&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;    &amp;lt;meta &lt;/span&gt;&lt;span style=&quot;color: rgb(186, 186, 186);&quot;&gt;charset&lt;/span&gt;&lt;span style=&quot;color: rgb(165, 194, 97);&quot;&gt;=&quot;UTF-8&quot;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;    &amp;lt;title&amp;gt;&amp;lt;/title&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;    &amp;lt;style&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;        &lt;/span&gt;.&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;head-line &lt;/span&gt;{&lt;br /&gt;            &lt;span style=&quot;color: rgb(186, 186, 186);&quot;&gt;font-weight&lt;/span&gt;: &lt;span style=&quot;color: rgb(165, 194, 97);&quot;&gt;bold&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color: rgb(186, 186, 186);&quot;&gt;padding&lt;/span&gt;: &lt;span style=&quot;color: rgb(104, 151, 187);&quot;&gt;10&lt;/span&gt;&lt;span style=&quot;color: rgb(165, 194, 97);&quot;&gt;px&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color: rgb(186, 186, 186);&quot;&gt;border&lt;/span&gt;: &lt;span style=&quot;color: rgb(104, 151, 187);&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: rgb(165, 194, 97);&quot;&gt;px purple solid&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;        &lt;/span&gt;}&lt;br /&gt;        .&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;content &lt;/span&gt;{&lt;br /&gt;            &lt;span style=&quot;color: rgb(186, 186, 186);&quot;&gt;width&lt;/span&gt;: &lt;span style=&quot;color: rgb(165, 194, 97);&quot;&gt;auto&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color: rgb(186, 186, 186);&quot;&gt;height&lt;/span&gt;: &lt;span style=&quot;color: rgb(104, 151, 187);&quot;&gt;400&lt;/span&gt;&lt;span style=&quot;color: rgb(165, 194, 97);&quot;&gt;px&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color: rgb(186, 186, 186);&quot;&gt;border&lt;/span&gt;: &lt;span style=&quot;color: rgb(104, 151, 187);&quot;&gt;10&lt;/span&gt;&lt;span style=&quot;color: rgb(165, 194, 97);&quot;&gt;px darkgreen dashed&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;        &lt;/span&gt;}&lt;br /&gt;    &lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;&amp;lt;/style&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;&amp;lt;/head&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;&amp;lt;body&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;    &amp;lt;div &lt;/span&gt;&lt;span style=&quot;color: rgb(186, 186, 186);&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color: rgb(165, 194, 97);&quot;&gt;=&quot;head-line&quot;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;        &lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Unicode MS&amp;quot;;&quot;&gt;테두리 스타일 묶어서 지정&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Unicode MS&amp;quot;;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;    &amp;lt;div &lt;/span&gt;&lt;span style=&quot;color: rgb(186, 186, 186);&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color: rgb(165, 194, 97);&quot;&gt;=&quot;content&quot;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;        &lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Unicode MS&amp;quot;;&quot;&gt;콘텐츠가 기재되는 부분&lt;/span&gt;. &lt;span style=&quot;font-family: &amp;quot;Arial Unicode MS&amp;quot;;&quot;&gt;테두리 스타일에 대한 설명&lt;/span&gt;!&lt;br /&gt;    &lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;&amp;lt;/body&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;&amp;lt;/html&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 18pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(31, 218, 17);&quot;&gt;|&lt;/span&gt; border-radius : 박스 모서리 둥글게 하기&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;border-radius는 박스 모서리를 둥글게 만들어 좀 더 부드러운 요소를 구현하기 위한 속성입니다. border-radius는 아래와 같이 쓰입니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: rgb(140, 252, 203); color: rgb(0, 0, 0);&quot;&gt;border-radius : &amp;lt;크기&amp;gt; | &amp;lt;백분율&amp;gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;table class=&quot;txc-table&quot; width=&quot;692&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; border=&quot;0&quot; 맑은=&quot;&quot; 고딕&quot;,=&quot;&quot; sans-serif;font-size:16px&quot;=&quot;&quot; style=&quot;border: none; border-collapse: collapse;&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;width: 124px; height: 24px; border-width: 1px; border-style: solid; border-color: rgb(204, 204, 204); background-color: rgb(214, 230, 255);&quot;&gt;&lt;p&gt;&lt;b&gt;&amp;nbsp;&amp;lt;크기&amp;gt;&lt;/b&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style=&quot;width: 567px; height: 24px; border-bottom: 1px solid rgb(204, 204, 204); border-right: 1px solid rgb(204, 204, 204); border-top: 1px solid rgb(204, 204, 204);&quot;&gt;&lt;p&gt;&amp;nbsp;둥글게 처리할 반지름 크기를 px 혹은 em 같은 단위로 표시&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width: 124px; height: 24px; border-bottom: 1px solid rgb(204, 204, 204); border-right: 1px solid rgb(204, 204, 204); border-left: 1px solid rgb(204, 204, 204); background-color: rgb(214, 230, 255);&quot;&gt;&lt;p&gt;&lt;b&gt;&amp;nbsp;&amp;lt;백분율&amp;gt;&lt;/b&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style=&quot;width: 567px; height: 24px; border-bottom: 1px solid rgb(204, 204, 204); border-right: 1px solid rgb(204, 204, 204);&quot;&gt;&lt;p&gt;&amp;nbsp;현재 요소 크기를 기준으로 반지름 크기를 %로 지정&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;또한 border-radius 뿐만 각 위치에 맞게 속성을 적용할 수 있도록 border-top-left-radius, border-top-right-radius, border-bottom-right-radius, border-bottom-left-radius 속성들을 지원하고 있습니다. 이 속성들은 아래 그림에 표시된 곳과 일대일 대응되어 표현됩니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 350px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/997A093A5D9DE9AF20&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F997A093A5D9DE9AF20&quot; width=&quot;350&quot; height=&quot;205&quot; filename=&quot;cats.jpg&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;border-radius는 또한 속성값을 한 개만 넣을 시 둥그런 원을 기준으로 곡선을 처리하게 됩니다. 만약 요소를 타원형 형태로 둥글게 만들고 싶다면 속성값을 두 개를 넣으면 됩니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;; background-color: rgb(140, 252, 203); color: rgb(0, 0, 0);&quot;&gt;border-radius : &amp;lt;가로 크기&amp;gt; &amp;lt;세로 크기&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b style=&quot;font-size: 24px;&quot;&gt;&lt;span style=&quot;color: rgb(31, 218, 17);&quot;&gt;|&lt;/span&gt;&amp;nbsp;border-radius 예제&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 748px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/994A7C395D9DE9E20B&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F994A7C395D9DE9E20B&quot; width=&quot;748&quot; height=&quot;672&quot; filename=&quot;캡처.jpg&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;pre style=&quot;background-color: rgb(43, 43, 43); color: rgb(169, 183, 198); font-family: &amp;quot;Source Code Pro&amp;quot;; font-size: 9.8pt;&quot;&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;&amp;lt;!DOCTYPE &lt;/span&gt;&lt;span style=&quot;color: rgb(186, 186, 186);&quot;&gt;html&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;&amp;lt;html &lt;/span&gt;&lt;span style=&quot;color: rgb(186, 186, 186);&quot;&gt;lang&lt;/span&gt;&lt;span style=&quot;color: rgb(165, 194, 97);&quot;&gt;=&quot;en&quot;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;&amp;lt;head&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;    &amp;lt;meta &lt;/span&gt;&lt;span style=&quot;color: rgb(186, 186, 186);&quot;&gt;charset&lt;/span&gt;&lt;span style=&quot;color: rgb(165, 194, 97);&quot;&gt;=&quot;UTF-8&quot;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;    &amp;lt;title&amp;gt;&amp;lt;/title&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;    &amp;lt;style&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;        &lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;div &lt;/span&gt;{&lt;br /&gt;            &lt;span style=&quot;color: rgb(186, 186, 186);&quot;&gt;margin &lt;/span&gt;: &lt;span style=&quot;color: rgb(104, 151, 187);&quot;&gt;50&lt;/span&gt;&lt;span style=&quot;color: rgb(165, 194, 97);&quot;&gt;px&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color: rgb(186, 186, 186);&quot;&gt;width &lt;/span&gt;: &lt;span style=&quot;color: rgb(104, 151, 187);&quot;&gt;50&lt;/span&gt;%&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color: rgb(186, 186, 186);&quot;&gt;height &lt;/span&gt;: &lt;span style=&quot;color: rgb(104, 151, 187);&quot;&gt;100&lt;/span&gt;&lt;span style=&quot;color: rgb(165, 194, 97);&quot;&gt;px&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;        &lt;/span&gt;}&lt;br /&gt;        .&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;round &lt;/span&gt;{&lt;br /&gt;            &lt;span style=&quot;color: rgb(186, 186, 186);&quot;&gt;border&lt;/span&gt;: &lt;span style=&quot;color: rgb(104, 151, 187);&quot;&gt;5&lt;/span&gt;&lt;span style=&quot;color: rgb(165, 194, 97);&quot;&gt;px solid blue&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color: rgb(186, 186, 186);&quot;&gt;border-radius&lt;/span&gt;: &lt;span style=&quot;color: rgb(104, 151, 187);&quot;&gt;150&lt;/span&gt;&lt;span style=&quot;color: rgb(165, 194, 97);&quot;&gt;px&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;        &lt;/span&gt;}&lt;br /&gt;        .&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;round2 &lt;/span&gt;{&lt;br /&gt;            &lt;span style=&quot;color: rgb(186, 186, 186);&quot;&gt;border&lt;/span&gt;: &lt;span style=&quot;color: rgb(104, 151, 187);&quot;&gt;5&lt;/span&gt;&lt;span style=&quot;color: rgb(165, 194, 97);&quot;&gt;px solid red&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color: rgb(186, 186, 186);&quot;&gt;border-bottom-left-radius&lt;/span&gt;: &lt;span style=&quot;color: rgb(104, 151, 187);&quot;&gt;100&lt;/span&gt;&lt;span style=&quot;color: rgb(165, 194, 97);&quot;&gt;px&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;        &lt;/span&gt;}&lt;br /&gt;        .&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;round3 &lt;/span&gt;{&lt;br /&gt;            &lt;span style=&quot;color: rgb(186, 186, 186);&quot;&gt;border&lt;/span&gt;: &lt;span style=&quot;color: rgb(104, 151, 187);&quot;&gt;5&lt;/span&gt;&lt;span style=&quot;color: rgb(165, 194, 97);&quot;&gt;px solid yellow&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color: rgb(186, 186, 186);&quot;&gt;border-bottom-right-radius&lt;/span&gt;: &lt;span style=&quot;color: rgb(104, 151, 187);&quot;&gt;100&lt;/span&gt;&lt;span style=&quot;color: rgb(165, 194, 97);&quot;&gt;px&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;        &lt;/span&gt;}&lt;br /&gt;        .&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;round4 &lt;/span&gt;{&lt;br /&gt;            &lt;span style=&quot;color: rgb(186, 186, 186);&quot;&gt;border&lt;/span&gt;: &lt;span style=&quot;color: rgb(104, 151, 187);&quot;&gt;5&lt;/span&gt;&lt;span style=&quot;color: rgb(165, 194, 97);&quot;&gt;px solid green&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color: rgb(186, 186, 186);&quot;&gt;border-top-left-radius&lt;/span&gt;: &lt;span style=&quot;color: rgb(104, 151, 187);&quot;&gt;100&lt;/span&gt;&lt;span style=&quot;color: rgb(165, 194, 97);&quot;&gt;px&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;        &lt;/span&gt;}&lt;br /&gt;        .&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;round5 &lt;/span&gt;{&lt;br /&gt;            &lt;span style=&quot;color: rgb(186, 186, 186);&quot;&gt;border&lt;/span&gt;: &lt;span style=&quot;color: rgb(104, 151, 187);&quot;&gt;5&lt;/span&gt;&lt;span style=&quot;color: rgb(165, 194, 97);&quot;&gt;px solid grey&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color: rgb(186, 186, 186);&quot;&gt;border-top-right-radius&lt;/span&gt;: &lt;span style=&quot;color: rgb(104, 151, 187);&quot;&gt;100&lt;/span&gt;&lt;span style=&quot;color: rgb(165, 194, 97);&quot;&gt;px&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;        &lt;/span&gt;}&lt;br /&gt;        .&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;round6 &lt;/span&gt;{&lt;br /&gt;            &lt;span style=&quot;color: rgb(186, 186, 186);&quot;&gt;border&lt;/span&gt;: &lt;span style=&quot;color: rgb(104, 151, 187);&quot;&gt;5&lt;/span&gt;&lt;span style=&quot;color: rgb(165, 194, 97);&quot;&gt;px solid black&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color: rgb(186, 186, 186);&quot;&gt;border-top-right-radius&lt;/span&gt;: &lt;span style=&quot;color: rgb(104, 151, 187);&quot;&gt;200&lt;/span&gt;&lt;span style=&quot;color: rgb(165, 194, 97);&quot;&gt;px &lt;/span&gt;&lt;span style=&quot;color: rgb(104, 151, 187);&quot;&gt;50&lt;/span&gt;&lt;span style=&quot;color: rgb(165, 194, 97);&quot;&gt;px&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;        &lt;/span&gt;}&lt;br /&gt;    &lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;&amp;lt;/style&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;&amp;lt;/head&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;&amp;lt;body&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;    &amp;lt;div &lt;/span&gt;&lt;span style=&quot;color: rgb(186, 186, 186);&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color: rgb(165, 194, 97);&quot;&gt;=&quot;round&quot;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;    &amp;lt;/div&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;    &amp;lt;div &lt;/span&gt;&lt;span style=&quot;color: rgb(186, 186, 186);&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color: rgb(165, 194, 97);&quot;&gt;=&quot;round2&quot;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;    &amp;lt;/div&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;    &amp;lt;div &lt;/span&gt;&lt;span style=&quot;color: rgb(186, 186, 186);&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color: rgb(165, 194, 97);&quot;&gt;=&quot;round3&quot;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;    &amp;lt;/div&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;    &amp;lt;div &lt;/span&gt;&lt;span style=&quot;color: rgb(186, 186, 186);&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color: rgb(165, 194, 97);&quot;&gt;=&quot;round4&quot;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;    &amp;lt;/div&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;    &amp;lt;div &lt;/span&gt;&lt;span style=&quot;color: rgb(186, 186, 186);&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color: rgb(165, 194, 97);&quot;&gt;=&quot;round5&quot;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;    &amp;lt;/div&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;    &amp;lt;div &lt;/span&gt;&lt;span style=&quot;color: rgb(186, 186, 186);&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color: rgb(165, 194, 97);&quot;&gt;=&quot;round6&quot;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;    &amp;lt;/div&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;&amp;lt;/body&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;&amp;lt;/html&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 24pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(31, 218, 17); font-size: 18pt;&quot;&gt;|&lt;/span&gt;&lt;span style=&quot;font-size: 18pt;&quot;&gt; box-shadow : 선택한 요소에 그림자 효과&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;box-shadow 속성은 선택한 요소에 그림자를 내어 보다 멋진 효과를 내기 위해 쓰는 속성입니다. box-shadow 속성은 다음과 같이 쓸 수 있습니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;; background-color: rgb(140, 252, 203); color: rgb(0, 0, 0);&quot;&gt;box-shadow : none | &amp;lt;그림자 값&amp;gt;, [, &amp;lt;그림자값&amp;gt;]*;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;; background-color: rgb(140, 252, 203); color: rgb(0, 0, 0);&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;; background-color: rgb(140, 252, 203); color: rgb(0, 0, 0);&quot;&gt;&amp;lt;그림자 값&amp;gt; = &amp;lt;수평 거리&amp;gt; &amp;lt;수직 거리&amp;gt; &amp;lt;흐림 정도&amp;gt; &amp;lt;번짐 정도&amp;gt; &amp;lt;색상&amp;gt; inset&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;box-shadow에서 그림자값을 쓸 시 그 개수에 따라서 상하좌우에 적용되는 그림자에 각각 적용됩니다. 전에 보셨던 border-style, border-width 같은 속성에서 대응되는 법칙과 같다고 생각하면 됩니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;다음은 그림자 값에 적어야 되는 속성값들에 대한 설명입니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;table class=&quot;txc-table&quot; width=&quot;692&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; border=&quot;0&quot; 맑은=&quot;&quot; 고딕&quot;,=&quot;&quot; sans-serif;font-size:16px&quot;=&quot;&quot; style=&quot;border: none; border-collapse: collapse;&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;width: 137px; height: 24px; border-width: 1px; border-style: solid; border-color: rgb(204, 204, 204); background-color: rgb(214, 230, 255);&quot;&gt;&lt;p&gt;&lt;b&gt;&amp;nbsp;&amp;lt;수평 거리&amp;gt;&lt;/b&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style=&quot;width: 554px; height: 24px; border-bottom: 1px solid rgb(204, 204, 204); border-right: 1px solid rgb(204, 204, 204); border-top: 1px solid rgb(204, 204, 204);&quot;&gt;&lt;p&gt;&amp;nbsp;그림자의 수평 offset 거리(수평으로 얼마나 떨어져 있는지). 양수값은 요소의 오른쪽, 음수값은 요소의 왼쪽에 그림자를 만듬.&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width: 137px; height: 24px; border-bottom: 1px solid rgb(204, 204, 204); border-right: 1px solid rgb(204, 204, 204); border-left: 1px solid rgb(204, 204, 204); background-color: rgb(214, 230, 255);&quot;&gt;&lt;p&gt;&lt;b&gt;&amp;nbsp;&amp;lt;수직&amp;nbsp;거리&amp;gt;&amp;nbsp;&lt;/b&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style=&quot;width: 554px; height: 24px; border-bottom: 1px solid rgb(204, 204, 204); border-right: 1px solid rgb(204, 204, 204);&quot;&gt;&lt;p&gt;&amp;nbsp;그림자의 수평 offset 거리(수평으로 얼마나 떨어져 있는지). 양수값은 요소의 아래쪽, 음수값은 요소의 위쪽에 그림자를 만듬.&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width: 137px; height: 24px; border-bottom: 1px solid rgb(204, 204, 204); border-right: 1px solid rgb(204, 204, 204); border-left: 1px solid rgb(204, 204, 204); background-color: rgb(214, 230, 255);&quot;&gt;&lt;p&gt;&lt;b&gt;&amp;nbsp;&amp;lt;흐림 정도&amp;gt;&lt;/b&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style=&quot;width: 554px; height: 24px; border-bottom: 1px solid rgb(204, 204, 204); border-right: 1px solid rgb(204, 204, 204);&quot;&gt;&lt;p&gt;&amp;nbsp;그림자의 흐림 정도(blur radius)를 지정. 생략할 시 0을 기본값으로 진한 그림자를 표시. 값이 커질수록 부드러운 그림자를 표시. 음수값 사용 불가.&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width: 137px; height: 24px; border-bottom: 1px solid rgb(204, 204, 204); border-right: 1px solid rgb(204, 204, 204); border-left: 1px solid rgb(204, 204, 204); background-color: rgb(214, 230, 255);&quot;&gt;&lt;p&gt;&lt;b&gt;&amp;nbsp;&amp;lt;번짐 정도&amp;gt;&lt;/b&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style=&quot;width: 554px; height: 24px; border-bottom: 1px solid rgb(204, 204, 204); border-right: 1px solid rgb(204, 204, 204);&quot;&gt;&lt;p&gt;&amp;nbsp;그림자의 번지는 정도를 나타냄. 양수값을 사용할 시 모든 방향으로 그림자가 번짐. 음수값 사용 시 모든 방향으로 축소되어 나타남. 기본값은 0.&amp;nbsp;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width: 137px; height: 24px; border-bottom: 1px solid rgb(204, 204, 204); border-right: 1px solid rgb(204, 204, 204); border-left: 1px solid rgb(204, 204, 204); background-color: rgb(214, 230, 255);&quot;&gt;&lt;p&gt;&lt;b&gt;&amp;nbsp;&amp;lt;색상&amp;gt;&lt;/b&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style=&quot;width: 554px; height: 24px; border-bottom: 1px solid rgb(204, 204, 204); border-right: 1px solid rgb(204, 204, 204);&quot;&gt;&lt;p&gt;&amp;nbsp;그림자의 색상을 나타냄. 한 가지 이상의 색상값을 지정할 수 있음. 기본값은 현재 글자색.&amp;nbsp;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width: 137px; height: 24px; border-bottom: 1px solid rgb(204, 204, 204); border-right: 1px solid rgb(204, 204, 204); border-left: 1px solid rgb(204, 204, 204); background-color: rgb(214, 230, 255);&quot;&gt;&lt;p&gt;&lt;b&gt;&amp;nbsp;inset&lt;/b&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style=&quot;width: 554px; height: 24px; border-bottom: 1px solid rgb(204, 204, 204); border-right: 1px solid rgb(204, 204, 204);&quot;&gt;&lt;p&gt;&amp;nbsp;안쪽 그림자로 그릴 지를 결정하는 속성값&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b style=&quot;font-size: 32px;&quot;&gt;&lt;span style=&quot;color: rgb(31, 218, 17); font-size: 18pt;&quot;&gt;|&lt;/span&gt;&lt;span style=&quot;font-size: 18pt;&quot;&gt;&amp;nbsp;box-shadow 예제&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;b style=&quot;font-size: 32px;&quot;&gt;&lt;span style=&quot;font-size: 18pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 608px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/99BF17495D9DEA4C0D&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F99BF17495D9DEA4C0D&quot; width=&quot;608&quot; height=&quot;297&quot; filename=&quot;캡처.jpg&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;b style=&quot;font-size: 32px;&quot;&gt;&lt;/b&gt;&lt;/p&gt;&lt;pre style=&quot;background-color: rgb(43, 43, 43); color: rgb(169, 183, 198); font-family: &amp;quot;Source Code Pro&amp;quot;; font-size: 9.8pt;&quot;&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;&amp;lt;!DOCTYPE &lt;/span&gt;&lt;span style=&quot;color: rgb(186, 186, 186);&quot;&gt;html&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;&amp;lt;html &lt;/span&gt;&lt;span style=&quot;color: rgb(186, 186, 186);&quot;&gt;lang&lt;/span&gt;&lt;span style=&quot;color: rgb(165, 194, 97);&quot;&gt;=&quot;en&quot;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;&amp;lt;head&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;    &amp;lt;meta &lt;/span&gt;&lt;span style=&quot;color: rgb(186, 186, 186);&quot;&gt;charset&lt;/span&gt;&lt;span style=&quot;color: rgb(165, 194, 97);&quot;&gt;=&quot;UTF-8&quot;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;    &amp;lt;title&amp;gt;&amp;lt;/title&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;    &amp;lt;style&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;        &lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;div &lt;/span&gt;{&lt;br /&gt;            &lt;span style=&quot;color: rgb(186, 186, 186);&quot;&gt;width&lt;/span&gt;: &lt;span style=&quot;color: rgb(104, 151, 187);&quot;&gt;30&lt;/span&gt;%&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color: rgb(186, 186, 186);&quot;&gt;height&lt;/span&gt;: &lt;span style=&quot;color: rgb(104, 151, 187);&quot;&gt;120&lt;/span&gt;&lt;span style=&quot;color: rgb(165, 194, 97);&quot;&gt;px&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color: rgb(186, 186, 186);&quot;&gt;margin &lt;/span&gt;: &lt;span style=&quot;color: rgb(104, 151, 187);&quot;&gt;20&lt;/span&gt;&lt;span style=&quot;color: rgb(165, 194, 97);&quot;&gt;px&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color: rgb(186, 186, 186);&quot;&gt;border&lt;/span&gt;: &lt;span style=&quot;color: rgb(104, 151, 187);&quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color: rgb(165, 194, 97);&quot;&gt;px solid&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color: rgb(186, 186, 186);&quot;&gt;border-radius&lt;/span&gt;: &lt;span style=&quot;color: rgb(104, 151, 187);&quot;&gt;30&lt;/span&gt;&lt;span style=&quot;color: rgb(165, 194, 97);&quot;&gt;px&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;        &lt;/span&gt;}&lt;br /&gt;        .&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;shadow1 &lt;/span&gt;{&lt;br /&gt;            &lt;span style=&quot;color: rgb(186, 186, 186);&quot;&gt;box-shadow&lt;/span&gt;: &lt;span style=&quot;color: rgb(104, 151, 187);&quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color: rgb(165, 194, 97);&quot;&gt;px &lt;/span&gt;-&lt;span style=&quot;color: rgb(104, 151, 187);&quot;&gt;5&lt;/span&gt;&lt;span style=&quot;color: rgb(165, 194, 97);&quot;&gt;px &lt;/span&gt;&lt;span style=&quot;color: rgb(104, 151, 187);&quot;&gt;5&lt;/span&gt;&lt;span style=&quot;color: rgb(165, 194, 97);&quot;&gt;px &lt;/span&gt;&lt;span style=&quot;color: rgb(104, 151, 187);&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: rgb(165, 194, 97);&quot;&gt;px black&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;        &lt;/span&gt;}&lt;br /&gt;        .&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;shadow2 &lt;/span&gt;{&lt;br /&gt;            &lt;span style=&quot;color: rgb(186, 186, 186);&quot;&gt;box-shadow&lt;/span&gt;: &lt;span style=&quot;color: rgb(104, 151, 187);&quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color: rgb(165, 194, 97);&quot;&gt;px &lt;/span&gt;&lt;span style=&quot;color: rgb(104, 151, 187);&quot;&gt;5&lt;/span&gt;&lt;span style=&quot;color: rgb(165, 194, 97);&quot;&gt;px &lt;/span&gt;&lt;span style=&quot;color: rgb(104, 151, 187);&quot;&gt;15&lt;/span&gt;&lt;span style=&quot;color: rgb(165, 194, 97);&quot;&gt;px &lt;/span&gt;&lt;span style=&quot;color: rgb(104, 151, 187);&quot;&gt;5&lt;/span&gt;&lt;span style=&quot;color: rgb(165, 194, 97);&quot;&gt;px black&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;        &lt;/span&gt;}&lt;br /&gt;    &lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;&amp;lt;/style&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;&amp;lt;/head&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;&amp;lt;body&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;    &amp;lt;div &lt;/span&gt;&lt;span style=&quot;color: rgb(186, 186, 186);&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color: rgb(165, 194, 97);&quot;&gt;=&quot;shadow1&quot;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;    &amp;lt;/div&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;    &amp;lt;div &lt;/span&gt;&lt;span style=&quot;color: rgb(186, 186, 186);&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color: rgb(165, 194, 97);&quot;&gt;=&quot;shadow2&quot;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;    &amp;lt;/div&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;&amp;lt;/body&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>Language &amp;amp; Solution/HTML&amp;amp;CSS</category>
      <category>border</category>
      <category>CSS</category>
      <category>테두리 영역</category>
      <author>새로비</author>
      <guid isPermaLink="true">https://engkimbs.tistory.com/915</guid>
      <comments>https://engkimbs.tistory.com/entry/HTMLCSS-%ED%85%8C%EB%91%90%EB%A6%ACborder-%EC%98%81%EC%97%AD#entry915comment</comments>
      <pubDate>Mon, 7 Oct 2019 15:13:46 +0900</pubDate>
    </item>
    <item>
      <title>[HTML&amp;amp;CSS] 박스모델 (Box Model)</title>
      <link>https://engkimbs.tistory.com/entry/HTMLCSS-%EB%B0%95%EC%8A%A4%EB%AA%A8%EB%8D%B8-Box-Model</link>
      <description>&lt;p style=&quot;line-height: 1.8;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;; font-size: 18pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(31, 218, 17);&quot;&gt;|&lt;/span&gt; 박스모델 (box model)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;line-height: 1.8;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;line-height: 1.8;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;CSS에서는 각 요소를 박스 형태로 나타내며 이를 박스모델(Box Model)이라 합니다.&amp;nbsp;문서의 레이아웃을 계산할 때, 브라우저는 CSS 기본 박스 모델에 따라 각 요소를 사각형 박스로 표현합니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;line-height: 1.8;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;line-height: 1.8;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;하나의 박스는 아래와 같이 네 부분으로 이루어집니다.&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;line-height: 1.8;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;line-height: 1.8;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;마진(Margin) : 바깥 여백을 나타냅니다.&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;line-height: 1.8;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;테두리(Border): 마진과 패딩 사이의 테두리 영역을 나타냅니다.&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;line-height: 1.8;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;패딩(Padding): 안쪽 여백 영역을 나타냅니다.&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;line-height: 1.8;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;콘텐츠(Content): 실제 텍스트나, 이미지가 들어가는 영역입니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 725px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/992B234F5D9B324106&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F992B234F5D9B324106&quot; width=&quot;725&quot; height=&quot;351&quot; filename=&quot;box model.png&quot; filemime=&quot;image/jpeg&quot; style=&quot;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;line-height: 1.8;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;; font-size: 18pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(31, 218, 17);&quot;&gt;|&lt;/span&gt; 박스모델(box model)&amp;nbsp;확인하는 방법&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;line-height: 1.8;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;line-height: 1.8;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;박스모델은 각 브라우저에서 개발자도구창에서 쉽게 확인할 수 있습니다.&lt;span style=&quot;background-color: rgb(140, 252, 203); color: rgb(0, 0, 0);&quot;&gt; &lt;/span&gt;&lt;u&gt;&lt;span style=&quot;background-color: rgb(140, 252, 203); color: rgb(0, 0, 0);&quot;&gt;크롬을 기준으로 F12를 누르면&amp;nbsp;개발자 도구창이 나오며 Elements =&amp;gt; Styles 탭&lt;/span&gt;&lt;/u&gt;에서 각 요소의 박스모델을 확인할 수 있습니다. 혹은 브라우저에서 나타난 요소를 &lt;b&gt;&lt;u&gt;&lt;span style=&quot;background-color: rgb(140, 252, 203); color: rgb(0, 0, 0);&quot;&gt;우클릭 =&amp;gt; 검사&lt;/span&gt;&lt;/u&gt;&lt;/b&gt;를 클릭하면 바로 해당 요소의 박스모델을 보실 수 있습니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 700px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/9980B04F5D9B32E003&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F9980B04F5D9B32E003&quot; width=&quot;700&quot; height=&quot;516&quot; filename=&quot;123.jpg&quot; filemime=&quot;image/jpeg&quot; style=&quot;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;&lt;b&gt;참고 자료&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://hackernoon.com/the-box-model-44fc2c04a935&quot;&gt;https://hackernoon.com/the-box-model-44fc2c04a935&lt;/a&gt;&lt;/p&gt;</description>
      <category>Language &amp;amp; Solution/HTML&amp;amp;CSS</category>
      <category>box model</category>
      <category>박스 모델</category>
      <author>새로비</author>
      <guid isPermaLink="true">https://engkimbs.tistory.com/914</guid>
      <comments>https://engkimbs.tistory.com/entry/HTMLCSS-%EB%B0%95%EC%8A%A4%EB%AA%A8%EB%8D%B8-Box-Model#entry914comment</comments>
      <pubDate>Mon, 7 Oct 2019 10:51:11 +0900</pubDate>
    </item>
    <item>
      <title>[HTML&amp;amp;CSS] CSS 스타일 우선순위</title>
      <link>https://engkimbs.tistory.com/entry/HTMLCSS-CSS-%EC%8A%A4%ED%83%80%EC%9D%BC-%EC%9A%B0%EC%84%A0%EC%88%9C%EC%9C%84</link>
      <description>&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 18pt;&quot;&gt;&lt;span style=&quot;color: rgb(31, 218, 17);&quot;&gt;|&lt;/span&gt; CSS 스타일 우선순위 (CSS Style Precedence)&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;CSS의 C는 캐스캐이딩(Cascading)의 약자로 '위에서 아래로 흐르는 스타일 시트'라는 뜻입니다. 이러한 방식으로 CSS는 중복되는 스타일 규칙을 '위에서 아래로' 적용되며 방지하는 방법을 채택하고 있습니다. 즉 스타일에 우선순위를 두어서 HTML의 요소가 어떤 CSS 스타일에 영향을 받을 지 결정하는 것이죠.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;스타일의 우선순위는 다음과 같이 먼저 사용자와 제작자 그리고 중요 스타일인지 일반 스타일인지에 따라서 결정됩니다. (1이 가장 중요한 순서, 5가 가장 낮음)&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;1. 사용자 스타일 시트, 중요&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;2. 제작자 스타일 시트, 중요&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;3. 제작자 스타일 시트, 일반&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;4. 사용자 스타일 시트 일반&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;5. 브라우저 스타일 시트&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;여기서 사용자 스타일 시트라는 것은 저시력자나 색&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;약자 등과 같이 특별한 조건이 필요한 사용자가 그들에 맞게 구성해 놓은 스타일 시트라는 것을 의미합니다. 또한 중요 스타일이라는 것은 !important 키워드가 적용된 CSS 스타일이라는 것을 의미합니다. (제작자 스타일 시트는 웹페이지에서 보통 적용하는&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;CSS&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;모듈들&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;)&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;하지만 보통 위에 있는 중요도는 CSS를 적용할 때 자주 고려해야하는 요소는 아닙니다. 실제로 중요하게 생각해야하는 것은&amp;nbsp;다음 태그간, 선택자&amp;nbsp;간에 대한 우선순위입니다. (1이 가장 중요한 순서, 5가&amp;nbsp;가장 낮음)&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;1. 속성값 뒤의 !important&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;2. 태그에 inline으로 style 속성 지정&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;3. 선택자가 #id&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;4. 선택자가 .class 및 pseudo 클래스(:hover같은 것)&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;5. 선택자가 tag 이름&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;만약 우선순위가 같다면 개수가 많이 나온 것이 우선시 된다는 설명도 있지만 어느 정도 맞는 말이지만 정확하지 않습니다. 정확한 설명은 스타일에 적용되어진 조합들을 토대로 특정도값을 계산해서 가장 많은 점수를 받은 것이 우선됩니다!&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;특정도 계산식은 다음과 같습니다.&lt;/span&gt;&lt;/p&gt;&lt;ul style=&quot;list-style-type: disc;&quot;&gt;&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;인라인 스타일 1000점&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;ID 선택자 100점&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;클래스 선택자 및 가상 클래스(:before 같은), 속성&amp;nbsp;10점&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;태그 선택자 1점&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;pre style=&quot;background-color:#2b2b2b;color:#a9b7c6;font-family:'Source Code Pro';font-size:9.8pt;&quot;&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;* &lt;/span&gt;{&lt;br /&gt;&lt;br /&gt;} &lt;span style=&quot;color:#808080;&quot;&gt;/* a=0 b=0 c=0 d=0 =&amp;gt; 0&lt;/span&gt;&lt;span style=&quot;color:#808080;font-family:'Arial Unicode MS';&quot;&gt;점&lt;/span&gt;&lt;span style=&quot;color:#808080;&quot;&gt; */&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;ul &lt;/span&gt;{&lt;br /&gt;} &lt;span style=&quot;color:#808080;&quot;&gt;/* a=0 b=0 c=0 d=1 =&amp;gt; 1&lt;/span&gt;&lt;span style=&quot;color:#808080;font-family:'Arial Unicode MS';&quot;&gt;점&lt;/span&gt;&lt;span style=&quot;color:#808080;&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#808080;font-family:'Arial Unicode MS';&quot;&gt;태그&lt;/span&gt;&lt;span style=&quot;color:#808080;&quot;&gt;)*/&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#808080;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;li&lt;/span&gt;:&lt;span style=&quot;color:#e8bf6a;&quot;&gt;first-child &lt;/span&gt;{&lt;br /&gt;} &lt;span style=&quot;color:#808080;&quot;&gt;/* a=0 b=0 c=1 d=1 =&amp;gt; 11&lt;/span&gt;&lt;span style=&quot;color:#808080;font-family:'Arial Unicode MS';&quot;&gt;점&lt;/span&gt;&lt;span style=&quot;color:#808080;&quot;&gt; (pseudo-class, &lt;/span&gt;&lt;span style=&quot;color:#808080;font-family:'Arial Unicode MS';&quot;&gt;태그&lt;/span&gt;&lt;span style=&quot;color:#808080;&quot;&gt;)*/&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#808080;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;ul li &lt;/span&gt;{&lt;br /&gt;} &lt;span style=&quot;color:#808080;&quot;&gt;/* a=0 b=0 c=0 d=2 =&amp;gt; 2&lt;/span&gt;&lt;span style=&quot;color:#808080;font-family:'Arial Unicode MS';&quot;&gt;점&lt;/span&gt;&lt;span style=&quot;color:#808080;&quot;&gt; (2&lt;/span&gt;&lt;span style=&quot;color:#808080;font-family:'Arial Unicode MS';&quot;&gt;태그&lt;/span&gt;&lt;span style=&quot;color:#808080;&quot;&gt;)*/&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#808080;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;ul ol &lt;/span&gt;.&lt;span style=&quot;color:#e8bf6a;&quot;&gt;red-tag &lt;/span&gt;{&lt;br /&gt;} &lt;span style=&quot;color:#808080;&quot;&gt;/* a=0 b=0 c=1 d=2 =&amp;gt; 12&lt;/span&gt;&lt;span style=&quot;color:#808080;font-family:'Arial Unicode MS';&quot;&gt;점&lt;/span&gt;&lt;span style=&quot;color:#808080;&quot;&gt; (1&lt;/span&gt;&lt;span style=&quot;color:#808080;font-family:'Arial Unicode MS';&quot;&gt;클래스&lt;/span&gt;&lt;span style=&quot;color:#808080;&quot;&gt; 2&lt;/span&gt;&lt;span style=&quot;color:#808080;font-family:'Arial Unicode MS';&quot;&gt;태그&lt;/span&gt;&lt;span style=&quot;color:#808080;&quot;&gt;) */&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#808080;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;#blue-tag &lt;/span&gt;{&lt;br /&gt;} &lt;span style=&quot;color:#808080;&quot;&gt;/* a=0 b=1 c=0 d=0 =&amp;gt; 100&lt;/span&gt;&lt;span style=&quot;color:#808080;font-family:'Arial Unicode MS';&quot;&gt;점&lt;/span&gt;&lt;span style=&quot;color:#808080;&quot;&gt; (1&lt;/span&gt;&lt;span style=&quot;color:#808080;font-family:'Arial Unicode MS';&quot;&gt;아이디&lt;/span&gt;&lt;span style=&quot;color:#808080;&quot;&gt;)*/&lt;/span&gt;&lt;/pre&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;또한 개수마저 같다면 태그와 같은 경우는 &amp;lt;style&amp;gt; 태그나 CSS 파일에서 나중에 나온 것이 class나 id 지정자 같은 경우 태그에 먼저 나온 것이 우선순위를 가져갑니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;; font-size: 18pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(31, 218, 17);&quot;&gt;|&lt;/span&gt; CSS 스타일 우선순위 예제 (CSS Style Precedence Example)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 460px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/99CC714B5DA09A391C&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F99CC714B5DA09A391C&quot; width=&quot;460&quot; height=&quot;866&quot; filename=&quot;123.jpg&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;pre style=&quot;background-color:#2b2b2b;color:#a9b7c6;font-family:'Source Code Pro';font-size:9.8pt;&quot;&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;!DOCTYPE &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;html&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;html &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;lang&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;=&quot;en&quot;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;head&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;    &amp;lt;meta &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;charset&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;=&quot;UTF-8&quot;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;    &amp;lt;title&amp;gt;&lt;/span&gt;CSS &lt;span style=&quot;font-family:'Arial Unicode MS';&quot;&gt;우선순위&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/title&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;    &amp;lt;style&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        #id-style-with-important &lt;/span&gt;{&lt;br /&gt;            &lt;span style=&quot;color:#bababa;&quot;&gt;background-color&lt;/span&gt;: &lt;span style=&quot;color:#a5c261;&quot;&gt;yellow&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color:#cc7832;font-weight:bold;&quot;&gt;!important&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;        &lt;/span&gt;}&lt;br /&gt;        .&lt;span style=&quot;color:#e8bf6a;&quot;&gt;class-style &lt;/span&gt;{&lt;br /&gt;            &lt;span style=&quot;color:#bababa;&quot;&gt;background-color&lt;/span&gt;: &lt;span style=&quot;color:#a5c261;&quot;&gt;blue&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;        &lt;/span&gt;}&lt;br /&gt;        &lt;span style=&quot;color:#e8bf6a;&quot;&gt;#id-style &lt;/span&gt;{&lt;br /&gt;            &lt;span style=&quot;color:#bababa;&quot;&gt;background-color&lt;/span&gt;: &lt;span style=&quot;color:#a5c261;&quot;&gt;red&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;        &lt;/span&gt;}&lt;br /&gt;&lt;br /&gt;        &lt;span style=&quot;color:#cc7832;&quot;&gt;div &lt;/span&gt;{&lt;br /&gt;            &lt;span style=&quot;color:#bababa;&quot;&gt;display&lt;/span&gt;: &lt;span style=&quot;color:#a5c261;&quot;&gt;block&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;padding&lt;/span&gt;: &lt;span style=&quot;color:#6897bb;&quot;&gt;30&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;px&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;margin&lt;/span&gt;: &lt;span style=&quot;color:#6897bb;&quot;&gt;30&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;px&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;background-color&lt;/span&gt;: &lt;span style=&quot;color:#a5c261;&quot;&gt;white&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;        &lt;/span&gt;}&lt;br /&gt;        &lt;span style=&quot;color:#808080;&quot;&gt;/* &lt;/span&gt;&lt;span style=&quot;color:#808080;font-family:'Arial Unicode MS';&quot;&gt;태그에서는 나중에 온 것이 먼저 온 것을 덮는다&lt;/span&gt;&lt;span style=&quot;color:#808080;&quot;&gt;*/&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#808080;&quot;&gt;        &lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;div &lt;/span&gt;{&lt;br /&gt;            &lt;span style=&quot;color:#bababa;&quot;&gt;display&lt;/span&gt;: &lt;span style=&quot;color:#a5c261;&quot;&gt;block&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;padding&lt;/span&gt;: &lt;span style=&quot;color:#6897bb;&quot;&gt;30&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;px&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;margin&lt;/span&gt;: &lt;span style=&quot;color:#6897bb;&quot;&gt;30&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;px&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;background-color&lt;/span&gt;: &lt;span style=&quot;color:#a5c261;&quot;&gt;purple&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;        &lt;/span&gt;}&lt;br /&gt;&lt;br /&gt;        &lt;span style=&quot;color:#e8bf6a;&quot;&gt;#id-style-2 &lt;/span&gt;{&lt;br /&gt;            &lt;span style=&quot;color:#bababa;&quot;&gt;background-color&lt;/span&gt;: &lt;span style=&quot;color:#a5c261;&quot;&gt;skyblue&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;margin&lt;/span&gt;: &lt;span style=&quot;color:#6897bb;&quot;&gt;50&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;px&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;padding&lt;/span&gt;: &lt;span style=&quot;color:#6897bb;&quot;&gt;50&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;px&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;        &lt;/span&gt;}&lt;br /&gt;&lt;br /&gt;        &lt;span style=&quot;color:#cc7832;&quot;&gt;div &lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;#id-style-3 &lt;/span&gt;{&lt;br /&gt;            &lt;span style=&quot;color:#bababa;&quot;&gt;background-color&lt;/span&gt;: &lt;span style=&quot;color:#a5c261;&quot;&gt;salmon&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;margin&lt;/span&gt;: &lt;span style=&quot;color:#6897bb;&quot;&gt;60&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;px&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;padding&lt;/span&gt;: &lt;span style=&quot;color:#6897bb;&quot;&gt;60&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;px&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;        &lt;/span&gt;}&lt;br /&gt;&lt;br /&gt;        &lt;span style=&quot;color:#cc7832;&quot;&gt;ul &lt;/span&gt;{&lt;br /&gt;            &lt;span style=&quot;color:#bababa;&quot;&gt;color&lt;/span&gt;: &lt;span style=&quot;color:#a5c261;&quot;&gt;black&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;        &lt;/span&gt;}&lt;br /&gt;&lt;br /&gt;        &lt;span style=&quot;color:#cc7832;&quot;&gt;li &lt;/span&gt;&amp;gt; &lt;span style=&quot;color:#cc7832;&quot;&gt;ul &lt;/span&gt;{&lt;br /&gt;            &lt;span style=&quot;color:#bababa;&quot;&gt;color&lt;/span&gt;: &lt;span style=&quot;color:#a5c261;&quot;&gt;aqua&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;        &lt;/span&gt;}&lt;br /&gt;&lt;br /&gt;        &lt;span style=&quot;color:#cc7832;&quot;&gt;li &lt;/span&gt;&amp;gt; .&lt;span style=&quot;color:#e8bf6a;&quot;&gt;ul-class &lt;/span&gt;{&lt;br /&gt;            &lt;span style=&quot;color:#bababa;&quot;&gt;background-color&lt;/span&gt;: &lt;span style=&quot;color:#a5c261;&quot;&gt;salmon&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;color&lt;/span&gt;: &lt;span style=&quot;color:#a5c261;&quot;&gt;mediumpurple&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;        &lt;/span&gt;}&lt;br /&gt;&lt;br /&gt;    &lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/style&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/head&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;body&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;    &amp;lt;div &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;id&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;=&quot;id-style-with-important&quot; &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;stlye&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;=&quot;background-color: green&quot; &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;id&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;=&quot;id-style&quot; &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;=&quot;class-style&quot;  &lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &lt;/span&gt;!important &lt;span style=&quot;font-family:'Arial Unicode MS';&quot;&gt;적용 우선&lt;/span&gt;!&lt;br /&gt;    &lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;    &amp;lt;div &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;style&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;=&quot;&lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;background-color&lt;/span&gt;: &lt;span style=&quot;color:#a5c261;&quot;&gt;green&quot; &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;id&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;=&quot;id-style&quot; &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;=&quot;class-style&quot;  &lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &lt;/span&gt;&lt;span style=&quot;font-family:'Arial Unicode MS';&quot;&gt;인라인 스타일 적용 우선&lt;/span&gt;!&lt;br /&gt;    &lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;    &amp;lt;div &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;id&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;=&quot;id-style&quot; &lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &lt;/span&gt;&lt;span style=&quot;font-family:'Arial Unicode MS';&quot;&gt;클래스 스타일 적용 우선&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family:'Arial Unicode MS';&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;    &amp;lt;div &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;=&quot;class-style&quot; &lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &lt;/span&gt;id &lt;span style=&quot;font-family:'Arial Unicode MS';&quot;&gt;스타일 적용 우선&lt;/span&gt;!&lt;br /&gt;    &lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;    &amp;lt;div&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &lt;/span&gt;&lt;span style=&quot;font-family:'Arial Unicode MS';&quot;&gt;태그에서는 나중에 온 것이 먼저 온 것을 덮는다&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family:'Arial Unicode MS';&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;    &amp;lt;div &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;id&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;=&quot;id-style-2&quot; &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;id&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;=&quot;id-style&quot;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &lt;/span&gt;id&lt;span style=&quot;font-family:'Arial Unicode MS';&quot;&gt;나 &lt;/span&gt;class&lt;span style=&quot;font-family:'Arial Unicode MS';&quot;&gt;는 먼저 나온 것이 적용된다&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family:'Arial Unicode MS';&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;    &amp;lt;li&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &amp;lt;ul &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;=&quot;ul-class&quot;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;font-family:'Arial Unicode MS';&quot;&gt;특정도에 의해 &lt;/span&gt;li &amp;gt; .ul-class &lt;span style=&quot;font-family:'Arial Unicode MS';&quot;&gt;스타일이 적용된다&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;    &amp;lt;/li&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/body&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/html&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 18pt;&quot;&gt;&lt;span style=&quot;color: rgb(31, 218, 17);&quot;&gt;|&lt;/span&gt; 참고자료 (References)&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://www.yes24.com/Product/Goods/34890410?scode=032&amp;amp;OzSrank=4&quot;&gt;http://www.yes24.com/Product/Goods/34890410?scode=032&amp;amp;OzSrank=4&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://www.zerocho.com/category/CSS/post/588cb95ca63e64132496a5d5&quot;&gt;https://www.zerocho.com/category/CSS/post/588cb95ca63e64132496a5d5&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://mainia.tistory.com/3243&quot;&gt;https://mainia.tistory.com/3243&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://specifishity.com/&quot;&gt;https://specifishity.com/&lt;/a&gt;&lt;/p&gt;</description>
      <category>Language &amp;amp; Solution/HTML&amp;amp;CSS</category>
      <category>CSS</category>
      <category>CSS 우선순위</category>
      <author>새로비</author>
      <guid isPermaLink="true">https://engkimbs.tistory.com/913</guid>
      <comments>https://engkimbs.tistory.com/entry/HTMLCSS-CSS-%EC%8A%A4%ED%83%80%EC%9D%BC-%EC%9A%B0%EC%84%A0%EC%88%9C%EC%9C%84#entry913comment</comments>
      <pubDate>Wed, 2 Oct 2019 18:22:32 +0900</pubDate>
    </item>
    <item>
      <title>[HTML&amp;amp;CSS] 블록 레벨, 인라인 레벨 요소 (Block Level Element, Inline Level Element)</title>
      <link>https://engkimbs.tistory.com/entry/HTMLCSS-%EB%B8%94%EB%A1%9D-%EB%A0%88%EB%B2%A8-%EC%9D%B8%EB%9D%BC%EC%9D%B8-%EB%A0%88%EB%B2%A8-%EC%9A%94%EC%86%8C-Block-Level-Element-Inline-Level-Element</link>
      <description>&lt;p style=&quot;line-height: 2;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;*현 포스팅의 HTML 코드의 실행환경을 만들고 싶으신 분들은 아래 포스팅을 참고하시면 좋을 것 같습니다.&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;line-height: 2;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;line-height: 2; text-align: center;&quot;&gt;&lt;a href=&quot;https://engkimbs.tistory.com/802&quot; target=&quot;_blank&quot;&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;[Language &amp;amp; Solution/Node.js] - npm과 lite-server로 HTML, CSS 실습관경 만들기&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;p style=&quot;line-height: 2;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;line-height: 2;&quot;&gt;&lt;span style=&quot;font-size: 18pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(31, 218, 17); font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;line-height: 2;&quot;&gt;&lt;span style=&quot;font-size: 18pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(31, 218, 17); font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;|&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt; 블록 레벨 요소 및 인라인 레벨 요소(Block Level Element)&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;line-height: 2;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;line-height: 2;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;블록 레벨(block-level) : 태그를 사용해 요소를 삽입했을 때 혼자 한 줄을 차지하는 요소입니다. 이 한 줄을 차지한다는 의미는 너비가 100%라는 것을 뜻합니다. 따라서 다음 요소가 양 옆으로 붙을 공간이 없어서 자연스럽게 줄넘김이 됩니다.&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;line-height: 2;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;line-height: 2;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;블록 레벨은 다음과 같은&amp;nbsp;특징이 있습니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;line-height: 2;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;ul style=&quot;list-style-type: disc;&quot;&gt;&lt;li&gt;&lt;p style=&quot;line-height: 2;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;margin, width, height 속성을 정의하면 모두 적용됩니다. 이런 특성 때문에 블록 속성을 가진 태그를 화면 구성이나 레이아웃에 사용할 수 있습니다.&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div style=&quot;line-height: 2;&quot;&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;; font-size: 18pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(31, 218, 17); font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;|&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt; 인라인 레벨 요소(Inline Level Element)&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;인라인 레벨(inline-level) : 줄을 차지하지 않는 요소입니다. 브라우저같은 화면에 표시되는 컨텐츠만큼 영역을 차지하고 나머지 공간에는 다른 요소가 올 수 있습니다. 따라서 한 줄에 여러 개의 인라인 레벨 요소를 표시하는 것이 가능합니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;인라인 레벨은 다음과 같은 특징이 있습니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;ul style=&quot;list-style-type: disc;&quot;&gt;&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;상, 하단 외부 여백(margin-top, margin-bottom) 속성을 정의해도 적용되지 않습니다. 상, 하 여백은 margin이 아니라 line-height 속성에 의해 발생됩니다.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;너비(width)와 높이(height) 속성이 적용되지 않습니다. 인라인 요소의 너비 및 높이는 태그가 품고 있는 내부 요소 부피에 맞춰집니다.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;인라인 속성을 가진 태그끼리 연속으로 사용되는 경우 최소한의 간격을 유지하기 위해 좌, 우에 약 5px 가량의 외부 여백이 자동으로 발생합니다.&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;/div&gt;&lt;pre&quot; class=&quot;brush:css&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;다음은 블록 레벨, 인라인 레벨인 태그들의 목록입니다.&lt;/span&gt;&lt;/pre&quot;&gt;&lt;div style=&quot;line-height: 2;&quot;&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;table class=&quot;txc-table&quot; width=&quot;692&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; border=&quot;0&quot; style=&quot;border:none;border-collapse:collapse;;font-family:&quot; 맑은=&quot;&quot; 고딕&quot;,=&quot;&quot; sans-serif;font-size:16px&quot;=&quot;&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;width: 124px; height: 24px; border-width: 1px; border-style: solid; border-color: rgb(204, 204, 204); background-color: rgb(217, 229, 255);&quot;&gt;&lt;p&gt;&lt;b&gt;블록 레벨&lt;/b&gt;&amp;nbsp;&lt;/p&gt;&lt;/td&gt;
&lt;td style=&quot;width: 567px; height: 24px; border-bottom: 1px solid rgb(204, 204, 204); border-right: 1px solid rgb(204, 204, 204); border-top: 1px solid rgb(204, 204, 204);&quot;&gt;&lt;p&gt;&amp;nbsp;&amp;lt;p&amp;gt;, &amp;lt;h1&amp;gt;~&amp;lt;h6&amp;gt;, &amp;lt;ul&amp;gt;, &amp;lt;ol&amp;gt;, &amp;lt;div&amp;gt;, &amp;lt;blockquote&amp;gt;, &amp;lt;form&amp;gt;, &amp;lt;hr&amp;gt;, &amp;lt;table&amp;gt;, &amp;lt;fieldset&amp;gt;, &amp;lt;address&amp;gt;&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td style=&quot;width: 124px; height: 43px; border-bottom: 1px solid rgb(204, 204, 204); border-right: 1px solid rgb(204, 204, 204); border-left: 1px solid rgb(204, 204, 204); background-color: rgb(217, 229, 255);&quot;&gt;&lt;p&gt;&lt;b&gt;인라인 레벨&lt;/b&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td style=&quot;width: 567px; height: 43px; border-bottom: 1px solid rgb(204, 204, 204); border-right: 1px solid rgb(204, 204, 204);&quot;&gt;&lt;p&gt;&amp;nbsp;&amp;lt;a&amp;gt;, &amp;lt;img&amp;gt;, &amp;lt;object&amp;gt;, &amp;lt;br&amp;gt;, &amp;lt;sub&amp;gt;, &amp;lt;sup&amp;gt;, &amp;lt;span&amp;gt;, &amp;lt;input&amp;gt;, &amp;lt;textarea&amp;gt;, &amp;lt;label&amp;gt;, &amp;lt;button&amp;gt;&amp;nbsp;&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;; font-size: 18pt;&quot;&gt;&lt;span style=&quot;color: rgb(31, 218, 17);&quot;&gt;| &lt;/span&gt;블록, 인라인 요소 예제 (Block, Inline Element Example)&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;; font-size: 18pt;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;; font-size: 12pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;line-height: 2;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;; font-size: 18pt;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;; font-size: 12pt;&quot;&gt;&lt;b&gt;&lt;/b&gt;다음은 블록과 인라인 요소가 조합되어있는 예제입니다. 아래 HTML 코드를 실행하면 다음과 같은 그림이 브라우져 상에서 실행되게 됩니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;pre style=&quot;background-color: rgb(43, 43, 43); font-family: &amp;quot;Source Code Pro&amp;quot;; font-size: 9.8pt;&quot;&gt;&lt;p style=&quot;&quot;&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;&amp;lt;!DOCTYPE &lt;/span&gt;&lt;span style=&quot;color: rgb(186, 186, 186);&quot;&gt;html&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;&amp;lt;html &lt;/span&gt;&lt;span style=&quot;color: rgb(186, 186, 186);&quot;&gt;lang&lt;/span&gt;&lt;span style=&quot;color: rgb(165, 194, 97);&quot;&gt;=&quot;en&quot;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;&amp;lt;head&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;    &amp;lt;meta &lt;/span&gt;&lt;span style=&quot;color: rgb(186, 186, 186);&quot;&gt;charset&lt;/span&gt;&lt;span style=&quot;color: rgb(165, 194, 97);&quot;&gt;=&quot;UTF-8&quot;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;    &amp;lt;title&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(169, 183, 198); font-family: &amp;quot;Arial Unicode MS&amp;quot;;&quot;&gt;블록&lt;/span&gt;&lt;font color=&quot;#a9b7c6&quot;&gt;, &lt;/font&gt;&lt;span style=&quot;color: rgb(169, 183, 198); font-family: &amp;quot;Arial Unicode MS&amp;quot;;&quot;&gt;인라인&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;&amp;lt;/title&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;    &amp;lt;style&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;        &lt;/span&gt;&lt;font color=&quot;#a9b7c6&quot;&gt;.&lt;/font&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;inline-div &lt;/span&gt;&lt;font color=&quot;#a9b7c6&quot;&gt;{&lt;br /&gt;            &lt;/font&gt;&lt;span style=&quot;color: rgb(186, 186, 186);&quot;&gt;display&lt;/span&gt;&lt;font color=&quot;#a9b7c6&quot;&gt;: &lt;/font&gt;&lt;span style=&quot;color: rgb(165, 194, 97);&quot;&gt;inline&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color: rgb(186, 186, 186);&quot;&gt;margin&lt;/span&gt;&lt;font color=&quot;#a9b7c6&quot;&gt;: &lt;/font&gt;&lt;span style=&quot;color: rgb(104, 151, 187);&quot;&gt;20&lt;/span&gt;&lt;span style=&quot;color: rgb(165, 194, 97);&quot;&gt;px&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color: rgb(128, 128, 128);&quot;&gt;/* &lt;/span&gt;&lt;span style=&quot;color: rgb(128, 128, 128); font-family: &amp;quot;Arial Unicode MS&amp;quot;;&quot;&gt;인라인 블록은&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 128, 128);&quot;&gt; margin&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 128, 128); font-family: &amp;quot;Arial Unicode MS&amp;quot;;&quot;&gt;으로 여백을 정의할 수 없습니다&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 128, 128);&quot;&gt; */&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 128, 128);&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color: rgb(186, 186, 186);&quot;&gt;padding&lt;/span&gt;&lt;font color=&quot;#a9b7c6&quot;&gt;: &lt;/font&gt;&lt;span style=&quot;color: rgb(104, 151, 187);&quot;&gt;20&lt;/span&gt;&lt;span style=&quot;color: rgb(165, 194, 97);&quot;&gt;px&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color: rgb(128, 128, 128);&quot;&gt;/* padding&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 128, 128); font-family: &amp;quot;Arial Unicode MS&amp;quot;;&quot;&gt;은 가능 합니다&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 128, 128);&quot;&gt;*/&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 128, 128);&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color: rgb(186, 186, 186);&quot;&gt;width&lt;/span&gt;&lt;font color=&quot;#a9b7c6&quot;&gt;: &lt;/font&gt;&lt;font color=&quot;#6897bb&quot;&gt;400&lt;/font&gt;&lt;span style=&quot;color: rgb(165, 194, 97);&quot;&gt;px&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color: rgb(128, 128, 128);&quot;&gt;/* width, height &lt;/span&gt;&lt;span style=&quot;color: rgb(128, 128, 128); font-family: &amp;quot;Arial Unicode MS&amp;quot;;&quot;&gt;모두 영향을 미치지 못합니다&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 128, 128);&quot;&gt; */&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 128, 128);&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color: rgb(186, 186, 186);&quot;&gt;height&lt;/span&gt;&lt;font color=&quot;#a9b7c6&quot;&gt;: &lt;/font&gt;&lt;font color=&quot;#6897bb&quot;&gt;200&lt;/font&gt;&lt;span style=&quot;color: rgb(165, 194, 97);&quot;&gt;px&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color: rgb(186, 186, 186);&quot;&gt;border-style&lt;/span&gt;&lt;font color=&quot;#a9b7c6&quot;&gt;: &lt;/font&gt;&lt;span style=&quot;color: rgb(165, 194, 97);&quot;&gt;solid&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color: rgb(186, 186, 186);&quot;&gt;border-width&lt;/span&gt;&lt;font color=&quot;#a9b7c6&quot;&gt;: &lt;/font&gt;&lt;span style=&quot;color: rgb(104, 151, 187);&quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color: rgb(165, 194, 97);&quot;&gt;px&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color: rgb(186, 186, 186);&quot;&gt;background-color&lt;/span&gt;&lt;font color=&quot;#a9b7c6&quot;&gt;: &lt;/font&gt;&lt;span style=&quot;color: rgb(165, 194, 97);&quot;&gt;red&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;        &lt;/span&gt;&lt;font color=&quot;#a9b7c6&quot;&gt;}&lt;br /&gt;&lt;br /&gt;        .&lt;/font&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;block-div &lt;/span&gt;&lt;font color=&quot;#a9b7c6&quot;&gt;{&lt;br /&gt;            &lt;/font&gt;&lt;span style=&quot;color: rgb(186, 186, 186);&quot;&gt;display&lt;/span&gt;&lt;font color=&quot;#a9b7c6&quot;&gt;: &lt;/font&gt;&lt;span style=&quot;color: rgb(165, 194, 97);&quot;&gt;block&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color: rgb(186, 186, 186);&quot;&gt;margin&lt;/span&gt;&lt;font color=&quot;#a9b7c6&quot;&gt;: &lt;/font&gt;&lt;span style=&quot;color: rgb(104, 151, 187);&quot;&gt;20&lt;/span&gt;&lt;span style=&quot;color: rgb(165, 194, 97);&quot;&gt;px&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color: rgb(128, 128, 128);&quot;&gt;/* &lt;/span&gt;&lt;span style=&quot;color: rgb(128, 128, 128); font-family: &amp;quot;Arial Unicode MS&amp;quot;;&quot;&gt;블록 요소는&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 128, 128);&quot;&gt; margin, width, height &lt;/span&gt;&lt;span style=&quot;color: rgb(128, 128, 128); font-family: &amp;quot;Arial Unicode MS&amp;quot;;&quot;&gt;모두 영향을 받습니다&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 128, 128);&quot;&gt;*/&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 128, 128);&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color: rgb(186, 186, 186);&quot;&gt;padding&lt;/span&gt;&lt;font color=&quot;#a9b7c6&quot;&gt;: &lt;/font&gt;&lt;span style=&quot;color: rgb(104, 151, 187);&quot;&gt;20&lt;/span&gt;&lt;span style=&quot;color: rgb(165, 194, 97);&quot;&gt;px&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color: rgb(186, 186, 186);&quot;&gt;width&lt;/span&gt;&lt;font color=&quot;#a9b7c6&quot;&gt;: &lt;/font&gt;&lt;span style=&quot;color: rgb(104, 151, 187);&quot;&gt;400&lt;/span&gt;&lt;span style=&quot;color: rgb(165, 194, 97);&quot;&gt;px&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color: rgb(186, 186, 186);&quot;&gt;height&lt;/span&gt;&lt;font color=&quot;#a9b7c6&quot;&gt;: &lt;/font&gt;&lt;span style=&quot;color: rgb(104, 151, 187);&quot;&gt;100&lt;/span&gt;&lt;span style=&quot;color: rgb(165, 194, 97);&quot;&gt;px&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color: rgb(186, 186, 186);&quot;&gt;border-style&lt;/span&gt;&lt;font color=&quot;#a9b7c6&quot;&gt;: &lt;/font&gt;&lt;span style=&quot;color: rgb(165, 194, 97);&quot;&gt;solid&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color: rgb(186, 186, 186);&quot;&gt;border-width&lt;/span&gt;&lt;font color=&quot;#a9b7c6&quot;&gt;: &lt;/font&gt;&lt;span style=&quot;color: rgb(104, 151, 187);&quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color: rgb(165, 194, 97);&quot;&gt;px&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;        &lt;/span&gt;&lt;font color=&quot;#a9b7c6&quot;&gt;}&lt;br /&gt;    &lt;/font&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;&amp;lt;/style&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;&amp;lt;/head&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;&amp;lt;body&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;    &amp;lt;div &lt;/span&gt;&lt;span style=&quot;color: rgb(186, 186, 186);&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color: rgb(165, 194, 97);&quot;&gt;=&quot;block-div&quot;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;        &lt;/span&gt;&lt;span style=&quot;color: rgb(169, 183, 198); font-family: &amp;quot;Arial Unicode MS&amp;quot;;&quot;&gt;블록&lt;/span&gt;&lt;font color=&quot;#a9b7c6&quot;&gt;1&lt;br /&gt;    &lt;/font&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;    &amp;lt;div &lt;/span&gt;&lt;span style=&quot;color: rgb(186, 186, 186);&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color: rgb(165, 194, 97);&quot;&gt;=&quot;inline-div&quot;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;        &lt;/span&gt;&lt;span style=&quot;color: rgb(169, 183, 198); font-family: &amp;quot;Arial Unicode MS&amp;quot;;&quot;&gt;인라인&lt;/span&gt;&lt;font color=&quot;#a9b7c6&quot;&gt;1&lt;br /&gt;    &lt;/font&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;    &amp;lt;div &lt;/span&gt;&lt;span style=&quot;color: rgb(186, 186, 186);&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color: rgb(165, 194, 97);&quot;&gt;=&quot;inline-div&quot;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;        &lt;/span&gt;&lt;span style=&quot;color: rgb(169, 183, 198); font-family: &amp;quot;Arial Unicode MS&amp;quot;;&quot;&gt;인라인&lt;/span&gt;&lt;font color=&quot;#a9b7c6&quot;&gt;2&lt;br /&gt;    &lt;/font&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;    &amp;lt;div &lt;/span&gt;&lt;span style=&quot;color: rgb(186, 186, 186);&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color: rgb(165, 194, 97);&quot;&gt;=&quot;inline-div&quot;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;        &lt;/span&gt;&lt;span style=&quot;color: rgb(169, 183, 198); font-family: &amp;quot;Arial Unicode MS&amp;quot;;&quot;&gt;인라인&lt;/span&gt;&lt;font color=&quot;#a9b7c6&quot;&gt;3&lt;br /&gt;    &lt;/font&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;    &amp;lt;div &lt;/span&gt;&lt;span style=&quot;color: rgb(186, 186, 186);&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color: rgb(165, 194, 97);&quot;&gt;=&quot;block-div&quot;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;        &lt;/span&gt;&lt;span style=&quot;color: rgb(169, 183, 198); font-family: &amp;quot;Arial Unicode MS&amp;quot;;&quot;&gt;블록&lt;/span&gt;&lt;font color=&quot;#a9b7c6&quot;&gt;2&lt;br /&gt;    &lt;/font&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;    &amp;lt;div &lt;/span&gt;&lt;span style=&quot;color: rgb(186, 186, 186);&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color: rgb(165, 194, 97);&quot;&gt;=&quot;block-div&quot;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;        &lt;/span&gt;&lt;span style=&quot;color: rgb(169, 183, 198); font-family: &amp;quot;Arial Unicode MS&amp;quot;;&quot;&gt;블록&lt;/span&gt;&lt;font color=&quot;#a9b7c6&quot;&gt;3&lt;br /&gt;    &lt;/font&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;    &amp;lt;div &lt;/span&gt;&lt;span style=&quot;color: rgb(186, 186, 186);&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color: rgb(165, 194, 97);&quot;&gt;=&quot;block-div&quot;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;        &lt;/span&gt;&lt;span style=&quot;color: rgb(169, 183, 198); font-family: &amp;quot;Arial Unicode MS&amp;quot;;&quot;&gt;블록&lt;/span&gt;&lt;font color=&quot;#a9b7c6&quot;&gt;4&lt;br /&gt;    &lt;/font&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;&amp;lt;/body&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(232, 191, 106);&quot;&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;/pre&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 464px; text-align: center;; height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/9994C7495D94918B1E&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F9994C7495D94918B1E&quot; width=&quot;464&quot; height=&quot;695&quot; filename=&quot;캡처_2019_10_02_21_00_23_257.png&quot; filemime=&quot;image/jpeg&quot; style=&quot;text-align: center;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;ul&gt;&lt;li style=&quot;line-height: 2;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;블록 레벨이 된 div 태그들은 위에서 아래로 전체 너비를 차지하며 그려지는 것을 볼 수 있습니다.&lt;/span&gt;&lt;/li&gt;&lt;li style=&quot;line-height: 2;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;인라인 태그는 한 줄에 나란히 배치됩니다&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li style=&quot;line-height: 2;&quot;&gt;&lt;span style=&quot;font-family: Arial;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;여기서 주목해야할 점은 블록 요소는 margin, width, height 모두 영향을 받는 다는 것 그리고&amp;nbsp;인라인은 이 요소들 모두 영향을 미치지 않는다는 것을 알 수 있습니다&lt;/span&gt;.&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p style=&quot;line-height: 2;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;line-height: 1.5;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 18pt;&quot;&gt;&lt;span style=&quot;color: rgb(31, 218, 17);&quot;&gt;|&lt;/span&gt; 인라인과 블록의 합성 속성 inline-block (Inline Block Attribute)&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;line-height: 1.5;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;line-height: 2;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;inline-block이라는 속성은 인라인과 같인 한 줄에 표현하면서도 margin, width, height 속성을 정의하면 표현해 줍니다. 이 속성을 기본적으로 가지고 있는 태그가 없기 때문에 따로 inline-block이라 선언을 해야합니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;line-height: 2;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;line-height: 2;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;인라인과 다르게 inline-block은 다음과 같은 속성이 있습니다.&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;line-height: 2;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;line-height: 2;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;상, 하단 외부 여백 속성(margin-top, margin-bottom)을 정의할 수 있습니다. inline-block 요소의 상, 하 여백을 margin, line-height 두 가지 속성 모두를 통해 설정할 수 있습니다.&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;line-height: 2;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;너비(width)와 높이(height) 속성이 적용됩니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;line-height: 2;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;인라인과 같이 최소한의 간격을 유지하기 위해 5px 가량의 외부 여백이 자동으로 발생하지만 margin-left, margin-right를 사용하여 추가로 여백을 지정할 수 있습니다.&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;line-height: 2;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;line-height: 2;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;; font-size: 18pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(31, 218, 17);&quot;&gt;| &lt;/span&gt;인라인 블록 예제 (Inline Block Example)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;pre style=&quot;background-color:#2b2b2b;color:#a9b7c6;font-family:'Source Code Pro';font-size:9.8pt;&quot;&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;!DOCTYPE &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;html&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;html &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;lang&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;=&quot;en&quot;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;head&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;    &amp;lt;meta &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;charset&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;=&quot;UTF-8&quot;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;    &amp;lt;title&amp;gt;&lt;/span&gt;&lt;span style=&quot;font-family:'Arial Unicode MS';&quot;&gt;블록&lt;/span&gt;, &lt;span style=&quot;font-family:'Arial Unicode MS';&quot;&gt;인라인&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/title&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;    &amp;lt;style&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &lt;/span&gt;.&lt;span style=&quot;color:#e8bf6a;&quot;&gt;inline-div &lt;/span&gt;{&lt;br /&gt;            &lt;span style=&quot;color:#bababa;&quot;&gt;display&lt;/span&gt;: &lt;span style=&quot;color:#a5c261;&quot;&gt;inline-block&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;margin&lt;/span&gt;: &lt;span style=&quot;color:#6897bb;&quot;&gt;20&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;px&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color:#808080;&quot;&gt;/* inline-block&lt;/span&gt;&lt;span style=&quot;color:#808080;font-family:'Arial Unicode MS';&quot;&gt;은&lt;/span&gt;&lt;span style=&quot;color:#808080;&quot;&gt; margin&lt;/span&gt;&lt;span style=&quot;color:#808080;font-family:'Arial Unicode MS';&quot;&gt;으로 여백을 정의 가능&lt;/span&gt;&lt;span style=&quot;color:#808080;&quot;&gt; */&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#808080;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;padding&lt;/span&gt;: &lt;span style=&quot;color:#6897bb;&quot;&gt;20&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;px&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;width&lt;/span&gt;: &lt;span style=&quot;color:#6897bb;&quot;&gt;400&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;px&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color:#808080;&quot;&gt;/* width, height &lt;/span&gt;&lt;span style=&quot;color:#808080;font-family:'Arial Unicode MS';&quot;&gt;모두 정의 가능&lt;/span&gt;&lt;span style=&quot;color:#808080;&quot;&gt; */&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#808080;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;height&lt;/span&gt;: &lt;span style=&quot;color:#6897bb;&quot;&gt;200&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;px&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;border-style&lt;/span&gt;: &lt;span style=&quot;color:#a5c261;&quot;&gt;solid&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;border-width&lt;/span&gt;: &lt;span style=&quot;color:#6897bb;&quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;px&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;background-color&lt;/span&gt;: &lt;span style=&quot;color:#a5c261;&quot;&gt;red&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;        &lt;/span&gt;}&lt;br /&gt;&lt;br /&gt;        .&lt;span style=&quot;color:#e8bf6a;&quot;&gt;block-div &lt;/span&gt;{&lt;br /&gt;            &lt;span style=&quot;color:#bababa;&quot;&gt;display&lt;/span&gt;: &lt;span style=&quot;color:#a5c261;&quot;&gt;block&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;margin&lt;/span&gt;: &lt;span style=&quot;color:#6897bb;&quot;&gt;20&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;px&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color:#808080;&quot;&gt;/* &lt;/span&gt;&lt;span style=&quot;color:#808080;font-family:'Arial Unicode MS';&quot;&gt;블록 요소는&lt;/span&gt;&lt;span style=&quot;color:#808080;&quot;&gt; margin, width, height &lt;/span&gt;&lt;span style=&quot;color:#808080;font-family:'Arial Unicode MS';&quot;&gt;모두 영향을 받습니다&lt;/span&gt;&lt;span style=&quot;color:#808080;&quot;&gt;*/&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#808080;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;padding&lt;/span&gt;: &lt;span style=&quot;color:#6897bb;&quot;&gt;20&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;px&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;width&lt;/span&gt;: &lt;span style=&quot;color:#6897bb;&quot;&gt;400&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;px&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;height&lt;/span&gt;: &lt;span style=&quot;color:#6897bb;&quot;&gt;100&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;px&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;border-style&lt;/span&gt;: &lt;span style=&quot;color:#a5c261;&quot;&gt;solid&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;border-width&lt;/span&gt;: &lt;span style=&quot;color:#6897bb;&quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;px&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;        &lt;/span&gt;}&lt;br /&gt;    &lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/style&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/head&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;body&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;    &amp;lt;div &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;=&quot;block-div&quot;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &lt;/span&gt;&lt;span style=&quot;font-family:'Arial Unicode MS';&quot;&gt;블록&lt;/span&gt;1&lt;br /&gt;    &lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;    &amp;lt;div &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;=&quot;inline-div&quot;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &lt;/span&gt;&lt;span style=&quot;font-family:'Arial Unicode MS';&quot;&gt;인라인&lt;/span&gt;1&lt;br /&gt;    &lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;    &amp;lt;div &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;=&quot;inline-div&quot;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &lt;/span&gt;&lt;span style=&quot;font-family:'Arial Unicode MS';&quot;&gt;인라인&lt;/span&gt;2&lt;br /&gt;    &lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;    &amp;lt;div &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;=&quot;inline-div&quot;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &lt;/span&gt;&lt;span style=&quot;font-family:'Arial Unicode MS';&quot;&gt;인라인&lt;/span&gt;3&lt;br /&gt;    &lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;    &amp;lt;div &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;=&quot;block-div&quot;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &lt;/span&gt;&lt;span style=&quot;font-family:'Arial Unicode MS';&quot;&gt;블록&lt;/span&gt;2&lt;br /&gt;    &lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;    &amp;lt;div &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;=&quot;block-div&quot;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &lt;/span&gt;&lt;span style=&quot;font-family:'Arial Unicode MS';&quot;&gt;블록&lt;/span&gt;3&lt;br /&gt;    &lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;    &amp;lt;div &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;=&quot;block-div&quot;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &lt;/span&gt;&lt;span style=&quot;font-family:'Arial Unicode MS';&quot;&gt;블록&lt;/span&gt;4&lt;br /&gt;    &lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/body&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/html&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 728px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/99DC2E435D9493BE26&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F99DC2E435D9493BE26&quot; width=&quot;728&quot; height=&quot;783&quot; filename=&quot;캡처_2019_10_02_21_09_01_164.png&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;ul style=&quot;list-style-type: disc;&quot;&gt;&lt;li style=&quot;line-height: 2;&quot;&gt;inline-block은 너비(width)가 찾을 시 블럭 속성처럼 요소가 아래로 줄바꿈이 되는 것을 볼 수 있습니다.&amp;nbsp;&lt;/li&gt;&lt;li style=&quot;line-height: 2;&quot;&gt;또한&amp;nbsp;margin, width, height 속성 모두 영향을 받는다는 것을 알 수 있습니다.&amp;nbsp;&lt;/li&gt;&lt;li style=&quot;line-height: 2;&quot;&gt;참고로 브라우저의&amp;nbsp;너비를 좁혀 inline-block이 모두 한 줄에 들어가기&amp;nbsp;충분하지 않을 경우 위 inline-block이 아래로 내려오는 것을 볼 수 있습니다.&amp;nbsp;&lt;/li&gt;&lt;/ul&gt;&lt;p style=&quot;line-height: 2;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 435px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/99210E4B5D94944F2B&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F99210E4B5D94944F2B&quot; width=&quot;435&quot; height=&quot;958&quot; filename=&quot;캡처_2019_10_02_21_09_11_893.png&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 18pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(31, 218, 17);&quot;&gt;| &lt;/span&gt;참고자료 (References)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;line-height: 2;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;line-height: 2;&quot;&gt;&lt;a href=&quot;http://www.beautifulcss.com/archives/1179&quot;&gt;http://www.beautifulcss.com/archives/1179&lt;/a&gt;&lt;/p&gt;&lt;p style=&quot;line-height: 2;&quot;&gt;&lt;a href=&quot;http://www.yes24.com/Product/Goods/34890410?scode=032&amp;amp;OzSrank=2&quot;&gt;http://www.yes24.com/Product/Goods/34890410?scode=032&amp;amp;OzSrank=2&lt;/a&gt;&lt;/p&gt;&lt;p style=&quot;line-height: 2;&quot;&gt;&lt;a href=&quot;http://blog.naver.com/PostView.nhn?blogId=gumpofmay&amp;amp;logNo=80208082273&amp;amp;categoryNo=24&amp;amp;parentCategoryNo=0&amp;amp;viewDate=&amp;amp;currentPage=1&amp;amp;postListTopCurrentPage=1&amp;amp;from=postView&quot;&gt;http://blog.naver.com/PostView.nhn?blogId=gumpofmay&amp;amp;logNo=80208082273&amp;amp;categoryNo=24&amp;amp;parentCategoryNo=0&amp;amp;viewDate=&amp;amp;currentPage=1&amp;amp;postListTopCurrentPage=1&amp;amp;from=postView&lt;/a&gt;&lt;/p&gt;&lt;p style=&quot;line-height: 2;&quot;&gt;&lt;pre&quot; class=&quot;brush:css&quot;&gt;&lt;/pre&quot;&gt;&lt;/p&gt;&lt;p style=&quot;line-height: 2;&quot;&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;p style=&quot;line-height: 2;&quot;&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>Language &amp;amp; Solution/HTML&amp;amp;CSS</category>
      <category>CSS</category>
      <category>CSS Box Model</category>
      <author>새로비</author>
      <guid isPermaLink="true">https://engkimbs.tistory.com/912</guid>
      <comments>https://engkimbs.tistory.com/entry/HTMLCSS-%EB%B8%94%EB%A1%9D-%EB%A0%88%EB%B2%A8-%EC%9D%B8%EB%9D%BC%EC%9D%B8-%EB%A0%88%EB%B2%A8-%EC%9A%94%EC%86%8C-Block-Level-Element-Inline-Level-Element#entry912comment</comments>
      <pubDate>Wed, 2 Oct 2019 16:24:01 +0900</pubDate>
    </item>
    <item>
      <title>[파이썬 웹 크롤링] 부동산 공공 데이터 웹 스크래핑 시작 !</title>
      <link>https://engkimbs.tistory.com/entry/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%9B%B9-%ED%81%AC%EB%A1%A4%EB%A7%81-%EB%B6%80%EB%8F%99%EC%82%B0-%EA%B3%B5%EA%B3%B5-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EC%9B%B9-%EC%8A%A4%ED%81%AC%EB%9E%98%ED%95%91-%EC%8B%9C%EC%9E%91</link>
      <description>&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;; font-size: 24pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(31, 218, 17); font-size: 18pt;&quot;&gt;|&lt;/span&gt;&lt;span style=&quot;font-size: 18pt;&quot;&gt; 들어가기 전에&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;; font-size: 12pt;&quot;&gt;안녕하세요 새로비입니다. 최근 직장&amp;nbsp;다니면서 부동산 재테크에 눈을 뜨게 되어 열심히 투자 공부 중인 부린이(?)입니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;; font-size: 12pt;&quot;&gt;이쪽 세계에 입문하면서 알게된 여러 웹사이트, 어플리케이션들이 있는데 대표적인 것들이 아파트 실거래가, 호갱노노, zip4입니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;; font-size: 12pt;&quot;&gt;이 서비스들은 정부에서 제공하는 공공데이터 API를 토대로 만들어진 것들입니다. IT업계에 있으신 분들은 아주 친숙한 것들이지만 이쪽 분야를 잘 모르시는 분들은 그저 어렵고 복잡하기만한 분야인 것 같습니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;; font-size: 12pt;&quot;&gt;하지만 전문적인 지식이 아닌 단순히 내가 원하는 데이터를 얻고 싶거나 조그마한 어플이나 웹을 개발하는 용도면 전혀 어려운 분야가 아닙니다. 절대로! 조금만 공부해보고 관심받으면 아주 쉽게 원하는 것을 얻어갈 수 있을 거라 확신합니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;; font-size: 12pt;&quot;&gt;이런 분들이 앞으로 포스팅해나갈 강좌를 들으시면 좋을 것 같습니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;; font-size: 12pt;&quot;&gt;- 파이썬을 어느정도 아시는 분들 (파이썬을 전혀 모르시면 여기를 &lt;/span&gt;&lt;a href=&quot;https://wikidocs.net/2&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;; font-size: 12pt;&quot;&gt;클릭&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;; font-size: 12pt;&quot;&gt;하셔서 어느 정도 파이썬에 익숙해지시는 걸 추천드립니다&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;; font-size: 12pt;&quot;&gt;)&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;; font-size: 12pt;&quot;&gt;- 부동산 데이터를 수집 및 가공하여 원하는 데이터를 만들고 싶지만 그 방법을 잘 모르시는 분들&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;; font-size: 12pt;&quot;&gt;- 부동산 공공 데이터 스크래핑하는 정리된 내용을 보시고 싶은 개발자 분들&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;; font-size: 12pt;&quot;&gt;- IT개발자이면서 부동산 재테크에 눈을 뜨게 된 저같은 분들!&lt;/span&gt;&lt;/p&gt;</description>
      <category>파이썬/파이썬 웹 크롤링 - 부동산 공공데이터</category>
      <category>공공 데이터</category>
      <category>파이썬 크롤링</category>
      <author>새로비</author>
      <guid isPermaLink="true">https://engkimbs.tistory.com/911</guid>
      <comments>https://engkimbs.tistory.com/entry/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%9B%B9-%ED%81%AC%EB%A1%A4%EB%A7%81-%EB%B6%80%EB%8F%99%EC%82%B0-%EA%B3%B5%EA%B3%B5-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EC%9B%B9-%EC%8A%A4%ED%81%AC%EB%9E%98%ED%95%91-%EC%8B%9C%EC%9E%91#entry911comment</comments>
      <pubDate>Mon, 30 Sep 2019 23:02:02 +0900</pubDate>
    </item>
    <item>
      <title>[Oracle DB] Oracle 저장구조 정리(블럭, PCTFREE, PCTUSED)</title>
      <link>https://engkimbs.tistory.com/entry/Oracle-DB-Oracle-%EC%A0%80%EC%9E%A5%EA%B5%AC%EC%A1%B0-%EC%A0%95%EB%A6%AC%EB%B8%94%EB%9F%AD-PCTFREE-PCTUSED</link>
      <description>&lt;p style=&quot;line-height: 1.5;&quot;&gt;&lt;span style=&quot;font-size: 18pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(31, 218, 17);&quot;&gt;|&lt;/span&gt; 오라클 블럭(Oracle Block)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;line-height: 1.5;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;line-height: 2;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;회사에서 쓰는 레거시 DDL문을 분석해 보니 PCTFREE, PCTUSED가 나와서 이를 정리한 포스팅입니다. 무려 9i이후부터 세그먼트를 자동적으로 관리하는 ASSM(Automatic Segment Space Management&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;)가 나와&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box; color: rgb(51, 51, 51); font-family: &amp;quot;Arial Black&amp;quot;; font-size: 14px; text-indent: 14px;&quot;&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;SEGMENT SPACE MANAGEMENT AUTO 절을 넣어 자동으로 관리하고 있습니다.&lt;/span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;이렇게 수동으로 관리하는 것을 보기 어렵게 되었다고 알고있는데&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;&amp;nbsp;어쩌겠습니까? 월급쟁이의 설움 ㅠㅠ 돈 받고 일하려면 어쩔 수 없이 해야죠. (회사를 까는 거는 아닙니다 ㅎㅎ;&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;line-height: 2;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;line-height: 2;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;오라클에서의 I/O는 블럭단위로 이루어집니다. 오라클 블럭은 OS의 블럭 한 개 이상을 합쳐 만들며 DB_BLOCK_SIZE로 지정하게 됩니다(기본 오라클 DB 블럭 사이즈). 예를 들어,&amp;nbsp;오라클 블럭의 크기가 8KB이고 OS 블럭 크기가 2KB이면 OS 블럭 4개가 오라클 블럭 하나를 이루는 개념입니다.&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;line-height: 2;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;현재 쓰시는 오라클의 블럭 크기는 아래의 명령어를 통해 확인할 수 있습니다.&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;line-height: 1.5;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;pre style=&quot;background-color:#2b2b2b;color:#a9b7c6;font-family:'Source Code Pro';font-size:9.8pt;&quot;&gt;show parameter db_block_size&lt;/pre&gt;&lt;p style=&quot;line-height: 1.5;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;line-height: 2;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;이 DB_BLOCK_SIZE 파라미터는 데이터베이스를 생성할 때 지정되며 재생성하기 전까지는 변경되지 않습니다. 이 파라미터에서 지정되는 크기 값을 표준 블럭 사이즈(standard block size)라고 하고 DB_BLOCK_SIZE로 표시되는&amp;nbsp;값입니다. (Block의 크기는 2KB, 4KB, 8KB, 16KB, 32KB, 64KB가 제공)&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;line-height: 2;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;line-height: 2;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;또한 표준 블럭사이즈가 아닌 다양한 크기의 블럭 사이즈를&amp;nbsp;테이블을 만들 때 지정할 수 있습니다. 이때 블럭사이즈를 다르게 하여 테이블을 생성할 경우 DB Buffer Cache에도 블럭사이즈 만큼의 공간을 미리 할당해야 합니다.&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;line-height: 2;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;line-height: 2;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;; font-size: 18pt;&quot;&gt;&lt;span style=&quot;color: rgb(31, 218, 17);&quot;&gt;|&lt;/span&gt; PCTFREE와 PCTUSED란&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;line-height: 2;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;line-height: 2;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;PCTFREE는 블럭에 입력되어 있는 데이터들이 업데이트될 경우를 대비해서 미리 비워두는 공간입니다. 즉 사용가능한 Block 공간 중에서 데이터의&amp;nbsp;Update 등 데이터 변경을 대비해서 확보해 놓은 블럭의 비율이며 이 값은&amp;nbsp;% 수치로 지정됩니다. 만일 PCTFREE=20으로 되있으면 8KB 블럭의 20%만큼을 업데이트를 위해 비워두게 됩니다. 기본값(Default)은 10%입니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;line-height: 2;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;line-height: 2;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;PCTUFREE 비율을 적게할 경우&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;line-height: 2;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;- 기존 테이블 행 업데이트에 의한 확장을 위해 적은 공간을 확보&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;line-height: 2;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;- 많은 데이터를 한 블럭에 입력 가능&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;line-height: 2;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;line-height: 2;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;PCTFREE가 클 경우&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;line-height: 2;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;- 블럭당 적은 데이터가 입력되므로 같은 데이터를 입력하기 위해 많은 블럭이 소요됨(디스크에 차지하는 용량이 커짐)&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;line-height: 2;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;- 데이터를 업데이트할 때 수행 속도가 증가함. 따라서 업데이트가 자주 일어나는 세그먼트에 적합&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;line-height: 2;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;line-height: 2;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;PTCUSED는 오라클 서버가 테이블의 각 데이터 블럭에 대해 유지하려는 공간의 최소 백분율입니다. 블럭의 남아 있는 공간(free space)가 PCTFREE의 수치에 도달한 후, 사용된 공간이 PCTUSED 이하의 값이 되기 전까지는 해당 블럭에 새로운 데이터를 추가할 수 없는 것입니다. PCTFREE에 도달하기 전까지는 새로운 행을 Insert하지 못하고 기존 데이터를 Update만 할 수 있습니다.&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;line-height: 1.5;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;line-height: 1.5;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 628px; text-align: center;; height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/99F677465D920E7E24&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F99F677465D920E7E24&quot; width=&quot;628&quot; height=&quot;473&quot; filename=&quot;캡처.jpg&quot; filemime=&quot;image/jpeg&quot; style=&quot;text-align: center;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;line-height: 1.5;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;line-height: 2;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;그림을 예로들어 보면 PCTFREE의 값이 위의 그림과 같이 기본값 10%로 되어 있으면 90%까지 블럭의 데이터가 채워진다는 것입니다. 그리고 이만큼 다 채워지면 PCTUSED 비율인 40%까지 데이터가 비어지지 않으면 이 블럭에는 데이터가 채워지지 않는다는 의미입니다.&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;line-height: 1.5;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;line-height: 1.5;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;; font-size: 18pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(31, 218, 17);&quot;&gt;| &lt;/span&gt;특정 테이블의 PCTFREE, PCTUSED값 확인하기&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;line-height: 1.5;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;pre style=&quot;background-color:#2b2b2b;color:#a9b7c6;font-family:'Source Code Pro';font-size:9.8pt;&quot;&gt;select table_name, pct_free, pct_used&lt;br /&gt;from dba_tables&lt;br /&gt;where owner='TEST'&lt;br /&gt;and table_name = 'PCT_TEST'&lt;/pre&gt;&lt;p style=&quot;line-height: 1.5;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;line-height: 2;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;; font-size: 18pt;&quot;&gt;&lt;span style=&quot;color: rgb(31, 218, 17);&quot;&gt;|&lt;/span&gt; PCTFREE 및 PCTUSED 값을 선택하는 예&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;line-height: 2;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;div style=&quot;box-sizing: border-box; color: rgb(51, 51, 51); font-family: 나눔고딕, NanumGothic, 돋움, Dotum; font-size: 15px; line-height: 2;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;1. Insert, Delete가 자주 발생하지만 Update시 ROW의 크기가 증가 되지 않을 때&lt;/span&gt;&lt;/div&gt;&lt;ul class=&quot;lecture_ul&quot; style=&quot;list-style-position: initial; list-style-image: initial; padding: 1px 0px 3px; box-sizing: border-box; margin-top: 0px; margin-bottom: 10px; width: 605px; color: rgb(51, 51, 51); font-family: 나눔고딕, NanumGothic, 돋움, Dotum; font-size: 15px;&quot;&gt;&lt;li style=&quot;list-style: none; box-sizing: border-box; margin: 0px; padding: 2px 0px 1px 10px; font-size: 14px; line-height: 2;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;- PCTFREE = 5&lt;/span&gt;&lt;/li&gt;&lt;li style=&quot;list-style: none; box-sizing: border-box; margin: 0px; padding: 2px 0px 1px 10px; font-size: 14px; line-height: 2;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;- PCTUSED = 60&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div style=&quot;box-sizing: border-box; color: rgb(51, 51, 51); font-family: 나눔고딕, NanumGothic, 돋움, Dotum; font-size: 15px; line-height: 2;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;2. UPDATE시 ROW의 크기가 증가 될 때&lt;/span&gt;&lt;/div&gt;&lt;ul class=&quot;lecture_ul&quot; style=&quot;box-sizing: border-box; margin-top: 0px; margin-bottom: 10px; list-style-position: initial; list-style-image: initial; width: 605px; padding: 1px 0px 3px; color: rgb(51, 51, 51); font-family: 나눔고딕, NanumGothic, 돋움, Dotum; font-size: 15px;&quot;&gt;&lt;li style=&quot;box-sizing: border-box; list-style: none; margin: 0px; padding: 2px 0px 1px 10px; font-size: 14px; line-height: 2;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;- PCTFREE = 20&lt;/span&gt;&lt;/li&gt;&lt;li style=&quot;box-sizing: border-box; list-style: none; margin: 0px; padding: 2px 0px 1px 10px; font-size: 14px; line-height: 2;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;- PCTUSED = 40&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div style=&quot;box-sizing: border-box; color: rgb(51, 51, 51); font-family: 나눔고딕, NanumGothic, 돋움, Dotum; font-size: 15px; line-height: 2;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;3. 테이블이 매우 크지만 대부분 Read Only Transaction 일 때&lt;/span&gt;&lt;/div&gt;&lt;ul class=&quot;lecture_ul&quot; style=&quot;box-sizing: border-box; margin-top: 0px; margin-bottom: 10px; list-style-position: initial; list-style-image: initial; width: 605px; padding: 1px 0px 3px; color: rgb(51, 51, 51); font-family: 나눔고딕, NanumGothic, 돋움, Dotum; font-size: 15px;&quot;&gt;&lt;li style=&quot;box-sizing: border-box; list-style: none; margin: 0px; padding: 2px 0px 1px 10px; font-size: 14px; line-height: 2;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;- PCTFREE = 5&lt;/span&gt;&lt;/li&gt;&lt;li style=&quot;box-sizing: border-box; list-style: none; margin: 0px; padding: 2px 0px 1px 10px; font-size: 14px; line-height: 2;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;- PCTUSED = 90&lt;/span&gt;&lt;/li&gt;&lt;li style=&quot;box-sizing: border-box; list-style: none; margin: 0px; padding: 2px 0px 1px 10px; font-size: 14px; line-height: 2;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p style=&quot;line-height: 2; text-align: center; clear: none; float: none;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;line-height: 2;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;참고자료&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;line-height: 2;&quot;&gt;&lt;a href=&quot;https://goalker.tistory.com/97&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;https://goalker.tistory.com/97&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;p style=&quot;line-height: 2;&quot;&gt;&lt;a href=&quot;https://o2sunn.tistory.com/22&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;https://o2sunn.tistory.com/22&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;p style=&quot;line-height: 2;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;&lt;a href=&quot;http://www.gurubee.net/lecture/1103&quot;&gt;http://www.gurubee.net/lecture/1103&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;line-height: 2;&quot;&gt;&lt;a href=&quot;https://slidesplayer.org/slide/11065092/&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;https://slidesplayer.org/slide/11065092/&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;p style=&quot;margin-left: 4em; line-height: 2;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;</description>
      <category>Language &amp;amp; Solution/RDBMS</category>
      <category>oracle</category>
      <category>오라클</category>
      <category>오라클 저장구조</category>
      <author>새로비</author>
      <guid isPermaLink="true">https://engkimbs.tistory.com/901</guid>
      <comments>https://engkimbs.tistory.com/entry/Oracle-DB-Oracle-%EC%A0%80%EC%9E%A5%EA%B5%AC%EC%A1%B0-%EC%A0%95%EB%A6%AC%EB%B8%94%EB%9F%AD-PCTFREE-PCTUSED#entry901comment</comments>
      <pubDate>Fri, 27 Sep 2019 15:14:04 +0900</pubDate>
    </item>
    <item>
      <title>국토교통부 공공데이터 부동산 실거래가 API 신청 방법</title>
      <link>https://engkimbs.tistory.com/entry/%EA%B5%AD%ED%86%A0%EA%B5%90%ED%86%B5%EB%B6%80-%EA%B3%B5%EA%B3%B5%EB%8D%B0%EC%9D%B4%ED%84%B0-%EB%B6%80%EB%8F%99%EC%82%B0-%EC%8B%A4%EA%B1%B0%EB%9E%98%EA%B0%80-API-%EC%8B%A0%EC%B2%AD-%EB%B0%A9%EB%B2%95</link>
      <description>&lt;p&gt;&lt;b style=&quot;font-size: 18pt;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;&lt;span style=&quot;color: rgb(31, 218, 17);&quot;&gt;|&lt;/span&gt; 국토교통부 공공데이터 부동산 실거래가 API&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;정부에서 제공하는 공공데이터포털 사이트에서 부동산 실거래가 데이터를 제공받을 수 있는 API를 제공합니다. 이를 통해 예전에는 엑셀이나 텍스트 파일로 수작업으로 부동산 데이터를 정리하던 것을 손쉽게 가공하고 입맛에 맞게 저장할 수 있게 되었습니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 18pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;&lt;span style=&quot;color: rgb(31, 218, 17);&quot;&gt;|&lt;/span&gt; 부동산 실거래가 API 신청 방법&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://www.data.go.kr/&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;공공데이터포털 사이트&lt;/a&gt;에 가셔서 회원가입 및 로그인을 하신 뒤에 다음 설명을 따르시면 됩니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 728px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/998ED53D5D8B5FCA26&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F998ED53D5D8B5FCA26&quot; width=&quot;728&quot; height=&quot;290&quot; filename=&quot;캡처_2019_09_25_21_19_14_165.jpg&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 728px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/9920263D5D8B5FCB22&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F9920263D5D8B5FCB22&quot; width=&quot;728&quot; height=&quot;290&quot; filename=&quot;캡처_2019_09_25_21_19_22_574.jpg&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 728px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/99EAF83D5D8B5FCC24&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F99EAF83D5D8B5FCC24&quot; width=&quot;728&quot; height=&quot;290&quot; filename=&quot;캡처_2019_09_25_21_19_30_550.jpg&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 728px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/99A1EB465E6C782D16&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F99A1EB465E6C782D16&quot; width=&quot;728&quot; height=&quot;482&quot; filename=&quot;캡처_2019_09_25_21_20_21_908.jpg&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 728px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/99BDAF435D8B604A13&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F99BDAF435D8B604A13&quot; width=&quot;728&quot; height=&quot;451&quot; filename=&quot;캡처_2019_09_25_21_21_49_857.jpg&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 728px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/99A6BE4D5E6C784A11&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F99A6BE4D5E6C784A11&quot; width=&quot;728&quot; height=&quot;578&quot; filename=&quot;캡처_2019_09_25_21_22_39_766.jpg&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 728px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/996710465E6C786409&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F996710465E6C786409&quot; width=&quot;728&quot; height=&quot;499&quot; filename=&quot;캡처_2019_09_25_21_22_57_589.jpg&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 728px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/991CF04B5D8B608C22&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F991CF04B5D8B608C22&quot; width=&quot;728&quot; height=&quot;759&quot; filename=&quot;캡처_2019_09_25_21_23_16_754.jpg&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: justify; clear: none; float: none;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;다음 포스팅에서는 위에서 세팅한 실거래가 API를 어떻게 크롤링할 지 알아보도록 하겠습니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;댓글이나 카카오톡(아이디:&amp;nbsp;&lt;/span&gt;&lt;b&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;rbist)&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;로 궁금한 점 물어봐주시면 열심히 답변드리겠습니다!! 포스팅 봐주셔서 감사합니다^^&lt;/span&gt;&lt;/p&gt;</description>
      <category>유용한 정보들</category>
      <category>공공데이터</category>
      <category>부동산 실거래가</category>
      <author>새로비</author>
      <guid isPermaLink="true">https://engkimbs.tistory.com/899</guid>
      <comments>https://engkimbs.tistory.com/entry/%EA%B5%AD%ED%86%A0%EA%B5%90%ED%86%B5%EB%B6%80-%EA%B3%B5%EA%B3%B5%EB%8D%B0%EC%9D%B4%ED%84%B0-%EB%B6%80%EB%8F%99%EC%82%B0-%EC%8B%A4%EA%B1%B0%EB%9E%98%EA%B0%80-API-%EC%8B%A0%EC%B2%AD-%EB%B0%A9%EB%B2%95#entry899comment</comments>
      <pubDate>Wed, 25 Sep 2019 21:44:50 +0900</pubDate>
    </item>
    <item>
      <title>스크래피(scrapy) 설치 및 scrapy 프로젝트 시작하기</title>
      <link>https://engkimbs.tistory.com/entry/%EC%8A%A4%ED%81%AC%EB%9E%98%ED%94%BCscrapy-%EC%84%A4%EC%B9%98-%EB%B0%8F-scrapy-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EC%8B%9C%EC%9E%91%ED%95%98%EA%B8%B0</link>
      <description>&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;이전 scrapy에 대한 소개와 아키텍처에 대한 글과 이어지는 내용입니다~&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://engkimbs.tistory.com/893&quot; target=&quot;_blank&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;[Python/Python 프로그래밍] - 크롤링, 스크래핑할 때 이거 쓰세요. 최고의 파이썬 크롤링 솔루션 scrapy&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;table class=&quot;txc-table&quot; width=&quot;692&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; border=&quot;0&quot; style=&quot;border:none;border-collapse:collapse;;font-family:&quot; 맑은=&quot;&quot; 고딕&quot;,=&quot;&quot; sans-serif;font-size:16px&quot;=&quot;&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;width: 692px; height: 24px; border-width: 1px; border-style: solid; border-color: rgb(204, 204, 204); background-color: rgb(178, 235, 244);&quot;&gt;&lt;p&gt;&lt;b&gt;&amp;nbsp;window에서 anaoncda를 통해 scrapy를 설치했을 때 계속 실행 오류가 뜨시면 일반 Python 공식 사이트에서 배포하는 Python 프로그램을 설치하여 Scrapy를 설치하세요! 저도 최근 anaconda를 설치해서 scrapy를 진행했었는데 계속 오류가 나서 Python으로 다시 진행했더니 잘 작동됩니다!&amp;nbsp;&lt;/b&gt;&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;; font-size: 18pt;&quot;&gt;&lt;span style=&quot;color: rgb(31, 218, 17);&quot;&gt;| &lt;/span&gt;scrapy 설치&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;scrapy를 설치하기 위해서는 pip 패키지 매니져를 이용할 때는 다음과 같은 명령어를 입력하시면 됩니다. (이때, python이 설치된 디렉터리를 경로가 환경변수로 설정되어 있어야 합니다.&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;)&lt;/span&gt;&lt;/p&gt;&lt;pre style=&quot;background-color:#2b2b2b;color:#a9b7c6;font-family:'굴림체';font-size:9.0pt;&quot;&gt;pip install Scrapy&lt;/pre&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;&lt;a href=&quot;https://engkimbs.tistory.com/607?category=762758&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;Anaconda를 설치&lt;/a&gt;해서 Anaconda 패키지에서 제공하는 conda 패키지 매니져를 이용할 경우 다음과 같은 명령어를 입력하시면 됩니다.&lt;/span&gt;&lt;/p&gt;&lt;pre style=&quot;background-color:#2b2b2b;color:#a9b7c6;font-family:'굴림체';font-size:9.0pt;&quot;&gt;conda install -c scrapinghub scrapy&lt;/pre&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 18pt;&quot;&gt;&lt;span style=&quot;color: rgb(31, 218, 17);&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 18pt;&quot;&gt;&lt;span style=&quot;color: rgb(31, 218, 17);&quot;&gt;| &lt;/span&gt;scrapy 프로젝트 시작&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;원하는 디렉터리에서 아래와 같은 명령어를 치게되면 scrapy 시작 프로젝트가 세팅되게 됩니다.&lt;/p&gt;&lt;pre style=&quot;background-color:#2b2b2b;color:#a9b7c6;font-family:'굴림체';font-size:9.0pt;&quot;&gt;scrapy startproject tutorial&lt;/pre&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;그리고 다음과 같은 구조의 프로젝트가 생성됩니다.&lt;/p&gt;&lt;pre style=&quot;background-color:#2b2b2b;color:#a9b7c6;font-family:'굴림체';font-size:9.0pt;&quot;&gt;&lt;p&gt;tutorial/&lt;/p&gt;&lt;p style=&quot;margin-left: 2em;&quot;&gt;|   scrapy.cfg&lt;br /&gt;|&lt;br /&gt;\---tutorial&lt;br /&gt;    |   items.py&lt;br /&gt;    |   middlewares.py&lt;br /&gt;    |   pipelines.py&lt;br /&gt;    |   settings.py&lt;br /&gt;    |   __init__.py&lt;br /&gt;    |&lt;br /&gt;    +---spiders&lt;br /&gt;    |   |   __init__.py&lt;br /&gt;&lt;/p&gt;&lt;/pre&gt;&lt;ul style=&quot;list-style-type: disc;&quot;&gt;&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;item.py:&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;&amp;nbsp;크롤링할 데이터를 저장하는 기능을 하는 객체의 클래스를 정의하는 곳입니다&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;middlewares.py: scrapy의 커스텀 middleware의 기능을 정의하는 곳입니다. middleware는 다시 한 번 이야기하자면 engine에서 다른 모듈로&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;request와 response 정보가 교환될 때 지나가는 중간 통로입니다.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;pipelines.py: item pipelines의 커스텀 모듈을 정의하는 곳입니다. pipeline은 item이 다른 저장소로 저장될 때 거치는 통로라고 생각하면 됩니다.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;settings.py: 현재 scrapy 프로젝트의 설정을 하는 파이썬 파일입니다.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;scrapy.cfg: scrapy 프로젝트들의 전체적인 설정을 하는 곳입니다. 어떤 프로젝트가 어떤 설정을 따를 것인지 배포는 어떤 식으로 할 것인지를 정합니다.&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;; font-size: 18pt;&quot;&gt;&lt;span style=&quot;color: rgb(31, 218, 17);&quot;&gt;| &lt;/span&gt;scrapy 예제&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;다음은 스크래피의 공식사이트에서 가져온 scrapy의 시작 예제입니다. scrapy를 통해 크롤링을 하려면 spider 파일을 만들어야 합니다. 이 파일은 spiders 디렉터리&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;에 다음과 같이 &lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;위치시켜놓으면 됩니다.&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;pre style=&quot;background-color:#2b2b2b;color:#a9b7c6;font-family:'굴림체';font-size:9.0pt;&quot;&gt;&lt;p&gt;|   scrapy.cfg&lt;br /&gt;|&lt;br /&gt;\---tutorial&lt;br /&gt;    |   items.py&lt;br /&gt;    |   middlewares.py&lt;br /&gt;    |   pipelines.py&lt;br /&gt;    |   settings.py&lt;br /&gt;    |   __init__.py&lt;br /&gt;    |&lt;br /&gt;    +---spiders&lt;/p&gt;&lt;p&gt;    |   |   spider.py&lt;br /&gt;    |   |   __init__.py&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;/pre&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;spider.py&lt;/span&gt;&lt;/p&gt;&lt;pre style=&quot;background-color:#2b2b2b;color:#a9b7c6;font-family:'굴림체';font-size:9.0pt;&quot;&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;import &lt;/span&gt;scrapy&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;class &lt;/span&gt;QuotesSpider(scrapy.Spider):&lt;br /&gt;    name = &lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;quotes&quot;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#6a8759;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#6a8759;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;def &lt;/span&gt;&lt;span style=&quot;color:#ffc66d;&quot;&gt;start_requests&lt;/span&gt;(&lt;span style=&quot;color:#94558d;&quot;&gt;self&lt;/span&gt;):&lt;br /&gt;        urls = [&lt;br /&gt;            &lt;span style=&quot;color:#6a8759;&quot;&gt;'http://quotes.toscrape.com/page/1/'&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;,&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color:#6a8759;&quot;&gt;'http://quotes.toscrape.com/page/2/'&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;,&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;        &lt;/span&gt;]&lt;br /&gt;        &lt;span style=&quot;color:#cc7832;&quot;&gt;for &lt;/span&gt;url &lt;span style=&quot;color:#cc7832;&quot;&gt;in &lt;/span&gt;urls:&lt;br /&gt;            &lt;span style=&quot;color:#cc7832;&quot;&gt;yield &lt;/span&gt;scrapy.Request(&lt;span style=&quot;color:#aa4926;&quot;&gt;url&lt;/span&gt;=url&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#aa4926;&quot;&gt;callback&lt;/span&gt;=&lt;span style=&quot;color:#94558d;&quot;&gt;self&lt;/span&gt;.parse)&lt;br /&gt;&lt;br /&gt;    &lt;span style=&quot;color:#cc7832;&quot;&gt;def &lt;/span&gt;&lt;span style=&quot;color:#ffc66d;&quot;&gt;parse&lt;/span&gt;(&lt;span style=&quot;color:#94558d;&quot;&gt;self&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;response):&lt;br /&gt;        page = response.url.split(&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;/&quot;&lt;/span&gt;)[-&lt;span style=&quot;color:#6897bb;&quot;&gt;2&lt;/span&gt;]&lt;br /&gt;        filename = &lt;span style=&quot;color:#6a8759;&quot;&gt;'quotes-%s.html' &lt;/span&gt;% page&lt;br /&gt;        &lt;span style=&quot;color:#cc7832;&quot;&gt;with &lt;/span&gt;&lt;span style=&quot;color:#8888c6;&quot;&gt;open&lt;/span&gt;(filename&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#6a8759;&quot;&gt;'wb'&lt;/span&gt;) &lt;span style=&quot;color:#cc7832;&quot;&gt;as &lt;/span&gt;f:&lt;br /&gt;            f.write(response.body)&lt;br /&gt;        &lt;span style=&quot;color:#94558d;&quot;&gt;self&lt;/span&gt;.log(&lt;span style=&quot;color:#6a8759;&quot;&gt;'Saved file %s' &lt;/span&gt;% filename)&lt;/pre&gt;&lt;ul style=&quot;list-style-type: disc;&quot;&gt;&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;name : scrapy의 Spider 객체를 식별하는 역할을 하는 클래스 변수입니다. 오직 하나의 유일한 name을 Spider 객체는 가질 수 있습니다.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;start_requests: 크롤링이 최초로 시작되는 요청 메서드입니다. 반드시 반복가능한(iterable&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;) 요청 객체인 Requests를 반환해야하며 크롤링할 url들을 명시해야합니다&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;. 이 최초의 요청이 시작되면 이로 인한 연속적인 요청이 Spider에서 &lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;이루어집니다. 이 때문에 반복가능한(iterable) 객체를 반환하도록 되어 있는 것입니다.&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;parse: 요청한 데이터에 대한 응답 객체인 Reponse 객체를 받아서 응답 데이터를 파싱하는 데 쓰이는 메서드입니다. Spider에서의 각 요청 데이터들에 대한 응답을 파싱하는 데에 포인트를 두셔야 합니다. 위 response 파라미터는 TextResponse라는 인스턴스이며 페이지의 컨텐츠에 대한 정보를 담고 있습니다.&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;아래의 명령어를 실행하면 위 scrapy 프로젝트가 실행되면서 명시했던&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;&amp;nbsp;url들을&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;&amp;nbsp;크롤링하고 데이터를 파일로 저장하게 됩니다.&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;pre style=&quot;background-color:#2b2b2b;color:#a9b7c6;font-family:'굴림체';font-size:9.0pt;&quot;&gt;scrapy crawl quotes&lt;/pre&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;pre style=&quot;background-color:#2b2b2b;color:#a9b7c6;font-family:'굴림체';font-size:9.0pt;&quot;&gt;&lt;br /&gt;2019-09-24 23:19:50 [scrapy.core.engine] INFO: Spider opened&lt;br /&gt;2019-09-24 23:19:50 [scrapy.extensions.logstats] INFO: Crawled 0 pages (at 0 pages/min), scraped 0 items (at 0 items/min)&lt;br /&gt;2019-09-24 23:19:50 [scrapy.extensions.telnet] INFO: Telnet console listening on 127.0.0.1:6023&lt;br /&gt;2019-09-24 23:19:51 [scrapy.core.engine] DEBUG: Crawled (404) &lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;GET &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;http:&lt;/span&gt;//quotes.toscrape.com/robots.txt&amp;gt; (referer: None)&lt;br /&gt;2019-09-24 23:19:51 [scrapy.core.engine] DEBUG: Crawled (200) &lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;GET &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;http:&lt;/span&gt;//quotes.toscrape.com/page/1/&amp;gt; (referer: None)&lt;br /&gt;2019-09-24 23:19:51 [quotes] DEBUG: Saved file quotes-1.html&lt;br /&gt;2019-09-24 23:19:51 [scrapy.core.engine] DEBUG: Crawled (200) &lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;GET &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;http:&lt;/span&gt;//quotes.toscrape.com/page/2/&amp;gt; (referer: None)&lt;br /&gt;2019-09-24 23:19:51 [quotes] DEBUG: Saved file quotes-2.html&lt;br /&gt;2019-09-24 23:19:51 [scrapy.core.engine] INFO: Closing spider (finished)&lt;br /&gt;2019-09-24 23:19:51 [scrapy.statscollectors] INFO: Dumping Scrapy stats:&lt;br /&gt;{'downloader/request_bytes': 678,&lt;br /&gt; 'downloader/request_count': 3,&lt;br /&gt; 'downloader/request_method_count/GET': 3,&lt;br /&gt; 'downloader/response_bytes': 5976,&lt;br /&gt; 'downloader/response_count': 3,&lt;br /&gt; 'downloader/response_status_count/200': 2,&lt;br /&gt; 'downloader/response_status_count/404': 1,&lt;br /&gt; 'elapsed_time_seconds': 1.296532,&lt;br /&gt; 'finish_reason': 'finished',&lt;br /&gt; 'finish_time': datetime.datetime(2019, 9, 24, 14, 19, 51, 801004),&lt;br /&gt; 'log_count/DEBUG': 5,&lt;br /&gt; 'log_count/INFO': 10,&lt;br /&gt; 'response_received_count': 3,&lt;br /&gt; 'robotstxt/request_count': 1,&lt;br /&gt; 'robotstxt/response_count': 1,&lt;br /&gt; 'robotstxt/response_status_count/404': 1,&lt;br /&gt; 'scheduler/dequeued': 2,&lt;br /&gt; 'scheduler/dequeued/memory': 2,&lt;br /&gt; 'scheduler/enqueued': 2,&lt;br /&gt; 'scheduler/enqueued/memory': 2,&lt;br /&gt; 'start_time': datetime.datetime(2019, 9, 24, 14, 19, 50, 504472)}&lt;br /&gt;2019-09-24 23:19:51 [scrapy.core.engine] INFO: Spider closed (finished)&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;물어보고 싶은 거나 궁금한 점들은 댓글로 물어봐주시면 친절히 답변드리도록 하겠습니다! 좋아요 한 번 눌러주시면 감사하겠습니다&lt;img src=&quot;//i1.daumcdn.net/deco/contents/emoticon/etc_14.gif?v=2&quot; border=&quot;0&quot; class=&quot;txc-emo&quot;&gt;&lt;/b&gt;&lt;/p&gt;</description>
      <category>파이썬/파이썬 프로그래밍</category>
      <category>scrapy</category>
      <author>새로비</author>
      <guid isPermaLink="true">https://engkimbs.tistory.com/897</guid>
      <comments>https://engkimbs.tistory.com/entry/%EC%8A%A4%ED%81%AC%EB%9E%98%ED%94%BCscrapy-%EC%84%A4%EC%B9%98-%EB%B0%8F-scrapy-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EC%8B%9C%EC%9E%91%ED%95%98%EA%B8%B0#entry897comment</comments>
      <pubDate>Tue, 24 Sep 2019 23:22:39 +0900</pubDate>
    </item>
    <item>
      <title>파이썬을 이용한 selenium 사용법 및 동적 웹 스크래핑</title>
      <link>https://engkimbs.tistory.com/entry/%ED%8C%8C%EC%9D%B4%EC%8D%AC%EC%9D%84-%EC%9D%B4%EC%9A%A9%ED%95%9C-selenium-%EC%82%AC%EC%9A%A9%EB%B2%95-%EB%B0%8F-%EB%8F%99%EC%A0%81-%EC%9B%B9-%EC%8A%A4%ED%81%AC%EB%9E%98%ED%95%91</link>
      <description>&lt;p&gt;&lt;span style=&quot;font-size: 18pt;&quot;&gt;&lt;span style=&quot;font-weight: bold; color: rgb(31, 218, 17); font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;| &lt;/span&gt;&lt;b&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;selenium(셀레늄)이란&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;selenium은 주로 웹앱을 테스트하는 웹 프레임워크입니다. 또한 webdriver의 API를 통해 브라우저를 제어하기 때문에 자바스크립트에 의해 동적으로 생성되는 사이트의 데이터를 크롤링할 때 매우 유용하게 사용되는 스크래핑 도구입니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;; font-size: 18pt;&quot;&gt;&lt;span style=&quot;color: rgb(31, 218, 17);&quot;&gt;|&lt;/span&gt; selenium 사용법&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;selenium은 크롬이나 파이어폭스같은 각 브라우져의 webdriver API를 통해 브라우져를 제어합니다. 따라서 자신이 쓰고자 하는 브라우져의 driver를 다운로드받아서 Java나 C#, Python 같은 프로그래밍 언어를 통해 제어하는 것이 일반적입니다. 여기서는 크롬을 기준으로 사용법을 설명할 예정입니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;driver를 다운로드 받을 수 있는 곳은 아래와 같습니다. 여기서 주의해야 할 점은 크롬 브라우져의 버전에 맞는 driver를 다운로드 받아야 한다는 것입니다. 브라우져 버전은&lt;u&gt;&lt;b&gt; 메뉴 =&amp;gt; 도움말 =&amp;gt; Chrome 정보&lt;/b&gt;&lt;/u&gt;에서 확인할 수 있습니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://chromedriver.chromium.org/downloads&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;https://chromedriver.chromium.org/downloads&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;; font-size: 18pt;&quot;&gt;&lt;span style=&quot;color: rgb(31, 218, 17);&quot;&gt;|&lt;/span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;; font-size: 18pt;&quot;&gt;파이썬을 통한 selenium 사용법 및 동적 사이트 크롤링 방법&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;자바스크립트에&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;기반인 동적 사이트인 &lt;a href=&quot;https://datalab.naver.com/shoppingInsight/sCategory.naver&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;네이버 데이터랩&lt;/a&gt;의 데이터를 크롤링하는 것을 보여드리겠습니다. 여기서 크롤링할 데이터는 현재 패션의류 검색어 TOP20인 리스트들입니다.&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 748px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/99F8913E5D88D52D10&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F99F8913E5D88D52D10&quot; width=&quot;748&quot; height=&quot;587&quot; filename=&quot;캡처_2019_09_23_23_21_04_522.jpg&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;위 TOP20 리스트들은 아래와 같은 자바스크립트에 의해 동적으로 생성된 페이지의 요소에 위치해 있습니&lt;/span&gt;다.&lt;/p&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 536px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/99CD31405D88D5AA07&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F99CD31405D88D5AA07&quot; width=&quot;536&quot; height=&quot;552&quot; filename=&quot;캡처.jpg&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;/p&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;프로젝트 구조&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;pre style=&quot;background-color:#2b2b2b;color:#a9b7c6;font-family:'굴림체';font-size:9.0pt;&quot;&gt;|   chromedriver.exe&lt;br /&gt;|   selenium-example.py&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;프로젝트 구조는 어떻게 파이썬을 통해 동적 사이트를 크롤링 할 지 보여주기 위해 단순히 하나의 파이썬 파일과 크롬 드라이버만 가지고 있습니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;selenium-example.py&lt;/b&gt;&lt;/p&gt;&lt;pre style=&quot;background-color:#2b2b2b;color:#a9b7c6;font-family:'굴림체';font-size:9.0pt;&quot;&gt;&lt;p&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;import &lt;/span&gt;time&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;from &lt;/span&gt;selenium &lt;span style=&quot;color:#cc7832;&quot;&gt;import &lt;/span&gt;webdriver&lt;br /&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;from &lt;/span&gt;selenium.webdriver.chrome.options &lt;span style=&quot;color:#cc7832;&quot;&gt;import &lt;/span&gt;Options&lt;br /&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;from &lt;/span&gt;selenium.webdriver.support.wait &lt;span style=&quot;color:#cc7832;&quot;&gt;import &lt;/span&gt;WebDriverWait&lt;br /&gt;&lt;br /&gt;options = Options()&lt;br /&gt;options.headless = &lt;span style=&quot;color:#cc7832;&quot;&gt;True&lt;br /&gt;&lt;/span&gt;browser = webdriver.Chrome(&lt;span style=&quot;color:#aa4926;&quot;&gt;executable_path&lt;/span&gt;=&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;./chromedriver.exe&quot;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#aa4926;&quot;&gt;options&lt;/span&gt;=options)&lt;br /&gt;browser.get(&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;https://datalab.naver.com/shoppingInsight/sCategory.naver&quot;&lt;/span&gt;)&lt;br /&gt;&lt;br /&gt;time.sleep(&lt;span style=&quot;color:#6897bb;&quot;&gt;3&lt;/span&gt;)&lt;br /&gt;tag_names = browser.find_element_by_css_selector(&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;.rank_top1000_list&quot;&lt;/span&gt;).find_elements_by_tag_name(&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;li&quot;&lt;/span&gt;)&lt;br /&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;for &lt;/span&gt;tag &lt;span style=&quot;color:#cc7832;&quot;&gt;in &lt;/span&gt;tag_names:&lt;br /&gt;    &lt;span style=&quot;color:#8888c6;&quot;&gt;print&lt;/span&gt;(tag.text.split(&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;\n&lt;/span&gt;&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;&lt;/span&gt;))&lt;/p&gt;&lt;/pre&gt;&lt;ul style=&quot;list-style-type: disc;&quot;&gt;&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;위 코드를 실행하기 위해서는 chromedriver가 설치되어 있어야함 과 동시에 selenium 패키지가 설치되어 있어야 합니다.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;Options() 객체를 생성하고 그 정보를 Chrome 드라이버 옵션에 넣는 것을 보실 수 있을 겁니다. 주목해야할 점은 options.headless 옵션입니다. 이것은 브라우져를 렌더링하지 않고 메모리 상에서만 작업이 이루어지도록 하기 위한 옵션입니다. 이 옵션이 추가되지 않았을 때는 PhantomJS를 통해 작업을 했었지만 selenium이 이 옵션을 지원하기 시작함에 따라 PhantomJS는 사장되었습니다.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;time.sleep(3) 코드는 자바스크립트에 의해 페이지 로딩이 완전히 이루어질 때까지 기다리기 위해 삽입하였습니다. 이 방법 외에 WebDriverWait 객체의&amp;nbsp;expected_conditions 메서드를 통해 해당 요소가 완전히 로딩될때까지 기다리는 방법이 있습니다. 하지만 이 방법은 우아하지만 웹페이지마다 이 조건을 충족시키기가 굉장히&amp;nbsp;까다로울 때가 있습니다. 따라서&amp;nbsp;time.sleep 메서드로 잠깐 로딩될 때까지 멈추는 것도 투박하지만 심플한 솔루션이 될 수 있습니다. expected_condition을 통한 방법은 추후에 다른 포스팅에서 다루도록 하겠습니다.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;find_element_by_css_selector 메서드 및 find_elements_by_tag_name 메서드를 통해 선택하고자 하는 TOP 리스트들이 모여있는 &amp;lt;li&amp;gt;들을 선택하는 것을 볼 수 있습니다. webdriver를 통해서 selenium은 css 및 tag를 통해 해당 요소들을 선택할 수 있는 메서드를 제공합니다.&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 18pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(31, 218, 17);&quot;&gt;|&lt;/span&gt; 결과화면&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;pre style=&quot;background-color:#2b2b2b;color:#a9b7c6;font-family:'굴림체';font-size:9.0pt;&quot;&gt;['1', '원피스']&lt;br /&gt;['2', '가을원피스']&lt;br /&gt;['3', '블라우스']&lt;br /&gt;['4', '후드집업']&lt;br /&gt;['5', '롱원피스']&lt;br /&gt;['6', '나이키바람막이']&lt;br /&gt;['7', '맨투맨']&lt;br /&gt;['8', '나이키맨투맨']&lt;br /&gt;['9', '트렌치코트']&lt;br /&gt;['10', '하객원피스']&lt;br /&gt;['11', '셔츠원피스']&lt;br /&gt;['12', '트위드자켓']&lt;br /&gt;['13', '나이키후드집업']&lt;br /&gt;['14', '후리스']&lt;br /&gt;['15', '니트원피스']&lt;br /&gt;['16', '가디건']&lt;br /&gt;['17', '셀프웨딩드레스']&lt;br /&gt;['18', '레오파드스커트']&lt;br /&gt;['19', '라쉬반']&lt;br /&gt;['20', '써스데이아일랜드원피스']&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>파이썬/파이썬 프로그래밍</category>
      <category>Selenium</category>
      <category>파이썬 웹 스크래핑</category>
      <category>파이썬 프로그래밍</category>
      <author>새로비</author>
      <guid isPermaLink="true">https://engkimbs.tistory.com/896</guid>
      <comments>https://engkimbs.tistory.com/entry/%ED%8C%8C%EC%9D%B4%EC%8D%AC%EC%9D%84-%EC%9D%B4%EC%9A%A9%ED%95%9C-selenium-%EC%82%AC%EC%9A%A9%EB%B2%95-%EB%B0%8F-%EB%8F%99%EC%A0%81-%EC%9B%B9-%EC%8A%A4%ED%81%AC%EB%9E%98%ED%95%91#entry896comment</comments>
      <pubDate>Mon, 23 Sep 2019 23:39:01 +0900</pubDate>
    </item>
    <item>
      <title>회사 프록시 때문에 pip, npm을 통해 제대로 패키지 다운로드가 안 될 때</title>
      <link>https://engkimbs.tistory.com/entry/%ED%9A%8C%EC%82%AC-%ED%94%84%EB%A1%9D%EC%8B%9C-%EB%95%8C%EB%AC%B8%EC%97%90-pip-npm%EC%9D%84-%ED%86%B5%ED%95%B4-%EC%A0%9C%EB%8C%80%EB%A1%9C-%ED%8C%A8%ED%82%A4%EC%A7%80-%EB%8B%A4%EC%9A%B4%EB%A1%9C%EB%93%9C%EA%B0%80-%EC%95%88-%EB%90%A0-%EB%95%8C</link>
      <description>&lt;p&gt;&lt;p&gt;&lt;/p&gt;&lt;p style=&quot;text-align: justify; clear: none; float: none;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;보통 보안 인프라가 갖추어져 있는 회사에는 회사 프록시를 통해 외부 인터넷에 접속할 수 있습니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: justify; clear: none; float: none;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: justify; clear: none; float: none;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;하지만 이게 종종 문제가 되는 게 &lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;pip, npm 같은 패키지 매니져를 통해 해당 라이브러리가 제대로 다운로드 되지 않는 문제가 발생합니다......&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: justify; clear: none; float: none;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: justify; clear: none; float: none;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;그 이유는 보통 그 사이트에서 보내온 &lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;인증서가 아닌 회사 인증서가 컴퓨터로 전송되기 때문에 그런데요. 저희 회사도 회사 프록시에 있는 인증서가 와서 제대로 pip, npm 같은 패키지 매니져가 제대로 작동하지 않았습니다ㅠㅠ&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: justify; clear: none; float: none;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: justify; clear: none; float: none;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;이럴 때는&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: justify; clear: none; float: none;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: justify; clear: none; float: none;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;1. 해당 패키지 매니져가 요청하는 호스트[&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;ex)&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;&amp;nbsp;pypi.python.org&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;에 대한 인증서가 패키지 매니져에 등록되어 있거나&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: justify; clear: none; float: none;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;2. 해당 URL을 무조건 신뢰하겠다는 옵션을 설정하거나&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: justify; clear: none; float: none;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;3. strict-ssl 설정을 false로 하여 해결하거나&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: justify; clear: none; float: none;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;4. https로 통신하는 게 아닌 http로 통신&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;위 4가지 방법 중 하나를 택하여 &lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;해결할 수 있습니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;파이썬의 경우 아래와 같은 명령어를 통해 pip로 패키지를 다운로드 할 수 있습니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;; background-color: rgb(140, 252, 203); color: rgb(0, 0, 0);&quot;&gt;pip --proxy [회사 프록시 url&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;; background-color: rgb(140, 252, 203); color: rgb(0, 0, 0);&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;; background-color: rgb(140, 252, 203); color: rgb(0, 0, 0);&quot;&gt;&amp;nbsp;--trusted-host pypi.python.org --trusted-host pypi.org --trusted-host files.pythonhosted.org install 패키지명&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;node의 경우 아래와 같은 설정을 통해 npm으로 패키지를 다운로드 할 수 있습니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;; background-color: rgb(102, 232, 255); color: rgb(0, 0, 0);&quot;&gt;npm config set proxy [회사 프록시 url]&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;; background-color: rgb(102, 232, 255); color: rgb(0, 0, 0);&quot;&gt;npm config set https-proxy [회사 프록시 url]&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;; background-color: rgb(102, 232, 255); color: rgb(0, 0, 0);&quot;&gt;npm config set strict-ssl false&lt;/span&gt;&lt;/p&gt;</description>
      <category>파이썬/파이썬 프로그래밍</category>
      <author>새로비</author>
      <guid isPermaLink="true">https://engkimbs.tistory.com/895</guid>
      <comments>https://engkimbs.tistory.com/entry/%ED%9A%8C%EC%82%AC-%ED%94%84%EB%A1%9D%EC%8B%9C-%EB%95%8C%EB%AC%B8%EC%97%90-pip-npm%EC%9D%84-%ED%86%B5%ED%95%B4-%EC%A0%9C%EB%8C%80%EB%A1%9C-%ED%8C%A8%ED%82%A4%EC%A7%80-%EB%8B%A4%EC%9A%B4%EB%A1%9C%EB%93%9C%EA%B0%80-%EC%95%88-%EB%90%A0-%EB%95%8C#entry895comment</comments>
      <pubDate>Fri, 20 Sep 2019 15:12:32 +0900</pubDate>
    </item>
    <item>
      <title>파이썬 웹 스크래핑할 때 이거 쓰세요. 최고의 파이썬 웹 스크래핑 솔루션 scrapy</title>
      <link>https://engkimbs.tistory.com/entry/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%9B%B9-%EC%8A%A4%ED%81%AC%EB%9E%98%ED%95%91%ED%95%A0-%EB%95%8C-%EC%9D%B4%EA%B1%B0-%EC%93%B0%EC%84%B8%EC%9A%94-%EC%B5%9C%EA%B3%A0%EC%9D%98-%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%9B%B9-%EC%8A%A4%ED%81%AC%EB%9E%98%ED%95%91-%EC%86%94%EB%A3%A8%EC%85%98-scrapy</link>
      <description>&lt;p&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;&lt;span style=&quot;font-size: 11pt; font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;안녕하세요. 개인적인 사정때문에 오랜만에 업로드하게 되네요&lt;/span&gt;&lt;img src=&quot;//i1.daumcdn.net/deco/contents/emoticon/per_01.gif?v=2&quot; border=&quot;0&quot; class=&quot;txc-emo&quot;&gt;&lt;span style=&quot;font-size: 11pt; font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;. 최근에 부동산에 관심을 많이 가지게 되면서 &lt;/span&gt;&lt;span style=&quot;font-size: 11pt; font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;부동산 공부 및&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-size: 11pt; font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;그와 관련된 데이터를 수집하는 일에 관심을 가지게 되었습니다.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt; font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;데이터를 수집할 때 쉽게 이용할 수 있는 방법은 데이터의 바다인 웹에서 데이터를 가져오는 것인데요. 이 과정을 크롤링(crawling)&amp;nbsp;또는 스크래핑(scraping)이라고 합니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt; font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;이번 포스팅에서는 제가 최근에 사용했던 크롤러 솔루션인 scrapy를 소개하고자 합니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 13.3333px;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;&lt;span style=&quot;color: rgb(31, 218, 17); font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;|&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt; 기존 크롤링&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-size: 14pt; font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;할 때의 문제점&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 13.3333px;&quot;&gt;&lt;span style=&quot;font-size: 11pt; font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;보통 크롤링을 할 때 수집할 데이터가 적은 경우에는 간단한 프로그래밍만으로도 원하는 데이터를 충분히 가져올 수 있습니다. 하지만 가져올 데이터양과 데이터를&lt;/span&gt;&lt;span style=&quot;font-size: 11pt; font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;&amp;nbsp;소싱할&lt;/span&gt;&lt;span style=&quot;font-size: 11pt; font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;&amp;nbsp;URL 수가&lt;/span&gt;&lt;span style=&quot;font-size: 11pt; font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;&amp;nbsp;많아지면 크롤러의 소스 코드 수도 그만큼 복잡하고 길어지게 됩니다.&lt;/span&gt;&lt;span style=&quot;font-size: 11pt; font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;&amp;nbsp;그에 따라 유지보수가 아주 어려워 지고 예외사항에 취약한 크롤러가 되기 마련이죠. 이렇게 잘못 작성된 크롤러는 다음과 같은 문제점을 지니고 있습니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 13.3333px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;ul style=&quot;list-style-type: disc;&quot;&gt;&lt;li&gt;&lt;span style=&quot;font-size: 13.3333px;&quot;&gt;&lt;span style=&quot;font-size: 11pt; font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;코드 라인 수가 많아짐에 따라 크롤러의 각 부분 (데이터를 받는 부분, 비즈니스 로직 처리하는 부분 등&lt;/span&gt;&lt;span style=&quot;font-size: 11pt; font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;)이 강하게 결합되어 유지보수하기 어려워짐&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-size: 11pt; font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;기본적인 예외처리가 되지 않을 경우 한 번의 request error가 날 때 뒤이은 request 및 비즈니스 로직과&amp;nbsp;함께 어플리케이션이 정지되버림&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-size: 11pt; font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;하나의 요청 처리가 길어지게 되면 다른 요청이 처리가 안되기 때문에 데이터 처리 시간이 늦어지게 됨(일종의 critical path가 생겨버림)&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(31, 218, 17); font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;|&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;b style=&quot;font-family: &amp;quot;Arial Black&amp;quot;; font-size: 18.6667px;&quot;&gt;&lt;span style=&quot;color: rgb(31, 218, 17);&quot;&gt;&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt;Scrapy&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;?&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 13.3333px;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;; font-size: 11pt;&quot;&gt;scrapy는 이러한 단점을 보&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;; font-size: 11pt;&quot;&gt;완하고 유지보수하기 쉬운 크롤러를 제작하기 위한 오픈소스 솔루션입니다.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;; font-size: 14.6667px;&quot;&gt;scrapy&lt;/span&gt;&lt;span style=&quot;font-size: 13.3333px;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;; font-size: 11pt;&quot;&gt;크롤러를 만들기 위한 코드를 프레임워크로서 제공함으로서 유지보수 및 예외사항에 대비한 견고한 코드를 작성하도록 도와줍니다.&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;; font-size: 11pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 13.3333px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;; font-size: 14.6667px;&quot;&gt;scrapy는&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-size: 11pt; font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;위의 문제점을 아래와 같은 방법으로 보완하고 있습니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 13.3333px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;ul style=&quot;list-style-type: disc;&quot;&gt;&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;; font-size: 11pt;&quot;&gt;spider, item, pipeline, selector 등으로 모듈화하여 유지 보수가 쉬운 코드를 작성하고 그에 따라 불필요한 boilerplate를 작성할 필요가 없어짐&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;; font-size: 11pt;&quot;&gt;기본적으로 비동기 요청으로 크롤링을 하기 때문에 하나의 요청이 에러가 났을 경우 그 요청한 것 외에 다른 요청과 비즈니스 로직들은 그 후에도 스케줄대로 처리됨&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;; font-size: 11pt;&quot;&gt;또한 비동기 요청으로 작동되므로 다른 요청이 늦어짐에 따른 데이터 처리 지연이 일어나지 않음&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;이 밖에도 크롤링을 할 때 쓰일 유용한 도구들 및 코드 모듈을 제공함으로서 크롤러를 제작하는 데 드는 시간을 획기적으로 줄여줍니다.&lt;/span&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;; font-size: 14pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(31, 218, 17);&quot;&gt;| &lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt;Scrapy&lt;/span&gt;&amp;nbsp;&lt;/span&gt;아키텍처&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 748px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/9997534A5D83808B37&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F9997534A5D83808B37&quot; width=&quot;748&quot; height=&quot;471&quot; filename=&quot;캡처.jpg&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;&amp;lt;출처 :&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://docs.scrapy.org/en/latest/topics/architecture.html&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;https://docs.scrapy.org/en/latest/topics/architecture.html&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;위 그림은&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;; font-size: 14.6667px;&quot;&gt;scrapy&lt;/span&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;의 전체적인 아키텍처를 나타낸 사진입니다.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;; font-size: 14.6667px;&quot;&gt;scrapy를&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;사용하기 위해서는 위 아키텍처에 대한 이해가 필수입니다! 이 아키텍처를 통해&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;; font-size: 14.6667px;&quot;&gt;scrapy&lt;/span&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;가 어떻게 데이터를 요청하는 지 그리고&amp;nbsp;받아온 데이터를 어떻게 처리하는 지를 모르면 크&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;롤러를 작성하는 것이 매우 어렵게 될 수 밖에 없습니다&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;; font-size: 14.6667px;&quot;&gt;scrapy&lt;/span&gt;&lt;span style=&quot;font-size: 11pt; font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;는&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;; font-size: 14.6667px;&quot;&gt;scrapy&lt;/span&gt;&lt;span style=&quot;font-size: 11pt; font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;&amp;nbsp;내에서 작동되는 Engine를 통해 각 모듈을 효율적으로 동작시키며 데이터를 요청 및 처리하게 됩니다. 이에 따른 메커니즘을 간략하게 설명해보자면&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt; font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;1. Spider 모듈을 통해 웹에 데이터를 요청하게 됩니다. 이때 중요한 것은 각 요청들이 비동기(async)로 작동된다는 것입니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt; font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;2. Spider 모듈을 통해 제출된 요청사항은 Scheduler에 의해 스케줄링됩니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt; font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;3. Engine은 Scheduler에게 Spider에 의해 제출된 요청사항을 요구합니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt; font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;4. Engine은 이 요청사항을 Downloader에게 보내며 이 요청사항을 보내고 난 다음 Scheduler에게 다음 요청 사항을 요구하게 됩니다. 이 요청사항들은 비동기적으로 작동됩니다. 이 요청된 사항들은 Middleware를 통해 이동하게 됩니다. (이때 Download하기 위한 데이터들의 여러 설정사항들이 적용)&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt; font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;5. 요청 사항에 의해 받아온 데이터들은 다시 Middleware를 통해 Engine에게로 전송됩니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt; font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;6. 이 Engine은 응답 데이터를 Spider에게로 보내게 되며 이때 작성된 비즈니스 로직이 적용됩니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt; font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;7. Spider를 적용된 비즈니스 로직을 Engine에게로 보내며 이 Engine은 Item pipeline으로 처리된 데이터를 보내게 됩니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt; font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;8. Item pipeline은 처리된 데이터를 Database나 Excel같은 데이터로 저장하기 위해 응답 데이터를 알맞게 가공하고 저장하게 됩니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt; font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;9. 이러한 1-8번의 일련의 과정들을 더 이상의 요청사항이 없을 때까지 반복하게 됩니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;다음 포스팅에서는&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;; font-size: 14.6667px;&quot;&gt;scrapy&lt;/span&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;를 예제 코드를 통해 어떤 식으로 코드를 작성하게 되며 데이터를 처리하게 되는 지 일련의 과정을 알아보도록 하겠습니다&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;line-height: 1.8;&quot;&gt;&lt;a href=&quot;https://engkimbs.tistory.com/897&quot; target=&quot;_blank&quot;&gt;[Python/파이썬 프로그래밍] - 스크래피(scrapy) 설치 및 scrapy 프로젝트 시작하기&lt;/a&gt;&lt;/p&gt;&lt;p style=&quot;line-height: 1.8;&quot;&gt;&lt;a href=&quot;https://engkimbs.tistory.com/911&quot; target=&quot;_blank&quot;&gt;[Python/파이썬 웹 스크래핑 - 부동산 공공데이터] - [파이썬 웹 스크래핑/부동산 공공데이터] 부동산 공공 데이터 웹 스크래핑 시작 ! #1&lt;/a&gt;&lt;/p&gt;&lt;p style=&quot;line-height: 1.8;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;</description>
      <category>파이썬/파이썬 프로그래밍</category>
      <category>scrapy</category>
      <category>스크래피</category>
      <category>파이썬 웹 스크래핑</category>
      <author>새로비</author>
      <guid isPermaLink="true">https://engkimbs.tistory.com/893</guid>
      <comments>https://engkimbs.tistory.com/entry/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%9B%B9-%EC%8A%A4%ED%81%AC%EB%9E%98%ED%95%91%ED%95%A0-%EB%95%8C-%EC%9D%B4%EA%B1%B0-%EC%93%B0%EC%84%B8%EC%9A%94-%EC%B5%9C%EA%B3%A0%EC%9D%98-%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%9B%B9-%EC%8A%A4%ED%81%AC%EB%9E%98%ED%95%91-%EC%86%94%EB%A3%A8%EC%85%98-scrapy#entry893comment</comments>
      <pubDate>Thu, 19 Sep 2019 22:40:06 +0900</pubDate>
    </item>
    <item>
      <title>19/8/30</title>
      <link>https://engkimbs.tistory.com/entry/19830</link>
      <description>&lt;p style=&quot;box-sizing: border-box; color: rgb(51, 51, 51); font-family: &amp;quot;Malgun Gothic&amp;quot;, sans-serif; font-size: 15px; letter-spacing: -0.4px;&quot;&gt;1. 외국어 공부 1시간 내외로 하였는가 (2.0)&amp;nbsp;=&amp;gt; D&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; color: rgb(51, 51, 51); font-family: &amp;quot;Malgun Gothic&amp;quot;, sans-serif; font-size: 15px; letter-spacing: -0.4px;&quot;&gt;2. 비즈니스 학습(IT + Marketing)를 2시간 내외로 했는가 (4.0)&amp;nbsp;=&amp;gt; C&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; color: rgb(51, 51, 51); font-family: &amp;quot;Malgun Gothic&amp;quot;, sans-serif; font-size: 15px; letter-spacing: -0.4px;&quot;&gt;3. 운동을 1시간 내외로 했는가 (월 - 벤치, 수 - 데드, 금 - 스쿼트, 나머지 - 유산소 ) (3.0) =&amp;gt; F&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; color: rgb(51, 51, 51); font-family: &amp;quot;Malgun Gothic&amp;quot;, sans-serif; font-size: 15px; letter-spacing: -0.4px;&quot;&gt;4. 투자공부 1시간 내외로 했는가(3.0) =&amp;gt; C&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; color: rgb(51, 51, 51); font-family: &amp;quot;Malgun Gothic&amp;quot;, sans-serif; font-size: 15px; letter-spacing: -0.4px;&quot;&gt;5. 비즈니스 학습(AirBnB + Share House)를 1시간 내외로 했는가 (4.0) =&amp;gt; C&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; color: rgb(51, 51, 51); font-family: &amp;quot;Malgun Gothic&amp;quot;, sans-serif; font-size: 15px; letter-spacing: -0.4px;&quot;&gt;&lt;br style=&quot;box-sizing: border-box;&quot;&gt;&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; color: rgb(51, 51, 51); font-family: &amp;quot;Malgun Gothic&amp;quot;, sans-serif; font-size: 15px; letter-spacing: -0.4px;&quot;&gt;총점 : 1.15&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; color: rgb(51, 51, 51); font-family: &amp;quot;Malgun Gothic&amp;quot;, sans-serif; font-size: 15px; letter-spacing: -0.4px;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; color: rgb(51, 51, 51); font-family: &amp;quot;Malgun Gothic&amp;quot;, sans-serif; font-size: 15px; letter-spacing: -0.4px;&quot;&gt;금요일이라 마음이 헤이해진 것 같다.&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; color: rgb(51, 51, 51); font-family: &amp;quot;Malgun Gothic&amp;quot;, sans-serif; font-size: 15px; letter-spacing: -0.4px;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; color: rgb(51, 51, 51); font-family: &amp;quot;Malgun Gothic&amp;quot;, sans-serif; font-size: 15px; letter-spacing: -0.4px;&quot;&gt;내일부터가 승부다!&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; color: rgb(51, 51, 51); font-family: &amp;quot;Malgun Gothic&amp;quot;, sans-serif; font-size: 15px; letter-spacing: -0.4px;&quot;&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>Diary</category>
      <author>새로비</author>
      <guid isPermaLink="true">https://engkimbs.tistory.com/883</guid>
      <comments>https://engkimbs.tistory.com/entry/19830#entry883comment</comments>
      <pubDate>Fri, 30 Aug 2019 23:32:19 +0900</pubDate>
    </item>
    <item>
      <title>[자바 프로그래밍] 자바 this를 파헤쳐보자</title>
      <link>https://engkimbs.tistory.com/entry/%EC%9E%90%EB%B0%94-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D-%EC%9E%90%EB%B0%94-this%EB%A5%BC-%ED%8C%8C%ED%97%A4%EC%B3%90%EB%B3%B4%EC%9E%90</link>
      <description>&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;자바에서 제공하는 this 키워드는 인스턴스 자기 자신를 가리키는 키워드입니다. 이 this 키워드를 통해 클래스 메서드 및 생성자에서 자기 자신의 데이터를 업데이트하거나 조작할 수 있습니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;여기서 중요한 것은&lt;span style=&quot;background-color: rgb(154, 165, 234);&quot;&gt; &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;; background-color: rgb(154, 165, 234);&quot;&gt;this 키워드는 이 클래스를 기반으로 생성된 인스턴스를 가리키는 참조&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;라는 사실입니다. 인스턴스를 가르키는 &lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;참조와 인스턴스 자체는 다르다는 것을 알아두셨으면 좋겠습니다&lt;/span&gt;.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;pre style=&quot;background-color:#2b2b2b;color:#a9b7c6;font-family:'Source Code Pro';font-size:9.8pt;&quot;&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;public class &lt;/span&gt;ThisExample {&lt;br /&gt;&lt;br /&gt;    &lt;span style=&quot;color:#cc7832;&quot;&gt;private &lt;/span&gt;String &lt;span style=&quot;color:#9876aa;&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;    private &lt;/span&gt;Integer &lt;span style=&quot;color:#9876aa;&quot;&gt;age&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;    private &lt;/span&gt;String &lt;span style=&quot;color:#9876aa;&quot;&gt;address&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;    public &lt;/span&gt;&lt;span style=&quot;color:#ffc66d;&quot;&gt;ThisExample&lt;/span&gt;() {&lt;br /&gt;        &lt;span style=&quot;color:#cc7832;&quot;&gt;this&lt;/span&gt;.&lt;span style=&quot;color:#9876aa;&quot;&gt;name &lt;/span&gt;= &lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;KBS&quot;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;        this&lt;/span&gt;.&lt;span style=&quot;color:#9876aa;&quot;&gt;age &lt;/span&gt;= &lt;span style=&quot;color:#6897bb;&quot;&gt;19&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;        this&lt;/span&gt;.&lt;span style=&quot;color:#9876aa;&quot;&gt;address &lt;/span&gt;= &lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;Seoul&quot;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;    &lt;/span&gt;}&lt;br /&gt;&lt;br /&gt;    &lt;span style=&quot;color:#cc7832;&quot;&gt;public &lt;/span&gt;String &lt;span style=&quot;color:#ffc66d;&quot;&gt;getName&lt;/span&gt;() {&lt;br /&gt;        &lt;span style=&quot;color:#cc7832;&quot;&gt;return &lt;/span&gt;&lt;span style=&quot;color:#9876aa;&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;    &lt;/span&gt;}&lt;br /&gt;&lt;br /&gt;    &lt;span style=&quot;color:#cc7832;&quot;&gt;public &lt;/span&gt;Integer &lt;span style=&quot;color:#ffc66d;&quot;&gt;getAge&lt;/span&gt;() {&lt;br /&gt;        &lt;span style=&quot;color:#cc7832;&quot;&gt;return &lt;/span&gt;&lt;span style=&quot;color:#9876aa;&quot;&gt;age&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;    &lt;/span&gt;}&lt;br /&gt;&lt;br /&gt;    &lt;span style=&quot;color:#cc7832;&quot;&gt;public &lt;/span&gt;String &lt;span style=&quot;color:#ffc66d;&quot;&gt;getAddress&lt;/span&gt;() {&lt;br /&gt;        &lt;span style=&quot;color:#cc7832;&quot;&gt;return &lt;/span&gt;&lt;span style=&quot;color:#9876aa;&quot;&gt;address&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;    &lt;/span&gt;}&lt;br /&gt;&lt;br /&gt;    &lt;span style=&quot;color:#cc7832;&quot;&gt;public void &lt;/span&gt;&lt;span style=&quot;color:#ffc66d;&quot;&gt;setName&lt;/span&gt;(String name) {&lt;br /&gt;        &lt;span style=&quot;color:#cc7832;&quot;&gt;this&lt;/span&gt;.&lt;span style=&quot;color:#9876aa;&quot;&gt;name &lt;/span&gt;= name&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;    &lt;/span&gt;}&lt;br /&gt;&lt;br /&gt;    &lt;span style=&quot;color:#cc7832;&quot;&gt;public void &lt;/span&gt;&lt;span style=&quot;color:#ffc66d;&quot;&gt;setAge&lt;/span&gt;(Integer age) {&lt;br /&gt;        &lt;span style=&quot;color:#cc7832;&quot;&gt;this&lt;/span&gt;.&lt;span style=&quot;color:#9876aa;&quot;&gt;age &lt;/span&gt;= age&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;    &lt;/span&gt;}&lt;br /&gt;&lt;br /&gt;    &lt;span style=&quot;color:#cc7832;&quot;&gt;public void &lt;/span&gt;&lt;span style=&quot;color:#ffc66d;&quot;&gt;setAddress&lt;/span&gt;(String address) {&lt;br /&gt;        &lt;span style=&quot;color:#cc7832;&quot;&gt;this&lt;/span&gt;.&lt;span style=&quot;color:#9876aa;&quot;&gt;address &lt;/span&gt;= address&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;    &lt;/span&gt;}&lt;br /&gt;&lt;br /&gt;    &lt;span style=&quot;color:#cc7832;&quot;&gt;public &lt;/span&gt;ThisExample &lt;span style=&quot;color:#ffc66d;&quot;&gt;returnThisExample&lt;/span&gt;() {&lt;br /&gt;        &lt;span style=&quot;color:#cc7832;&quot;&gt;return this;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;    &lt;/span&gt;}&lt;br /&gt;&lt;br /&gt;}&lt;/pre&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;위의 예제는 this 키워드를 이용하여 작성한 전형적인 클래스 코드입니다.&amp;nbsp;this란 키워드를 통해&amp;nbsp;생성자 및 세터 메서드에서 이 클래스를 기반으로 생성된 인스턴스의 필드 데이터에 접근할 수 있습니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;this 키워드는 인스턴스 자기 자신을 가르키는 참조이기 때문에 인스턴스를 참조하는 변수와 비교했을 때 같다라는 결과가 나올 것입니다. 이것을 위의 returnThisExample 메서드를 이용하여 확인해보겠습니다.&lt;/span&gt;&lt;/p&gt;&lt;pre style=&quot;background-color:#2b2b2b;color:#a9b7c6;font-family:'Source Code Pro';font-size:9.8pt;&quot;&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;public class &lt;/span&gt;Main {&lt;br /&gt;&lt;br /&gt;    &lt;span style=&quot;color:#cc7832;&quot;&gt;public static void &lt;/span&gt;&lt;span style=&quot;color:#ffc66d;&quot;&gt;main&lt;/span&gt;(String[] args) {&lt;br /&gt;        ThisExample thisExample = &lt;span style=&quot;color:#cc7832;&quot;&gt;new &lt;/span&gt;ThisExample()&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;        &lt;/span&gt;System.&lt;span style=&quot;color:#9876aa;font-style:italic;&quot;&gt;out&lt;/span&gt;.println(thisExample)&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;        &lt;/span&gt;System.&lt;span style=&quot;color:#9876aa;font-style:italic;&quot;&gt;out&lt;/span&gt;.println(thisExample.returnThisExample())&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;        if&lt;/span&gt;(thisExample == thisExample.returnThisExample()){&lt;br /&gt;            System.&lt;span style=&quot;color:#9876aa;font-style:italic;&quot;&gt;out&lt;/span&gt;.println(&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;Same!!&quot;&lt;/span&gt;)&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;        &lt;/span&gt;}&lt;br /&gt;        &lt;span style=&quot;color:#cc7832;&quot;&gt;else &lt;/span&gt;{&lt;br /&gt;            System.&lt;span style=&quot;color:#9876aa;font-style:italic;&quot;&gt;out&lt;/span&gt;.println(&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;Not Same!!&quot;&lt;/span&gt;)&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;        &lt;/span&gt;}&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;}&lt;/pre&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;위에서 thisExample 변수는 ThisExample 클래스를 기반으로 생성된 인스턴스를 가르키는 변수입니다. 여기서 thisExample.returnThisExample 메서드를 호출하여 그 결과를 출력하면 같은 인스턴스를 가리키는 것을 알 수 있습니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;thisExample과 this 키워드를 반환하는 returnThisExample의 값이 같기 때문에 Same!!이라는 결과가 아래에 출력됩니다.&lt;/span&gt;&lt;/p&gt;&lt;pre style=&quot;background-color:#2b2b2b;color:#a9b7c6;font-family:'Source Code Pro';font-size:9.8pt;&quot;&gt;ThisExample@1540e19d&lt;br /&gt;ThisExample@1540e19d&lt;br /&gt;Same!!&lt;br /&gt;&lt;/pre&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 748px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/995056405CFE69D32E&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F995056405CFE69D32E&quot; width=&quot;748&quot; height=&quot;315&quot; filename=&quot;캡처_2019_06_10_23_31_05_327.jpg&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>Language &amp;amp; Solution/Java</category>
      <category>자바 프로그래밍</category>
      <category>지비 this</category>
      <author>새로비</author>
      <guid isPermaLink="true">https://engkimbs.tistory.com/873</guid>
      <comments>https://engkimbs.tistory.com/entry/%EC%9E%90%EB%B0%94-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D-%EC%9E%90%EB%B0%94-this%EB%A5%BC-%ED%8C%8C%ED%97%A4%EC%B3%90%EB%B3%B4%EC%9E%90#entry873comment</comments>
      <pubDate>Mon, 10 Jun 2019 23:32:56 +0900</pubDate>
    </item>
    <item>
      <title>[스프링 부트/ Spring Boot] 스프링 게시판 만들기 - 부트로 쉽게 구현한 Spring 게시판</title>
      <link>https://engkimbs.tistory.com/entry/%EC%8A%A4%ED%94%84%EB%A7%81-%EB%B6%80%ED%8A%B8-Spring-Boot-%EC%8A%A4%ED%94%84%EB%A7%81-%EA%B2%8C%EC%8B%9C%ED%8C%90-%EB%A7%8C%EB%93%A4%EA%B8%B0-%EB%B6%80%ED%8A%B8%EB%A1%9C-%EC%89%BD%EA%B2%8C-%EA%B5%AC%ED%98%84%ED%95%9C-Spring-%EA%B2%8C%EC%8B%9C%ED%8C%90</link>
      <description>&lt;p&gt;&lt;span style=&quot;font-size: 18pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(31, 218, 17);&quot;&gt;|&lt;/span&gt; 스프링 게시판 만들기&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;font-size: 24px;&quot;&gt;&lt;b&gt;- 부트로 쉽게 구현한 Spring 게시판&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 24px;&quot;&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://github.com/engkimbs/springboard&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot; style=&quot;font-size: 14pt;&quot;&gt;예제 git repository는 여기를 클릭하시면 됩니다.&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;스프링 게시판은 스프링 MVC로 스프링 부트에서 밀고있는 툴인 Thymeleaf를 사용하여 쉽게 만들 수 있습니다. REST API + SPA( React, Vue 등 )으로 만들 수 있지만 간단한 커뮤니티 사이트 구현을 위해서는 조금 과한 기술스택을 사용하는 것이 아닌 지 생각해 봐야 합니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;스프링 MVC를 사용했을 때의 데이터 흐름은 아래의 링크를 참고하여 보시면 될 것 같습니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://engkimbs.tistory.com/686&quot; target=&quot;_blank&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;[Spring/Spring 입문 - 개념 및 핵심] - [Spring] 스프링(Spring) MVC 아키텍처/설계 구조&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;위에서&amp;nbsp;JSP를&amp;nbsp;Thymeleaf라고 생각하고 읽으시면 스프링 부트&amp;nbsp;MVC에서의 데이터가&amp;nbsp;어떻게 흘러가는 지 알 수 있습니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;요구 사항&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;인텔리제이 (Intellij) ( 이클립스로도 무방 )&lt;/p&gt;&lt;p&gt;Gradle 4&amp;nbsp;버전&lt;/p&gt;&lt;p&gt;Java 1.8 이상&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 18pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(31, 218, 17);&quot;&gt;| &lt;/span&gt;스프링 게시판 프로젝트&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;프로젝트 구조&lt;/b&gt;&lt;/p&gt;&lt;pre style=&quot;background-color:#2b2b2b;color:#a9b7c6;font-family:'Source Code Pro';font-size:9.8pt;&quot;&gt;&lt;p&gt;\---src&lt;br /&gt;+---main&lt;br /&gt;|   +---java&lt;br /&gt;|   |   \---com&lt;br /&gt;|   |       \---tutorial&lt;br /&gt;|   |           \---springboard&lt;br /&gt;|   |               |   AppRunner.java&lt;br /&gt;|   |               |   SpringBoardApplication.java&lt;br /&gt;|   |               |&lt;br /&gt;|   |               +---config&lt;br /&gt;|   |               +---controller&lt;br /&gt;|   |               |       BoardController.java&lt;br /&gt;|   |               |&lt;br /&gt;|   |               +---domain&lt;br /&gt;|   |               |   |   Board.java&lt;br /&gt;|   |               |   |   User.java&lt;br /&gt;|   |               |   |&lt;br /&gt;|   |               |   \---enums&lt;br /&gt;|   |               |           BoardType.java&lt;br /&gt;|   |               |&lt;br /&gt;|   |               +---repository&lt;br /&gt;|   |               |       BoardRepository.java&lt;br /&gt;|   |               |       UserRepository.java&lt;br /&gt;|   |               |&lt;br /&gt;|   |               \---service&lt;br /&gt;|   |                       BoardService.java&lt;br /&gt;|   |&lt;br /&gt;|   \---resources&lt;br /&gt;|       |   application.yml&lt;br /&gt;|       |&lt;br /&gt;|       +---static&lt;br /&gt;|       |   +---css&lt;br /&gt;|       |   +---images&lt;br /&gt;|       |   \---js&lt;br /&gt;|       |&lt;br /&gt;|       \---templates&lt;br /&gt;|           \---board&lt;br /&gt;|                   list.html&lt;/p&gt;&lt;/pre&gt;&lt;p&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;의존성 관리&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;Gradle&lt;/b&gt;&lt;/p&gt;&lt;pre style=&quot;background-color:#2b2b2b;color:#a9b7c6;font-family:'Source Code Pro';font-size:9.8pt;&quot;&gt;plugins {&lt;br /&gt;    id &lt;span style=&quot;color:#6a8759;&quot;&gt;'org.springframework.boot' &lt;/span&gt;version &lt;span style=&quot;color:#6a8759;&quot;&gt;'2.1.5.RELEASE'&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#6a8759;&quot;&gt;    &lt;/span&gt;id &lt;span style=&quot;color:#6a8759;&quot;&gt;'java'&lt;br /&gt;&lt;/span&gt;}&lt;br /&gt;&lt;br /&gt;apply &lt;span style=&quot;color:#6a8759;&quot;&gt;plugin&lt;/span&gt;: &lt;span style=&quot;color:#6a8759;&quot;&gt;'io.spring.dependency-management'&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#6a8759;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#9876aa;&quot;&gt;group &lt;/span&gt;= &lt;span style=&quot;color:#6a8759;&quot;&gt;'com.tutorial'&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#9876aa;&quot;&gt;version &lt;/span&gt;= &lt;span style=&quot;color:#6a8759;&quot;&gt;'0.0.1-SNAPSHOT'&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#9876aa;&quot;&gt;sourceCompatibility &lt;/span&gt;= &lt;span style=&quot;color:#6a8759;&quot;&gt;'1.8'&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#6a8759;&quot;&gt;&lt;br /&gt;&lt;/span&gt;repositories {&lt;br /&gt;    mavenCentral()&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;dependencies {&lt;br /&gt;    implementation &lt;span style=&quot;color:#6a8759;&quot;&gt;'org.springframework.boot:spring-boot-starter-web'&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#6a8759;&quot;&gt;    &lt;/span&gt;implementation &lt;span style=&quot;color:#6a8759;&quot;&gt;'org.springframework.boot:spring-boot-starter-data-jpa'&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#6a8759;&quot;&gt;    &lt;/span&gt;implementation &lt;span style=&quot;color:#6a8759;&quot;&gt;'org.springframework.boot:spring-boot-starter-thymeleaf'&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#6a8759;&quot;&gt;    &lt;/span&gt;runtimeOnly &lt;span style=&quot;color:#6a8759;&quot;&gt;'com.h2database:h2'&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#6a8759;&quot;&gt;    &lt;/span&gt;runtimeOnly &lt;span style=&quot;color:#6a8759;&quot;&gt;'org.springframework.boot:spring-boot-devtools'&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#6a8759;&quot;&gt;    &lt;/span&gt;compileOnly &lt;span style=&quot;color:#6a8759;&quot;&gt;'org.projectlombok:lombok'&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#6a8759;&quot;&gt;    &lt;/span&gt;testImplementation &lt;span style=&quot;color:#6a8759;&quot;&gt;'org.springframework.boot:spring-boot-starter-test'&lt;br /&gt;&lt;/span&gt;}&lt;/pre&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;소스 코드&lt;/b&gt;&lt;br /&gt;&lt;/p&gt;&lt;pre style=&quot;background-color: rgb(43, 43, 43); font-family: &amp;quot;Source Code Pro&amp;quot;; font-size: 9.8pt;&quot;&gt;&lt;p style=&quot;&quot;&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;import &lt;/span&gt;&lt;font color=&quot;#a9b7c6&quot;&gt;com.tutorial.springboard.domain.enums.BoardType&lt;/font&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;import &lt;/span&gt;&lt;font color=&quot;#a9b7c6&quot;&gt;lombok.&lt;/font&gt;&lt;span style=&quot;color: rgb(187, 181, 41);&quot;&gt;AllArgsConstructor&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;import &lt;/span&gt;&lt;font color=&quot;#a9b7c6&quot;&gt;lombok.&lt;/font&gt;&lt;span style=&quot;color: rgb(187, 181, 41);&quot;&gt;Builder&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;import &lt;/span&gt;&lt;font color=&quot;#a9b7c6&quot;&gt;lombok.&lt;/font&gt;&lt;span style=&quot;color: rgb(187, 181, 41);&quot;&gt;Getter&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;import &lt;/span&gt;&lt;font color=&quot;#a9b7c6&quot;&gt;lombok.&lt;/font&gt;&lt;span style=&quot;color: rgb(187, 181, 41);&quot;&gt;NoArgsConstructor&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;import &lt;/span&gt;&lt;font color=&quot;#a9b7c6&quot;&gt;javax.persistence.*&lt;/font&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;import &lt;/span&gt;&lt;font color=&quot;#a9b7c6&quot;&gt;java.time.LocalDateTime&lt;/font&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(187, 181, 41);&quot;&gt;@Getter&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(187, 181, 41);&quot;&gt;@AllArgsConstructor&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(187, 181, 41);&quot;&gt;@NoArgsConstructor&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(187, 181, 41);&quot;&gt;@Entity&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(187, 181, 41);&quot;&gt;@Table&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(187, 181, 41);&quot;&gt;@Builder&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;public class &lt;/span&gt;&lt;font color=&quot;#a9b7c6&quot;&gt;Board {&lt;br /&gt;&lt;br /&gt;    &lt;/font&gt;&lt;span style=&quot;color: rgb(187, 181, 41);&quot;&gt;@Id&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(187, 181, 41);&quot;&gt;    @Column&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(187, 181, 41);&quot;&gt;    @GeneratedValue&lt;/span&gt;&lt;font color=&quot;#a9b7c6&quot;&gt;(&lt;/font&gt;&lt;span style=&quot;color: rgb(208, 208, 255);&quot;&gt;strategy &lt;/span&gt;&lt;font color=&quot;#a9b7c6&quot;&gt;= GenerationType.&lt;/font&gt;&lt;span style=&quot;color: rgb(152, 118, 170); font-style: italic;&quot;&gt;IDENTITY&lt;/span&gt;&lt;font color=&quot;#a9b7c6&quot;&gt;)&lt;br /&gt;    &lt;/font&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;public &lt;/span&gt;&lt;font color=&quot;#a9b7c6&quot;&gt;Long &lt;/font&gt;&lt;span style=&quot;color: rgb(152, 118, 170);&quot;&gt;idx&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color: rgb(187, 181, 41);&quot;&gt;@Column&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(187, 181, 41);&quot;&gt;    &lt;/span&gt;&lt;font color=&quot;#cc7832&quot;&gt;private &lt;/font&gt;&lt;font color=&quot;#a9b7c6&quot;&gt;String &lt;/font&gt;&lt;span style=&quot;color: rgb(152, 118, 170);&quot;&gt;title&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color: rgb(187, 181, 41);&quot;&gt;@Column&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(187, 181, 41);&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50); font-size: 13.0667px;&quot;&gt;private &lt;/span&gt;&lt;font color=&quot;#a9b7c6&quot;&gt;String &lt;/font&gt;&lt;span style=&quot;color: rgb(152, 118, 170);&quot;&gt;subTitle&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color: rgb(187, 181, 41);&quot;&gt;@Column&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(187, 181, 41);&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50); font-size: 13.0667px;&quot;&gt;private &lt;/span&gt;&lt;font color=&quot;#a9b7c6&quot;&gt;String &lt;/font&gt;&lt;span style=&quot;color: rgb(152, 118, 170);&quot;&gt;content&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color: rgb(187, 181, 41);&quot;&gt;@Column&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(187, 181, 41);&quot;&gt;    @Enumerated&lt;/span&gt;&lt;font color=&quot;#a9b7c6&quot;&gt;(EnumType.&lt;/font&gt;&lt;span style=&quot;color: rgb(152, 118, 170); font-style: italic;&quot;&gt;STRING&lt;/span&gt;&lt;font color=&quot;#a9b7c6&quot;&gt;)&lt;br /&gt;    &lt;/font&gt;&lt;span style=&quot;color: rgb(204, 120, 50); font-size: 13.0667px;&quot;&gt;private &lt;/span&gt;&lt;font color=&quot;#a9b7c6&quot;&gt;BoardType &lt;/font&gt;&lt;span style=&quot;color: rgb(152, 118, 170);&quot;&gt;boardType&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color: rgb(187, 181, 41);&quot;&gt;@Column&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(187, 181, 41);&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50); font-size: 13.0667px;&quot;&gt;private &lt;/span&gt;&lt;font color=&quot;#a9b7c6&quot;&gt;LocalDateTime &lt;/font&gt;&lt;span style=&quot;color: rgb(152, 118, 170);&quot;&gt;createdDate&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color: rgb(187, 181, 41);&quot;&gt;@Column&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(187, 181, 41);&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50); font-size: 13.0667px;&quot;&gt;private &lt;/span&gt;&lt;font color=&quot;#a9b7c6&quot;&gt;LocalDateTime &lt;/font&gt;&lt;span style=&quot;color: rgb(152, 118, 170);&quot;&gt;updatedDate&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color: rgb(187, 181, 41);&quot;&gt;@OneToOne&lt;/span&gt;&lt;font color=&quot;#a9b7c6&quot;&gt;(&lt;/font&gt;&lt;span style=&quot;color: rgb(208, 208, 255);&quot;&gt;fetch &lt;/span&gt;&lt;font color=&quot;#a9b7c6&quot;&gt;= FetchType.&lt;/font&gt;&lt;span style=&quot;color: rgb(152, 118, 170); font-style: italic;&quot;&gt;LAZY&lt;/span&gt;&lt;font color=&quot;#a9b7c6&quot;&gt;)&lt;br /&gt;    &lt;/font&gt;&lt;span style=&quot;color: rgb(204, 120, 50); font-size: 13.0667px;&quot;&gt;private &lt;/span&gt;&lt;font color=&quot;#a9b7c6&quot;&gt;User &lt;/font&gt;&lt;span style=&quot;color: rgb(152, 118, 170);&quot;&gt;user&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 120, 50);&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;font color=&quot;#a9b7c6&quot;&gt;}&lt;/font&gt;&lt;/p&gt;&lt;/pre&gt;&lt;pre style=&quot;background-color:#2b2b2b;color:#a9b7c6;font-family:'Source Code Pro';font-size:9.8pt;&quot;&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;package &lt;/span&gt;com.tutorial.springboard.domain&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;import &lt;/span&gt;lombok.&lt;span style=&quot;color:#bbb529;&quot;&gt;AllArgsConstructor&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;import &lt;/span&gt;lombok.&lt;span style=&quot;color:#bbb529;&quot;&gt;Builder&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;import &lt;/span&gt;lombok.&lt;span style=&quot;color:#bbb529;&quot;&gt;Getter&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;import &lt;/span&gt;lombok.&lt;span style=&quot;color:#bbb529;&quot;&gt;NoArgsConstructor&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;import &lt;/span&gt;javax.persistence.*&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;import &lt;/span&gt;java.io.Serializable&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;import &lt;/span&gt;java.time.LocalDateTime&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#bbb529;&quot;&gt;@Getter&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#bbb529;&quot;&gt;@AllArgsConstructor&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#bbb529;&quot;&gt;@NoArgsConstructor&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#bbb529;&quot;&gt;@Entity&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#bbb529;&quot;&gt;@Table&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#bbb529;&quot;&gt;@Builder&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;public class &lt;/span&gt;User &lt;span style=&quot;color:#cc7832;&quot;&gt;implements &lt;/span&gt;Serializable {&lt;br /&gt;&lt;br /&gt;    &lt;span style=&quot;color:#bbb529;&quot;&gt;@Id&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#bbb529;&quot;&gt;    @Column&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#bbb529;&quot;&gt;    @GeneratedValue&lt;/span&gt;(&lt;span style=&quot;color:#d0d0ff;&quot;&gt;strategy &lt;/span&gt;= GenerationType.&lt;span style=&quot;color:#9876aa;font-style:italic;&quot;&gt;IDENTITY&lt;/span&gt;)&lt;br /&gt;    &lt;span style=&quot;color:#cc7832;&quot;&gt;public &lt;/span&gt;Long &lt;span style=&quot;color:#9876aa;&quot;&gt;idx&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color:#bbb529;&quot;&gt;@Column&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#bbb529;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;public &lt;/span&gt;String &lt;span style=&quot;color:#9876aa;&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color:#bbb529;&quot;&gt;@Column&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#bbb529;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;public &lt;/span&gt;String &lt;span style=&quot;color:#9876aa;&quot;&gt;password&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color:#bbb529;&quot;&gt;@Column&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#bbb529;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;public &lt;/span&gt;String &lt;span style=&quot;color:#9876aa;&quot;&gt;email&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color:#bbb529;&quot;&gt;@Column&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#bbb529;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;public &lt;/span&gt;LocalDateTime &lt;span style=&quot;color:#9876aa;&quot;&gt;createdDate&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color:#bbb529;&quot;&gt;@Column&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#bbb529;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;public &lt;/span&gt;LocalDateTime &lt;span style=&quot;color:#9876aa;&quot;&gt;updatedDate&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;}&lt;/pre&gt;&lt;ul style=&quot;list-style-type: disc;&quot;&gt;&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;유저정보를 나타내는 User 클래스와 게시글을 나타내는 Board 클래스입니다.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;@GeneratedValue는 자동적으로 idx의 값을 할당해주는 어노테이션입니다. 여기서는 전체 DB 범위로 아이디의 값을 관리하는 GenerationType.IDENTITY 옵션을 썼습니다.&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;pre style=&quot;background-color:#2b2b2b;color:#a9b7c6;font-family:'Source Code Pro';font-size:9.8pt;&quot;&gt;&lt;p&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;import &lt;/span&gt;com.tutorial.springboard.domain.User&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;import &lt;/span&gt;org.springframework.data.jpa.repository.JpaRepository&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;public interface &lt;/span&gt;UserRepository &lt;span style=&quot;color:#cc7832;&quot;&gt;extends &lt;/span&gt;JpaRepository&amp;lt;User&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;Long&amp;gt; {&lt;br /&gt;    User &lt;span style=&quot;color:#ffc66d;&quot;&gt;findByEmail&lt;/span&gt;(String email)&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;}&lt;/p&gt;&lt;/pre&gt;&lt;pre style=&quot;background-color:#2b2b2b;color:#a9b7c6;font-family:'Source Code Pro';font-size:9.8pt;&quot;&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;import &lt;/span&gt;com.tutorial.springboard.domain.Board&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;import &lt;/span&gt;com.tutorial.springboard.domain.User&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;import &lt;/span&gt;org.springframework.data.jpa.repository.JpaRepository&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;public interface &lt;/span&gt;BoardRepository &lt;span style=&quot;color:#cc7832;&quot;&gt;extends &lt;/span&gt;JpaRepository&amp;lt;Board&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;Long&amp;gt; {&lt;br /&gt;    Board &lt;span style=&quot;color:#ffc66d;&quot;&gt;findByUser&lt;/span&gt;(User user)&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;ul style=&quot;list-style-type: disc;&quot;&gt;&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;User와 Board 정보를 영속화하기 위한 DB 인터페이스인&amp;nbsp;UserRepository, BoardRepository 인터페이스입니다.&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;JpaRepository 인터페이스를 확장하며 타입을 지정해주면 스프링 JPA가 제공하는 기본적인 기능 및 추가로 메서드명을 조합함으로서 특정 데이터들을 FETCH할 수 있다. 이에 관련된 것은 아래를 참조하시면 될 것 같습니다.&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;https://engkimbs.tistory.com/823&quot; target=&quot;_blank&quot; style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;[Spring/Spring JPA] - [Spring JPA #11] 스프링 데이터 리포지터리 인터페이스 정의하기(Spring Repository Interface)&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;pre style=&quot;background-color:#2b2b2b;color:#a9b7c6;font-family:'Source Code Pro';font-size:9.8pt;&quot;&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;import &lt;/span&gt;com.tutorial.springboard.domain.Board&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;import &lt;/span&gt;com.tutorial.springboard.service.BoardService&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;import &lt;/span&gt;org.springframework.beans.factory.annotation.&lt;span style=&quot;color:#bbb529;&quot;&gt;Autowired&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;import &lt;/span&gt;org.springframework.data.domain.Page&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;import &lt;/span&gt;org.springframework.data.domain.Pageable&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;import &lt;/span&gt;org.springframework.data.web.&lt;span style=&quot;color:#bbb529;&quot;&gt;PageableDefault&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;import &lt;/span&gt;org.springframework.stereotype.&lt;span style=&quot;color:#bbb529;&quot;&gt;Controller&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;import &lt;/span&gt;org.springframework.ui.Model&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;import &lt;/span&gt;org.springframework.web.bind.annotation.&lt;span style=&quot;color:#bbb529;&quot;&gt;GetMapping&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;import &lt;/span&gt;org.springframework.web.bind.annotation.&lt;span style=&quot;color:#bbb529;&quot;&gt;RequestMapping&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;import &lt;/span&gt;org.springframework.web.bind.annotation.&lt;span style=&quot;color:#bbb529;&quot;&gt;RequestParam&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#bbb529;&quot;&gt;@Controller&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#bbb529;&quot;&gt;@RequestMapping&lt;/span&gt;(&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;/board&quot;&lt;/span&gt;)&lt;br /&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;public class &lt;/span&gt;BoardController {&lt;br /&gt;&lt;br /&gt;    &lt;span style=&quot;color:#bbb529;&quot;&gt;@Autowired&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#bbb529;&quot;&gt;    &lt;/span&gt;BoardService &lt;span style=&quot;color:#9876aa;&quot;&gt;boardService&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color:#bbb529;&quot;&gt;@GetMapping&lt;/span&gt;({&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;/&quot;&lt;/span&gt;})&lt;br /&gt;    &lt;span style=&quot;color:#cc7832;&quot;&gt;public &lt;/span&gt;String &lt;span style=&quot;color:#ffc66d;&quot;&gt;board&lt;/span&gt;(&lt;span style=&quot;color:#bbb529;&quot;&gt;@RequestParam&lt;/span&gt;(&lt;span style=&quot;color:#d0d0ff;&quot;&gt;value&lt;/span&gt;=&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;idx&quot;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#d0d0ff;&quot;&gt;defaultValue &lt;/span&gt;= &lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;0&quot;&lt;/span&gt;) Long idx&lt;span style=&quot;color:#cc7832;&quot;&gt;,&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;                        &lt;/span&gt;Model model) {&lt;br /&gt;        model.addAttribute(&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;board&quot;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9876aa;&quot;&gt;boardService&lt;/span&gt;.findBoardByIdx(idx))&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;        return &lt;/span&gt;&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;/board/form&quot;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;    &lt;/span&gt;}&lt;br /&gt;&lt;br /&gt;    &lt;span style=&quot;color:#bbb529;&quot;&gt;@GetMapping&lt;/span&gt;(&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;/list&quot;&lt;/span&gt;)&lt;br /&gt;    &lt;span style=&quot;color:#cc7832;&quot;&gt;public &lt;/span&gt;String &lt;span style=&quot;color:#ffc66d;&quot;&gt;list&lt;/span&gt;(&lt;span style=&quot;color:#bbb529;&quot;&gt;@PageableDefault &lt;/span&gt;Pageable pageable&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;Model model) {&lt;br /&gt;        Page&amp;lt;Board&amp;gt; boardList = &lt;span style=&quot;color:#9876aa;&quot;&gt;boardService&lt;/span&gt;.findBoardList(pageable)&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;        &lt;/span&gt;boardList.stream().forEach(e -&amp;gt; e.getContent())&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;        &lt;/span&gt;model.addAttribute(&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;boardList&quot;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;boardList)&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;        return &lt;/span&gt;&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;/board/list&quot;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;    &lt;/span&gt;}&lt;br /&gt;&lt;br /&gt;}&lt;/pre&gt;&lt;ul style=&quot;list-style-type: disc;&quot;&gt;&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;BoardController는 /board URL을 매핑하며&amp;nbsp;/board/list 을&amp;nbsp;관리합니다.&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;/board/list 는 게시글의 데이터를 FETCH하는 데 쓰이며 서비스 계층인 BoardService에서 해당 페이징 처리를 하게 됩니다.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;Pageable은 페이지 요청을 받을 수 있는 인터페이스입니다. 보통 Pageable의 구현체인 PageRequest의 인스턴스를 받아 이 안에 있는 데이터를 가지고 페이징 관련 처리를 하게 됩니다.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;Model은 View 층에서 JSP나 Thymeleaf와 같은 템플릿 엔진이 동적으로 HTML 페이지를 만드는 데 필요한 데이터를 제공해줍니다. 위와 같은 경우 boardList&amp;nbsp;속성 혹은 board 속성에 대한 데이터를 model에 추가하는 것을 볼 수 있습니다. 이 데이터는 뒤에서 보실 Thymeleaf 코드에서 게시글을 만들 때 쓰여집니다.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;pre style=&quot;background-color:#2b2b2b;color:#a9b7c6;font-family:'Source Code Pro';font-size:9.8pt;&quot;&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;import &lt;/span&gt;com.tutorial.springboard.domain.Board&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;import &lt;/span&gt;com.tutorial.springboard.repository.BoardRepository&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;import &lt;/span&gt;org.springframework.beans.factory.annotation.&lt;span style=&quot;color:#bbb529;&quot;&gt;Autowired&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;import &lt;/span&gt;org.springframework.data.domain.Page&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;import &lt;/span&gt;org.springframework.data.domain.PageRequest&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;import &lt;/span&gt;org.springframework.data.domain.Pageable&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;import &lt;/span&gt;org.springframework.stereotype.&lt;span style=&quot;color:#bbb529;&quot;&gt;Service&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#bbb529;&quot;&gt;@Service&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;public class &lt;/span&gt;BoardService {&lt;br /&gt;&lt;br /&gt;    &lt;span style=&quot;color:#bbb529;&quot;&gt;@Autowired&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#bbb529;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;private &lt;/span&gt;BoardRepository &lt;span style=&quot;color:#9876aa;&quot;&gt;boardRepository&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;    public &lt;/span&gt;Page&amp;lt;Board&amp;gt; &lt;span style=&quot;color:#ffc66d;&quot;&gt;findBoardList&lt;/span&gt;(Pageable pageable) {&lt;br /&gt;        pageable = PageRequest.&lt;span style=&quot;font-style:italic;&quot;&gt;of&lt;/span&gt;(&lt;br /&gt;                pageable.getPageNumber() &amp;lt;= &lt;span style=&quot;color:#6897bb;&quot;&gt;0 &lt;/span&gt;? &lt;span style=&quot;color:#6897bb;&quot;&gt;0 &lt;/span&gt;: pageable.getPageNumber()-&lt;span style=&quot;color:#6897bb;&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;,&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;                &lt;/span&gt;pageable.getPageSize())&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;        return &lt;/span&gt;&lt;span style=&quot;color:#9876aa;&quot;&gt;boardRepository&lt;/span&gt;.findAll(pageable)&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;    &lt;/span&gt;}&lt;br /&gt;&lt;br /&gt;    &lt;span style=&quot;color:#cc7832;&quot;&gt;public &lt;/span&gt;Board &lt;span style=&quot;color:#ffc66d;&quot;&gt;findBoardByIdx&lt;/span&gt;(Long idx) {&lt;br /&gt;        &lt;span style=&quot;color:#cc7832;&quot;&gt;return &lt;/span&gt;&lt;span style=&quot;color:#9876aa;&quot;&gt;boardRepository&lt;/span&gt;.findById(idx).orElse(&lt;span style=&quot;color:#cc7832;&quot;&gt;new &lt;/span&gt;Board())&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;    &lt;/span&gt;}&lt;br /&gt;}&lt;/pre&gt;&lt;ul style=&quot;list-style-type: disc;&quot;&gt;&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;게시글 리스트뿐만 아니라 게시글 하나에 대한 요청도 처리할 수 있게 BoardService 클래스를 작성했습니다.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;Spring에서는 Page 클래스로 페이징 요청을 관리합니다. 이 Page 클래스는 페이징에 관련된 여러 요청을 손쉽게 처리할 수 있도록 만들어진 클래스입니다.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;보통 Pageable의 구현체인 PageRequest의 인스턴스를 받아 이 안에 있는 데이터를 가지고 페이징 관련 처리를 하게 됩니다. 이 정보를 JpaRepository의 구현체에게 넘겨주면 스프링에서 자동적으로 메서드 인터페이스를 해석하여 페이징 데이터를 DB에서 FETCH하여 넘겨주게 됩니다.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;pre style=&quot;background-color:#2b2b2b;color:#a9b7c6;font-family:'Source Code Pro';font-size:9.8pt;&quot;&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;import &lt;/span&gt;com.tutorial.springboard.domain.Board&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;import &lt;/span&gt;com.tutorial.springboard.domain.User&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;import &lt;/span&gt;com.tutorial.springboard.domain.enums.BoardType&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;import &lt;/span&gt;com.tutorial.springboard.repository.BoardRepository&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;import &lt;/span&gt;com.tutorial.springboard.repository.UserRepository&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;import &lt;/span&gt;org.springframework.beans.factory.annotation.&lt;span style=&quot;color:#bbb529;&quot;&gt;Autowired&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;import &lt;/span&gt;org.springframework.boot.ApplicationArguments&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;import &lt;/span&gt;org.springframework.boot.ApplicationRunner&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;import &lt;/span&gt;org.springframework.stereotype.&lt;span style=&quot;color:#bbb529;&quot;&gt;Component&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;import &lt;/span&gt;java.time.LocalDateTime&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;import &lt;/span&gt;java.util.stream.IntStream&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#bbb529;&quot;&gt;@Component&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;public class &lt;/span&gt;AppRunner &lt;span style=&quot;color:#cc7832;&quot;&gt;implements &lt;/span&gt;ApplicationRunner {&lt;br /&gt;&lt;br /&gt;    &lt;span style=&quot;color:#bbb529;&quot;&gt;@Autowired&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#bbb529;&quot;&gt;    &lt;/span&gt;UserRepository &lt;span style=&quot;color:#9876aa;&quot;&gt;userRepository&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color:#bbb529;&quot;&gt;@Autowired&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#bbb529;&quot;&gt;    &lt;/span&gt;BoardRepository &lt;span style=&quot;color:#9876aa;&quot;&gt;boardRepository&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color:#bbb529;&quot;&gt;@Override&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#bbb529;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;public void &lt;/span&gt;&lt;span style=&quot;color:#ffc66d;&quot;&gt;run&lt;/span&gt;(ApplicationArguments args) &lt;span style=&quot;color:#cc7832;&quot;&gt;throws &lt;/span&gt;Exception {&lt;br /&gt;        User user = &lt;span style=&quot;color:#9876aa;&quot;&gt;userRepository&lt;/span&gt;.save(User.&lt;span style=&quot;font-style:italic;&quot;&gt;builder&lt;/span&gt;()&lt;br /&gt;                .name(&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;saelobi&quot;&lt;/span&gt;)&lt;br /&gt;                .password(&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;saelobi&quot;&lt;/span&gt;)&lt;br /&gt;                .email(&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;saelobi@gmail.com&quot;&lt;/span&gt;)&lt;br /&gt;                .createdDate(LocalDateTime.&lt;span style=&quot;font-style:italic;&quot;&gt;now&lt;/span&gt;())&lt;br /&gt;                .build())&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;        &lt;/span&gt;IntStream.&lt;span style=&quot;font-style:italic;&quot;&gt;rangeClosed&lt;/span&gt;(&lt;span style=&quot;color:#6897bb;&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#6897bb;&quot;&gt;200&lt;/span&gt;).forEach(index -&amp;gt;&lt;br /&gt;                &lt;span style=&quot;color:#9876aa;&quot;&gt;boardRepository&lt;/span&gt;.save(Board.&lt;span style=&quot;font-style:italic;&quot;&gt;builder&lt;/span&gt;()&lt;br /&gt;                    .title(&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;Content &quot; &lt;/span&gt;+ index)&lt;br /&gt;                    .subTitle(&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;Order &quot; &lt;/span&gt;+ index)&lt;br /&gt;                    .content(&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;Content Example &quot; &lt;/span&gt;+ index)&lt;br /&gt;                    .boardType(BoardType.&lt;span style=&quot;color:#9876aa;font-style:italic;&quot;&gt;free&lt;/span&gt;)&lt;br /&gt;                    .createdDate(LocalDateTime.&lt;span style=&quot;font-style:italic;&quot;&gt;now&lt;/span&gt;())&lt;br /&gt;                    .updatedDate(LocalDateTime.&lt;span style=&quot;font-style:italic;&quot;&gt;now&lt;/span&gt;())&lt;br /&gt;                        .user(&lt;span style=&quot;color:#b389c5;&quot;&gt;user&lt;/span&gt;).build()))&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;    &lt;/span&gt;}&lt;br /&gt;&lt;br /&gt;}&lt;/pre&gt;&lt;ul style=&quot;list-style-type: disc;&quot;&gt;&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;위는 ApplicationRunner를 구성해서 애플리케이션이&amp;nbsp;켜질 &amp;nbsp;어떻게 작동할 지를 정하는 run 메서드를 오버라이드 받아 씁니다.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;개발시에 테스트 데이터를 받아서 개발하는 경우가 많지만 그것이 여의치 않았을 때 위와 같이&amp;nbsp;테스트 DB에 데이터를 추가하여 개발 수도 있습니다.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;pre style=&quot;background-color:#2b2b2b;color:#a9b7c6;font-family:'Source Code Pro';font-size:9.8pt;&quot;&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;public enum &lt;/span&gt;BoardType {&lt;br /&gt;    &lt;span style=&quot;color:#9876aa;font-style:italic;&quot;&gt;notice&lt;/span&gt;(&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#6a8759;font-family:'굴림체';&quot;&gt;공지사항&lt;/span&gt;&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;&lt;/span&gt;)&lt;span style=&quot;color:#cc7832;&quot;&gt;,&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color:#9876aa;font-style:italic;&quot;&gt;free&lt;/span&gt;(&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#6a8759;font-family:'굴림체';&quot;&gt;자유게시판&lt;/span&gt;&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;&lt;/span&gt;)&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;    private &lt;/span&gt;String &lt;span style=&quot;color:#9876aa;&quot;&gt;value&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color:#ffc66d;&quot;&gt;BoardType&lt;/span&gt;(String value) {&lt;br /&gt;        &lt;span style=&quot;color:#cc7832;&quot;&gt;this&lt;/span&gt;.&lt;span style=&quot;color:#9876aa;&quot;&gt;value &lt;/span&gt;= value&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;    &lt;/span&gt;}&lt;br /&gt;&lt;br /&gt;    &lt;span style=&quot;color:#cc7832;&quot;&gt;public &lt;/span&gt;String &lt;span style=&quot;color:#ffc66d;&quot;&gt;getValue&lt;/span&gt;() {&lt;br /&gt;        &lt;span style=&quot;color:#cc7832;&quot;&gt;return this&lt;/span&gt;.&lt;span style=&quot;color:#9876aa;&quot;&gt;value&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;    &lt;/span&gt;}&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;ul style=&quot;list-style-type: disc;&quot;&gt;&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;BoardType에 대한 소스 코드입니다.&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;pre style=&quot;background-color:#2b2b2b;color:#a9b7c6;font-family:'Source Code Pro';font-size:9.8pt;&quot;&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;!DOCTYPE &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;html&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;html &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;lang&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;=&quot;en&quot; &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;xmlns:&lt;/span&gt;&lt;span style=&quot;color:#9876aa;&quot;&gt;th&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;=&quot;http://www.thymeleaf.org&quot;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;head&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;    &amp;lt;meta &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;charset&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;=&quot;UTF-8&quot;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;    &amp;lt;title&amp;gt;&lt;/span&gt;Board Form&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/title&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;    &amp;lt;link &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;rel&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;=&quot;stylesheet&quot;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;          &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;href&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;=&quot;https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css&quot;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;          &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;integrity&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;=&quot;sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u&quot;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;          &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;crossorigin&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;=&quot;anonymous&quot;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;    &amp;lt;style&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &lt;/span&gt;&lt;span style=&quot;color:#808080;&quot;&gt;/*html{position:relative;min-height:100%;}*/&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#808080;&quot;&gt;        &lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;body&lt;/span&gt;{&lt;br /&gt;            &lt;span style=&quot;color:#bababa;&quot;&gt;margin-bottom&lt;/span&gt;:&lt;span style=&quot;color:#6897bb;&quot;&gt;60&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;px&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;        &lt;/span&gt;}&lt;br /&gt;&lt;br /&gt;        &lt;span style=&quot;color:#cc7832;&quot;&gt;body &lt;/span&gt;&amp;gt; .&lt;span style=&quot;color:#e8bf6a;&quot;&gt;container&lt;/span&gt;{&lt;br /&gt;            &lt;span style=&quot;color:#bababa;&quot;&gt;padding&lt;/span&gt;:&lt;span style=&quot;color:#6897bb;&quot;&gt;60&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;px &lt;/span&gt;&lt;span style=&quot;color:#6897bb;&quot;&gt;15&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;px &lt;/span&gt;&lt;span style=&quot;color:#6897bb;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;        &lt;/span&gt;}&lt;br /&gt;    &lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/style&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/head&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;body&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;    &amp;lt;div &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;=&quot;container&quot;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &amp;lt;div &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;=&quot;page-header&quot;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;            &amp;lt;h1&amp;gt;&lt;/span&gt;&lt;span style=&quot;font-family:'굴림체';&quot;&gt;게시글 목록&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/h1&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &amp;lt;/div&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &amp;lt;div &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;=&quot;pull-right&quot; &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;style&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;=&quot;&lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;width&lt;/span&gt;:&lt;span style=&quot;color:#6897bb;&quot;&gt;100&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;px&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;margin&lt;/span&gt;:&lt;span style=&quot;color:#6897bb;&quot;&gt;10&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;px &lt;/span&gt;&lt;span style=&quot;color:#6897bb;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;            &amp;lt;a &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;href&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;=&quot;/board&quot; &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;=&quot;btn btn-primary btn-block&quot;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;font-family:'굴림체';&quot;&gt;등록&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/a&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &amp;lt;/div&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &amp;lt;div &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;id&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;=&quot;mainHide&quot;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;            &amp;lt;table &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;=&quot;table table-hover&quot;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;                &amp;lt;thead&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;                &amp;lt;tr&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;                    &amp;lt;th &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;=&quot;col-md-1&quot;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;gt;&lt;/span&gt;#&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/th&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;                    &amp;lt;th &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;=&quot;col-md-2&quot;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;font-family:'굴림체';&quot;&gt;서비스분류&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/th&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;                    &amp;lt;th &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;=&quot;col-md-5&quot;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;font-family:'굴림체';&quot;&gt;제목&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/th&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;                    &amp;lt;th &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;=&quot;col-md-2&quot;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;font-family:'굴림체';&quot;&gt;작성날짜&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/th&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;                    &amp;lt;th &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;=&quot;col-md-2&quot;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;font-family:'굴림체';&quot;&gt;수정날짜&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/th&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;                &amp;lt;/tr&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;                &amp;lt;/thead&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;                &amp;lt;tbody&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;                &amp;lt;tr &lt;/span&gt;&lt;span style=&quot;color:#9876aa;&quot;&gt;th&lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;:each&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;=&quot;board : ${boardList}&quot;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;                    &amp;lt;td &lt;/span&gt;&lt;span style=&quot;color:#9876aa;&quot;&gt;th&lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;:text&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;=&quot;${board.idx}&quot;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;                    &amp;lt;td &lt;/span&gt;&lt;span style=&quot;color:#9876aa;&quot;&gt;th&lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;:text&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;=&quot;${board.boardType.value}&quot;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;                    &amp;lt;td&amp;gt;&amp;lt;a &lt;/span&gt;&lt;span style=&quot;color:#9876aa;&quot;&gt;th&lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;:href&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;=&quot;'/board?idx='+${board.idx}&quot; &lt;/span&gt;&lt;span style=&quot;color:#9876aa;&quot;&gt;th&lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;:text&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;=&quot;${board.title}&quot;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;                    &amp;lt;td &lt;/span&gt;&lt;span style=&quot;color:#9876aa;&quot;&gt;th&lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;:text&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;=&quot;${board.createdDate} ?&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;                    ${#temporals.format(board.createdDate,'yyyy-MM-dd HH:mm')} : ${board.createdDate}&quot;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;                    &amp;lt;td &lt;/span&gt;&lt;span style=&quot;color:#9876aa;&quot;&gt;th&lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;:text&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;=&quot;${board.updatedDate} ?&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;                    ${#temporals.format(board.updatedDate,'yyyy-MM-dd HH:mm')} : ${board.updatedDate}&quot;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;                &amp;lt;/tr&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;                &amp;lt;/tbody&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;            &amp;lt;/table&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &amp;lt;/div&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;    &amp;lt;/div&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;    &amp;lt;br/&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;    &amp;lt;nav &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;aria-label&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;=&quot;Page navigation&quot; &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;style&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;=&quot;&lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;text-align&lt;/span&gt;:&lt;span style=&quot;color:#a5c261;&quot;&gt;center&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &amp;lt;ul &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;=&quot;pagination&quot; &lt;/span&gt;&lt;span style=&quot;color:#9876aa;&quot;&gt;th&lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;:with&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;=&quot;startNumber=${T(Math).floor(boardList.number/10)}*10+1, 
endNumber=(${boardList.totalPages} &amp;gt; ${startNumber}+9) ? ${startNumber}+9 : ${boardList.totalPages}&quot;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;            &amp;lt;li&amp;gt;&amp;lt;a &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;aria-label&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;=&quot;Previous&quot; &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;href&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;=&quot;/board/list?page=1&quot;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#6d9cbe;&quot;&gt;&amp;amp;laquo;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;            &amp;lt;li &lt;/span&gt;&lt;span style=&quot;color:#9876aa;&quot;&gt;th&lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;:style&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;=&quot;${boardList.first} ? 'display:none'&quot;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;                &amp;lt;a &lt;/span&gt;&lt;span style=&quot;color:#9876aa;&quot;&gt;th&lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;:href&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;=&quot;@{/board/list(page=${boardList.number})}&quot;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#6d9cbe;&quot;&gt;&amp;amp;lsaquo;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/a&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;            &amp;lt;/li&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;            &amp;lt;li &lt;/span&gt;&lt;span style=&quot;color:#9876aa;&quot;&gt;th&lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;:each&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;=&quot;page :${#numbers.sequence(startNumber, endNumber)}&quot; &lt;/span&gt;&lt;span style=&quot;color:#9876aa;&quot;&gt;th&lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;:class&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;=&quot;(${page} == ${boardList.number}+1) ? 'active'&quot;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;                &amp;lt;a &lt;/span&gt;&lt;span style=&quot;color:#9876aa;&quot;&gt;th&lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;:href&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;=&quot;@{/board/list(page=${page})}&quot; &lt;/span&gt;&lt;span style=&quot;color:#9876aa;&quot;&gt;th&lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;:text&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;=&quot;${page}&quot;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;gt;&amp;lt;span &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;=&quot;sr-only&quot;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/a&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;            &amp;lt;/li&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;            &amp;lt;li &lt;/span&gt;&lt;span style=&quot;color:#9876aa;&quot;&gt;th&lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;:style&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;=&quot;${boardList.last} ? 'display:none'&quot;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;                &amp;lt;a &lt;/span&gt;&lt;span style=&quot;color:#9876aa;&quot;&gt;th&lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;:href&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;=&quot;@{/board/list(page=${boardList.number}+2)}&quot;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#6d9cbe;&quot;&gt;&amp;amp;rsaquo;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/a&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;            &amp;lt;/li&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;            &amp;lt;li&amp;gt;&amp;lt;a &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;aria-label&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;=&quot;Next&quot; &lt;/span&gt;&lt;span style=&quot;color:#9876aa;&quot;&gt;th&lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;:href&lt;/span&gt;&lt;span style=&quot;color:#a5c261;&quot;&gt;=&quot;@{/board/list(page=${boardList.totalPages})}&quot;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#6d9cbe;&quot;&gt;&amp;amp;raquo;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &amp;lt;/ul&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;    &amp;lt;/nav&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/body&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;ul style=&quot;list-style-type: disc;&quot;&gt;&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;위는 게시글을 동적으로 생성하는 Thymeleaf 문법으로 만든 파일입니다. 컨트롤러에서 보내는Model 객체에서 boardList 에 대한 정보를 꺼내와 페이지를 동적으로 만든 것입니다.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;nav 부분을 보면 페이징의 startNumber와 endNumber에 대한 것을 정하고 HTML 페이지에 반영하는 것을 볼 수 있습니다.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;b&gt;결과 화면&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 728px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/9935A03A5CF7FF5001&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F9935A03A5CF7FF5001&quot; width=&quot;728&quot; height=&quot;411&quot; filename=&quot;캡처.PNG&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;참고자료 :&amp;nbsp;&lt;a href=&quot;http://www.yes24.com/Product/Goods/64584833?scode=032&amp;amp;OzSrank=1&quot;&gt;http://www.yes24.com/Product/Goods/64584833?scode=032&amp;amp;OzSrank=1&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>Spring/Spring Boot</category>
      <category>Spring Boot</category>
      <category>spring 게시판</category>
      <category>스프링 게시판</category>
      <category>스프링부트</category>
      <author>새로비</author>
      <guid isPermaLink="true">https://engkimbs.tistory.com/871</guid>
      <comments>https://engkimbs.tistory.com/entry/%EC%8A%A4%ED%94%84%EB%A7%81-%EB%B6%80%ED%8A%B8-Spring-Boot-%EC%8A%A4%ED%94%84%EB%A7%81-%EA%B2%8C%EC%8B%9C%ED%8C%90-%EB%A7%8C%EB%93%A4%EA%B8%B0-%EB%B6%80%ED%8A%B8%EB%A1%9C-%EC%89%BD%EA%B2%8C-%EA%B5%AC%ED%98%84%ED%95%9C-Spring-%EA%B2%8C%EC%8B%9C%ED%8C%90#entry871comment</comments>
      <pubDate>Mon, 3 Jun 2019 22:44:19 +0900</pubDate>
    </item>
    <item>
      <title>내가 본 워드프레스 핵심 구조 및 기능 (Wordpress Architecture and Function)</title>
      <link>https://engkimbs.tistory.com/entry/%EB%82%B4%EA%B0%80-%EB%B3%B8-%EC%9B%8C%EB%93%9C%ED%94%84%EB%A0%88%EC%8A%A4-%ED%95%B5%EC%8B%AC-%EA%B5%AC%EC%A1%B0-%EB%B0%8F-%EA%B8%B0%EB%8A%A5-Wordpress-Architecture-and-Function</link>
      <description>&lt;p&gt;&lt;span style=&quot;font-size: 18pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(31, 218, 17);&quot;&gt;| &lt;/span&gt;워드프레스(Wordpress)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;워드프레스는 &lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;CMS(Content Management System)으로서 웹사이트를 쉽게 호스팅할 수 있도록 제공되는 오픈소스 솔루션이다. php로 구성되어 있으며 보통 apache, mysql(mariadb&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;)와 같이 연동되어 구성된다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;워드프레스 구조, php&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;를 전혀 몰랐을 때 워드프레스의 구조와 각종 기능들이 어떻게 연동되며 동작하는&amp;nbsp;지 몰라 많이 헤멨었던 기억이 난다. 그동안에 여러 블로그와 책들을 봤지만&amp;nbsp;내가 원하는 핵심적으로 워드프레스의 구조와 기능을 설명하는 글은 딱히 찾아보지 못했고 워드프레스의 admin 페이지와 php 소스 코드를 분석해보고 나서 워드프레스가 어떻게 돌아가는 지 겨우 감을 잡을 수 있었다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;워드프레스의 핵심 구조만 알면 wp-admin 페이지에서 수정하기 어려웠던 커스텀 테마나 여러 기능들을 직접 php 코드나 DB의 데이터를 수정하면서 손쉽게 바꿀 수 있다. 이제 내가 생각하는 워드프레스의 핵심 구조와 기능을 알아보겠다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 18pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(31, 218, 17);&quot;&gt;| &lt;/span&gt;워드프레스 구조(Wordpress Architecture)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;워드프레스는 php 뭉치라고 생각하면 된다. wp-admin, wp-content, wp-includes 같은 핵심 디렉터리 밑에&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;&amp;nbsp;하위 디렉터리로 나뉘어 있지만 결국에는 php 코드로 이루어진 솔루션이다. 이 php는 html 코드를 동적으로 생성하고 이 php가 만들어준 동적인 html에 css와 js가 적용되어 프론트 페이지가 사용자에게 전달되는 것이다. 처음에 칼립소 admin 페이지가 React 기반의 nodejs라고 해서 워드프레스가 javascript로 바뀌는 건가 생각했지만 아니다. 핵심 기능은 php코드로 다 작성되어 있다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;워드프레스는 php 뭉치와 그것을 뒷받침 해주는&amp;nbsp;html, css, js&amp;nbsp; 솔루션이라고 다시 한 번 말하고 싶다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;보통 아래와 같이 워드프레스 구조가 구성된다. (DB로는 mariaDB 혹은 mysql을 쓴다)&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 728px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/99E9B0335CF3A7220A&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F99E9B0335CF3A7220A&quot; width=&quot;728&quot; height=&quot;330&quot; filename=&quot;캡처.PNG&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;ul style=&quot;list-style-type: disc;&quot;&gt;&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;사용자가 워드프레스 기반 웹사이트의 URL을 타고 들어가 HTTP 요청을 한다.&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;HTTP SERVER(Apache&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;) 서버는 이 요청을 받아 Wordpress의 PHP 모듈에 동적인 HTML 페이지를 요청하게 된다.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;Wordpress는 이 요청을 받아 필요하면&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;&amp;nbsp;DBMS에 데이터를 저장하거나 받아와 동적인 HTML 페이지를 만들고 HTTP SERVER에게 보낸다.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;HTTP SERVER는 동적으로 생성된 HTML 페이지를 사용자에게 전달한다.&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;정말 단순하다. 이렇게 보면 Wordpress에 어떤 문제나 수정사항이 발생하였을 때 어느 부분을 보면 되고 디버깅해야 되는 지&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;&amp;nbsp;쉽게 보인다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;예로들어 Wordpress 사이트에 특정 페이지의 데이터가 잘못 표기되는 문제가 발생했다고 하자. 그렇다면&amp;nbsp;Wordpress가 어떤 데이터를 쓰는지 php&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;코드를 통해 확인하고&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;&amp;nbsp;이 데이터가 MariaDB에 어떻게 저장되어 있는 지 확인하면 되는 것이다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;만약 404 Not Found 코드가 떴을 경우에는 먼저 HTTP SERVER가 잘못 설정되어 있는 지 혹은 실제 잘못된 URL이 매핑되어 있는지 확인하면 되는 것이다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;; font-size: 18pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(31, 218, 17);&quot;&gt;| &lt;/span&gt;워드프레스 기능&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;워드프레스는 사용자가 쉽게 웹사이트를 제작할 수 있도록 테마와 플러그인을 설치할 수 있는 환경을 제공한다. 단순히 테마만 설치하면 꽤나 그럴싸한 웹사이트를 제작할 수 있고 플러그인을 설치하면 직접 javascript로 개발해야하는 기능&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;을 손쉽게 적용가능하다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;이 테마와 플러그인은 {SITE_URL&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;}/wp-admin 에 들어가면 쉽게 설치할 수 있으며 가이드를 자세히 읽어보지 않더라도 매우 직관적으로 사용자가 편리하게 되어 있다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 728px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/995665475CF3AA9018&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F995665475CF3AA9018&quot; width=&quot;728&quot; height=&quot;514&quot; filename=&quot;캡처.PNG&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;위 사진은 내가 유료 테마를 사서 적용한 사이트의 admin 페이지다. 처음 사용 시 조금 헤메겠지만 개발자들은 조금 클릭만 하면 금방 적응할 수 있도록 아주 직관적으로 UI 설계가 잘 되어 있다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;무료 테마 혹은 유료 테마를 적용해서 사이트를 만들면 아래와 같이 아주 그럴싸한 웹사이트 UI가 완성된다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 728px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/998C3E4F5CF3AAFC22&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F998C3E4F5CF3AAFC22&quot; width=&quot;728&quot; height=&quot;442&quot; filename=&quot;123.PNG&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;b&gt;&amp;lt;유료 테마 적용 realhomes - &lt;a href=&quot;http://modern.realhomes.io/&quot;&gt;http://modern.realhomes.io/&lt;/a&gt;&amp;gt;&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;그리고 위 테마를 만들기 위해 여러 기능을 제공하는 플러그인들이 설치된다. 이 플러그인 기능을 이용하면 각종 payment 결제, 소셜 로그인, 페이지 템플릿 툴 등을 손쉽게 사용할 수 있다.&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;역시 plugin들과 theme들도 php코드 및 css, js, html로 구성되어 있다. theme들과 plugin 들은 wp-content 디렉터리 밑에 설치되며 wp-admin에서 바꾸기 어려운 부분을 바꾸고 싶다면 themes 디렉터리에 들어가서 그 기능이 구현된 php 코드를 찾아 수정하면 된다. 수정하는 방법도 위 아키텍처를 이해하고 적응이 되면 그리 어렵지 않다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 309px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/9960F5445CF3ABFE26&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F9960F5445CF3ABFE26&quot; width=&quot;309&quot; height=&quot;210&quot; filename=&quot;캡처_2019_06_02_19_58_59_426.png&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;span style=&quot;font-size: 18pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(31, 218, 17);&quot;&gt;|&lt;/span&gt; 워드프레스와 DB&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;워드프레스는 페이지 구현에 필요한 데이터와 각종 옵션들을 DB에 저장하여 관리하고 있다. 여기서 중요한 것은 각 DB들이 어떤 역할을 하는 것을 파악하는 것이다.&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 219px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/9921B34B5CF3AC871B&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F9921B34B5CF3AC871B&quot; width=&quot;219&quot; height=&quot;251&quot; filename=&quot;캡처_2019_06_02_20_01_14_947.png&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;예로 wp_options 테이블은 워드프레스 사이트의 각종 설정값과 제목, 링크값들을 모아놓은 테이블로서 워드프레스 php 코드가 이 테이블을 참조하여 각종 정보를 읽어들인다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 728px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/999106425CF3ACCC0E&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F999106425CF3ACCC0E&quot; width=&quot;728&quot; height=&quot;356&quot; filename=&quot;캡처_2019_06_02_20_01_42_864.jpg&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>Language &amp;amp; Solution/Wordpress</category>
      <category>Wordpress</category>
      <category>워드프레스</category>
      <author>새로비</author>
      <guid isPermaLink="true">https://engkimbs.tistory.com/870</guid>
      <comments>https://engkimbs.tistory.com/entry/%EB%82%B4%EA%B0%80-%EB%B3%B8-%EC%9B%8C%EB%93%9C%ED%94%84%EB%A0%88%EC%8A%A4-%ED%95%B5%EC%8B%AC-%EA%B5%AC%EC%A1%B0-%EB%B0%8F-%EA%B8%B0%EB%8A%A5-Wordpress-Architecture-and-Function#entry870comment</comments>
      <pubDate>Sun, 2 Jun 2019 20:04:48 +0900</pubDate>
    </item>
    <item>
      <title>[Redis, 레디스] 레디스 소개 및 아키텍처, 주의할 점(Redis Overview, Redis Architecture, Tool Tip)</title>
      <link>https://engkimbs.tistory.com/entry/Redis-%EB%A0%88%EB%94%94%EC%8A%A4-%EB%A0%88%EB%94%94%EC%8A%A4-%EC%86%8C%EA%B0%9C-%EB%B0%8F-%EC%95%84%ED%82%A4%ED%85%8D%EC%B2%98-%EC%A3%BC%EC%9D%98%ED%95%A0-%EC%A0%90Redis-Overview-Redis-Architecture-Tool-Tip</link>
      <description>&lt;p&gt;&lt;span style=&quot;font-size: 18pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(31, 218, 17);&quot;&gt;| &lt;/span&gt;Redis란?&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;레디스(Redis)는 고성능 key-value 저장소로서 리스트, 해시, 셋 정렬된 셋 등 여러 형식의 자료구조를 지원하는 NoSQL입니다. 메모리에 상주하면서 RDBMS&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;의 캐시 솔루션으&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;로서 주로 사용되며 라인, 삼성전자, 네이버, Stackoverflow, 인스타그램 등 여러 IT 대기업에서도 사용하는 검증된 오픈소스 &lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;솔루션입니다.&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;제가 일하는 회사에서도 Redis를 쓰고 있으며 RDBMS의 r&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;ead부하를 줄이기 위해 Redis 클러스터 형태로 운영하고 있습니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 18pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(31, 218, 17);&quot;&gt;|&lt;/span&gt; Redis 사용용도&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;Redis는 Message Queue, Shared Memory, Remote Dictionary 용도로 사용할 수 있습니다. 특히 Remote Dictionary로서 RDBMS의 캐시 솔루션으로 사용 용도가 굉장히 높다고 생각하고 있습니다. RDBMS에서 SELECT 쿼리문을 날려&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;&amp;nbsp;특정 데이터들을 FETCH했을 때, RDBMS의 구조상 DISK에서 데이터를 꺼내오는 데 Memory에서 읽어들이는 것&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;보다 천배 가량 더 느리기 때문입니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;이 때&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;&amp;nbsp;Redis같은 유연한 자료구조를 가지는 인메모리 &lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;Key-value 솔루션을 사용하여 DB 부하의 Read 연산의&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;&amp;nbsp;부하를 분산시키는 데 적용하는 것은&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;&amp;nbsp;바람직한 것 같습니다. &lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;(DB 캐시 적중률을 높이면 되겠지만 어느 정도 한계가 있다고 생각합니다&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;)&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(31, 218, 17); font-size: 18pt;&quot;&gt;| &lt;/span&gt;&lt;span style=&quot;font-size: 18pt;&quot;&gt;Redis 특징&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b style=&quot;font-family: &amp;quot;Arial Black&amp;quot;; font-size: 18.6667px;&quot;&gt;&lt;i&gt;&lt;span style=&quot;color: rgb(102, 0, 255);&quot;&gt;■&lt;/span&gt;&lt;span style=&quot;color: rgb(102, 0, 255);&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;; font-size: 14pt;&quot;&gt;&lt;i&gt;&amp;nbsp;Key-Value Store&lt;/i&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;레디스는 거대한 맵(Map)&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;&amp;nbsp;데이터&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;&amp;nbsp;저장소입니다. Key와 value가 매핑된 단순한 맵 데이터 저장소로서 데이터를 레디스에 쉽고 편하게 읽고 쓸 수 있습니다. 장점은 익히기 쉽고 직관적인 데 있고 단점은 Key-value 형태로 저장된 데이터를 레디스 자체내에서 처리하는 것이 어렵다는 점입니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 387px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/9986063F5CF286F82C&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F9986063F5CF286F82C&quot; width=&quot;387&quot; height=&quot;240&quot; filename=&quot;캡처_2019_06_01_23_08_37_673.png&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;; font-size: 14pt;&quot;&gt;&lt;b&gt;&lt;i&gt;&lt;span style=&quot;color: rgb(102, 0, 255);&quot;&gt;■&lt;/span&gt;&lt;span style=&quot;color: rgb(102, 0, 255);&quot;&gt; &lt;/span&gt;다양한 데이터 타입&lt;/i&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;Key로 참조되는 Value 타입을 다양하게 지정하여 저장할 수 있습니다. List, String, Set, Sorted set 등 여러 데이터를 저정하여 손쉽고 편리하게 데이터를 저장할 수 있습니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b style=&quot;font-family: &amp;quot;Arial Black&amp;quot;; font-size: 18.6667px;&quot;&gt;&lt;i&gt;&lt;span style=&quot;color: rgb(102, 0, 255);&quot;&gt;■&lt;/span&gt;&lt;span style=&quot;color: rgb(102, 0, 255);&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;; font-size: 14pt;&quot;&gt;&lt;i&gt;&amp;nbsp;Persistence&lt;/i&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;Redis는 데이터를 disk에 저장할 수 있습니다. 따라서 Redis는 서버가 shutdown된 후에 restart 하더라도 disk에 저장해놓은 데이터를 다시 읽어서 데이터가 유실되지 않습니다. redis의 데이터를 disk에 저장하는 방식은 snapshot, AOF 방식이 있습니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;Snapshot : 스냅샷은 RDB에서도 사용하고 있는 어떤 특정 시점의 데이터를 DISK에 옮겨담는 방식을 뜻합니다. Blocking 방식의 SAVE와 Non-blocking 방식의 BGSAVE 방식이 있습니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;AOF : Redis의 모든 write/update 연산 자체를 모두 log 파일에 기록하는 형태입니다. 서버가 재시작할 시 write/update를 순차적으로 재실행, 데이터를 복구합니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;레디스 공식문서에서의 권장사항은 RDBMS의 rollback 시스템같이 두 방식을 혼용해서 사용하는 것입니다. 주기적으로 snapshot으로 벡업하고 다음 snapshot까지의 저장을 AOF 방식으로 수행하는 것이죠.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;b style=&quot;font-family: &amp;quot;Arial Black&amp;quot;; font-size: 18.6667px;&quot;&gt;&lt;i&gt;&lt;span style=&quot;color: rgb(102, 0, 255);&quot;&gt;■&lt;/span&gt;&lt;span style=&quot;color: rgb(102, 0, 255);&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;; font-size: 14pt;&quot;&gt;&lt;i&gt;&lt;b&gt;ANSI C로 작성&lt;/b&gt;&lt;/i&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;font face=&quot;Arial Black&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;C언어로 작성되어 Java와 같이 가상머신 위에서 동작하는 언어에서 발생하는 성능 문제에 대해 자유롭습니다. 곧바로 기계어로 동작하지 않고 어떤 가상의 머신 위에서 인터프리터된 언어로 가동하는 경우에는 가비지컬렉션(Garbage Collection&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;) 동작에 따른 성능 문제가 발생할 수 밖에 없습니다. 하지만 C언어로 작성된 Redis는 이런 이슈에 대해 자유롭습니다.&amp;nbsp;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b style=&quot;font-family: &amp;quot;Arial Black&amp;quot;; font-size: 18.6667px;&quot;&gt;&lt;i&gt;&lt;span style=&quot;color: rgb(102, 0, 255);&quot;&gt;■&lt;/span&gt;&lt;span style=&quot;color: rgb(102, 0, 255);&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;i style=&quot;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 14pt; font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;서버 측 복제 및 샤딩을&lt;/span&gt;&lt;span style=&quot;font-size: 14pt; font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;&amp;nbsp;지원&lt;/span&gt;&lt;/b&gt;&lt;/i&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;읽기 성능 증대를 위한 서버 측 복제를 지원합니다와 쓰기 성능 증대를 위한 클라이언트 측 샤딩을 지원합니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;; font-size: 18pt;&quot;&gt;&lt;span style=&quot;color: rgb(31, 218, 17);&quot;&gt;|&lt;/span&gt; Redis 아키텍처&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b style=&quot;font-family: &amp;quot;Arial Black&amp;quot;; font-size: 18.6667px;&quot;&gt;&lt;i&gt;&lt;span style=&quot;color: rgb(102, 0, 255);&quot;&gt;■&lt;/span&gt;&lt;span style=&quot;color: rgb(102, 0, 255);&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;&amp;nbsp;Redis Topology&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;레디스는 아래 그림과 같이 Master-slave 형태로 데이터를 복제해서 운영할 수 있습니다. 이 master-slave 간의 복제는 non-blocking 상태로 이루어집니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b style=&quot;font-family: &amp;quot;Arial Black&amp;quot;; font-size: 18.6667px;&quot;&gt;&lt;i&gt;&lt;span style=&quot;color: rgb(102, 0, 255);&quot;&gt;■&lt;/span&gt;&lt;span style=&quot;color: rgb(102, 0, 255);&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;Redis Sharding&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;레디스에서 데이터를 샤딩하여 레디스의 read성능을 높일 수 있습니다. 예로들어 #1~#999, #1000~#1999 ID 형태로 데이터를 나누어서 데이터의 용량을 확장하고 각 서버에 있는 Redis의 부하를 나누어 줄일 수 있습니다.&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b style=&quot;font-family: &amp;quot;Arial Black&amp;quot;; font-size: 18.6667px;&quot;&gt;&lt;i&gt;&lt;span style=&quot;color: rgb(102, 0, 255);&quot;&gt;■&lt;/span&gt;&lt;span style=&quot;color: rgb(102, 0, 255);&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;Redis Cluster&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;레디스는 이전에는 Clustering을 지원하지 않았지만 Clustering을 지원하면서 대부분의 회사가 Redis를 클러스터로 묶어서 가용성 및 안정성있는 캐시 매니져로서 사용하고 있습니다. Single Instance로서 레디스를 사용할 때는 Sharding이나 Topology로서 커버해야했던 부분을 Clustering을 이용함으로서 어플리케이션을 설계하는 데 좀 더 수월해졌다고 볼 수 있습니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 728px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/99ACC94D5CF28B282E&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F99ACC94D5CF28B282E&quot; width=&quot;728&quot; height=&quot;455&quot; filename=&quot;캡처_2019_06_01_23_15_28_531.png&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 18pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(31, 218, 17); font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;|&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt; 사용시 주의할 점&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b style=&quot;font-family: &amp;quot;Arial Black&amp;quot;; font-size: 18.6667px;&quot;&gt;&lt;i&gt;&lt;span style=&quot;color: rgb(102, 0, 255);&quot;&gt;■&lt;/span&gt;&lt;span style=&quot;color: rgb(102, 0, 255);&quot;&gt;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt;장애가 났을 경우 그에 대비한 운영 플랜이 세워줘야 함&lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;b style=&quot;font-family: &amp;quot;Arial Black&amp;quot;; font-size: 18.6667px;&quot;&gt;&lt;i&gt;&lt;span style=&quot;color: rgb(102, 0, 255);&quot;&gt;&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;font face=&quot;Arial Black&quot;&gt;&lt;span style=&quot;font-size: 18.6667px;&quot;&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;Redis는 인메모리 데이터 저장소로서 서버에 장애가 났을 경우 데이터 유실이 발생합니다. 따라서 위의 Snapshot과 AOF 기능을 통한 복구 시나리오가 제대로 세워져 있어야 데이터 유실에 대비한 사고에 대처할 수 있습니다.&lt;/span&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b style=&quot;font-family: &amp;quot;Arial Black&amp;quot;; font-size: 18.6667px;&quot;&gt;&lt;i&gt;&lt;span style=&quot;color: rgb(102, 0, 255);&quot;&gt;■&lt;/span&gt;&lt;span style=&quot;color: rgb(102, 0, 255);&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;&lt;i&gt;&amp;nbsp;캐시 솔루션으로 사용할 시 잘못된 데이터가 캐시되는 것을 방지, 예방해야 함&lt;/i&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;회사에서 Redis를 운영 중 전에 &lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;개발자의 실수로 작성된&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;&amp;nbsp;로직으로 캐시 데이터가 잘못 캐싱되어 올바르지 않은 데이터가 FETCH되어 한동안 데이터가 꼬이는 일이 있었습니다. 레디스와 캐싱하고자 하는 데이터 저장소의 데이터가 서로 일치하는 지 주기적인 모니터링과 이를 방지하기 위한 사내 솔루션을 개발하는 것이 좋습니다&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 18pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(31, 218, 17); font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;|&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;&amp;nbsp;참고자료&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://qnimate.com/overview-of-redis-architecture/&quot;&gt;&lt;i&gt;&lt;b&gt;http://qnimate.com/overview-of-redis-architecture/&lt;/b&gt;&lt;/i&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://bcho.tistory.com/654&quot;&gt;&lt;i&gt;&lt;b&gt;https://bcho.tistory.com/654&lt;/b&gt;&lt;/i&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>Language &amp;amp; Solution/Redis</category>
      <author>새로비</author>
      <guid isPermaLink="true">https://engkimbs.tistory.com/869</guid>
      <comments>https://engkimbs.tistory.com/entry/Redis-%EB%A0%88%EB%94%94%EC%8A%A4-%EB%A0%88%EB%94%94%EC%8A%A4-%EC%86%8C%EA%B0%9C-%EB%B0%8F-%EC%95%84%ED%82%A4%ED%85%8D%EC%B2%98-%EC%A3%BC%EC%9D%98%ED%95%A0-%EC%A0%90Redis-Overview-Redis-Architecture-Tool-Tip#entry869comment</comments>
      <pubDate>Sat, 1 Jun 2019 23:29:38 +0900</pubDate>
    </item>
    <item>
      <title>[Spring REST API #10] Spring REST Docs 소개 및 적용</title>
      <link>https://engkimbs.tistory.com/entry/Spring-REST-API-10-Spring-REST-Docs-%EC%86%8C%EA%B0%9C-%EB%B0%8F-%EC%A0%81%EC%9A%A9</link>
      <description>&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 18pt; color: rgb(0, 0, 0);&quot;&gt;&lt;span style=&quot;background-color: rgb(255, 255, 255); color: rgb(31, 218, 17);&quot;&gt;| &lt;/span&gt;Spring REST Docs&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;Spring REST Docs는 REST API에 대한 정보를 제공하는 Docs를 생성할 수 있는 Spring 진영에서 제공하는 툴입니다.&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;Spring MVC Test 코드 작성시 추가적으로 Docs를 생성하는 코드를 첨가하여 생성할 수 있습니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;REST Docs는 REST 아키텍처의 self-descriptive 규약을 지키기 위해 REST API의 리소스 및 API 명세 그리고 요청과 응답 데이터의 설명까지 포함된 문서를 만들 수 있게 해줍니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;모든 소스 코드는 &lt;/span&gt;&lt;a href=&quot;https://github.com/engkimbs/spring-rest-api&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;&lt;span style=&quot;font-size: 14pt; color: rgb(0, 216, 255);&quot;&gt;여기&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;에서 보실 수 있습니다.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;프로젝트 구조&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;pre style=&quot;background-color:#2b2b2b;color:#a9b7c6;font-family:'Source Code Pro';font-size:9.8pt;&quot;&gt;+---src&lt;br /&gt;|   +---main&lt;br /&gt;|   |   +---java&lt;br /&gt;|   |   |   \---com&lt;br /&gt;|   |   |       \---example&lt;br /&gt;|   |   |           \---springrestapi&lt;br /&gt;|   |   |               |   SpringRestApiApplication.java&lt;br /&gt;|   |   |               |&lt;br /&gt;|   |   |               +---common&lt;br /&gt;|   |   |               |       ErrorsSerializer.java&lt;br /&gt;|   |   |               |       TestDescription.java&lt;br /&gt;|   |   |               |&lt;br /&gt;|   |   |               \---events&lt;br /&gt;|   |   |                       Event.java&lt;br /&gt;|   |   |                       EventController.java&lt;br /&gt;|   |   |                       EventDto.java&lt;br /&gt;|   |   |                       EventRepository.java&lt;br /&gt;|   |   |                       EventResource.java&lt;br /&gt;|   |   |                       EventStatus.java&lt;br /&gt;|   |   |                       EventValidator.java&lt;br /&gt;|   |   |&lt;br /&gt;|   |   \---resources&lt;br /&gt;|   |       |   application.yml&lt;br /&gt;|   |       |&lt;br /&gt;|   |       +---static&lt;br /&gt;|   |       \---templates&lt;br /&gt;|   \---test&lt;br /&gt;|       \---java&lt;br /&gt;|           \---com&lt;br /&gt;|               \---example&lt;br /&gt;|                   \---springrestapi&lt;br /&gt;|                       |   SpringRestApiApplicationTests.java&lt;br /&gt;|                       |&lt;br /&gt;|                       \---events&lt;br /&gt;|                               EventControllerTests.java&lt;br /&gt;|                               EventTest.java&lt;/pre&gt;&lt;p&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;의존성 관리&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;pre style=&quot;background-color:#2b2b2b;color:#a9b7c6;font-family:'Source Code Pro';font-size:9.8pt;&quot;&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;dependency&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;    &amp;lt;groupId&amp;gt;&lt;/span&gt;org.springframework.restdocs&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/groupId&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;    &amp;lt;artifactId&amp;gt;&lt;/span&gt;spring-restdocs-mockmvc&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/artifactId&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;    &amp;lt;scope&amp;gt;&lt;/span&gt;test&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/scope&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/dependency&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;p&gt;&lt;font face=&quot;Arial Black&quot;&gt;&lt;b&gt;위와 같이 restdocs 의존성을 추가해야 합니다. 또한 pom.xml에 아래와 같이 build 설정을 추가해줍니다.&lt;/b&gt;&lt;/font&gt;&lt;/p&gt;&lt;pre style=&quot;background-color:#2b2b2b;color:#a9b7c6;font-family:'Source Code Pro';font-size:9.8pt;&quot;&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;build&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;    &amp;lt;plugins&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &amp;lt;plugin&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;            &amp;lt;groupId&amp;gt;&lt;/span&gt;org.springframework.boot&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/groupId&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;            &amp;lt;artifactId&amp;gt;&lt;/span&gt;spring-boot-maven-plugin&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/artifactId&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &amp;lt;/plugin&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &amp;lt;plugin&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;            &amp;lt;groupId&amp;gt;&lt;/span&gt;org.asciidoctor&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/groupId&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;            &amp;lt;artifactId&amp;gt;&lt;/span&gt;asciidoctor-maven-plugin&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/artifactId&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;            &amp;lt;version&amp;gt;&lt;/span&gt;1.5.3&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/version&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;            &amp;lt;executions&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;                &amp;lt;execution&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;                    &amp;lt;id&amp;gt;&lt;/span&gt;generate-docs&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/id&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;                    &amp;lt;phase&amp;gt;&lt;/span&gt;prepare-package&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/phase&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;                    &amp;lt;goals&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;                        &amp;lt;goal&amp;gt;&lt;/span&gt;process-asciidoc&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/goal&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;                    &amp;lt;/goals&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;                    &amp;lt;configuration&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;                        &amp;lt;backend&amp;gt;&lt;/span&gt;html&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/backend&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;                        &amp;lt;doctype&amp;gt;&lt;/span&gt;book&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/doctype&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;                    &amp;lt;/configuration&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;                &amp;lt;/execution&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;            &amp;lt;/executions&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;            &amp;lt;dependencies&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;                &amp;lt;dependency&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;                    &amp;lt;groupId&amp;gt;&lt;/span&gt;org.springframework.restdocs&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/groupId&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;                    &amp;lt;artifactId&amp;gt;&lt;/span&gt;spring-restdocs-asciidoctor&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/artifactId&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;                    &amp;lt;version&amp;gt;&lt;/span&gt;2.0.2.RELEASE&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/version&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;                &amp;lt;/dependency&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;            &amp;lt;/dependencies&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &amp;lt;/plugin&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &amp;lt;plugin&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;            &amp;lt;artifactId&amp;gt;&lt;/span&gt;maven-resources-plugin&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/artifactId&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;            &amp;lt;version&amp;gt;&lt;/span&gt;2.7&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/version&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;            &amp;lt;executions&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;                &amp;lt;execution&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;                    &amp;lt;id&amp;gt;&lt;/span&gt;copy-resources&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/id&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;                    &amp;lt;phase&amp;gt;&lt;/span&gt;prepare-package&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/phase&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;                    &amp;lt;goals&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;                        &amp;lt;goal&amp;gt;&lt;/span&gt;copy-resources&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/goal&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;                    &amp;lt;/goals&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;                    &amp;lt;configuration&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;                        &amp;lt;outputDirectory&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;                            &lt;/span&gt;${project.build.outputDirectory}/static/docs&lt;br /&gt;                        &lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/outputDirectory&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;                        &amp;lt;resources&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;                            &amp;lt;resource&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;                                &amp;lt;directory&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;                                    &lt;/span&gt;${project.build.directory}/generated-docs&lt;br /&gt;                                &lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/directory&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;                            &amp;lt;/resource&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;                        &amp;lt;/resources&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;                    &amp;lt;/configuration&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;                &amp;lt;/execution&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;            &amp;lt;/executions&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &amp;lt;/plugin&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;    &amp;lt;/plugins&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/build&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;테스트&amp;nbsp;코드&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;pre style=&quot;background-color:#2b2b2b;color:#a9b7c6;font-family:'Source Code Pro';font-size:9.8pt;&quot;&gt;&lt;span style=&quot;color:#bbb529;&quot;&gt;@Test&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#bbb529;&quot;&gt;@TestDescription&lt;/span&gt;(&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#6a8759;font-family:'굴림체';&quot;&gt;정상적으로 이벤트를 입력&lt;/span&gt;&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;&lt;/span&gt;)&lt;br /&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;public void &lt;/span&gt;&lt;span style=&quot;color:#ffc66d;&quot;&gt;createEvent&lt;/span&gt;() &lt;span style=&quot;color:#cc7832;&quot;&gt;throws &lt;/span&gt;Exception {&lt;br /&gt;    EventDto event = EventDto.&lt;span style=&quot;font-style:italic;&quot;&gt;builder&lt;/span&gt;()&lt;br /&gt;            .name(&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;Spring&quot;&lt;/span&gt;)&lt;br /&gt;            .description(&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;REST API Development&quot;&lt;/span&gt;)&lt;br /&gt;            .beginEnrollmentDateTime(LocalDateTime.&lt;span style=&quot;font-style:italic;&quot;&gt;of&lt;/span&gt;(&lt;span style=&quot;color:#6897bb;&quot;&gt;2010&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#6897bb;&quot;&gt;11&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#6897bb;&quot;&gt;23&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#6897bb;&quot;&gt;14&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#6897bb;&quot;&gt;23&lt;/span&gt;))&lt;br /&gt;            .closeEnrollmentDateTime(LocalDateTime.&lt;span style=&quot;font-style:italic;&quot;&gt;of&lt;/span&gt;(&lt;span style=&quot;color:#6897bb;&quot;&gt;2018&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#6897bb;&quot;&gt;11&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#6897bb;&quot;&gt;30&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#6897bb;&quot;&gt;14&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#6897bb;&quot;&gt;23&lt;/span&gt;))&lt;br /&gt;            .beginEventDateTime(LocalDateTime.&lt;span style=&quot;font-style:italic;&quot;&gt;of&lt;/span&gt;(&lt;span style=&quot;color:#6897bb;&quot;&gt;2018&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#6897bb;&quot;&gt;12&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#6897bb;&quot;&gt;5&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#6897bb;&quot;&gt;14&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#6897bb;&quot;&gt;30&lt;/span&gt;))&lt;br /&gt;            .endEventDateTime(LocalDateTime.&lt;span style=&quot;font-style:italic;&quot;&gt;of&lt;/span&gt;(&lt;span style=&quot;color:#6897bb;&quot;&gt;2018&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#6897bb;&quot;&gt;12&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#6897bb;&quot;&gt;6&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#6897bb;&quot;&gt;14&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#6897bb;&quot;&gt;30&lt;/span&gt;))&lt;br /&gt;            .basePrice(&lt;span style=&quot;color:#6897bb;&quot;&gt;100&lt;/span&gt;)&lt;br /&gt;            .maxPrice(&lt;span style=&quot;color:#6897bb;&quot;&gt;200&lt;/span&gt;)&lt;br /&gt;            .limitOfEnrollment(&lt;span style=&quot;color:#6897bb;&quot;&gt;100&lt;/span&gt;)&lt;br /&gt;            .location(&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;D Start up Factory&quot;&lt;/span&gt;)&lt;br /&gt;            .build()&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color:#9876aa;&quot;&gt;mockMvc&lt;/span&gt;.perform(&lt;span style=&quot;font-style:italic;&quot;&gt;post&lt;/span&gt;(&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;/api/events/&quot;&lt;/span&gt;)&lt;br /&gt;                    .contentType(MediaType.&lt;span style=&quot;color:#9876aa;font-style:italic;&quot;&gt;APPLICATION_JSON_UTF8&lt;/span&gt;)&lt;br /&gt;                    .accept(MediaTypes.&lt;span style=&quot;color:#9876aa;font-style:italic;&quot;&gt;HAL_JSON_UTF8&lt;/span&gt;)&lt;br /&gt;                    .content(&lt;span style=&quot;color:#9876aa;&quot;&gt;objectMapper&lt;/span&gt;.writeValueAsString(event)))&lt;br /&gt;                .andDo(&lt;span style=&quot;font-style:italic;&quot;&gt;print&lt;/span&gt;())&lt;br /&gt;                .andExpect(&lt;span style=&quot;font-style:italic;&quot;&gt;status&lt;/span&gt;().isCreated())&lt;br /&gt;                .andExpect(&lt;span style=&quot;font-style:italic;&quot;&gt;jsonPath&lt;/span&gt;(&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;id&quot;&lt;/span&gt;).exists())&lt;br /&gt;                .andExpect(&lt;span style=&quot;font-style:italic;&quot;&gt;header&lt;/span&gt;().exists(HttpHeaders.&lt;span style=&quot;color:#9876aa;font-style:italic;&quot;&gt;LOCATION&lt;/span&gt;))&lt;br /&gt;                .andExpect(&lt;span style=&quot;font-style:italic;&quot;&gt;header&lt;/span&gt;().string(HttpHeaders.&lt;span style=&quot;color:#9876aa;font-style:italic;&quot;&gt;CONTENT_TYPE&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;MediaTypes.&lt;span style=&quot;color:#9876aa;font-style:italic;&quot;&gt;HAL_JSON_UTF8_VALUE&lt;/span&gt;))&lt;br /&gt;                .andExpect(&lt;span style=&quot;font-style:italic;&quot;&gt;jsonPath&lt;/span&gt;(&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;free&quot;&lt;/span&gt;).value(&lt;span style=&quot;color:#cc7832;&quot;&gt;false&lt;/span&gt;))&lt;br /&gt;                .andExpect(&lt;span style=&quot;font-style:italic;&quot;&gt;jsonPath&lt;/span&gt;(&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;offline&quot;&lt;/span&gt;).value(&lt;span style=&quot;color:#cc7832;&quot;&gt;true&lt;/span&gt;))&lt;br /&gt;                .andExpect(&lt;span style=&quot;font-style:italic;&quot;&gt;jsonPath&lt;/span&gt;(&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;eventStatus&quot;&lt;/span&gt;).value(EventStatus.&lt;span style=&quot;color:#9876aa;font-style:italic;&quot;&gt;DRAFT&lt;/span&gt;.name()))&lt;br /&gt;                .andExpect(&lt;span style=&quot;font-style:italic;&quot;&gt;jsonPath&lt;/span&gt;(&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;_links.self&quot;&lt;/span&gt;).exists())&lt;br /&gt;                .andExpect(&lt;span style=&quot;font-style:italic;&quot;&gt;jsonPath&lt;/span&gt;(&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;_links.query-events&quot;&lt;/span&gt;).exists())&lt;br /&gt;                .andExpect(&lt;span style=&quot;font-style:italic;&quot;&gt;jsonPath&lt;/span&gt;(&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;_links.update-events&quot;&lt;/span&gt;).exists())&lt;br /&gt;            .andDo(&lt;span style=&quot;font-style:italic;&quot;&gt;document&lt;/span&gt;(&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;create-event&quot;&lt;/span&gt;))&lt;br /&gt;    &lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;}&lt;/pre&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;위 테스트 코드에서 andDo(document(&quot;create-event&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;&quot;)) 를 추가해주면 기본적인 Spring REST Docs를 스프링 부트에서 생성합니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 309px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/9954B2465CF138B021&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F9954B2465CF138B021&quot; width=&quot;309&quot; height=&quot;227&quot; filename=&quot;캡처_2019_05_31_23_19_17_894.png&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;아래는 curl-request.adoc의 내용&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;입니다.&lt;/span&gt;&lt;/p&gt;&lt;pre style=&quot;background-color:#2b2b2b;color:#a9b7c6;font-family:'Source Code Pro';font-size:9.8pt;&quot;&gt;[source,bash]&lt;br /&gt;----&lt;br /&gt;$ curl 'http://localhost:8080/api/events/' -i -X POST \&lt;br /&gt;    -H 'Content-Type: application/json;charset=UTF-8' \&lt;br /&gt;    -H 'Accept: application/hal+json;charset=UTF-8' \&lt;br /&gt;    -d '{&quot;name&quot;:&quot;Spring&quot;,&quot;description&quot;:&quot;REST API Development&quot;,&quot;beginEnrollmentDateTime&quot;:&quot;2010-11-23T14:23:00&quot;,&quot;closeEnrollmentDateTime&quot;:&quot;2018-11-30T14:23:00&quot;,&quot;beginEventDateTime&quot;:&quot;2018-12-05T14:30:00&quot;,&quot;endEventDateTime&quot;:&quot;2018-12-06T14:30:00&quot;,&quot;location&quot;:&quot;D Start up Factory&quot;,&quot;basePrice&quot;:100,&quot;maxPrice&quot;:200,&quot;limitOfEnrollment&quot;:100}'&lt;br /&gt;----&lt;/pre&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;하지만 위의 정보에서 -d 부분의 데이터의 요청 형식이 일자로 되어있어서 보기가 불편합니다. 따라서 위의 내용을 보기 쉽게 설정하기 위해&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;&amp;nbsp;다음과 같이 REST Docs를 설정하기 위한 코드를 추가할 수 있습니다.&lt;/span&gt;&lt;/p&gt;&lt;pre style=&quot;background-color:#2b2b2b;color:#a9b7c6;font-family:'Source Code Pro';font-size:9.8pt;&quot;&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;import &lt;/span&gt;org.springframework.boot.test.autoconfigure.restdocs.RestDocsMockMvcConfigurationCustomizer&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;import &lt;/span&gt;org.springframework.boot.test.context.&lt;span style=&quot;color:#bbb529;&quot;&gt;TestConfiguration&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;import &lt;/span&gt;org.springframework.context.annotation.&lt;span style=&quot;color:#bbb529;&quot;&gt;Bean&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;import static &lt;/span&gt;org.springframework.restdocs.operation.preprocess.Preprocessors.&lt;span style=&quot;font-style:italic;&quot;&gt;prettyPrint&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#bbb529;&quot;&gt;@TestConfiguration&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;public class &lt;/span&gt;RestDocsConfiguration {&lt;br /&gt;&lt;br /&gt;    &lt;span style=&quot;color:#bbb529;&quot;&gt;@Bean&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#bbb529;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;public &lt;/span&gt;RestDocsMockMvcConfigurationCustomizer &lt;span style=&quot;color:#ffc66d;&quot;&gt;restDocsMockMvcConfigurationCustomizer&lt;/span&gt;() {&lt;br /&gt;        &lt;span style=&quot;color:#cc7832;&quot;&gt;return &lt;/span&gt;configurer -&amp;gt; configurer.operationPreprocessors()&lt;br /&gt;                .withRequestDefaults(&lt;span style=&quot;font-style:italic;&quot;&gt;prettyPrint&lt;/span&gt;())&lt;br /&gt;                .withResponseDefaults(&lt;span style=&quot;font-style:italic;&quot;&gt;prettyPrint&lt;/span&gt;())&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;    &lt;/span&gt;}&lt;br /&gt;}&lt;/pre&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;prettyPrint() 메서드를 통해서 위에서 보기 힘들었던 요청 예시를 다음과 같이 보기 쉽게 REST Docs가 생성되게 됩니다. 그리고 놓치지 말아야 할 것은 EventControllerTests 클래스에 다음과 같은 어노테이션을 추가해야합니다.&lt;/span&gt;&lt;/p&gt;&lt;pre style=&quot;background-color:#2b2b2b;color:#a9b7c6;font-family:'Source Code Pro';font-size:9.8pt;&quot;&gt;&lt;span style=&quot;color:#bbb529;&quot;&gt;@Import&lt;/span&gt;(RestDocsConfiguration.&lt;span style=&quot;color:#cc7832;&quot;&gt;class&lt;/span&gt;)&lt;/pre&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;결과화면&lt;/b&gt;&lt;/p&gt;&lt;pre style=&quot;background-color:#2b2b2b;color:#a9b7c6;font-family:'Source Code Pro';font-size:9.8pt;&quot;&gt;[source,bash]&lt;br /&gt;----&lt;br /&gt;$ curl 'http://localhost:8080/api/events/' -i -X POST \&lt;br /&gt;    -H 'Content-Type: application/json;charset=UTF-8' \&lt;br /&gt;    -H 'Accept: application/hal+json;charset=UTF-8' \&lt;br /&gt;    -d '{&lt;br /&gt;  &quot;name&quot; : &quot;Spring&quot;,&lt;br /&gt;  &quot;description&quot; : &quot;REST API Development&quot;,&lt;br /&gt;  &quot;beginEnrollmentDateTime&quot; : &quot;2010-11-23T14:23:00&quot;,&lt;br /&gt;  &quot;closeEnrollmentDateTime&quot; : &quot;2018-11-30T14:23:00&quot;,&lt;br /&gt;  &quot;beginEventDateTime&quot; : &quot;2018-12-05T14:30:00&quot;,&lt;br /&gt;  &quot;endEventDateTime&quot; : &quot;2018-12-06T14:30:00&quot;,&lt;br /&gt;  &quot;location&quot; : &quot;D Start up Factory&quot;,&lt;br /&gt;  &quot;basePrice&quot; : 100,&lt;br /&gt;  &quot;maxPrice&quot; : 200,&lt;br /&gt;  &quot;limitOfEnrollment&quot; : 100&lt;br /&gt;}'&lt;br /&gt;----&lt;/pre&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;참조:&amp;nbsp;&lt;a href=&quot;https://www.inflearn.com/course/spring_rest-api/#&quot;&gt;https://www.inflearn.com/course/spring_rest-api/#&lt;/a&gt;&lt;/p&gt;&lt;p&gt;소스 코드 :&amp;nbsp;&lt;a href=&quot;https://github.com/engkimbs/spring-rest-api&quot;&gt;https://github.com/engkimbs/spring-rest-api&lt;/a&gt;&lt;/p&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;</description>
      <category>Spring/Spring Rest API</category>
      <category>Spring REST API</category>
      <category>Spring REST Docs</category>
      <author>새로비</author>
      <guid isPermaLink="true">https://engkimbs.tistory.com/868</guid>
      <comments>https://engkimbs.tistory.com/entry/Spring-REST-API-10-Spring-REST-Docs-%EC%86%8C%EA%B0%9C-%EB%B0%8F-%EC%A0%81%EC%9A%A9#entry868comment</comments>
      <pubDate>Fri, 31 May 2019 23:29:16 +0900</pubDate>
    </item>
    <item>
      <title>VisualVM을 이용한 log4j2 로그 수준 변경 및 모니터링</title>
      <link>https://engkimbs.tistory.com/entry/VisualVM%EC%9D%84-%EC%9D%B4%EC%9A%A9%ED%95%9C-log4j2-%EB%A1%9C%EA%B7%B8-%EC%88%98%EC%A4%80-%EB%B3%80%EA%B2%BD-%EB%B0%8F-%EB%AA%A8%EB%8B%88%ED%84%B0%EB%A7%81</link>
      <description>&lt;p&gt;&lt;span style=&quot;font-size: 18pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(31, 218, 17);&quot;&gt;|&lt;/span&gt; VisualVM&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;VisualVM은 JVM 에서 동작하는 어플리케이션의 프로파일링 및 모니터링을 제공하는 GUI 툴입니다. 현재 다니고 있는 회사에서는 다른 JVM 모니터링 툴을 사용하지 않고 VisualVM을 통해 모니터링 및 프로파일링을 하고 있습니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;다른 상용 툴(ex.&amp;nbsp;제니퍼소프트 제품들)들을 써보지 않아서 모르겠지만&amp;nbsp;VisualVM 만으로 아직까지는 큰 불편없이 19만줄 가량되는 마이크로아키텍처 기반 데이터 파이프라이닝 프로젝트를 운영하고 있습니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 18pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(31, 218, 17);&quot;&gt;| &lt;/span&gt;실행 환경&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;ul style=&quot;list-style-type: disc;&quot;&gt;&lt;li&gt;Window 10 home&lt;/li&gt;&lt;li&gt;Java 1.8&amp;nbsp;&lt;/li&gt;&lt;li&gt;IntelliJ IDE( Not Required )&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 18pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(31, 218, 17);&quot;&gt;| &lt;/span&gt;VisualVM을 이용한 log4j2 로그 수준 변경&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;운영을 하는 도중에 특정 Logger의 로깅 레벨 수준을 높여 DEBUG 및 TRACE 성 로그를 추적하고 싶을 때가 있습니다. 이 때 VisualVM을 이용하여 로컬 개발 PC에서 원격으로 운영 서버에 접속하여 어플리케이션 로깅 시스템의 로깅 레벨 수준을 높일 수 있습니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;그 중에서 log4j2 기반인 로깅 시스템에서 VisualVM을 통해 어떻게 로그 수준을 변경하고 어플리케이션이 어떻게 동작하는 지 알아 보겠습니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;프로젝트 구조&lt;/b&gt;&lt;/p&gt;&lt;pre style=&quot;background-color:#2b2b2b;color:#a9b7c6;font-family:'굴림체';font-size:9.0pt;&quot;&gt;+---src&lt;br /&gt;|   +---main&lt;br /&gt;|   |   +---java&lt;br /&gt;|   |   |   \---com&lt;br /&gt;|   |   |       |   Com.java&lt;br /&gt;|   |   |       |&lt;br /&gt;|   |   |       \---dev&lt;br /&gt;|   |   |               ComDev.java&lt;br /&gt;|   |   |&lt;br /&gt;|   |   \---resources&lt;br /&gt;|   |           log4j2.xml&lt;/pre&gt;&lt;p&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;의존성 설정&lt;/b&gt;&lt;/p&gt;&lt;pre style=&quot;background-color:#2b2b2b;color:#a9b7c6;font-family:'굴림체';font-size:9.0pt;&quot;&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;dependencies&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;    &amp;lt;dependency&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &amp;lt;groupId&amp;gt;&lt;/span&gt;org.apache.logging.log4j&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/groupId&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &amp;lt;artifactId&amp;gt;&lt;/span&gt;log4j-slf4j-impl&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/artifactId&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &amp;lt;version&amp;gt;&lt;/span&gt;2.11.2&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/version&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;    &amp;lt;/dependency&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/dependencies&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;ul style=&quot;list-style-type: disc;&quot;&gt;&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;slf4j의 log4j2의 구현체를 쓰게되면 바로 log4j2 기반인 로깅시스템을 쓸 수 있습니다.&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;log4j2.xml 설정 파일&lt;/b&gt;&lt;/p&gt;&lt;pre style=&quot;background-color:#2b2b2b;color:#a9b7c6;font-family:'굴림체';font-size:9.0pt;&quot;&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;?&lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;xml version&lt;/span&gt;&lt;span style=&quot;color:#6a8759;&quot;&gt;=&quot;1.0&quot; &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;encoding&lt;/span&gt;&lt;span style=&quot;color:#6a8759;&quot;&gt;=&quot;UTF-8&quot;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;?&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;Configuration &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;status&lt;/span&gt;&lt;span style=&quot;color:#6a8759;&quot;&gt;=&quot;WARN&quot;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;    &amp;lt;Appenders&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &amp;lt;Console &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;color:#6a8759;&quot;&gt;=&quot;console&quot; &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;target&lt;/span&gt;&lt;span style=&quot;color:#6a8759;&quot;&gt;=&quot;SYSTEM_OUT&quot;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;            &amp;lt;PatternLayout &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;pattern&lt;/span&gt;&lt;span style=&quot;color:#6a8759;&quot;&gt;=&quot;%d{yyyy-MM-dd'T'HH:mm:ss.SSS} [%t] %p %m%n&quot;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;/&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &amp;lt;/Console&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;    &amp;lt;/Appenders&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;    &amp;lt;Loggers&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &amp;lt;Root &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;level&lt;/span&gt;&lt;span style=&quot;color:#6a8759;&quot;&gt;=&quot;WARN&quot; &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;additivity&lt;/span&gt;&lt;span style=&quot;color:#6a8759;&quot;&gt;=&quot;false&quot;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;            &amp;lt;appender-ref &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;ref&lt;/span&gt;&lt;span style=&quot;color:#6a8759;&quot;&gt;=&quot;console&quot;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;/&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &amp;lt;/Root&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &amp;lt;Logger &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;color:#6a8759;&quot;&gt;=&quot;com&quot; &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;level&lt;/span&gt;&lt;span style=&quot;color:#6a8759;&quot;&gt;=&quot;WARN&quot; &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;additivity&lt;/span&gt;&lt;span style=&quot;color:#6a8759;&quot;&gt;=&quot;false&quot;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;            &amp;lt;appender-ref &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;ref&lt;/span&gt;&lt;span style=&quot;color:#6a8759;&quot;&gt;=&quot;console&quot;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;/&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &amp;lt;/Logger&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &amp;lt;Logger &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;color:#6a8759;&quot;&gt;=&quot;com.dev&quot; &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;level&lt;/span&gt;&lt;span style=&quot;color:#6a8759;&quot;&gt;=&quot;TRACE&quot;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;            &amp;lt;appender-ref &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;ref&lt;/span&gt;&lt;span style=&quot;color:#6a8759;&quot;&gt;=&quot;console&quot;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;/&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &amp;lt;/Logger&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;    &amp;lt;/Loggers&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/Configuration&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;ul style=&quot;list-style-type: disc;&quot;&gt;&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;log4j2.xml 파일에서 로거들은 &lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;루트 로거와 com 및 &lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;com.dev 패키지 경로를 기반으로 하는 com.dev 로거 정보들을 설정해 놓았습니다. com은 WARN, com.dev 는 TRACE 레벨입니다.&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;소스 코드&lt;/b&gt;&lt;/p&gt;&lt;pre style=&quot;background-color:#2b2b2b;color:#a9b7c6;font-family:'굴림체';font-size:9.0pt;&quot;&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;package &lt;/span&gt;com&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;import &lt;/span&gt;com.dev.ComDev&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;import &lt;/span&gt;org.slf4j.Logger&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;import &lt;/span&gt;org.slf4j.LoggerFactory&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;public class &lt;/span&gt;Com {&lt;br /&gt;&lt;br /&gt;    &lt;span style=&quot;color:#cc7832;&quot;&gt;private static &lt;/span&gt;Logger &lt;span style=&quot;color:#9876aa;font-style:italic;&quot;&gt;logger &lt;/span&gt;= LoggerFactory.&lt;span style=&quot;font-style:italic;&quot;&gt;getLogger&lt;/span&gt;(Com.&lt;span style=&quot;color:#cc7832;&quot;&gt;class&lt;/span&gt;)&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;    public static void &lt;/span&gt;&lt;span style=&quot;color:#ffc66d;&quot;&gt;main&lt;/span&gt;(String[] args) {&lt;br /&gt;        &lt;span style=&quot;color:#cc7832;&quot;&gt;while&lt;/span&gt;(&lt;span style=&quot;color:#cc7832;&quot;&gt;true&lt;/span&gt;) {&lt;br /&gt;            &lt;span style=&quot;color:#9876aa;font-style:italic;&quot;&gt;logger&lt;/span&gt;.warn(&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;This is [com] main warning &quot;&lt;/span&gt;)&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;            new &lt;/span&gt;ComDev()&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;            &lt;/span&gt;Thread.&lt;span style=&quot;font-style:italic;&quot;&gt;sleep&lt;/span&gt;(&lt;span style=&quot;color:#6897bb;&quot;&gt;3000&lt;/span&gt;)&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;        &lt;/span&gt;}&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;}&lt;/pre&gt;&lt;pre style=&quot;background-color:#2b2b2b;color:#a9b7c6;font-family:'굴림체';font-size:9.0pt;&quot;&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;package &lt;/span&gt;com.dev&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;import &lt;/span&gt;org.slf4j.Logger&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;import &lt;/span&gt;org.slf4j.LoggerFactory&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;public class &lt;/span&gt;ComDev {&lt;br /&gt;&lt;br /&gt;    &lt;span style=&quot;color:#cc7832;&quot;&gt;private static &lt;/span&gt;Logger &lt;span style=&quot;color:#9876aa;font-style:italic;&quot;&gt;logger &lt;/span&gt;= LoggerFactory.&lt;span style=&quot;font-style:italic;&quot;&gt;getLogger&lt;/span&gt;(ComDev.&lt;span style=&quot;color:#cc7832;&quot;&gt;class&lt;/span&gt;)&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;    public &lt;/span&gt;&lt;span style=&quot;color:#ffc66d;&quot;&gt;ComDev&lt;/span&gt;() {&lt;br /&gt;        &lt;span style=&quot;color:#9876aa;font-style:italic;&quot;&gt;logger&lt;/span&gt;.trace(&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;This is [com.dev] trace warning &quot;&lt;/span&gt;)&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;    &lt;/span&gt;}&lt;br /&gt;&lt;br /&gt;}&lt;/pre&gt;&lt;ul style=&quot;list-style-type: disc;&quot;&gt;&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;단순 로그 메세지를 띄우는 코드입니다. 두 코드모두 자신의 로그 레벨에 맞는 로그 메시지를 출력하기 때문에 아래와 같이 콘솔에 출력화면이 뜰 수 있습니다. ( Com 클래스는 WARN, ComDev 클래스는 TRACE )&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;font face=&quot;Arial Black&quot;&gt;main 진입점에서 while 문으로 계속해서 로그 메세지를 출력하는 코드를 작성하였습니다.&lt;/font&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;실행 설정&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-align: center; font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;IntelliJ 기준으로 Run Configuration에서 VM Option을 다음과 같이 줍니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 728px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/9942024C5CEFEC6810&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F9942024C5CEFEC6810&quot; width=&quot;728&quot; height=&quot;458&quot; filename=&quot;캡처_2019_05_30_23_44_32_739.png&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;pre style=&quot;background-color:#2b2b2b;color:#a9b7c6;font-family:'굴림체';font-size:9.0pt;&quot;&gt;-Dcom.sun.management.jmxremote.port=3000 -Dcom.sun.management.jmxremote.authenticate=false&lt;/pre&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;만일 IntelliJ 가 아닌 다른 IDE거나 명령어창으로 실행할 경우 아래와 같이 VM Option을 준 후 실행합니다.&lt;/span&gt;&lt;/p&gt;&lt;pre style=&quot;background-color:#2b2b2b;color:#a9b7c6;font-family:'굴림체';font-size:9.0pt;&quot;&gt;java.exe -Dcom.sun.management.jmxremote.port=3000 -Dcom.sun.management.jmxremote.authenticate=false&lt;/pre&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;위에서 -Dcom.sun.management.jmxremote.port 는 jmx 포트를 설정하는 옵션이고 -Dcom.sun.management.jmxremote.authenticate 옵션은 jmx 접속시 권한이 있는 지를 체크하는 옵션입니다. 지금은 단순 테스트라서 옵션을 꺼놓았습니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;결과 화면&lt;/b&gt;&lt;/p&gt;&lt;pre style=&quot;background-color:#2b2b2b;color:#a9b7c6;font-family:'굴림체';font-size:9.0pt;&quot;&gt;&lt;p&gt;2019-05-30T23:26:17.031 [main] WARN This is [com] main warning&lt;br /&gt;2019-05-30T23:26:17.047 [main] TRACE This is [com.dev] trace warning&lt;br /&gt;2019-05-30T23:26:17.047 [main] TRACE This is [com.dev] trace warning &lt;/p&gt;&lt;p&gt;...&lt;/p&gt;&lt;/pre&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;VisualVM&amp;nbsp;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 728px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/99F7464C5CEFEB9D01&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F99F7464C5CEFEB9D01&quot; width=&quot;728&quot; height=&quot;414&quot; filename=&quot;캡처_2019_05_30_23_41_02_632.png&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;ul style=&quot;list-style-type: disc;&quot;&gt;&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;VisualVM은 보통 JDK를 설치할 때 번들로 제공되며 JDK가 인스톨된 디렉터리의 bin 디렉터리에 있습니다.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;VisualVM을 키면 왼쪽의 Application 탭에 위에서 실행했던 어플리케이션이 Application 탭에 나타난 것을 볼 수 있습니다.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;처음 VisualVM을 실행하게 되면 MBeans를 VisualVM에서 제어할 Plugin이 설치가 안 된 상태입니다. Tools -&amp;gt; Plugins 에서 VisualVM-MBeans Plugin을 설치합니다.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;MBean은 Managed Bean이라하며 표준 스펙에 맞춰 개발된 관리 인터페이스라고 생각하시면 됩니다. 이 인터페이스를&amp;nbsp;통해 JMX 상에서 어플리케이션을 제어할 수 있게 됩니다.&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 728px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/998DF4355CEFEDD007&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F998DF4355CEFEDD007&quot; width=&quot;728&quot; height=&quot;452&quot; filename=&quot;캡처_2019_05_30_23_36_20_463.png&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;ul style=&quot;list-style-type: disc;&quot;&gt;&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;Plugin을 설치하면 아래와 같이 VisualVM에서 MBean을 통해 어플리케이션을 제어하게 됩니다. log4j2는 MBean 스펙을 준수하여 작성되었기 때문에 VisualVM 상에서 log4j2 로깅 시스템의 속성들을 제어할 수 있습니다.&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 728px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/993C62385CEFEEC80F&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F993C62385CEFEEC80F&quot; width=&quot;728&quot; height=&quot;444&quot; filename=&quot;캡처_2019_05_30_23_51_52_377.png&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;ul style=&quot;list-style-type: disc;&quot;&gt;&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;아래와 같이 com 로거의 로그 수준을 ERROR로 낮추게 되면 WARN 메세지를 출력하는 com 로거는 로그 수준이 높기 때문에 메세지가 출력되지 않게 됩니다.&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;pre style=&quot;background-color:#2b2b2b;color:#a9b7c6;font-family:'굴림체';font-size:9.0pt;&quot;&gt;2019-05-30T23:55:21.149 [main] TRACE This is [com.dev] trace warning&lt;br /&gt;2019-05-30T23:55:21.149 [main] TRACE This is [com.dev] trace warning&lt;br /&gt;2019-05-30T23:55:24.149 [main] TRACE This is [com.dev] trace warning&lt;br /&gt;2019-05-30T23:55:24.149 [main] TRACE This is [com.dev] trace warning&lt;br /&gt;2019-05-30T23:55:27.150 [main] TRACE This is [com.dev] trace warning&lt;br /&gt;2019-05-30T23:55:27.150 [main] TRACE This is [com.dev] trace warning&lt;br /&gt;2019-05-30T23:55:30.150 [main] TRACE This is [com.dev] trace warning&lt;br /&gt;2019-05-30T23:55:30.150 [main] TRACE This is [com.dev] trace warning&lt;br /&gt;2019-05-30T23:55:33.155 [main] TRACE This is [com.dev] trace warning&lt;br /&gt;2019-05-30T23:55:33.155 [main] TRACE This is [com.dev] trace warning&lt;br /&gt;2019-05-30T23:55:36.155 [main] TRACE This is [com.dev] trace warning&lt;br /&gt;2019-05-30T23:55:36.155 [main] TRACE This is [com.dev] trace warning&lt;br /&gt;2019-05-30T23:55:39.156 [main] TRACE This is [com.dev] trace warning&lt;br /&gt;2019-05-30T23:55:39.156 [main] TRACE This is [com.dev] trace warning &lt;/pre&gt;&lt;ul style=&quot;list-style-type: disc;&quot;&gt;&lt;li&gt;&lt;font face=&quot;Arial Black&quot;&gt;또한 com.dev 로거의 로그 수준을 DEBUG로 낮추게 되면 TRACE 메세지를 출력하는 com.dev 로거의&amp;nbsp;로그들이&amp;nbsp;출력되지 않습니다.&amp;nbsp;&lt;/font&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;위와 같은 VisualVM의 기능을 이용하여 평소 WARN 레벨 수준의 로그만 관리하는 어플리케이션에서 어떤 특정 TRACE 정보가 궁금할 때 TRACE 레벨로 수준을 높여 DEBUG 및 TRACE 레벨의 로그를 볼 수 있습니다.&lt;/span&gt;&lt;/p&gt;</description>
      <category>Language &amp;amp; Solution/Java</category>
      <category>JVM</category>
      <category>log4j2</category>
      <category>visualvm</category>
      <author>새로비</author>
      <guid isPermaLink="true">https://engkimbs.tistory.com/867</guid>
      <comments>https://engkimbs.tistory.com/entry/VisualVM%EC%9D%84-%EC%9D%B4%EC%9A%A9%ED%95%9C-log4j2-%EB%A1%9C%EA%B7%B8-%EC%88%98%EC%A4%80-%EB%B3%80%EA%B2%BD-%EB%B0%8F-%EB%AA%A8%EB%8B%88%ED%84%B0%EB%A7%81#entry867comment</comments>
      <pubDate>Thu, 30 May 2019 23:40:19 +0900</pubDate>
    </item>
    <item>
      <title>[Spring REST API #9] 스프링 HATEOAS 개념 및 적용</title>
      <link>https://engkimbs.tistory.com/entry/Spring-REST-API-9-%EC%8A%A4%ED%94%84%EB%A7%81-HATEOAS-%EA%B0%9C%EB%85%90-%EB%B0%8F-%EC%A0%81%EC%9A%A9</link>
      <description>&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 18pt; color: rgb(31, 218, 17);&quot;&gt;|&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;font-size: 18.6667px;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 18pt;&quot;&gt;스프링 HATEOAS&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;HATEOAS는 Hypermedia As The Engine Of Application State 의 쟉자로 REST 아키텍처의 한 구성요소입니다. 이 HATEOAS를 통해서 어플리케이션의 상태를 전이할 수 있는 메커니즘을 제공할 수 있습니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;예로 들어, 송금 어플리케이션이 현재&amp;nbsp;Home 화면을 나타내는 상태에 있다고 생각해 봅시다. 이 Home 화면에는 &lt;u&gt;입금, 출금, 송금&amp;nbsp;등 다른 화면 혹은 기능, 리소스로 갈 수 있는 링크들이 존재&lt;/u&gt;할 것입니다. 이 링크를 통해서 다른 페이지로 가는 것을&lt;b&gt; 다른 상태로 전이한다고 보고&lt;/b&gt; 이 링크들에 대한 레퍼런스를 서버 측에서 전송합니다. 그럼으로서&amp;nbsp;클라이언트가 명시적으로 링크를 작성하지 않고도 서버 측에서 받은 링크의 레퍼런스를 통해 어플리케이션의 상태 및 전이를 표현할 수 있습니다. 이것이 바로 올바른 REST 아키텍처에서의 HATEOAS 구성법입니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 479px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/995B66465CEE701236&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F995B66465CEE701236&quot; width=&quot;479&quot; height=&quot;280&quot; filename=&quot;캡처_2019_05_29_20_41_54_68.jpg&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;b&gt;&amp;lt;서버 측에서 보내온 링크 레퍼런스&amp;nbsp;예시&amp;gt;&lt;/b&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;스프링 진영에서는 스프링 HATEOAS라는 프로젝트를 통해 스프링 사용자들에게 HATEOAS 기능을 손쉽게 쓸 수 있도록 제공하고 있습니다. 이 프로젝트의 중요 기능은 HTTP 응답에 들어갈 유저, 게시판 글, 이벤트 등과 같은&amp;nbsp;Resource.&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;&amp;nbsp;다른 상태 혹은 리소스에 접근할 수 있는 링크 레퍼런스인 Links 를 제공하는 것입니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 274px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/99A41B4B5CEE716C18&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F99A41B4B5CEE716C18&quot; width=&quot;274&quot; height=&quot;156&quot; filename=&quot;캡처_2019_05_29_20_47_42_174.png&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;HATEOAS 링크에 들어가는 정보는 위에서 보았듯이 현재 Resource의 관계이자&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;&amp;nbsp;링크의 레퍼런스 정보인 REL 과 하이퍼링크인 HREF 두 정보가&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;&amp;nbsp;들어갑니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;모든 소스 코드는 &lt;/span&gt;&lt;a href=&quot;https://github.com/engkimbs/spring-rest-api&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;&lt;span style=&quot;font-size: 14pt; color: rgb(0, 216, 255);&quot;&gt;여기&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;에서 보실 수 있습니다.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;프로젝트 구조&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;pre style=&quot;background-color:#2b2b2b;color:#a9b7c6;font-family:'굴림체';font-size:9.0pt;&quot;&gt;+---src&lt;br /&gt;|   +---main&lt;br /&gt;|   |   +---java&lt;br /&gt;|   |   |   \---com&lt;br /&gt;|   |   |       \---example&lt;br /&gt;|   |   |           \---springrestapi&lt;br /&gt;|   |   |               |   SpringRestApiApplication.java&lt;br /&gt;|   |   |               |&lt;br /&gt;|   |   |               +---common&lt;br /&gt;|   |   |               |       ErrorsSerializer.java&lt;br /&gt;|   |   |               |       TestDescription.java&lt;br /&gt;|   |   |               |&lt;br /&gt;|   |   |               \---events&lt;br /&gt;|   |   |                       Event.java&lt;br /&gt;|   |   |                       EventController.java&lt;br /&gt;|   |   |                       EventDto.java&lt;br /&gt;|   |   |                       EventRepository.java&lt;br /&gt;|   |   |                       EventResource.java&lt;br /&gt;|   |   |                       EventStatus.java&lt;br /&gt;|   |   |                       EventValidator.java&lt;br /&gt;|   |   |&lt;br /&gt;|   |   \---resources&lt;br /&gt;|   |       |   application.yml&lt;br /&gt;|   |       |&lt;br /&gt;|   |       +---static&lt;br /&gt;|   |       \---templates&lt;br /&gt;|   \---test&lt;br /&gt;|       \---java&lt;br /&gt;|           \---com&lt;br /&gt;|               \---example&lt;br /&gt;|                   \---springrestapi&lt;br /&gt;|                       |   SpringRestApiApplicationTests.java&lt;br /&gt;|                       |&lt;br /&gt;|                       \---events&lt;br /&gt;|                               EventControllerTests.java&lt;br /&gt;|                               EventTest.java&lt;/pre&gt;&lt;p&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;의존성 관리&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;pre style=&quot;background-color:#2b2b2b;color:#a9b7c6;font-family:'굴림체';font-size:9.0pt;&quot;&gt;&lt;p&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;dependencies&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;    &amp;lt;dependency&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &amp;lt;groupId&amp;gt;&lt;/span&gt;org.springframework.boot&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/groupId&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &amp;lt;artifactId&amp;gt;&lt;/span&gt;spring-boot-starter-data-jpa&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/artifactId&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;    &amp;lt;/dependency&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;    &amp;lt;dependency&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &amp;lt;groupId&amp;gt;&lt;/span&gt;org.springframework.boot&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/groupId&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &amp;lt;artifactId&amp;gt;&lt;/span&gt;spring-boot-starter-hateoas&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/artifactId&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;    &amp;lt;/dependency&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;    &amp;lt;dependency&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &amp;lt;groupId&amp;gt;&lt;/span&gt;org.springframework.boot&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/groupId&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &amp;lt;artifactId&amp;gt;&lt;/span&gt;spring-boot-starter-web&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/artifactId&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;    &amp;lt;/dependency&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#808080;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#808080;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;dependency&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &amp;lt;groupId&amp;gt;&lt;/span&gt;org.projectlombok&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/groupId&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &amp;lt;artifactId&amp;gt;&lt;/span&gt;lombok&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/artifactId&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &amp;lt;optional&amp;gt;&lt;/span&gt;true&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/optional&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;    &amp;lt;/dependency&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;    &amp;lt;dependency&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &amp;lt;groupId&amp;gt;&lt;/span&gt;org.modelmapper&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/groupId&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &amp;lt;artifactId&amp;gt;&lt;/span&gt;modelmapper&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/artifactId&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &amp;lt;version&amp;gt;&lt;/span&gt;2.3.1&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/version&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;    &amp;lt;/dependency&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;    &amp;lt;dependency&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &amp;lt;groupId&amp;gt;&lt;/span&gt;org.springframework.boot&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/groupId&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &amp;lt;artifactId&amp;gt;&lt;/span&gt;spring-boot-starter-test&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/artifactId&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &amp;lt;scope&amp;gt;&lt;/span&gt;test&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/scope&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;    &amp;lt;/dependency&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;    &amp;lt;dependency&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &amp;lt;groupId&amp;gt;&lt;/span&gt;com.h2database&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/groupId&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &amp;lt;artifactId&amp;gt;&lt;/span&gt;h2&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/artifactId&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &lt;/span&gt;&lt;span style=&quot;color:#808080;&quot;&gt;&amp;lt;!--            &amp;lt;scope&amp;gt;test&amp;lt;/scope&amp;gt;--&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#808080;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/dependency&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;    &amp;lt;dependency&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &amp;lt;groupId&amp;gt;&lt;/span&gt;org.springframework.restdocs&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/groupId&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &amp;lt;artifactId&amp;gt;&lt;/span&gt;spring-restdocs-mockmvc&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/artifactId&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &amp;lt;scope&amp;gt;&lt;/span&gt;test&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/scope&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;    &amp;lt;/dependency&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;    &amp;lt;dependency&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &amp;lt;groupId&amp;gt;&lt;/span&gt;pl.pragmatists&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/groupId&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &amp;lt;artifactId&amp;gt;&lt;/span&gt;JUnitParams&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/artifactId&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &amp;lt;version&amp;gt;&lt;/span&gt;1.1.1&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/version&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &amp;lt;scope&amp;gt;&lt;/span&gt;test&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/scope&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;    &amp;lt;/dependency&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;    &amp;lt;dependency&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &amp;lt;groupId&amp;gt;&lt;/span&gt;org.springframework.hateoas&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/groupId&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &amp;lt;artifactId&amp;gt;&lt;/span&gt;spring-hateoas&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/artifactId&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &amp;lt;version&amp;gt;&lt;/span&gt;0.25.1.RELEASE&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/version&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;    &amp;lt;/dependency&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/dependencies&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;/pre&gt;&lt;p&gt;&lt;font face=&quot;Arial Black&quot;&gt;위 중&amp;nbsp;&lt;/font&gt;&lt;/p&gt;&lt;pre style=&quot;background-color:#2b2b2b;color:#a9b7c6;font-family:'굴림체';font-size:9.0pt;&quot;&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;dependency&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;    &amp;lt;groupId&amp;gt;&lt;/span&gt;org.springframework.boot&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/groupId&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;    &amp;lt;artifactId&amp;gt;&lt;/span&gt;spring-boot-starter-hateoas&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/artifactId&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/dependency&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;p&gt;&lt;font face=&quot;Arial Black&quot;&gt;을 추가해야 스프링 부트에서&amp;nbsp;HATEOAS 프로젝트를 쉽게 사용할 수 있습니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;테스트&amp;nbsp;코드&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;pre style=&quot;background-color:#2b2b2b;color:#a9b7c6;font-family:'굴림체';font-size:9.0pt;&quot;&gt;&lt;span style=&quot;color:#bbb529;&quot;&gt;@Test&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#bbb529;&quot;&gt;@TestDescription&lt;/span&gt;(&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;정상적으로 이벤트를 입력&quot;&lt;/span&gt;)&lt;br /&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;public void &lt;/span&gt;&lt;span style=&quot;color:#ffc66d;&quot;&gt;createEvent&lt;/span&gt;() &lt;span style=&quot;color:#cc7832;&quot;&gt;throws &lt;/span&gt;Exception {&lt;br /&gt;    EventDto event = EventDto.&lt;span style=&quot;font-style:italic;&quot;&gt;builder&lt;/span&gt;()&lt;br /&gt;            .name(&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;Spring&quot;&lt;/span&gt;)&lt;br /&gt;            .description(&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;REST API Development&quot;&lt;/span&gt;)&lt;br /&gt;            .beginEnrollmentDateTime(LocalDateTime.&lt;span style=&quot;font-style:italic;&quot;&gt;of&lt;/span&gt;(&lt;span style=&quot;color:#6897bb;&quot;&gt;2010&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#6897bb;&quot;&gt;11&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#6897bb;&quot;&gt;23&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#6897bb;&quot;&gt;14&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#6897bb;&quot;&gt;23&lt;/span&gt;))&lt;br /&gt;            .closeEnrollmentDateTime(LocalDateTime.&lt;span style=&quot;font-style:italic;&quot;&gt;of&lt;/span&gt;(&lt;span style=&quot;color:#6897bb;&quot;&gt;2018&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#6897bb;&quot;&gt;11&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#6897bb;&quot;&gt;30&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#6897bb;&quot;&gt;14&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#6897bb;&quot;&gt;23&lt;/span&gt;))&lt;br /&gt;            .beginEventDateTime(LocalDateTime.&lt;span style=&quot;font-style:italic;&quot;&gt;of&lt;/span&gt;(&lt;span style=&quot;color:#6897bb;&quot;&gt;2018&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#6897bb;&quot;&gt;12&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#6897bb;&quot;&gt;5&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#6897bb;&quot;&gt;14&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#6897bb;&quot;&gt;30&lt;/span&gt;))&lt;br /&gt;            .endEventDateTime(LocalDateTime.&lt;span style=&quot;font-style:italic;&quot;&gt;of&lt;/span&gt;(&lt;span style=&quot;color:#6897bb;&quot;&gt;2018&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#6897bb;&quot;&gt;12&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#6897bb;&quot;&gt;6&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#6897bb;&quot;&gt;14&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#6897bb;&quot;&gt;30&lt;/span&gt;))&lt;br /&gt;            .basePrice(&lt;span style=&quot;color:#6897bb;&quot;&gt;100&lt;/span&gt;)&lt;br /&gt;            .maxPrice(&lt;span style=&quot;color:#6897bb;&quot;&gt;200&lt;/span&gt;)&lt;br /&gt;            .limitOfEnrollment(&lt;span style=&quot;color:#6897bb;&quot;&gt;100&lt;/span&gt;)&lt;br /&gt;            .location(&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;D Start up Factory&quot;&lt;/span&gt;)&lt;br /&gt;            .build()&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color:#9876aa;&quot;&gt;mockMvc&lt;/span&gt;.perform(&lt;span style=&quot;font-style:italic;&quot;&gt;post&lt;/span&gt;(&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;/api/events/&quot;&lt;/span&gt;)&lt;br /&gt;                    .contentType(MediaType.&lt;span style=&quot;color:#9876aa;font-style:italic;&quot;&gt;APPLICATION_JSON_UTF8&lt;/span&gt;)&lt;br /&gt;                    .accept(MediaTypes.&lt;span style=&quot;color:#9876aa;font-style:italic;&quot;&gt;HAL_JSON_UTF8&lt;/span&gt;)&lt;br /&gt;                    .content(&lt;span style=&quot;color:#9876aa;&quot;&gt;objectMapper&lt;/span&gt;.writeValueAsString(event)))&lt;br /&gt;                .andDo(&lt;span style=&quot;font-style:italic;&quot;&gt;print&lt;/span&gt;())&lt;br /&gt;                .andExpect(&lt;span style=&quot;font-style:italic;&quot;&gt;status&lt;/span&gt;().isCreated())&lt;br /&gt;                .andExpect(&lt;span style=&quot;font-style:italic;&quot;&gt;jsonPath&lt;/span&gt;(&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;id&quot;&lt;/span&gt;).exists())&lt;br /&gt;                .andExpect(&lt;span style=&quot;font-style:italic;&quot;&gt;header&lt;/span&gt;().exists(HttpHeaders.&lt;span style=&quot;color:#9876aa;font-style:italic;&quot;&gt;LOCATION&lt;/span&gt;))&lt;br /&gt;                .andExpect(&lt;span style=&quot;font-style:italic;&quot;&gt;header&lt;/span&gt;().string(HttpHeaders.&lt;span style=&quot;color:#9876aa;font-style:italic;&quot;&gt;CONTENT_TYPE&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;MediaTypes.&lt;span style=&quot;color:#9876aa;font-style:italic;&quot;&gt;HAL_JSON_UTF8_VALUE&lt;/span&gt;))&lt;br /&gt;                .andExpect(&lt;span style=&quot;font-style:italic;&quot;&gt;jsonPath&lt;/span&gt;(&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;free&quot;&lt;/span&gt;).value(&lt;span style=&quot;color:#cc7832;&quot;&gt;false&lt;/span&gt;))&lt;br /&gt;                .andExpect(&lt;span style=&quot;font-style:italic;&quot;&gt;jsonPath&lt;/span&gt;(&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;offline&quot;&lt;/span&gt;).value(&lt;span style=&quot;color:#cc7832;&quot;&gt;true&lt;/span&gt;))&lt;br /&gt;                .andExpect(&lt;span style=&quot;font-style:italic;&quot;&gt;jsonPath&lt;/span&gt;(&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;eventStatus&quot;&lt;/span&gt;).value(EventStatus.&lt;span style=&quot;color:#9876aa;font-style:italic;&quot;&gt;DRAFT&lt;/span&gt;.name()))&lt;br /&gt;                .andExpect(&lt;span style=&quot;font-style:italic;&quot;&gt;jsonPath&lt;/span&gt;(&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;_links.self&quot;&lt;/span&gt;).exists())&lt;br /&gt;                .andExpect(&lt;span style=&quot;font-style:italic;&quot;&gt;jsonPath&lt;/span&gt;(&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;_links.query-events&quot;&lt;/span&gt;).exists())&lt;br /&gt;                .andExpect(&lt;span style=&quot;font-style:italic;&quot;&gt;jsonPath&lt;/span&gt;(&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;_links.update-events&quot;&lt;/span&gt;).exists())&lt;br /&gt;    &lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;}&lt;/pre&gt;&lt;ul style=&quot;list-style-type: disc;&quot;&gt;&lt;li&gt;&lt;font face=&quot;Arial Black&quot;&gt;HTTP 응답 Body에 _links 프로퍼티가 포함된 HATEOAS 정보를 받는 것을 체크하는 테스트 코드입니다. _links 에는 리소스 자기 자신을 나타내는 self, events들을 질의할 수 있는 query-events, 그리고 이벤트들을 업데이트 할 수 있는 update-events 링크를 포함할 것입니다.&lt;/font&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;소스 코드&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;pre style=&quot;background-color:#2b2b2b;color:#a9b7c6;font-family:'굴림체';font-size:9.0pt;&quot;&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;import &lt;/span&gt;org.springframework.hateoas.Link&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;import &lt;/span&gt;org.springframework.hateoas.Resource&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;import static &lt;/span&gt;org.springframework.hateoas.mvc.ControllerLinkBuilder.&lt;span style=&quot;font-style:italic;&quot;&gt;linkTo&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;public class &lt;/span&gt;EventResource &lt;span style=&quot;color:#cc7832;&quot;&gt;extends &lt;/span&gt;Resource&amp;lt;Event&amp;gt; {&lt;br /&gt;&lt;br /&gt;    &lt;span style=&quot;color:#cc7832;&quot;&gt;public &lt;/span&gt;&lt;span style=&quot;color:#ffc66d;&quot;&gt;EventResource&lt;/span&gt;(Event event&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;Link... links) {&lt;br /&gt;        &lt;span style=&quot;color:#cc7832;&quot;&gt;super&lt;/span&gt;(event&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;links)&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;        &lt;/span&gt;add(&lt;span style=&quot;font-style:italic;&quot;&gt;linkTo&lt;/span&gt;(EventController.&lt;span style=&quot;color:#cc7832;&quot;&gt;class&lt;/span&gt;).slash(event.getId()).withSelfRel())&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;    &lt;/span&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;ul style=&quot;list-style-type: disc;&quot;&gt;&lt;li&gt;&lt;font face=&quot;Arial Black&quot;&gt;스프링 프로젝트에서 HATEOAS 기능을 제공하는 Resource 클래스를 상속받아 위와 같이 Event 클래스의 Resource인 EventResource&amp;nbsp;클래스를 작성합니다. 위 코드를 보면 생성자에서&amp;nbsp;EventController.class에 매핑되어 있는 URL정보 및 Event 객체 자기 자신을 나타내는 self를 더해&amp;nbsp;EventResource가 생성되는 것을 알 수 있습니다.&lt;/font&gt;&lt;/li&gt;&lt;li&gt;&lt;font face=&quot;Arial Black&quot;&gt;Resource 클래스를 상속받아 쓰는 이유는 Resource 클래스의 필드에 @JsonUnwrapped 어노테이션이 붙어 있어 Event와 같은 여러 프로퍼티가 있는 클래스를 event : {} 같은 감싼 형태가 아닌&amp;nbsp;아닌 프로퍼티들 그대로 데이터를 추출하여 직렬화 하기 때문입니다.&lt;br /&gt;&lt;/font&gt;&lt;/li&gt;&lt;/ul&gt;&lt;pre style=&quot;background-color:#2b2b2b;color:#a9b7c6;font-family:'굴림체';font-size:9.0pt;&quot;&gt;&lt;p&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;import &lt;/span&gt;org.modelmapper.ModelMapper&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;import &lt;/span&gt;org.springframework.beans.factory.annotation.&lt;span style=&quot;color:#bbb529;&quot;&gt;Autowired&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;import &lt;/span&gt;org.springframework.hateoas.MediaTypes&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;import &lt;/span&gt;org.springframework.hateoas.mvc.ControllerLinkBuilder&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;import &lt;/span&gt;org.springframework.http.ResponseEntity&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;import &lt;/span&gt;org.springframework.stereotype.&lt;span style=&quot;color:#bbb529;&quot;&gt;Controller&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;import &lt;/span&gt;org.springframework.validation.Errors&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;import &lt;/span&gt;org.springframework.web.bind.annotation.&lt;span style=&quot;color:#bbb529;&quot;&gt;PostMapping&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;import &lt;/span&gt;org.springframework.web.bind.annotation.&lt;span style=&quot;color:#bbb529;&quot;&gt;RequestBody&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;import &lt;/span&gt;org.springframework.web.bind.annotation.&lt;span style=&quot;color:#bbb529;&quot;&gt;RequestMapping&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;import &lt;/span&gt;javax.validation.&lt;span style=&quot;color:#bbb529;&quot;&gt;Valid&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;import &lt;/span&gt;java.net.URI&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;import static &lt;/span&gt;org.springframework.hateoas.mvc.ControllerLinkBuilder.&lt;span style=&quot;font-style:italic;&quot;&gt;linkTo&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#bbb529;&quot;&gt;@Controller&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#bbb529;&quot;&gt;@RequestMapping&lt;/span&gt;(&lt;span style=&quot;color:#d0d0ff;&quot;&gt;value &lt;/span&gt;= &lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;/api/events&quot;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#d0d0ff;&quot;&gt;produces &lt;/span&gt;= MediaTypes.&lt;span style=&quot;color:#9876aa;font-style:italic;&quot;&gt;HAL_JSON_UTF8_VALUE&lt;/span&gt;)&lt;br /&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;public class &lt;/span&gt;EventController {&lt;br /&gt;&lt;br /&gt;    &lt;span style=&quot;color:#bbb529;&quot;&gt;@Autowired&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#bbb529;&quot;&gt;    &lt;/span&gt;EventRepository &lt;span style=&quot;color:#9876aa;&quot;&gt;eventRepository&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color:#bbb529;&quot;&gt;@Autowired&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#bbb529;&quot;&gt;    &lt;/span&gt;ModelMapper &lt;span style=&quot;color:#9876aa;&quot;&gt;modelMapper&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color:#bbb529;&quot;&gt;@Autowired&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#bbb529;&quot;&gt;    &lt;/span&gt;EventValidator &lt;span style=&quot;color:#9876aa;&quot;&gt;eventValidator&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color:#bbb529;&quot;&gt;@PostMapping&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#bbb529;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;public &lt;/span&gt;ResponseEntity &lt;span style=&quot;color:#ffc66d;&quot;&gt;createEvent&lt;/span&gt;(&lt;span style=&quot;color:#bbb529;&quot;&gt;@RequestBody @Valid &lt;/span&gt;EventDto eventDto&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;Errors errors) {&lt;br /&gt;        &lt;span style=&quot;color:#cc7832;&quot;&gt;if&lt;/span&gt;(errors.hasErrors()) {&lt;br /&gt;            &lt;span style=&quot;color:#cc7832;&quot;&gt;return &lt;/span&gt;ResponseEntity.&lt;span style=&quot;font-style:italic;&quot;&gt;badRequest&lt;/span&gt;().body(errors)&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;        &lt;/span&gt;}&lt;br /&gt;&lt;br /&gt;        &lt;span style=&quot;color:#9876aa;&quot;&gt;eventValidator&lt;/span&gt;.validate(eventDto&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;errors)&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;        if&lt;/span&gt;(errors.hasErrors()) {&lt;br /&gt;            &lt;span style=&quot;color:#cc7832;&quot;&gt;return &lt;/span&gt;ResponseEntity.&lt;span style=&quot;font-style:italic;&quot;&gt;badRequest&lt;/span&gt;().body(errors)&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;        &lt;/span&gt;}&lt;br /&gt;&lt;br /&gt;        Event event = &lt;span style=&quot;color:#9876aa;&quot;&gt;modelMapper&lt;/span&gt;.map(eventDto&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;Event.&lt;span style=&quot;color:#cc7832;&quot;&gt;class&lt;/span&gt;)&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;        &lt;/span&gt;event.update()&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;        &lt;/span&gt;Event newEvent = &lt;span style=&quot;color:#cc7832;&quot;&gt;this&lt;/span&gt;.&lt;span style=&quot;color:#9876aa;&quot;&gt;eventRepository&lt;/span&gt;.save(event)&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// HATEOAS link added&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;        &lt;/span&gt;ControllerLinkBuilder selfLinkBuilder = &lt;span style=&quot;font-style:italic;&quot;&gt;linkTo&lt;/span&gt;(EventController.&lt;span style=&quot;color:#cc7832;&quot;&gt;class&lt;/span&gt;).slash(newEvent.getId())&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;        &lt;/span&gt;URI createdURI = selfLinkBuilder.toUri()&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;        &lt;/span&gt;EventResource eventResource = &lt;span style=&quot;color:#cc7832;&quot;&gt;new &lt;/span&gt;EventResource(newEvent)&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;        &lt;/span&gt;eventResource.add(&lt;span style=&quot;font-style:italic;&quot;&gt;linkTo&lt;/span&gt;(EventController.&lt;span style=&quot;color:#cc7832;&quot;&gt;class&lt;/span&gt;).withRel(&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;query-events&quot;&lt;/span&gt;))&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;        &lt;/span&gt;eventResource.add(&lt;span style=&quot;font-style:italic;&quot;&gt;linkTo&lt;/span&gt;(EventController.&lt;span style=&quot;color:#cc7832;&quot;&gt;class&lt;/span&gt;).withRel(&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;update-events&quot;&lt;/span&gt;))&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;        return &lt;/span&gt;ResponseEntity.&lt;span style=&quot;font-style:italic;&quot;&gt;created&lt;/span&gt;(createdURI).body(eventResource)&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;    &lt;/span&gt;}&lt;br /&gt;&lt;br /&gt;}&lt;/p&gt;&lt;/pre&gt;&lt;ul style=&quot;list-style-type: disc;&quot;&gt;&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;위 컨트롤러 코드를 보면 ControllerLinkBuilder를 통해 컨트롤러와 매핑된 URL + 이벤트 ID로 selfLinkBuilder 객체를 만듭니다. 이때 링크되는 URL은 http://localhost:8080/api/events/{id} 와 같습니다.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;Event를 EventResource 생성자의 인자로 넣어 손쉽게 EventResource 객체를 생성해 HTTP 응답 메세지에 담을 수 있습니다.&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;결과 화면&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;요청&lt;/b&gt;&lt;/p&gt;&lt;pre style=&quot;background-color:#2b2b2b;color:#a9b7c6;font-family:'굴림체';font-size:9.0pt;&quot;&gt;MockHttpServletRequest:&lt;br /&gt;HTTP Method = POST&lt;br /&gt;Request URI = /api/events/&lt;br /&gt;Parameters = {}&lt;br /&gt;Headers = [Content-Type:&quot;application/json;charset=UTF-8&quot;, Accept:&quot;application/hal+json;charset=UTF-8&quot;]&lt;br /&gt;Body = {&quot;name&quot;:&quot;Spring&quot;,&quot;description&quot;:&quot;REST API Development&quot;,&quot;beginEnrollmentDateTime&quot;:&quot;2010-11-23T14:23:00&quot;,&quot;closeEnrollmentDateTime&quot;:&quot;2018-11-30T14:23:00&quot;,&quot;beginEventDateTime&quot;:&quot;2018-12-05T14:30:00&quot;,&quot;endEventDateTime&quot;:&quot;2018-12-06T14:30:00&quot;,&quot;location&quot;:&quot;D Start up Factory&quot;,&quot;basePrice&quot;:100,&quot;maxPrice&quot;:200,&quot;limitOfEnrollment&quot;:100}&lt;br /&gt;Session Attrs = {}&lt;/pre&gt;&lt;p&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;응답&lt;/b&gt;&lt;/p&gt;&lt;pre style=&quot;background-color:#2b2b2b;color:#a9b7c6;font-family:'굴림체';font-size:9.0pt;&quot;&gt;MockHttpServletResponse:&lt;br /&gt;Status = 201&lt;br /&gt;Error message = null&lt;br /&gt;Headers = [Location:&quot;http://localhost/api/events/1&quot;, Content-Type:&quot;application/hal+json;charset=UTF-8&quot;]&lt;br /&gt;Content type = application/hal+json;charset=UTF-8&lt;br /&gt;Body = {&quot;id&quot;:1,&quot;name&quot;:&quot;Spring&quot;,&quot;description&quot;:&quot;REST API Development&quot;,&quot;beginEnrollmentDateTime&quot;:&quot;2010-11-23T14:23:00&quot;,&quot;closeEnrollmentDateTime&quot;:&quot;2018-11-30T14:23:00&quot;,&quot;beginEventDateTime&quot;:&quot;2018-12-05T14:30:00&quot;,&quot;endEventDateTime&quot;:&quot;2018-12-06T14:30:00&quot;,&quot;location&quot;:&quot;D Start up Factory&quot;,&quot;basePrice&quot;:100,&quot;maxPrice&quot;:200,&quot;limitOfEnrollment&quot;:100,&quot;offline&quot;:true,&quot;free&quot;:false,&quot;eventStatus&quot;:&quot;DRAFT&quot;,&quot;_links&quot;:{&quot;self&quot;:{&quot;href&quot;:&quot;http://localhost/api/events/1&quot;},&quot;query-events&quot;:{&quot;href&quot;:&quot;http://localhost/api/events&quot;},&quot;update-events&quot;:{&quot;href&quot;:&quot;http://localhost/api/events&quot;}}}&lt;br /&gt;Forwarded URL = null&lt;br /&gt;Redirected URL = http://localhost/api/events/1&lt;br /&gt;Cookies = []&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;Body 부분&lt;/b&gt;&lt;/p&gt;&lt;pre style=&quot;background-color:#2b2b2b;color:#a9b7c6;font-family:'굴림체';font-size:9.0pt;&quot;&gt;{&lt;br /&gt;  &lt;span style=&quot;color:#9876aa;&quot;&gt;&quot;id&quot;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#6897bb;&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;,&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;  &lt;/span&gt;&lt;span style=&quot;color:#9876aa;&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;Spring&quot;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;,&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;  &lt;/span&gt;&lt;span style=&quot;color:#9876aa;&quot;&gt;&quot;description&quot;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;REST API Development&quot;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;,&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;  &lt;/span&gt;&lt;span style=&quot;color:#9876aa;&quot;&gt;&quot;beginEnrollmentDateTime&quot;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;2010-11-23T14:23:00&quot;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;,&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;  &lt;/span&gt;&lt;span style=&quot;color:#9876aa;&quot;&gt;&quot;closeEnrollmentDateTime&quot;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;2018-11-30T14:23:00&quot;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;,&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;  &lt;/span&gt;&lt;span style=&quot;color:#9876aa;&quot;&gt;&quot;beginEventDateTime&quot;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;2018-12-05T14:30:00&quot;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;,&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;  &lt;/span&gt;&lt;span style=&quot;color:#9876aa;&quot;&gt;&quot;endEventDateTime&quot;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;2018-12-06T14:30:00&quot;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;,&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;  &lt;/span&gt;&lt;span style=&quot;color:#9876aa;&quot;&gt;&quot;location&quot;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;D Start up Factory&quot;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;,&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;  &lt;/span&gt;&lt;span style=&quot;color:#9876aa;&quot;&gt;&quot;basePrice&quot;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#6897bb;&quot;&gt;100&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;,&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;  &lt;/span&gt;&lt;span style=&quot;color:#9876aa;&quot;&gt;&quot;maxPrice&quot;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#6897bb;&quot;&gt;200&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;,&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;  &lt;/span&gt;&lt;span style=&quot;color:#9876aa;&quot;&gt;&quot;limitOfEnrollment&quot;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#6897bb;&quot;&gt;100&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;,&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;  &lt;/span&gt;&lt;span style=&quot;color:#9876aa;&quot;&gt;&quot;offline&quot;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;:true,&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;  &lt;/span&gt;&lt;span style=&quot;color:#9876aa;&quot;&gt;&quot;free&quot;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;:false,&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;  &lt;/span&gt;&lt;span style=&quot;color:#9876aa;&quot;&gt;&quot;eventStatus&quot;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;DRAFT&quot;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;,&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;  &lt;/span&gt;&lt;span style=&quot;color:#9876aa;&quot;&gt;&quot;_links&quot;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;:&lt;/span&gt;{&lt;br /&gt;    &lt;span style=&quot;color:#9876aa;&quot;&gt;&quot;self&quot;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;:&lt;/span&gt;{&lt;br /&gt;      &lt;span style=&quot;color:#9876aa;&quot;&gt;&quot;href&quot;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;http://localhost/api/events/1&quot;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#6a8759;&quot;&gt;    &lt;/span&gt;}&lt;span style=&quot;color:#cc7832;&quot;&gt;,&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color:#9876aa;&quot;&gt;&quot;query-events&quot;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;:&lt;/span&gt;{&lt;br /&gt;      &lt;span style=&quot;color:#9876aa;&quot;&gt;&quot;href&quot;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;http://localhost/api/events&quot;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#6a8759;&quot;&gt;    &lt;/span&gt;}&lt;span style=&quot;color:#cc7832;&quot;&gt;,&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color:#9876aa;&quot;&gt;&quot;update-events&quot;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;:&lt;/span&gt;{&lt;br /&gt;      &lt;span style=&quot;color:#9876aa;&quot;&gt;&quot;href&quot;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;http://localhost/api/events&quot;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#6a8759;&quot;&gt;    &lt;/span&gt;}&lt;br /&gt;  }&lt;br /&gt;}&lt;/pre&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;참조:&amp;nbsp;&lt;a href=&quot;https://www.inflearn.com/course/spring_rest-api/#&quot;&gt;https://www.inflearn.com/course/spring_rest-api/#&lt;/a&gt;&lt;/p&gt;&lt;p style=&quot;margin-left: 2em;&quot;&gt;&amp;nbsp;&lt;a href=&quot;https://en.wikipedia.org/wiki/HATEOAS&quot;&gt;https://en.wikipedia.org/wiki/HATEOAS&lt;/a&gt;&lt;/p&gt;&lt;p&gt;소스 코드 :&amp;nbsp;&lt;a href=&quot;https://github.com/engkimbs/spring-rest-api&quot;&gt;https://github.com/engkimbs/spring-rest-api&lt;/a&gt;&lt;/p&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;</description>
      <category>Spring/Spring Rest API</category>
      <category>HATEOAS</category>
      <category>Spring REST API</category>
      <author>새로비</author>
      <guid isPermaLink="true">https://engkimbs.tistory.com/866</guid>
      <comments>https://engkimbs.tistory.com/entry/Spring-REST-API-9-%EC%8A%A4%ED%94%84%EB%A7%81-HATEOAS-%EA%B0%9C%EB%85%90-%EB%B0%8F-%EC%A0%81%EC%9A%A9#entry866comment</comments>
      <pubDate>Wed, 29 May 2019 20:52:26 +0900</pubDate>
    </item>
    <item>
      <title>[Spring REST API #8] Spring REST API 비즈니스 로직 적용 및 JUnitParam을 이용한 테스트</title>
      <link>https://engkimbs.tistory.com/entry/Spring-REST-API-8-Spring-REST-API-%EB%B9%84%EC%A6%88%EB%8B%88%EC%8A%A4-%EB%A1%9C%EC%A7%81-%EC%A0%81%EC%9A%A9-%EB%B0%8F-JUnitParam%EC%9D%84-%EC%9D%B4%EC%9A%A9%ED%95%9C-%ED%85%8C%EC%8A%A4%ED%8A%B8</link>
      <description>&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 18pt; color: rgb(31, 218, 17);&quot;&gt;|&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;font-size: 18.6667px;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 18pt;&quot;&gt;Spring REST API 비즈니스 로직 적용 및&amp;nbsp;&amp;nbsp;JUnitParam을 이용한 테스트&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;JUnitParam 테스트 라이브러리는 JUnit의 각 Test 메서드에 파라미터를 쓸 수 있게 함으로써 테스트 코드량을 줄이고 유지보수를 쉽게 해주는 유용한 라이브러리입니다. 이 JUnitParam 라이브러리를 이용하여 아래와 같은 비즈니스 로직을 적용한 코드를 작성하도록 하겠습니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;ul style=&quot;list-style-type: disc;&quot;&gt;&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;basePrice 와 maxPrice가 모두 0이면 free = true 그 이외에는 free = false&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;location이 null 이거나 문자열의 길이가 0일 때 offline = false 그 외에는 offline =&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;&amp;nbsp;true&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;모든 소스 코드는 &lt;/span&gt;&lt;a href=&quot;https://github.com/engkimbs/spring-rest-api&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;&lt;span style=&quot;font-size: 14pt; color: rgb(0, 216, 255);&quot;&gt;여기&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;에서 보실 수 있습니다.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;프로젝트 구조&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;pre style=&quot;background-color:#2b2b2b;color:#a9b7c6;font-family:'굴림체';font-size:9.0pt;&quot;&gt;+---src&lt;br /&gt;|   +---main&lt;br /&gt;|   |   +---java&lt;br /&gt;|   |   |   \---com&lt;br /&gt;|   |   |       \---example&lt;br /&gt;|   |   |           \---springrestapi&lt;br /&gt;|   |   |               |   SpringRestApiApplication.java&lt;br /&gt;|   |   |               |&lt;br /&gt;|   |   |               +---common&lt;br /&gt;|   |   |               |       ErrorsSerializer.java&lt;br /&gt;|   |   |               |       TestDescription.java&lt;br /&gt;|   |   |               |&lt;br /&gt;|   |   |               \---events&lt;br /&gt;|   |   |                       Event.java&lt;br /&gt;|   |   |                       EventController.java&lt;br /&gt;|   |   |                       EventDto.java&lt;br /&gt;|   |   |                       EventRepository.java&lt;br /&gt;|   |   |                       EventStatus.java&lt;br /&gt;|   |   |                       EventValidator.java&lt;br /&gt;|   |   |&lt;br /&gt;|   |   \---resources&lt;br /&gt;|   |       |   application.yml&lt;br /&gt;|   |       |&lt;br /&gt;|   |       +---static&lt;br /&gt;|   |       \---templates&lt;/pre&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;의존성 관리&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;pre style=&quot;background-color:#2b2b2b;color:#a9b7c6;font-family:'굴림체';font-size:9.0pt;&quot;&gt;&lt;p&gt;    &lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;dependencies&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;...&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &amp;lt;dependency&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;            &amp;lt;groupId&amp;gt;&lt;/span&gt;pl.pragmatists&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/groupId&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;            &amp;lt;artifactId&amp;gt;&lt;/span&gt;JUnitParams&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/artifactId&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;            &amp;lt;version&amp;gt;&lt;/span&gt;1.1.1&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/version&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;            &amp;lt;scope&amp;gt;&lt;/span&gt;test&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/scope&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &amp;lt;/dependency&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;    &amp;lt;/dependencies&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;/pre&gt;&lt;ul style=&quot;list-style-type: disc;&quot;&gt;&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;JUnitParam을 사용하기 위해서는 위와 같이 의존성을 추가해야 합니다.&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;테스트&amp;nbsp;코드&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;pre style=&quot;background-color:#2b2b2b;color:#a9b7c6;font-family:'굴림체';font-size:9.0pt;&quot;&gt;&lt;p&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;package &lt;/span&gt;com.example.springrestapi.events&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;import &lt;/span&gt;junitparams.JUnitParamsRunner&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;import &lt;/span&gt;junitparams.&lt;span style=&quot;color:#bbb529;&quot;&gt;Parameters&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;import &lt;/span&gt;org.junit.&lt;span style=&quot;color:#bbb529;&quot;&gt;Test&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;import &lt;/span&gt;org.junit.runner.&lt;span style=&quot;color:#bbb529;&quot;&gt;RunWith&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;import static &lt;/span&gt;org.assertj.core.api.Assertions.&lt;span style=&quot;font-style:italic;&quot;&gt;assertThat&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#bbb529;&quot;&gt;@RunWith&lt;/span&gt;(JUnitParamsRunner.&lt;span style=&quot;color:#cc7832;&quot;&gt;class&lt;/span&gt;)&lt;br /&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;public class &lt;/span&gt;EventTest {&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// ...&lt;br /&gt;&lt;br /&gt;    &lt;span style=&quot;color:#bbb529;&quot;&gt;@Test&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#bbb529;&quot;&gt;    @Parameters&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#bbb529;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color:#808080;&quot;&gt;//@Parameters(method = &quot;parametersForTestFree&quot;)  // You can reference a parameter method directly like leftward&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#808080;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;public void &lt;/span&gt;&lt;span style=&quot;color:#ffc66d;&quot;&gt;testFree&lt;/span&gt;(&lt;span style=&quot;color:#cc7832;&quot;&gt;int &lt;/span&gt;basePrice&lt;span style=&quot;color:#cc7832;&quot;&gt;, int &lt;/span&gt;maxPrice&lt;span style=&quot;color:#cc7832;&quot;&gt;, boolean &lt;/span&gt;isFree) {&lt;br /&gt;        &lt;span style=&quot;color:#808080;&quot;&gt;// Given&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#808080;&quot;&gt;        &lt;/span&gt;Event event = Event.&lt;span style=&quot;font-style:italic;&quot;&gt;builder&lt;/span&gt;().&lt;br /&gt;                basePrice(basePrice)&lt;br /&gt;                .maxPrice(maxPrice)&lt;br /&gt;                .build()&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;        &lt;/span&gt;&lt;span style=&quot;color:#808080;&quot;&gt;// When&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#808080;&quot;&gt;        &lt;/span&gt;event.update()&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;        &lt;/span&gt;&lt;span style=&quot;color:#808080;&quot;&gt;// Then&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#808080;&quot;&gt;        &lt;/span&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;assertThat&lt;/span&gt;(event.isFree()).isEqualTo(isFree)&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;    &lt;/span&gt;}&lt;br /&gt;&lt;br /&gt;    &lt;span style=&quot;color:#cc7832;&quot;&gt;private &lt;/span&gt;Object[] &lt;span style=&quot;color:#ffc66d;&quot;&gt;parametersForTestFree&lt;/span&gt;() {&lt;br /&gt;        &lt;span style=&quot;color:#cc7832;&quot;&gt;return new &lt;/span&gt;Object[] {&lt;br /&gt;            &lt;span style=&quot;color:#cc7832;&quot;&gt;new &lt;/span&gt;Object[] {&lt;span style=&quot;color:#6897bb;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#6897bb;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;, true&lt;/span&gt;}&lt;span style=&quot;color:#cc7832;&quot;&gt;,&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;            new &lt;/span&gt;Object[] {&lt;span style=&quot;color:#6897bb;&quot;&gt;100&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#6897bb;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;, false&lt;/span&gt;}&lt;span style=&quot;color:#cc7832;&quot;&gt;,&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;            new &lt;/span&gt;Object[] {&lt;span style=&quot;color:#6897bb;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#6897bb;&quot;&gt;100&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;, false&lt;/span&gt;}&lt;span style=&quot;color:#cc7832;&quot;&gt;,&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;        &lt;/span&gt;}&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;    &lt;/span&gt;}&lt;br /&gt;&lt;br /&gt;    &lt;span style=&quot;color:#bbb529;&quot;&gt;@Test&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#bbb529;&quot;&gt;    @Parameters&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#bbb529;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;public void &lt;/span&gt;&lt;span style=&quot;color:#ffc66d;&quot;&gt;testOffline&lt;/span&gt;(String location&lt;span style=&quot;color:#cc7832;&quot;&gt;, boolean &lt;/span&gt;isOffline) {&lt;br /&gt;        &lt;span style=&quot;color:#808080;&quot;&gt;// Given&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#808080;&quot;&gt;        &lt;/span&gt;Event event = Event.&lt;span style=&quot;font-style:italic;&quot;&gt;builder&lt;/span&gt;()&lt;br /&gt;                .location(&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;StartUp Factory&quot;&lt;/span&gt;)&lt;br /&gt;                .build()&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;        &lt;/span&gt;&lt;span style=&quot;color:#808080;&quot;&gt;// When&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#808080;&quot;&gt;        &lt;/span&gt;event.update()&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;        &lt;/span&gt;&lt;span style=&quot;color:#808080;&quot;&gt;// Then&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#808080;&quot;&gt;        &lt;/span&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;assertThat&lt;/span&gt;(event.isOffline()).isTrue()&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;    &lt;/span&gt;}&lt;br /&gt;&lt;br /&gt;    &lt;span style=&quot;color:#cc7832;&quot;&gt;private &lt;/span&gt;Object[] &lt;span style=&quot;color:#ffc66d;&quot;&gt;parametersForTestOffline&lt;/span&gt;() {&lt;br /&gt;        &lt;span style=&quot;color:#cc7832;&quot;&gt;return new &lt;/span&gt;Object[] {&lt;br /&gt;                &lt;span style=&quot;color:#cc7832;&quot;&gt;new &lt;/span&gt;Object[] {&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;강남&quot;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;, true&lt;/span&gt;}&lt;span style=&quot;color:#cc7832;&quot;&gt;,&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;                new &lt;/span&gt;Object[] {&lt;span style=&quot;color:#cc7832;&quot;&gt;null, false&lt;/span&gt;}&lt;span style=&quot;color:#cc7832;&quot;&gt;,&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;                new &lt;/span&gt;Object[] {&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;   &quot;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;, false&lt;/span&gt;}&lt;span style=&quot;color:#cc7832;&quot;&gt;,&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;        &lt;/span&gt;}&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;    &lt;/span&gt;}&lt;br /&gt;}&lt;/p&gt;&lt;/pre&gt;&lt;ul style=&quot;list-style-type: disc;&quot;&gt;&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;JUnitParams를 적용하여 테스트 코드를 작성한 것을 볼 수 있습니다. @Parameters 어노테이션을 각 테스트에 명시하면 파리미터화 된 입력값을 쓸 수 있습니다.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;파라미터화된 입력값은 위 코드와 같이 코드 상에 명시해야 하며 parametersFor + [테스트명&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;] 으로 작성하면 자동적으로 [테스트명&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;]으로 작성된 테스트 메서드에 해당 입력값이 매칭되게 됩니다. 또한 @Parameters(method=&quot;[테스트명]&quot;&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;) 형태로 직정 지정해서 쓸 수 있습니다.&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;소스 코드&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;pre style=&quot;background-color:#2b2b2b;color:#a9b7c6;font-family:'굴림체';font-size:9.0pt;&quot;&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;package &lt;/span&gt;com.example.springrestapi.events&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;import &lt;/span&gt;lombok.*&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;import &lt;/span&gt;javax.persistence.*&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;import &lt;/span&gt;java.time.LocalDateTime&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#629755;font-style:italic;&quot;&gt;/**&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#629755;font-style:italic;&quot;&gt; * In case of referencing between entities, using default @EqualsAndHashCode stack overflow.&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#629755;font-style:italic;&quot;&gt; * Therefore, redefine the way of checking equality is the best practice as below.&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#629755;font-style:italic;&quot;&gt; * Also, you shouldn't use @Data annotation because it uses default @EqualsAndHashCode&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#629755;font-style:italic;&quot;&gt; */&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#bbb529;&quot;&gt;@Entity&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#bbb529;&quot;&gt;@Builder&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#bbb529;&quot;&gt;@AllArgsConstructor&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#bbb529;&quot;&gt;@NoArgsConstructor&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#bbb529;&quot;&gt;@Getter&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#bbb529;&quot;&gt;@Setter&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#bbb529;&quot;&gt;@EqualsAndHashCode&lt;/span&gt;(&lt;span style=&quot;color:#d0d0ff;&quot;&gt;of &lt;/span&gt;= &lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;id&quot;&lt;/span&gt;)&lt;br /&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;public class &lt;/span&gt;Event {&lt;br /&gt;&lt;br /&gt;    &lt;span style=&quot;color:#bbb529;&quot;&gt;@Id @GeneratedValue&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#bbb529;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;private &lt;/span&gt;Integer &lt;span style=&quot;color:#9876aa;&quot;&gt;id&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;    private &lt;/span&gt;String &lt;span style=&quot;color:#9876aa;&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;    private &lt;/span&gt;String &lt;span style=&quot;color:#9876aa;&quot;&gt;description&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;    private &lt;/span&gt;LocalDateTime &lt;span style=&quot;color:#9876aa;&quot;&gt;beginEnrollmentDateTime&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;    private &lt;/span&gt;LocalDateTime &lt;span style=&quot;color:#9876aa;&quot;&gt;closeEnrollmentDateTime&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;    private &lt;/span&gt;LocalDateTime &lt;span style=&quot;color:#9876aa;&quot;&gt;beginEventDateTime&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;    private &lt;/span&gt;LocalDateTime &lt;span style=&quot;color:#9876aa;&quot;&gt;endEventDateTime&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;    private &lt;/span&gt;String &lt;span style=&quot;color:#9876aa;&quot;&gt;location&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color:#808080;&quot;&gt;// (optional)&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#808080;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;private int &lt;/span&gt;&lt;span style=&quot;color:#9876aa;&quot;&gt;basePrice&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color:#808080;&quot;&gt;// (optional)&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#808080;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;private int &lt;/span&gt;&lt;span style=&quot;color:#9876aa;&quot;&gt;maxPrice&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;  &lt;/span&gt;&lt;span style=&quot;color:#808080;&quot;&gt;// (optional)&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#808080;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;private int &lt;/span&gt;&lt;span style=&quot;color:#9876aa;&quot;&gt;limitOfEnrollment&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;    private boolean &lt;/span&gt;&lt;span style=&quot;color:#9876aa;&quot;&gt;offline&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;    private boolean &lt;/span&gt;&lt;span style=&quot;color:#9876aa;&quot;&gt;free&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color:#bbb529;&quot;&gt;@Enumerated&lt;/span&gt;(EnumType.&lt;span style=&quot;color:#9876aa;font-style:italic;&quot;&gt;STRING&lt;/span&gt;)&lt;br /&gt;    &lt;span style=&quot;color:#cc7832;&quot;&gt;private &lt;/span&gt;EventStatus &lt;span style=&quot;color:#9876aa;&quot;&gt;eventStatus &lt;/span&gt;= EventStatus.&lt;span style=&quot;color:#9876aa;font-style:italic;&quot;&gt;DRAFT&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;    public void &lt;/span&gt;&lt;span style=&quot;color:#ffc66d;&quot;&gt;update&lt;/span&gt;() {&lt;br /&gt;        &lt;span style=&quot;color:#808080;&quot;&gt;// Update free&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#808080;&quot;&gt;        &lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;if&lt;/span&gt;(&lt;span style=&quot;color:#cc7832;&quot;&gt;this&lt;/span&gt;.&lt;span style=&quot;color:#9876aa;&quot;&gt;basePrice &lt;/span&gt;== &lt;span style=&quot;color:#6897bb;&quot;&gt;0 &lt;/span&gt;&amp;amp;&amp;amp; &lt;span style=&quot;color:#cc7832;&quot;&gt;this&lt;/span&gt;.&lt;span style=&quot;color:#9876aa;&quot;&gt;maxPrice &lt;/span&gt;== &lt;span style=&quot;color:#6897bb;&quot;&gt;0&lt;/span&gt;) {&lt;br /&gt;            &lt;span style=&quot;color:#cc7832;&quot;&gt;this&lt;/span&gt;.&lt;span style=&quot;color:#9876aa;&quot;&gt;free &lt;/span&gt;= &lt;span style=&quot;color:#cc7832;&quot;&gt;true;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;        &lt;/span&gt;} &lt;span style=&quot;color:#cc7832;&quot;&gt;else &lt;/span&gt;{&lt;br /&gt;            &lt;span style=&quot;color:#cc7832;&quot;&gt;this&lt;/span&gt;.&lt;span style=&quot;color:#9876aa;&quot;&gt;free &lt;/span&gt;= &lt;span style=&quot;color:#cc7832;&quot;&gt;false;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;        &lt;/span&gt;}&lt;br /&gt;&lt;br /&gt;        &lt;span style=&quot;color:#808080;&quot;&gt;// Update offline&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#808080;&quot;&gt;        &lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;if&lt;/span&gt;(&lt;span style=&quot;color:#cc7832;&quot;&gt;this&lt;/span&gt;.&lt;span style=&quot;color:#9876aa;&quot;&gt;location &lt;/span&gt;== &lt;span style=&quot;color:#cc7832;&quot;&gt;null &lt;/span&gt;|| &lt;span style=&quot;color:#cc7832;&quot;&gt;this&lt;/span&gt;.&lt;span style=&quot;color:#9876aa;&quot;&gt;location&lt;/span&gt;.isBlank()) {&lt;br /&gt;            &lt;span style=&quot;color:#cc7832;&quot;&gt;this&lt;/span&gt;.&lt;span style=&quot;color:#9876aa;&quot;&gt;offline &lt;/span&gt;= &lt;span style=&quot;color:#cc7832;&quot;&gt;false;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;        &lt;/span&gt;} &lt;span style=&quot;color:#cc7832;&quot;&gt;else &lt;/span&gt;{&lt;br /&gt;            &lt;span style=&quot;color:#cc7832;&quot;&gt;this&lt;/span&gt;.&lt;span style=&quot;color:#9876aa;&quot;&gt;offline &lt;/span&gt;= &lt;span style=&quot;color:#cc7832;&quot;&gt;true;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;        &lt;/span&gt;}&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;&lt;ul style=&quot;list-style-type: disc;&quot;&gt;&lt;li&gt;&lt;font face=&quot;Arial Black&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;위에서 언급한 비즈니스 로직을 적용한 엔티티 클래스입니다.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/font&gt;&lt;/li&gt;&lt;/ul&gt;&lt;pre style=&quot;background-color:#2b2b2b;color:#a9b7c6;font-family:'굴림체';font-size:9.0pt;&quot;&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;package &lt;/span&gt;com.example.springrestapi.events&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;import &lt;/span&gt;org.modelmapper.ModelMapper&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;import &lt;/span&gt;org.springframework.beans.factory.annotation.&lt;span style=&quot;color:#bbb529;&quot;&gt;Autowired&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;import &lt;/span&gt;org.springframework.hateoas.MediaTypes&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;import &lt;/span&gt;org.springframework.http.ResponseEntity&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;import &lt;/span&gt;org.springframework.stereotype.&lt;span style=&quot;color:#bbb529;&quot;&gt;Controller&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;import &lt;/span&gt;org.springframework.validation.Errors&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;import &lt;/span&gt;org.springframework.web.bind.annotation.&lt;span style=&quot;color:#bbb529;&quot;&gt;PostMapping&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;import &lt;/span&gt;org.springframework.web.bind.annotation.&lt;span style=&quot;color:#bbb529;&quot;&gt;RequestBody&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;import &lt;/span&gt;org.springframework.web.bind.annotation.&lt;span style=&quot;color:#bbb529;&quot;&gt;RequestMapping&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;import &lt;/span&gt;javax.validation.&lt;span style=&quot;color:#bbb529;&quot;&gt;Valid&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;import &lt;/span&gt;java.net.URI&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;import static &lt;/span&gt;org.springframework.hateoas.mvc.ControllerLinkBuilder.&lt;span style=&quot;font-style:italic;&quot;&gt;linkTo&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#bbb529;&quot;&gt;@Controller&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#bbb529;&quot;&gt;@RequestMapping&lt;/span&gt;(&lt;span style=&quot;color:#d0d0ff;&quot;&gt;value &lt;/span&gt;= &lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;/api/events&quot;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#d0d0ff;&quot;&gt;produces &lt;/span&gt;= MediaTypes.&lt;span style=&quot;color:#9876aa;font-style:italic;&quot;&gt;HAL_JSON_UTF8_VALUE&lt;/span&gt;)&lt;br /&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;public class &lt;/span&gt;EventController {&lt;br /&gt;&lt;br /&gt;    &lt;span style=&quot;color:#bbb529;&quot;&gt;@Autowired&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#bbb529;&quot;&gt;    &lt;/span&gt;EventRepository &lt;span style=&quot;color:#9876aa;&quot;&gt;eventRepository&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color:#bbb529;&quot;&gt;@Autowired&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#bbb529;&quot;&gt;    &lt;/span&gt;ModelMapper &lt;span style=&quot;color:#9876aa;&quot;&gt;modelMapper&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color:#bbb529;&quot;&gt;@Autowired&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#bbb529;&quot;&gt;    &lt;/span&gt;EventValidator &lt;span style=&quot;color:#9876aa;&quot;&gt;eventValidator&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color:#bbb529;&quot;&gt;@PostMapping&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#bbb529;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;public &lt;/span&gt;ResponseEntity &lt;span style=&quot;color:#ffc66d;&quot;&gt;createEvent&lt;/span&gt;(&lt;span style=&quot;color:#bbb529;&quot;&gt;@RequestBody @Valid &lt;/span&gt;EventDto eventDto&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;Errors errors) {&lt;br /&gt;        &lt;span style=&quot;color:#cc7832;&quot;&gt;if&lt;/span&gt;(errors.hasErrors()) {&lt;br /&gt;            &lt;span style=&quot;color:#cc7832;&quot;&gt;return &lt;/span&gt;ResponseEntity.&lt;span style=&quot;font-style:italic;&quot;&gt;badRequest&lt;/span&gt;().body(errors)&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;        &lt;/span&gt;}&lt;br /&gt;&lt;br /&gt;        &lt;span style=&quot;color:#9876aa;&quot;&gt;eventValidator&lt;/span&gt;.validate(eventDto&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;errors)&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;        if&lt;/span&gt;(errors.hasErrors()) {&lt;br /&gt;            &lt;span style=&quot;color:#cc7832;&quot;&gt;return &lt;/span&gt;ResponseEntity.&lt;span style=&quot;font-style:italic;&quot;&gt;badRequest&lt;/span&gt;().body(errors)&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;        &lt;/span&gt;}&lt;br /&gt;&lt;br /&gt;        Event event = &lt;span style=&quot;color:#9876aa;&quot;&gt;modelMapper&lt;/span&gt;.map(eventDto&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;Event.&lt;span style=&quot;color:#cc7832;&quot;&gt;class&lt;/span&gt;)&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;        &lt;/span&gt;event.update()&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;        &lt;/span&gt;Event newEvent = &lt;span style=&quot;color:#cc7832;&quot;&gt;this&lt;/span&gt;.&lt;span style=&quot;color:#9876aa;&quot;&gt;eventRepository&lt;/span&gt;.save(event)&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;        &lt;/span&gt;URI createdURI = &lt;span style=&quot;font-style:italic;&quot;&gt;linkTo&lt;/span&gt;(EventController.&lt;span style=&quot;color:#cc7832;&quot;&gt;class&lt;/span&gt;).slash(newEvent.getId()).toUri()&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;        return &lt;/span&gt;ResponseEntity.&lt;span style=&quot;font-style:italic;&quot;&gt;created&lt;/span&gt;(createdURI).body(newEvent)&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;    &lt;/span&gt;}&lt;br /&gt;}&lt;/pre&gt;&lt;ul style=&quot;list-style-type: disc;&quot;&gt;&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;HTTP 요청 안에 포함된 데이터들을 Event&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;&amp;nbsp;객체로 역직렬화한 다음 Event 객체의 update 메서드를 이용해 비즈니스 로직을 적용한 모습입니다&lt;/span&gt;.&amp;nbsp;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;결과 화면&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 419px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/99FF97475CED57911B&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F99FF97475CED57911B&quot; width=&quot;419&quot; height=&quot;171&quot; filename=&quot;캡처.PNG&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;참조:&amp;nbsp;&lt;a href=&quot;https://www.inflearn.com/course/spring_rest-api/#&quot;&gt;https://www.inflearn.com/course/spring_rest-api/#&lt;/a&gt;&lt;/p&gt;&lt;p&gt;소스 코드 :&amp;nbsp;&lt;a href=&quot;https://github.com/engkimbs/spring-rest-api&quot;&gt;https://github.com/engkimbs/spring-rest-api&lt;/a&gt;&lt;/p&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;</description>
      <category>Spring/Spring Rest API</category>
      <category>JUnitParam</category>
      <category>Spring REST API</category>
      <author>새로비</author>
      <guid isPermaLink="true">https://engkimbs.tistory.com/863</guid>
      <comments>https://engkimbs.tistory.com/entry/Spring-REST-API-8-Spring-REST-API-%EB%B9%84%EC%A6%88%EB%8B%88%EC%8A%A4-%EB%A1%9C%EC%A7%81-%EC%A0%81%EC%9A%A9-%EB%B0%8F-JUnitParam%EC%9D%84-%EC%9D%B4%EC%9A%A9%ED%95%9C-%ED%85%8C%EC%8A%A4%ED%8A%B8#entry863comment</comments>
      <pubDate>Wed, 29 May 2019 00:56:21 +0900</pubDate>
    </item>
    <item>
      <title>[Spring REST API #7] Spring REST API Bad Request 처리 및 에러 응답 메세지 보내기</title>
      <link>https://engkimbs.tistory.com/entry/Spring-REST-API-7-Spring-REST-API-Bad-Request-%EC%B2%98%EB%A6%AC-%EB%B0%8F-%EC%97%90%EB%9F%AC-%EC%9D%91%EB%8B%B5-%EB%A9%94%EC%84%B8%EC%A7%80-%EB%B3%B4%EB%82%B4%EA%B8%B0</link>
      <description>&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 18pt; color: rgb(31, 218, 17);&quot;&gt;|&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;font-size: 18.6667px;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 18pt;&quot;&gt;Spring REST API Bad Request 처리 및 응답하기&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;이번 시간에는 서버에서 Bad Request 응답시, 응답 메세지에 Error 정보를 담아서 보내는 법을 알아보겠습니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;모든 소스 코드는 &lt;/span&gt;&lt;a href=&quot;https://github.com/engkimbs/spring-rest-api&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;&lt;span style=&quot;font-size: 14pt; color: rgb(0, 216, 255);&quot;&gt;여기&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;에서 보실 수 있습니다.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;프로젝트 구조&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;pre style=&quot;background-color:#2b2b2b;color:#a9b7c6;font-family:'굴림체';font-size:9.0pt;&quot;&gt;+---src&lt;br /&gt;|   +---main&lt;br /&gt;|   |   +---java&lt;br /&gt;|   |   |   \---com&lt;br /&gt;|   |   |       \---example&lt;br /&gt;|   |   |           \---springrestapi&lt;br /&gt;|   |   |               |   SpringRestApiApplication.java&lt;br /&gt;|   |   |               |&lt;br /&gt;|   |   |               +---common&lt;br /&gt;|   |   |               |       TestDescription.java&lt;br /&gt;|   |   |               |       ErrorsSerializer.java&lt;br /&gt;|   |   |               |&lt;br /&gt;|   |   |               \---events&lt;br /&gt;|   |   |                       Event.java&lt;br /&gt;|   |   |                       EventController.java&lt;br /&gt;|   |   |                       EventDto.java&lt;br /&gt;|   |   |                       EventRepository.java&lt;br /&gt;|   |   |                       EventStatus.java&lt;br /&gt;|   |   |                       EventValidator.java&lt;br /&gt;|   |   |&lt;br /&gt;|   |   \---resources&lt;br /&gt;|   |       |   application.yml&lt;br /&gt;|   |       |&lt;br /&gt;|   |       +---static&lt;br /&gt;|   |       \---templates&lt;br /&gt;|   \---test&lt;br /&gt;|       \---java&lt;br /&gt;|           \---com&lt;br /&gt;|               \---example&lt;br /&gt;|                   \---springrestapi&lt;br /&gt;|                       |   SpringRestApiApplicationTests.java&lt;br /&gt;|                       |&lt;br /&gt;|                       \---events&lt;br /&gt;|                               EventControllerTests.java&lt;br /&gt;|                               EventTest.java&lt;/pre&gt;&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;의존성 관리&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;pre style=&quot;background-color:#2b2b2b;color:#a9b7c6;font-family:'굴림체';font-size:9.0pt;&quot;&gt;&lt;p&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;dependencies&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &amp;lt;dependency&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;            &amp;lt;groupId&amp;gt;&lt;/span&gt;org.springframework.boot&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/groupId&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;            &amp;lt;artifactId&amp;gt;&lt;/span&gt;spring-boot-starter-data-jpa&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/artifactId&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &amp;lt;/dependency&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &amp;lt;dependency&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;            &amp;lt;groupId&amp;gt;&lt;/span&gt;org.springframework.boot&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/groupId&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;            &amp;lt;artifactId&amp;gt;&lt;/span&gt;spring-boot-starter-hateoas&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/artifactId&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &amp;lt;/dependency&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &amp;lt;dependency&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;            &amp;lt;groupId&amp;gt;&lt;/span&gt;org.springframework.boot&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/groupId&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;            &amp;lt;artifactId&amp;gt;&lt;/span&gt;spring-boot-starter-web&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/artifactId&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &amp;lt;/dependency&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#808080;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#808080;&quot;&gt;        &lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;dependency&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;            &amp;lt;groupId&amp;gt;&lt;/span&gt;org.projectlombok&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/groupId&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;            &amp;lt;artifactId&amp;gt;&lt;/span&gt;lombok&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/artifactId&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;            &amp;lt;optional&amp;gt;&lt;/span&gt;true&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/optional&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &amp;lt;/dependency&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &amp;lt;dependency&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;            &amp;lt;groupId&amp;gt;&lt;/span&gt;org.modelmapper&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/groupId&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;            &amp;lt;artifactId&amp;gt;&lt;/span&gt;modelmapper&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/artifactId&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;            &amp;lt;version&amp;gt;&lt;/span&gt;2.3.1&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/version&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &amp;lt;/dependency&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &amp;lt;dependency&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;            &amp;lt;groupId&amp;gt;&lt;/span&gt;org.springframework.boot&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/groupId&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;            &amp;lt;artifactId&amp;gt;&lt;/span&gt;spring-boot-starter-test&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/artifactId&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;            &amp;lt;scope&amp;gt;&lt;/span&gt;test&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/scope&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &amp;lt;/dependency&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &amp;lt;dependency&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;            &amp;lt;groupId&amp;gt;&lt;/span&gt;com.h2database&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/groupId&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;            &amp;lt;artifactId&amp;gt;&lt;/span&gt;h2&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#808080;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#808080;&quot;&gt;        &lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/dependency&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &amp;lt;dependency&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;            &amp;lt;groupId&amp;gt;&lt;/span&gt;org.springframework.restdocs&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/groupId&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;            &amp;lt;artifactId&amp;gt;&lt;/span&gt;spring-restdocs-mockmvc&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/artifactId&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;            &amp;lt;scope&amp;gt;&lt;/span&gt;test&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/scope&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &amp;lt;/dependency&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;    &amp;lt;/dependencies&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;/pre&gt;&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;설정 파일&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;application.yml&lt;/b&gt;&lt;/p&gt;&lt;pre style=&quot;background-color:#2b2b2b;color:#a9b7c6;font-family:'굴림체';font-size:9.0pt;&quot;&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;spring&lt;/span&gt;:&lt;br /&gt;  &lt;span style=&quot;color:#cc7832;&quot;&gt;jackson&lt;/span&gt;:&lt;br /&gt;    &lt;span style=&quot;color:#cc7832;&quot;&gt;deserialization&lt;/span&gt;:&lt;br /&gt;      &lt;span style=&quot;color:#cc7832;&quot;&gt;fail-on-unknown-properties&lt;/span&gt;: &lt;span style=&quot;color:#cc7832;&quot;&gt;true&lt;/span&gt;&lt;/pre&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;테스트&amp;nbsp;코드&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;pre style=&quot;background-color:#2b2b2b;color:#a9b7c6;font-family:'굴림체';font-size:9.0pt;&quot;&gt;&lt;span style=&quot;color:#bbb529;&quot;&gt;@Test&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#bbb529;&quot;&gt;@TestDescription&lt;/span&gt;(&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;잘못된 입력값이 입력됬을 때&quot;&lt;/span&gt;)&lt;br /&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;public void &lt;/span&gt;&lt;span style=&quot;color:#ffc66d;&quot;&gt;createEvent_Bad_Request_Wrong_Input&lt;/span&gt;() &lt;span style=&quot;color:#cc7832;&quot;&gt;throws &lt;/span&gt;Exception {&lt;br /&gt;    EventDto eventDto = EventDto.&lt;span style=&quot;font-style:italic;&quot;&gt;builder&lt;/span&gt;()&lt;br /&gt;            .name(&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;Spring&quot;&lt;/span&gt;)&lt;br /&gt;            .description(&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;REST API Development&quot;&lt;/span&gt;)&lt;br /&gt;            .beginEnrollmentDateTime(LocalDateTime.&lt;span style=&quot;font-style:italic;&quot;&gt;of&lt;/span&gt;(&lt;span style=&quot;color:#6897bb;&quot;&gt;2010&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#6897bb;&quot;&gt;11&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#6897bb;&quot;&gt;23&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#6897bb;&quot;&gt;14&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#6897bb;&quot;&gt;23&lt;/span&gt;))&lt;br /&gt;            .closeEnrollmentDateTime(LocalDateTime.&lt;span style=&quot;font-style:italic;&quot;&gt;of&lt;/span&gt;(&lt;span style=&quot;color:#6897bb;&quot;&gt;2018&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#6897bb;&quot;&gt;11&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#6897bb;&quot;&gt;21&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#6897bb;&quot;&gt;14&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#6897bb;&quot;&gt;23&lt;/span&gt;))&lt;br /&gt;            .beginEventDateTime(LocalDateTime.&lt;span style=&quot;font-style:italic;&quot;&gt;of&lt;/span&gt;(&lt;span style=&quot;color:#6897bb;&quot;&gt;2018&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#6897bb;&quot;&gt;12&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#6897bb;&quot;&gt;24&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#6897bb;&quot;&gt;14&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#6897bb;&quot;&gt;30&lt;/span&gt;))&lt;br /&gt;            .endEventDateTime(LocalDateTime.&lt;span style=&quot;font-style:italic;&quot;&gt;of&lt;/span&gt;(&lt;span style=&quot;color:#6897bb;&quot;&gt;2018&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#6897bb;&quot;&gt;12&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#6897bb;&quot;&gt;6&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#6897bb;&quot;&gt;14&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#6897bb;&quot;&gt;30&lt;/span&gt;))&lt;br /&gt;            .basePrice(&lt;span style=&quot;color:#6897bb;&quot;&gt;10000&lt;/span&gt;)&lt;br /&gt;            .maxPrice(&lt;span style=&quot;color:#6897bb;&quot;&gt;200&lt;/span&gt;)&lt;br /&gt;            .limitOfEnrollment(&lt;span style=&quot;color:#6897bb;&quot;&gt;100&lt;/span&gt;)&lt;br /&gt;            .location(&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;D Start up Factory&quot;&lt;/span&gt;)&lt;br /&gt;            .build()&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;    this&lt;/span&gt;.&lt;span style=&quot;color:#9876aa;&quot;&gt;mockMvc&lt;/span&gt;.perform(&lt;span style=&quot;font-style:italic;&quot;&gt;post&lt;/span&gt;(&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;/api/events&quot;&lt;/span&gt;)&lt;br /&gt;            .contentType(MediaType.&lt;span style=&quot;color:#9876aa;font-style:italic;&quot;&gt;APPLICATION_JSON_UTF8&lt;/span&gt;)&lt;br /&gt;            .content(&lt;span style=&quot;color:#cc7832;&quot;&gt;this&lt;/span&gt;.&lt;span style=&quot;color:#9876aa;&quot;&gt;objectMapper&lt;/span&gt;.writeValueAsString(eventDto)))&lt;br /&gt;            .andExpect(&lt;span style=&quot;font-style:italic;&quot;&gt;status&lt;/span&gt;().isBadRequest())&lt;br /&gt;            .andExpect(&lt;span style=&quot;font-style:italic;&quot;&gt;jsonPath&lt;/span&gt;(&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;$[0].objectName&quot;&lt;/span&gt;).exists())&lt;br /&gt;            .andExpect(&lt;span style=&quot;font-style:italic;&quot;&gt;jsonPath&lt;/span&gt;(&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;$[0].field&quot;&lt;/span&gt;).exists())&lt;br /&gt;            .andExpect(&lt;span style=&quot;font-style:italic;&quot;&gt;jsonPath&lt;/span&gt;(&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;$[0].defaultMessage&quot;&lt;/span&gt;).exists())&lt;br /&gt;            .andExpect(&lt;span style=&quot;font-style:italic;&quot;&gt;jsonPath&lt;/span&gt;(&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;$[0].rejectValue&quot;&lt;/span&gt;).exists())&lt;br /&gt;    &lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;}&lt;/pre&gt;&lt;ul style=&quot;list-style-type: disc;&quot;&gt;&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;위 테스트 코드는 잘못된 객체를 POST 형식으로 보낼 때, 서버에서 Bad Request 응답 메세지를 보내며 또한 응답 메세지 안에 에러에 관련된 정보를 포함하는 것을 체크하는 코드입니다.&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;소스 코드&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;pre style=&quot;background-color:#2b2b2b;color:#a9b7c6;font-family:'굴림체';font-size:9.0pt;&quot;&gt;&lt;span style=&quot;color:#bbb529;&quot;&gt;@Controller&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#bbb529;&quot;&gt;@RequestMapping&lt;/span&gt;(&lt;span style=&quot;color:#d0d0ff;&quot;&gt;value &lt;/span&gt;= &lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;/api/events&quot;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#d0d0ff;&quot;&gt;produces &lt;/span&gt;= MediaTypes.&lt;span style=&quot;color:#9876aa;font-style:italic;&quot;&gt;HAL_JSON_UTF8_VALUE&lt;/span&gt;)&lt;br /&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;public class &lt;/span&gt;EventController {&lt;br /&gt;&lt;br /&gt;    &lt;span style=&quot;color:#bbb529;&quot;&gt;@Autowired&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#bbb529;&quot;&gt;    &lt;/span&gt;EventRepository &lt;span style=&quot;color:#9876aa;&quot;&gt;eventRepository&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color:#bbb529;&quot;&gt;@Autowired&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#bbb529;&quot;&gt;    &lt;/span&gt;ModelMapper &lt;span style=&quot;color:#9876aa;&quot;&gt;modelMapper&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color:#bbb529;&quot;&gt;@Autowired&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#bbb529;&quot;&gt;    &lt;/span&gt;EventValidator &lt;span style=&quot;color:#9876aa;&quot;&gt;eventValidator&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color:#bbb529;&quot;&gt;@PostMapping&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#bbb529;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;public &lt;/span&gt;ResponseEntity &lt;span style=&quot;color:#ffc66d;&quot;&gt;createEvent&lt;/span&gt;(&lt;span style=&quot;color:#bbb529;&quot;&gt;@RequestBody @Valid &lt;/span&gt;EventDto eventDto&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;Errors errors) {&lt;br /&gt;        &lt;span style=&quot;color:#cc7832;&quot;&gt;if&lt;/span&gt;(errors.hasErrors()) {&lt;br /&gt;            &lt;span style=&quot;color:#cc7832;&quot;&gt;return &lt;/span&gt;ResponseEntity.&lt;span style=&quot;font-style:italic;&quot;&gt;badRequest&lt;/span&gt;().body(errors)&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;        &lt;/span&gt;}&lt;br /&gt;&lt;br /&gt;        &lt;span style=&quot;color:#9876aa;&quot;&gt;eventValidator&lt;/span&gt;.validate(eventDto&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;errors)&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;        if&lt;/span&gt;(errors.hasErrors()) {&lt;br /&gt;            &lt;span style=&quot;color:#cc7832;&quot;&gt;return &lt;/span&gt;ResponseEntity.&lt;span style=&quot;font-style:italic;&quot;&gt;badRequest&lt;/span&gt;().body(errors)&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;        &lt;/span&gt;}&lt;br /&gt;&lt;br /&gt;        Event event = &lt;span style=&quot;color:#9876aa;&quot;&gt;modelMapper&lt;/span&gt;.map(eventDto&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;Event.&lt;span style=&quot;color:#cc7832;&quot;&gt;class&lt;/span&gt;)&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;        &lt;/span&gt;Event newEvent = &lt;span style=&quot;color:#cc7832;&quot;&gt;this&lt;/span&gt;.&lt;span style=&quot;color:#9876aa;&quot;&gt;eventRepository&lt;/span&gt;.save(event)&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;        &lt;/span&gt;URI createdURI = &lt;span style=&quot;font-style:italic;&quot;&gt;linkTo&lt;/span&gt;(EventController.&lt;span style=&quot;color:#cc7832;&quot;&gt;class&lt;/span&gt;).slash(newEvent.getId()).toUri()&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;        return &lt;/span&gt;ResponseEntity.&lt;span style=&quot;font-style:italic;&quot;&gt;created&lt;/span&gt;(createdURI).body(newEvent)&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;    &lt;/span&gt;}&lt;br /&gt;}&lt;/pre&gt;&lt;ul style=&quot;list-style-type: disc;&quot;&gt;&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;errors에 있는 에러 정보들을 응답 메세지에 포함하기 위해서는 body 메서드에 errors 객체를 ResponseEntity.badRequest().body(errors)와 같이 처리하면 된다고 생각하기 쉽습니다&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;. 하지만 이렇게 처리할 경우에는 errors를 직렬화 할 수 있는 serializer가 없기 때문에 런타임&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;&amp;nbsp;에러를 내게 됩니다. 따라서 아래와 같이 Errors 객체를 직렬화하기 위한 serializer를 추가해야 합니다. (참고로 event 객체는 Bean 스펙을 준수하는 객체이기 때문에 이미 등록되어 있는BeanSerializer로 직렬화 가능)&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;&lt;pre style=&quot;background-color:#2b2b2b;color:#a9b7c6;font-family:'굴림체';font-size:9.0pt;&quot;&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;package &lt;/span&gt;com.example.springrestapi.common&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;import &lt;/span&gt;com.fasterxml.jackson.core.JsonGenerator&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;import &lt;/span&gt;com.fasterxml.jackson.databind.JsonSerializer&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;import &lt;/span&gt;com.fasterxml.jackson.databind.SerializerProvider&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;import &lt;/span&gt;org.springframework.boot.jackson.&lt;span style=&quot;color:#bbb529;&quot;&gt;JsonComponent&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;import &lt;/span&gt;org.springframework.validation.Errors&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;import &lt;/span&gt;java.io.IOException&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#bbb529;&quot;&gt;@JsonComponent&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;public class &lt;/span&gt;ErrorsSerializer &lt;span style=&quot;color:#cc7832;&quot;&gt;extends &lt;/span&gt;JsonSerializer&amp;lt;Errors&amp;gt; {&lt;br /&gt;    &lt;span style=&quot;color:#bbb529;&quot;&gt;@Override&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#bbb529;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;public void &lt;/span&gt;&lt;span style=&quot;color:#ffc66d;&quot;&gt;serialize&lt;/span&gt;(Errors errors&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;JsonGenerator gen&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;SerializerProvider serializers) &lt;span style=&quot;color:#cc7832;&quot;&gt;throws &lt;/span&gt;IOException {&lt;br /&gt;        gen.writeStartArray()&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;        &lt;/span&gt;errors.getFieldErrors().stream().forEach(e -&amp;gt; {&lt;br /&gt;            &lt;span style=&quot;color:#cc7832;&quot;&gt;try &lt;/span&gt;{&lt;br /&gt;                &lt;span style=&quot;color:#b389c5;&quot;&gt;gen&lt;/span&gt;.writeStartObject()&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;                &lt;/span&gt;&lt;span style=&quot;color:#b389c5;&quot;&gt;gen&lt;/span&gt;.writeStringField(&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;field&quot;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;e.getField())&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;                &lt;/span&gt;&lt;span style=&quot;color:#b389c5;&quot;&gt;gen&lt;/span&gt;.writeStringField(&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;objectName&quot;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;e.getObjectName())&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;                &lt;/span&gt;&lt;span style=&quot;color:#b389c5;&quot;&gt;gen&lt;/span&gt;.writeStringField(&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;code&quot;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;e.getCode())&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;                &lt;/span&gt;&lt;span style=&quot;color:#b389c5;&quot;&gt;gen&lt;/span&gt;.writeStringField(&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;defaultMessage&quot;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;e.getDefaultMessage())&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;                &lt;/span&gt;Object rejectedValue = e.getRejectedValue()&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;                if&lt;/span&gt;(rejectedValue != &lt;span style=&quot;color:#cc7832;&quot;&gt;null&lt;/span&gt;) {&lt;br /&gt;                    &lt;span style=&quot;color:#b389c5;&quot;&gt;gen&lt;/span&gt;.writeStringField(&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;rejectedValue&quot;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;rejectedValue.toString())&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;                &lt;/span&gt;}&lt;br /&gt;                &lt;span style=&quot;color:#b389c5;&quot;&gt;gen&lt;/span&gt;.writeEndObject()&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;            &lt;/span&gt;} &lt;span style=&quot;color:#cc7832;&quot;&gt;catch&lt;/span&gt;(IOException e1) {&lt;br /&gt;                e1.printStackTrace()&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;            &lt;/span&gt;}&lt;br /&gt;        })&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;        &lt;/span&gt;errors.getGlobalErrors().forEach(e -&amp;gt; {&lt;br /&gt;            &lt;span style=&quot;color:#cc7832;&quot;&gt;try &lt;/span&gt;{&lt;br /&gt;                &lt;span style=&quot;color:#b389c5;&quot;&gt;gen&lt;/span&gt;.writeStartObject()&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;                &lt;/span&gt;&lt;span style=&quot;color:#b389c5;&quot;&gt;gen&lt;/span&gt;.writeStringField(&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;objectName&quot;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;e.getObjectName())&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;                &lt;/span&gt;&lt;span style=&quot;color:#b389c5;&quot;&gt;gen&lt;/span&gt;.writeStringField(&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;code&quot;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;e.getCode())&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;                &lt;/span&gt;&lt;span style=&quot;color:#b389c5;&quot;&gt;gen&lt;/span&gt;.writeStringField(&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;defaultMessage&quot;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;e.getDefaultMessage())&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;                &lt;/span&gt;&lt;span style=&quot;color:#b389c5;&quot;&gt;gen&lt;/span&gt;.writeEndObject()&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;            &lt;/span&gt;} &lt;span style=&quot;color:#cc7832;&quot;&gt;catch&lt;/span&gt;(IOException e1) {&lt;br /&gt;                e1.printStackTrace()&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;            &lt;/span&gt;}&lt;br /&gt;        })&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;        &lt;/span&gt;gen.writeEndArray()&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;    &lt;/span&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;ul style=&quot;list-style-type: disc;&quot;&gt;&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;JsonSerializer 클래스를 상속받아 serialize 메서드를 오버라이딩합니다. errors 객체에 있는 필드 에러들을 순회하여 그 값들을 JsonGenerator 인스턴스에 담아 Json으로 직렬화를 하게 됩니다.&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;@JsonComponent 어노테이션을 이용하여 Json Serializer로 손쉽게 등록할 수 있습니다.&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;결과 화면&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;요청&lt;/p&gt;&lt;pre style=&quot;background-color:#2b2b2b;color:#a9b7c6;font-family:'굴림체';font-size:9.0pt;&quot;&gt;MockHttpServletRequest:&lt;br /&gt;HTTP Method = POST&lt;br /&gt;Request URI = /api/events&lt;br /&gt;Parameters = {}&lt;br /&gt;Headers = [Content-Type:&quot;application/json;charset=UTF-8&quot;]&lt;br /&gt;Body = {&quot;name&quot;:&quot;Spring&quot;,&quot;description&quot;:&quot;REST API Development&quot;,&quot;beginEnrollmentDateTime&quot;:&quot;2010-11-23T14:23:00&quot;,&quot;closeEnrollmentDateTime&quot;:&quot;2018-11-21T14:23:00&quot;,&quot;beginEventDateTime&quot;:&quot;2018-12-24T14:30:00&quot;,&quot;endEventDateTime&quot;:&quot;2018-12-06T14:30:00&quot;,&quot;location&quot;:&quot;D Start up Factory&quot;,&quot;basePrice&quot;:10000,&quot;maxPrice&quot;:200,&quot;limitOfEnrollment&quot;:100}&lt;br /&gt;Session Attrs = {}&lt;/pre&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;응답&lt;/p&gt;&lt;pre style=&quot;background-color:#2b2b2b;color:#a9b7c6;font-family:'굴림체';font-size:9.0pt;&quot;&gt;MockHttpServletResponse:&lt;br /&gt;Status = 400&lt;br /&gt;Error message = null&lt;br /&gt;Headers = [Content-Type:&quot;application/hal+json;charset=UTF-8&quot;]&lt;br /&gt;Content type = application/hal+json;charset=UTF-8&lt;br /&gt;Body = [{&quot;field&quot;:&quot;endEventDateTime&quot;,&quot;objectName&quot;:&quot;eventDto&quot;,&quot;code&quot;:&quot;wrongValue&quot;,&quot;defaultMessage&quot;:&quot;Wrong Date Time&quot;,&quot;rejectedValue&quot;:&quot;2018-12-06T14:30&quot;},{&quot;objectName&quot;:&quot;eventDto&quot;,&quot;code&quot;:&quot;wrongPrices&quot;,&quot;defaultMessage&quot;:&quot;wrong price error&quot;}]&lt;br /&gt;Forwarded URL = null&lt;br /&gt;Redirected URL = null&lt;br /&gt;Cookies = []&lt;/pre&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;참조:&amp;nbsp;&lt;a href=&quot;https://www.inflearn.com/course/spring_rest-api/#&quot;&gt;https://www.inflearn.com/course/spring_rest-api/#&lt;/a&gt;&lt;/p&gt;&lt;p&gt;소스 코드 :&amp;nbsp;&lt;a href=&quot;https://github.com/engkimbs/spring-rest-api&quot;&gt;https://github.com/engkimbs/spring-rest-api&lt;/a&gt;&lt;/p&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;</description>
      <category>Spring/Spring Rest API</category>
      <category>Json Serializer</category>
      <category>Spring REST API</category>
      <author>새로비</author>
      <guid isPermaLink="true">https://engkimbs.tistory.com/862</guid>
      <comments>https://engkimbs.tistory.com/entry/Spring-REST-API-7-Spring-REST-API-Bad-Request-%EC%B2%98%EB%A6%AC-%EB%B0%8F-%EC%97%90%EB%9F%AC-%EC%9D%91%EB%8B%B5-%EB%A9%94%EC%84%B8%EC%A7%80-%EB%B3%B4%EB%82%B4%EA%B8%B0#entry862comment</comments>
      <pubDate>Mon, 27 May 2019 22:14:29 +0900</pubDate>
    </item>
    <item>
      <title>[Java Library] slf4j + log4j2 한 방 정리</title>
      <link>https://engkimbs.tistory.com/entry/Java-Library-slf4j-log4j2-%ED%95%9C-%EB%B0%A9-%EC%A0%95%EB%A6%AC</link>
      <description>&lt;p&gt;&lt;span style=&quot;font-size: 18pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(31, 218, 17);&quot;&gt;| &lt;/span&gt;slf4j와 log4j2&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;slf4j는 자바 로깅 시스템을 쉽게 사용할 수 있도록 해주는 라이브러리이며, 다양한 자바 로깅 시스템을 사용할 수 있도록 &lt;/span&gt;&lt;a href=&quot;https://jusungpark.tistory.com/23&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;파사드 패턴(facade pattern&lt;/span&gt;&lt;/a&gt;&lt;a href=&quot;https://jusungpark.tistory.com/23&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;)&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt; 및 추상화를 통해 로깅 기능을 제공합니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;slf4j를 사용함으로서 얻을 수 있는 이점은 기존에 사용하는 로깅 시스템을 교체하고 싶을 때, 소스 코드를 수정하지 않고도 maven이나 gradle의 의존성 설정만 바꾸면 손쉽게 적용할 수 있다는 점이죠.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;예로들어 logback을 로깅 시스템으로 사용한 자바 어플리케이션이 log4j로 로깅 시스템을 바꿀 일이 있으면 의존성 설정과 설정 파일만 조정해 주면 손쉽게 소스 수정없이 migration이 가능하단 점입니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;log4j2는 자바 진영에서 제공하는 로깅 시스템이며 로깅과 관련된 여러 기능을 제공하는 유용한 라이브러리입니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 18pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(31, 218, 17);&quot;&gt;|&lt;/span&gt; slf4j와 log4j2를 연동&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;slf4j와 log4j2를 연동하기 위해서는 maven 기준으로 slf4j의 log4j2 구현체를 의존성에 추가하기만 하면 됩니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;프로젝트 구조&lt;/b&gt;&lt;/p&gt;&lt;pre style=&quot;background-color:#2b2b2b;color:#a9b7c6;font-family:'굴림체';font-size:9.0pt;&quot;&gt;+---src&lt;br /&gt;|   +---main&lt;br /&gt;|   |   +---java&lt;br /&gt;|   |   |   +---log4j2&lt;br /&gt;|   |   |   |       Log4j2.java&lt;br /&gt;|   |   |&lt;br /&gt;|   |   \---resources&lt;br /&gt;|   |           log4j2.xml&lt;br /&gt;+---pom.xml     &lt;/pre&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;의존성 관리&lt;/b&gt;&lt;/p&gt;&lt;pre style=&quot;background-color:#2b2b2b;color:#a9b7c6;font-family:'굴림체';font-size:9.0pt;&quot;&gt;&lt;p&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;dependencies&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;    &amp;lt;dependency&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &amp;lt;groupId&amp;gt;&lt;/span&gt;org.apache.logging.log4j&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/groupId&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &amp;lt;artifactId&amp;gt;&lt;/span&gt;log4j-slf4j-impl&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/artifactId&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &amp;lt;version&amp;gt;&lt;/span&gt;2.10.0&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/version&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;    &amp;lt;/dependency&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/dependencies&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;/pre&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;소스 코드&lt;/b&gt;&lt;/p&gt;&lt;pre style=&quot;background-color:#2b2b2b;color:#a9b7c6;font-family:'굴림체';font-size:9.0pt;&quot;&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;package &lt;/span&gt;log4j2&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;import &lt;/span&gt;org.slf4j.Logger&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;import &lt;/span&gt;org.slf4j.LoggerFactory&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;public class &lt;/span&gt;Log4j2 {&lt;br /&gt;&lt;br /&gt;    &lt;span style=&quot;color:#cc7832;&quot;&gt;private static &lt;/span&gt;Logger &lt;span style=&quot;color:#9876aa;font-style:italic;&quot;&gt;LOGGER &lt;/span&gt;= LoggerFactory.&lt;span style=&quot;font-style:italic;&quot;&gt;getLogger&lt;/span&gt;(Log4j2.&lt;span style=&quot;color:#cc7832;&quot;&gt;class&lt;/span&gt;)&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;    public static void &lt;/span&gt;&lt;span style=&quot;color:#ffc66d;&quot;&gt;main&lt;/span&gt;(String[] args) {&lt;br /&gt;        &lt;span style=&quot;color:#9876aa;font-style:italic;&quot;&gt;LOGGER&lt;/span&gt;.info(&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;a test message&quot;&lt;/span&gt;)&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;    &lt;/span&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;ul style=&quot;list-style-type: disc;&quot;&gt;&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;org.slf4j.Logger 클래스를 통해 log4j2 로깅 기능을 쓸 수 있습니다. 만약 log4j2를 사용하지 않고 logback과 같은 다른 로깅 시스템으로 바꾸고 싶다면 다음과 같이&amp;nbsp;pom.xml 설정을 바꾸기만 하면 됩니다.&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;pre style=&quot;background-color:#2b2b2b;color:#a9b7c6;font-family:'굴림체';font-size:9.0pt;&quot;&gt;&lt;span style=&quot;color:#808080;&quot;&gt;&amp;lt;!--        &amp;lt;dependency&amp;gt;--&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#808080;&quot;&gt;&amp;lt;!--            &amp;lt;groupId&amp;gt;org.apache.logging.log4j&amp;lt;/groupId&amp;gt;--&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#808080;&quot;&gt;&amp;lt;!--            &amp;lt;artifactId&amp;gt;log4j-slf4j-impl&amp;lt;/artifactId&amp;gt;--&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#808080;&quot;&gt;&amp;lt;!--            &amp;lt;version&amp;gt;2.10.0&amp;lt;/version&amp;gt;--&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#808080;&quot;&gt;&amp;lt;!--        &amp;lt;/dependency&amp;gt;--&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#808080;&quot;&gt;        &lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;dependency&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;            &amp;lt;groupId&amp;gt;&lt;/span&gt;ch.qos.logback&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/groupId&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;            &amp;lt;artifactId&amp;gt;&lt;/span&gt;logback-classic&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/artifactId&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;            &amp;lt;version&amp;gt;&lt;/span&gt;1.2.3&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/version&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &amp;lt;/dependency&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;설정 파일&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;log4j2.xml&lt;/b&gt;&lt;/p&gt;&lt;pre style=&quot;background-color:#2b2b2b;color:#a9b7c6;font-family:'굴림체';font-size:9.0pt;&quot;&gt;&lt;p&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;?&lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;xml version&lt;/span&gt;&lt;span style=&quot;color:#6a8759;&quot;&gt;=&quot;1.0&quot; &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;encoding&lt;/span&gt;&lt;span style=&quot;color:#6a8759;&quot;&gt;=&quot;UTF-8&quot;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;?&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;Configuration &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;status&lt;/span&gt;&lt;span style=&quot;color:#6a8759;&quot;&gt;=&quot;INFO&quot;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;    &amp;lt;Appenders&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &amp;lt;Console &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;color:#6a8759;&quot;&gt;=&quot;console&quot; &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;target&lt;/span&gt;&lt;span style=&quot;color:#6a8759;&quot;&gt;=&quot;SYSTEM_OUT&quot;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;            &amp;lt;PatternLayout &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;pattern&lt;/span&gt;&lt;span style=&quot;color:#6a8759;&quot;&gt;=&quot;[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n&quot;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;/&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &amp;lt;/Console&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;    &amp;lt;/Appenders&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;    &amp;lt;Loggers&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &amp;lt;Root &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;level&lt;/span&gt;&lt;span style=&quot;color:#6a8759;&quot;&gt;=&quot;debug&quot; &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;additivity&lt;/span&gt;&lt;span style=&quot;color:#6a8759;&quot;&gt;=&quot;false&quot;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;            &amp;lt;AppenderRef &lt;/span&gt;&lt;span style=&quot;color:#bababa;&quot;&gt;ref&lt;/span&gt;&lt;span style=&quot;color:#6a8759;&quot;&gt;=&quot;console&quot;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;/&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &amp;lt;/Root&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;    &amp;lt;/Loggers&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/Configuration&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;/pre&gt;&lt;ul style=&quot;list-style-type: disc;&quot;&gt;&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;log4j2는 properties, json, yml, xml 등의 파일 확장자로 설정파일을 지정할 수 있습니다.&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;log4j2가 설정파일을 찾는 메커니즘은 classpath를 기준으로 이루어집니다. xml 확장자를 기준으로 system property =&amp;gt; log4j2-test.xml =&amp;gt; log4j2.xml 순으로 설정 파일을 찾습니다. 만일 설정 파일을 찾지&amp;nbsp;못하면 default 설정이 적용됩니다. 이 밖의&amp;nbsp;자세한 내용은 &lt;a href=&quot;https://logging.apache.org/log4j/2.x/manual/configuration.html&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;공식 문서&lt;/a&gt;를 참조하시면 더 상세히 알 수 있습니다.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;Configuration 태그 안에 log4j2의 설정 정보를 작성할 수 있습니다. Configuration 태그의 status는 log4j2 내부적으로 어떻게 동작되는 지(어떤 설정파일을 로딩했는 지, 어떤 패턴을 적용했는 지 등) 볼 수 있는 로그&amp;nbsp;수준을 결정하는 속성입니다. status를 INFO로 했을 경우에는 log4j2가 내부적으로 어떻게 동작하는 지 유의미한 로그를 보기 어렵지만 TRACE나 DEBUG로 놓았을 시에는 손쉽게 내부 로그를 볼 수 있습니다. 아래는 그 예시입니다.&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;pre style=&quot;background-color:#2b2b2b;color:#a9b7c6;font-family:'굴림체';font-size:9.0pt;&quot;&gt;&lt;span style=&quot;color:#6897bb;&quot;&gt;2019&lt;/span&gt;-&lt;span style=&quot;color:#6897bb;&quot;&gt;05&lt;/span&gt;-&lt;span style=&quot;color:#6897bb;&quot;&gt;27 16&lt;/span&gt;:&lt;span style=&quot;color:#6897bb;&quot;&gt;05&lt;/span&gt;:&lt;span style=&quot;color:#6897bb;&quot;&gt;16&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:#6897bb;&quot;&gt;601 &lt;/span&gt;main DEBUG Initializing configuration XmlConfiguration[location=D:\JavaProject\target\classes\log4j2.xml]&lt;br /&gt;&lt;span style=&quot;color:#6897bb;&quot;&gt;2019&lt;/span&gt;-&lt;span style=&quot;color:#6897bb;&quot;&gt;05&lt;/span&gt;-&lt;span style=&quot;color:#6897bb;&quot;&gt;27 16&lt;/span&gt;:&lt;span style=&quot;color:#6897bb;&quot;&gt;05&lt;/span&gt;:&lt;span style=&quot;color:#6897bb;&quot;&gt;16&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:#6897bb;&quot;&gt;608 &lt;/span&gt;main DEBUG Installed &lt;span style=&quot;color:#6897bb;&quot;&gt;1 &lt;/span&gt;script engine&lt;br /&gt;Warning: Nashorn engine is planned to be removed from a future JDK release&lt;br /&gt;&lt;span style=&quot;color:#6897bb;&quot;&gt;2019&lt;/span&gt;-&lt;span style=&quot;color:#6897bb;&quot;&gt;05&lt;/span&gt;-&lt;span style=&quot;color:#6897bb;&quot;&gt;27 16&lt;/span&gt;:&lt;span style=&quot;color:#6897bb;&quot;&gt;05&lt;/span&gt;:&lt;span style=&quot;color:#6897bb;&quot;&gt;16&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:#6897bb;&quot;&gt;858 &lt;/span&gt;main DEBUG Oracle Nashorn version: &lt;span style=&quot;color:#6897bb;&quot;&gt;11.0.1&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;language: ECMAScript&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;threading: Not Thread Safe&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;compile: &lt;span style=&quot;color:#cc7832;&quot;&gt;true, &lt;/span&gt;names: [nashorn&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;Nashorn&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;js&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;JS&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;JavaScript&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;javascript&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;ECMAScript&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;ecmascript]&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;factory &lt;span style=&quot;color:#cc7832;&quot;&gt;class&lt;/span&gt;: jdk.nashorn.api.scripting.NashornScriptEngineFactory&lt;br /&gt;&lt;span style=&quot;color:#6897bb;&quot;&gt;2019&lt;/span&gt;-&lt;span style=&quot;color:#6897bb;&quot;&gt;05&lt;/span&gt;-&lt;span style=&quot;color:#6897bb;&quot;&gt;27 16&lt;/span&gt;:&lt;span style=&quot;color:#6897bb;&quot;&gt;05&lt;/span&gt;:&lt;span style=&quot;color:#6897bb;&quot;&gt;16&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:#6897bb;&quot;&gt;858 &lt;/span&gt;main DEBUG PluginManager &lt;span style=&quot;color:#6a8759;&quot;&gt;'Core' &lt;/span&gt;found &lt;span style=&quot;color:#6897bb;&quot;&gt;116 &lt;/span&gt;plugins&lt;br /&gt;&lt;span style=&quot;color:#6897bb;&quot;&gt;2019&lt;/span&gt;-&lt;span style=&quot;color:#6897bb;&quot;&gt;05&lt;/span&gt;-&lt;span style=&quot;color:#6897bb;&quot;&gt;27 16&lt;/span&gt;:&lt;span style=&quot;color:#6897bb;&quot;&gt;05&lt;/span&gt;:&lt;span style=&quot;color:#6897bb;&quot;&gt;16&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:#6897bb;&quot;&gt;859 &lt;/span&gt;main DEBUG PluginManager &lt;span style=&quot;color:#6a8759;&quot;&gt;'Level' &lt;/span&gt;found &lt;span style=&quot;color:#6897bb;&quot;&gt;0 &lt;/span&gt;plugins&lt;br /&gt;&lt;span style=&quot;color:#6897bb;&quot;&gt;2019&lt;/span&gt;-&lt;span style=&quot;color:#6897bb;&quot;&gt;05&lt;/span&gt;-&lt;span style=&quot;color:#6897bb;&quot;&gt;27 16&lt;/span&gt;:&lt;span style=&quot;color:#6897bb;&quot;&gt;05&lt;/span&gt;:&lt;span style=&quot;color:#6897bb;&quot;&gt;16&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:#6897bb;&quot;&gt;860 &lt;/span&gt;main DEBUG PluginManager &lt;span style=&quot;color:#6a8759;&quot;&gt;'Lookup' &lt;/span&gt;found &lt;span style=&quot;color:#6897bb;&quot;&gt;13 &lt;/span&gt;plugins&lt;br /&gt;&lt;span style=&quot;color:#6897bb;&quot;&gt;2019&lt;/span&gt;-&lt;span style=&quot;color:#6897bb;&quot;&gt;05&lt;/span&gt;-&lt;span style=&quot;color:#6897bb;&quot;&gt;27 16&lt;/span&gt;:&lt;span style=&quot;color:#6897bb;&quot;&gt;05&lt;/span&gt;:&lt;span style=&quot;color:#6897bb;&quot;&gt;16&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:#6897bb;&quot;&gt;862 &lt;/span&gt;main DEBUG Building Plugin[name=layout&lt;span style=&quot;color:#cc7832;&quot;&gt;, class&lt;/span&gt;=org.apache.logging.log4j.core.layout.PatternLayout].&lt;br /&gt;&lt;span style=&quot;color:#6897bb;&quot;&gt;2019&lt;/span&gt;-&lt;span style=&quot;color:#6897bb;&quot;&gt;05&lt;/span&gt;-&lt;span style=&quot;color:#6897bb;&quot;&gt;27 16&lt;/span&gt;:&lt;span style=&quot;color:#6897bb;&quot;&gt;05&lt;/span&gt;:&lt;span style=&quot;color:#6897bb;&quot;&gt;16&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:#6897bb;&quot;&gt;869 &lt;/span&gt;main TRACE TypeConverterRegistry initializing.&lt;br /&gt;&lt;span style=&quot;color:#6897bb;&quot;&gt;2019&lt;/span&gt;-&lt;span style=&quot;color:#6897bb;&quot;&gt;05&lt;/span&gt;-&lt;span style=&quot;color:#6897bb;&quot;&gt;27 16&lt;/span&gt;:&lt;span style=&quot;color:#6897bb;&quot;&gt;05&lt;/span&gt;:&lt;span style=&quot;color:#6897bb;&quot;&gt;16&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:#6897bb;&quot;&gt;870 &lt;/span&gt;main DEBUG PluginManager &lt;span style=&quot;color:#6a8759;&quot;&gt;'TypeConverter' &lt;/span&gt;found &lt;span style=&quot;color:#6897bb;&quot;&gt;26 &lt;/span&gt;plugins&lt;br /&gt;&lt;span style=&quot;color:#6897bb;&quot;&gt;2019&lt;/span&gt;-&lt;span style=&quot;color:#6897bb;&quot;&gt;05&lt;/span&gt;-&lt;span style=&quot;color:#6897bb;&quot;&gt;27 16&lt;/span&gt;:&lt;span style=&quot;color:#6897bb;&quot;&gt;05&lt;/span&gt;:&lt;span style=&quot;color:#6897bb;&quot;&gt;16&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:#6897bb;&quot;&gt;879 &lt;/span&gt;main DEBUG PatternLayout$Builder(pattern=&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n&quot;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;PatternSelector=&lt;span style=&quot;color:#cc7832;&quot;&gt;null, &lt;/span&gt;Configuration(D:\JavaProject\target\classes\log4j2.xml)&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;Replace=&lt;span style=&quot;color:#cc7832;&quot;&gt;null, &lt;/span&gt;charset=&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;null&quot;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;alwaysWriteExceptions=&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;null&quot;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;disableAnsi=&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;null&quot;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;noConsoleNoAnsi=&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;null&quot;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;header=&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;null&quot;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;footer=&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;null&quot;&lt;/span&gt;)&lt;br /&gt;&lt;span style=&quot;color:#6897bb;&quot;&gt;2019&lt;/span&gt;-&lt;span style=&quot;color:#6897bb;&quot;&gt;05&lt;/span&gt;-&lt;span style=&quot;color:#6897bb;&quot;&gt;27 16&lt;/span&gt;:&lt;span style=&quot;color:#6897bb;&quot;&gt;05&lt;/span&gt;:&lt;span style=&quot;color:#6897bb;&quot;&gt;16&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:#6897bb;&quot;&gt;879 &lt;/span&gt;main DEBUG PluginManager &lt;span style=&quot;color:#6a8759;&quot;&gt;'Converter' &lt;/span&gt;found &lt;span style=&quot;color:#6897bb;&quot;&gt;42 &lt;/span&gt;plugins&lt;/pre&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: Dotum, 돋움;&quot;&gt;&amp;lt; Configuration status=&quot;TRACE&quot; 로 놓았을 시 콘솔 로그 &lt;/span&gt;&lt;span style=&quot;font-family: Dotum, 돋움;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;ul style=&quot;list-style-type: disc;&quot;&gt;&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;Appenders 태그는 로그를 어떻게 출력할 것인지를 결정하는 Appender들을 정의하는 태그입니다. 보통 파일, 콘솔 형태로 출력하고 더 나아가 DB에 직접 로그를 쓸 수도 있게 설정할 수 있습니다.&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;&amp;nbsp;위의 예시로 봤을 때, &amp;lt;Console name=&quot;console&quot; target=&quot;SYSTEM_OUT&quot;&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;&amp;gt; 에서는 콘솔로 로그를 출력하는 Appender를 지정한 것을 알 수 있습니다. 또한 PatternLayout 자식 태그에서는&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;&amp;nbsp;어떤 식으로 로그 패턴을 출력할 지 지정할 수 있습니다.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;Loggers 에서는 각 Logger 들에 대한 설정을 정의할 수 있습니다. 각 Logger들은&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;&amp;nbsp;level, 경로, additivity 등의 속성을 지정하여 사용할 수 있습니다. Logger의 각 속성들은 아래에 자세히&amp;nbsp; 다루겠습니다.&amp;nbsp;Root는 logger 들의 최상위 부모 logger 로서 만일 하위 logger들에 대한 설정이 없다면 이 Root 로거의 설정 정보를 자동적으로 상속받아 쓰게 되어 있습니다. 또한 Logger의 하위 태그인&amp;nbsp;AppendRef를 지정하여 어떤 Appender를 쓸 지 지정할 수 있습니다.&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;결과 화면&lt;/b&gt;&lt;/p&gt;&lt;pre style=&quot;background-color:#2b2b2b;color:#a9b7c6;font-family:'굴림체';font-size:9.0pt;&quot;&gt;[INFO ] &lt;span style=&quot;color:#6897bb;&quot;&gt;2019&lt;/span&gt;-&lt;span style=&quot;color:#6897bb;&quot;&gt;05&lt;/span&gt;-&lt;span style=&quot;color:#6897bb;&quot;&gt;27 16&lt;/span&gt;:&lt;span style=&quot;color:#6897bb;&quot;&gt;21&lt;/span&gt;:&lt;span style=&quot;color:#6897bb;&quot;&gt;12.803 &lt;/span&gt;[main] Log4j2 - a test message&lt;/pre&gt;&lt;p&gt;&lt;span style=&quot;font-family: Verdana, Arial, SunSans-Regular, sans-serif; font-size: small;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: Verdana, Arial, SunSans-Regular, sans-serif; font-size: small;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: Verdana, Arial, SunSans-Regular, sans-serif; font-size: 11pt;&quot;&gt;참고자료 :&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;a href=&quot;https://www.slf4j.org/&quot;&gt;https://www.slf4j.org/&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-left: 4em;&quot;&gt;&amp;nbsp;&amp;nbsp;&lt;a href=&quot;https://logging.apache.org/log4j/2.x/index.html&quot;&gt;https://logging.apache.org/log4j/2.x/index.html&lt;/a&gt;&lt;/p&gt;</description>
      <category>Language &amp;amp; Solution/Java</category>
      <category>log4j2</category>
      <category>slf4j</category>
      <author>새로비</author>
      <guid isPermaLink="true">https://engkimbs.tistory.com/861</guid>
      <comments>https://engkimbs.tistory.com/entry/Java-Library-slf4j-log4j2-%ED%95%9C-%EB%B0%A9-%EC%A0%95%EB%A6%AC#entry861comment</comments>
      <pubDate>Mon, 27 May 2019 14:58:25 +0900</pubDate>
    </item>
    <item>
      <title>[Spring REST API #6] Spring REST API Bad Request 처리</title>
      <link>https://engkimbs.tistory.com/entry/Spring-REST-API-6-Spring-REST-API-Bad-Request-%EC%B2%98%EB%A6%AC</link>
      <description>&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 14pt; color: rgb(0, 0, 0);&quot;&gt;&lt;span style=&quot;color: rgb(31, 218, 17);&quot;&gt;|&lt;/span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;font-size: 18.6667px;&quot;&gt;&lt;b&gt;Spring REST API Bad Request 처리&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;이번 시간은 지난 시간에 이어서 HTTP 요청에 대해 잘못된 입력값이 보내진 경우,&amp;nbsp;어떻게 처리를 할 것 인지에 대해 알아보겠습니다. 한 경우는 입력값이 없는 상태, 또 하나는 비즈니스 로직에 위배되는 값이 보내왔을 때입니다.&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;모든 소스 코드는 &lt;/span&gt;&lt;a href=&quot;https://github.com/engkimbs/spring-rest-api&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;&lt;span style=&quot;font-size: 14pt; color: rgb(0, 216, 255);&quot;&gt;여기&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;에서 보실 수 있습니다.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;프로젝트 구조&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;pre style=&quot;background-color:#2b2b2b;color:#a9b7c6;font-family:'굴림체';font-size:9.0pt;&quot;&gt;+---src&lt;br /&gt;|   +---main&lt;br /&gt;|   |   +---java&lt;br /&gt;|   |   |   \---com&lt;br /&gt;|   |   |       \---example&lt;br /&gt;|   |   |           \---springrestapi&lt;br /&gt;|   |   |               |   SpringRestApiApplication.java&lt;br /&gt;|   |   |               |&lt;br /&gt;|   |   |               +---common&lt;br /&gt;|   |   |               |       TestDescription.java&lt;br /&gt;|   |   |               |&lt;br /&gt;|   |   |               \---events&lt;br /&gt;|   |   |                       Event.java&lt;br /&gt;|   |   |                       EventController.java&lt;br /&gt;|   |   |                       EventDto.java&lt;br /&gt;|   |   |                       EventRepository.java&lt;br /&gt;|   |   |                       EventStatus.java&lt;br /&gt;|   |   |                       EventValidator.java&lt;br /&gt;|   |   |&lt;br /&gt;|   |   \---resources&lt;br /&gt;|   |       |   application.yml&lt;br /&gt;|   |       |&lt;br /&gt;|   |       +---static&lt;br /&gt;|   |       \---templates&lt;br /&gt;|   \---test&lt;br /&gt;|       \---java&lt;br /&gt;|           \---com&lt;br /&gt;|               \---example&lt;br /&gt;|                   \---springrestapi&lt;br /&gt;|                       |   SpringRestApiApplicationTests.java&lt;br /&gt;|                       |&lt;br /&gt;|                       \---events&lt;br /&gt;|                               EventControllerTests.java&lt;br /&gt;|                               EventTest.java&lt;/pre&gt;&lt;p&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;의존성 관리&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;pre style=&quot;background-color:#2b2b2b;color:#a9b7c6;font-family:'굴림체';font-size:9.0pt;&quot;&gt;&lt;p&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;dependencies&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &amp;lt;dependency&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;            &amp;lt;groupId&amp;gt;&lt;/span&gt;org.springframework.boot&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/groupId&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;            &amp;lt;artifactId&amp;gt;&lt;/span&gt;spring-boot-starter-data-jpa&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/artifactId&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &amp;lt;/dependency&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &amp;lt;dependency&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;            &amp;lt;groupId&amp;gt;&lt;/span&gt;org.springframework.boot&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/groupId&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;            &amp;lt;artifactId&amp;gt;&lt;/span&gt;spring-boot-starter-hateoas&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/artifactId&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &amp;lt;/dependency&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &amp;lt;dependency&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;            &amp;lt;groupId&amp;gt;&lt;/span&gt;org.springframework.boot&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/groupId&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;            &amp;lt;artifactId&amp;gt;&lt;/span&gt;spring-boot-starter-web&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/artifactId&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &amp;lt;/dependency&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#808080;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#808080;&quot;&gt;        &lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;dependency&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;            &amp;lt;groupId&amp;gt;&lt;/span&gt;org.projectlombok&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/groupId&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;            &amp;lt;artifactId&amp;gt;&lt;/span&gt;lombok&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/artifactId&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;            &amp;lt;optional&amp;gt;&lt;/span&gt;true&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/optional&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &amp;lt;/dependency&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &amp;lt;dependency&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;            &amp;lt;groupId&amp;gt;&lt;/span&gt;org.modelmapper&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/groupId&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;            &amp;lt;artifactId&amp;gt;&lt;/span&gt;modelmapper&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/artifactId&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;            &amp;lt;version&amp;gt;&lt;/span&gt;2.3.1&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/version&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &amp;lt;/dependency&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &amp;lt;dependency&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;            &amp;lt;groupId&amp;gt;&lt;/span&gt;org.springframework.boot&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/groupId&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;            &amp;lt;artifactId&amp;gt;&lt;/span&gt;spring-boot-starter-test&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/artifactId&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;            &amp;lt;scope&amp;gt;&lt;/span&gt;test&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/scope&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &amp;lt;/dependency&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &amp;lt;dependency&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;            &amp;lt;groupId&amp;gt;&lt;/span&gt;com.h2database&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/groupId&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;            &amp;lt;artifactId&amp;gt;&lt;/span&gt;h2&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#808080;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#808080;&quot;&gt;        &lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/dependency&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &amp;lt;dependency&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;            &amp;lt;groupId&amp;gt;&lt;/span&gt;org.springframework.restdocs&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/groupId&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;            &amp;lt;artifactId&amp;gt;&lt;/span&gt;spring-restdocs-mockmvc&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/artifactId&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;            &amp;lt;scope&amp;gt;&lt;/span&gt;test&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/scope&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &amp;lt;/dependency&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;    &amp;lt;/dependencies&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;/pre&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;설정 파일&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;pre style=&quot;background-color:#2b2b2b;color:#a9b7c6;font-family:'굴림체';font-size:9.0pt;&quot;&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;spring&lt;/span&gt;:&lt;br /&gt;  &lt;span style=&quot;color:#cc7832;&quot;&gt;jackson&lt;/span&gt;:&lt;br /&gt;    &lt;span style=&quot;color:#cc7832;&quot;&gt;deserialization&lt;/span&gt;:&lt;br /&gt;      &lt;span style=&quot;color:#cc7832;&quot;&gt;fail-on-unknown-properties&lt;/span&gt;: &lt;span style=&quot;color:#cc7832;&quot;&gt;true&lt;/span&gt;&lt;/pre&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;테스트&amp;nbsp;코드&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;pre style=&quot;background-color:#2b2b2b;color:#a9b7c6;font-family:'굴림체';font-size:9.0pt;&quot;&gt;&lt;span style=&quot;color:#bbb529;&quot;&gt;@Test&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#bbb529;&quot;&gt;@TestDescription&lt;/span&gt;(&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;입력값이 비어있을 때&quot;&lt;/span&gt;)&lt;br /&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;public void &lt;/span&gt;&lt;span style=&quot;color:#ffc66d;&quot;&gt;createEvent_Bad_Request_Empty_Input&lt;/span&gt;() &lt;span style=&quot;color:#cc7832;&quot;&gt;throws &lt;/span&gt;Exception {&lt;br /&gt;    EventDto eventDto = EventDto.&lt;span style=&quot;font-style:italic;&quot;&gt;builder&lt;/span&gt;().build()&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;    this&lt;/span&gt;.&lt;span style=&quot;color:#9876aa;&quot;&gt;mockMvc&lt;/span&gt;.perform(&lt;span style=&quot;font-style:italic;&quot;&gt;post&lt;/span&gt;(&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;/api/events&quot;&lt;/span&gt;)&lt;br /&gt;                .contentType(MediaType.&lt;span style=&quot;color:#9876aa;font-style:italic;&quot;&gt;APPLICATION_JSON_UTF8&lt;/span&gt;)&lt;br /&gt;                .content(&lt;span style=&quot;color:#cc7832;&quot;&gt;this&lt;/span&gt;.&lt;span style=&quot;color:#9876aa;&quot;&gt;objectMapper&lt;/span&gt;.writeValueAsString(eventDto)))&lt;br /&gt;            .andExpect(&lt;span style=&quot;font-style:italic;&quot;&gt;status&lt;/span&gt;().isBadRequest())&lt;br /&gt;    &lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color:#bbb529;&quot;&gt;@Test&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#bbb529;&quot;&gt;@TestDescription&lt;/span&gt;(&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;잘못된 입력값이 입력됬을 때&quot;&lt;/span&gt;)&lt;br /&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;public void &lt;/span&gt;&lt;span style=&quot;color:#ffc66d;&quot;&gt;createEvent_Bad_Request_Wrong_Input&lt;/span&gt;() &lt;span style=&quot;color:#cc7832;&quot;&gt;throws &lt;/span&gt;Exception {&lt;br /&gt;    EventDto eventDto = EventDto.&lt;span style=&quot;font-style:italic;&quot;&gt;builder&lt;/span&gt;()&lt;br /&gt;            .name(&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;Spring&quot;&lt;/span&gt;)&lt;br /&gt;            .description(&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;REST API Development&quot;&lt;/span&gt;)&lt;br /&gt;            .beginEnrollmentDateTime(LocalDateTime.&lt;span style=&quot;font-style:italic;&quot;&gt;of&lt;/span&gt;(&lt;span style=&quot;color:#6897bb;&quot;&gt;2010&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#6897bb;&quot;&gt;11&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#6897bb;&quot;&gt;23&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#6897bb;&quot;&gt;14&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#6897bb;&quot;&gt;23&lt;/span&gt;))&lt;br /&gt;            .closeEnrollmentDateTime(LocalDateTime.&lt;span style=&quot;font-style:italic;&quot;&gt;of&lt;/span&gt;(&lt;span style=&quot;color:#6897bb;&quot;&gt;2018&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#6897bb;&quot;&gt;11&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#6897bb;&quot;&gt;21&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#6897bb;&quot;&gt;14&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#6897bb;&quot;&gt;23&lt;/span&gt;))&lt;br /&gt;            .beginEventDateTime(LocalDateTime.&lt;span style=&quot;font-style:italic;&quot;&gt;of&lt;/span&gt;(&lt;span style=&quot;color:#6897bb;&quot;&gt;2018&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#6897bb;&quot;&gt;12&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#6897bb;&quot;&gt;24&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#6897bb;&quot;&gt;14&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#6897bb;&quot;&gt;30&lt;/span&gt;))&lt;br /&gt;            .endEventDateTime(LocalDateTime.&lt;span style=&quot;font-style:italic;&quot;&gt;of&lt;/span&gt;(&lt;span style=&quot;color:#6897bb;&quot;&gt;2018&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#6897bb;&quot;&gt;12&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#6897bb;&quot;&gt;6&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#6897bb;&quot;&gt;14&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#6897bb;&quot;&gt;30&lt;/span&gt;))&lt;br /&gt;            .basePrice(&lt;span style=&quot;color:#6897bb;&quot;&gt;10000&lt;/span&gt;)&lt;br /&gt;            .maxPrice(&lt;span style=&quot;color:#6897bb;&quot;&gt;200&lt;/span&gt;)&lt;br /&gt;            .limitOfEnrollment(&lt;span style=&quot;color:#6897bb;&quot;&gt;100&lt;/span&gt;)&lt;br /&gt;            .location(&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;D Start up Factory&quot;&lt;/span&gt;)&lt;br /&gt;            .build()&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;    this&lt;/span&gt;.&lt;span style=&quot;color:#9876aa;&quot;&gt;mockMvc&lt;/span&gt;.perform(&lt;span style=&quot;font-style:italic;&quot;&gt;post&lt;/span&gt;(&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;/api/events&quot;&lt;/span&gt;)&lt;br /&gt;            .contentType(MediaType.&lt;span style=&quot;color:#9876aa;font-style:italic;&quot;&gt;APPLICATION_JSON_UTF8&lt;/span&gt;)&lt;br /&gt;            .content(&lt;span style=&quot;color:#cc7832;&quot;&gt;this&lt;/span&gt;.&lt;span style=&quot;color:#9876aa;&quot;&gt;objectMapper&lt;/span&gt;.writeValueAsString(eventDto)))&lt;br /&gt;            .andExpect(&lt;span style=&quot;font-style:italic;&quot;&gt;status&lt;/span&gt;().isBadRequest())&lt;br /&gt;    &lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;}&lt;/pre&gt;&lt;ul style=&quot;list-style-type: disc;&quot;&gt;&lt;li&gt;&lt;font face=&quot;Arial Black&quot;&gt;첫 번째 테스트 코드는 입력값이 없을 때를 가정한 코드입니다. 두 번째 테스트 코드는 비즈니스 로직에 위배된 (등록시작날짜가 등록종료날짜보다 크던지 아니면 이벤트 시작날짜가 등록시작날짜보다 적은지 등) 경우를 테스트 하는 코드입니다.&lt;/font&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;소스 코드&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;pre style=&quot;background-color:#2b2b2b;color:#a9b7c6;font-family:'굴림체';font-size:9.0pt;&quot;&gt;&lt;span style=&quot;color:#bbb529;&quot;&gt;@Builder&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#bbb529;&quot;&gt;@NoArgsConstructor&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#bbb529;&quot;&gt;@AllArgsConstructor&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#bbb529;&quot;&gt;@Data&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;public class &lt;/span&gt;EventDto {&lt;br /&gt;&lt;br /&gt;    &lt;span style=&quot;color:#bbb529;&quot;&gt;@NotEmpty&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#bbb529;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;private &lt;/span&gt;String &lt;span style=&quot;color:#9876aa;&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color:#bbb529;&quot;&gt;@NotEmpty&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#bbb529;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;private &lt;/span&gt;String &lt;span style=&quot;color:#9876aa;&quot;&gt;description&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color:#bbb529;&quot;&gt;@NotNull&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#bbb529;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;private &lt;/span&gt;LocalDateTime &lt;span style=&quot;color:#9876aa;&quot;&gt;beginEnrollmentDateTime&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color:#bbb529;&quot;&gt;@NotNull&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#bbb529;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;private &lt;/span&gt;LocalDateTime &lt;span style=&quot;color:#9876aa;&quot;&gt;closeEnrollmentDateTime&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color:#bbb529;&quot;&gt;@NotNull&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#bbb529;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;private &lt;/span&gt;LocalDateTime &lt;span style=&quot;color:#9876aa;&quot;&gt;beginEventDateTime&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color:#bbb529;&quot;&gt;@NotNull&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#bbb529;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;private &lt;/span&gt;LocalDateTime &lt;span style=&quot;color:#9876aa;&quot;&gt;endEventDateTime&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;    private &lt;/span&gt;String &lt;span style=&quot;color:#9876aa;&quot;&gt;location&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color:#808080;&quot;&gt;// (optional)&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#808080;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color:#bbb529;&quot;&gt;@Min&lt;/span&gt;(&lt;span style=&quot;color:#6897bb;&quot;&gt;0&lt;/span&gt;)&lt;br /&gt;    &lt;span style=&quot;color:#cc7832;&quot;&gt;private int &lt;/span&gt;&lt;span style=&quot;color:#9876aa;&quot;&gt;basePrice&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color:#808080;&quot;&gt;// (optional)&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#808080;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color:#bbb529;&quot;&gt;@Min&lt;/span&gt;(&lt;span style=&quot;color:#6897bb;&quot;&gt;0&lt;/span&gt;)&lt;br /&gt;    &lt;span style=&quot;color:#cc7832;&quot;&gt;private int &lt;/span&gt;&lt;span style=&quot;color:#9876aa;&quot;&gt;maxPrice&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;  &lt;/span&gt;&lt;span style=&quot;color:#808080;&quot;&gt;// (optional)&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#808080;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color:#bbb529;&quot;&gt;@Min&lt;/span&gt;(&lt;span style=&quot;color:#6897bb;&quot;&gt;0&lt;/span&gt;)&lt;br /&gt;    &lt;span style=&quot;color:#cc7832;&quot;&gt;private int &lt;/span&gt;&lt;span style=&quot;color:#9876aa;&quot;&gt;limitOfEnrollment&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;}&lt;/span&gt;&lt;/pre&gt;&lt;ul style=&quot;list-style-type: disc;&quot;&gt;&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;입력값이 없을 경우를 체크할&amp;nbsp;경우,&amp;nbsp;@NotEmpty, @NotNull 어노테이션을 붙여서 이 프로퍼티가 값을 꼭 가져야하는 것을 명시합니다. 또한 basePrice, maxPrice 같은 정수값을 산정할 때 최소값 제한을 두어&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;( @Min(0)&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;&amp;nbsp;) 해당 프로퍼티에 잘못된 값이 들어오는 것을 방지할 수 있습니다.&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;&lt;pre style=&quot;background-color:#2b2b2b;color:#a9b7c6;font-family:'굴림체';font-size:9.0pt;&quot;&gt;&lt;span style=&quot;color:#bbb529;&quot;&gt;@Component&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;public class &lt;/span&gt;EventValidator {&lt;br /&gt;&lt;br /&gt;    &lt;span style=&quot;color:#cc7832;&quot;&gt;public void &lt;/span&gt;&lt;span style=&quot;color:#ffc66d;&quot;&gt;validate&lt;/span&gt;(EventDto eventDto&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;Errors errors) {&lt;br /&gt;        &lt;span style=&quot;color:#cc7832;&quot;&gt;if&lt;/span&gt;(eventDto.getBasePrice() &amp;gt; eventDto.getMaxPrice() &amp;amp;&amp;amp; eventDto.getMaxPrice() != &lt;span style=&quot;color:#6897bb;&quot;&gt;0&lt;/span&gt;) {&lt;br /&gt;            errors.rejectValue(&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;basePrice&quot;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;wrongValue&quot;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;BasePrice is wrong.&quot;&lt;/span&gt;)&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;            &lt;/span&gt;errors.rejectValue(&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;maxPrice&quot;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;wrongValue&quot;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;MaxPrice is wrong.&quot;&lt;/span&gt;)&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;        &lt;/span&gt;}&lt;br /&gt;&lt;br /&gt;        LocalDateTime endEventDateTime = eventDto.getEndEventDateTime()&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;        if&lt;/span&gt;(endEventDateTime.isBefore(eventDto.getBeginEventDateTime()) ||&lt;br /&gt;            endEventDateTime.isBefore(eventDto.getCloseEnrollmentDateTime()) ||&lt;br /&gt;            endEventDateTime.isBefore(eventDto.getBeginEnrollmentDateTime())) {&lt;br /&gt;            errors.rejectValue(&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;endEventDateTime&quot;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;wrongValue&quot;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;Wrong Date Time&quot;&lt;/span&gt;)&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;        &lt;/span&gt;}&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;&lt;ul style=&quot;list-style-type: disc;&quot;&gt;&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;요청값을 받는 EventDto의 프로퍼티들이 유효한 값을 가지고 있는 지 체크하는 EventValidator 클래스를 작성했습니다. 이 클래스의 인스턴스를 통해 비즈니스 로직에 위배되는 요청값을 걸러내고, 만약 잘못된 요청값이 있을 경우 BadRequest 로 클라이언트에 응답하는 로직을 구성할 것입니다.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;pre style=&quot;background-color:#2b2b2b;color:#a9b7c6;font-family:'굴림체';font-size:9.0pt;&quot;&gt;&lt;span style=&quot;color:#bbb529;&quot;&gt;@Controller&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#bbb529;&quot;&gt;@RequestMapping&lt;/span&gt;(&lt;span style=&quot;color:#d0d0ff;&quot;&gt;value &lt;/span&gt;= &lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;/api/events&quot;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#d0d0ff;&quot;&gt;produces &lt;/span&gt;= MediaTypes.&lt;span style=&quot;color:#9876aa;font-style:italic;&quot;&gt;HAL_JSON_UTF8_VALUE&lt;/span&gt;)&lt;br /&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;public class &lt;/span&gt;EventController {&lt;br /&gt;&lt;br /&gt;    &lt;span style=&quot;color:#bbb529;&quot;&gt;@Autowired&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#bbb529;&quot;&gt;    &lt;/span&gt;EventRepository &lt;span style=&quot;color:#9876aa;&quot;&gt;eventRepository&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color:#bbb529;&quot;&gt;@Autowired&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#bbb529;&quot;&gt;    &lt;/span&gt;ModelMapper &lt;span style=&quot;color:#9876aa;&quot;&gt;modelMapper&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color:#bbb529;&quot;&gt;@Autowired&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#bbb529;&quot;&gt;    &lt;/span&gt;EventValidator &lt;span style=&quot;color:#9876aa;&quot;&gt;eventValidator&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color:#bbb529;&quot;&gt;@PostMapping&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#bbb529;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;public &lt;/span&gt;ResponseEntity &lt;span style=&quot;color:#ffc66d;&quot;&gt;createEvent&lt;/span&gt;(&lt;span style=&quot;color:#bbb529;&quot;&gt;@RequestBody @Valid &lt;/span&gt;EventDto eventDto&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;Errors errors) {&lt;br /&gt;        &lt;span style=&quot;color:#cc7832;&quot;&gt;if&lt;/span&gt;(errors.hasErrors()) {&lt;br /&gt;            &lt;span style=&quot;color:#cc7832;&quot;&gt;return &lt;/span&gt;ResponseEntity.&lt;span style=&quot;font-style:italic;&quot;&gt;badRequest&lt;/span&gt;().build()&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;        &lt;/span&gt;}&lt;br /&gt;&lt;br /&gt;        &lt;span style=&quot;color:#9876aa;&quot;&gt;eventValidator&lt;/span&gt;.validate(eventDto&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;errors)&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;        if&lt;/span&gt;(errors.hasErrors()) {&lt;br /&gt;            &lt;span style=&quot;color:#cc7832;&quot;&gt;return &lt;/span&gt;ResponseEntity.&lt;span style=&quot;font-style:italic;&quot;&gt;badRequest&lt;/span&gt;().build()&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;        &lt;/span&gt;}&lt;br /&gt;&lt;br /&gt;        Event event = &lt;span style=&quot;color:#9876aa;&quot;&gt;modelMapper&lt;/span&gt;.map(eventDto&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;Event.&lt;span style=&quot;color:#cc7832;&quot;&gt;class&lt;/span&gt;)&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;        &lt;/span&gt;Event newEvent = &lt;span style=&quot;color:#cc7832;&quot;&gt;this&lt;/span&gt;.&lt;span style=&quot;color:#9876aa;&quot;&gt;eventRepository&lt;/span&gt;.save(event)&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;        &lt;/span&gt;URI createdURI = &lt;span style=&quot;font-style:italic;&quot;&gt;linkTo&lt;/span&gt;(EventController.&lt;span style=&quot;color:#cc7832;&quot;&gt;class&lt;/span&gt;).slash(newEvent.getId()).toUri()&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;        return &lt;/span&gt;ResponseEntity.&lt;span style=&quot;font-style:italic;&quot;&gt;created&lt;/span&gt;(createdURI).body(newEvent)&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;    &lt;/span&gt;}&lt;br /&gt;}&lt;/pre&gt;&lt;ul style=&quot;list-style-type: disc;&quot;&gt;&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;컨트롤러에서의 메서드에 위와 같이 @Valid 어노테이션을 붙이면 스프링에서 자동적으로 EventDto에 들어갈 값들을 체크하여 만약 에러가 발생했을 경우 Errors 객체에 집어넣습니다. @Valid 어노테이션은 위에 EventDto 클래스의 프로퍼티에 붙인 @NotNull, @NotEmpty 등의 어노테이션 정보를 토대로 해당 객체에 대한 유효성 여부를 검사합니다.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;eventValidator는 validate 메서드를 통해서 객체의 유효성 여부를 검사하며 만약 에러가 발생할 경우 Errors 객체에 집어넣습니다.&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;errors에 에러에 대한 정보가 있는 지 여부는 hasErrors 메서드를 통해 판별할 수 있습니다. 만약 에러가 있을 경우 badRequest를 반환하도록 로직을 구성했습니다.&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;결과 화면&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 347px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/99B1683F5CEAA92801&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F99B1683F5CEAA92801&quot; width=&quot;347&quot; height=&quot;97&quot; filename=&quot;캡처_2019_05_26_23_56_28_348.png&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;참조:&amp;nbsp;&lt;a href=&quot;https://www.inflearn.com/course/spring_rest-api/#&quot;&gt;https://www.inflearn.com/course/spring_rest-api/#&lt;/a&gt;&lt;/p&gt;&lt;p&gt;소스 코드 :&amp;nbsp;&lt;a href=&quot;https://github.com/engkimbs/spring-rest-api&quot;&gt;https://github.com/engkimbs/spring-rest-api&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;</description>
      <category>Spring/Spring Rest API</category>
      <category>Spring REST API</category>
      <author>새로비</author>
      <guid isPermaLink="true">https://engkimbs.tistory.com/860</guid>
      <comments>https://engkimbs.tistory.com/entry/Spring-REST-API-6-Spring-REST-API-Bad-Request-%EC%B2%98%EB%A6%AC#entry860comment</comments>
      <pubDate>Sun, 26 May 2019 23:56:47 +0900</pubDate>
    </item>
    <item>
      <title>[Spring REST API #5] Spring REST API 입력값 제한하기 및 에러 발생 처리</title>
      <link>https://engkimbs.tistory.com/entry/Spring-REST-API-5-Spring-REST-API-%EC%9E%85%EB%A0%A5%EA%B0%92-%EC%A0%9C%ED%95%9C%ED%95%98%EA%B8%B0-%EB%B0%8F-%EC%97%90%EB%9F%AC-%EB%B0%9C%EC%83%9D-%EC%B2%98%EB%A6%AC</link>
      <description>&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 14pt; color: rgb(0, 0, 0);&quot;&gt;|&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;b style=&quot;font-size: 18.6667px;&quot;&gt;Spring REST API 입력값 제한하기 및 Bad Request 처리&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;REST API를 설계할 시 Client 측에서 잘못된 데이터를 요청하거나 전송할 시 그것을 처리하는 로직을 만들어야 합니다. 여기서는 DTO(Data Transfer Object)와 스프링 부트에서 제공하는 설정 정보를 이용해 손쉽게 해당 로직을 적용할 것입니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;모든 소스 코드는 &lt;/span&gt;&lt;a href=&quot;https://github.com/engkimbs/spring-rest-api&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;&lt;span style=&quot;font-size: 14pt; color: rgb(0, 216, 255);&quot;&gt;여기&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;에서 보실 수 있습니다.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;프로젝트 구조&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;pre style=&quot;background-color:#2b2b2b;color:#a9b7c6;font-family:'굴림체';font-size:9.0pt;&quot;&gt;+---src&lt;br /&gt;|   +---main&lt;br /&gt;|   |   +---java&lt;br /&gt;|   |   |   \---com&lt;br /&gt;|   |   |       \---example&lt;br /&gt;|   |   |           \---springrestapi&lt;br /&gt;|   |   |               |   SpringRestApiApplication.java&lt;br /&gt;|   |   |               |&lt;br /&gt;|   |   |               \---events&lt;br /&gt;|   |   |                       Event.java&lt;br /&gt;|   |   |                       EventController.java&lt;br /&gt;|   |   |                       EventDto.java&lt;br /&gt;|   |   |                       EventRepository.java&lt;br /&gt;|   |   |                       EventStatus.java&lt;br /&gt;|   |   |&lt;br /&gt;|   |   \---resources&lt;br /&gt;|   |       |   application.yml&lt;br /&gt;|   |       |&lt;br /&gt;|   |       +---static&lt;br /&gt;|   |       \---templates&lt;br /&gt;|   \---test&lt;br /&gt;|       \---java&lt;br /&gt;|           \---com&lt;br /&gt;|               \---example&lt;br /&gt;|                   \---springrestapi&lt;br /&gt;|                       |   SpringRestApiApplicationTests.java&lt;br /&gt;|                       |&lt;br /&gt;|                       \---events&lt;br /&gt;|                               EventControllerTests.java&lt;br /&gt;|                               EventTest.java&lt;/pre&gt;&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;의존성 관리&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;pre style=&quot;background-color:#2b2b2b;color:#a9b7c6;font-family:'굴림체';font-size:9.0pt;&quot;&gt;&lt;p&gt;    &lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;dependencies&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &amp;lt;dependency&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;            &amp;lt;groupId&amp;gt;&lt;/span&gt;org.springframework.boot&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/groupId&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;            &amp;lt;artifactId&amp;gt;&lt;/span&gt;spring-boot-starter-data-jpa&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/artifactId&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &amp;lt;/dependency&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &amp;lt;dependency&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;            &amp;lt;groupId&amp;gt;&lt;/span&gt;org.springframework.boot&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/groupId&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;            &amp;lt;artifactId&amp;gt;&lt;/span&gt;spring-boot-starter-hateoas&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/artifactId&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &amp;lt;/dependency&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &amp;lt;dependency&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;            &amp;lt;groupId&amp;gt;&lt;/span&gt;org.springframework.boot&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/groupId&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;            &amp;lt;artifactId&amp;gt;&lt;/span&gt;spring-boot-starter-web&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/artifactId&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &amp;lt;/dependency&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#808080;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#808080;&quot;&gt;        &lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;dependency&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;            &amp;lt;groupId&amp;gt;&lt;/span&gt;org.projectlombok&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/groupId&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;            &amp;lt;artifactId&amp;gt;&lt;/span&gt;lombok&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/artifactId&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;            &amp;lt;optional&amp;gt;&lt;/span&gt;true&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/optional&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &amp;lt;/dependency&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &amp;lt;dependency&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;            &amp;lt;groupId&amp;gt;&lt;/span&gt;org.modelmapper&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/groupId&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;            &amp;lt;artifactId&amp;gt;&lt;/span&gt;modelmapper&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/artifactId&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;            &amp;lt;version&amp;gt;&lt;/span&gt;2.3.1&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/version&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &amp;lt;/dependency&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &amp;lt;dependency&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;            &amp;lt;groupId&amp;gt;&lt;/span&gt;org.springframework.boot&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/groupId&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;            &amp;lt;artifactId&amp;gt;&lt;/span&gt;spring-boot-starter-test&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/artifactId&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;            &amp;lt;scope&amp;gt;&lt;/span&gt;test&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/scope&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &amp;lt;/dependency&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &amp;lt;dependency&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;            &amp;lt;groupId&amp;gt;&lt;/span&gt;com.h2database&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/groupId&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;            &amp;lt;artifactId&amp;gt;&lt;/span&gt;h2&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#808080;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#808080;&quot;&gt;        &lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/dependency&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &amp;lt;dependency&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;            &amp;lt;groupId&amp;gt;&lt;/span&gt;org.springframework.restdocs&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/groupId&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;            &amp;lt;artifactId&amp;gt;&lt;/span&gt;spring-restdocs-mockmvc&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/artifactId&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;            &amp;lt;scope&amp;gt;&lt;/span&gt;test&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/scope&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &amp;lt;/dependency&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;    &amp;lt;/dependencies&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;/pre&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;&lt;b&gt;설정 파일&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;font face=&quot;Arial Black&quot;&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;application.yml&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;pre style=&quot;background-color:#2b2b2b;color:#a9b7c6;font-family:'굴림체';font-size:9.0pt;&quot;&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;spring&lt;/span&gt;:&lt;br /&gt;  &lt;span style=&quot;color:#cc7832;&quot;&gt;jackson&lt;/span&gt;:&lt;br /&gt;    &lt;span style=&quot;color:#cc7832;&quot;&gt;deserialization&lt;/span&gt;:&lt;br /&gt;      &lt;span style=&quot;color:#cc7832;&quot;&gt;fail-on-unknown-properties&lt;/span&gt;: &lt;span style=&quot;color:#cc7832;&quot;&gt;true&lt;/span&gt;&lt;/pre&gt;&lt;ul style=&quot;list-style-type: disc;&quot;&gt;&lt;li&gt;&lt;font face=&quot;Arial Black&quot;&gt;deserialization.fail-on-unkown-properties 옵션은 HTTP Body의 데이터를 자바 객체로 역직렬화할 때 객체의 프로퍼티에 매핑되는 값이 없다면 직렬화 작업을 fail시키는 옵션입니다. 이것을 통해 이상한 요청이 왔을 때 Bad Request를 반환합니다.&lt;/font&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;테스트&amp;nbsp;코드&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;pre style=&quot;background-color:#2b2b2b;color:#a9b7c6;font-family:'굴림체';font-size:9.0pt;&quot;&gt;&lt;span style=&quot;color:#bbb529;&quot;&gt;@Test&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;public void &lt;/span&gt;&lt;span style=&quot;color:#ffc66d;&quot;&gt;createEvent_Bad_Request&lt;/span&gt;() &lt;span style=&quot;color:#cc7832;&quot;&gt;throws &lt;/span&gt;Exception {&lt;br /&gt;    Event event = Event.&lt;span style=&quot;font-style:italic;&quot;&gt;builder&lt;/span&gt;()&lt;br /&gt;            .name(&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;Spring&quot;&lt;/span&gt;)&lt;br /&gt;            .description(&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;REST API Development&quot;&lt;/span&gt;)&lt;br /&gt;            .beginEnrollmentDateTime(LocalDateTime.&lt;span style=&quot;font-style:italic;&quot;&gt;of&lt;/span&gt;(&lt;span style=&quot;color:#6897bb;&quot;&gt;2010&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#6897bb;&quot;&gt;11&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#6897bb;&quot;&gt;23&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#6897bb;&quot;&gt;14&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#6897bb;&quot;&gt;23&lt;/span&gt;))&lt;br /&gt;            .closeEnrollmentDateTime(LocalDateTime.&lt;span style=&quot;font-style:italic;&quot;&gt;of&lt;/span&gt;(&lt;span style=&quot;color:#6897bb;&quot;&gt;2018&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#6897bb;&quot;&gt;11&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#6897bb;&quot;&gt;30&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#6897bb;&quot;&gt;14&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#6897bb;&quot;&gt;23&lt;/span&gt;))&lt;br /&gt;            .beginEventDateTime(LocalDateTime.&lt;span style=&quot;font-style:italic;&quot;&gt;of&lt;/span&gt;(&lt;span style=&quot;color:#6897bb;&quot;&gt;2018&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#6897bb;&quot;&gt;12&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#6897bb;&quot;&gt;5&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#6897bb;&quot;&gt;14&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#6897bb;&quot;&gt;30&lt;/span&gt;))&lt;br /&gt;            .endEventDateTime(LocalDateTime.&lt;span style=&quot;font-style:italic;&quot;&gt;of&lt;/span&gt;(&lt;span style=&quot;color:#6897bb;&quot;&gt;2018&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#6897bb;&quot;&gt;12&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#6897bb;&quot;&gt;6&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#6897bb;&quot;&gt;14&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#6897bb;&quot;&gt;30&lt;/span&gt;))&lt;br /&gt;            .basePrice(&lt;span style=&quot;color:#6897bb;&quot;&gt;100&lt;/span&gt;)&lt;br /&gt;            .maxPrice(&lt;span style=&quot;color:#6897bb;&quot;&gt;200&lt;/span&gt;)&lt;br /&gt;            .limitOfEnrollment(&lt;span style=&quot;color:#6897bb;&quot;&gt;100&lt;/span&gt;)&lt;br /&gt;            .location(&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;D Start up Factory&quot;&lt;/span&gt;)&lt;br /&gt;            .free(&lt;span style=&quot;color:#cc7832;&quot;&gt;true&lt;/span&gt;)&lt;br /&gt;            .offline(&lt;span style=&quot;color:#cc7832;&quot;&gt;false&lt;/span&gt;)&lt;br /&gt;            .eventStatus(EventStatus.&lt;span style=&quot;color:#9876aa;font-style:italic;&quot;&gt;PUBLISHED&lt;/span&gt;)&lt;br /&gt;            .build()&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color:#9876aa;&quot;&gt;mockMvc&lt;/span&gt;.perform(&lt;span style=&quot;font-style:italic;&quot;&gt;post&lt;/span&gt;(&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;/api/events/&quot;&lt;/span&gt;)&lt;br /&gt;            .contentType(MediaType.&lt;span style=&quot;color:#9876aa;font-style:italic;&quot;&gt;APPLICATION_JSON_UTF8&lt;/span&gt;)&lt;br /&gt;            .accept(MediaTypes.&lt;span style=&quot;color:#9876aa;font-style:italic;&quot;&gt;HAL_JSON_UTF8&lt;/span&gt;)&lt;br /&gt;            .content(&lt;span style=&quot;color:#9876aa;&quot;&gt;objectMapper&lt;/span&gt;.writeValueAsString(event)))&lt;br /&gt;            .andDo(&lt;span style=&quot;font-style:italic;&quot;&gt;print&lt;/span&gt;())&lt;br /&gt;            .andExpect(&lt;span style=&quot;font-style:italic;&quot;&gt;status&lt;/span&gt;().isBadRequest())&lt;br /&gt;    &lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;}&lt;/pre&gt;&lt;ul style=&quot;list-style-type: disc;&quot;&gt;&lt;li&gt;&lt;font face=&quot;Arial Black&quot;&gt;잘못된 요청이 왔을 때를 테스트 하기 위해 작성된 코드입니다.&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;/font&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;소스 코드&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;pre style=&quot;background-color:#2b2b2b;color:#a9b7c6;font-family:'굴림체';font-size:9.0pt;&quot;&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;package &lt;/span&gt;com.example.springrestapi.events&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;import &lt;/span&gt;lombok.*&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;import &lt;/span&gt;javax.persistence.*&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;import &lt;/span&gt;java.time.LocalDateTime&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#629755;font-style:italic;&quot;&gt;/**&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#629755;font-style:italic;&quot;&gt; * In case of referencing between entities, using default @EqualsAndHashCode stack overflow.&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#629755;font-style:italic;&quot;&gt; * Therefore, redefine the way of checking equality is the best practice as below.&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#629755;font-style:italic;&quot;&gt; * Also, you shouldn't use @Data annotation because it uses default @EqualsAndHashCode&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#629755;font-style:italic;&quot;&gt; */&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#bbb529;&quot;&gt;@Entity&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#bbb529;&quot;&gt;@Builder&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#bbb529;&quot;&gt;@AllArgsConstructor&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#bbb529;&quot;&gt;@NoArgsConstructor&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#bbb529;&quot;&gt;@Getter&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#bbb529;&quot;&gt;@Setter&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#bbb529;&quot;&gt;@EqualsAndHashCode&lt;/span&gt;(&lt;span style=&quot;color:#d0d0ff;&quot;&gt;of &lt;/span&gt;= &lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;id&quot;&lt;/span&gt;)&lt;br /&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;public class &lt;/span&gt;Event {&lt;br /&gt;&lt;br /&gt;    &lt;span style=&quot;color:#bbb529;&quot;&gt;@Id @GeneratedValue&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#bbb529;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;private &lt;/span&gt;Integer &lt;span style=&quot;color:#9876aa;&quot;&gt;id&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;    private &lt;/span&gt;String &lt;span style=&quot;color:#9876aa;&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;    private &lt;/span&gt;String &lt;span style=&quot;color:#9876aa;&quot;&gt;description&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;    private &lt;/span&gt;LocalDateTime &lt;span style=&quot;color:#9876aa;&quot;&gt;beginEnrollmentDateTime&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;    private &lt;/span&gt;LocalDateTime &lt;span style=&quot;color:#9876aa;&quot;&gt;closeEnrollmentDateTime&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;    private &lt;/span&gt;LocalDateTime &lt;span style=&quot;color:#9876aa;&quot;&gt;beginEventDateTime&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;    private &lt;/span&gt;LocalDateTime &lt;span style=&quot;color:#9876aa;&quot;&gt;endEventDateTime&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;    private &lt;/span&gt;String &lt;span style=&quot;color:#9876aa;&quot;&gt;location&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color:#808080;&quot;&gt;// (optional)&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#808080;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;private int &lt;/span&gt;&lt;span style=&quot;color:#9876aa;&quot;&gt;basePrice&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color:#808080;&quot;&gt;// (optional)&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#808080;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;private int &lt;/span&gt;&lt;span style=&quot;color:#9876aa;&quot;&gt;maxPrice&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;  &lt;/span&gt;&lt;span style=&quot;color:#808080;&quot;&gt;// (optional)&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#808080;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;private int &lt;/span&gt;&lt;span style=&quot;color:#9876aa;&quot;&gt;limitOfEnrollment&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;    private boolean &lt;/span&gt;&lt;span style=&quot;color:#9876aa;&quot;&gt;offline&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;    private boolean &lt;/span&gt;&lt;span style=&quot;color:#9876aa;&quot;&gt;free&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color:#bbb529;&quot;&gt;@Enumerated&lt;/span&gt;(EnumType.&lt;span style=&quot;color:#9876aa;font-style:italic;&quot;&gt;STRING&lt;/span&gt;)&lt;br /&gt;    &lt;span style=&quot;color:#cc7832;&quot;&gt;private &lt;/span&gt;EventStatus &lt;span style=&quot;color:#9876aa;&quot;&gt;eventStatus &lt;/span&gt;= EventStatus.&lt;span style=&quot;color:#9876aa;font-style:italic;&quot;&gt;DRAFT&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;}&lt;/pre&gt;&lt;pre style=&quot;background-color:#2b2b2b;color:#a9b7c6;font-family:'굴림체';font-size:9.0pt;&quot;&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;package &lt;/span&gt;com.example.springrestapi.events&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;import &lt;/span&gt;lombok.&lt;span style=&quot;color:#bbb529;&quot;&gt;AllArgsConstructor&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;import &lt;/span&gt;lombok.&lt;span style=&quot;color:#bbb529;&quot;&gt;Builder&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;import &lt;/span&gt;lombok.&lt;span style=&quot;color:#bbb529;&quot;&gt;Data&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;import &lt;/span&gt;lombok.&lt;span style=&quot;color:#bbb529;&quot;&gt;NoArgsConstructor&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;import &lt;/span&gt;java.time.LocalDateTime&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#bbb529;&quot;&gt;@Builder&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#bbb529;&quot;&gt;@NoArgsConstructor&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#bbb529;&quot;&gt;@AllArgsConstructor&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#bbb529;&quot;&gt;@Data&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;public class &lt;/span&gt;EventDto {&lt;br /&gt;&lt;br /&gt;    &lt;span style=&quot;color:#cc7832;&quot;&gt;private &lt;/span&gt;String &lt;span style=&quot;color:#9876aa;&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;    private &lt;/span&gt;String &lt;span style=&quot;color:#9876aa;&quot;&gt;description&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;    private &lt;/span&gt;LocalDateTime &lt;span style=&quot;color:#9876aa;&quot;&gt;beginEnrollmentDateTime&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;    private &lt;/span&gt;LocalDateTime &lt;span style=&quot;color:#9876aa;&quot;&gt;closeEnrollmentDateTime&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;    private &lt;/span&gt;LocalDateTime &lt;span style=&quot;color:#9876aa;&quot;&gt;beginEventDateTime&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;    private &lt;/span&gt;LocalDateTime &lt;span style=&quot;color:#9876aa;&quot;&gt;endEventDateTime&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;    private &lt;/span&gt;String &lt;span style=&quot;color:#9876aa;&quot;&gt;location&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color:#808080;&quot;&gt;// (optional)&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#808080;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;private int &lt;/span&gt;&lt;span style=&quot;color:#9876aa;&quot;&gt;basePrice&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color:#808080;&quot;&gt;// (optional)&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#808080;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;private int &lt;/span&gt;&lt;span style=&quot;color:#9876aa;&quot;&gt;maxPrice&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;  &lt;/span&gt;&lt;span style=&quot;color:#808080;&quot;&gt;// (optional)&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#808080;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;private int &lt;/span&gt;&lt;span style=&quot;color:#9876aa;&quot;&gt;limitOfEnrollment&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;}&lt;/pre&gt;&lt;ul style=&quot;list-style-type: disc;&quot;&gt;&lt;li&gt;&lt;b&gt;HTTP Body에 있는 데이터를 역직렬화 시, 해당 데이터를 EventDto&amp;nbsp;클래스의 프로퍼티에 매핑시킵니다.&amp;nbsp;&lt;/b&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;위 설정 파일에 있는&amp;nbsp;&lt;/b&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;fail-on-unkown-properties = false&amp;nbsp;옵션이 없다면 만약 HTTP Body에 있는 데이터는 클래스에 존재하는 프로퍼티에 대한 정보만 매핑시키고 나머지 다른 요청값들은 무시할 것입니다.&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;&lt;pre style=&quot;background-color:#2b2b2b;color:#a9b7c6;font-family:'굴림체';font-size:9.0pt;&quot;&gt;&lt;span style=&quot;color:#bbb529;&quot;&gt;@Controller&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#bbb529;&quot;&gt;@RequestMapping&lt;/span&gt;(&lt;span style=&quot;color:#d0d0ff;&quot;&gt;value &lt;/span&gt;= &lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;/api/events&quot;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#d0d0ff;&quot;&gt;produces &lt;/span&gt;= MediaTypes.&lt;span style=&quot;color:#9876aa;font-style:italic;&quot;&gt;HAL_JSON_UTF8_VALUE&lt;/span&gt;)&lt;br /&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;public class &lt;/span&gt;EventController {&lt;br /&gt;&lt;br /&gt;    &lt;span style=&quot;color:#bbb529;&quot;&gt;@Autowired&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#bbb529;&quot;&gt;    &lt;/span&gt;EventRepository &lt;span style=&quot;color:#9876aa;&quot;&gt;eventRepository&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color:#bbb529;&quot;&gt;@Autowired&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#bbb529;&quot;&gt;    &lt;/span&gt;ModelMapper &lt;span style=&quot;color:#9876aa;&quot;&gt;modelMapper&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color:#bbb529;&quot;&gt;@PostMapping&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#bbb529;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;public &lt;/span&gt;ResponseEntity &lt;span style=&quot;color:#ffc66d;&quot;&gt;createEvent&lt;/span&gt;(&lt;span style=&quot;color:#bbb529;&quot;&gt;@RequestBody &lt;/span&gt;EventDto eventDto) {&lt;br /&gt;        Event event = &lt;span style=&quot;color:#9876aa;&quot;&gt;modelMapper&lt;/span&gt;.map(eventDto&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;Event.&lt;span style=&quot;color:#cc7832;&quot;&gt;class&lt;/span&gt;)&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;        &lt;/span&gt;Event newEvent = &lt;span style=&quot;color:#cc7832;&quot;&gt;this&lt;/span&gt;.&lt;span style=&quot;color:#9876aa;&quot;&gt;eventRepository&lt;/span&gt;.save(event)&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;        &lt;/span&gt;URI createdURI = &lt;span style=&quot;font-style:italic;&quot;&gt;linkTo&lt;/span&gt;(EventController.&lt;span style=&quot;color:#cc7832;&quot;&gt;class&lt;/span&gt;).slash(newEvent.getId()).toUri()&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;        return &lt;/span&gt;ResponseEntity.&lt;span style=&quot;font-style:italic;&quot;&gt;created&lt;/span&gt;(createdURI).body(newEvent)&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;    &lt;/span&gt;}&lt;br /&gt;}&lt;/pre&gt;&lt;ul style=&quot;list-style-type: disc;&quot;&gt;&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;ModelMapper 객체를 통해서 자동적으로 eventDto 인스턴스를 Event 클래스의 인스턴스에 매핑시킬 수 있습니다. (Event event = modelMapper.map(eventDto, Event.class))&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;ModelMapper 객체를 빈(bean)으로 등록하기 위해서는 아래와 같이 @Bean 어노테이션을 붙인 코드를 작성해야합니다.&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;&lt;pre style=&quot;background-color:#2b2b2b;color:#a9b7c6;font-family:'굴림체';font-size:9.0pt;&quot;&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;import &lt;/span&gt;org.modelmapper.ModelMapper&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;import &lt;/span&gt;org.springframework.boot.SpringApplication&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;import &lt;/span&gt;org.springframework.boot.autoconfigure.&lt;span style=&quot;color:#bbb529;&quot;&gt;SpringBootApplication&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;import &lt;/span&gt;org.springframework.context.annotation.&lt;span style=&quot;color:#bbb529;&quot;&gt;Bean&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#bbb529;&quot;&gt;@SpringBootApplication&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;public class &lt;/span&gt;SpringRestApiApplication {&lt;br /&gt;&lt;br /&gt;    &lt;span style=&quot;color:#cc7832;&quot;&gt;public static void &lt;/span&gt;&lt;span style=&quot;color:#ffc66d;&quot;&gt;main&lt;/span&gt;(String[] args) {&lt;br /&gt;        SpringApplication.&lt;span style=&quot;font-style:italic;&quot;&gt;run&lt;/span&gt;(SpringRestApiApplication.&lt;span style=&quot;color:#cc7832;&quot;&gt;class, &lt;/span&gt;args)&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;    &lt;/span&gt;}&lt;br /&gt;&lt;br /&gt;    &lt;span style=&quot;color:#bbb529;&quot;&gt;@Bean&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#bbb529;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;public &lt;/span&gt;ModelMapper &lt;span style=&quot;color:#ffc66d;&quot;&gt;modelMapper&lt;/span&gt;() {&lt;br /&gt;        &lt;span style=&quot;color:#cc7832;&quot;&gt;return new &lt;/span&gt;ModelMapper()&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;    &lt;/span&gt;}&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;결과 화면&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;요청&lt;/b&gt;&lt;/p&gt;&lt;pre style=&quot;background-color:#2b2b2b;color:#a9b7c6;font-family:'굴림체';font-size:9.0pt;&quot;&gt;MockHttpServletRequest:&lt;br /&gt;HTTP Method = POST&lt;br /&gt;Request URI = /api/events/&lt;br /&gt;Parameters = {}&lt;br /&gt;Headers = [Content-Type:&quot;application/json;charset=UTF-8&quot;, Accept:&quot;application/hal+json;charset=UTF-8&quot;]&lt;br /&gt;Body = {&quot;id&quot;:null,&quot;name&quot;:&quot;Spring&quot;,&quot;description&quot;:&quot;REST API Development&quot;,&quot;beginEnrollmentDateTime&quot;:&quot;2010-11-23T14:23:00&quot;,&quot;closeEnrollmentDateTime&quot;:&quot;2018-11-30T14:23:00&quot;,&quot;beginEventDateTime&quot;:&quot;2018-12-05T14:30:00&quot;,&quot;endEventDateTime&quot;:&quot;2018-12-06T14:30:00&quot;,&quot;location&quot;:&quot;D Start up Factory&quot;,&quot;basePrice&quot;:100,&quot;maxPrice&quot;:200,&quot;limitOfEnrollment&quot;:100,&quot;offline&quot;:false,&quot;free&quot;:true,&quot;eventStatus&quot;:&quot;PUBLISHED&quot;}&lt;br /&gt;Session Attrs = {}&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;응답&lt;/b&gt;&lt;/p&gt;&lt;pre style=&quot;background-color:#2b2b2b;color:#a9b7c6;font-family:'굴림체';font-size:9.0pt;&quot;&gt;MockHttpServletResponse:&lt;br /&gt;Status = 400&lt;br /&gt;Error message = null&lt;br /&gt;Headers = []&lt;br /&gt;Content type = null&lt;br /&gt;Body =&lt;br /&gt;Forwarded URL = null&lt;br /&gt;Redirected URL = null&lt;br /&gt;Cookies = []&lt;/pre&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;참조:&amp;nbsp;&lt;a href=&quot;https://www.inflearn.com/course/spring_rest-api/#&quot;&gt;https://www.inflearn.com/course/spring_rest-api/#&lt;/a&gt;&lt;/p&gt;&lt;p&gt;소스 코드 :&amp;nbsp;&lt;a href=&quot;https://github.com/engkimbs/spring-rest-api&quot;&gt;https://github.com/engkimbs/spring-rest-api&lt;/a&gt;&lt;/p&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;</description>
      <category>Spring/Spring Rest API</category>
      <category>Spring REST API</category>
      <author>새로비</author>
      <guid isPermaLink="true">https://engkimbs.tistory.com/859</guid>
      <comments>https://engkimbs.tistory.com/entry/Spring-REST-API-5-Spring-REST-API-%EC%9E%85%EB%A0%A5%EA%B0%92-%EC%A0%9C%ED%95%9C%ED%95%98%EA%B8%B0-%EB%B0%8F-%EC%97%90%EB%9F%AC-%EB%B0%9C%EC%83%9D-%EC%B2%98%EB%A6%AC#entry859comment</comments>
      <pubDate>Sun, 26 May 2019 22:31:49 +0900</pubDate>
    </item>
    <item>
      <title>[Spring REST API #4] Spring REST API 테스트 클래스 생성 및 201 응답 받기</title>
      <link>https://engkimbs.tistory.com/entry/Spring-REST-API-4-Spring-REST-API-%ED%85%8C%EC%8A%A4%ED%8A%B8-%ED%81%B4%EB%9E%98%EC%8A%A4-%EC%83%9D%EC%84%B1-%EB%B0%8F-201-%EC%9D%91%EB%8B%B5-%EB%B0%9B%EA%B8%B0</link>
      <description>&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;&lt;span style=&quot;color: rgb(31, 218, 17);&quot;&gt;|&lt;/span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;font-size: 18.6667px;&quot;&gt;&lt;b&gt;Spring REST API&amp;nbsp;&amp;nbsp;테스트 클래스 생성 및 201 응답 받기&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;b style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;모든 소스 코드는&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://github.com/engkimbs/spring-rest-api&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;&lt;span style=&quot;font-size: 14pt; color: rgb(0, 216, 255);&quot;&gt;여기&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;에서 보실 수 있습니다.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;프로젝트 구조&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;pre style=&quot;background-color:#2b2b2b;color:#a9b7c6;font-family:'굴림체';font-size:9.0pt;&quot;&gt;+---src&lt;br /&gt;|   +---main&lt;br /&gt;|   |   +---java&lt;br /&gt;|   |   |   \---com&lt;br /&gt;|   |   |       \---example&lt;br /&gt;|   |   |           \---springrestapi&lt;br /&gt;|   |   |               |   SpringRestApiApplication.java&lt;br /&gt;|   |   |               |&lt;br /&gt;|   |   |               \---events&lt;br /&gt;|   |   |                       Event.java&lt;br /&gt;|   |   |                       EventController.java&lt;br /&gt;|   |   |                       EventRepository.java&lt;br /&gt;|   |   |                       EventStatus.java&lt;br /&gt;|   |   |&lt;br /&gt;|   |   \---resources&lt;br /&gt;|   |       |   application.properties&lt;br /&gt;|   |       |&lt;br /&gt;|   |       +---static&lt;br /&gt;|   |       \---templates&lt;br /&gt;|   \---test&lt;br /&gt;|       \---java&lt;br /&gt;|           \---com&lt;br /&gt;|               \---example&lt;br /&gt;|                   \---springrestapi&lt;br /&gt;|                       |   SpringRestApiApplicationTests.java&lt;br /&gt;|                       |&lt;br /&gt;|                       \---events&lt;br /&gt;|                               EventControllerTests.java&lt;br /&gt;|                               EventTest.java&lt;/pre&gt;&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;의존성 관리&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;pre style=&quot;background-color:#2b2b2b;color:#a9b7c6;font-family:'굴림체';font-size:9.0pt;&quot;&gt;&lt;p&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;dependencies&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &amp;lt;dependency&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;            &amp;lt;groupId&amp;gt;&lt;/span&gt;org.springframework.boot&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/groupId&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;            &amp;lt;artifactId&amp;gt;&lt;/span&gt;spring-boot-starter-data-jpa&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/artifactId&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &amp;lt;/dependency&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &amp;lt;dependency&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;            &amp;lt;groupId&amp;gt;&lt;/span&gt;org.springframework.boot&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/groupId&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;            &amp;lt;artifactId&amp;gt;&lt;/span&gt;spring-boot-starter-hateoas&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/artifactId&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &amp;lt;/dependency&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &amp;lt;dependency&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;            &amp;lt;groupId&amp;gt;&lt;/span&gt;org.springframework.boot&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/groupId&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;            &amp;lt;artifactId&amp;gt;&lt;/span&gt;spring-boot-starter-web&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/artifactId&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &amp;lt;/dependency&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#808080;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#808080;&quot;&gt;        &lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;dependency&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;            &amp;lt;groupId&amp;gt;&lt;/span&gt;org.projectlombok&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/groupId&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;            &amp;lt;artifactId&amp;gt;&lt;/span&gt;lombok&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/artifactId&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;            &amp;lt;optional&amp;gt;&lt;/span&gt;true&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/optional&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &amp;lt;/dependency&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &amp;lt;dependency&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;            &amp;lt;groupId&amp;gt;&lt;/span&gt;org.modelmapper&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/groupId&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;            &amp;lt;artifactId&amp;gt;&lt;/span&gt;modelmapper&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/artifactId&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;            &amp;lt;version&amp;gt;&lt;/span&gt;2.3.1&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/version&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &amp;lt;/dependency&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &amp;lt;dependency&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;            &amp;lt;groupId&amp;gt;&lt;/span&gt;org.springframework.boot&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/groupId&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;            &amp;lt;artifactId&amp;gt;&lt;/span&gt;spring-boot-starter-test&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/artifactId&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;            &amp;lt;scope&amp;gt;&lt;/span&gt;test&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/scope&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &amp;lt;/dependency&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &amp;lt;dependency&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;            &amp;lt;groupId&amp;gt;&lt;/span&gt;com.h2database&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/groupId&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;            &amp;lt;artifactId&amp;gt;&lt;/span&gt;h2&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#808080;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#808080;&quot;&gt;        &lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/dependency&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &amp;lt;dependency&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;            &amp;lt;groupId&amp;gt;&lt;/span&gt;org.springframework.restdocs&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/groupId&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;            &amp;lt;artifactId&amp;gt;&lt;/span&gt;spring-restdocs-mockmvc&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/artifactId&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;            &amp;lt;scope&amp;gt;&lt;/span&gt;test&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/scope&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &amp;lt;/dependency&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;    &amp;lt;/dependencies&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;/pre&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;테스트&amp;nbsp;코드&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;pre style=&quot;background-color:#2b2b2b;color:#a9b7c6;font-family:'굴림체';font-size:9.0pt;&quot;&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;package &lt;/span&gt;com.example.springrestapi.events&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;import &lt;/span&gt;com.fasterxml.jackson.databind.ObjectMapper&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;import &lt;/span&gt;org.junit.&lt;span style=&quot;color:#bbb529;&quot;&gt;Test&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;import &lt;/span&gt;org.junit.runner.&lt;span style=&quot;color:#bbb529;&quot;&gt;RunWith&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;import &lt;/span&gt;org.springframework.beans.factory.annotation.&lt;span style=&quot;color:#bbb529;&quot;&gt;Autowired&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;import &lt;/span&gt;org.springframework.boot.test.autoconfigure.web.servlet.&lt;span style=&quot;color:#bbb529;&quot;&gt;AutoConfigureMockMvc&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;import &lt;/span&gt;org.springframework.boot.test.context.&lt;span style=&quot;color:#bbb529;&quot;&gt;SpringBootTest&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;import &lt;/span&gt;org.springframework.hateoas.MediaTypes&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;import &lt;/span&gt;org.springframework.http.HttpHeaders&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;import &lt;/span&gt;org.springframework.http.MediaType&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;import &lt;/span&gt;org.springframework.test.context.junit4.SpringRunner&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;import &lt;/span&gt;org.springframework.test.web.servlet.MockMvc&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;import &lt;/span&gt;java.time.LocalDateTime&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;import static &lt;/span&gt;org.springframework.test.web.servlet.request.MockMvcRequestBuilders.&lt;span style=&quot;font-style:italic;&quot;&gt;post&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;import static &lt;/span&gt;org.springframework.test.web.servlet.result.MockMvcResultHandlers.&lt;span style=&quot;font-style:italic;&quot;&gt;print&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;import static &lt;/span&gt;org.springframework.test.web.servlet.result.MockMvcResultMatchers.*&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#bbb529;&quot;&gt;@RunWith&lt;/span&gt;(SpringRunner.&lt;span style=&quot;color:#cc7832;&quot;&gt;class&lt;/span&gt;)&lt;br /&gt;&lt;span style=&quot;color:#bbb529;&quot;&gt;@SpringBootTest &lt;/span&gt;&lt;span style=&quot;color:#808080;&quot;&gt;// Register all beans to test. We can use @WebMvcTest to test as slice test. But this way is easy.&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#bbb529;&quot;&gt;@AutoConfigureMockMvc&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;public class &lt;/span&gt;EventControllerTests {&lt;br /&gt;&lt;br /&gt;    &lt;span style=&quot;color:#bbb529;&quot;&gt;@Autowired &lt;/span&gt;&lt;span style=&quot;color:#808080;&quot;&gt;// Enable to test cases because web server doesn't work&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#808080;&quot;&gt;    &lt;/span&gt;MockMvc &lt;span style=&quot;color:#9876aa;&quot;&gt;mockMvc&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color:#bbb529;&quot;&gt;@Autowired&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#bbb529;&quot;&gt;    &lt;/span&gt;ObjectMapper &lt;span style=&quot;color:#9876aa;&quot;&gt;objectMapper&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color:#bbb529;&quot;&gt;@Test&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#bbb529;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;public void &lt;/span&gt;&lt;span style=&quot;color:#ffc66d;&quot;&gt;createEvent&lt;/span&gt;() &lt;span style=&quot;color:#cc7832;&quot;&gt;throws &lt;/span&gt;Exception {&lt;br /&gt;        Event event = Event.&lt;span style=&quot;font-style:italic;&quot;&gt;builder&lt;/span&gt;()&lt;br /&gt;                .name(&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;Spring&quot;&lt;/span&gt;)&lt;br /&gt;                .description(&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;REST API Development&quot;&lt;/span&gt;)&lt;br /&gt;                .beginEnrollmentDateTime(LocalDateTime.&lt;span style=&quot;font-style:italic;&quot;&gt;of&lt;/span&gt;(&lt;span style=&quot;color:#6897bb;&quot;&gt;2010&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#6897bb;&quot;&gt;11&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#6897bb;&quot;&gt;23&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#6897bb;&quot;&gt;14&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#6897bb;&quot;&gt;23&lt;/span&gt;))&lt;br /&gt;                .closeEnrollmentDateTime(LocalDateTime.&lt;span style=&quot;font-style:italic;&quot;&gt;of&lt;/span&gt;(&lt;span style=&quot;color:#6897bb;&quot;&gt;2018&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#6897bb;&quot;&gt;11&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#6897bb;&quot;&gt;30&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#6897bb;&quot;&gt;14&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#6897bb;&quot;&gt;23&lt;/span&gt;))&lt;br /&gt;                .beginEventDateTime(LocalDateTime.&lt;span style=&quot;font-style:italic;&quot;&gt;of&lt;/span&gt;(&lt;span style=&quot;color:#6897bb;&quot;&gt;2018&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#6897bb;&quot;&gt;12&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#6897bb;&quot;&gt;5&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#6897bb;&quot;&gt;14&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#6897bb;&quot;&gt;30&lt;/span&gt;))&lt;br /&gt;                .endEventDateTime(LocalDateTime.&lt;span style=&quot;font-style:italic;&quot;&gt;of&lt;/span&gt;(&lt;span style=&quot;color:#6897bb;&quot;&gt;2018&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#6897bb;&quot;&gt;12&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#6897bb;&quot;&gt;6&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#6897bb;&quot;&gt;14&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#6897bb;&quot;&gt;30&lt;/span&gt;))&lt;br /&gt;                .basePrice(&lt;span style=&quot;color:#6897bb;&quot;&gt;100&lt;/span&gt;)&lt;br /&gt;                .maxPrice(&lt;span style=&quot;color:#6897bb;&quot;&gt;200&lt;/span&gt;)&lt;br /&gt;                .limitOfEnrollment(&lt;span style=&quot;color:#6897bb;&quot;&gt;100&lt;/span&gt;)&lt;br /&gt;                .location(&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;D Start up Factory&quot;&lt;/span&gt;)&lt;br /&gt;                .build()&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;        &lt;/span&gt;&lt;span style=&quot;color:#9876aa;&quot;&gt;mockMvc&lt;/span&gt;.perform(&lt;span style=&quot;font-style:italic;&quot;&gt;post&lt;/span&gt;(&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;/api/events/&quot;&lt;/span&gt;)&lt;br /&gt;                        .contentType(MediaType.&lt;span style=&quot;color:#9876aa;font-style:italic;&quot;&gt;APPLICATION_JSON_UTF8&lt;/span&gt;)&lt;br /&gt;                        .accept(MediaTypes.&lt;span style=&quot;color:#9876aa;font-style:italic;&quot;&gt;HAL_JSON_UTF8&lt;/span&gt;)&lt;br /&gt;                        .content(&lt;span style=&quot;color:#9876aa;&quot;&gt;objectMapper&lt;/span&gt;.writeValueAsString(event)))&lt;br /&gt;                    .andDo(&lt;span style=&quot;font-style:italic;&quot;&gt;print&lt;/span&gt;())&lt;br /&gt;                    .andExpect(&lt;span style=&quot;font-style:italic;&quot;&gt;status&lt;/span&gt;().isCreated())&lt;br /&gt;                    .andExpect(&lt;span style=&quot;font-style:italic;&quot;&gt;jsonPath&lt;/span&gt;(&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;id&quot;&lt;/span&gt;).exists())&lt;br /&gt;                    .andExpect(&lt;span style=&quot;font-style:italic;&quot;&gt;header&lt;/span&gt;().exists(HttpHeaders.&lt;span style=&quot;color:#9876aa;font-style:italic;&quot;&gt;LOCATION&lt;/span&gt;))&lt;br /&gt;                    .andExpect(&lt;span style=&quot;font-style:italic;&quot;&gt;header&lt;/span&gt;().string(HttpHeaders.&lt;span style=&quot;color:#9876aa;font-style:italic;&quot;&gt;CONTENT_TYPE&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;MediaTypes.&lt;span style=&quot;color:#9876aa;font-style:italic;&quot;&gt;HAL_JSON_UTF8_VALUE&lt;/span&gt;))&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;    &lt;/span&gt;}&lt;br /&gt;&lt;br /&gt;}&lt;/pre&gt;&lt;ul style=&quot;list-style-type: disc;&quot;&gt;&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;이벤트 빌더를 써서 이벤트 객체를 생성하여 테스트하는 코드다.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;위에서 생성한 이벤트 객체를 /api/events/ 경로로 POST 메서드를 통해 이벤트 데이터를 생성하는 로직을 검사하는 테스트다.&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;실제 웹 컨테이너를 구동하지 않고 MockMvc를 써서 테스트를 진행할 수 있다. 웹 컨테이너가 구동되지 않는만큼 테스트를 더 빨리 돌릴 수 있다.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;ObjectMapper를 의존성으로 org.modelmapper를 추가함으로써 objectMapper 레퍼런스에 잭슨의 ObjectMapper 객체가 자동적으로 주입된다.&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;objectMapper.writeValueAsString 메서드를 통해 객체를 JSON으로 직렬화하여 HTTP 메세지에 추가한다.&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;andDo(print())를 사용하면 테스트 콘솔창에 해당 Request 및 Response를 볼 수 있어 디버깅하기 편하다.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;andExpect 메서드를 통해서 어떤 응답이 올지 체크하는 로직을 쉽게 작성할 수 있다.&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;HttpHeaders에 등록된 상수들을 통해서 type-safe한 코드를 작성할 수 있다.&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;소스 코드&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;pre style=&quot;background-color:#2b2b2b;color:#a9b7c6;font-family:'굴림체';font-size:9.0pt;&quot;&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;package &lt;/span&gt;com.example.springrestapi.events&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;import &lt;/span&gt;lombok.*&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;import &lt;/span&gt;javax.persistence.*&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;import &lt;/span&gt;java.time.LocalDateTime&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#629755;font-style:italic;&quot;&gt;/**&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#629755;font-style:italic;&quot;&gt; * In case of referencing between entities, using default @EqualsAndHashCode stack overflow.&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#629755;font-style:italic;&quot;&gt; * Therefore, redefine the way of checking equality is the best practice as below.&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#629755;font-style:italic;&quot;&gt; * Also, you shouldn't use @Data annotation because it uses default @EqualsAndHashCode&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#629755;font-style:italic;&quot;&gt; */&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#bbb529;&quot;&gt;@Entity&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#bbb529;&quot;&gt;@Builder&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#bbb529;&quot;&gt;@AllArgsConstructor&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#bbb529;&quot;&gt;@NoArgsConstructor&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#bbb529;&quot;&gt;@Getter&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#bbb529;&quot;&gt;@Setter&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#bbb529;&quot;&gt;@EqualsAndHashCode&lt;/span&gt;(&lt;span style=&quot;color:#d0d0ff;&quot;&gt;of &lt;/span&gt;= &lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;id&quot;&lt;/span&gt;)&lt;br /&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;public class &lt;/span&gt;Event {&lt;br /&gt;&lt;br /&gt;    &lt;span style=&quot;color:#bbb529;&quot;&gt;@Id @GeneratedValue&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#bbb529;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;private &lt;/span&gt;Integer &lt;span style=&quot;color:#9876aa;&quot;&gt;id&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;    private &lt;/span&gt;String &lt;span style=&quot;color:#9876aa;&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;    private &lt;/span&gt;String &lt;span style=&quot;color:#9876aa;&quot;&gt;description&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;    private &lt;/span&gt;LocalDateTime &lt;span style=&quot;color:#9876aa;&quot;&gt;beginEnrollmentDateTime&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;    private &lt;/span&gt;LocalDateTime &lt;span style=&quot;color:#9876aa;&quot;&gt;closeEnrollmentDateTime&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;    private &lt;/span&gt;LocalDateTime &lt;span style=&quot;color:#9876aa;&quot;&gt;beginEventDateTime&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;    private &lt;/span&gt;LocalDateTime &lt;span style=&quot;color:#9876aa;&quot;&gt;endEventDateTime&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;    private &lt;/span&gt;String &lt;span style=&quot;color:#9876aa;&quot;&gt;location&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color:#808080;&quot;&gt;// (optional)&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#808080;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;private int &lt;/span&gt;&lt;span style=&quot;color:#9876aa;&quot;&gt;basePrice&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color:#808080;&quot;&gt;// (optional)&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#808080;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;private int &lt;/span&gt;&lt;span style=&quot;color:#9876aa;&quot;&gt;maxPrice&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;  &lt;/span&gt;&lt;span style=&quot;color:#808080;&quot;&gt;// (optional)&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#808080;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;private int &lt;/span&gt;&lt;span style=&quot;color:#9876aa;&quot;&gt;limitOfEnrollment&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;    private boolean &lt;/span&gt;&lt;span style=&quot;color:#9876aa;&quot;&gt;offline&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;    private boolean &lt;/span&gt;&lt;span style=&quot;color:#9876aa;&quot;&gt;free&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color:#bbb529;&quot;&gt;@Enumerated&lt;/span&gt;(EnumType.&lt;span style=&quot;color:#9876aa;font-style:italic;&quot;&gt;STRING&lt;/span&gt;)&lt;br /&gt;    &lt;span style=&quot;color:#cc7832;&quot;&gt;private &lt;/span&gt;EventStatus &lt;span style=&quot;color:#9876aa;&quot;&gt;eventStatus &lt;/span&gt;= EventStatus.&lt;span style=&quot;color:#9876aa;font-style:italic;&quot;&gt;DRAFT&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;}&lt;/pre&gt;&lt;ul style=&quot;list-style-type: disc;&quot;&gt;&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;이벤트 엔티티의 소스코드&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;다. @Entity 어노테이션으로 이 클래스가 엔티티를 나타내는 것을 나타낸다&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;. 또한 @Id, @GeneratedValue를 통해 자동적으로 ID가 생성될 수 있게 한다&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;@Enumerated(EnumType.STRING)을 통해 현재 Enum값이 문자열로서 나타나도록 한다&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;. default값인 &lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;ORDINAL로 할 경우 EnumType의 순서가 바뀔 시 큰 에러를 낼 수 있으므로 문자열로서 나타내게 하는 것이 바람직 하다&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;pre style=&quot;background-color:#2b2b2b;color:#a9b7c6;font-family:'굴림체';font-size:9.0pt;&quot;&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;package &lt;/span&gt;com.example.springrestapi.events&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;import &lt;/span&gt;org.springframework.beans.factory.annotation.&lt;span style=&quot;color:#bbb529;&quot;&gt;Autowired&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;import &lt;/span&gt;org.springframework.hateoas.MediaTypes&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;import &lt;/span&gt;org.springframework.http.ResponseEntity&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;import &lt;/span&gt;org.springframework.stereotype.&lt;span style=&quot;color:#bbb529;&quot;&gt;Controller&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;import &lt;/span&gt;org.springframework.web.bind.annotation.&lt;span style=&quot;color:#bbb529;&quot;&gt;PostMapping&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;import &lt;/span&gt;org.springframework.web.bind.annotation.&lt;span style=&quot;color:#bbb529;&quot;&gt;RequestBody&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;import &lt;/span&gt;org.springframework.web.bind.annotation.&lt;span style=&quot;color:#bbb529;&quot;&gt;RequestMapping&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;import &lt;/span&gt;java.net.URI&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;import static &lt;/span&gt;org.springframework.hateoas.mvc.ControllerLinkBuilder.&lt;span style=&quot;font-style:italic;&quot;&gt;linkTo&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#bbb529;&quot;&gt;@Controller&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#bbb529;&quot;&gt;@RequestMapping&lt;/span&gt;(&lt;span style=&quot;color:#d0d0ff;&quot;&gt;value &lt;/span&gt;= &lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;/api/events&quot;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#d0d0ff;&quot;&gt;produces &lt;/span&gt;= MediaTypes.&lt;span style=&quot;color:#9876aa;font-style:italic;&quot;&gt;HAL_JSON_UTF8_VALUE&lt;/span&gt;)&lt;br /&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;public class &lt;/span&gt;EventController {&lt;br /&gt;&lt;br /&gt;    &lt;span style=&quot;color:#bbb529;&quot;&gt;@Autowired&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#bbb529;&quot;&gt;    &lt;/span&gt;EventRepository &lt;span style=&quot;color:#9876aa;&quot;&gt;eventRepository&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color:#bbb529;&quot;&gt;@PostMapping&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#bbb529;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;public &lt;/span&gt;ResponseEntity &lt;span style=&quot;color:#ffc66d;&quot;&gt;createEvent&lt;/span&gt;(&lt;span style=&quot;color:#bbb529;&quot;&gt;@RequestBody &lt;/span&gt;Event event) {&lt;br /&gt;        Event newEvent = &lt;span style=&quot;color:#cc7832;&quot;&gt;this&lt;/span&gt;.&lt;span style=&quot;color:#9876aa;&quot;&gt;eventRepository&lt;/span&gt;.save(event)&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;        &lt;/span&gt;URI createdURI = &lt;span style=&quot;font-style:italic;&quot;&gt;linkTo&lt;/span&gt;(EventController.&lt;span style=&quot;color:#cc7832;&quot;&gt;class&lt;/span&gt;).slash(newEvent.getId()).toUri()&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;        return &lt;/span&gt;ResponseEntity.&lt;span style=&quot;font-style:italic;&quot;&gt;created&lt;/span&gt;(createdURI).body(newEvent)&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;    &lt;/span&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;ul style=&quot;list-style-type: disc;&quot;&gt;&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;HTTP 요청을 처리하는 컨트롤러 소스코드다. @RequestMapping 어노테이션을 통해 이 컨트롤러가 /api/events URL과 매핑된 요청을 처리하는 것을 나타낸다. 또한&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;HAL_JSON_UTF8_VALUE 형태로서&amp;nbsp;&lt;/span&gt;값을 반환하는 것을 볼 수 있다.&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;EventRepository 인터페이스에 자동적으로 객체가 주입된다. 이 eventRepository 인터페이스를 통해 객체를 저장하게 되면&lt;a href=&quot;https://engkimbs.tistory.com/822?category=772527&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt; Spring JPA&lt;/a&gt;에서 이 객체를 해당 데이터베이스의 테이블에 저장하게 된다.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;@PostMapping 어노테이션으로 이 createEvent가 POST 요청을 처리하는 것으로 하였다. @RequestBody를 통해 Body에 있는 정보가 자동적으로 Event 객체로 역직렬화되어 매핑된다.&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;linkTo 메서드를 통해 현 EventController의 URL에 대한 링크 정보를 손쉽게 추가할 수 있다. 여기서는 save된 객체에서 자동적으로 할당된 ID가 포함된 URL을 Header에 넣어서 반환한다.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;ResponseEntity는 HTTP 응답에 대한 정보를 가지고 있는&amp;nbsp;객체다.&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;&lt;pre style=&quot;background-color:#2b2b2b;color:#a9b7c6;font-family:'굴림체';font-size:9.0pt;&quot;&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;package &lt;/span&gt;com.example.springrestapi.events&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;import &lt;/span&gt;org.springframework.data.jpa.repository.JpaRepository&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;public interface &lt;/span&gt;EventRepository &lt;span style=&quot;color:#cc7832;&quot;&gt;extends &lt;/span&gt;JpaRepository&amp;lt;Event&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;Integer&amp;gt; {&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;ul style=&quot;list-style-type: disc;&quot;&gt;&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;EventRepository를 JpaRepository 인터페이스를 위와 같이 상속하게 되면 자동적으로 IoC 컨테이너에 해당 빈이 등록되어 다른 객체에 주입될 수 있다.&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;결과 화면&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 437px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/99815E355CE9564313&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F99815E355CE9564313&quot; width=&quot;437&quot; height=&quot;61&quot; filename=&quot;캡처.PNG&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;요청&lt;/b&gt;&lt;/p&gt;&lt;pre style=&quot;background-color:#2b2b2b;color:#a9b7c6;font-family:'굴림체';font-size:9.0pt;&quot;&gt;&lt;b&gt;M&lt;/b&gt;ockHttpServletRequest:&lt;br /&gt;HTTP Method = POST&lt;br /&gt;Request URI = /api/events/&lt;br /&gt;Parameters = {}&lt;br /&gt;Headers = [Content-Type:&quot;application/json;charset=UTF-8&quot;, Accept:&quot;application/hal+json;charset=UTF-8&quot;]&lt;br /&gt;Body = {&quot;id&quot;:null,&quot;name&quot;:&quot;Spring&quot;,&quot;description&quot;:&quot;REST API Development&quot;,&quot;beginEnrollmentDateTime&quot;:&quot;2010-11-23T14:23:00&quot;,&quot;closeEnrollmentDateTime&quot;:&quot;2018-11-30T14:23:00&quot;,&quot;beginEventDateTime&quot;:&quot;2018-12-05T14:30:00&quot;,&quot;endEventDateTime&quot;:&quot;2018-12-06T14:30:00&quot;,&quot;location&quot;:&quot;D Start up Factory&quot;,&quot;basePrice&quot;:100,&quot;maxPrice&quot;:200,&quot;limitOfEnrollment&quot;:100,&quot;offline&quot;:false,&quot;free&quot;:false,&quot;eventStatus&quot;:null}&lt;br /&gt;Session Attrs = {}&lt;/pre&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;응답&lt;/b&gt;&lt;/p&gt;&lt;pre style=&quot;background-color:#2b2b2b;color:#a9b7c6;font-family:'굴림체';font-size:9.0pt;&quot;&gt;MockHttpServletResponse:&lt;br /&gt;Status = 201&lt;br /&gt;Error message = null&lt;br /&gt;Headers = [Location:&quot;http://localhost/api/events/1&quot;, Content-Type:&quot;application/hal+json;charset=UTF-8&quot;]&lt;br /&gt;Content type = application/hal+json;charset=UTF-8&lt;br /&gt;Body = {&quot;id&quot;:1,&quot;name&quot;:&quot;Spring&quot;,&quot;description&quot;:&quot;REST API Development&quot;,&quot;beginEnrollmentDateTime&quot;:&quot;2010-11-23T14:23:00&quot;,&quot;closeEnrollmentDateTime&quot;:&quot;2018-11-30T14:23:00&quot;,&quot;beginEventDateTime&quot;:&quot;2018-12-05T14:30:00&quot;,&quot;endEventDateTime&quot;:&quot;2018-12-06T14:30:00&quot;,&quot;location&quot;:&quot;D Start up Factory&quot;,&quot;basePrice&quot;:100,&quot;maxPrice&quot;:200,&quot;limitOfEnrollment&quot;:100,&quot;offline&quot;:false,&quot;free&quot;:false,&quot;eventStatus&quot;:null}&lt;br /&gt;Forwarded URL = null&lt;br /&gt;Redirected URL = http://localhost/api/events/1&lt;br /&gt;Cookies = []&lt;/pre&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;참조:&amp;nbsp;&lt;a href=&quot;https://www.inflearn.com/course/spring_rest-api/#&quot;&gt;https://www.inflearn.com/course/spring_rest-api/#&lt;/a&gt;&lt;/p&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;소스 코드 : &lt;span style=&quot;font-size: 18.6667px;&quot;&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;https://github.com/engkimbs/spring-rest-api&lt;/span&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;</description>
      <category>Spring/Spring Rest API</category>
      <author>새로비</author>
      <guid isPermaLink="true">https://engkimbs.tistory.com/858</guid>
      <comments>https://engkimbs.tistory.com/entry/Spring-REST-API-4-Spring-REST-API-%ED%85%8C%EC%8A%A4%ED%8A%B8-%ED%81%B4%EB%9E%98%EC%8A%A4-%EC%83%9D%EC%84%B1-%EB%B0%8F-201-%EC%9D%91%EB%8B%B5-%EB%B0%9B%EA%B8%B0#entry858comment</comments>
      <pubDate>Sat, 25 May 2019 23:50:46 +0900</pubDate>
    </item>
    <item>
      <title>[Spring REST API #3] Spring REST API 이벤트 도메인 구현</title>
      <link>https://engkimbs.tistory.com/entry/Spring-REST-API-3-Spring-REST-API-%EC%9D%B4%EB%B2%A4%ED%8A%B8-%EB%8F%84%EB%A9%94%EC%9D%B8-%EA%B5%AC%ED%98%84</link>
      <description>&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 18pt; color: rgb(0, 0, 0);&quot;&gt;&lt;span style=&quot;color: rgb(31, 218, 17); font-size: 14pt;&quot;&gt;|&lt;/span&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt; 이벤트 도메인 구현&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;b style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;모든 소스 코드는&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://github.com/engkimbs/spring-rest-api&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;&lt;span style=&quot;font-size: 14pt; color: rgb(0, 216, 255);&quot;&gt;여기&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;에서 보실 수 있습니다.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;프로젝트 구조&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;pre style=&quot;background-color:#2b2b2b;color:#a9b7c6;font-family:'굴림체';font-size:9.0pt;&quot;&gt;+---src&lt;br /&gt;|   +---main&lt;br /&gt;|   |   +---java&lt;br /&gt;|   |   |   \---com&lt;br /&gt;|   |   |       \---example&lt;br /&gt;|   |   |           \---springrestapi&lt;br /&gt;|   |   |               |   SpringRestApiApplication.java&lt;br /&gt;|   |   |               |&lt;br /&gt;|   |   |               \---events&lt;br /&gt;|   |   |                       Event.java&lt;br /&gt;|   |   |                       EventStatus.java&lt;br /&gt;|   |   |&lt;br /&gt;|   |   \---resources&lt;br /&gt;|   |       |   application.properties&lt;br /&gt;|   |       |&lt;br /&gt;|   |       +---static&lt;br /&gt;|   |       \---templates&lt;br /&gt;|   \---test&lt;br /&gt;|       \---java&lt;br /&gt;|           \---com&lt;br /&gt;|               \---example&lt;br /&gt;|                   \---springrestapi&lt;br /&gt;|                       |   SpringRestApiApplicationTests.java&lt;br /&gt;|                       |&lt;br /&gt;|                       \---events&lt;br /&gt;|                               EventTest.java&lt;/pre&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;의존성 관리&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;pre style=&quot;background-color:#2b2b2b;color:#a9b7c6;font-family:'굴림체';font-size:9.0pt;&quot;&gt;&lt;p&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;dependencies&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &amp;lt;dependency&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;            &amp;lt;groupId&amp;gt;&lt;/span&gt;org.springframework.boot&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/groupId&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;            &amp;lt;artifactId&amp;gt;&lt;/span&gt;spring-boot-starter-data-jpa&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/artifactId&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &amp;lt;/dependency&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &amp;lt;dependency&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;            &amp;lt;groupId&amp;gt;&lt;/span&gt;org.springframework.boot&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/groupId&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;            &amp;lt;artifactId&amp;gt;&lt;/span&gt;spring-boot-starter-hateoas&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/artifactId&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &amp;lt;/dependency&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &amp;lt;dependency&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;            &amp;lt;groupId&amp;gt;&lt;/span&gt;org.springframework.boot&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/groupId&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;            &amp;lt;artifactId&amp;gt;&lt;/span&gt;spring-boot-starter-web&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/artifactId&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &amp;lt;/dependency&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#808080;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#808080;&quot;&gt;        &lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;dependency&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;            &amp;lt;groupId&amp;gt;&lt;/span&gt;org.projectlombok&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/groupId&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;            &amp;lt;artifactId&amp;gt;&lt;/span&gt;lombok&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/artifactId&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;            &amp;lt;optional&amp;gt;&lt;/span&gt;true&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/optional&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &amp;lt;/dependency&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &amp;lt;dependency&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;            &amp;lt;groupId&amp;gt;&lt;/span&gt;org.modelmapper&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/groupId&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;            &amp;lt;artifactId&amp;gt;&lt;/span&gt;modelmapper&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/artifactId&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;            &amp;lt;version&amp;gt;&lt;/span&gt;2.3.1&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/version&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &amp;lt;/dependency&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &amp;lt;dependency&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;            &amp;lt;groupId&amp;gt;&lt;/span&gt;org.springframework.boot&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/groupId&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;            &amp;lt;artifactId&amp;gt;&lt;/span&gt;spring-boot-starter-test&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/artifactId&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;            &amp;lt;scope&amp;gt;&lt;/span&gt;test&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/scope&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &amp;lt;/dependency&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &amp;lt;dependency&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;            &amp;lt;groupId&amp;gt;&lt;/span&gt;com.h2database&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/groupId&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;            &amp;lt;artifactId&amp;gt;&lt;/span&gt;h2&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#808080;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#808080;&quot;&gt;        &lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/dependency&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &amp;lt;dependency&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;            &amp;lt;groupId&amp;gt;&lt;/span&gt;org.springframework.restdocs&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/groupId&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;            &amp;lt;artifactId&amp;gt;&lt;/span&gt;spring-restdocs-mockmvc&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/artifactId&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;            &amp;lt;scope&amp;gt;&lt;/span&gt;test&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/scope&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &amp;lt;/dependency&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;    &amp;lt;/dependencies&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;/pre&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;테스트&amp;nbsp;코드&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;pre style=&quot;background-color:#2b2b2b;color:#a9b7c6;font-family:'굴림체';font-size:9.0pt;&quot;&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;package &lt;/span&gt;com.example.springrestapi.events&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;import &lt;/span&gt;org.junit.&lt;span style=&quot;color:#bbb529;&quot;&gt;Test&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;import static &lt;/span&gt;org.assertj.core.api.Assertions.&lt;span style=&quot;font-style:italic;&quot;&gt;assertThat&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;public class &lt;/span&gt;EventTest {&lt;br /&gt;&lt;br /&gt;    &lt;span style=&quot;color:#bbb529;&quot;&gt;@Test&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#bbb529;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;public void &lt;/span&gt;&lt;span style=&quot;color:#ffc66d;&quot;&gt;builder&lt;/span&gt;() {&lt;br /&gt;        Event event = Event.&lt;span style=&quot;font-style:italic;&quot;&gt;builder&lt;/span&gt;()&lt;br /&gt;                    .name(&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;Spring REST API&quot;&lt;/span&gt;)&lt;br /&gt;                    .description(&lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;REST API development&quot;&lt;/span&gt;).build()&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;        &lt;/span&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;assertThat&lt;/span&gt;(event).isNotNull()&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;    &lt;/span&gt;}&lt;br /&gt;&lt;br /&gt;    &lt;span style=&quot;color:#bbb529;&quot;&gt;@Test&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#bbb529;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;public void &lt;/span&gt;&lt;span style=&quot;color:#ffc66d;&quot;&gt;javaBean&lt;/span&gt;() {&lt;br /&gt;        &lt;span style=&quot;color:#808080;&quot;&gt;// Given&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#808080;&quot;&gt;        &lt;/span&gt;String name = &lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;Event&quot;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;        &lt;/span&gt;String description = &lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;Spring REST API&quot;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;        &lt;/span&gt;&lt;span style=&quot;color:#808080;&quot;&gt;// When&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#808080;&quot;&gt;        &lt;/span&gt;Event event = &lt;span style=&quot;color:#cc7832;&quot;&gt;new &lt;/span&gt;Event()&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;        &lt;/span&gt;event.setName(name)&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;        &lt;/span&gt;event.setDescription(description)&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;        &lt;/span&gt;&lt;span style=&quot;color:#808080;&quot;&gt;// Then&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#808080;&quot;&gt;        &lt;/span&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;assertThat&lt;/span&gt;(event.getName()).isEqualTo(name)&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;        &lt;/span&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;assertThat&lt;/span&gt;(event.getDescription()).isEqualTo(description)&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;    &lt;/span&gt;}&lt;br /&gt;&lt;br /&gt;}&lt;/pre&gt;&lt;ul style=&quot;list-style-type: disc;&quot;&gt;&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;이벤트 도메인 객체에 대한 테스트를 작성하였다.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;builder 테스트는 이벤트 도메인 객체가 builder 메서드를 가지고 있는 지 확인하는 테스트이며 javaBean은 도메인 객체가 자바빈을 준수하였는지 확인하는 테스트이다.&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;소스 코드&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;pre style=&quot;background-color:#2b2b2b;color:#a9b7c6;font-family:'굴림체';font-size:9.0pt;&quot;&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;package &lt;/span&gt;com.example.springrestapi.events&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;import &lt;/span&gt;lombok.*&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;import &lt;/span&gt;java.time.LocalDateTime&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#bbb529;&quot;&gt;@Builder&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#bbb529;&quot;&gt;@AllArgsConstructor&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#bbb529;&quot;&gt;@NoArgsConstructor&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#bbb529;&quot;&gt;@Getter&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#bbb529;&quot;&gt;@Setter&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#bbb529;&quot;&gt;@EqualsAndHashCode&lt;/span&gt;(&lt;span style=&quot;color:#d0d0ff;&quot;&gt;of &lt;/span&gt;= &lt;span style=&quot;color:#6a8759;&quot;&gt;&quot;id&quot;&lt;/span&gt;) &lt;span style=&quot;color:#808080;&quot;&gt;// Entity 간에 상호 참조하는 경우 Stack Overflow가 발생될 수 있으므로&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#808080;&quot;&gt;// id로 비교하는 것이 바람직 @Data를 쓰지 않는 이유도 @EqualsAndHashCode를 재정의하려고&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;public class &lt;/span&gt;Event {&lt;br /&gt;&lt;br /&gt;    &lt;span style=&quot;color:#cc7832;&quot;&gt;private &lt;/span&gt;Integer &lt;span style=&quot;color:#9876aa;&quot;&gt;id&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;    private &lt;/span&gt;String &lt;span style=&quot;color:#9876aa;&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;    private &lt;/span&gt;String &lt;span style=&quot;color:#9876aa;&quot;&gt;description&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;    private &lt;/span&gt;LocalDateTime &lt;span style=&quot;color:#9876aa;&quot;&gt;beginEnrollmentDateTime&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;    private &lt;/span&gt;LocalDateTime &lt;span style=&quot;color:#9876aa;&quot;&gt;closeEnrollmentDateTime&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;    private &lt;/span&gt;LocalDateTime &lt;span style=&quot;color:#9876aa;&quot;&gt;beginEventDateTime&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;    private &lt;/span&gt;LocalDateTime &lt;span style=&quot;color:#9876aa;&quot;&gt;endEventDateTime&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;    private &lt;/span&gt;String &lt;span style=&quot;color:#9876aa;&quot;&gt;location&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color:#808080;&quot;&gt;// (optional) 없으면 온라인 모임&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#808080;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;private int &lt;/span&gt;&lt;span style=&quot;color:#9876aa;&quot;&gt;basePrice&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color:#808080;&quot;&gt;// (optional)&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#808080;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;private int &lt;/span&gt;&lt;span style=&quot;color:#9876aa;&quot;&gt;maxPrice&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;  &lt;/span&gt;&lt;span style=&quot;color:#808080;&quot;&gt;// (optional)&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#808080;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;private int &lt;/span&gt;&lt;span style=&quot;color:#9876aa;&quot;&gt;limitOfEnrollment&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;    private boolean &lt;/span&gt;&lt;span style=&quot;color:#9876aa;&quot;&gt;offline&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;    private boolean &lt;/span&gt;&lt;span style=&quot;color:#9876aa;&quot;&gt;free&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;    private &lt;/span&gt;EventStatus &lt;span style=&quot;color:#9876aa;&quot;&gt;eventStatus &lt;/span&gt;= EventStatus.&lt;span style=&quot;color:#9876aa;font-style:italic;&quot;&gt;DRAFT&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;ul style=&quot;list-style-type: disc;&quot;&gt;&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;Event 도메인 객체를 나타내는 코드다. lombok 어노테이션을 통해서 코드량을 대폭 줄인 것을 볼 수 있다.&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;@Builder 어노테이션을 통해서 빌더 패턴을 적용한 코드를 쉽게 적용할 수 있다.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;@Data 어노테이션을 이용하지 않고 위와 같이 적용한 이유는 도메인 객체간에 상호 참조하는 경우 같은 지 아닌 지 비교하는 로직에서 Stack Overflow가 발생할 수 있는 여지가 생기므로 따로 @EqualsAndHashCode 어노테이션을 커스터마이징 하기 위해 쓰지 않는 것이다.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;위와 같이 이벤트의 특정 상태를 나타내는 데이터는 아래와 같이 Enum을 이용하여 나타낸다.&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;pre style=&quot;background-color:#2b2b2b;color:#a9b7c6;font-family:'굴림체';font-size:9.0pt;&quot;&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;package &lt;/span&gt;com.example.springrestapi.events&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;public enum &lt;/span&gt;EventStatus {&lt;br /&gt;&lt;br /&gt;    &lt;span style=&quot;color:#9876aa;font-style:italic;&quot;&gt;DRAFT&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9876aa;font-style:italic;&quot;&gt;PUBLISHED&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9876aa;font-style:italic;&quot;&gt;BEGAN_ENROLLMENT&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;결과 화면&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 312px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/99E3E94D5CE937FA23&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F99E3E94D5CE937FA23&quot; width=&quot;312&quot; height=&quot;126&quot; filename=&quot;캡처_2019_05_25_21_41_18_383.png&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;참조:&amp;nbsp;&lt;a href=&quot;https://www.inflearn.com/course/spring_rest-api/#&quot;&gt;https://www.inflearn.com/course/spring_rest-api/#&lt;/a&gt;&lt;/p&gt;&lt;p&gt;소스 코드 :&amp;nbsp;&lt;a href=&quot;https://github.com/engkimbs/spring-rest-api&quot;&gt;https://github.com/engkimbs/spring-rest-api&lt;/a&gt;&lt;/p&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;</description>
      <category>Spring/Spring Rest API</category>
      <category>Spring REST API</category>
      <author>새로비</author>
      <guid isPermaLink="true">https://engkimbs.tistory.com/857</guid>
      <comments>https://engkimbs.tistory.com/entry/Spring-REST-API-3-Spring-REST-API-%EC%9D%B4%EB%B2%A4%ED%8A%B8-%EB%8F%84%EB%A9%94%EC%9D%B8-%EA%B5%AC%ED%98%84#entry857comment</comments>
      <pubDate>Sat, 25 May 2019 21:42:01 +0900</pubDate>
    </item>
    <item>
      <title>[Spring Rest API #2] 인텔리제이(IntelliJ)에서 스프링 REST API 프로젝트 시작하기</title>
      <link>https://engkimbs.tistory.com/entry/Spring-Rest-API-2-%EC%9D%B8%ED%85%94%EB%A6%AC%EC%A0%9C%EC%9D%B4IntelliJ%EC%97%90%EC%84%9C-%EC%8A%A4%ED%94%84%EB%A7%81-REST-API-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EC%8B%9C%EC%9E%91%ED%95%98%EA%B8%B0</link>
      <description>&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;&lt;span style=&quot;color: rgb(31, 218, 17);&quot;&gt;|&lt;/span&gt; 스프링 REST API 프로젝트 설정&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 18.6667px;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 12pt; font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;인텔리&lt;/span&gt;&lt;span style=&quot;font-size: 12pt; font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;제이에서 스프링 REST API를 시작하기 위해서는 다음 링크를 참고하여&lt;/span&gt;&lt;span style=&quot;font-size: 12pt; font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;&amp;nbsp;인텔리제이에서 스프링 부트 프로젝트 설정을 완료해야&lt;/span&gt;&lt;span style=&quot;font-size: 12pt; font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;&amp;nbsp;합니다.&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://engkimbs.tistory.com/748&quot; target=&quot;_blank&quot;&gt;[Spring/Spring Boot] - [Spring Boot #1] 인텔리제이(IntelliJ)로 스프링 부트 프로젝트 시작하기&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 14pt; color: rgb(0, 0, 0);&quot;&gt;&lt;span style=&quot;color: rgb(31, 218, 17);&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 14pt; color: rgb(0, 0, 0);&quot;&gt;&lt;span style=&quot;color: rgb(31, 218, 17);&quot;&gt;|&lt;/span&gt; 스프링 REST API 프로젝트 구조&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;프로젝트 구조&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;pre style=&quot;background-color:#2b2b2b;color:#a9b7c6;font-family:'굴림체';font-size:9.0pt;&quot;&gt;\---src&lt;br /&gt;+---main&lt;br /&gt;|   +---java&lt;br /&gt;|   |   \---com&lt;br /&gt;|   |       \---example&lt;br /&gt;|   |           \---springrestapi&lt;br /&gt;|   |                   SpringRestApiApplication.java&lt;br /&gt;|   |&lt;br /&gt;|   \---resources&lt;br /&gt;|       |   application.properties&lt;br /&gt;|       |&lt;br /&gt;|       +---static&lt;br /&gt;|       \---templates&lt;br /&gt;\---test&lt;br /&gt;    \---java&lt;br /&gt;        \---com&lt;br /&gt;            \---example&lt;br /&gt;                \---springrestapi&lt;br /&gt;                    SpringRestApiApplicationTests.java&lt;/pre&gt;&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;의존성 관리&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;pre style=&quot;background-color:#2b2b2b;color:#a9b7c6;font-family:'굴림체';font-size:9.0pt;&quot;&gt;&lt;p&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;dependencies&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;    &amp;lt;dependency&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &amp;lt;groupId&amp;gt;&lt;/span&gt;org.springframework.boot&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/groupId&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &amp;lt;artifactId&amp;gt;&lt;/span&gt;spring-boot-starter-data-jpa&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/artifactId&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;    &amp;lt;/dependency&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;    &amp;lt;dependency&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &amp;lt;groupId&amp;gt;&lt;/span&gt;org.springframework.boot&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/groupId&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &amp;lt;artifactId&amp;gt;&lt;/span&gt;spring-boot-starter-hateoas&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/artifactId&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;    &amp;lt;/dependency&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;    &amp;lt;dependency&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &amp;lt;groupId&amp;gt;&lt;/span&gt;org.springframework.boot&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/groupId&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &amp;lt;artifactId&amp;gt;&lt;/span&gt;spring-boot-starter-web&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/artifactId&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;    &amp;lt;/dependency&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;    &amp;lt;dependency&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &amp;lt;groupId&amp;gt;&lt;/span&gt;org.projectlombok&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/groupId&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &amp;lt;artifactId&amp;gt;&lt;/span&gt;lombok&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/artifactId&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &amp;lt;optional&amp;gt;&lt;/span&gt;true&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/optional&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;    &amp;lt;/dependency&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;    &amp;lt;dependency&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &amp;lt;groupId&amp;gt;&lt;/span&gt;org.modelmapper&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/groupId&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &amp;lt;artifactId&amp;gt;&lt;/span&gt;modelmapper&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/artifactId&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &amp;lt;version&amp;gt;&lt;/span&gt;2.3.1&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/version&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;    &amp;lt;/dependency&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;    &amp;lt;dependency&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &amp;lt;groupId&amp;gt;&lt;/span&gt;org.springframework.boot&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/groupId&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &amp;lt;artifactId&amp;gt;&lt;/span&gt;spring-boot-starter-test&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/artifactId&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &amp;lt;scope&amp;gt;&lt;/span&gt;test&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/scope&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;    &amp;lt;/dependency&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;    &amp;lt;dependency&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &amp;lt;groupId&amp;gt;&lt;/span&gt;com.h2database&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/groupId&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &amp;lt;artifactId&amp;gt;&lt;/span&gt;h2&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;    &amp;lt;/dependency&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;    &amp;lt;dependency&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &amp;lt;groupId&amp;gt;&lt;/span&gt;org.springframework.restdocs&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/groupId&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &amp;lt;artifactId&amp;gt;&lt;/span&gt;spring-restdocs-mockmvc&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/artifactId&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &amp;lt;scope&amp;gt;&lt;/span&gt;test&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/scope&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;    &amp;lt;/dependency&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/dependencies&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;build&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;    &amp;lt;plugins&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &amp;lt;plugin&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;            &amp;lt;groupId&amp;gt;&lt;/span&gt;org.springframework.boot&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/groupId&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;            &amp;lt;artifactId&amp;gt;&lt;/span&gt;spring-boot-maven-plugin&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/artifactId&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;        &amp;lt;/plugin&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;    &amp;lt;/plugins&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#e8bf6a;&quot;&gt;&amp;lt;/build&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;/pre&gt;&lt;p&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;소스 코드&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;pre style=&quot;background-color:#2b2b2b;color:#a9b7c6;font-family:'굴림체';font-size:9.0pt;&quot;&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;package &lt;/span&gt;com.example.springrestapi&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;import &lt;/span&gt;org.springframework.boot.SpringApplication&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;import &lt;/span&gt;org.springframework.boot.autoconfigure.&lt;span style=&quot;color:#bbb529;&quot;&gt;SpringBootApplication&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#bbb529;&quot;&gt;@SpringBootApplication&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;public class &lt;/span&gt;SpringRestApiApplication {&lt;br /&gt;&lt;br /&gt;    &lt;span style=&quot;color:#cc7832;&quot;&gt;public static void &lt;/span&gt;&lt;span style=&quot;color:#ffc66d;&quot;&gt;main&lt;/span&gt;(String[] args) {&lt;br /&gt;        SpringApplication.&lt;span style=&quot;font-style:italic;&quot;&gt;run&lt;/span&gt;(SpringRestApiApplication.&lt;span style=&quot;color:#cc7832;&quot;&gt;class, &lt;/span&gt;args)&lt;span style=&quot;color:#cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#cc7832;&quot;&gt;    &lt;/span&gt;}&lt;br /&gt;&lt;br /&gt;}&lt;/pre&gt;&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;결과 화면&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;pre style=&quot;background-color:#2b2b2b;color:#a9b7c6;font-family:'굴림체';font-size:9.0pt;&quot;&gt;.   ____          _            __ _ _&lt;br /&gt;/\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \&lt;br /&gt;( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \&lt;br /&gt;\\/  ___)| |_)| | | | | || (_| |  ) ) ) )&lt;br /&gt;'  |____| .__|_| |_|_| |_\__, | / / / /&lt;br /&gt;=========|_|==============|___/=/_/_/_/&lt;br /&gt;:: Spring Boot ::        (v2.1.5.RELEASE)&lt;br /&gt;&lt;br /&gt;2019-05-25 20:20:34.055  INFO 3248 --- [           main] c.e.s.SpringRestApiApplication           : Starting SpringRestApiApplication on USER-PC with PID 3248 (C:\Users\user\Desktop\Spring-Boot-Community-Rest\spring-rest-api\target\classes started by user in C:\Users\user\Desktop\Spring-Boot-Community-Rest\spring-rest-api)&lt;br /&gt;2019-05-25 20:20:34.059  INFO 3248 --- [           main] c.e.s.SpringRestApiApplication           : No active profile set, falling back to default profiles: default&lt;br /&gt;2019-05-25 20:20:35.796  INFO 3248 --- [           main] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data repositories in DEFAULT mode.&lt;br /&gt;2019-05-25 20:20:35.832  INFO 3248 --- [           main] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 29ms. Found 0 repository interfaces.&lt;br /&gt;2019-05-25 20:20:36.416  INFO 3248 --- [           main] trationDelegate$BeanPostProcessorChecker : Bean 'org.springframework.transaction.annotation.ProxyTransactionManagementConfiguration' of type [org.springframework.transaction.annotation.ProxyTransactionManagementConfiguration$$EnhancerBySpringCGLIB$$c3cdaca4] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)&lt;br /&gt;2019-05-25 20:20:36.494  INFO 3248 --- [           main] trationDelegate$BeanPostProcessorChecker : Bean 'org.springframework.hateoas.config.HateoasConfiguration' of type [org.springframework.hateoas.config.HateoasConfiguration$$EnhancerBySpringCGLIB$$434df9d6] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)&lt;br /&gt;2019-05-25 20:20:36.864  INFO 3248 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port(s): 8080 (http)&lt;br /&gt;2019-05-25 20:20:36.902  INFO 3248 --- [           main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]&lt;br /&gt;2019-05-25 20:20:36.902  INFO 3248 --- [           main] org.apache.catalina.core.StandardEngine  : Starting Servlet engine: [Apache Tomcat/9.0.19]&lt;br /&gt;2019-05-25 20:20:37.142  INFO 3248 --- [           main] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext&lt;br /&gt;2019-05-25 20:20:37.142  INFO 3248 --- [           main] o.s.web.context.ContextLoader            : Root WebApplicationContext: initialization completed in 2959 ms&lt;br /&gt;2019-05-25 20:20:37.462  INFO 3248 --- [           main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Starting...&lt;br /&gt;2019-05-25 20:20:37.681  INFO 3248 --- [           main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Start completed.&lt;br /&gt;2019-05-25 20:20:37.772  INFO 3248 --- [           main] o.hibernate.jpa.internal.util.LogHelper  : HHH000204: Processing PersistenceUnitInfo [&lt;br /&gt;name: default&lt;br /&gt;...]&lt;br /&gt;2019-05-25 20:20:37.911  INFO 3248 --- [           main] org.hibernate.Version                    : HHH000412: Hibernate Core {5.3.10.Final}&lt;br /&gt;2019-05-25 20:20:37.912  INFO 3248 --- [           main] org.hibernate.cfg.Environment            : HHH000206: hibernate.properties not found&lt;br /&gt;2019-05-25 20:20:38.227  INFO 3248 --- [           main] o.hibernate.annotations.common.Version   : HCANN000001: Hibernate Commons Annotations {5.0.4.Final}&lt;br /&gt;2019-05-25 20:20:38.456  INFO 3248 --- [           main] org.hibernate.dialect.Dialect            : HHH000400: Using dialect: org.hibernate.dialect.H2Dialect&lt;br /&gt;2019-05-25 20:20:38.810  INFO 3248 --- [           main] o.h.t.schema.internal.SchemaCreatorImpl  : HHH000476: Executing import script 'org.hibernate.tool.schema.internal.exec.ScriptSourceInputNonExistentImpl@57a667c8'&lt;br /&gt;2019-05-25 20:20:38.814  INFO 3248 --- [           main] j.LocalContainerEntityManagerFactoryBean : Initialized JPA EntityManagerFactory for persistence unit 'default'&lt;br /&gt;2019-05-25 20:20:39.347  INFO 3248 --- [           main] o.s.s.concurrent.ThreadPoolTaskExecutor  : Initializing ExecutorService 'applicationTaskExecutor'&lt;br /&gt;2019-05-25 20:20:39.396  WARN 3248 --- [           main] aWebConfiguration$JpaWebMvcConfiguration : spring.jpa.open-in-view is enabled by default. Therefore, database queries may be performed during view rendering. Explicitly configure spring.jpa.open-in-view to disable this warning&lt;br /&gt;2019-05-25 20:20:39.715  INFO 3248 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8080 (http) with context path ''&lt;br /&gt;2019-05-25 20:20:39.727  INFO 3248 --- [           main] c.e.s.SpringRestApiApplication           : Started SpringRestApiApplication in 6.425 seconds (JVM running for 8.276)&lt;/pre&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;참조:&amp;nbsp;&lt;a href=&quot;https://www.inflearn.com/course/spring_rest-api/#&quot;&gt;https://www.inflearn.com/course/spring_rest-api/#&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;</description>
      <category>Spring/Spring Rest API</category>
      <author>새로비</author>
      <guid isPermaLink="true">https://engkimbs.tistory.com/856</guid>
      <comments>https://engkimbs.tistory.com/entry/Spring-Rest-API-2-%EC%9D%B8%ED%85%94%EB%A6%AC%EC%A0%9C%EC%9D%B4IntelliJ%EC%97%90%EC%84%9C-%EC%8A%A4%ED%94%84%EB%A7%81-REST-API-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EC%8B%9C%EC%9E%91%ED%95%98%EA%B8%B0#entry856comment</comments>
      <pubDate>Sat, 25 May 2019 20:19:34 +0900</pubDate>
    </item>
    <item>
      <title>[Spring Rest API #1] REST API란?</title>
      <link>https://engkimbs.tistory.com/entry/Spring-Rest-API-1-REST-API%EB%9E%80</link>
      <description>&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 14pt; color: rgb(31, 218, 17);&quot;&gt;&lt;span style=&quot;font-size: 18pt;&quot;&gt;| &lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 0); font-size: 18pt;&quot;&gt;REST API란&lt;/span&gt;&lt;span style=&quot;font-size: 18pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 14pt; color: rgb(31, 218, 17);&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14pt; color: rgb(31, 218, 17);&quot;&gt;&lt;span style=&quot;font-size: 12pt; color: rgb(0, 0, 0);&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;REST API란 REST 아키텍처 스타일을 지키는 API를 말합니다. REST 아키텍처는&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;&amp;nbsp;클라이언트와 서버간의 독립적인 개발을 진행할 수 있는 아키텍처 스타일입니다.&amp;nbsp;서버와 클라이언트의 데이터는&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-size: 14pt; color: rgb(31, 218, 17);&quot;&gt;&lt;span style=&quot;font-size: 12pt; color: rgb(0, 0, 0); font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;HTTP 프로토콜 위에서 데이터를 주고받으며&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-size: 14pt; color: rgb(31, 218, 17);&quot;&gt;&lt;span style=&quot;font-size: 12pt; color: rgb(0, 0, 0);&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;&amp;nbsp;REST 아키텍처 스타일에서 명시하는 조건을&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;&amp;nbsp;준수하여 해야 합니다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14pt; color: rgb(31, 218, 17);&quot;&gt;&lt;span style=&quot;font-size: 12pt; color: rgb(0, 0, 0);&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;font face=&quot;Arial Black&quot;&gt;REST API라는 것은 간단히 생각하면 쉽습니다. 클라이언트와 서버는 따로 분리되며 데이터는 HTTP 프로토콜 위에서 주고받는 아키텍처라 생각하면 됩니다. 여기에 몇 가지 특징을 더한 아키텍처 스타일이 REST API이죠. 서버에서 HTML을 그려서 데이터를 보내는 MVC 아키텍처와는 큰 차이가 있습니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 14pt; color: rgb(31, 218, 17);&quot;&gt;&lt;span style=&quot;font-size: 12pt; color: rgb(0, 0, 0);&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 14pt; color: rgb(31, 218, 17);&quot;&gt;&lt;span style=&quot;font-size: 14pt; color: rgb(0, 0, 0);&quot;&gt;&lt;span style=&quot;color: rgb(31, 218, 17); font-size: 18pt;&quot;&gt;|&lt;/span&gt;&lt;span style=&quot;font-size: 18pt;&quot;&gt; RESTful 특징&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;; background-color: rgb(132, 132, 132); color: rgb(255, 255, 255);&quot;&gt;클라이언트-서버(client-server&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;; background-color: rgb(132, 132, 132); color: rgb(255, 255, 255);&quot;&gt;)&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;; font-size: 11pt;&quot;&gt;클라이언트와 서버의 관심사가 명확히 분리되어 있어야합니다. 서버는 클라이언트가 원하는 데이터를 보내주는 데이터 제공자의 역할을 하며 클라이언트는 이 데이터를 이용하여 사용자가 원하는 화면을 보여주는 역할을 담당하게 됩니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;; background-color: rgb(132, 132, 132); color: rgb(255, 255, 255);&quot;&gt;무상태성(stateless)&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;서버에 클라이언트의 상태 정보를 저장하지 않는 것을 말합니다. 단순히 들어오는 요청만을 처리하여 구현을 단순화 합니다. 단, 클라이언트의 모든 요청은 서버가 요청을 알아듣는 데 필요한 모든 정보를 담고 있어야 합니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;; background-color: rgb(132, 132, 132); color: rgb(255, 255, 255);&quot;&gt;캐시 가능(cacheable)&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;클라이언트의 응답을 캐시할 수 있어야 합니다. HTTP 프로토콜을 사용하는 만큼 캐시 기능을 적용할 수 있습니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;; background-color: rgb(132, 132, 132); color: rgb(255, 255, 255);&quot;&gt;코드 온 디맨드(code on demand&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;; background-color: rgb(132, 132, 132); color: rgb(255, 255, 255);&quot;&gt;)&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;클라이언트는 서버에서 자바 애플릿 혹은 자바스크립트 실행 코드를 받아 기능을 일시적으로 확장할 수 있습니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;; background-color: rgb(132, 132, 132); color: rgb(255, 255, 255);&quot;&gt;인터페이스 일관성(uniform interface&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;; background-color: rgb(132, 132, 132); color: rgb(255, 255, 255);&quot;&gt;)&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;URI로 지정된 리소스에 균일하고 통일된 인터페이스를 제공합니다. 아키텍처를 단순하게 분리하여 독립적으로 만들 수 있습니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(31, 218, 17); font-size: 18pt;&quot;&gt;|&lt;/span&gt;&lt;span style=&quot;font-size: 18pt;&quot;&gt; 인터페이스 일관성&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;REST 아키텍처에서 인터페이스 일관성은 세부 원칙을 가지고 있습니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;background-color: rgb(132, 132, 132); color: rgb(255, 255, 255);&quot;&gt;자원식별&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;URI를 통한 자원식별을 말하는 것입니다. REST API에서 이것은 자원(resource)로 명칭됩니다. 자원을 나타내기 위해서는 명사(noun&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;)를 사용해야 한다는 원칙이 있습니다. 또한 표현하고자 하는 자원이 복수형일 경우에는 이것을 명시해야합니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;(ex http://localhost/api/read/books&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;)&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;background-color: rgb(132, 132, 132); color: rgb(255, 255, 255);&quot;&gt;메세지를 통한 리소스 조작&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;HTTP 메서드를&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;GET/POST/PUT/DELETE 를 통하여 서버측에 데이터를 컨트롤합니다. 여기서 보통 GET은 select(조회), POST는 create(생성), PUT은 update(갱신), DELETE는 delete(삭제) 를 나타내며 이러한 기준을 적용하여 API를 설계해야 합니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;(ex GET http://localhost/api/books )&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;background-color: rgb(132, 132, 132); color: rgb(255, 255, 255);&quot;&gt;자기 서술적 메세지(self-descriptive)&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;REST API에서는 데이터에 대한 내용을 유추하는 것이 아닌 이 데이터를 설명하는 명세서가 존재해야 된다는 것을 의미합니다. 보통 이 자기 서술적 메세지를 지키지 않고 REST API라 칭하는 서비스들이 많습니다. 하지만 온전한 REST API라고 하려면 이 self-descriptive의 내용을 준수하여 각 데이터들이 어떤 것을 의미하는 지 어떻게 데이터를 조작할 수 있을 지에 대한 내용을 서술해야 합니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;background-color: rgb(132, 132, 132); color: rgb(255, 255, 255);&quot;&gt;애플리케이션 상태에 대한 엔진으로서의 하이퍼미디어(HATEOAS, Hypermedia As The Engine Of Application State)&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;어플리케이션은 사용자가 어떤 행위를 하느냐에 따라 상태가 바뀌게 됩니다. 쉽게 설명하자면 웹 상에서 사용자가 계좌를 조회했을 시&amp;nbsp;(송금) 혹은 (입금) 이라는 버튼이 화면에 나타나게 될 것입니다. 이 때 송금에 대한 자원을 아래와 같이 href 형태로서 링크정보를 서버에서 보내와서 다음 어플리케이션 상태를 전이하기 위한 정보를 제공하게 됩니다. 이것이 바로 HATEOAS입니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Arial Black&amp;quot;;&quot;&gt;이 원칙이 중요한 것은 이렇게 함으로서 클라이언트와 서버간의 완전한 분리가 이루어지게 됩니다. 만약 서버의 자원을 나타내는 URI 가 변경되었을 경우 클라이언트는 서버의 변화에 종속적으로 그 정보를 클라이언트 정보에 추가하게 됩니다. (SPA 상에서 href 데이터를 바꾸어 줘야함) 하지만 HATEOAS를 제대로 적용했을 시 아래와 같이 _links.profile 에 대한 href정보만 조회해주면 되므로 서버에서 URI정보가 바뀌어도 클라이언트 측에서 소스 변경없이 그대로 사용할 수 있게 됩니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;(ex)&lt;/b&gt;&lt;/p&gt;&lt;pre style=&quot;background-color:#2b2b2b;color:#a9b7c6;font-family:'굴림체';font-size:9.0pt;&quot;&gt;&quot;_links&quot; : {&lt;br /&gt;  &quot;self&quot; : {&lt;br /&gt;    &quot;href&quot; : &quot;http://localhost:8080/api/events/46&quot;&lt;br /&gt;  },&lt;br /&gt;  &quot;profile&quot; : {&lt;br /&gt;    &quot;href&quot; : &quot;/docs/index.html#resources-events-get&quot;&lt;br /&gt;  }&lt;br /&gt;}&lt;/pre&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;참조:&amp;nbsp;&lt;a href=&quot;https://www.inflearn.com/course/spring_rest-api/#&quot;&gt;https://www.inflearn.com/course/spring_rest-api/#&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;</description>
      <category>Spring/Spring Rest API</category>
      <category>Spring REST API</category>
      <author>새로비</author>
      <guid isPermaLink="true">https://engkimbs.tistory.com/855</guid>
      <comments>https://engkimbs.tistory.com/entry/Spring-Rest-API-1-REST-API%EB%9E%80#entry855comment</comments>
      <pubDate>Sat, 25 May 2019 20:04:22 +0900</pubDate>
    </item>
  </channel>
</rss>