<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>리제</title>
    <link>https://bookstairs.tistory.com/</link>
    <description>얼씨구</description>
    <language>ko</language>
    <pubDate>Sat, 18 Jul 2026 08:48:07 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>리제 </managingEditor>
    <image>
      <title>리제</title>
      <url>https://tistory1.daumcdn.net/tistory/4703521/attach/0ac7f042131c4af3a61f75a93d2b31ce</url>
      <link>https://bookstairs.tistory.com</link>
    </image>
    <item>
      <title>Web Front 4: 하이퍼링크 &amp;middot; 입력양식(form) 태그</title>
      <link>https://bookstairs.tistory.com/108</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;하이퍼링크 관련 태그 (a)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lt;a&amp;gt; 태그는 클릭하면 &lt;b&gt;연결된 곳으로 이동&lt;/b&gt;시키는, 웹의 가장 핵심적인 기능&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style13&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;속성&lt;/td&gt;
&lt;td&gt;설명&lt;/td&gt;
&lt;td&gt;예시&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;href&lt;/td&gt;
&lt;td&gt;이동할 &lt;b&gt;링크 경로&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;href=&quot;&amp;lt;&lt;a href=&quot;https://naver.com&quot;&gt;https://naver.com&lt;/a&gt;&amp;gt;&quot;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;target&lt;/td&gt;
&lt;td&gt;어느 탭에서 열지 지정&lt;/td&gt;
&lt;td&gt;_self(기본) / _blank(새 탭)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-07-16 090744.png&quot; data-origin-width=&quot;844&quot; data-origin-height=&quot;444&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Namkz/dJMcaiD5asD/BRPf8x1L0taAki5KmV1o90/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Namkz/dJMcaiD5asD/BRPf8x1L0taAki5KmV1o90/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Namkz/dJMcaiD5asD/BRPf8x1L0taAki5KmV1o90/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNamkz%2FdJMcaiD5asD%2FBRPf8x1L0taAki5KmV1o90%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;844&quot; height=&quot;444&quot; data-filename=&quot;스크린샷 2026-07-16 090744.png&quot; data-origin-width=&quot;844&quot; data-origin-height=&quot;444&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;하이퍼링크 : 페이지 내 이동 (id)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;같은 페이지 안에서 특정 위치로 점프할 수 있습니다. (&lt;b&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;이동할 목적지에 id 속성을 부여 (id는 한 페이지에 &lt;b&gt;오직 1개&lt;/b&gt;)&lt;/li&gt;
&lt;li&gt;&amp;lt;a href=&quot;#아이디&quot;&amp;gt;로 그 위치로 이동&lt;/li&gt;
&lt;/ul&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;스크린샷 2026-07-16 090820.png&quot; data-origin-width=&quot;826&quot; data-origin-height=&quot;263&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/WI3GH/dJMcacjuZMa/S47ylquPuhMXdnOpdhGxRk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/WI3GH/dJMcacjuZMa/S47ylquPuhMXdnOpdhGxRk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/WI3GH/dJMcacjuZMa/S47ylquPuhMXdnOpdhGxRk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FWI3GH%2FdJMcacjuZMa%2FS47ylquPuhMXdnOpdhGxRk%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;826&quot; height=&quot;263&quot; data-filename=&quot;스크린샷 2026-07-16 090820.png&quot; data-origin-width=&quot;826&quot; data-origin-height=&quot;263&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;h2 data-ke-size=&quot;size26&quot;&gt;입력양식 기본 : input / label&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lt;input&amp;gt; 태그는 사용자에게 값을 &lt;b&gt;입력받는&lt;/b&gt; 칸(텍스트 상자, 체크박스 등)을 만듬&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;함수 목록&lt;/h3&gt;
&lt;table id=&quot;383435fc-bd9d-8020-8d47-e459f2efd21d&quot; style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style5&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;태그&lt;/td&gt;
&lt;td&gt;설명&lt;/td&gt;
&lt;/tr&gt;
&lt;tr id=&quot;383435fc-bd9d-8080-96f2-cc2666db6e78&quot;&gt;
&lt;td id=&quot;TF;}&quot;&gt;&amp;lt;input&amp;gt;&lt;/td&gt;
&lt;td id=&quot;s;I:&quot;&gt;값을 입력받는 요소 (type에 따라 모양이 달라짐)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr id=&quot;383435fc-bd9d-80f6-a282-d5906d7bb845&quot;&gt;
&lt;td id=&quot;TF;}&quot;&gt;&amp;lt;label&amp;gt;&lt;/td&gt;
&lt;td id=&quot;s;I:&quot;&gt;입력 요소를 &lt;b&gt;설명하는 글&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr id=&quot;383435fc-bd9d-8039-bcb0-d2947a915989&quot;&gt;
&lt;td id=&quot;TF;}&quot;&gt;&amp;lt;button&amp;gt;&lt;/td&gt;
&lt;td id=&quot;s;I:&quot;&gt;클릭 버튼&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&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;스크린샷 2026-07-16 091002.png&quot; data-origin-width=&quot;811&quot; data-origin-height=&quot;400&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b9Zdar/dJMcac4TGfp/Pi6XtjdLtrKKvUNRHw0KAK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b9Zdar/dJMcac4TGfp/Pi6XtjdLtrKKvUNRHw0KAK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b9Zdar/dJMcac4TGfp/Pi6XtjdLtrKKvUNRHw0KAK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb9Zdar%2FdJMcac4TGfp%2FPi6XtjdLtrKKvUNRHw0KAK%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;811&quot; height=&quot;400&quot; data-filename=&quot;스크린샷 2026-07-16 091002.png&quot; data-origin-width=&quot;811&quot; data-origin-height=&quot;400&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt; &lt;span data-token-index=&quot;1&quot;&gt;label을 쓰는 이유&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #f6e199; color: #eb5757;&quot; data-token-index=&quot;2&quot;&gt;label&lt;/span&gt;로 설명을 연결하면 글자를 클릭해도 해당 입력칸이 선택되어 &lt;span data-token-index=&quot;4&quot;&gt;사용성&amp;middot;접근성&lt;/span&gt;이 좋아짐.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;폼(form) 관련 태그&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lt;form&amp;gt;은 사용자가 입력한 값을 &lt;b&gt;서버로 전송&lt;/b&gt;하는 영역을 정의&lt;br /&gt;form 안의 &lt;b&gt;submit 버튼&lt;/b&gt;을 누르면, 내부 input 값들이 한꺼번에 서버로 전송&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;속성설명&lt;/p&gt;
&lt;table id=&quot;383435fc-bd9d-8030-88b7-fd980a31bb41&quot; style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;속성&lt;/td&gt;
&lt;td&gt;설명&lt;/td&gt;
&lt;/tr&gt;
&lt;tr id=&quot;383435fc-bd9d-8039-a69e-e25c2c7a5481&quot;&gt;
&lt;td id=&quot;@|b&amp;lt;&quot;&gt;action&lt;/td&gt;
&lt;td id=&quot;yLOc&quot;&gt;입력값을 전송할 &lt;b&gt;서버 경로&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr id=&quot;383435fc-bd9d-80dc-85a4-d429469a5d94&quot;&gt;
&lt;td id=&quot;@|b&amp;lt;&quot;&gt;method&lt;/td&gt;
&lt;td id=&quot;yLOc&quot;&gt;전송 방식 (get 기본 / post)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;</description>
      <category>개발자 호소인/Server</category>
      <author>리제 </author>
      <guid isPermaLink="true">https://bookstairs.tistory.com/108</guid>
      <comments>https://bookstairs.tistory.com/108#entry108comment</comments>
      <pubDate>Thu, 16 Jul 2026 09:11:11 +0900</pubDate>
    </item>
    <item>
      <title>Web Server 3: MVC 패턴과 Servlet,JDBC 연동</title>
      <link>https://bookstairs.tistory.com/107</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image.webp&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;559&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pJ4ZS/dJMcacw4XaA/NE3KCFt91kh4qXmSBn9Kb0/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pJ4ZS/dJMcacw4XaA/NE3KCFt91kh4qXmSBn9Kb0/img.webp&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pJ4ZS/dJMcacw4XaA/NE3KCFt91kh4qXmSBn9Kb0/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpJ4ZS%2FdJMcacw4XaA%2FNE3KCFt91kh4qXmSBn9Kb0%2Fimg.webp&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;1024&quot; height=&quot;559&quot; data-filename=&quot;image.webp&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;559&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;div&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span data-newtext-seq=&quot;3&quot;&gt;전체 흐름&lt;/span&gt;&lt;/h3&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span data-newtext-seq=&quot;3&quot;&gt;브라우저 요청 &amp;rarr; Servlet(Controller)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span data-newtext-seq=&quot;36&quot;&gt;Servlet &amp;rarr; DAO 호출&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span data-newtext-seq=&quot;36&quot;&gt;DAO &amp;rarr; SQL 실행 &amp;rarr; 결과를 &lt;/span&gt;&lt;span data-newtext-seq=&quot;75&quot;&gt;DTO(또는 DTO 리스트)로 변환해서 반환&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span data-newtext-seq=&quot;75&quot;&gt;Servlet &amp;rarr; &lt;/span&gt;&lt;span data-newtext-seq=&quot;113&quot;&gt;받은 DTO를 request에 담아서 JSP(View)로 forward&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span data-newtext-seq=&quot;156&quot;&gt;JSP &amp;rarr; DTO 꺼내서 화면 출력&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-07-15 090903.png&quot; data-origin-width=&quot;791&quot; data-origin-height=&quot;447&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bp5CXr/dJMcah6hstn/ZUgH0gdC9KU9Fe3KUc7uDK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bp5CXr/dJMcah6hstn/ZUgH0gdC9KU9Fe3KUc7uDK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bp5CXr/dJMcah6hstn/ZUgH0gdC9KU9Fe3KUc7uDK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbp5CXr%2FdJMcah6hstn%2FZUgH0gdC9KU9Fe3KUc7uDK%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;791&quot; height=&quot;447&quot; data-filename=&quot;스크린샷 2026-07-15 090903.png&quot; data-origin-width=&quot;791&quot; data-origin-height=&quot;447&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-07-15 091139.png&quot; data-origin-width=&quot;765&quot; data-origin-height=&quot;650&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dfhO7S/dJMcadQc0xW/5bt47vWejHdsZXkhgDMyL1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dfhO7S/dJMcadQc0xW/5bt47vWejHdsZXkhgDMyL1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dfhO7S/dJMcadQc0xW/5bt47vWejHdsZXkhgDMyL1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdfhO7S%2FdJMcadQc0xW%2F5bt47vWejHdsZXkhgDMyL1%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;765&quot; height=&quot;650&quot; data-filename=&quot;스크린샷 2026-07-15 091139.png&quot; data-origin-width=&quot;765&quot; data-origin-height=&quot;650&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-07-15 091159.png&quot; data-origin-width=&quot;767&quot; data-origin-height=&quot;438&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oq6qu/dJMcaglTZ5e/62WIRTb2bikb56B17oQveK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oq6qu/dJMcaglTZ5e/62WIRTb2bikb56B17oQveK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oq6qu/dJMcaglTZ5e/62WIRTb2bikb56B17oQveK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Foq6qu%2FdJMcaglTZ5e%2F62WIRTb2bikb56B17oQveK%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;767&quot; height=&quot;438&quot; data-filename=&quot;스크린샷 2026-07-15 091159.png&quot; data-origin-width=&quot;767&quot; data-origin-height=&quot;438&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-07-15 091217.png&quot; data-origin-width=&quot;749&quot; data-origin-height=&quot;448&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bch0Ml/dJMcaaeY8ex/zKepxg18sbMIcNlQcj4j0K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bch0Ml/dJMcaaeY8ex/zKepxg18sbMIcNlQcj4j0K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bch0Ml/dJMcaaeY8ex/zKepxg18sbMIcNlQcj4j0K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbch0Ml%2FdJMcaaeY8ex%2FzKepxg18sbMIcNlQcj4j0K%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;749&quot; height=&quot;448&quot; data-filename=&quot;스크린샷 2026-07-15 091217.png&quot; data-origin-width=&quot;749&quot; data-origin-height=&quot;448&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-07-15 120803.png&quot; data-origin-width=&quot;756&quot; data-origin-height=&quot;477&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bdC8kx/dJMcacw42MP/O5tXjYKj110y703fioKssK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bdC8kx/dJMcacw42MP/O5tXjYKj110y703fioKssK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bdC8kx/dJMcacw42MP/O5tXjYKj110y703fioKssK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbdC8kx%2FdJMcacw42MP%2FO5tXjYKj110y703fioKssK%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;756&quot; height=&quot;477&quot; data-filename=&quot;스크린샷 2026-07-15 120803.png&quot; data-origin-width=&quot;756&quot; data-origin-height=&quot;477&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;JSP는 request에 담긴 데이터를 꺼내서 뿌리기만 한다. SQL이 뭐였는지 알 필요 없다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;왜 이렇게 나누는지 &amp;mdash; 핵심은 하나&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&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;SQL 쿼리가 바뀜 &amp;rarr; DAO만 수정&lt;/li&gt;
&lt;li&gt;화면 디자인이 바뀜 &amp;rarr; JSP만 수정&lt;/li&gt;
&lt;li&gt;요청 처리 로직이 바뀜 &amp;rarr; Servlet만 수정&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지금 하나의 서블릿에 다 몰아넣으면, 화면 태그 하나 고치다가 SQL 코드까지 스크롤해서 지나가야 하고, 실수로 SQL을 건드릴 위험도 생긴다. MVC는 이걸 물리적으로 파일을 나눠서 그 실수 자체를 구조적으로 막는 방식이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지금 배우는 게 잘 안 풀려도 이 구조 자체는 패턴만 이해하면 나머지는 다 이 틀에 데이터만 갈아끼우는 거라, 한 번 손에 익으면 반복 작업이 된다.&lt;/p&gt;</description>
      <category>개발자 호소인/Server</category>
      <author>리제 </author>
      <guid isPermaLink="true">https://bookstairs.tistory.com/107</guid>
      <comments>https://bookstairs.tistory.com/107#entry107comment</comments>
      <pubDate>Wed, 15 Jul 2026 12:08:29 +0900</pubDate>
    </item>
    <item>
      <title>Web Front 2: HTML 기초</title>
      <link>https://bookstairs.tistory.com/106</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;HTML&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;HTML(HyperText Markup Language)은 웹 문서의 &lt;b&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;b&gt;태그(Tag)&lt;/b&gt; 를 사용해 콘텐츠에 의미를 부여&lt;/li&gt;
&lt;li&gt;브라우저는 태그를 해석해 화면에 &lt;b&gt;구조화된 문서&lt;/b&gt;를 그려줌&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;태그의 기본 형태&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&amp;lt;태그명&amp;gt;내용&amp;lt;/태그명&amp;gt; : 시작 태그 + 내용 + 종료 태그 (한 쌍)&lt;/li&gt;
&lt;li&gt;&amp;lt;br&amp;gt;, &amp;lt;hr&amp;gt;, &amp;lt;img&amp;gt; : 종료 태그가 없는 &lt;b&gt;단독 태그&lt;/b&gt;도 존재&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  &lt;b&gt;존재하지 않는 태그를 써도 에러가 나지 않는다.&lt;/b&gt;&lt;br /&gt;HTML은 모르는 태그(&amp;lt;h7&amp;gt; 등)를 만나면 멈추지 않고 &lt;b&gt;무시&lt;/b&gt;한 채 표현 가능한 부분만 그린다.&lt;/p&gt;
&lt;/blockquote&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-filename=&quot;스크린샷 2026-07-14 135857.png&quot; data-origin-width=&quot;833&quot; data-origin-height=&quot;406&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cIFUe5/dJMcaazhnQD/oiokPzCalX0FgpuAhwURn0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cIFUe5/dJMcaazhnQD/oiokPzCalX0FgpuAhwURn0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cIFUe5/dJMcaazhnQD/oiokPzCalX0FgpuAhwURn0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcIFUe5%2FdJMcaazhnQD%2FoiokPzCalX0FgpuAhwURn0%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;833&quot; height=&quot;406&quot; data-filename=&quot;스크린샷 2026-07-14 135857.png&quot; data-origin-width=&quot;833&quot; data-origin-height=&quot;406&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;table style=&quot;border-collapse: collapse; width: 83.9535%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style13&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 23.8372%;&quot;&gt;태그&lt;/td&gt;
&lt;td style=&quot;width: 26.3854%;&quot;&gt;역할&lt;/td&gt;
&lt;td style=&quot;width: 33.6146%;&quot;&gt;비고&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 23.8372%;&quot;&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;/td&gt;
&lt;td style=&quot;width: 26.3854%;&quot;&gt;HTML5 문서 선언&lt;/td&gt;
&lt;td style=&quot;width: 33.6146%;&quot;&gt;문서 맨 위 1줄&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 23.8372%;&quot;&gt;&amp;lt;html lang=&quot;ko&quot;&amp;gt;&lt;/td&gt;
&lt;td style=&quot;width: 26.3854%;&quot;&gt;문서 전체 영역 / 언어 지정&lt;/td&gt;
&lt;td style=&quot;width: 33.6146%;&quot;&gt;가장 바깥 태그&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 23.8372%;&quot;&gt;&amp;lt;head&amp;gt;&lt;/td&gt;
&lt;td style=&quot;width: 26.3854%;&quot;&gt;문서 정보 영역&lt;/td&gt;
&lt;td style=&quot;width: 33.6146%;&quot;&gt;&lt;b&gt;화면에 안 보임&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 23.8372%;&quot;&gt;&amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;&lt;/td&gt;
&lt;td style=&quot;width: 26.3854%;&quot;&gt;문자 인코딩 지정&lt;/td&gt;
&lt;td style=&quot;width: 33.6146%;&quot;&gt;&lt;b&gt;없으면 한글 깨짐&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 23.8372%;&quot;&gt;&amp;lt;title&amp;gt;&lt;/td&gt;
&lt;td style=&quot;width: 26.3854%;&quot;&gt;브라우저 탭 제목&lt;/td&gt;
&lt;td style=&quot;width: 33.6146%;&quot;&gt;즐겨찾기 이름&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 23.8372%;&quot;&gt;&amp;lt;body&amp;gt;&lt;/td&gt;
&lt;td style=&quot;width: 26.3854%;&quot;&gt;실제 콘텐츠 영역&lt;/td&gt;
&lt;td style=&quot;width: 33.6146%;&quot;&gt;&lt;b&gt;화면에 보임&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table id=&quot;383435fc-bd9d-8010-9b16-f217a1ad2efc&quot; style=&quot;border-collapse: collapse; width: 68.8372%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style5&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 19.7674%;&quot;&gt;태그&lt;/td&gt;
&lt;td style=&quot;width: 16.5117%;&quot;&gt;설명&lt;/td&gt;
&lt;td style=&quot;width: 32.3255%;&quot;&gt;특징&lt;/td&gt;
&lt;/tr&gt;
&lt;tr id=&quot;383435fc-bd9d-80cf-8e8c-f08c4889adc4&quot;&gt;
&lt;td id=&quot;yKBA&quot; style=&quot;width: 19.7674%;&quot;&gt;&amp;lt;h1&amp;gt; ~ &amp;lt;h6&amp;gt;&lt;/td&gt;
&lt;td id=&quot;}xxc&quot; style=&quot;width: 16.5117%;&quot;&gt;제목 태그&lt;/td&gt;
&lt;td id=&quot;=H}]&quot; style=&quot;width: 32.3255%;&quot;&gt;숫자가 클수록 글자가 작아짐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr id=&quot;383435fc-bd9d-800e-9502-cf2c7a51448a&quot;&gt;
&lt;td id=&quot;yKBA&quot; style=&quot;width: 19.7674%;&quot;&gt;&amp;lt;hr&amp;gt;&lt;/td&gt;
&lt;td id=&quot;}xxc&quot; style=&quot;width: 16.5117%;&quot;&gt;수평선&lt;/td&gt;
&lt;td id=&quot;=H}]&quot; style=&quot;width: 32.3255%;&quot;&gt;단독 태그&lt;/td&gt;
&lt;/tr&gt;
&lt;tr id=&quot;383435fc-bd9d-8047-8b46-ea0e4014f19c&quot;&gt;
&lt;td id=&quot;yKBA&quot; style=&quot;width: 19.7674%;&quot;&gt;&amp;lt;br&amp;gt;&lt;/td&gt;
&lt;td id=&quot;}xxc&quot; style=&quot;width: 16.5117%;&quot;&gt;줄바꿈&lt;/td&gt;
&lt;td id=&quot;=H}]&quot; style=&quot;width: 32.3255%;&quot;&gt;단독 태그&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt; &lt;span data-token-index=&quot;1&quot;&gt;숫자는 크기가 아니라 '위계'&lt;/span&gt;&lt;/p&gt;
&lt;div&gt;&lt;span style=&quot;background-color: #000000; color: #eb5757;&quot; data-token-index=&quot;2&quot;&gt;h1&lt;/span&gt;은 페이지 대제목,&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;background-color: #000000; color: #eb5757;&quot; data-token-index=&quot;4&quot;&gt;h2&lt;/span&gt;는 소제목... 처럼 &lt;span data-token-index=&quot;6&quot;&gt;중요도(문서 구조)&lt;/span&gt; 를 나타냅니다. 단순히 글자를 크게 만들고 싶다고&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;background-color: #000000; color: #eb5757;&quot; data-token-index=&quot;8&quot;&gt;h1&lt;/span&gt;을 남발하지 않는다. &amp;lt;h6&amp;gt;? 이딴거 하지마라&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;글자 관련 태그 : 문단 (p vs pre)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문단을 나누는 태그는 &amp;lt;p&amp;gt;와 &amp;lt;pre&amp;gt; 두 가지가 있고, &lt;b&gt;줄바꿈&amp;middot;공백 처리 방식&lt;/b&gt;이 다릅니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style5&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;구분&lt;/td&gt;
&lt;td&gt;&amp;lt;p&amp;gt;&lt;/td&gt;
&lt;td&gt;&amp;lt;pre&amp;gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;줄바꿈&lt;/td&gt;
&lt;td&gt;무시됨 &amp;rarr; &amp;lt;br&amp;gt; 필요&lt;/td&gt;
&lt;td&gt;입력한 그대로 적용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;공백&lt;/td&gt;
&lt;td&gt;여러 칸도 1칸으로&lt;/td&gt;
&lt;td&gt;입력한 그대로 적용&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;</description>
      <category>개발자 호소인/Server</category>
      <author>리제 </author>
      <guid isPermaLink="true">https://bookstairs.tistory.com/106</guid>
      <comments>https://bookstairs.tistory.com/106#entry106comment</comments>
      <pubDate>Tue, 14 Jul 2026 14:01:19 +0900</pubDate>
    </item>
    <item>
      <title>Web Front 3: HTML 표 &amp;middot; 미디어 &amp;middot; 영역 태그</title>
      <link>https://bookstairs.tistory.com/105</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;표(Table)는 웹 문서에서 &lt;b&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;b&gt;행(row)&lt;/b&gt; 과 &lt;b&gt;열(column)&lt;/b&gt; 로 구성되며, 둘이 만나는 지점을 &lt;b&gt;셀(cell)&lt;/b&gt;&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;함수 목록&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;태그 설명 비고&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&amp;lt;table&amp;gt;&lt;/td&gt;
&lt;td&gt;표 전체 영역&lt;/td&gt;
&lt;td&gt;border 속성으로 테두리&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&amp;lt;tr&amp;gt;&lt;/td&gt;
&lt;td&gt;한 &lt;b&gt;행&lt;/b&gt;(table row)&lt;/td&gt;
&lt;td&gt;가로 한 줄&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&amp;lt;th&amp;gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;제목 셀&lt;/b&gt;(table header)&lt;/td&gt;
&lt;td&gt;굵게 + 가운데 정렬&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&amp;lt;td&amp;gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;일반 셀&lt;/b&gt;(table data)&lt;/td&gt;
&lt;td&gt;실제 데이터&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&amp;lt;caption&amp;gt;&lt;/td&gt;
&lt;td&gt;표 제목&lt;/td&gt;
&lt;td&gt;table 바로 안에 작성&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-07-14 085918.png&quot; data-origin-width=&quot;843&quot; data-origin-height=&quot;506&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/k3MUM/dJMcabrn0tA/heB0Z8A86zK77Z9WuY06kK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/k3MUM/dJMcabrn0tA/heB0Z8A86zK77Z9WuY06kK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/k3MUM/dJMcabrn0tA/heB0Z8A86zK77Z9WuY06kK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fk3MUM%2FdJMcabrn0tA%2FheB0Z8A86zK77Z9WuY06kK%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;843&quot; height=&quot;506&quot; data-filename=&quot;스크린샷 2026-07-14 085918.png&quot; data-origin-width=&quot;843&quot; data-origin-height=&quot;506&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;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  &lt;b&gt;표의 구조 이해하기&lt;/b&gt;table(전체) &amp;rarr; tr(행) &amp;rarr; 그 안에 th/td(셀) 순으로 &lt;b&gt;중첩&lt;/b&gt;&lt;br /&gt;셀(th/td)은 반드시 행(tr) 안에 들어가야 한다!&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;표 : 셀 병합 (colspan / rowspan)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;셀 태그(th, td)의 속성으로 여러 칸을 하나로 합칠 수 있다&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;함수 목록&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;속성 설명 예시&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 80px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style13&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;속성&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;&lt;b&gt;설명&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;예시&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;colspan=&quot;n&quot;&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;&lt;b&gt;n개의 열&lt;/b&gt;을 가로로 병합&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;colspan=&quot;2&quot;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;rowspan=&quot;n&quot;&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;&lt;b&gt;n개의 행&lt;/b&gt;을 세로로 병합&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;rowspan=&quot;2&quot;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;예제&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-07-14 090046.png&quot; data-origin-width=&quot;779&quot; data-origin-height=&quot;413&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b4rEYK/dJMcaaTxeuu/SWRkQPGHCM0CVxsT3wMO6k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b4rEYK/dJMcaaTxeuu/SWRkQPGHCM0CVxsT3wMO6k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b4rEYK/dJMcaaTxeuu/SWRkQPGHCM0CVxsT3wMO6k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb4rEYK%2FdJMcaaTxeuu%2FSWRkQPGHCM0CVxsT3wMO6k%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;779&quot; height=&quot;413&quot; data-filename=&quot;스크린샷 2026-07-14 090046.png&quot; data-origin-width=&quot;779&quot; data-origin-height=&quot;413&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;⚠️&lt;/span&gt; &lt;span data-token-index=&quot;1&quot;&gt;병합한 만큼 셀을 빼야 한다.&lt;/span&gt;&lt;/p&gt;
&lt;div&gt;&lt;span style=&quot;background-color: #006dd7; color: #ffffff;&quot; data-token-index=&quot;2&quot;&gt;colspan=&quot;2&quot;&lt;/span&gt;로 두 칸을 합쳤다면 그 행에서는&lt;span style=&quot;background-color: #006dd7; color: #ffffff;&quot; data-token-index=&quot;4&quot;&gt;td&lt;/span&gt;를 &lt;span data-token-index=&quot;6&quot;&gt;하나 적게&lt;/span&gt; 작성해야 칸 수가 맞다.&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;background-color: #006dd7; color: #ffffff;&quot; data-token-index=&quot;8&quot;&gt;\rowspan&lt;/span&gt;으로 아래 행까지 자리를 차지한 경우, 아래 행에서는 그 칸을 &lt;span data-token-index=&quot;10&quot;&gt;생략한다.&lt;/span&gt;&lt;/div&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;h2 data-ke-size=&quot;size26&quot;&gt;표 : 구조화 태그 (thead / tbody)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;표의 &lt;b&gt;제목 영역과 본문 영역&lt;/b&gt;을 구분해 구조를 명확히 하는 것이 중요&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-07-14 090203.png&quot; data-origin-width=&quot;819&quot; data-origin-height=&quot;429&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b4Dyza/dJMcacjtbFG/quyNKBaRwGRqp3zVZ7UKIK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b4Dyza/dJMcacjtbFG/quyNKBaRwGRqp3zVZ7UKIK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b4Dyza/dJMcacjtbFG/quyNKBaRwGRqp3zVZ7UKIK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb4Dyza%2FdJMcacjtbFG%2FquyNKBaRwGRqp3zVZ7UKIK%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;819&quot; height=&quot;429&quot; data-filename=&quot;스크린샷 2026-07-14 090203.png&quot; data-origin-width=&quot;819&quot; data-origin-height=&quot;429&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  thead/tbody는 화면상 큰 차이가 없어 보여도, &lt;b&gt;문서 구조를 명확히&lt;/b&gt; 하고 스타일&amp;middot;정렬&amp;middot;접근성에 도움을 줌.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;미디어 관련 태그 : 이미지 (img)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이미지를 화면에 삽입하는 태그입니다. &lt;b&gt;단독 태그&lt;/b&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;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 71.9767%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style13&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 17.3256%;&quot;&gt;속성&lt;/td&gt;
&lt;td style=&quot;width: 54.5349%;&quot;&gt;설명&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 17.3256%;&quot;&gt;src&lt;/td&gt;
&lt;td style=&quot;width: 54.5349%;&quot;&gt;불러올 이미지의 &lt;b&gt;경로&lt;/b&gt; (필수)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 17.3256%;&quot;&gt;alt&lt;/td&gt;
&lt;td style=&quot;width: 54.5349%;&quot;&gt;이미지를 못 불러올 때 표시할 &lt;b&gt;대체 텍스트&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 17.3256%;&quot;&gt;width&lt;/td&gt;
&lt;td style=&quot;width: 54.5349%;&quot;&gt;가로 길이 (px 또는 %)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 17.3256%;&quot;&gt;height&lt;/td&gt;
&lt;td style=&quot;width: 54.5349%;&quot;&gt;세로 길이 (px 또는 %)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;width / height 단위&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 72.093%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style13&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 19.4186%;&quot;&gt;단위&lt;/td&gt;
&lt;td style=&quot;width: 58.0706%;&quot;&gt;특징&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 19.4186%;&quot;&gt;px (고정)&lt;/td&gt;
&lt;td style=&quot;width: 58.0706%;&quot;&gt;화면 크기와 상관없이 &lt;b&gt;이미지 크기 고정&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 19.4186%;&quot;&gt;% (가변)&lt;/td&gt;
&lt;td style=&quot;width: 58.0706%;&quot;&gt;&lt;b&gt;부모 요소/화면 크기에 따라&lt;/b&gt; 이미지 크기가 변함&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-07-14 090350.png&quot; data-origin-width=&quot;623&quot; data-origin-height=&quot;148&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bJXQXg/dJMcabLLNTo/GKqEcqUJPNdM5G1dnMAmdK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bJXQXg/dJMcabLLNTo/GKqEcqUJPNdM5G1dnMAmdK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bJXQXg/dJMcabLLNTo/GKqEcqUJPNdM5G1dnMAmdK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbJXQXg%2FdJMcabLLNTo%2FGKqEcqUJPNdM5G1dnMAmdK%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;623&quot; height=&quot;148&quot; data-filename=&quot;스크린샷 2026-07-14 090350.png&quot; data-origin-width=&quot;623&quot; data-origin-height=&quot;148&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  &lt;b&gt;alt 속성을 꼭 작성&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;b&gt;대체 텍스트&lt;/b&gt;로 표시됩&lt;/li&gt;
&lt;li&gt;시각장애인용 &lt;b&gt;스크린리더&lt;/b&gt;가 이미지를 읽어주는 설명문이 된다. (접근성&amp;middot;SEO에 중요)&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&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;h2 data-ke-size=&quot;size26&quot;&gt;영역 관련 태그 : div vs span&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;div와 span은 &lt;b&gt;영역을 묶는 용도&lt;/b&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;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;태그 분류 줄바꿈 영역 지정 방식&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 63px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style13&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;태그&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;분류&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;줄바꿈&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;영역 지정 방식&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;&amp;lt;div&amp;gt;&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;블럭 요소&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;&lt;b&gt;발생함&lt;/b&gt; (다음 줄로)&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;사각형 박스로 영역 차지&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;&amp;lt;span&amp;gt;&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;인라인 요소&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;&lt;b&gt;발생 안 함&lt;/b&gt; (옆으로)&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;내용(content) 크기만큼만 차지&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&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;h2 data-ke-size=&quot;size26&quot;&gt;iframe&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;웹 문서 안에 &lt;b&gt;다른 웹페이지&lt;/b&gt;를 삽입하는 태그 (인라인 요소)&lt;/p&gt;
&lt;table id=&quot;383435fc-bd9d-80bd-a65f-f193417c1859&quot; style=&quot;border-collapse: collapse; width: 51.0465%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style13&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 18.3721%;&quot;&gt;속성&lt;/td&gt;
&lt;td style=&quot;width: 32.5581%;&quot;&gt;설명&lt;/td&gt;
&lt;/tr&gt;
&lt;tr id=&quot;383435fc-bd9d-8060-a1e2-eb882869587b&quot;&gt;
&lt;td id=&quot;Gi^B&quot; style=&quot;width: 18.3721%;&quot;&gt;src&lt;/td&gt;
&lt;td id=&quot;;^Uq&quot; style=&quot;width: 32.5581%;&quot;&gt;삽입할 페이지/영상의 경로&lt;/td&gt;
&lt;/tr&gt;
&lt;tr id=&quot;383435fc-bd9d-8027-9764-ff1798adfd80&quot;&gt;
&lt;td id=&quot;Gi^B&quot; style=&quot;width: 18.3721%;&quot;&gt;width / height&lt;/td&gt;
&lt;td id=&quot;;^Uq&quot; style=&quot;width: 32.5581%;&quot;&gt;표시 영역 크기&lt;/td&gt;
&lt;/tr&gt;
&lt;tr id=&quot;383435fc-bd9d-80e3-9039-d807c3bab991&quot;&gt;
&lt;td id=&quot;Gi^B&quot; style=&quot;width: 18.3721%;&quot;&gt;frameborder&lt;/td&gt;
&lt;td id=&quot;;^Uq&quot; style=&quot;width: 32.5581%;&quot;&gt;테두리 (0이면 없음)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-07-14 090706.png&quot; data-origin-width=&quot;791&quot; data-origin-height=&quot;211&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bmOklv/dJMcahkTKGN/hyBBF4B3J3gCYY1b5ckGb1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bmOklv/dJMcahkTKGN/hyBBF4B3J3gCYY1b5ckGb1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bmOklv/dJMcahkTKGN/hyBBF4B3J3gCYY1b5ckGb1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbmOklv%2FdJMcahkTKGN%2FhyBBF4B3J3gCYY1b5ckGb1%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;791&quot; height=&quot;211&quot; data-filename=&quot;스크린샷 2026-07-14 090706.png&quot; data-origin-width=&quot;791&quot; data-origin-height=&quot;211&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt; 유튜브 영상은 유튜브의 &lt;span data-token-index=&quot;1&quot;&gt;공유 &amp;rarr; 퍼가기(Embed)&lt;/span&gt; 에서 제공하는&lt;span style=&quot;background-color: #006dd7; color: #ffffff;&quot; data-token-index=&quot;3&quot;&gt;iframe&lt;/span&gt;코드를 그대로 붙여 넣으면 된다.&lt;/p&gt;</description>
      <category>개발자 호소인/Server</category>
      <author>리제 </author>
      <guid isPermaLink="true">https://bookstairs.tistory.com/105</guid>
      <comments>https://bookstairs.tistory.com/105#entry105comment</comments>
      <pubDate>Tue, 14 Jul 2026 09:08:22 +0900</pubDate>
    </item>
    <item>
      <title>Web Server 1: Servlet 기초와 웹 애플리케이션 구조</title>
      <link>https://bookstairs.tistory.com/103</link>
      <description>&lt;h1 data-end=&quot;145&quot; data-start=&quot;114&quot; data-section-id=&quot;r576xb&quot;&gt;1️⃣ 웹 서버(Web Server)와 WAS의 차이&lt;/h1&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;895&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bVbzqf/dJMb991oq2R/cKArHNQ8PI8Mft3Sa8n1S0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bVbzqf/dJMb991oq2R/cKArHNQ8PI8Mft3Sa8n1S0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bVbzqf/dJMb991oq2R/cKArHNQ8PI8Mft3Sa8n1S0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbVbzqf%2FdJMb991oq2R%2FcKArHNQ8PI8Mft3Sa8n1S0%2Fimg.jpg&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;1024&quot; height=&quot;895&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;895&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;웹 서버(Web Server)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;클라이언트(브라우저)의 요청을 받아 &lt;b&gt;정적인 자원&lt;/b&gt;(HTML, CSS, JS, 이미지)을 응답해주는 서버&lt;/li&gt;
&lt;li&gt;대표: Apache, Nginx&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-07-10 122448.png&quot; data-origin-width=&quot;956&quot; data-origin-height=&quot;325&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lojS7/dJMcaa0fx1m/CRMK7gyXvJ5zklfoD92fl1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lojS7/dJMcaa0fx1m/CRMK7gyXvJ5zklfoD92fl1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lojS7/dJMcaa0fx1m/CRMK7gyXvJ5zklfoD92fl1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlojS7%2FdJMcaa0fx1m%2FCRMK7gyXvJ5zklfoD92fl1%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;956&quot; height=&quot;325&quot; data-filename=&quot;스크린샷 2026-07-10 122448.png&quot; data-origin-width=&quot;956&quot; data-origin-height=&quot;325&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;p data-end=&quot;385&quot; data-start=&quot;362&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-end=&quot;390&quot; data-start=&quot;387&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;401&quot; data-start=&quot;392&quot; data-section-id=&quot;nz8iup&quot; data-ke-size=&quot;size26&quot;&gt;  WAS&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;19532f59-e9ac-41a2-b725-912706caa25a.webp&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;485&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/efB6LX/dJMcaglQBGr/i93Q8cg05OkUzapLFOFz80/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/efB6LX/dJMcaglQBGr/i93Q8cg05OkUzapLFOFz80/img.webp&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/efB6LX/dJMcaglQBGr/i93Q8cg05OkUzapLFOFz80/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FefB6LX%2FdJMcaglQBGr%2Fi93Q8cg05OkUzapLFOFz80%2Fimg.webp&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;1024&quot; height=&quot;485&quot; data-filename=&quot;19532f59-e9ac-41a2-b725-912706caa25a.webp&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;485&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;WAS(Web Application Server)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;정적 자원뿐 아니라&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;동적인 처리&lt;/b&gt;(DB 조회, 로직 실행 후 결과 생성)가 가능한 서버&lt;/li&gt;
&lt;li&gt;내부에&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;서블릿 컨테이너&lt;/b&gt;를 가지고 있어서 Servlet, JSP 코드를 실행할 수 있음&lt;/li&gt;
&lt;li&gt;대표: Tomcat, JBoss, WebLogic&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;properties&quot;&gt;&lt;code&gt;브라우저

     │
     ▼

WAS
(Tomcat)

     │
     ▼

Servlet 실행

     │
     ▼

DB 조회

     │
     ▼

결과 생성

     │
     ▼

브라우저 응답&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;570&quot; data-start=&quot;545&quot; data-ke-size=&quot;size16&quot;&gt;✔ 프로그램을 실행해서 새로운 결과를 만든다.&lt;/p&gt;
&lt;p data-end=&quot;574&quot; data-start=&quot;572&quot; data-ke-size=&quot;size16&quot;&gt;예)&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;&quot;&gt;&lt;code&gt;로그인

회원가입

게시글 조회

상품검색&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;612&quot; data-start=&quot;609&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;636&quot; data-start=&quot;614&quot; data-section-id=&quot;id3p70&quot;&gt;2️⃣ 왜 Servlet이 필요한가?&lt;/h1&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;400&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cpIisX/dJMb991oq2P/bo7Mmb6NmGUmUxzkmInzDk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cpIisX/dJMb991oq2P/bo7Mmb6NmGUmUxzkmInzDk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cpIisX/dJMb991oq2P/bo7Mmb6NmGUmUxzkmInzDk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcpIisX%2FdJMb991oq2P%2Fbo7Mmb6NmGUmUxzkmInzDk%2Fimg.jpg&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;800&quot; height=&quot;400&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;400&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;494&quot; data-origin-height=&quot;405&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cmSRKI/dJMb991oq2Q/VZvEhHYzSxkfPWMpukgo0k/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cmSRKI/dJMb991oq2Q/VZvEhHYzSxkfPWMpukgo0k/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cmSRKI/dJMb991oq2Q/VZvEhHYzSxkfPWMpukgo0k/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcmSRKI%2FdJMb991oq2Q%2FVZvEhHYzSxkfPWMpukgo0k%2Fimg.jpg&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;494&quot; height=&quot;405&quot; data-origin-width=&quot;494&quot; data-origin-height=&quot;405&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;686&quot; data-start=&quot;680&quot; data-ke-size=&quot;size16&quot;&gt;브라우저에서&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;&quot;&gt;&lt;code&gt;로그인 버튼 클릭&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;708&quot; data-start=&quot;707&quot; data-ke-size=&quot;size16&quot;&gt;&amp;darr;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;stylus&quot;&gt;&lt;code&gt;브라우저

&amp;darr;

Tomcat(WAS)

&amp;darr;

Servlet

&amp;darr;

DB 조회

&amp;darr;

Servlet

&amp;darr;

Tomcat

&amp;darr;

브라우저&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;806&quot; data-start=&quot;798&quot; data-ke-size=&quot;size16&quot;&gt;Servlet이 &lt;b&gt;중간 관리자 &lt;/b&gt;역할을 한다.&lt;/p&gt;
&lt;hr data-end=&quot;832&quot; data-start=&quot;829&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;848&quot; data-start=&quot;834&quot; data-section-id=&quot;1auv164&quot;&gt;3️⃣ 실제 요청 흐름&lt;/h1&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;isbl&quot;&gt;&lt;code&gt;① 브라우저

&quot;로그인 해주세요&quot;

        │

        ▼

② Tomcat(WAS)

요청 받음

        │

        ▼

③ Servlet 호출

LoginServlet

        │

        ▼

④ JDBC

        │

        ▼

⑤ Database

회원 확인

        │

        ▼

⑥ 결과 반환

        │

        ▼

⑦ 브라우저 화면 출력&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;1117&quot; data-start=&quot;1114&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;1138&quot; data-start=&quot;1119&quot; data-section-id=&quot;1k88ses&quot;&gt;4️⃣ Servlet이 없으면?&lt;/h1&gt;
&lt;p data-end=&quot;1164&quot; data-start=&quot;1140&quot; data-ke-size=&quot;size16&quot;&gt;Servlet이 해야 하는 일은 엄청 많다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;properties&quot;&gt;&lt;code&gt;HTTP 요청 읽기

&amp;darr;

GET인가?

POST인가?

&amp;darr;

URL 확인

&amp;darr;

Body 읽기

&amp;darr;

파라미터 분리

&amp;darr;

비즈니스 로직 실행

&amp;darr;

응답 생성&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1274&quot; data-start=&quot;1270&quot; data-ke-size=&quot;size16&quot;&gt;개발자가 전부 직접 구현해야 한다.&lt;/p&gt;
&lt;hr data-end=&quot;1295&quot; data-start=&quot;1292&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-end=&quot;1314&quot; data-start=&quot;1297&quot; data-ke-size=&quot;size16&quot;&gt;하지만 Servlet을 사용하면&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;nginx&quot;&gt;&lt;code&gt;HTTP 처리

&amp;darr;

Servlet이 자동

&amp;darr;

개발자는

회원조회

상품조회

게시글등록

만 구현&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1393&quot; data-start=&quot;1387&quot; data-ke-size=&quot;size16&quot;&gt;하면 된다.&lt;/p&gt;
&lt;hr data-end=&quot;1398&quot; data-start=&quot;1395&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;1445&quot; data-start=&quot;1400&quot; data-section-id=&quot;8fiedp&quot;&gt;5️⃣ HttpServletRequest와 HttpServletResponse&lt;/h1&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1200&quot; data-origin-height=&quot;569&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Ro8ZI/dJMcahd3j2n/BnEkO7oAAwatipOXf9AMak/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Ro8ZI/dJMcahd3j2n/BnEkO7oAAwatipOXf9AMak/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Ro8ZI/dJMcahd3j2n/BnEkO7oAAwatipOXf9AMak/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FRo8ZI%2FdJMcahd3j2n%2FBnEkO7oAAwatipOXf9AMak%2Fimg.jpg&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;1200&quot; height=&quot;569&quot; data-origin-width=&quot;1200&quot; data-origin-height=&quot;569&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1505&quot; data-start=&quot;1489&quot; data-ke-size=&quot;size16&quot;&gt;Tomcat은 요청이 들어오면&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;properties&quot;&gt;&lt;code&gt;브라우저 요청

&amp;darr;

Tomcat

&amp;darr;

HttpServletRequest 생성

HttpServletResponse 생성

&amp;darr;

Servlet 호출&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1614&quot; data-start=&quot;1604&quot; data-ke-size=&quot;size16&quot;&gt;Servlet에서는&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;properties&quot;&gt;&lt;code&gt;protected void doGet(
        HttpServletRequest request,
        HttpServletResponse response)&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1727&quot; data-start=&quot;1725&quot; data-ke-size=&quot;size16&quot;&gt;이처럼 이미 만들어진 객체를 사용하기만 하면 된다.&lt;/p&gt;
&lt;hr data-end=&quot;1758&quot; data-start=&quot;1755&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-end=&quot;1765&quot; data-start=&quot;1760&quot; data-ke-size=&quot;size16&quot;&gt;예를 들어&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;/login?id=apple&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1794&quot; data-start=&quot;1792&quot; data-ke-size=&quot;size16&quot;&gt;이면&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;ebnf&quot;&gt;&lt;code&gt;String id = request.getParameter(&quot;id&quot;);&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1859&quot; data-start=&quot;1849&quot; data-ke-size=&quot;size16&quot;&gt;한 줄이면 끝난다.&lt;/p&gt;
&lt;hr data-end=&quot;1864&quot; data-start=&quot;1861&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;1891&quot; data-start=&quot;1866&quot; data-section-id=&quot;q614jv&quot;&gt;6️⃣ Servlet Container란?&lt;/h1&gt;
&lt;p data-end=&quot;1903&quot; data-start=&quot;1893&quot; data-ke-size=&quot;size16&quot;&gt;Tomcat 안에는&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;nginx&quot;&gt;&lt;code&gt;Tomcat

┌──────────────────┐
│ ServletContainer │
└──────────────────┘&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1992&quot; data-start=&quot;1985&quot; data-ke-size=&quot;size16&quot;&gt;가 들어있다.&lt;/p&gt;
&lt;p data-end=&quot;1996&quot; data-start=&quot;1994&quot; data-ke-size=&quot;size16&quot;&gt;얘가&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;properties&quot;&gt;&lt;code&gt;Servlet 생성

&amp;darr;

Servlet 호출

&amp;darr;

Servlet 종료

&amp;darr;

메모리 관리&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;2069&quot; data-start=&quot;2059&quot; data-ke-size=&quot;size16&quot;&gt;를 모두 담당한다.&lt;/p&gt;
&lt;p data-end=&quot;2072&quot; data-start=&quot;2071&quot; data-ke-size=&quot;size16&quot;&gt;즉&lt;/p&gt;
&lt;p data-end=&quot;2078&quot; data-start=&quot;2074&quot; data-ke-size=&quot;size16&quot;&gt;개발자는&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;haxe&quot;&gt;&lt;code&gt;new LoginServlet();&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;2121&quot; data-start=&quot;2109&quot; data-ke-size=&quot;size16&quot;&gt;을 거의 하지 않는다.&lt;/p&gt;
&lt;p data-end=&quot;2140&quot; data-start=&quot;2123&quot; data-ke-size=&quot;size16&quot;&gt;Tomcat이 대신 만들어준다.&lt;/p&gt;
&lt;hr data-end=&quot;2145&quot; data-start=&quot;2142&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;2183&quot; data-start=&quot;2147&quot; data-section-id=&quot;eiaqrw&quot;&gt;7️⃣ Servlet은 하나만 만들어진다 (Singleton)&lt;/h1&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;armasm&quot;&gt;&lt;code&gt;브라우저 A

       │

브라우저 B

       │

브라우저 C

       │

       ▼

하나의 LoginServlet&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;2286&quot; data-start=&quot;2279&quot; data-ke-size=&quot;size16&quot;&gt;모든 사용자가&lt;/p&gt;
&lt;p data-end=&quot;2308&quot; data-start=&quot;2288&quot; data-ke-size=&quot;size16&quot;&gt;같은 Servlet 객체를 사용한다.&lt;/p&gt;
&lt;p data-end=&quot;2313&quot; data-start=&quot;2310&quot; data-ke-size=&quot;size16&quot;&gt;그래서&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;axapta&quot;&gt;&lt;code&gt;private int count;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;2368&quot; data-start=&quot;2347&quot; data-ke-size=&quot;size16&quot;&gt;같은 공유 변수는 매우 조심해야 한다.&lt;/p&gt;
&lt;hr data-end=&quot;2373&quot; data-start=&quot;2370&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;2397&quot; data-start=&quot;2375&quot; data-section-id=&quot;obska2&quot;&gt;8️⃣ 동시 요청은 어떻게 처리할까?&lt;/h1&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;2461&quot; data-start=&quot;2441&quot; data-ke-size=&quot;size16&quot;&gt;브라우저 여러 명이 동시에 접속한다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;properties&quot;&gt;&lt;code&gt;A 사용자

B 사용자

C 사용자

D 사용자&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;2504&quot; data-start=&quot;2503&quot; data-ke-size=&quot;size16&quot;&gt;&amp;darr;&lt;/p&gt;
&lt;p data-end=&quot;2512&quot; data-start=&quot;2506&quot; data-ke-size=&quot;size16&quot;&gt;Tomcat&lt;/p&gt;
&lt;p data-end=&quot;2515&quot; data-start=&quot;2514&quot; data-ke-size=&quot;size16&quot;&gt;&amp;darr;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;Thread Pool

[Thread1]

[Thread2]

[Thread3]

[Thread4]&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;2583&quot; data-start=&quot;2582&quot; data-ke-size=&quot;size16&quot;&gt;&amp;darr;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;&quot;&gt;&lt;code&gt;같은 Servlet&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;2606&quot; data-start=&quot;2605&quot; data-ke-size=&quot;size16&quot;&gt;&amp;darr;&lt;/p&gt;
&lt;p data-end=&quot;2610&quot; data-start=&quot;2608&quot; data-ke-size=&quot;size16&quot;&gt;DB&lt;/p&gt;
&lt;hr data-end=&quot;2615&quot; data-start=&quot;2612&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-end=&quot;2618&quot; data-start=&quot;2617&quot; data-ke-size=&quot;size16&quot;&gt;즉&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;autohotkey&quot;&gt;&lt;code&gt;사용자마다

Servlet이 생기는 것이 아니라

Thread가 하나씩 생긴다.&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;2677&quot; data-start=&quot;2674&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;2691&quot; data-start=&quot;2679&quot; data-section-id=&quot;te70za&quot;&gt;⭐ 한 장으로 정리&lt;/h1&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;브라우저

      │

      ▼

Web Server
(정적 파일)

      │

      ▼

Tomcat(WAS)

      │

      ▼

Servlet Container

      │

      ▼

Servlet

      │

      ▼

JDBC

      │

      ▼

Database

      │

      ▼

결과 생성

      │

      ▼

브라우저&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-end=&quot;2958&quot; data-start=&quot;2945&quot; data-section-id=&quot;13591bm&quot; data-ke-size=&quot;size23&quot;&gt;기억해야 할 핵심&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-is-only-node=&quot;&quot; data-is-last-node=&quot;&quot; data-end=&quot;3239&quot; data-start=&quot;2960&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3014&quot; data-start=&quot;2960&quot; data-section-id=&quot;1hixgs7&quot;&gt;&lt;b&gt;Web Server&lt;/b&gt; &amp;rarr; HTML, CSS, JS, 이미지 같은 &lt;b&gt;정적 파일&lt;/b&gt; 제공&lt;/li&gt;
&lt;li data-end=&quot;3063&quot; data-start=&quot;3015&quot; data-section-id=&quot;e3k10c&quot;&gt;&lt;b&gt;WAS(Tomcat)&lt;/b&gt; &amp;rarr; Java 코드를 실행하여 &lt;b&gt;동적 페이지&lt;/b&gt; 생성&lt;/li&gt;
&lt;li data-end=&quot;3115&quot; data-start=&quot;3064&quot; data-section-id=&quot;826s57&quot;&gt;&lt;b&gt;Servlet&lt;/b&gt; &amp;rarr; 클라이언트 요청을 받아 비즈니스 로직을 수행하는 Java 클래스&lt;/li&gt;
&lt;li data-end=&quot;3165&quot; data-start=&quot;3116&quot; data-section-id=&quot;rcuki9&quot;&gt;&lt;b&gt;Servlet Container&lt;/b&gt; &amp;rarr; Servlet의 생성, 호출, 소멸을 관리&lt;/li&gt;
&lt;li data-is-last-node=&quot;&quot; data-end=&quot;3239&quot; data-start=&quot;3166&quot; data-section-id=&quot;1t3oz30&quot;&gt;&lt;b&gt;Thread Pool&lt;/b&gt; &amp;rarr; 여러 사용자의 요청을 동시에 처리하며, 개발자가 멀티스레드를 직접 관리할 필요가 없도록 해준다.&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;구분 GET POST&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;데이터 위치&lt;/td&gt;
&lt;td&gt;URL 쿼리스트링에 노출 (?name=값)&lt;/td&gt;
&lt;td&gt;HTTP Body에 담김 (노출 안 됨)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;데이터 크기&lt;/td&gt;
&lt;td&gt;제한적&lt;/td&gt;
&lt;td&gt;상대적으로 자유로움&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;용도&lt;/td&gt;
&lt;td&gt;조회, 검색 등&lt;/td&gt;
&lt;td&gt;로그인, 회원가입 등 민감한 데이터&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;담당 메서드&lt;/td&gt;
&lt;td&gt;doGet()&lt;/td&gt;
&lt;td&gt;doPost()&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;</description>
      <category>개발자 호소인/Server</category>
      <author>리제 </author>
      <guid isPermaLink="true">https://bookstairs.tistory.com/103</guid>
      <comments>https://bookstairs.tistory.com/103#entry103comment</comments>
      <pubDate>Fri, 10 Jul 2026 12:21:40 +0900</pubDate>
    </item>
    <item>
      <title>Web Server 8: Spring MVC 구조와 요청&amp;middot;응답 처리</title>
      <link>https://bookstairs.tistory.com/101</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-07-09 092214.png&quot; data-origin-width=&quot;1141&quot; data-origin-height=&quot;757&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bhEP4z/dJMcad3GkWA/NDz50PZ6BeaHNeZVHAafkk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bhEP4z/dJMcad3GkWA/NDz50PZ6BeaHNeZVHAafkk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bhEP4z/dJMcad3GkWA/NDz50PZ6BeaHNeZVHAafkk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbhEP4z%2FdJMcad3GkWA%2FNDz50PZ6BeaHNeZVHAafkk%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;1141&quot; height=&quot;757&quot; data-filename=&quot;스크린샷 2026-07-09 092214.png&quot; data-origin-width=&quot;1141&quot; data-origin-height=&quot;757&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-07-09 092442.png&quot; data-origin-width=&quot;772&quot; data-origin-height=&quot;482&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bN60Hl/dJMcad3GkWz/v69huNDuESUBttl6JIZv70/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bN60Hl/dJMcad3GkWz/v69huNDuESUBttl6JIZv70/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bN60Hl/dJMcad3GkWz/v69huNDuESUBttl6JIZv70/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbN60Hl%2FdJMcad3GkWz%2Fv69huNDuESUBttl6JIZv70%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;772&quot; height=&quot;482&quot; data-filename=&quot;스크린샷 2026-07-09 092442.png&quot; data-origin-width=&quot;772&quot; data-origin-height=&quot;482&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>개발자 호소인/Server</category>
      <author>리제 </author>
      <guid isPermaLink="true">https://bookstairs.tistory.com/101</guid>
      <comments>https://bookstairs.tistory.com/101#entry101comment</comments>
      <pubDate>Thu, 9 Jul 2026 16:50:10 +0900</pubDate>
    </item>
    <item>
      <title>가지고 있는 잉크차트</title>
      <link>https://bookstairs.tistory.com/100</link>
      <description>&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;3991&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/73i2O/dJMcafUOBnu/QmAlOa1QeRZT0lW1bNmGW1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/73i2O/dJMcafUOBnu/QmAlOa1QeRZT0lW1bNmGW1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/73i2O/dJMcafUOBnu/QmAlOa1QeRZT0lW1bNmGW1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F73i2O%2FdJMcafUOBnu%2FQmAlOa1QeRZT0lW1bNmGW1%2Fimg.jpg&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;3024&quot; height=&quot;3991&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;3991&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;3991&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c4MdrI/dJMcahd1hqy/ZmXbZJkNPmLCIcVSvwSWOk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c4MdrI/dJMcahd1hqy/ZmXbZJkNPmLCIcVSvwSWOk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c4MdrI/dJMcahd1hqy/ZmXbZJkNPmLCIcVSvwSWOk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc4MdrI%2FdJMcahd1hqy%2FZmXbZJkNPmLCIcVSvwSWOk%2Fimg.jpg&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;3024&quot; height=&quot;3991&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;3991&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;3991&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/da8C0l/dJMcafUOBnw/x95o7HNPwBxqzkDXBeBkq0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/da8C0l/dJMcafUOBnw/x95o7HNPwBxqzkDXBeBkq0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/da8C0l/dJMcafUOBnw/x95o7HNPwBxqzkDXBeBkq0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fda8C0l%2FdJMcafUOBnw%2Fx95o7HNPwBxqzkDXBeBkq0%2Fimg.jpg&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;3024&quot; height=&quot;3991&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;3991&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;3991&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/FknNN/dJMcahd1hqx/t9GLV317St5a6AoUslUoa0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/FknNN/dJMcahd1hqx/t9GLV317St5a6AoUslUoa0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/FknNN/dJMcahd1hqx/t9GLV317St5a6AoUslUoa0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFknNN%2FdJMcahd1hqx%2Ft9GLV317St5a6AoUslUoa0%2Fimg.jpg&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;3024&quot; height=&quot;3991&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;3991&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;3991&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/clTbPE/dJMcahd1hqw/f9V2s5NKfppxPyZEHkKlh1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/clTbPE/dJMcahd1hqw/f9V2s5NKfppxPyZEHkKlh1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/clTbPE/dJMcahd1hqw/f9V2s5NKfppxPyZEHkKlh1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FclTbPE%2FdJMcahd1hqw%2Ff9V2s5NKfppxPyZEHkKlh1%2Fimg.jpg&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;3024&quot; height=&quot;3991&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;3991&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;3991&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dI3QZv/dJMcahd1hqz/D6lShS5zIsUKngjfdKFPL1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dI3QZv/dJMcahd1hqz/D6lShS5zIsUKngjfdKFPL1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dI3QZv/dJMcahd1hqz/D6lShS5zIsUKngjfdKFPL1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdI3QZv%2FdJMcahd1hqz%2FD6lShS5zIsUKngjfdKFPL1%2Fimg.jpg&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;3024&quot; height=&quot;3991&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;3991&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;3991&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lHKMD/dJMcafUOBnx/ZqrjdL41IRQKuQETbMKXU1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lHKMD/dJMcafUOBnx/ZqrjdL41IRQKuQETbMKXU1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lHKMD/dJMcafUOBnx/ZqrjdL41IRQKuQETbMKXU1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlHKMD%2FdJMcafUOBnx%2FZqrjdL41IRQKuQETbMKXU1%2Fimg.jpg&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;3024&quot; height=&quot;3991&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;3991&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;3991&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bB3uat/dJMcahd1hqA/Tpd5CKzxm31NBCFCdJ8Clk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bB3uat/dJMcahd1hqA/Tpd5CKzxm31NBCFCdJ8Clk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bB3uat/dJMcahd1hqA/Tpd5CKzxm31NBCFCdJ8Clk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbB3uat%2FdJMcahd1hqA%2FTpd5CKzxm31NBCFCdJ8Clk%2Fimg.jpg&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;3024&quot; height=&quot;3991&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;3991&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;3991&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bYzbe3/dJMcahd1hqB/nyJde8c2Cxs8BywgDonk1k/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bYzbe3/dJMcahd1hqB/nyJde8c2Cxs8BywgDonk1k/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bYzbe3/dJMcahd1hqB/nyJde8c2Cxs8BywgDonk1k/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbYzbe3%2FdJMcahd1hqB%2FnyJde8c2Cxs8BywgDonk1k%2Fimg.jpg&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;3024&quot; height=&quot;3991&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;3991&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;3991&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cCEEUg/dJMcafUOBny/SfftKUmyQns8VHxyjFFeW1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cCEEUg/dJMcafUOBny/SfftKUmyQns8VHxyjFFeW1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cCEEUg/dJMcafUOBny/SfftKUmyQns8VHxyjFFeW1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcCEEUg%2FdJMcafUOBny%2FSfftKUmyQns8VHxyjFFeW1%2Fimg.jpg&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;3024&quot; height=&quot;3991&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;3991&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;3991&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ekGpN1/dJMcafUOBnz/RjftholHWxYA7wHDJMzxR1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ekGpN1/dJMcafUOBnz/RjftholHWxYA7wHDJMzxR1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ekGpN1/dJMcafUOBnz/RjftholHWxYA7wHDJMzxR1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FekGpN1%2FdJMcafUOBnz%2FRjftholHWxYA7wHDJMzxR1%2Fimg.jpg&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;3024&quot; height=&quot;3991&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;3991&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;3991&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pbwiS/dJMcahd1hqC/yDm0vQ4NCweXJuxvSnTjek/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pbwiS/dJMcahd1hqC/yDm0vQ4NCweXJuxvSnTjek/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pbwiS/dJMcahd1hqC/yDm0vQ4NCweXJuxvSnTjek/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpbwiS%2FdJMcahd1hqC%2FyDm0vQ4NCweXJuxvSnTjek%2Fimg.jpg&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;3024&quot; height=&quot;3991&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;3991&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;3991&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/S28vx/dJMcahd1hqD/IqQen8aIWzS7PObtm4oNTK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/S28vx/dJMcahd1hqD/IqQen8aIWzS7PObtm4oNTK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/S28vx/dJMcahd1hqD/IqQen8aIWzS7PObtm4oNTK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FS28vx%2FdJMcahd1hqD%2FIqQen8aIWzS7PObtm4oNTK%2Fimg.jpg&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;3024&quot; height=&quot;3991&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;3991&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bjH9Aw/dJMcafUOBnC/c9o4spfSkiJxBt3dkMnnZ0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bjH9Aw/dJMcafUOBnC/c9o4spfSkiJxBt3dkMnnZ0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bjH9Aw/dJMcafUOBnC/c9o4spfSkiJxBt3dkMnnZ0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbjH9Aw%2FdJMcafUOBnC%2Fc9o4spfSkiJxBt3dkMnnZ0%2Fimg.jpg&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;3024&quot; height=&quot;4032&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c4xzkn/dJMcahd1hqG/IVXfFvyL0RV8A2hxZfrVBK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c4xzkn/dJMcahd1hqG/IVXfFvyL0RV8A2hxZfrVBK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c4xzkn/dJMcahd1hqG/IVXfFvyL0RV8A2hxZfrVBK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc4xzkn%2FdJMcahd1hqG%2FIVXfFvyL0RV8A2hxZfrVBK%2Fimg.jpg&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;3024&quot; height=&quot;4032&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2268&quot; data-origin-height=&quot;4032&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kZnLW/dJMcafUOBnA/ZyXKBWibHxiPqJP7pAuKHk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kZnLW/dJMcafUOBnA/ZyXKBWibHxiPqJP7pAuKHk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kZnLW/dJMcafUOBnA/ZyXKBWibHxiPqJP7pAuKHk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkZnLW%2FdJMcafUOBnA%2FZyXKBWibHxiPqJP7pAuKHk%2Fimg.jpg&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;2268&quot; height=&quot;4032&quot; data-origin-width=&quot;2268&quot; data-origin-height=&quot;4032&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2268&quot; data-origin-height=&quot;4032&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ePorkC/dJMcahd1hqE/x9VMOTq6Z9uQUNu6spyGaK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ePorkC/dJMcahd1hqE/x9VMOTq6Z9uQUNu6spyGaK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ePorkC/dJMcahd1hqE/x9VMOTq6Z9uQUNu6spyGaK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FePorkC%2FdJMcahd1hqE%2Fx9VMOTq6Z9uQUNu6spyGaK%2Fimg.jpg&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;2268&quot; height=&quot;4032&quot; data-origin-width=&quot;2268&quot; data-origin-height=&quot;4032&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2268&quot; data-origin-height=&quot;4032&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HyfnF/dJMcahd1hqF/CtAHwPqFjdWMUBXmHRHSnk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HyfnF/dJMcahd1hqF/CtAHwPqFjdWMUBXmHRHSnk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HyfnF/dJMcahd1hqF/CtAHwPqFjdWMUBXmHRHSnk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHyfnF%2FdJMcahd1hqF%2FCtAHwPqFjdWMUBXmHRHSnk%2Fimg.jpg&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;2268&quot; height=&quot;4032&quot; data-origin-width=&quot;2268&quot; data-origin-height=&quot;4032&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2268&quot; data-origin-height=&quot;4032&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/QrLIh/dJMcafUOBnB/hsDWX3XYlMyn3kKPkQiXq1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/QrLIh/dJMcafUOBnB/hsDWX3XYlMyn3kKPkQiXq1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/QrLIh/dJMcafUOBnB/hsDWX3XYlMyn3kKPkQiXq1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQrLIh%2FdJMcafUOBnB%2FhsDWX3XYlMyn3kKPkQiXq1%2Fimg.jpg&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;2268&quot; height=&quot;4032&quot; data-origin-width=&quot;2268&quot; data-origin-height=&quot;4032&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: left;&quot;&gt;다 쓰려면 마셔야 한다&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;4284&quot; data-origin-height=&quot;5712&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vS47H/dJMcaiqpwqZ/rnl8sYxQSikKaKkYnJ4IyK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vS47H/dJMcaiqpwqZ/rnl8sYxQSikKaKkYnJ4IyK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vS47H/dJMcaiqpwqZ/rnl8sYxQSikKaKkYnJ4IyK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvS47H%2FdJMcaiqpwqZ%2Frnl8sYxQSikKaKkYnJ4IyK%2Fimg.jpg&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;4284&quot; height=&quot;5712&quot; data-origin-width=&quot;4284&quot; data-origin-height=&quot;5712&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;4284&quot; data-origin-height=&quot;5712&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b59qkF/dJMcaa63BN5/eDezqg6JeMkiMhiidlk7r0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b59qkF/dJMcaa63BN5/eDezqg6JeMkiMhiidlk7r0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b59qkF/dJMcaa63BN5/eDezqg6JeMkiMhiidlk7r0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb59qkF%2FdJMcaa63BN5%2FeDezqg6JeMkiMhiidlk7r0%2Fimg.jpg&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;4284&quot; height=&quot;5712&quot; data-origin-width=&quot;4284&quot; data-origin-height=&quot;5712&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;4284&quot; data-origin-height=&quot;5712&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/3Op9b/dJMcaiqpwq0/gV1N1ETItUFqEvLcWRxo10/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3Op9b/dJMcaiqpwq0/gV1N1ETItUFqEvLcWRxo10/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3Op9b/dJMcaiqpwq0/gV1N1ETItUFqEvLcWRxo10/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3Op9b%2FdJMcaiqpwq0%2FgV1N1ETItUFqEvLcWRxo10%2Fimg.jpg&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;4284&quot; height=&quot;5712&quot; data-origin-width=&quot;4284&quot; data-origin-height=&quot;5712&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;4284&quot; data-origin-height=&quot;5712&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cETmas/dJMcaa63BN7/j14RQ3JEdaQzo4Pk65bp20/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cETmas/dJMcaa63BN7/j14RQ3JEdaQzo4Pk65bp20/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cETmas/dJMcaa63BN7/j14RQ3JEdaQzo4Pk65bp20/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcETmas%2FdJMcaa63BN7%2Fj14RQ3JEdaQzo4Pk65bp20%2Fimg.jpg&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;4284&quot; height=&quot;5712&quot; data-origin-width=&quot;4284&quot; data-origin-height=&quot;5712&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Jc7WU/dJMcaiqpwqY/eK5Puq0RN6aMnB9r2n7kmK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Jc7WU/dJMcaiqpwqY/eK5Puq0RN6aMnB9r2n7kmK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Jc7WU/dJMcaiqpwqY/eK5Puq0RN6aMnB9r2n7kmK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJc7WU%2FdJMcaiqpwqY%2FeK5Puq0RN6aMnB9r2n7kmK%2Fimg.jpg&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;3024&quot; height=&quot;4032&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/4htQj/dJMcaa63BN3/QQifXoiHOqoKOKO4Wl0E1K/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/4htQj/dJMcaa63BN3/QQifXoiHOqoKOKO4Wl0E1K/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/4htQj/dJMcaa63BN3/QQifXoiHOqoKOKO4Wl0E1K/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F4htQj%2FdJMcaa63BN3%2FQQifXoiHOqoKOKO4Wl0E1K%2Fimg.jpg&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;3024&quot; height=&quot;4032&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/S3Rrf/dJMcaa63BN9/E6Qmc0ecbyecVsLF9sPhAk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/S3Rrf/dJMcaa63BN9/E6Qmc0ecbyecVsLF9sPhAk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/S3Rrf/dJMcaa63BN9/E6Qmc0ecbyecVsLF9sPhAk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FS3Rrf%2FdJMcaa63BN9%2FE6Qmc0ecbyecVsLF9sPhAk%2Fimg.jpg&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;3024&quot; height=&quot;4032&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dmn9DR/dJMcaiqpwq1/LTq7nUcjCQ7n5fbcLJ3D5k/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dmn9DR/dJMcaiqpwq1/LTq7nUcjCQ7n5fbcLJ3D5k/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dmn9DR/dJMcaiqpwq1/LTq7nUcjCQ7n5fbcLJ3D5k/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdmn9DR%2FdJMcaiqpwq1%2FLTq7nUcjCQ7n5fbcLJ3D5k%2Fimg.jpg&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;3024&quot; height=&quot;4032&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/0UT41/dJMcaa63BOb/p3popioKlr8GDsjKV59lF0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/0UT41/dJMcaa63BOb/p3popioKlr8GDsjKV59lF0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/0UT41/dJMcaa63BOb/p3popioKlr8GDsjKV59lF0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F0UT41%2FdJMcaa63BOb%2Fp3popioKlr8GDsjKV59lF0%2Fimg.jpg&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;3024&quot; height=&quot;4032&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;</description>
      <category>연장⛏ (만년필, 잉크,노트 등)</category>
      <author>리제 </author>
      <guid isPermaLink="true">https://bookstairs.tistory.com/100</guid>
      <comments>https://bookstairs.tistory.com/100#entry100comment</comments>
      <pubDate>Wed, 8 Jul 2026 09:04:39 +0900</pubDate>
    </item>
    <item>
      <title>Web Server 1: JDBC 기초와 데이터베이스 연동</title>
      <link>https://bookstairs.tistory.com/99</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;0yMojoB4UWRARfttROAUaH4DE4Xmhx4ISpF7vR6W_KT00_rVLSyoYPl8lWgx8jSU3kqVfSH6kigQrsJnyRn6MbA25UfL8qcFDOhoVPaCywJN750XP3N4m8l76k5lr_0m8QUV3rfvRjJiLa62kU1RLZbpb1tUrQgkRed8h8gnIFLW8vqPw1CGH8wrTohj9NLM.jpg&quot; data-origin-width=&quot;1000&quot; data-origin-height=&quot;499&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bPI5Xv/dJMcaa65Exz/SjKHGlN8ltp1w4KvH6kGk1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bPI5Xv/dJMcaa65Exz/SjKHGlN8ltp1w4KvH6kGk1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bPI5Xv/dJMcaa65Exz/SjKHGlN8ltp1w4KvH6kGk1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbPI5Xv%2FdJMcaa65Exz%2FSjKHGlN8ltp1w4KvH6kGk1%2Fimg.jpg&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;1000&quot; height=&quot;499&quot; data-filename=&quot;0yMojoB4UWRARfttROAUaH4DE4Xmhx4ISpF7vR6W_KT00_rVLSyoYPl8lWgx8jSU3kqVfSH6kigQrsJnyRn6MbA25UfL8qcFDOhoVPaCywJN750XP3N4m8l76k5lr_0m8QUV3rfvRjJiLa62kU1RLZbpb1tUrQgkRed8h8gnIFLW8vqPw1CGH8wrTohj9NLM.jpg&quot; data-origin-width=&quot;1000&quot; data-origin-height=&quot;499&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;JDBC(Java Database Connectivity)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;자바 애플리케이션에서 데이터베이스에 접속해 SQL을 실행할 수 있게 해주는 표준 API&lt;/li&gt;
&lt;li&gt;자바 진영에서 만든 &lt;b&gt;인터페이스 모음&lt;/b&gt;이며, 실제 동작은 각 DBMS 벤더가 제공하는 드라이버(구현체)가 담당&lt;/li&gt;
&lt;li&gt;즉 개발자는 MySQL이든 Oracle이든 동일한 JDBC 인터페이스(Connection, Statement, ResultSet 등)로 코드를 작성하고, DB 종류만 바뀌면 드라이버만 교체하면 됨 &amp;rarr; &lt;b&gt;DB 독립적인 코드 작성이 가능&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;fNf460R_u9OBN5P1WH2LAZVgn70PgoVejMqe8ciFTY09T2x36JfOS-1r4twP0G4riwdruwTChNHKEcwUZg_OuRT5Oz8izBe8wDEOvp72Q-Dh-cTmM1jLrmW-WePhEdKR7UkMBNzA9-AMLk4JOU5ZrGsgMmN64mjWv1ycXT_O03mzniNzY0DAKq6bTpM-DQRb.jpg&quot; data-origin-width=&quot;919&quot; data-origin-height=&quot;420&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cq5wNK/dJMcahSyvAg/gCacswZWQTQkBPuSwTXHL0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cq5wNK/dJMcahSyvAg/gCacswZWQTQkBPuSwTXHL0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cq5wNK/dJMcahSyvAg/gCacswZWQTQkBPuSwTXHL0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcq5wNK%2FdJMcahSyvAg%2FgCacswZWQTQkBPuSwTXHL0%2Fimg.jpg&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;919&quot; height=&quot;420&quot; data-filename=&quot;fNf460R_u9OBN5P1WH2LAZVgn70PgoVejMqe8ciFTY09T2x36JfOS-1r4twP0G4riwdruwTChNHKEcwUZg_OuRT5Oz8izBe8wDEOvp72Q-Dh-cTmM1jLrmW-WePhEdKR7UkMBNzA9-AMLk4JOU5ZrGsgMmN64mjWv1ycXT_O03mzniNzY0DAKq6bTpM-DQRb.jpg&quot; data-origin-width=&quot;919&quot; data-origin-height=&quot;420&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;JDBC의 핵심 흐름&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;드라이버 로딩&lt;/li&gt;
&lt;li&gt;Connection(연결) 획득&lt;/li&gt;
&lt;li&gt;Statement(SQL 실행 객체) 생성&lt;/li&gt;
&lt;li&gt;SQL 실행&lt;/li&gt;
&lt;li&gt;결과(ResultSet) 처리&lt;/li&gt;
&lt;li&gt;자원 반납(close)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;XpdX_f9Db2qvuf3nA0jvdKSVRXHHmuDEmm7orJXTQIWDYmPzrKHjtd-KQKIxrYtQlufSbh9DhXTuYa4IE1Jg1oAu3q1diycCg2sHkpsySpILSjXI0rAaNgXPhRg9-RKeiukUqw-T1ZJEQu10tY4D5jEz8Jf0RFXELIkyPo5WbEPQjdreQc5pZ1ZT27X4j-ZF.jpg&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;768&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/byW0E3/dJMcaccHl8R/wD8nKBkqWqlbhAFPWEtID0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/byW0E3/dJMcaccHl8R/wD8nKBkqWqlbhAFPWEtID0/img.jpg&quot; data-alt=&quot;핵심 구조 [Java 애플리케이션] │ (JDBC API 호출) ▼ [JDBC Driver (벤더별 구현체)] │ ▼ [Database (MySQL, Oracle 등)] ✔️ 정리 Java는 DB를 직접 모름 &amp;amp;rarr; JDBC를 통해 요청 JDBC Driver가 DB 언어로 &amp;amp;ldquo;번역&amp;amp;rdquo; DB가 실행 후 결과 반환&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/byW0E3/dJMcaccHl8R/wD8nKBkqWqlbhAFPWEtID0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbyW0E3%2FdJMcaccHl8R%2FwD8nKBkqWqlbhAFPWEtID0%2Fimg.jpg&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;1024&quot; height=&quot;768&quot; data-filename=&quot;XpdX_f9Db2qvuf3nA0jvdKSVRXHHmuDEmm7orJXTQIWDYmPzrKHjtd-KQKIxrYtQlufSbh9DhXTuYa4IE1Jg1oAu3q1diycCg2sHkpsySpILSjXI0rAaNgXPhRg9-RKeiukUqw-T1ZJEQu10tY4D5jEz8Jf0RFXELIkyPo5WbEPQjdreQc5pZ1ZT27X4j-ZF.jpg&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;768&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;핵심 구조 [Java 애플리케이션] │ (JDBC API 호출) ▼ [JDBC Driver (벤더별 구현체)] │ ▼ [Database (MySQL, Oracle 등)] ✔️ 정리 Java는 DB를 직접 모름 &amp;rarr; JDBC를 통해 요청 JDBC Driver가 DB 언어로 &amp;ldquo;번역&amp;rdquo; DB가 실행 후 결과 반환&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p 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;h3 data-end=&quot;496&quot; data-start=&quot;470&quot; data-section-id=&quot;vw2ryg&quot; data-ke-size=&quot;size23&quot;&gt;  Statement (위험 + 단순)&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;String sql = &quot;SELECT * FROM user WHERE id = '&quot; + input + &quot;'&quot;;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;623&quot; data-start=&quot;568&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;580&quot; data-start=&quot;568&quot; data-section-id=&quot;3ld58d&quot;&gt;문자열 그대로 실행&lt;/li&gt;
&lt;li data-end=&quot;602&quot; data-start=&quot;581&quot; data-section-id=&quot;1u4yvjk&quot;&gt;사용자 입력이 SQL 문법으로 섞임&lt;/li&gt;
&lt;li data-end=&quot;623&quot; data-start=&quot;603&quot; data-section-id=&quot;1dwe5ag&quot;&gt;❌ SQL Injection 취약&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;628&quot; data-start=&quot;625&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;664&quot; data-start=&quot;630&quot; data-section-id=&quot;1psxlr&quot; data-ke-size=&quot;size23&quot;&gt;  PreparedStatement (안전 + 효율)&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;reasonml&quot;&gt;&lt;code&gt;String sql = &quot;SELECT * FROM user WHERE id = ?&quot;;
PreparedStatement ps = conn.prepareStatement(sql);
ps.setString(1, input);&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;874&quot; data-start=&quot;797&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;810&quot; data-start=&quot;797&quot; data-section-id=&quot;95vuzq&quot;&gt;? = 자리표시자&lt;/li&gt;
&lt;li data-end=&quot;827&quot; data-start=&quot;811&quot; data-section-id=&quot;hf7nwj&quot;&gt;값은 &amp;ldquo;데이터&amp;rdquo;로만 처리됨&lt;/li&gt;
&lt;li data-end=&quot;848&quot; data-start=&quot;828&quot; data-section-id=&quot;8gg5sc&quot;&gt;✔ SQL Injection 방지&lt;/li&gt;
&lt;li data-end=&quot;874&quot; data-start=&quot;849&quot; data-section-id=&quot;1g67gok&quot;&gt;✔ SQL 미리 컴파일 &amp;rarr; 반복 실행 빠름&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-end=&quot;978&quot; data-start=&quot;952&quot; data-section-id=&quot;xelloq&quot; data-ke-size=&quot;size23&quot;&gt;  핵심 개념: &amp;ldquo;커서(cursor)&amp;rdquo;&lt;/h3&gt;
&lt;p data-end=&quot;986&quot; data-start=&quot;980&quot; data-ke-size=&quot;size16&quot;&gt;초기 상태:&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;cs&quot;&gt;&lt;code&gt;[ before first ]
     &amp;darr;
[ row1 ]
[ row2 ]
[ row3 ]&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1075&quot; data-start=&quot;1048&quot; data-ke-size=&quot;size16&quot;&gt;  처음엔 데이터가 아니라 &amp;ldquo;이전 위치&amp;rdquo;에 있음&lt;/p&gt;
&lt;hr data-end=&quot;1080&quot; data-start=&quot;1077&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;1101&quot; data-start=&quot;1082&quot; data-section-id=&quot;d7ppti&quot; data-ke-size=&quot;size23&quot;&gt;  rs.next() 동작&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;autoit&quot;&gt;&lt;code&gt;rs.next() 호출 &amp;rarr; row1로 이동 &amp;rarr; true
rs.next() 호출 &amp;rarr; row2로 이동 &amp;rarr; true
rs.next() 호출 &amp;rarr; row3로 이동 &amp;rarr; true
rs.next() 호출 &amp;rarr; 없음 &amp;rarr; false&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;1234&quot; data-start=&quot;1231&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;1251&quot; data-start=&quot;1236&quot; data-section-id=&quot;b4fcj&quot; data-ke-size=&quot;size23&quot;&gt;  실제 코드 흐름&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;reasonml&quot;&gt;&lt;code&gt;ResultSet rs = ps.executeQuery();

while(rs.next()) {
    System.out.println(rs.getString(&quot;name&quot;));
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1371&quot; data-start=&quot;1364&quot; data-ke-size=&quot;size16&quot;&gt;✔️ 의미&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1443&quot; data-start=&quot;1372&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1411&quot; data-start=&quot;1372&quot; data-section-id=&quot;1n5h8mf&quot;&gt;next() = &amp;ldquo;다음 줄로 이동하면서 데이터 존재 여부 체크&amp;rdquo;&lt;/li&gt;
&lt;li data-end=&quot;1429&quot; data-start=&quot;1412&quot; data-section-id=&quot;1xaey8s&quot;&gt;true &amp;rarr; 데이터 있음&lt;/li&gt;
&lt;li data-end=&quot;1443&quot; data-start=&quot;1430&quot; data-section-id=&quot;1wofa2&quot;&gt;false &amp;rarr; 끝&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;1448&quot; data-start=&quot;1445&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1462&quot; data-start=&quot;1450&quot; data-section-id=&quot;l8598&quot; data-ke-size=&quot;size26&quot;&gt;  한 줄 정리&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1566&quot; data-start=&quot;1464&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1488&quot; data-start=&quot;1464&quot; data-section-id=&quot;18akw5d&quot;&gt;JDBC = &amp;ldquo;Java &amp;harr; DB 통역사&amp;rdquo;&lt;/li&gt;
&lt;li data-end=&quot;1530&quot; data-start=&quot;1489&quot; data-section-id=&quot;6vxk9q&quot;&gt;PreparedStatement = &amp;ldquo;보안 + 성능 둘 다 잡은 방식&amp;rdquo;&lt;/li&gt;
&lt;li data-end=&quot;1566&quot; data-start=&quot;1531&quot; data-section-id=&quot;hsax6i&quot;&gt;ResultSet = &amp;ldquo;커서를 움직이며 한 줄씩 읽는 구조&amp;rdquo;&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;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-07-10 121425.png&quot; data-origin-width=&quot;429&quot; data-origin-height=&quot;528&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cSqgVT/dJMcajiBFJr/qYxO3jv4vRHxXt2NEXM7B0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cSqgVT/dJMcajiBFJr/qYxO3jv4vRHxXt2NEXM7B0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cSqgVT/dJMcajiBFJr/qYxO3jv4vRHxXt2NEXM7B0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcSqgVT%2FdJMcajiBFJr%2FqYxO3jv4vRHxXt2NEXM7B0%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;429&quot; height=&quot;528&quot; data-filename=&quot;스크린샷 2026-07-10 121425.png&quot; data-origin-width=&quot;429&quot; data-origin-height=&quot;528&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-07-10 121432.png&quot; data-origin-width=&quot;218&quot; data-origin-height=&quot;381&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/su3EO/dJMcag0p5LF/gmGHiGMZMmxtIKATlOrKXK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/su3EO/dJMcag0p5LF/gmGHiGMZMmxtIKATlOrKXK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/su3EO/dJMcag0p5LF/gmGHiGMZMmxtIKATlOrKXK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fsu3EO%2FdJMcag0p5LF%2FgmGHiGMZMmxtIKATlOrKXK%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;218&quot; height=&quot;381&quot; data-filename=&quot;스크린샷 2026-07-10 121432.png&quot; data-origin-width=&quot;218&quot; data-origin-height=&quot;381&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;393&quot; data-origin-height=&quot;355&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/n4GTU/dJMcaiqrjD6/G4oMld004eISf1lpQlBZ10/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/n4GTU/dJMcaiqrjD6/G4oMld004eISf1lpQlBZ10/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/n4GTU/dJMcaiqrjD6/G4oMld004eISf1lpQlBZ10/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fn4GTU%2FdJMcaiqrjD6%2FG4oMld004eISf1lpQlBZ10%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;393&quot; height=&quot;355&quot; data-origin-width=&quot;393&quot; data-origin-height=&quot;355&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h1 data-end=&quot;606&quot; data-start=&quot;588&quot; data-section-id=&quot;1t6zwn4&quot;&gt;2️⃣ close()를 하면?&lt;/h1&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;767&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cWnUlP/dJMcabx398h/PekkiqK4VWIMlfeuk4DaEK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cWnUlP/dJMcabx398h/PekkiqK4VWIMlfeuk4DaEK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cWnUlP/dJMcabx398h/PekkiqK4VWIMlfeuk4DaEK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcWnUlP%2FdJMcabx398h%2FPekkiqK4VWIMlfeuk4DaEK%2Fimg.jpg&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;1024&quot; height=&quot;767&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;767&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;853&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GnWIL/dJMcagzorcQ/iZQ3jIslxLRRxcenDk1U40/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GnWIL/dJMcagzorcQ/iZQ3jIslxLRRxcenDk1U40/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GnWIL/dJMcagzorcQ/iZQ3jIslxLRRxcenDk1U40/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGnWIL%2FdJMcagzorcQ%2FiZQ3jIslxLRRxcenDk1U40%2Fimg.jpg&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;1280&quot; height=&quot;853&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;853&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;661&quot; data-origin-height=&quot;427&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bxAdDq/dJMcabx398g/Xc4URvQf2FKBSwa1kOGSSk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bxAdDq/dJMcabx398g/Xc4URvQf2FKBSwa1kOGSSk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bxAdDq/dJMcabx398g/Xc4URvQf2FKBSwa1kOGSSk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbxAdDq%2FdJMcabx398g%2FXc4URvQf2FKBSwa1kOGSSk%2Fimg.jpg&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;661&quot; height=&quot;427&quot; data-origin-width=&quot;661&quot; data-origin-height=&quot;427&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&lt;span&gt;5&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;pgsql&quot;&gt;&lt;code&gt;Connection 생성

&amp;darr;

Statement 생성

&amp;darr;

ResultSet 생성

&amp;darr;

사용 완료

&amp;darr;

close()&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;736&quot; data-start=&quot;733&quot; data-ke-size=&quot;size16&quot;&gt;그러면&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;ResultSet 반납

&amp;darr;

Statement 반납

&amp;darr;

Connection 반납

&amp;darr;

다른 프로그램이 재사용 가능&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;821&quot; data-start=&quot;819&quot; data-ke-size=&quot;size16&quot;&gt;마치&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;&quot;&gt;&lt;code&gt;도서관 책

빌림  

&amp;darr;

읽음

&amp;darr;

반납

&amp;darr;

다른 사람이 사용&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;879&quot; data-start=&quot;873&quot; data-ke-size=&quot;size16&quot;&gt;와 똑같다.&lt;/p&gt;
&lt;hr data-end=&quot;884&quot; data-start=&quot;881&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;914&quot; data-start=&quot;886&quot; data-section-id=&quot;13s2ffd&quot;&gt;3️⃣ try-with-resources의 원리&lt;/h1&gt;
&lt;p data-end=&quot;921&quot; data-start=&quot;916&quot; data-ke-size=&quot;size16&quot;&gt;기존 방식&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;reasonml&quot;&gt;&lt;code&gt;Connection conn = DriverManager.getConnection(...);

try {

    // 작업

} finally {

    conn.close();
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1042&quot; data-start=&quot;1040&quot; data-ke-size=&quot;size16&quot;&gt;항상&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;isbl&quot;&gt;&lt;code&gt;finally에서
직접 close()&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1082&quot; data-start=&quot;1074&quot; data-ke-size=&quot;size16&quot;&gt;를 써야 했다.&lt;/p&gt;
&lt;hr data-end=&quot;1087&quot; data-start=&quot;1084&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1104&quot; data-start=&quot;1089&quot; data-section-id=&quot;iti90e&quot; data-ke-size=&quot;size26&quot;&gt;하지만 Java7부터는&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;reasonml&quot;&gt;&lt;code&gt;try (
    Connection conn = DriverManager.getConnection(...);
    PreparedStatement pstmt = conn.prepareStatement(sql);
    ResultSet rs = pstmt.executeQuery();
) {

    // 작업

}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1304&quot; data-start=&quot;1298&quot; data-ke-size=&quot;size16&quot;&gt;이렇게 쓰면&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;isbl&quot;&gt;&lt;code&gt;try 블록 종료

&amp;darr;

자동 close()&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1343&quot; data-start=&quot;1340&quot; data-ke-size=&quot;size16&quot;&gt;된다.&lt;/p&gt;
&lt;hr data-end=&quot;1348&quot; data-start=&quot;1345&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;1367&quot; data-start=&quot;1350&quot; data-section-id=&quot;1wh13c0&quot;&gt;4️⃣ 자동으로 닫히는 순서&lt;/h1&gt;
&lt;p data-end=&quot;1381&quot; data-start=&quot;1369&quot; data-ke-size=&quot;size16&quot;&gt;가장 중요한 부분이다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;생성 순서

Connection
      │
      ▼
PreparedStatement
      │
      ▼
ResultSet&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1481&quot; data-start=&quot;1474&quot; data-ke-size=&quot;size16&quot;&gt;작업이 끝나면&lt;/p&gt;
&lt;p data-end=&quot;1491&quot; data-start=&quot;1483&quot; data-ke-size=&quot;size16&quot;&gt;반대로 닫힌다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;stylus&quot;&gt;&lt;code&gt;close()

ResultSet
      ▲
      │
PreparedStatement
      ▲
      │
Connection&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1587&quot; data-start=&quot;1586&quot; data-ke-size=&quot;size16&quot;&gt;즉&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;생성

Connection
    &amp;darr;
Statement
    &amp;darr;
ResultSet

──────────────

자동 close

ResultSet
    &amp;uarr;
Statement
    &amp;uarr;
Connection&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;blockquote data-end=&quot;1781&quot; data-start=&quot;1719&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;1781&quot; data-start=&quot;1721&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&quot;나중에 만든 것부터 먼저 닫는다(LIFO, Last In First Out)&quot;&lt;/b&gt;라고 기억하면 된다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr data-end=&quot;1786&quot; data-start=&quot;1783&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;1804&quot; data-start=&quot;1788&quot; data-section-id=&quot;7kx9kr&quot;&gt;5️⃣ 왜 반대로 닫을까?&lt;/h1&gt;
&lt;p data-end=&quot;1811&quot; data-start=&quot;1806&quot; data-ke-size=&quot;size16&quot;&gt;예를 들어&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;pgsql&quot;&gt;&lt;code&gt;Connection
 └── Statement
       └── ResultSet&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1883&quot; data-start=&quot;1869&quot; data-ke-size=&quot;size16&quot;&gt;처럼 서로 연결되어 있다.&lt;/p&gt;
&lt;p data-end=&quot;1887&quot; data-start=&quot;1885&quot; data-ke-size=&quot;size16&quot;&gt;만약&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;pgsql&quot;&gt;&lt;code&gt;Connection부터 닫아버리면

&amp;darr;

Statement가 사용할 대상이 없어짐

&amp;darr;

ResultSet도 사용할 수 없음&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1975&quot; data-start=&quot;1972&quot; data-ke-size=&quot;size16&quot;&gt;그래서&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;ResultSet 사용 종료

&amp;darr;

Statement 종료

&amp;darr;

마지막으로 Connection 종료&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;2055&quot; data-start=&quot;2043&quot; data-ke-size=&quot;size16&quot;&gt;순서가 가장 안전하다.&lt;/p&gt;
&lt;hr data-end=&quot;2060&quot; data-start=&quot;2057&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;2080&quot; data-start=&quot;2062&quot; data-section-id=&quot;yic683&quot;&gt;⭐ 시험에서 자주 나오는 핵심&lt;/h1&gt;
&lt;div&gt;
&lt;div&gt;객체역할반드시 close()?
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;2245&quot; data-start=&quot;2082&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;2245&quot; data-start=&quot;2143&quot;&gt;
&lt;tr data-end=&quot;2169&quot; data-start=&quot;2143&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2156&quot; data-start=&quot;2143&quot;&gt;Connection&lt;/td&gt;
&lt;td data-end=&quot;2164&quot; data-start=&quot;2156&quot; data-col-size=&quot;sm&quot;&gt;DB 연결&lt;/td&gt;
&lt;td data-end=&quot;2169&quot; data-start=&quot;2164&quot; data-col-size=&quot;sm&quot;&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2216&quot; data-start=&quot;2170&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2202&quot; data-start=&quot;2170&quot;&gt;Statement / PreparedStatement&lt;/td&gt;
&lt;td data-end=&quot;2211&quot; data-start=&quot;2202&quot; data-col-size=&quot;sm&quot;&gt;SQL 실행&lt;/td&gt;
&lt;td data-end=&quot;2216&quot; data-start=&quot;2211&quot; data-col-size=&quot;sm&quot;&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2245&quot; data-start=&quot;2217&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2229&quot; data-start=&quot;2217&quot;&gt;ResultSet&lt;/td&gt;
&lt;td data-end=&quot;2240&quot; data-start=&quot;2229&quot; data-col-size=&quot;sm&quot;&gt;조회 결과 저장&lt;/td&gt;
&lt;td data-end=&quot;2245&quot; data-start=&quot;2240&quot; data-col-size=&quot;sm&quot;&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-end=&quot;2275&quot; data-start=&quot;2247&quot; data-section-id=&quot;1ozppmf&quot; data-ke-size=&quot;size23&quot;&gt;try-with-resources를 사용하면&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;jboss-cli&quot;&gt;&lt;code&gt;try (
    Connection conn = ...
    PreparedStatement pstmt = ...
    ResultSet rs = ...
) {
    // 작업
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;2435&quot; data-start=&quot;2395&quot; data-ke-size=&quot;size16&quot;&gt;✔ finally에서 close()를 직접 작성하지 않아도 된다.&lt;/p&gt;
&lt;p data-end=&quot;2511&quot; data-start=&quot;2437&quot; data-ke-size=&quot;size16&quot;&gt;✔ &lt;b&gt;자동으로 ResultSet &amp;rarr; PreparedStatement &amp;rarr; Connection 순으로 close()가 호출된다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-is-only-node=&quot;&quot; data-is-last-node=&quot;&quot; data-end=&quot;2557&quot; data-start=&quot;2513&quot; data-ke-size=&quot;size16&quot;&gt;이 흐름만 이해하면 JDBC의 자원 관리 개념은 거의 다 잡았다고 볼 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;ChatGPT Image 2026년 7월 7일 오전 10_33_25.png&quot; data-origin-width=&quot;1536&quot; data-origin-height=&quot;1024&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dvYr7r/dJMcahd0OqR/ExIAXred8pNjDgPwg7zXQk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dvYr7r/dJMcahd0OqR/ExIAXred8pNjDgPwg7zXQk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dvYr7r/dJMcahd0OqR/ExIAXred8pNjDgPwg7zXQk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdvYr7r%2FdJMcahd0OqR%2FExIAXred8pNjDgPwg7zXQk%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;1536&quot; height=&quot;1024&quot; data-filename=&quot;ChatGPT Image 2026년 7월 7일 오전 10_33_25.png&quot; data-origin-width=&quot;1536&quot; data-origin-height=&quot;1024&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;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div data-find-omitted=&quot;&quot;&gt;
&lt;div&gt;
&lt;div id=&quot;mcp-app-container-toolu_01UuTMTH1TZZPLxnyLtqivE3&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>개발자 호소인/Server</category>
      <author>리제 </author>
      <guid isPermaLink="true">https://bookstairs.tistory.com/99</guid>
      <comments>https://bookstairs.tistory.com/99#entry99comment</comments>
      <pubDate>Tue, 7 Jul 2026 14:32:42 +0900</pubDate>
    </item>
    <item>
      <title>7: Spring</title>
      <link>https://bookstairs.tistory.com/98</link>
      <description>&lt;p data-end=&quot;130&quot; data-start=&quot;115&quot; data-ke-size=&quot;size16&quot;&gt;집을 짓는다고 생각해 보자.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;323&quot; data-start=&quot;132&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;160&quot; data-start=&quot;132&quot; data-section-id=&quot;14wctcf&quot;&gt;&lt;b&gt;Java&lt;/b&gt; &amp;rarr; 벽돌과 철근 같은 건축 재료&lt;/li&gt;
&lt;li data-end=&quot;199&quot; data-start=&quot;161&quot; data-section-id=&quot;v5y9an&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;Spring&lt;/b&gt; &amp;rarr; 집을 쉽게 지을 수 있도록 만든 건축 공법 ( 개발을 위한 '판(틀)'을 미리 만들어 놓은 프레임워크)&lt;/span&gt;&lt;/li&gt;
&lt;li data-end=&quot;239&quot; data-start=&quot;200&quot; data-section-id=&quot;myn2yl&quot;&gt;&lt;b&gt;Spring Boot&lt;/b&gt; &amp;rarr; 기본 집이 이미 지어진 조립식 주택&lt;/li&gt;
&lt;li data-end=&quot;275&quot; data-start=&quot;240&quot; data-section-id=&quot;1kguqki&quot;&gt;&lt;b&gt;Maven&lt;/b&gt; &amp;rarr; 필요한 자재를 자동으로 주문하는 시스템&lt;/li&gt;
&lt;li data-end=&quot;323&quot; data-start=&quot;276&quot; data-section-id=&quot;1depjbt&quot;&gt;&lt;b&gt;Spring Initializr&lt;/b&gt; &amp;rarr; 집의 기본 설계도를 만들어 주는 사이트&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-end=&quot;131&quot; data-start=&quot;116&quot; data-ke-size=&quot;size20&quot;&gt;Java만 사용하면 개발자가&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;185&quot; data-start=&quot;133&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;141&quot; data-start=&quot;133&quot; data-section-id=&quot;9azriv&quot;&gt;URL 처리&lt;/li&gt;
&lt;li data-end=&quot;149&quot; data-start=&quot;142&quot; data-section-id=&quot;1u4yn8t&quot;&gt;객체 생성&lt;/li&gt;
&lt;li data-end=&quot;157&quot; data-start=&quot;150&quot; data-section-id=&quot;16x5eha&quot;&gt;DB 연결&lt;/li&gt;
&lt;li data-end=&quot;165&quot; data-start=&quot;158&quot; data-section-id=&quot;ca92vg&quot;&gt;예외 처리&lt;/li&gt;
&lt;li data-end=&quot;173&quot; data-start=&quot;166&quot; data-section-id=&quot;4rm740&quot;&gt;로그 관리&lt;/li&gt;
&lt;li data-end=&quot;185&quot; data-start=&quot;174&quot; data-section-id=&quot;1x1c08t&quot;&gt;요청과 응답 처리&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;204&quot; data-start=&quot;187&quot; data-ke-size=&quot;size16&quot;&gt;등을 전부 직접 만들어야 한다.&lt;/p&gt;
&lt;p data-end=&quot;238&quot; data-start=&quot;206&quot; data-ke-size=&quot;size16&quot;&gt;하지만 Spring에서는 이미 이런 구조가 준비되어 있다.&lt;/p&gt;
&lt;blockquote data-end=&quot;238&quot; data-start=&quot;206&quot; data-ke-style=&quot;style3&quot;&gt;브라우저&lt;br /&gt;│ &lt;br /&gt;▼&lt;br /&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;Controller&lt;/span&gt; &amp;larr; 요청을 받음&lt;br /&gt;│&lt;br /&gt;▼&lt;br /&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;Service&lt;/span&gt; &amp;larr; 비즈니스 로직 처리&lt;br /&gt;│ &lt;br /&gt;▼ &lt;br /&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;Repository&lt;/span&gt; &amp;larr; DB 접근&lt;br /&gt;│ &lt;br /&gt;▼ Database&lt;/blockquote&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-filename=&quot;스크린샷 2026-07-07 142500.png&quot; data-origin-width=&quot;733&quot; data-origin-height=&quot;336&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b1l2Qd/dJMcaaMHo0R/Ye7IhK643Ra7Reg1YWzb7k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b1l2Qd/dJMcaaMHo0R/Ye7IhK643Ra7Reg1YWzb7k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b1l2Qd/dJMcaaMHo0R/Ye7IhK643Ra7Reg1YWzb7k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb1l2Qd%2FdJMcaaMHo0R%2FYe7IhK643Ra7Reg1YWzb7k%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;733&quot; height=&quot;336&quot; data-filename=&quot;스크린샷 2026-07-07 142500.png&quot; data-origin-width=&quot;733&quot; data-origin-height=&quot;336&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h1&gt;Maven이란 무엇인가&lt;/h1&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;기존의 방식과 비교&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이전에는 MySQL 드라이버 jar 파일을 직접 다운로드해서 lib 폴더에 넣고 Build Path에 등록했음&lt;/li&gt;
&lt;li&gt;라이브러리가 하나둘 늘어나면(JDBC 드라이버, JSTL, Lombok, Spring 관련 수십 개 라이브러리...) 이 작업을 전부 수동으로 하기는 매우 비효율적&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Maven의 역할&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;빌드 도구 + 의존성 관리 도구&lt;/b&gt;: 프로젝트에 필요한 라이브러리 목록을 pom.xml이라는 설정 파일에 &quot;선언&quot;만 하면, Maven이 인터넷(Maven Central 저장소)에서 자동으로 다운로드하고 프로젝트에 연결해줌&lt;/li&gt;
&lt;li&gt;Day1처럼 jar를 직접 찾아 다운로드하고 Build Path에 등록하는 과정이 전부 생략됨&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>개발자 호소인/Server</category>
      <author>리제 </author>
      <guid isPermaLink="true">https://bookstairs.tistory.com/98</guid>
      <comments>https://bookstairs.tistory.com/98#entry98comment</comments>
      <pubDate>Tue, 7 Jul 2026 14:26:18 +0900</pubDate>
    </item>
    <item>
      <title>쿠키(Cookie)  / 세션(Session)</title>
      <link>https://bookstairs.tistory.com/97</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;쿠키란&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;서버가 클라이언트(브라우저)에게 전달해서 &lt;b&gt;클라이언트 측에 저장&lt;/b&gt;하는 작은 데이터 조각&lt;/li&gt;
&lt;li&gt;이후 요청마다 브라우저가 자동으로 서버에 함께 전송함&lt;/li&gt;
&lt;li&gt;로그인 유지, 최근 본 상품 등에 활용 (단, 보안에 민감한 정보는 저장 지양)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;쿠키 생성&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-07-03 164704.png&quot; data-origin-width=&quot;720&quot; data-origin-height=&quot;835&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/YcJcv/dJMcaiRsc35/QGkpgKk8OwKDe40z6lMph0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/YcJcv/dJMcaiRsc35/QGkpgKk8OwKDe40z6lMph0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/YcJcv/dJMcaiRsc35/QGkpgKk8OwKDe40z6lMph0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FYcJcv%2FdJMcaiRsc35%2FQGkpgKk8OwKDe40z6lMph0%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;720&quot; height=&quot;835&quot; data-filename=&quot;스크린샷 2026-07-03 164704.png&quot; data-origin-width=&quot;720&quot; data-origin-height=&quot;835&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&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;h2 data-ke-size=&quot;size26&quot;&gt;세션(Session)&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;쿠키와 달리 데이터가 &lt;b&gt;서버 측에 저장&lt;/b&gt;되고, 클라이언트에는 세션을 식별할 수 있는 &lt;b&gt;JSESSIONID&lt;/b&gt;만 쿠키로 전달됨&lt;/li&gt;
&lt;li&gt;로그인 상태 유지처럼 &lt;b&gt;민감하거나 용량이 큰 데이터&lt;/b&gt;를 다룰 때 쿠키보다 안전&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-07-03 164809.png&quot; data-origin-width=&quot;741&quot; data-origin-height=&quot;689&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/btCQd9/dJMcacRbLF2/dkiBnAjkc0XVJD8SKdV3s0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/btCQd9/dJMcacRbLF2/dkiBnAjkc0XVJD8SKdV3s0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/btCQd9/dJMcacRbLF2/dkiBnAjkc0XVJD8SKdV3s0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbtCQd9%2FdJMcacRbLF2%2FdkiBnAjkc0XVJD8SKdV3s0%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;741&quot; height=&quot;689&quot; data-filename=&quot;스크린샷 2026-07-03 164809.png&quot; data-origin-width=&quot;741&quot; data-origin-height=&quot;689&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt; 세션 값 꺼내기 / 종료&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-07-03 164845.png&quot; data-origin-width=&quot;739&quot; data-origin-height=&quot;682&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/M3mnU/dJMcacDLvCK/4DzNGBjCQJQv8x06nvqW51/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/M3mnU/dJMcacDLvCK/4DzNGBjCQJQv8x06nvqW51/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/M3mnU/dJMcacDLvCK/4DzNGBjCQJQv8x06nvqW51/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FM3mnU%2FdJMcacDLvCK%2F4DzNGBjCQJQv8x06nvqW51%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;739&quot; height=&quot;682&quot; data-filename=&quot;스크린샷 2026-07-03 164845.png&quot; data-origin-width=&quot;739&quot; data-origin-height=&quot;682&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;table id=&quot;391435fc-bd9d-80d0-8a66-fe350116ef27&quot; style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style14&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;구분&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;쿠키&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;세션&lt;/td&gt;
&lt;/tr&gt;
&lt;tr id=&quot;391435fc-bd9d-8023-b9cf-d01c1c7fd3c4&quot;&gt;
&lt;td id=&quot;YNat&quot; style=&quot;text-align: center;&quot;&gt;저장 위치&lt;/td&gt;
&lt;td id=&quot;YUbB&quot; style=&quot;text-align: center;&quot;&gt;클라이언트(브라우저)&lt;/td&gt;
&lt;td id=&quot;v&amp;gt;G&amp;lt;&quot; style=&quot;text-align: center;&quot;&gt;서버&lt;/td&gt;
&lt;/tr&gt;
&lt;tr id=&quot;391435fc-bd9d-8014-966b-ee2fb3fc9690&quot;&gt;
&lt;td id=&quot;YNat&quot; style=&quot;text-align: center;&quot;&gt;보안&lt;/td&gt;
&lt;td id=&quot;YUbB&quot; style=&quot;text-align: center;&quot;&gt;상대적으로 취약&lt;/td&gt;
&lt;td id=&quot;v&amp;gt;G&amp;lt;&quot; style=&quot;text-align: center;&quot;&gt;상대적으로 안전&lt;/td&gt;
&lt;/tr&gt;
&lt;tr id=&quot;391435fc-bd9d-805b-abe1-c1468776b47d&quot;&gt;
&lt;td id=&quot;YNat&quot; style=&quot;text-align: center;&quot;&gt;용량&lt;/td&gt;
&lt;td id=&quot;YUbB&quot; style=&quot;text-align: center;&quot;&gt;작음 (문자열 위주)&lt;/td&gt;
&lt;td id=&quot;v&amp;gt;G&amp;lt;&quot; style=&quot;text-align: center;&quot;&gt;서버 메모리 허용 범위 내 자유로움&lt;/td&gt;
&lt;/tr&gt;
&lt;tr id=&quot;391435fc-bd9d-80a0-b861-eaca12751fb6&quot;&gt;
&lt;td id=&quot;YNat&quot; style=&quot;text-align: center;&quot;&gt;만료&lt;/td&gt;
&lt;td id=&quot;YUbB&quot; style=&quot;text-align: center;&quot;&gt;직접 설정한 시간&lt;/td&gt;
&lt;td id=&quot;v&amp;gt;G&amp;lt;&quot; style=&quot;text-align: center;&quot;&gt;서버 설정 타임아웃 또는 invalidate()&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;</description>
      <category>개발자 호소인/Server</category>
      <author>리제 </author>
      <guid isPermaLink="true">https://bookstairs.tistory.com/97</guid>
      <comments>https://bookstairs.tistory.com/97#entry97comment</comments>
      <pubDate>Fri, 3 Jul 2026 16:49:57 +0900</pubDate>
    </item>
    <item>
      <title>웹 서버 &amp;amp; WAS</title>
      <link>https://bookstairs.tistory.com/96</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;웹 서버(Web Server)란&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;클라이언트(브라우저)의 요청을 받아 &lt;b&gt;정적인 자원&lt;/b&gt;(HTML, CSS, JS, 이미지)을 응답해주는 서버&lt;/li&gt;
&lt;li&gt;대표: Apache, Nginx&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;WAS(Web Application Server)란&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;정적 자원뿐 아니라 &lt;b&gt;동적인 처리&lt;/b&gt;(DB 조회, 로직 실행 후 결과 생성)가 가능한 서버&lt;/li&gt;
&lt;li&gt;내부에 &lt;b&gt;서블릿 컨테이너&lt;/b&gt;를 가지고 있어서 Servlet, JSP 코드를 실행할 수 있음&lt;/li&gt;
&lt;li&gt;대표: Tomcat, JBoss, WebLogic&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-07-03 164216.png&quot; data-origin-width=&quot;762&quot; data-origin-height=&quot;362&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ct7jcy/dJMcac4KxoS/wUyrGPVQUyphUW2HUXKbW1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ct7jcy/dJMcac4KxoS/wUyrGPVQUyphUW2HUXKbW1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ct7jcy/dJMcac4KxoS/wUyrGPVQUyphUW2HUXKbW1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fct7jcy%2FdJMcac4KxoS%2FwUyrGPVQUyphUW2HUXKbW1%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;762&quot; height=&quot;362&quot; data-filename=&quot;스크린샷 2026-07-03 164216.png&quot; data-origin-width=&quot;762&quot; data-origin-height=&quot;362&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;h1&gt;&amp;nbsp;&lt;/h1&gt;
&lt;h1&gt;&amp;nbsp;&lt;/h1&gt;
&lt;h1&gt;&amp;nbsp;&lt;/h1&gt;
&lt;h1&gt;&amp;nbsp;&lt;/h1&gt;
&lt;h1&gt;Servlet이란&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Server + Applet의 합성어로 JAVA언어를 이용하여 사용자의 요청을 받아 처리하고 그 결과를 다시 사용자에게 전송하는 역할의 Class파일을 말함. 즉 웹에서 동적인 페이지를 java로 구현한 서버 측 프로그램이다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;HttpServlet 클래스를 상속받아 작성하며, 서블릿 컨테이너(Tomcat)가 이 객체를 생성/호출/소멸시킴&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-07-03 164318.png&quot; data-origin-width=&quot;809&quot; data-origin-height=&quot;174&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/p27iS/dJMcacX0f5y/5cCMqtqReRgekdDVTdDdl1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/p27iS/dJMcacX0f5y/5cCMqtqReRgekdDVTdDdl1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/p27iS/dJMcacX0f5y/5cCMqtqReRgekdDVTdDdl1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fp27iS%2FdJMcacX0f5y%2F5cCMqtqReRgekdDVTdDdl1%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;809&quot; height=&quot;174&quot; data-filename=&quot;스크린샷 2026-07-03 164318.png&quot; data-origin-width=&quot;809&quot; data-origin-height=&quot;174&quot;/&gt;&lt;/span&gt;&lt;/figure&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;was에서 클라이언트의 요청을 받았을 때 처리해줘야하는 업무는 다음과 같다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;서버 TCP/IP 연결 대기, 소켓 연결&lt;/li&gt;
&lt;li&gt;HTTP 요청 메시지를 파싱해서 읽기&lt;/li&gt;
&lt;li&gt;POST 방식, /save URL 인지&lt;/li&gt;
&lt;li&gt;Content-Type 확인&lt;/li&gt;
&lt;li&gt;HTTP 메시지 바디 내용 피싱&lt;/li&gt;
&lt;li&gt;username, age 데이터를 사용할 수 있게 파싱&lt;/li&gt;
&lt;li&gt;저장 프로세스 실행&lt;/li&gt;
&lt;li&gt;비즈니스 로직 실행&lt;/li&gt;
&lt;li&gt;HTTP 응답 메시지 생성&lt;/li&gt;
&lt;li&gt;TCP/IP에 응답 전달, 소켓 종료&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 이중에 실질적으로 서버에서 처리해줘야하는 의미있는 동작은 데이터베이스와 연결되는 비즈니스로직을 실행하는 부분이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나머지 동작들은 http표준에따라 요청을 받아 응답을 내려주기위한 작업이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이때 서블릿을 사용하면 서블릿 객체는 특정 url에 맵핑되는 서블릿을 통해 HTTP 요청 정보를 편리하게 사용할 수 있는 HttpServletRequest와 HTTP 응답 정보를 편리하게 제공할 수 있는 HttpServletResponse를 만들어 준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이는 개발자가 http스펙을 사용할 때 비즈니스로직만 구현할 수 있도록 돕는다.&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;HTTP 요청, 응답 흐름&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;HTTP 요청시&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;WAS는 Request, Response 객체를 새로 만들어서 서블릿 객체 호출&lt;/li&gt;
&lt;li&gt;개발자는 HttpServletRequest객체에서 HTTP 요청 정보를 편리하게 꺼내서 사용&lt;/li&gt;
&lt;li&gt;개발자는 HttpServletResponse객체에 HTTP 응답 정보를 편리하게 입력&lt;/li&gt;
&lt;li&gt;WAS는 Response 객체에 담겨있는 내용으로 HTTP 응답 정보를 생성&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-07-03 164356.png&quot; data-origin-width=&quot;746&quot; data-origin-height=&quot;410&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/z1dyq/dJMcajv4wSE/dmBSQwN8T19MuXNPyjFjh1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/z1dyq/dJMcajv4wSE/dmBSQwN8T19MuXNPyjFjh1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/z1dyq/dJMcajv4wSE/dmBSQwN8T19MuXNPyjFjh1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fz1dyq%2FdJMcajv4wSE%2FdmBSQwN8T19MuXNPyjFjh1%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;746&quot; height=&quot;410&quot; data-filename=&quot;스크린샷 2026-07-03 164356.png&quot; data-origin-width=&quot;746&quot; data-origin-height=&quot;410&quot;/&gt;&lt;/span&gt;&lt;/figure&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;톰캣처럼 서블릿을 지원하는 WAS에서 서블릿의 생명주기를 관리하는 것을 서블릿컨테이너라고 한다. 모든 서블릿 객체는 싱글톤으로 관리되어 최초 로딩 시점에 생성되고, 모든 클라이언트 요청은 동일한 인스턴스를 재활용한다. 이를 통해 효율성을 높이지만, 공유 변수를 사용할 때는 주의가 필요하다. JSP는 서블릿으로 변환되어 실행되며, 서블릿 컨테이너는 동시 요청을 위한 멀티 쓰레드 처리를 지원한다.&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 widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-07-03 164418.png&quot; data-origin-width=&quot;735&quot; data-origin-height=&quot;351&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/l4Szi/dJMb99UuRn8/8Hc0sFOVn7QWnyEhPZNI40/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/l4Szi/dJMb99UuRn8/8Hc0sFOVn7QWnyEhPZNI40/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/l4Szi/dJMb99UuRn8/8Hc0sFOVn7QWnyEhPZNI40/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fl4Szi%2FdJMb99UuRn8%2F8Hc0sFOVn7QWnyEhPZNI40%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;735&quot; height=&quot;351&quot; data-filename=&quot;스크린샷 2026-07-03 164418.png&quot; data-origin-width=&quot;735&quot; data-origin-height=&quot;351&quot;/&gt;&lt;/span&gt;&lt;/figure&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;애플리케이션 코드를 하나하나 순차적으로 실행하는 개념인 쓰레드를 통해 동시요청을 처리하며, 톰캣은 요청마다 하나의 쓰레드를 만들어 여러요청을 동시에 처리하는 병행처리를 지원한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다만 요청시마다 쓰레드를 생성하는 경우 쓰레드가 제한없이 생길 수 있어 리소스(cpu, 메모리)의 한계를 넘을 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한 쓰레드를 생성하고 삭제하는데 필요한 비용은 매우 높다. 그래서 쓰레드 풀을 만들어 쓰레드를 관리한다. 고로 WAS를 사용하면 멀티쓰레드를 개발자가 신경쓰지 않아도 된다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;쓰레드 풀이란?&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;쓰레드를 사용후 삭제하지않고 보관하고 관리하는 공간.&lt;br /&gt;쓰레드를 생성가능한 최대치를 생성한 후 필요할 때마다 꺼내서 사용하고 반납한다.&lt;/li&gt;
&lt;li&gt;모든 쓰레드가 사용중이여서 더이상 사용가능한 쓰레드가 없다면 이후 요청은 거절하거나 특정시간만큼 대기하도록 설정할 수 있다.&lt;/li&gt;
&lt;li&gt;쓰레드를 생성하고 종료하는 비용을 절감할 수 있고, 빠르게 사용가능하며, 많은 요청이 들어와도 쓰레드의 갯수가 초과생성되는 것을 막아줄 수 있다.&lt;/li&gt;
&lt;li&gt;WAS는 사용하는 컴퓨터 스펙에 맞춰 쓰레드의 갯수를 적절하게 설정해줘야한다.&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;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;Servlet 생명주기&lt;/h1&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;컨테이너가 관리하는 3단계&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;init()&lt;/b&gt; : 최초 요청이 들어올 때 &lt;b&gt;딱 한 번만&lt;/b&gt; 호출 (서블릿 객체 생성 및 초기화)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;service()&lt;/b&gt; : 요청이 들어올 때마다 호출 &amp;rarr; 내부적으로 HTTP 메서드(GET/POST 등)에 따라 doGet/doPost로 자동 분기&lt;/li&gt;
&lt;li&gt;&lt;b&gt;destroy()&lt;/b&gt; : 서버가 종료되거나 서블릿이 컨테이너에서 내려갈 때 &lt;b&gt;딱 한 번만&lt;/b&gt; 호출 (자원 정리)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-07-03 164509.png&quot; data-origin-width=&quot;747&quot; data-origin-height=&quot;503&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bYIdWB/dJMcagsyUHv/K8RXmkh2T4kvbVm2kNIZPk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bYIdWB/dJMcagsyUHv/K8RXmkh2T4kvbVm2kNIZPk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bYIdWB/dJMcagsyUHv/K8RXmkh2T4kvbVm2kNIZPk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbYIdWB%2FdJMcagsyUHv%2FK8RXmkh2T4kvbVm2kNIZPk%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;747&quot; height=&quot;503&quot; data-filename=&quot;스크린샷 2026-07-03 164509.png&quot; data-origin-width=&quot;747&quot; data-origin-height=&quot;503&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;핵심 포인트: Servlet은 싱글톤처럼 동작&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;서블릿 객체는 &lt;b&gt;요청마다 새로 생성되는 게 아니라 최초 1개만 생성되어 재사용&lt;/b&gt;됨&lt;/li&gt;
&lt;li&gt;따라서 서블릿 클래스에 &lt;b&gt;인스턴스 변수(필드)를 두면 모든 사용자가 그 값을 공유&lt;/b&gt;하게 되어 위험함&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-07-03 164551.png&quot; data-origin-width=&quot;735&quot; data-origin-height=&quot;326&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/n0X2Y/dJMcadbsaJi/pTATbw2nKvPdEGUKFKTOr0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/n0X2Y/dJMcadbsaJi/pTATbw2nKvPdEGUKFKTOr0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/n0X2Y/dJMcadbsaJi/pTATbw2nKvPdEGUKFKTOr0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fn0X2Y%2FdJMcadbsaJi%2FpTATbw2nKvPdEGUKFKTOr0%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;735&quot; height=&quot;326&quot; data-filename=&quot;스크린샷 2026-07-03 164551.png&quot; data-origin-width=&quot;735&quot; data-origin-height=&quot;326&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>개발자 호소인/Server</category>
      <author>리제 </author>
      <guid isPermaLink="true">https://bookstairs.tistory.com/96</guid>
      <comments>https://bookstairs.tistory.com/96#entry96comment</comments>
      <pubDate>Fri, 3 Jul 2026 16:46:01 +0900</pubDate>
    </item>
    <item>
      <title>JDBC(Java Database Connectivity)</title>
      <link>https://bookstairs.tistory.com/95</link>
      <description>&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;자바 애플리케이션에서 데이터베이스에 접속해 SQL을 실행할 수 있게 해주는 표준 API&lt;/li&gt;
&lt;li&gt;자바 진영에서 만든 &lt;b&gt;인터페이스 모음&lt;/b&gt;이며, 실제 동작은 각 DBMS 벤더가 제공하는 드라이버(구현체)가 담당&lt;/li&gt;
&lt;li&gt;즉 개발자는 MySQL이든 Oracle이든 동일한 JDBC 인터페이스(Connection, Statement, ResultSet 등)로 코드를 작성하고, DB 종류만 바뀌면 드라이버만 교체하면 됨 &amp;rarr; &lt;b&gt;DB 독립적인 코드 작성이 가능&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;JDBC의 핵심 흐름&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;드라이버 로딩&lt;/li&gt;
&lt;li&gt;Connection(연결) 획득&lt;/li&gt;
&lt;li&gt;Statement(SQL 실행 객체) 생성&lt;/li&gt;
&lt;li&gt;SQL 실행&lt;/li&gt;
&lt;li&gt;결과(ResultSet) 처리&lt;/li&gt;
&lt;li&gt;자원 반납(close)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-07-03 163659.png&quot; data-origin-width=&quot;616&quot; data-origin-height=&quot;229&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b9hnLE/dJMcahSt64f/0OIM4k2g0JIgC94484OvF1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b9hnLE/dJMcahSt64f/0OIM4k2g0JIgC94484OvF1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b9hnLE/dJMcahSt64f/0OIM4k2g0JIgC94484OvF1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb9hnLE%2FdJMcahSt64f%2F0OIM4k2g0JIgC94484OvF1%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;616&quot; height=&quot;229&quot; data-filename=&quot;스크린샷 2026-07-03 163659.png&quot; data-origin-width=&quot;616&quot; data-origin-height=&quot;229&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;접속 정보(JDBC URL) 구조&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-07-03 163815.png&quot; data-origin-width=&quot;665&quot; data-origin-height=&quot;665&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Ry6yn/dJMcaalw2Pp/UlaRfymLrr8IMM7V2FKhMK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Ry6yn/dJMcaalw2Pp/UlaRfymLrr8IMM7V2FKhMK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Ry6yn/dJMcaalw2Pp/UlaRfymLrr8IMM7V2FKhMK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FRy6yn%2FdJMcaalw2Pp%2FUlaRfymLrr8IMM7V2FKhMK%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;665&quot; height=&quot;665&quot; data-filename=&quot;스크린샷 2026-07-03 163815.png&quot; data-origin-width=&quot;665&quot; data-origin-height=&quot;665&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;server계정으로 접속&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-07-03 163902.png&quot; data-origin-width=&quot;615&quot; data-origin-height=&quot;571&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bVbZIr/dJMcag0lxYW/Hd6guqymNDMmCLHPTHxYAK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bVbZIr/dJMcag0lxYW/Hd6guqymNDMmCLHPTHxYAK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bVbZIr/dJMcag0lxYW/Hd6guqymNDMmCLHPTHxYAK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbVbZIr%2FdJMcag0lxYW%2FHd6guqymNDMmCLHPTHxYAK%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;615&quot; height=&quot;571&quot; data-filename=&quot;스크린샷 2026-07-03 163902.png&quot; data-origin-width=&quot;615&quot; data-origin-height=&quot;571&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h1&gt;Connection 얻기 (DriverManager)&lt;/h1&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;드라이버 로딩 (JDBC 4.0 이후 생략 가능)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;과거에는 Class.forName(&quot;com.mysql.cj.jdbc.Driver&quot;)로 드라이버를 명시적으로 로딩해야 했음&lt;/li&gt;
&lt;li&gt;&amp;rarr; JDBC 4.0부터는 드라이버가 서비스 등록 방식(SPI)을 지원해서 생략 가능함.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;DriverManager.getConnection()&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 widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-07-03 163946.png&quot; data-origin-width=&quot;620&quot; data-origin-height=&quot;528&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qvfHH/dJMcacjlSGP/999zQ8N8XZioBzTtnGbx80/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qvfHH/dJMcacjlSGP/999zQ8N8XZioBzTtnGbx80/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qvfHH/dJMcacjlSGP/999zQ8N8XZioBzTtnGbx80/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqvfHH%2FdJMcacjlSGP%2F999zQ8N8XZioBzTtnGbx80%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;620&quot; height=&quot;528&quot; data-filename=&quot;스크린샷 2026-07-03 163946.png&quot; data-origin-width=&quot;620&quot; data-origin-height=&quot;528&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;div&gt;&lt;span style=&quot;background-color: #000000; color: #eb5757;&quot; data-token-index=&quot;0&quot;&gt;try-with-resources&lt;/span&gt;&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용 &amp;rarr; 블록이 끝나면 Connection이 자동으로 close() 됨&lt;span style=&quot;background-color: #ffc1c8;&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;&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>개발자 호소인/Server</category>
      <author>리제 </author>
      <guid isPermaLink="true">https://bookstairs.tistory.com/95</guid>
      <comments>https://bookstairs.tistory.com/95#entry95comment</comments>
      <pubDate>Fri, 3 Jul 2026 16:41:08 +0900</pubDate>
    </item>
    <item>
      <title>[javaScript] 9.클로저(Closure)</title>
      <link>https://bookstairs.tistory.com/94</link>
      <description>&lt;p data-path-to-node=&quot;3&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;3&quot;&gt;개념&lt;/b&gt; 클로저는 함수와 그 함수가 선언된 렉시컬 환경(Lexical Environment)의 조합을 의미한다. 함수가 선언될 당시의 외부 변수들을 함수 내부에서 기억하고, 함수가 호출된 이후에도 해당 변수에 접근할 수 있게 하는 메커니즘이다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;4&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;4&quot;&gt;기능&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;5&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;5,0,0&quot;&gt;상태 유지&lt;/b&gt;: 특정 함수의 실행이 종료되어도 변수의 값을 유지해야 할 때 활용한다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;5,1,0&quot;&gt;정보 은닉(캡슐화)&lt;/b&gt;: 외부에서 직접 접근할 수 없는 내부 변수를 생성하여 의도치 않은 변경을 방지한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-path-to-node=&quot;6&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;6&quot;&gt;예시: 상태 유지&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-07-03 161820.png&quot; data-origin-width=&quot;763&quot; data-origin-height=&quot;342&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uRMal/dJMcafArlkI/Fud6JXCIKTg2ngitpqPA80/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uRMal/dJMcafArlkI/Fud6JXCIKTg2ngitpqPA80/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uRMal/dJMcafArlkI/Fud6JXCIKTg2ngitpqPA80/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuRMal%2FdJMcafArlkI%2FFud6JXCIKTg2ngitpqPA80%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;763&quot; height=&quot;342&quot; data-filename=&quot;스크린샷 2026-07-03 161820.png&quot; data-origin-width=&quot;763&quot; data-origin-height=&quot;342&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-path-to-node=&quot;9&quot; data-ke-size=&quot;size23&quot;&gt;2. 모듈 패턴 (Module Pattern)&lt;/h3&gt;
&lt;p data-path-to-node=&quot;10&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;10&quot;&gt;개념&lt;/b&gt; 모듈 패턴은 클로저를 활용하여 객체의 속성과 메서드 중 일부를 비공개(private)로 만들고, 필요한 부분만 공개(public)하는 기법이다. 자바스크립트에서 객체지향의 캡슐화를 구현하기 위한 전통적인 방법이다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;10&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;10&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;11&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;11&quot;&gt;기능&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;12&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;12,0,0&quot;&gt;데이터 은닉&lt;/b&gt;: 전역 변수의 사용을 억제하고, 내부 변수에 대한 직접적인 접근을 차단한다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;12,1,0&quot;&gt;인터페이스 제공&lt;/b&gt;: 공개된 메서드를 통해서만 내부 데이터를 조작하도록 하여 데이터 무결성을 유지한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-path-to-node=&quot;13&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;13&quot;&gt;예시: 데이터 은닉&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-07-03 161915.png&quot; data-origin-width=&quot;750&quot; data-origin-height=&quot;375&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/biWbC2/dJMcaiKC8wK/0pBX3kpl7q0zinOmXKNzx1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/biWbC2/dJMcaiKC8wK/0pBX3kpl7q0zinOmXKNzx1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/biWbC2/dJMcaiKC8wK/0pBX3kpl7q0zinOmXKNzx1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbiWbC2%2FdJMcaiKC8wK%2F0pBX3kpl7q0zinOmXKNzx1%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;750&quot; height=&quot;375&quot; data-filename=&quot;스크린샷 2026-07-03 161915.png&quot; data-origin-width=&quot;750&quot; data-origin-height=&quot;375&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-path-to-node=&quot;16&quot; data-ke-size=&quot;size23&quot;&gt;3. 클로저의 주요 활용 사례&lt;/h3&gt;
&lt;h4 data-path-to-node=&quot;17&quot; data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;콜백 및 이벤트 핸들러&lt;/h4&gt;
&lt;p data-path-to-node=&quot;18&quot; data-ke-size=&quot;size16&quot;&gt;비동기 처리나 이벤트 구동 환경에서 특정 시점의 환경을 기억해야 할 때 사용된다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;19&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;19&quot;&gt;예시: 이벤트 핸들러 (한 번만 실행)&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-07-03 161953.png&quot; data-origin-width=&quot;728&quot; data-origin-height=&quot;381&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dd9ukG/dJMcaftDYjB/DTwovrgOHn3dvswwazjI60/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dd9ukG/dJMcaftDYjB/DTwovrgOHn3dvswwazjI60/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dd9ukG/dJMcaftDYjB/DTwovrgOHn3dvswwazjI60/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdd9ukG%2FdJMcaftDYjB%2FDTwovrgOHn3dvswwazjI60%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;728&quot; height=&quot;381&quot; data-filename=&quot;스크린샷 2026-07-03 161953.png&quot; data-origin-width=&quot;728&quot; data-origin-height=&quot;381&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-path-to-node=&quot;21&quot; data-ke-size=&quot;size20&quot;&gt;함수형 프로그래밍에서의 활용&lt;/h4&gt;
&lt;p data-path-to-node=&quot;22&quot; data-ke-size=&quot;size16&quot;&gt;고차 함수(Higher-Order Function)를 구현하여, 특정 환경이 고정된 새로운 함수를 생성하는 데 유리하다.&lt;/p&gt;
&lt;h3 data-path-to-node=&quot;24&quot; data-ke-size=&quot;size23&quot;&gt;요약 및 핵심&lt;/h3&gt;
&lt;p data-path-to-node=&quot;25&quot; data-ke-size=&quot;size16&quot;&gt;이 개념들의 근간은 &lt;b data-index-in-node=&quot;11&quot; data-path-to-node=&quot;25&quot;&gt;독립된 렉시컬 환경&lt;/b&gt;에 있다. 클로저는 외부 함수가 생명주기를 다해도 내부 함수가 해당 환경을 참조하고 있기 때문에 메모리에서 해제되지 않으며, 이 특성을 이용해 개발자는 데이터의 안전한 보호와 상태 관리라는 강력한 기능을 구현할 수 있다.&lt;/p&gt;</description>
      <category>개발자 호소인/Front</category>
      <author>리제 </author>
      <guid isPermaLink="true">https://bookstairs.tistory.com/94</guid>
      <comments>https://bookstairs.tistory.com/94#entry94comment</comments>
      <pubDate>Fri, 3 Jul 2026 16:20:16 +0900</pubDate>
    </item>
    <item>
      <title>HTML/CSS/JS- 웹페이지 제작 과제</title>
      <link>https://bookstairs.tistory.com/93</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;과제 목표&lt;/h2&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지금까지 배운 HTML &amp;middot; CSS &amp;middot; JavaScript로 &lt;b&gt;하나의 완성된 웹사이트&lt;/b&gt;를 직접 만들고,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이를 &lt;b&gt;GitHub에 배포&lt;/b&gt;하여 누구나 접속할 수 있는 URL로 공개합니다. 마지막으로 &lt;b&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;div style=&quot;background-color: #fafafa; color: #333333;&quot; data-text-less=&quot;닫기&quot; data-text-more=&quot;더보기&quot; data-ke-type=&quot;moreLess&quot;&gt;배운 개념(DOM 조작, 이벤트, 정규표현식, 웹 스토리지 등)을 실제 기능으로 구현해본다.&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div style=&quot;background-color: #fafafa; color: #333333;&quot; data-text-less=&quot;닫기&quot; data-text-more=&quot;더보기&quot; data-ke-type=&quot;moreLess&quot;&gt;Git과 GitHub Pages를 이용한 정적 사이트 배포 흐름을 경험한다.&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div style=&quot;background-color: #fafafa; color: #333333;&quot; data-text-less=&quot;닫기&quot; data-text-more=&quot;더보기&quot; data-ke-type=&quot;moreLess&quot;&gt;개발 과정을 글로 정리하며 회고하는 습관을 기른다.&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #9d9d9d;&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;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;무엇을 만들까&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 프로젝트에서 가장 어려웠던 점은 코드를 작성하는 것보다 &lt;b&gt;방향을 정하는 일&lt;/b&gt;이었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;처음 목표는 단순했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;'상담을 받고 싶어지는 홈페이지를 만들자.'&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 며칠 동안 직접 만들고, 수정하고, 다시 만드는 과정을 반복하면서 목표가 조금씩 달라지기 시작했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결국 제가 만들고 싶었던 것은 상담이나 교육을 홍보하는 홈페이지가 아니었습니다.&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;b&gt;'나에게 어떤 상담 스타일이 잘 맞는지'&lt;/b&gt;를 자연스럽게 발견할 수 있는 사이트를 만들고 싶었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;물론 이렇게 생각할 수도 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;&quot;저는 상담에 관심이 없는데요?&quot;&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 우리는 생각보다 많은 상담 속에서 살아갑니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;친구와의 고민 상담, 진로 상담, 병원 상담, 취업 상담처럼, 자의든 타의든 상담은 우리의 일상에 늘 존재합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저는 상담을 &lt;b&gt;'대화의 심화 버전'&lt;/b&gt;이라고 생각합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대화를 잘하는 사람은 상대의 이야기를 잘 듣는 사람이고,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;상담을 잘하는 사람은 그 이야기를 바탕으로 문제를 이해하고, 해결의 방향을 제시하며, 공감과 위로를 전합니다.&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 이번 프로젝트에서는 소르지낙을 홍보하거나 교육 커리큘럼을 소개하는 것을 가장 앞세우지 않았습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오히려 우연히 방문한 사용자가&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;어? 나는 이런 상담 스타일이 잘 맞는 사람이구나.&quot;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;혹은&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;이런 방식이라면 나도 누군가를 잘 이해하고 도울 수 있겠는데?&quot;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;라는 작은 발견 하나를 얻어 갈 수 있는 웹사이트를 만들고 싶었습니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 가장 먼저 한 일은 &lt;b&gt;레이아웃을 손으로 직접 그려보는 것&lt;/b&gt;이었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;웹툰을 읽듯 천천히 아래로 스크롤하면서 이야기를 따라가는 구조를 떠올렸고,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용자가 콘텐츠를 소비하는 것이 아니라 하나의 경험을 하는 웹사이트를 만들고 싶었습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yiHfP/dJMcaa0aWj5/oUrrpw10bllyaVzKRPnWtK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yiHfP/dJMcaa0aWj5/oUrrpw10bllyaVzKRPnWtK/img.png&quot; data-origin-width=&quot;2250&quot; data-origin-height=&quot;1660&quot; data-filename=&quot;blob&quot; data-is-animation=&quot;false&quot; data-widthpercent=&quot;36.29&quot; style=&quot;width: 35.4497%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yiHfP/dJMcaa0aWj5/oUrrpw10bllyaVzKRPnWtK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyiHfP%2FdJMcaa0aWj5%2FoUrrpw10bllyaVzKRPnWtK%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;2250&quot; height=&quot;1660&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/B9REe/dJMcaglNAIy/ObJV35lKb1RQYscsBTnJm1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/B9REe/dJMcaglNAIy/ObJV35lKb1RQYscsBTnJm1/img.png&quot; data-origin-width=&quot;840&quot; data-origin-height=&quot;644&quot; data-filename=&quot;스크린샷 2026-07-06 164539.png&quot; data-is-animation=&quot;false&quot; style=&quot;width: 34.1139%; margin-right: 10px;&quot; data-widthpercent=&quot;34.93&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/B9REe/dJMcaglNAIy/ObJV35lKb1RQYscsBTnJm1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FB9REe%2FdJMcaglNAIy%2FObJV35lKb1RQYscsBTnJm1%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;840&quot; height=&quot;644&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/njbVr/dJMb9973BXF/Tv9kBoP7qQkPpxteXO09L1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/njbVr/dJMb9973BXF/Tv9kBoP7qQkPpxteXO09L1/img.png&quot; data-origin-width=&quot;905&quot; data-origin-height=&quot;842&quot; data-filename=&quot;스크린샷 2026-07-06 164644.png&quot; data-is-animation=&quot;false&quot; style=&quot;width: 28.1109%;&quot; data-widthpercent=&quot;28.78&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/njbVr/dJMb9973BXF/Tv9kBoP7qQkPpxteXO09L1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnjbVr%2FdJMb9973BXF%2FTv9kBoP7qQkPpxteXO09L1%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;905&quot; height=&quot;842&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-07-06 163809.png&quot; data-origin-width=&quot;1138&quot; data-origin-height=&quot;733&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/AqcDJ/dJMcag7aK4I/IkHEpGfaUOLuKT1unuR5w0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/AqcDJ/dJMcag7aK4I/IkHEpGfaUOLuKT1unuR5w0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/AqcDJ/dJMcag7aK4I/IkHEpGfaUOLuKT1unuR5w0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAqcDJ%2FdJMcag7aK4I%2FIkHEpGfaUOLuKT1unuR5w0%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;1138&quot; height=&quot;733&quot; data-filename=&quot;스크린샷 2026-07-06 163809.png&quot; data-origin-width=&quot;1138&quot; data-origin-height=&quot;733&quot;/&gt;&lt;/span&gt;&lt;/figure&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;처음에는 &lt;b&gt;9가지 풍경을 모티프로 한 리딩 스타일&lt;/b&gt;을 기획했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;숲, 호수, 새벽, 별처럼 각각의 풍경에 상담의 특징을 담아 사용자의 성향을 표현하는 방식이었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 실제로 구현해 보니 한 가지 문제가 있었습니다.&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;b&gt;정보는 있었지만 구조가 보이지 않았습니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 사용자에게 더 직관적인 방법을 고민했고, 떠올린 것이 색조 화장품 상세페이지에서 자주 사용하는 &lt;b&gt;컬러 스펙트럼 차트&lt;/b&gt;였습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;화장품이 색의 위치만으로도 서로의 차이를 직관적으로 보여주듯,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저도 상담 스타일을 하나의 좌표 위에 배치하면 사용자들이 자신의 위치와 다른 스타일과의 관계를 훨씬 쉽게 이해할 수 있을 것이라고 생각했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 기존의 풍경 컨셉은 유지하면서도, 각 스타일을 &lt;b&gt;2차원 좌표계&lt;/b&gt;에 배치했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 &lt;b&gt;이성에서 감성&lt;/b&gt;, &lt;b&gt;분석에서 공감&lt;/b&gt;과 같은 두 개의 축을 기준으로 표현하니,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단순히 &quot;당신은 숲 타입입니다.&quot;에서 끝나는 것이 아니라,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&quot;나는 이쪽에 위치하고, 저 스타일과는 이런 차이가 있구나.&quot;&lt;/b&gt;를 한눈에 이해할 수 있는 구조가 되었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 과정을 통해 사용자에게 결과를 전달하는 방식도 훨씬 직관적으로 개선할 수 있었습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pCZgT/dJMcabEOGQa/56KlIVQvMbBpbc6IkWtZHk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pCZgT/dJMcabEOGQa/56KlIVQvMbBpbc6IkWtZHk/img.png&quot; data-origin-width=&quot;496&quot; data-origin-height=&quot;504&quot; data-filename=&quot;스크린샷 2026-07-08 144440.png&quot; data-is-animation=&quot;false&quot; data-widthpercent=&quot;59.62&quot; style=&quot;width: 58.9222%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pCZgT/dJMcabEOGQa/56KlIVQvMbBpbc6IkWtZHk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpCZgT%2FdJMcabEOGQa%2F56KlIVQvMbBpbc6IkWtZHk%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;496&quot; height=&quot;504&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bJJIFC/dJMcahkPt6K/3UGOBsa305btLkYzLH6XFK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bJJIFC/dJMcahkPt6K/3UGOBsa305btLkYzLH6XFK/img.png&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;1536&quot; data-filename=&quot;ChatGPT Image 2026년 7월 6일 오후 04_34_10.png&quot; data-is-animation=&quot;false&quot; style=&quot;width: 39.915%;&quot; data-widthpercent=&quot;40.38&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bJJIFC/dJMcahkPt6K/3UGOBsa305btLkYzLH6XFK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbJJIFC%2FdJMcahkPt6K%2F3UGOBsa305btLkYzLH6XFK%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;1024&quot; height=&quot;1536&quot;/&gt;&lt;/span&gt;&lt;/div&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;6각형의 성향 도표든, XY축 좌표든 자신의 상담 스타일을 객관적으로 이해하는 데 큰 도움이 됩니다.&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 모바일 화면에 올려보니 생각이 달라졌습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정보가 너무 많아 보였고, 작은 화면에서는 오히려 복잡하고 피곤하게 느껴졌습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;무엇보다 저는 사용자 입장에서 한 가지 질문을 던졌습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;'과연 누가 타로 상담 사이트에 들어와서 공부를 하고 싶어 할까?'&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대부분의 사용자는 배우러 오는 것이 아니라, 재미와 호기심으로 자신의 결과를 빠르게 확인하고 싶어 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 복잡한 설명을 줄이고, 필요한 정보만 직관적으로 보여주는 방향으로 다시 설계했습니다.&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;최종 완성본&amp;nbsp;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-07-08 184342.png&quot; data-origin-width=&quot;1549&quot; data-origin-height=&quot;847&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bIZFky/dJMcabkBEGe/MiLqykaKJg9kFqJM9MEMLk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bIZFky/dJMcabkBEGe/MiLqykaKJg9kFqJM9MEMLk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bIZFky/dJMcabkBEGe/MiLqykaKJg9kFqJM9MEMLk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbIZFky%2FdJMcabkBEGe%2FMiLqykaKJg9kFqJM9MEMLk%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;1549&quot; height=&quot;847&quot; data-filename=&quot;스크린샷 2026-07-08 184342.png&quot; data-origin-width=&quot;1549&quot; data-origin-height=&quot;847&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-07-08 184354.png&quot; data-origin-width=&quot;1431&quot; data-origin-height=&quot;586&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bWYKwA/dJMcacjpmhy/refZy7w6K49rlhXYDakeL0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bWYKwA/dJMcacjpmhy/refZy7w6K49rlhXYDakeL0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bWYKwA/dJMcacjpmhy/refZy7w6K49rlhXYDakeL0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbWYKwA%2FdJMcacjpmhy%2FrefZy7w6K49rlhXYDakeL0%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;1431&quot; height=&quot;586&quot; data-filename=&quot;스크린샷 2026-07-08 184354.png&quot; data-origin-width=&quot;1431&quot; data-origin-height=&quot;586&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-07-08 184407.png&quot; data-origin-width=&quot;825&quot; data-origin-height=&quot;360&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cVEZwV/dJMcacDO5k3/BAY9JYrg70ARX91xkbAm2k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cVEZwV/dJMcacDO5k3/BAY9JYrg70ARX91xkbAm2k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cVEZwV/dJMcacDO5k3/BAY9JYrg70ARX91xkbAm2k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcVEZwV%2FdJMcacDO5k3%2FBAY9JYrg70ARX91xkbAm2k%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;825&quot; height=&quot;360&quot; data-filename=&quot;스크린샷 2026-07-08 184407.png&quot; data-origin-width=&quot;825&quot; data-origin-height=&quot;360&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;됐지.gif&quot; data-origin-width=&quot;1880&quot; data-origin-height=&quot;840&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/3Y3h9/dJMcaaeVtOJ/AmcSBwCKJKuTh5kdfQKtNk/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3Y3h9/dJMcaaeVtOJ/AmcSBwCKJKuTh5kdfQKtNk/img.gif&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3Y3h9/dJMcaaeVtOJ/AmcSBwCKJKuTh5kdfQKtNk/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/3Y3h9/dJMcaaeVtOJ/AmcSBwCKJKuTh5kdfQKtNk/img.gif&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;1880&quot; height=&quot;840&quot; data-filename=&quot;됐지.gif&quot; data-origin-width=&quot;1880&quot; data-origin-height=&quot;840&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-end=&quot;1375&quot; data-start=&quot;1357&quot; data-section-id=&quot;wit5cc&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-end=&quot;1375&quot; data-start=&quot;1357&quot; data-section-id=&quot;wit5cc&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-end=&quot;1375&quot; data-start=&quot;1357&quot; data-section-id=&quot;wit5cc&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;가장 마음에 드는 부분&lt;/h2&gt;
&lt;p data-end=&quot;1423&quot; data-start=&quot;1377&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;데이터를 객체로 관리한 것&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;h4 data-end=&quot;1423&quot; data-start=&quot;1377&quot; data-ke-size=&quot;size20&quot;&gt;① 먼저 좌표를 저장한다.&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-07-08 191339.png&quot; data-origin-width=&quot;958&quot; data-origin-height=&quot;704&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b5iYLA/dJMcacqgS9A/vtfGXRDJZSJiJb0fvKWj9K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b5iYLA/dJMcacqgS9A/vtfGXRDJZSJiJb0fvKWj9K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b5iYLA/dJMcacqgS9A/vtfGXRDJZSJiJb0fvKWj9K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb5iYLA%2FdJMcacqgS9A%2FvtfGXRDJZSJiJb0fvKWj9K%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;958&quot; height=&quot;704&quot; data-filename=&quot;스크린샷 2026-07-08 191339.png&quot; data-origin-width=&quot;958&quot; data-origin-height=&quot;704&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h4 data-end=&quot;594&quot; data-start=&quot;568&quot; data-section-id=&quot;pfmhg4&quot; data-ke-size=&quot;size20&quot;&gt;② showLandscape()가 호출&lt;/h4&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;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-07-08 191312.png&quot; data-origin-width=&quot;879&quot; data-origin-height=&quot;255&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GOtKB/dJMb9975nCp/bfLsbcTf3lV5Kvob638xP0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GOtKB/dJMb9975nCp/bfLsbcTf3lV5Kvob638xP0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GOtKB/dJMb9975nCp/bfLsbcTf3lV5Kvob638xP0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGOtKB%2FdJMb9975nCp%2FbfLsbcTf3lV5Kvob638xP0%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;879&quot; height=&quot;255&quot; data-filename=&quot;스크린샷 2026-07-08 191312.png&quot; data-origin-width=&quot;879&quot; data-origin-height=&quot;255&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-07-08 191255.png&quot; data-origin-width=&quot;920&quot; data-origin-height=&quot;558&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/B7gL8/dJMcaf1vBzh/Chdlfaxzk7tCheb8djdrE0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/B7gL8/dJMcaf1vBzh/Chdlfaxzk7tCheb8djdrE0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/B7gL8/dJMcaf1vBzh/Chdlfaxzk7tCheb8djdrE0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FB7gL8%2FdJMcaf1vBzh%2FChdlfaxzk7tCheb8djdrE0%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;920&quot; height=&quot;558&quot; data-filename=&quot;스크린샷 2026-07-08 191255.png&quot; data-origin-width=&quot;920&quot; data-origin-height=&quot;558&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;

&lt;div&gt;
&lt;h4 data-end=&quot;968&quot; data-start=&quot;948&quot; data-section-id=&quot;1htxn47&quot; data-ke-size=&quot;size20&quot;&gt;③ moveUserMarker()&lt;/h4&gt;
&lt;p data-end=&quot;978&quot; data-start=&quot;970&quot; data-ke-size=&quot;size16&quot;&gt;그리고 마지막에&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-07-08 191239.png&quot; data-origin-width=&quot;883&quot; data-origin-height=&quot;102&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b2Egz4/dJMcagsCmvA/q1XP29lAr7sedr7uY6KaT0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b2Egz4/dJMcagsCmvA/q1XP29lAr7sedr7uY6KaT0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b2Egz4/dJMcagsCmvA/q1XP29lAr7sedr7uY6KaT0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb2Egz4%2FdJMcagsCmvA%2Fq1XP29lAr7sedr7uY6KaT0%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;883&quot; height=&quot;102&quot; data-filename=&quot;스크린샷 2026-07-08 191239.png&quot; data-origin-width=&quot;883&quot; data-origin-height=&quot;102&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1028&quot; data-start=&quot;1021&quot; data-ke-size=&quot;size16&quot;&gt;를 호출한다.&lt;/p&gt;
&lt;p data-end=&quot;1038&quot; data-start=&quot;1030&quot; data-ke-size=&quot;size16&quot;&gt;이 함수가 바로 사람 이모지가 따라다니는 핵심이다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-07-08 191213.png&quot; data-origin-width=&quot;916&quot; data-origin-height=&quot;338&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lpfvv/dJMcaf8f5Ep/lGhaRAN1cMLihuzKr17qF1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lpfvv/dJMcaf8f5Ep/lGhaRAN1cMLihuzKr17qF1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lpfvv/dJMcaf8f5Ep/lGhaRAN1cMLihuzKr17qF1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Flpfvv%2FdJMcaf8f5Ep%2FlGhaRAN1cMLihuzKr17qF1%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;916&quot; height=&quot;338&quot; data-filename=&quot;스크린샷 2026-07-08 191213.png&quot; data-origin-width=&quot;916&quot; data-origin-height=&quot;338&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;span&gt;marker&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;style&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;left &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;42%&quot;&lt;/span&gt;&lt;span&gt;; &lt;/span&gt;&lt;span&gt;marker&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;style&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;top &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;78%&quot;&lt;/span&gt;&lt;span&gt;; 가 실행되면서&amp;nbsp; 사람이모지가 따라다니기 시작한다.&amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;span&gt;이때 css는&amp;nbsp;&amp;nbsp; &lt;b&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;user-marker&lt;/span&gt;&lt;span&gt;{ position:&lt;/span&gt;&lt;span&gt;absolute&lt;/span&gt;&lt;span&gt;; } 으로 해놔야한다.&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span&gt;&lt;b&gt;&lt;span&gt; ④ transition &lt;/span&gt;&lt;/b&gt;&lt;span&gt;효과적으로 사용하기&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-07-08 191154.png&quot; data-origin-width=&quot;885&quot; data-origin-height=&quot;240&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uNgWb/dJMcacjpnxR/dh4vLqKLNiBpNbWFhtiO91/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uNgWb/dJMcacjpnxR/dh4vLqKLNiBpNbWFhtiO91/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uNgWb/dJMcacjpnxR/dh4vLqKLNiBpNbWFhtiO91/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuNgWb%2FdJMcacjpnxR%2Fdh4vLqKLNiBpNbWFhtiO91%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;885&quot; height=&quot;240&quot; data-filename=&quot;스크린샷 2026-07-08 191154.png&quot; data-origin-width=&quot;885&quot; data-origin-height=&quot;240&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1641&quot; data-start=&quot;1617&quot; data-ke-size=&quot;size16&quot;&gt;이런 식으로 데이터를 한 번만 정의해 두면, 0.45초 걸려서 따라다니며 이동하는 것같은 효과를 준다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;&lt;span&gt;transition하나로 디테일이 달라지는 것이다. 만약 생략하면 이모지는 갑자기 순간이동한 것처럼 모션된다.&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;⑤ 버튼 색도 상호작용하기&amp;nbsp;&amp;nbsp;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-07-08 191111.png&quot; data-origin-width=&quot;938&quot; data-origin-height=&quot;508&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cUsFf3/dJMcagGdYAz/ju8zknvPNetezeqtB7S3U1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cUsFf3/dJMcagGdYAz/ju8zknvPNetezeqtB7S3U1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cUsFf3/dJMcagGdYAz/ju8zknvPNetezeqtB7S3U1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcUsFf3%2FdJMcagGdYAz%2Fju8zknvPNetezeqtB7S3U1%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;938&quot; height=&quot;508&quot; data-filename=&quot;스크린샷 2026-07-08 191111.png&quot; data-origin-width=&quot;938&quot; data-origin-height=&quot;508&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;이렇게 코드를 짜놓으면 데이터만 수정하면 화면 전체가 자동으로 따라오기 때문에 나중에 내용이 추가되더라도 js를 따로 수정할 필요가 없다. 유지보수가 쉬워지기 때문에 작은 프로젝트부터 이런식으로 코드를 짜는 습관을 드려놓으면 좋을 듯 하다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&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;h2 data-end=&quot;163&quot; data-start=&quot;147&quot; data-section-id=&quot;1fw2a30&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;p data-end=&quot;216&quot; data-start=&quot;165&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;어려웠던 점과 해결 과정&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-07-08 093110.png&quot; data-origin-width=&quot;1019&quot; data-origin-height=&quot;597&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Gf8Zu/dJMcajbJhla/NbA7Au9umdlZpra4s5JUbK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Gf8Zu/dJMcajbJhla/NbA7Au9umdlZpra4s5JUbK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Gf8Zu/dJMcajbJhla/NbA7Au9umdlZpra4s5JUbK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGf8Zu%2FdJMcajbJhla%2FNbA7Au9umdlZpra4s5JUbK%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;1019&quot; height=&quot;597&quot; data-filename=&quot;스크린샷 2026-07-08 093110.png&quot; data-origin-width=&quot;1019&quot; data-origin-height=&quot;597&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;처음에는 인스타그램, 유튜브, 카카오채널, 상담 후기, 강남 랭킹 1위 인증처럼 제가 가진 신뢰 요소를 최대한 많이 보여주려고 했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 화면을 계속 채워 넣을수록 오히려 &lt;b&gt;'열심히 증명하려는 홈페이지'&lt;/b&gt;처럼 느껴졌습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;방문자가 자연스럽게 콘텐츠를 경험하기보다, 정보를 억지로 나열한 인상을 주고 있다는 생각이 들었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반대로 다른 친구들의 과제를 보니, 한 화면 안에서 다양한 기능을 구현하며 과제의 목적에 충실한 웹사이트를 만들고 있었습니다.&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;b&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;&amp;lt;웹으로 표현한 소르지낙의 퍼소나 에세이&amp;gt; &lt;/b&gt;를 만들자라는 결론이 나왔습니다&lt;b&gt;.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용자가 스크롤을 내리며 상담자의 생각과 철학을 하나씩 경험하는 &lt;b&gt;인터랙티브 에세이(Interactive Essay)&lt;/b&gt;를 만들고 싶었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 기능도 단순히 많이 넣는 것이 아니라, 하나의 경험을 완성하기 위한 도구로 사용했습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Hero 영역은 &lt;b&gt;CSS 애니메이션&lt;/b&gt;으로 첫인상을 만들었고,&lt;/li&gt;
&lt;li&gt;스크롤 등장 효과는 &lt;b&gt;Intersection Observer&lt;/b&gt;를 활용해 자연스러운 흐름을 구현했습니다.&lt;/li&gt;
&lt;li&gt;카드 선택은 &lt;b&gt;DOM 조작&lt;/b&gt;으로 인터랙션을 만들었고,&lt;/li&gt;
&lt;li&gt;상담 스타일 좌표는 &lt;b&gt;JavaScript 이벤트&lt;/b&gt;로 사용자의 선택에 따라 변화하도록 구현했습니다.&lt;/li&gt;
&lt;li&gt;풍경별 설명은 &lt;b&gt;객체(Object)&lt;/b&gt;를 활용해 데이터를 관리했습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이처럼 수업에서 배운 기술들을 하나씩 활용했지만, 목표는 기능을 보여주는 것이 아니라 &lt;b&gt;하나의 이야기를 전달하는 것&lt;/b&gt;이었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 프로젝트를 통해 가장 크게 느낀 점은,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;웹은 단순히 정보를 전달하는 공간이 아니라, 한 사람의 생각과 태도, 그리고 철학까지도 표현할 수 있는 매체라는 것입니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 좋은 웹사이트는 기능이 많아서 완성되는 것이 아니라,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;방문자가 무엇을 느끼고 어떤 경험을 하고 돌아가는지를 고민하는 순간부터 완성되기 시작한다는 것을 배울 수 있었습니다.&lt;/b&gt;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;작은 회고&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;KakaoTalk_20260706_144736102.png&quot; data-origin-width=&quot;2160&quot; data-origin-height=&quot;2700&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mqufJ/dJMcaglNCHB/HFgMnrUKJN1RHeCgDe2MRk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mqufJ/dJMcaglNCHB/HFgMnrUKJN1RHeCgDe2MRk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mqufJ/dJMcaglNCHB/HFgMnrUKJN1RHeCgDe2MRk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmqufJ%2FdJMcaglNCHB%2FHFgMnrUKJN1RHeCgDe2MRk%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;2160&quot; height=&quot;2700&quot; data-filename=&quot;KakaoTalk_20260706_144736102.png&quot; data-origin-width=&quot;2160&quot; data-origin-height=&quot;2700&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;쓰려다가 만 이미지들.. 슬라이드 형식으로 사진이 옆으로 움직였으면 좋겠다 싶어서 만들어봤는데,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존의 디자인과 너무 어울리지 않아 쓰지 못했다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;kakao_screenshot1783470425407.png&quot; data-origin-width=&quot;682&quot; data-origin-height=&quot;149&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cKZJAe/dJMcaasrmta/zUDkBSjHZyFfkNXk3i5TkK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cKZJAe/dJMcaasrmta/zUDkBSjHZyFfkNXk3i5TkK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cKZJAe/dJMcaasrmta/zUDkBSjHZyFfkNXk3i5TkK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcKZJAe%2FdJMcaasrmta%2FzUDkBSjHZyFfkNXk3i5TkK%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;682&quot; height=&quot;149&quot; data-filename=&quot;kakao_screenshot1783470425407.png&quot; data-origin-width=&quot;682&quot; data-origin-height=&quot;149&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;moon-message.png&quot; data-origin-width=&quot;1170&quot; data-origin-height=&quot;2196&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bPWwjI/dJMcabrkaUS/TDIn4B2eOCPGSmSNqOle41/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bPWwjI/dJMcabrkaUS/TDIn4B2eOCPGSmSNqOle41/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bPWwjI/dJMcabrkaUS/TDIn4B2eOCPGSmSNqOle41/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbPWwjI%2FdJMcabrkaUS%2FTDIn4B2eOCPGSmSNqOle41%2Fimg.jpg&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;1170&quot; height=&quot;2196&quot; data-filename=&quot;moon-message.png&quot; data-origin-width=&quot;1170&quot; data-origin-height=&quot;2196&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;review-detail.png&quot; data-origin-width=&quot;1068&quot; data-origin-height=&quot;1927&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bVEGOm/dJMcaf8fZ2m/bO9pg6Dv5ELTgwwfMoa841/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bVEGOm/dJMcaf8fZ2m/bO9pg6Dv5ELTgwwfMoa841/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bVEGOm/dJMcaf8fZ2m/bO9pg6Dv5ELTgwwfMoa841/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbVEGOm%2FdJMcaf8fZ2m%2FbO9pg6Dv5ELTgwwfMoa841%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;1068&quot; height=&quot;1927&quot; data-filename=&quot;review-detail.png&quot; data-origin-width=&quot;1068&quot; data-origin-height=&quot;1927&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;student-paid.png&quot; data-origin-width=&quot;1168&quot; data-origin-height=&quot;1388&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c2jIle/dJMcafN5IoY/CK8ENkKDzfxw1TEy0biDmK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c2jIle/dJMcafN5IoY/CK8ENkKDzfxw1TEy0biDmK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c2jIle/dJMcafN5IoY/CK8ENkKDzfxw1TEy0biDmK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc2jIle%2FdJMcafN5IoY%2FCK8ENkKDzfxw1TEy0biDmK%2Fimg.jpg&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;1168&quot; height=&quot;1388&quot; data-filename=&quot;student-paid.png&quot; data-origin-width=&quot;1168&quot; data-origin-height=&quot;1388&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bD7K3K/dJMcage5fEY/dKFKjitnM2jCCAbetG9blk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bD7K3K/dJMcage5fEY/dKFKjitnM2jCCAbetG9blk/img.jpg&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1170&quot; data-origin-height=&quot;654&quot; data-filename=&quot;KakaoTalk_20260708_171252107.jpg&quot; style=&quot;width: 64.9136%; margin-right: 10px;&quot; data-widthpercent=&quot;65.68&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bD7K3K/dJMcage5fEY/dKFKjitnM2jCCAbetG9blk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbD7K3K%2FdJMcage5fEY%2FdKFKjitnM2jCCAbetG9blk%2Fimg.jpg&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;1170&quot; height=&quot;654&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cBLKIN/dJMcajiAdFx/c36BFLbUPpwVeklUdFkCSk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cBLKIN/dJMcajiAdFx/c36BFLbUPpwVeklUdFkCSk/img.jpg&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1178&quot; data-origin-height=&quot;1260&quot; data-filename=&quot;KakaoTalk_20260708_171252107_01.jpg&quot; style=&quot;width: 33.9236%;&quot; data-widthpercent=&quot;34.32&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cBLKIN/dJMcajiAdFx/c36BFLbUPpwVeklUdFkCSk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcBLKIN%2FdJMcajiAdFx%2Fc36BFLbUPpwVeklUdFkCSk%2Fimg.jpg&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;1178&quot; height=&quot;1260&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;KakaoTalk_20260708_171252107_02.jpg&quot; data-origin-width=&quot;1179&quot; data-origin-height=&quot;1592&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dllQzD/dJMcajiAdFy/BAs5zbz63Loq0II1Aki9a1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dllQzD/dJMcajiAdFy/BAs5zbz63Loq0II1Aki9a1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dllQzD/dJMcajiAdFy/BAs5zbz63Loq0II1Aki9a1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdllQzD%2FdJMcajiAdFy%2FBAs5zbz63Loq0II1Aki9a1%2Fimg.jpg&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;1179&quot; height=&quot;1592&quot; data-filename=&quot;KakaoTalk_20260708_171252107_02.jpg&quot; data-origin-width=&quot;1179&quot; data-origin-height=&quot;1592&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나를 계속 발전하게 만드는 수강생과 내담자분들을 마음깊이 사랑한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나는 내가 타로를 하지 않았다면 ,평생 내가 잘 할수 있는게 아무것도 없다고 생각하고 살뻔했다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://ss-1324.github.io/tarot22/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://ss-1324.github.io/tarot22/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1783590285934&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;소르지낙 슈룹 마음연구소&quot; data-og-description=&quot;Sorginak Reading 당신이 고른 카드는지금의 마음을 비춥니다. 카드 한 장을 고르고,그 카드에서 가장 먼저 느껴지는 감각을 선택해보세요. 마음이 끌리는 카드를 선택하세요. Your Reading Style 당신의 &quot; data-og-host=&quot;ss-1324.github.io&quot; data-og-source-url=&quot;https://ss-1324.github.io/tarot22/&quot; data-og-url=&quot;https://ss-1324.github.io/tarot22/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bs7Rbw/dJMb9eT1b97/41nEbTzD3FJ8VRrO8wUVjk/img.png?width=1024&amp;amp;height=1536&amp;amp;face=0_0_1024_1536,https://scrap.kakaocdn.net/dn/pQYSk/dJMb8U85wiS/8CMYQF8tdUJKFpTU9oaLDK/img.png?width=1024&amp;amp;height=1536&amp;amp;face=0_0_1024_1536,https://scrap.kakaocdn.net/dn/RmGDZ/dJMb8Qex1NL/zEEhspIU48l9CXRHHhkiL0/img.png?width=1024&amp;amp;height=1536&amp;amp;face=0_0_1024_1536&quot;&gt;&lt;a href=&quot;https://ss-1324.github.io/tarot22/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://ss-1324.github.io/tarot22/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bs7Rbw/dJMb9eT1b97/41nEbTzD3FJ8VRrO8wUVjk/img.png?width=1024&amp;amp;height=1536&amp;amp;face=0_0_1024_1536,https://scrap.kakaocdn.net/dn/pQYSk/dJMb8U85wiS/8CMYQF8tdUJKFpTU9oaLDK/img.png?width=1024&amp;amp;height=1536&amp;amp;face=0_0_1024_1536,https://scrap.kakaocdn.net/dn/RmGDZ/dJMb8Qex1NL/zEEhspIU48l9CXRHHhkiL0/img.png?width=1024&amp;amp;height=1536&amp;amp;face=0_0_1024_1536');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;소르지낙 슈룹 마음연구소&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Sorginak Reading 당신이 고른 카드는지금의 마음을 비춥니다. 카드 한 장을 고르고,그 카드에서 가장 먼저 느껴지는 감각을 선택해보세요. 마음이 끌리는 카드를 선택하세요. Your Reading Style 당신의&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;ss-1324.github.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;수고했다. thak u , next&lt;/p&gt;</description>
      <category>개발자 호소인</category>
      <author>리제 </author>
      <guid isPermaLink="true">https://bookstairs.tistory.com/93</guid>
      <comments>https://bookstairs.tistory.com/93#entry93comment</comments>
      <pubDate>Fri, 3 Jul 2026 14:17:21 +0900</pubDate>
    </item>
    <item>
      <title>[javaScript] 8. 스코프(Scope)</title>
      <link>https://bookstairs.tistory.com/92</link>
      <description>&lt;p data-path-to-node=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;스코프(Scope)는 변수나 함수가 어디서부터 어디까지 '영향력을 행사할 수 있는가'를 결정하는 영역.&lt;/p&gt;
&lt;p data-path-to-node=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;개발자가 변수를 선언할 때, 이 변수가 어디서 읽히고 쓰일지 제어하는 핵심 메커니즘이다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;1&quot; data-ke-size=&quot;size16&quot;&gt;기능적인 관점에서 핵심 내용을 정리해 드립니다.&lt;/p&gt;
&lt;h3 data-path-to-node=&quot;3&quot; data-ke-size=&quot;size23&quot;&gt;1. 스코프의 핵심 기능: &quot;변수 탐색 규칙&quot;&lt;/h3&gt;
&lt;p data-path-to-node=&quot;4&quot; data-ke-size=&quot;size16&quot;&gt;자바스크립트 엔진이 변수를 찾을 때 사용하는 &lt;b data-index-in-node=&quot;25&quot; data-path-to-node=&quot;4&quot;&gt;스코프 체인(Scope Chain)&lt;/b&gt; 기능을 이해해야 한다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;5&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;5,0,0&quot;&gt;탐색 순서&lt;/b&gt;: 자기 자신의 영역(내부) &amp;rarr; 부모 영역(외부) &amp;rarr; 최상위 영역(전역) 순으로 거슬러 올라간다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;5,1,0&quot;&gt;기능적 장점&lt;/b&gt;: 변수 이름이 겹쳐도 스코프마다 다른 값을 가질 수 있어, 코드 여기저기서 변수명을 고민할 필요를 덜어줌.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-path-to-node=&quot;7&quot; data-ke-size=&quot;size23&quot;&gt;2. 스코프의 3가지 핵심 종류&lt;/h3&gt;
&lt;h4 data-path-to-node=&quot;8&quot; data-ke-size=&quot;size20&quot;&gt;① 전역 스코프 (Global Scope)&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;9&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,0,0&quot;&gt;영역&lt;/b&gt;: 파일 어디서나 접근 가능&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,1,0&quot;&gt;기능&lt;/b&gt;: 어플리케이션 전반에서 공유해야 하는 설정 값 등을 보관&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,2,0&quot;&gt;주의&lt;/b&gt;: 너무 많은 변수를 전역에 두면 이름 충돌과 관리의 어려움이 발생&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-path-to-node=&quot;10&quot; data-ke-size=&quot;size20&quot;&gt;② 함수 스코프 (Function Scope - var)&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;11&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;11,0,0&quot;&gt;영역&lt;/b&gt;: 함수 안에서 선언된 변수는 함수 밖으로 나갈 수 없다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;11,1,0&quot;&gt;기능&lt;/b&gt;: 함수 단위로 데이터를 캡슐화&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;11,2,0&quot;&gt;단점&lt;/b&gt;: var는 if나 for 같은 블록 {}를 무시하고 &lt;b data-index-in-node=&quot;32&quot; data-path-to-node=&quot;11,2,0&quot;&gt;오직 함수만 경계로 삼는다.&lt;/b&gt; &lt;/span&gt;이 때문에 개발자가 의도치 않게 전역 변수를 덮어쓰는 사고가 자주 발생한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-path-to-node=&quot;12&quot; data-ke-size=&quot;size20&quot;&gt;③ 블록 스코프 (Block Scope - let, const)&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;13&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;13,0,0&quot;&gt;영역&lt;/b&gt;: { } 중괄호 내부에서만 유효&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;13,1,0&quot;&gt;기능&lt;/b&gt;: if, for, while 등 모든 {}를 독립적인 영역으로 취급.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;13,2,0&quot;&gt;장점&lt;/b&gt;: 데이터를 더 좁은 범위에 가둘 수 있어 훨씬 안전&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-path-to-node=&quot;15&quot; data-ke-size=&quot;size23&quot;&gt;3. 렉시컬 스코프 (Lexical Scope)&lt;/h3&gt;
&lt;p data-path-to-node=&quot;16&quot; data-ke-size=&quot;size16&quot;&gt;자바스크립트가 스코프를 결정하는 방식.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;17&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;17,0,0&quot;&gt;기능&lt;/b&gt;: 함수를 &quot;어디서 호출했느냐&quot;가 아니라 &quot;어디에 정의했느냐&quot;에 따라 접근 권한이 결정된다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;17,1,0&quot;&gt;중요성&lt;/b&gt;: 코드를 작성하는 시점(Lexical)에 스코프가 이미 고정되므로, 나중에 함수가 어디서 실행되든 정의된 위치의 데이터를 참조&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-path-to-node=&quot;19&quot; data-ke-size=&quot;size23&quot;&gt;4. 실전 비교: var vs let/const&lt;/h3&gt;
&lt;p data-path-to-node=&quot;20&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-path-to-node=&quot;20&quot; data-ke-style=&quot;style3&quot;&gt;// var는 함수 스코프라 'for' 블록을 나가도 살아남음&lt;br /&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;var i =&lt;span style=&quot;color: #ffc1c8;&quot;&gt; 1000;&lt;/span&gt;&lt;/span&gt; &lt;br /&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;for&lt;/span&gt;(var i=0; i&amp;lt;10; i++) {} &lt;br /&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;console.&lt;/span&gt;log(i); // 10 (이미 전역 i가 덮어써짐) // let은 블록 스코프라 'for' 블록 안에서만 동작함&lt;br /&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;let&lt;/span&gt; j = &lt;span style=&quot;color: #ffc1c8;&quot;&gt;1000;&lt;/span&gt; &lt;br /&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;for(&lt;/span&gt;let j=0; j&amp;lt;10; j++) {} &lt;br /&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;console&lt;/span&gt;.log(j); // 1000 (전역 j는 안전함)&lt;/blockquote&gt;</description>
      <category>개발자 호소인/Front</category>
      <author>리제 </author>
      <guid isPermaLink="true">https://bookstairs.tistory.com/92</guid>
      <comments>https://bookstairs.tistory.com/92#entry92comment</comments>
      <pubDate>Tue, 30 Jun 2026 15:47:16 +0900</pubDate>
    </item>
    <item>
      <title>[javaScript] 7.호이스팅</title>
      <link>https://bookstairs.tistory.com/90</link>
      <description>&lt;h2 data-path-to-node=&quot;0&quot; data-ke-size=&quot;size26&quot;&gt;호이스팅(Hoisting)은&lt;/h2&gt;
&lt;h4 data-path-to-node=&quot;0&quot; data-ke-size=&quot;size20&quot;&gt;자바스크립트 엔진이 코드를 실행하기 전,&lt;/h4&gt;
&lt;p data-path-to-node=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;39&quot; data-path-to-node=&quot;0&quot;&gt;변수와 함수 선언을 코드의 최상단으로 끌어올리는 것처럼 동작하는 현상&lt;/b&gt;을 말한다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;1&quot; data-ke-size=&quot;size16&quot;&gt;실제로 코드가 위로 이동하는 것이 아니라, 자바스크립트 엔진이 &lt;b data-index-in-node=&quot;35&quot; data-path-to-node=&quot;1&quot;&gt;코드 실행 전에 변수와 함수를 메모리에 먼저 등록&lt;/b&gt;해두기 때문에 발생하는 논리적인 현상이다.&lt;/p&gt;
&lt;h3 data-path-to-node=&quot;2&quot; data-ke-size=&quot;size23&quot;&gt;1. var 변수 호이스팅&lt;/h3&gt;
&lt;p data-path-to-node=&quot;3&quot; data-ke-size=&quot;size16&quot;&gt;var로 선언된 변수는 호이스팅 시 &lt;b data-index-in-node=&quot;20&quot; data-path-to-node=&quot;3&quot;&gt;undefined로 초기화&lt;/b&gt;된다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;3&quot; data-ke-size=&quot;size16&quot;&gt;그래서 선언 전에도 에러 없이 출력은 되지만, 값은 아직 정해지지 않은 상태&lt;/p&gt;
&lt;p data-path-to-node=&quot;3&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1782713814073&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;console.log(score); // undefined (에러가 나지 않음!)
var score = 80;
console.log(score); // 80&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-path-to-node=&quot;5&quot; data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-path-to-node=&quot;5&quot; data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-path-to-node=&quot;5&quot; data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-path-to-node=&quot;5&quot; data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-path-to-node=&quot;5&quot; data-ke-size=&quot;size23&quot;&gt;2. let / const 변수 호이스팅&lt;/h3&gt;
&lt;p data-path-to-node=&quot;6&quot; data-ke-size=&quot;size16&quot;&gt;let과 const도 호이스팅은 발생하지만, var와 달리 &lt;b data-index-in-node=&quot;33&quot; data-path-to-node=&quot;6&quot;&gt;초기화가 되지 않는다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-path-to-node=&quot;6&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;선언 라인에 도달하기 전까지는 TDZ(Temporal Dead Zone, 일시적 사각지대)에 갇혀 있어서 접근하려고 하면 에러가 발생&lt;/p&gt;
&lt;p data-path-to-node=&quot;6&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1782713881930&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// console.log(age); // ReferenceError: Cannot access 'age' before initialization
let age = 20;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-path-to-node=&quot;6&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;6&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-path-to-node=&quot;8&quot; data-ke-size=&quot;size23&quot;&gt;3. 함수 호이스팅&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;9&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,0,0&quot;&gt;함수 선언문(Function Declaration)&lt;/b&gt;: 통째로 호이스팅되어, 선언 전에도 호출 가능&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,1,0&quot;&gt;함수 표현식(Function Expression)&lt;/b&gt;: 변수에 할당된 함수는 변수 호이스팅 규칙을 따른다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1782713930393&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 함수 선언문: 호이스팅 O
hello(); // &quot;안녕!&quot; (호출 가능)
function hello() { console.log(&quot;안녕!&quot;); }

// 함수 표현식: 호이스팅 X (변수 규칙)
// hi(); // ReferenceError
const hi = function() { console.log(&quot;반가워!&quot;); };&lt;/code&gt;&lt;/pre&gt;
&lt;p data-path-to-node=&quot;6&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;6&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-path-to-node=&quot;12&quot; data-ke-size=&quot;size23&quot;&gt;호이스팅을 어떻게 바라봐야 할까?&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-path-to-node=&quot;13&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style6&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;구분&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;호이스팅 발생 여부&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;특징&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;13,1,0,0&quot;&gt;var&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;13,1,1,0&quot;&gt;O&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;13,1,2,0&quot;&gt;선언 전 접근 시 undefined&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;13,2,0,0&quot;&gt;let / const&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;13,2,1,0&quot;&gt;O&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;13,2,2,0&quot;&gt;선언 전 접근 시 &lt;b data-index-in-node=&quot;10&quot; data-path-to-node=&quot;13,2,2,0&quot;&gt;에러 발생 (TDZ)&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;13,3,0,0&quot;&gt;함수 선언문&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;13,3,1,0&quot;&gt;O&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;13,3,2,0&quot;&gt;선언 전 호출 가능&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-path-to-node=&quot;6&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;6&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;6&quot; data-ke-size=&quot;size16&quot;&gt;요악 : var 사용을 피하고 let, const를 사용하자!&lt;/p&gt;
&lt;pre id=&quot;code_1782713704682&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;/*
    호이스팅
    js엔진은 코드 실행 전에 모든 변수, 함수를 전부 상위로 가져와 선언함.
    
    - 선언이 아래에 있어도 위로 끌어올려진 것처럼 보임.
    - 변수가 이동하는게 아니라 선언만 먼저 되는 것.
*/

// 선언 전에 접근해도 에러가 아니라 undefuned값이 나옴.
console.log(&quot;선언 전 : &quot; + name1);
var name1 = &quot;jiwon&quot;;
console.log(&quot;선언 후 : &quot; + name1);

// let/const : 호이스팅은 되지만 TDZ
// 일시적으로 선언코드 전까지는 TDZ에 기록해서 접근할 수 없게함.

//console.log(name3);
const name2 = &quot;지수&quot;;
let name3 = &quot;지민&quot;;
console.log(name2, name3);

//함수도 호이스팅 대상
//전체함수가 먼저 등록되므로 선언전에 호출 가능.
hello();
function hello(){
    console.log(&quot;안녕하세요.&quot;);
}

// 익명함수를 만들고 변수에 할당해도 변수의 호이스팅 규칙상 선언전 사용 x
// bye();
const bye = function(){
    console.log(&quot;잘가요&quot;);
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>개발자 호소인/Front</category>
      <author>리제 </author>
      <guid isPermaLink="true">https://bookstairs.tistory.com/90</guid>
      <comments>https://bookstairs.tistory.com/90#entry90comment</comments>
      <pubDate>Mon, 29 Jun 2026 15:19:57 +0900</pubDate>
    </item>
    <item>
      <title>[resources] 6_정규표현식.html</title>
      <link>https://bookstairs.tistory.com/89</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;정규 표현식(Regular Expression)&lt;/p&gt;
&lt;p data-path-to-node=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;은 &lt;b data-index-in-node=&quot;46&quot; data-path-to-node=&quot;0&quot;&gt;문자열에서 특정 패턴을 찾거나, 확인하거나, 수정하기 위한 강력한 도구이다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-path-to-node=&quot;1&quot; data-ke-size=&quot;size16&quot;&gt;프로그래밍 세계에서 사용하는 &lt;b data-index-in-node=&quot;23&quot; data-path-to-node=&quot;1&quot;&gt;문자열 검사기&lt;/b&gt;라 할 수 있다.&lt;/p&gt;
&lt;h3 data-path-to-node=&quot;2&quot; data-ke-size=&quot;size23&quot;&gt;1. 왜 필요한가?&lt;/h3&gt;
&lt;p data-path-to-node=&quot;3&quot; data-ke-size=&quot;size16&quot;&gt;만약 당신이 수천 개의 데이터 중에서 '이메일 형식'인 것만 골라내야 한다고 가정하면 상당히 피곤해진다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;3&quot; data-ke-size=&quot;size16&quot;&gt;if문으로 일일이 &quot;@&quot;이 있는지, &quot;.&quot;이 있는지 확인하려면 코드가 매우 복잡해진다&lt;/p&gt;
&lt;p data-path-to-node=&quot;4&quot; data-ke-size=&quot;size16&quot;&gt;정규 표현식을 사용하면 복잡한 규칙을 한 줄의 짧은 코드로 정의할 수 있어 간편하다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;5&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;5,0,0&quot;&gt;이메일 형식 확인&lt;/b&gt;: test@email.com (맞음), test-email (틀림)&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;5,1,0&quot;&gt;전화번호 형식 확인&lt;/b&gt;: 010-1234-5678 (맞음), 01012345678 (형식 다름)&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;5,2,0&quot;&gt;비밀번호 복잡도 체크&lt;/b&gt;: 대문자 1개 이상, 숫자 포함 등&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-path-to-node=&quot;6&quot; data-ke-size=&quot;size23&quot;&gt;2. 기본적인 구성 요소 (문법)&lt;/h3&gt;
&lt;p data-path-to-node=&quot;7&quot; data-ke-size=&quot;size16&quot;&gt;정규식은 기호들의 조합으로 이루어진다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;7&quot; data-ke-size=&quot;size16&quot;&gt;주요 기호 몇 가지만 알아도 웬만한 패턴은 읽을 수 있다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;8&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;^: 문자열의 &lt;b data-index-in-node=&quot;8&quot; data-path-to-node=&quot;8,0,0&quot;&gt;시작&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;$: 문자열의 &lt;b data-index-in-node=&quot;8&quot; data-path-to-node=&quot;8,1,0&quot;&gt;끝&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;[a-z]: 영어 소문자 범위&lt;/li&gt;
&lt;li&gt;[0-9]: 숫자 범위&lt;/li&gt;
&lt;li&gt;+: 바로 앞의 패턴이 &lt;b data-index-in-node=&quot;13&quot; data-path-to-node=&quot;8,4,0&quot;&gt;한 번 이상&lt;/b&gt; 반복됨&lt;/li&gt;
&lt;li&gt;*: 바로 앞의 패턴이 &lt;b data-index-in-node=&quot;13&quot; data-path-to-node=&quot;8,5,0&quot;&gt;0번 이상&lt;/b&gt; 반복됨&lt;/li&gt;
&lt;li&gt;?: 바로 앞의 패턴이 &lt;b data-index-in-node=&quot;13&quot; data-path-to-node=&quot;8,6,0&quot;&gt;0번 또는 1번&lt;/b&gt; 존재함&lt;/li&gt;
&lt;li&gt;{2,}: 바로 앞의 패턴이 &lt;b data-index-in-node=&quot;16&quot; data-path-to-node=&quot;8,7,0&quot;&gt;2번 이상&lt;/b&gt; 반복됨&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-path-to-node=&quot;9&quot; data-ke-size=&quot;size23&quot;&gt;3. 정규식 활용 예시&lt;/h3&gt;
&lt;div data-ved=&quot;0CAAQhtANahgKEwiZqreAuKuVAxUAAAAAHQAAAAAQsQI&quot; data-hveid=&quot;0&quot;&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;const emailPattern = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;12&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;^[a-zA-Z0-9._%+-]+: 아이디 부분(영문/숫자/특수문자 조합)으로 시작한다.&lt;/li&gt;
&lt;li&gt;@: 반드시 @가 중간에 포함된다.&lt;/li&gt;
&lt;li&gt;[a-zA-Z0-9.-]+: 도메인 이름이 온다.&lt;/li&gt;
&lt;li&gt;\.: 반드시 점(.)이 포함된다.&lt;/li&gt;
&lt;li&gt;[a-zA-Z]{2,}$: 마지막은 2자 이상의 영문자로 끝난다.&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;4.연습문제&lt;/p&gt;
&lt;div&gt;
&lt;div id=&quot;user-query-content-10&quot; style=&quot;color: #1f1f1f;&quot; data-ved=&quot;0CAAQ3ucQahgKEwiZqreAuKuVAxUAAAAAHQAAAAAQigI&quot; data-hveid=&quot;0&quot;&gt;
&lt;div&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;아이디@도메인.상위도메인 형태가 맞는지 검사 후&lt;br /&gt;&lt;br /&gt;//area4에 올바른 이메일 형식 / 이메일 형식이 아닙니다. 라는 답이 나오게 만들어보기&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span style=&quot;color: #006dd7;&quot;&gt; function&lt;/span&gt;&lt;b&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt; checkEamil&lt;/span&gt;&lt;/b&gt;(){&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;&lt;span&gt;JavaScript&lt;/span&gt;
&lt;div&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-29 121043.png&quot; data-origin-width=&quot;909&quot; data-origin-height=&quot;475&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Qv4Sk/dJMcad3yEGS/y6jnq1SOQnKVVP4KswDVKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Qv4Sk/dJMcad3yEGS/y6jnq1SOQnKVVP4KswDVKK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Qv4Sk/dJMcad3yEGS/y6jnq1SOQnKVVP4KswDVKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQv4Sk%2FdJMcad3yEGS%2Fy6jnq1SOQnKVVP4KswDVKK%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;909&quot; height=&quot;475&quot; data-filename=&quot;스크린샷 2026-06-29 121043.png&quot; data-origin-width=&quot;909&quot; data-origin-height=&quot;475&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-path-to-node=&quot;3&quot; data-ke-size=&quot;size23&quot;&gt;상세 설명&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-path-to-node=&quot;4&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;4,0,0&quot;&gt;정규 표현식 (/^[...]$/)&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;4,0,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;^: 문자열의 시작을 의&lt;/li&gt;
&lt;li&gt;[a-zA-Z0-9._%+-]+: 아이디 부분. 영문자, 숫자, 점, 밑줄 등을 허용&lt;/li&gt;
&lt;li&gt;@: 중간에 반드시 @가 있어야 한다.&lt;/li&gt;
&lt;li&gt;[a-zA-Z0-9.-]+: 도메인&amp;nbsp;&lt;/li&gt;
&lt;li&gt;\.: 도메인 뒤에 점(.)이 반드시 있어야 한다.&lt;/li&gt;
&lt;li&gt;[a-zA-Z]{2,}: 상위 도메인입니다. 영문자로 최소 2자 이상&lt;/li&gt;
&lt;li&gt;$: 문자열의 끝을 의미&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;4,1,0&quot;&gt;.test() 메서드&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;4,1,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;정규식에서 제공하는 함수로, 우리가 입력한 email 문자열이 위 패턴과 일치하면 true를, 아니면 false를 반환.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;4,2,0&quot;&gt;area4.innerHTML&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;4,2,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;document.getElementById(&quot;area4&quot;)를 통해 HTML 문서 내의 area4라는 id를 가진 영역을 찾고, &amp;nbsp;원하는 메시지를 텍스트로 넣어준다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 data-path-to-node=&quot;5&quot; data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;</description>
      <category>개발자 호소인</category>
      <author>리제 </author>
      <guid isPermaLink="true">https://bookstairs.tistory.com/89</guid>
      <comments>https://bookstairs.tistory.com/89#entry89comment</comments>
      <pubDate>Mon, 29 Jun 2026 12:16:26 +0900</pubDate>
    </item>
    <item>
      <title>[javaScript] 6. 함수 /오버로딩(Overloading) / Rest 파라미터 (...args)</title>
      <link>https://bookstairs.tistory.com/87</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;자바스크립트에서 함수는 단순한 '코드 묶음'을 넘어,&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;프로그래밍 언어의 모든 권한을 가진 '일급 객체(First-Class Object)'로 대우받는다.&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;선언적 함수(function declaration)&lt;/li&gt;
&lt;li&gt;함수 표현식(익명 함수를 변수에 할당)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-path-to-node=&quot;1&quot; data-ke-size=&quot;size23&quot;&gt;함수가 '일급 객체'라는 것의 의미&lt;/h3&gt;
&lt;p data-path-to-node=&quot;2&quot; data-ke-size=&quot;size16&quot;&gt;다른 프로그래밍 언어와 달리, 자바스크립트에서 함수는 일반 변수나 숫자처럼 취급된다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;3&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;3,0,0&quot;&gt;변수에 담을 수 있다 :&lt;/b&gt;&amp;nbsp;함수를 이름표(변수)에 붙여 저장할 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-26 174830.png&quot; data-origin-width=&quot;932&quot; data-origin-height=&quot;567&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b8VeMz/dJMcadbm6Ob/11fAPo6zm0sjLT0I2PGxhK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b8VeMz/dJMcadbm6Ob/11fAPo6zm0sjLT0I2PGxhK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b8VeMz/dJMcadbm6Ob/11fAPo6zm0sjLT0I2PGxhK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb8VeMz%2FdJMcadbm6Ob%2F11fAPo6zm0sjLT0I2PGxhK%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;932&quot; height=&quot;567&quot; data-filename=&quot;스크린샷 2026-06-26 174830.png&quot; data-origin-width=&quot;932&quot; data-origin-height=&quot;567&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;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-path-to-node=&quot;5&quot; data-ke-size=&quot;size23&quot;&gt;2. 오버로딩(Overloading) 미지원&lt;/h3&gt;
&lt;p data-path-to-node=&quot;6&quot; data-ke-size=&quot;size16&quot;&gt;다른 언어(Java 등)에서는 같은 이름의 함수라도 &lt;span style=&quot;color: #ee2323;&quot;&gt;인자의 개수나 타입이 다르면 다른 함수로 취급한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-path-to-node=&quot;7&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;7&quot;&gt;자바스크립트는 이를 지원하지 않음.&lt;/b&gt;&lt;/p&gt;
&lt;p data-path-to-node=&quot;7&quot; data-ke-size=&quot;size16&quot;&gt;같은 이름으로 여러 번 선언하면, &lt;b data-index-in-node=&quot;41&quot; data-path-to-node=&quot;7&quot;&gt;맨 마지막에 정의한 함수가 이전의 함수를 덮어쓴다.&lt;/b&gt;&lt;/p&gt;
&lt;div&gt;&lt;br /&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-26 174854.png&quot; data-origin-width=&quot;903&quot; data-origin-height=&quot;200&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c0gLi6/dJMcacKrxcw/QuqXvPostlfUhYiMbg7RU0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c0gLi6/dJMcacKrxcw/QuqXvPostlfUhYiMbg7RU0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c0gLi6/dJMcacKrxcw/QuqXvPostlfUhYiMbg7RU0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc0gLi6%2FdJMcacKrxcw%2FQuqXvPostlfUhYiMbg7RU0%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;903&quot; height=&quot;200&quot; data-filename=&quot;스크린샷 2026-06-26 174854.png&quot; data-origin-width=&quot;903&quot; data-origin-height=&quot;200&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-path-to-node=&quot;10&quot; data-ke-size=&quot;size23&quot;&gt;3. arguments 객체의 활용&lt;/h3&gt;
&lt;p data-path-to-node=&quot;11&quot; data-ke-size=&quot;size16&quot;&gt;자바스크립트는 오버로딩을 지원하지 않는 대신, 함수 내부에서 arguments라는 특별한 주머니를 제공하여 유연성을 확보한다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;12&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;12,0,0&quot;&gt;arguments&lt;/b&gt;: 함수에 전달된 모든 인자가 순서대로 담겨 있는 유사 배열(Array-like Object)&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;12,1,0&quot;&gt;활용&lt;/b&gt;: 함수 선언 시 인자를 정해놓지 않아도, 들어온 모든 인자를 직접 다룰 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;br /&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-26 174905.png&quot; data-origin-width=&quot;911&quot; data-origin-height=&quot;267&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bdi1Xw/dJMcabxUu4m/2oSjNhKrFKgE2eUwNV5lZ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bdi1Xw/dJMcabxUu4m/2oSjNhKrFKgE2eUwNV5lZ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bdi1Xw/dJMcabxUu4m/2oSjNhKrFKgE2eUwNV5lZ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbdi1Xw%2FdJMcabxUu4m%2F2oSjNhKrFKgE2eUwNV5lZ0%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;911&quot; height=&quot;267&quot; data-filename=&quot;스크린샷 2026-06-26 174905.png&quot; data-origin-width=&quot;911&quot; data-origin-height=&quot;267&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-path-to-node=&quot;15&quot; data-ke-size=&quot;size23&quot;&gt;4. 현대적 대안: Rest 파라미터 (...args)&lt;/h3&gt;
&lt;p data-path-to-node=&quot;16&quot; data-ke-size=&quot;size16&quot;&gt;최신 자바스크립트(ES6+)에서는 arguments 대신 Rest 파라미터(...)를 사용한다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;16&quot; data-ke-size=&quot;size16&quot;&gt;이는 실제 배열로 변환되므로 훨씬 강력하고 다루기 쉽다.&lt;/p&gt;
&lt;div data-ved=&quot;0CAAQhtANahgKEwiu3OrykaSVAxUAAAAAHQAAAAAQuAg&quot; data-hveid=&quot;0&quot;&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-26 174919.png&quot; data-origin-width=&quot;894&quot; data-origin-height=&quot;168&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bytP9E/dJMcacQ6Qxo/oTR6fCoQJgDOnZ78UgTQKk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bytP9E/dJMcacQ6Qxo/oTR6fCoQJgDOnZ78UgTQKk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bytP9E/dJMcacQ6Qxo/oTR6fCoQJgDOnZ78UgTQKk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbytP9E%2FdJMcacQ6Qxo%2FoTR6fCoQJgDOnZ78UgTQKk%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;894&quot; height=&quot;168&quot; data-filename=&quot;스크린샷 2026-06-26 174919.png&quot; data-origin-width=&quot;894&quot; data-origin-height=&quot;168&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;br /&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-path-to-node=&quot;18&quot; data-ke-size=&quot;size23&quot;&gt;요약&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-path-to-node=&quot;19&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;19,0,0&quot;&gt;일급 객체&lt;/b&gt;: 함수는 값이다. 변수에 넣고, 전달하고, 반환할 수 있다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;19,1,0&quot;&gt;오버로딩 불가&lt;/b&gt;: 이름이 같으면 뒤에 선언된 것이 앞의 것을 덮어버린다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;19,2,0&quot;&gt;유연성 확보&lt;/b&gt;: arguments(과거 방식)나 Rest 파라미터(최신 방식)를 통해, 인자가 몇 개가 들어오든 함수가 스스로 처리하도록 만들 수 있다.&lt;/li&gt;
&lt;/ol&gt;</description>
      <category>개발자 호소인/Front</category>
      <author>리제 </author>
      <guid isPermaLink="true">https://bookstairs.tistory.com/87</guid>
      <comments>https://bookstairs.tistory.com/87#entry87comment</comments>
      <pubDate>Fri, 26 Jun 2026 17:47:37 +0900</pubDate>
    </item>
    <item>
      <title>[javaScript] 5.반복문</title>
      <link>https://bookstairs.tistory.com/86</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;807&quot; data-origin-height=&quot;2028&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Fg49P/dJMcabEGy7z/uN2vO0y6Vl91JSRBjRa3CK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Fg49P/dJMcabEGy7z/uN2vO0y6Vl91JSRBjRa3CK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Fg49P/dJMcabEGy7z/uN2vO0y6Vl91JSRBjRa3CK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFg49P%2FdJMcabEGy7z%2FuN2vO0y6Vl91JSRBjRa3CK%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;807&quot; height=&quot;2028&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;807&quot; data-origin-height=&quot;2028&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;h3 data-path-to-node=&quot;2&quot; data-ke-size=&quot;size23&quot;&gt;1. &lt;span style=&quot;color: #006dd7;&quot;&gt;횟수가 정해진&lt;/span&gt; 반복:&lt;span style=&quot;color: #8a3db6;&quot;&gt; for&lt;/span&gt; 문&lt;/h3&gt;
&lt;p data-path-to-node=&quot;3&quot; data-ke-size=&quot;size16&quot;&gt;반복의 시작과 끝, 증가 폭을 한곳에 모아 관리한다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;4&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;4,0,0&quot;&gt;용도:&lt;/b&gt; &quot;1부터 7까지 반복해라&quot;처럼 &lt;b data-index-in-node=&quot;21&quot; data-path-to-node=&quot;4,0,0&quot;&gt;딱 정해진 횟수&lt;/b&gt;만큼 돌릴 때 가장 깔끔&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;4,1,0&quot;&gt;동작:&lt;/b&gt; i=1로 시작해 i&amp;lt;=7까지 i++(1씩 증가)하며 코드를 실행&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-path-to-node=&quot;5&quot; data-ke-size=&quot;size23&quot;&gt;2. &lt;span style=&quot;color: #006dd7;&quot;&gt;조건&lt;/span&gt;이 중요한 반복: &lt;span style=&quot;color: #8a3db6;&quot;&gt;while&lt;/span&gt; 문&lt;/h3&gt;
&lt;p data-path-to-node=&quot;6&quot; data-ke-size=&quot;size16&quot;&gt;조건식 하나만 체크하며, 그 조건이 true인 동안 무한히 반복합&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;7&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;7,0,0&quot;&gt;용도:&lt;/b&gt; 반복 횟수를 미리 알 수 없을 때(예: 특정 값이 나올 때까지 계속) 유용&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;7,1,0&quot;&gt;주의:&lt;/b&gt; 안에서 i++처럼 변수를 직접 수정해주지 않으면 조건이 항상 참이 되어 프로그램이 멈추지 않는 '무한 루프'에 빠질 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-path-to-node=&quot;8&quot; data-ke-size=&quot;size23&quot;&gt;3. &lt;span style=&quot;color: #006dd7;&quot;&gt;무조건 한 번은&lt;/span&gt; 실행: &lt;span style=&quot;color: #8a3db6;&quot;&gt;do-while&lt;/span&gt; 문&lt;/h3&gt;
&lt;p data-path-to-node=&quot;9&quot; data-ke-size=&quot;size16&quot;&gt;조건과 상관없이 코드 블록을 &lt;b data-index-in-node=&quot;16&quot; data-path-to-node=&quot;9&quot;&gt;무조건 최소 한 번&lt;/b&gt;은 실행한 뒤, 그 후에 조건을 검사&lt;/p&gt;
&lt;p data-path-to-node=&quot;9&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;10,0,0&quot;&gt;용도:&lt;/b&gt; &quot;사용자에게 입력을 먼저 받고(실행), 값이 맞는지 확인(조건 검사)&quot;해야 하는 상황에 최적&lt;/p&gt;
&lt;h3 data-path-to-node=&quot;11&quot; data-ke-size=&quot;size23&quot;&gt;4. 흐름 제어: &lt;span style=&quot;color: #ef5369;&quot;&gt;break&lt;/span&gt;와 &lt;span style=&quot;color: #6164c6;&quot;&gt;continue&lt;/span&gt;&lt;/h3&gt;
&lt;p data-path-to-node=&quot;12&quot; data-ke-size=&quot;size16&quot;&gt;반복 중간에 상황에 따라 흐름을 바꾸는 '제어 장치'&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;13&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;13,0,0&quot;&gt;continue&lt;/b&gt;: &lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;&quot;이번 회차는 건너뛰고 다음 회차로 넘어가라.&lt;/span&gt;&quot; (위 코드에서 5일 때 로그가 안 찍히는 이유)&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;13,1,0&quot;&gt;break&lt;/b&gt;: &lt;span style=&quot;background-color: #c1bef9;&quot;&gt;&quot;&lt;span style=&quot;background-color: #c0d1e7;&quot;&gt;반복문을 아예 완전히 끝내버려라.&quot;&lt;/span&gt;&lt;/span&gt; (위 코드에서 8을 만나는 순간 반복이 종료되는 이유)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-path-to-node=&quot;14&quot; data-ke-size=&quot;size23&quot;&gt;5. 데이터 순회(순서대로 훑기): for...of와 for...in&lt;/h3&gt;
&lt;p data-path-to-node=&quot;15&quot; data-ke-size=&quot;size16&quot;&gt;객체나 배열처럼 여러 데이터가 묶여 있는 자료구조를 훑을 때 사용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;16,0,0&quot;&gt;for...of (값 순회):&lt;/b&gt; 배열의 &lt;b data-index-in-node=&quot;21&quot; data-path-to-node=&quot;16,0,0&quot;&gt;값(Value)&lt;/b&gt; 자체가 중요할 때 씀&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;16,0,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;members 배열의 &quot;최지원&quot;, &quot;김수민&quot;... 이라는 &lt;b data-index-in-node=&quot;32&quot; data-path-to-node=&quot;16,0,1,0,0&quot;&gt;실제 데이터&lt;/b&gt;를 하나씩 꺼내온다.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;16&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;16,1,0&quot;&gt;for...in (키 순회):&lt;/b&gt; 객체의 키(Key, 속성 이름)를 순회할 때 사용.
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;16,1,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;std 객체의 name, java, db라는 &lt;b data-index-in-node=&quot;25&quot; data-path-to-node=&quot;16,1,1,0,0&quot;&gt;이름표&lt;/b&gt;를 꺼내온다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;16,1,1,1,0&quot;&gt;참고:&lt;/b&gt; 배열에 for...in을 쓰면 배열의 인덱스(0, 1, 2...)를 꺼내오는데, 일반적인 배열 순회에는&lt;b&gt; for...of나 forEach&lt;/b&gt;을 권장&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-path-to-node=&quot;18&quot; data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-path-to-node=&quot;19&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;반복문&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;언제 사용하는가?&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;19,1,0,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;19,1,0,0&quot;&gt;for&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;19,1,1,0&quot;&gt;반복 횟수를 명확히 알 때&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;19,2,0,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;19,2,0,0&quot;&gt;while&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;19,2,1,0&quot;&gt;횟수보다 특정 조건이 중요할 때&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;19,3,0,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;19,3,0,0&quot;&gt;do-while&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;19,3,1,0&quot;&gt;일단 한 번은 반드시 실행해야 할 때&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;19,4,0,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;19,4,0,0&quot;&gt;for...of&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;19,4,1,0&quot;&gt;배열의 &lt;b data-index-in-node=&quot;4&quot; data-path-to-node=&quot;19,4,1,0&quot;&gt;값&lt;/b&gt;들을 하나씩 다루고 싶을 때&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;19,5,0,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;19,5,0,0&quot;&gt;for...in&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;19,5,1,0&quot;&gt;객체의 **키(속성)**들을 하나씩 확인하고 싶을 때&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;</description>
      <category>개발자 호소인/Front</category>
      <author>리제 </author>
      <guid isPermaLink="true">https://bookstairs.tistory.com/86</guid>
      <comments>https://bookstairs.tistory.com/86#entry86comment</comments>
      <pubDate>Fri, 26 Jun 2026 17:36:46 +0900</pubDate>
    </item>
    <item>
      <title>[javaScript] 4. 조건문</title>
      <link>https://bookstairs.tistory.com/85</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;966&quot; data-origin-height=&quot;3248&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/biA2gj/dJMcaay4dqX/tdCLC5wsAPN3VJYp5cNckK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/biA2gj/dJMcaay4dqX/tdCLC5wsAPN3VJYp5cNckK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/biA2gj/dJMcaay4dqX/tdCLC5wsAPN3VJYp5cNckK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbiA2gj%2FdJMcaay4dqX%2FtdCLC5wsAPN3VJYp5cNckK%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;966&quot; height=&quot;3248&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;966&quot; data-origin-height=&quot;3248&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-path-to-node=&quot;2&quot; data-ke-size=&quot;size23&quot;&gt;1. if / else if / else 문&lt;/h3&gt;
&lt;p data-path-to-node=&quot;3&quot; data-ke-size=&quot;size16&quot;&gt;조건이 '참(Truthy)'인 경우에만 해당 블록을 실행한다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;4&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;4,0,0&quot;&gt;범위 처리:&lt;/b&gt; score &amp;gt;= 90, score &amp;gt;= 80 처럼 특정 범위의 값을 비교할 때 가장 강력하다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;4,1,0&quot;&gt;데이터 평가:&lt;/b&gt; if(name) 처럼 작성하면, 자바스크립트는 name을 불린(Boolean) 값으로 자동 변환된다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;4,1,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;빈 문자열 &quot;&quot;은 &lt;b data-index-in-node=&quot;10&quot; data-path-to-node=&quot;4,1,1,0,0&quot;&gt;Falsy&lt;/b&gt;이므로 else 블록(&quot;이름 없음&quot;)이 실행.&lt;/li&gt;
&lt;li&gt;문자열이 조금이라도 들어있으면 &lt;b data-index-in-node=&quot;17&quot; data-path-to-node=&quot;4,1,1,1,0&quot;&gt;Truthy&lt;/b&gt;가 되어 &quot;이름 있음&quot;이 실행.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-path-to-node=&quot;6&quot; data-ke-size=&quot;size23&quot;&gt;2. switch 문&lt;/h3&gt;
&lt;p data-path-to-node=&quot;7&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;하나의 값을 여러 케이스(case)와 엄격하게 비교(===)할 때 사용&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;8&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;8,0,0&quot;&gt;동작 방식:&lt;/b&gt; day라는 변수에 담긴 값과 일치하는 case를 찾는다.&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;8,1,0&quot;&gt;break의 중요성:&lt;/b&gt; break를 만나면 switch 문 전체를 즉시 빠져나간다. 만약 break가 없다면 아래의 case까지 멈추지 않고 계속 실행되는데, 이를 fall-through(낙하)라고 한다&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;8,2,0&quot;&gt;fall-through의 활용:&lt;/b&gt; 계절 예시처럼 case 12, 1, 2를 묶어서 &quot;겨울&quot;로 처리하는 것은 매우 효율적인 문법 활용이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-path-to-node=&quot;9&quot; data-ke-size=&quot;size23&quot;&gt;3. 삼항 연산자 (? :)&lt;/h3&gt;
&lt;p data-path-to-node=&quot;10&quot; data-ke-size=&quot;size16&quot;&gt;if-else 문을 한 줄로 압축한 형태입니다. 결과값을 바로 변수에 할당하거나 출력할 때 유용합니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;11&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;11,0,0&quot;&gt;구조:&lt;/b&gt; 조건 ? 참일_때_값 : 거짓일_때_값&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;11,1,0&quot;&gt;팩트:&lt;/b&gt; age &amp;gt;= 19가 true면 &quot;성인&quot;, false면 &quot;미성년&quot;을 반환합니다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;11,2,0&quot;&gt;사용 권장:&lt;/b&gt; 로직이 단순한 경우에만 사용하세요. 복잡한 로직을 삼항 연산자로 한 줄에 다 쓰면 가독성이 떨어져 유지보수가 힘들어집니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-path-to-node=&quot;13&quot; data-ke-size=&quot;size23&quot;&gt;요약: 언제 무엇을 쓸까?&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-path-to-node=&quot;14&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;구분&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;추천 상황&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;특징&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;14,1,0,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;14,1,0,0&quot;&gt;if 문&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;14,1,1,0&quot;&gt;범위 비교, Truthy/Falsy 판별&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;14,1,2,0&quot;&gt;가장 범용적이고 유연함&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;14,2,0,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;14,2,0,0&quot;&gt;switch 문&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;14,2,1,0&quot;&gt;고정된 값 비교&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;14,2,2,0&quot;&gt;가독성이 좋고 fall-through 활용 가능&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;14,3,0,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;14,3,0,0&quot;&gt;삼항 연산자&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;14,3,1,0&quot;&gt;간단한 값 결정&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;14,3,2,0&quot;&gt;코드가 매우 간결해짐&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-path-to-node=&quot;15&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>개발자 호소인/Front</category>
      <author>리제 </author>
      <guid isPermaLink="true">https://bookstairs.tistory.com/85</guid>
      <comments>https://bookstairs.tistory.com/85#entry85comment</comments>
      <pubDate>Fri, 26 Jun 2026 17:30:43 +0900</pubDate>
    </item>
    <item>
      <title>[javaScript] 2. 변수와 자료형 /  호이스팅(Hoisting) /연산자</title>
      <link>https://bookstairs.tistory.com/83</link>
      <description>&lt;h1&gt;변수와 자료형&lt;/h1&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;동적 타입 언어&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;JS는 변수의 타입을 명시적으로 지정하지 않음&lt;/li&gt;
&lt;li&gt;실행 중에 값에 따라서 자동으로 타입이 결정됨&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;756&quot; data-origin-height=&quot;465&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zuFXa/dJMcaf7510Y/01QzcOdukNgdRCgqdFeNzk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zuFXa/dJMcaf7510Y/01QzcOdukNgdRCgqdFeNzk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zuFXa/dJMcaf7510Y/01QzcOdukNgdRCgqdFeNzk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzuFXa%2FdJMcaf7510Y%2F01QzcOdukNgdRCgqdFeNzk%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;756&quot; height=&quot;465&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;756&quot; data-origin-height=&quot;465&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; 좀 더 쉽게 설명하자면&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-path-to-node=&quot;1&quot; data-ke-size=&quot;size23&quot;&gt;1. 재할당 (값 바꾸기)&lt;/h3&gt;
&lt;p data-path-to-node=&quot;2&quot; data-ke-size=&quot;size16&quot;&gt;let으로 만든 변수는 이름표(변수명)는 그대로 두고, 그 안에 담긴 내용물(값)만 바꿔치기할 수 있다. 이것이 &lt;b data-index-in-node=&quot;65&quot; data-path-to-node=&quot;2&quot;&gt;재할당&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;3&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;3,0,0&quot;&gt;예시&lt;/b&gt;: name2라는 이름의 통에 처음에는 &quot;최지원&quot;을 담았다가, 나중에 &quot;김수민&quot;으로 바꿔 넣는 것과 같다. 통 이름은 그대로 name2 유지&amp;nbsp;&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;3,1,0&quot;&gt;코드&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;let&lt;/b&gt; &lt;/span&gt;name2 =&lt;span style=&quot;color: #409d00;&quot;&gt; &quot;최지원&quot;&lt;/span&gt;; &lt;span style=&quot;color: #666666;&quot;&gt;// 통 만들기&lt;/span&gt; &lt;br /&gt;name2 = &lt;span style=&quot;color: #409d00;&quot;&gt;&quot;김수민&lt;/span&gt;&quot;; // &lt;span style=&quot;color: #666666;&quot;&gt;내용물만 바꿈 (성공)&lt;/span&gt;&lt;/blockquote&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-path-to-node=&quot;5&quot; data-ke-size=&quot;size23&quot;&gt;2. 재선언 (중복 만들기)&lt;/h3&gt;
&lt;p data-path-to-node=&quot;6&quot; data-ke-size=&quot;size16&quot;&gt;반면 &lt;b data-index-in-node=&quot;3&quot; data-path-to-node=&quot;6&quot;&gt;재선언&lt;/b&gt;은 같은 이름으로 &lt;b data-index-in-node=&quot;16&quot; data-path-to-node=&quot;6&quot;&gt;똑같은 이름표를 또 만드는 행위&lt;/b&gt;.&lt;/p&gt;
&lt;p data-path-to-node=&quot;6&quot; data-ke-size=&quot;size16&quot;&gt;자바스크립트는 이를 &quot;이름이 겹쳐서 누가 진짜인지 헷갈리니까 안 돼!&quot;라며 막아버리는 것&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;7&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;7,0,0&quot;&gt;예시&lt;/b&gt;: 이미 name2라는 통이 있는데, &quot;똑같이 name2라고 이름 붙인 통을 또 만들어줘!&quot;라고 하면 프로그램이 고장남.&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;let&lt;/span&gt; name2 = &quot;&lt;span style=&quot;color: #409d00;&quot;&gt;최지원&lt;/span&gt;&quot;; &lt;br /&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;let&lt;/span&gt; name2 = &quot;&lt;span style=&quot;color: #409d00;&quot;&gt;김수민&lt;/span&gt;&quot;; // 에러 발생! (&lt;span style=&quot;color: #ef5369;&quot;&gt;이미 이 이름을 가진 변수가 있는데 또 만들&lt;/span&gt;려고 하니 차단)&lt;/blockquote&gt;
&lt;h3 data-path-to-node=&quot;8&quot; data-ke-size=&quot;size23&quot;&gt;요약하자면&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;9&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,0,0&quot;&gt;재할당(name2 = &quot;김수민&quot;)&lt;/b&gt;: 이미 있는 통의 내용물을 바꾸는 것 (&lt;b data-index-in-node=&quot;41&quot; data-path-to-node=&quot;9,0,0&quot;&gt;가능&lt;/b&gt;).&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,1,0&quot;&gt;재선언(let name2 = &quot;김수민&quot;)&lt;/b&gt;: 같은 이름의 통을 또 하나 더 만들려고 하는 것 (&lt;b data-index-in-node=&quot;52&quot; data-path-to-node=&quot;9,1,0&quot;&gt;불가능&lt;/b&gt;).&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3.네이밍 규칙&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;영어를 사용하며 문자와 숫자 모두 사용 가능&lt;/li&gt;
&lt;li&gt;특수문자는 언더스코어(_)와 달러($)만 사용 가능&lt;/li&gt;
&lt;li&gt;숫자로 시작하면 안 됨&lt;/li&gt;
&lt;li&gt;키워드를 변수명으로 사용하면 안 됨&lt;/li&gt;
&lt;li&gt;변수명&amp;middot;함수명 &amp;rarr; camelCase / class&amp;middot;id 속성명 &amp;rarr; kebab-case&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4.자료형 (Data Type)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;여섯 개의 원시 타입과 한 개의 Object 타입이 있음
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;원시: Number, String, Boolean, undefined, null, Symbol&lt;/li&gt;
&lt;li&gt;Object: Object, Array, Function &amp;hellip;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;832&quot; data-origin-height=&quot;526&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bgUrJB/dJMcafUEiut/H5PbRxnuCrsPdkiRAZLi9k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bgUrJB/dJMcafUEiut/H5PbRxnuCrsPdkiRAZLi9k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bgUrJB/dJMcafUEiut/H5PbRxnuCrsPdkiRAZLi9k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbgUrJB%2FdJMcafUEiut%2FH5PbRxnuCrsPdkiRAZLi9k%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;832&quot; height=&quot;526&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;832&quot; data-origin-height=&quot;526&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-24 173413.png&quot; data-origin-width=&quot;750&quot; data-origin-height=&quot;752&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cN0q0J/dJMcaicNu5f/nj7Qku7OWSo2GI9tvDYBCK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cN0q0J/dJMcaicNu5f/nj7Qku7OWSo2GI9tvDYBCK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cN0q0J/dJMcaicNu5f/nj7Qku7OWSo2GI9tvDYBCK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcN0q0J%2FdJMcaicNu5f%2Fnj7Qku7OWSo2GI9tvDYBCK%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;750&quot; height=&quot;752&quot; data-filename=&quot;스크린샷 2026-06-24 173413.png&quot; data-origin-width=&quot;750&quot; data-origin-height=&quot;752&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-24 173450.png&quot; data-origin-width=&quot;744&quot; data-origin-height=&quot;602&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/2umhb/dJMcaasgLNj/7P8EjkoHXlC7011FIqwjNk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/2umhb/dJMcaasgLNj/7P8EjkoHXlC7011FIqwjNk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/2umhb/dJMcaasgLNj/7P8EjkoHXlC7011FIqwjNk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F2umhb%2FdJMcaasgLNj%2F7P8EjkoHXlC7011FIqwjNk%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;744&quot; height=&quot;602&quot; data-filename=&quot;스크린샷 2026-06-24 173450.png&quot; data-origin-width=&quot;744&quot; data-origin-height=&quot;602&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-path-to-node=&quot;0&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&gt;
&lt;h2 data-path-to-node=&quot;0&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-path-to-node=&quot;0&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-path-to-node=&quot;0&quot; data-ke-size=&quot;size26&quot;&gt;&amp;lt; 호이스팅(Hoisting)은 처음 접하면 매우 혼란스러운 이유?&amp;gt;&lt;/h2&gt;
&lt;p data-path-to-node=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;'끌어올려진다'는 말 때문에 코드가 물리적으로 이동한다고 생각하기 쉽지만,&lt;/p&gt;
&lt;p data-path-to-node=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;사실은 자바스크립트 엔진이 코드를 실행하기 전 단계에서 발생하는 '사전 작업'이라고 이해하는 것이 가장 정확하다.&lt;/p&gt;
&lt;h3 data-path-to-node=&quot;1&quot; data-ke-size=&quot;size23&quot;&gt;1. 호이스팅이 발생하는 이유&lt;/h3&gt;
&lt;p data-path-to-node=&quot;2&quot; data-ke-size=&quot;size16&quot;&gt;자바스크립트 엔진은 코드를 한 줄씩 실행하기 전에,&lt;/p&gt;
&lt;p data-path-to-node=&quot;2&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;29&quot; data-path-to-node=&quot;2&quot;&gt;먼저 전체 코드를 훑으면서 var, let, const, function으로 선언된 변수나 함수를 찾아서 미리 '기억(메모리 등록)'해 둔다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-path-to-node=&quot;2&quot; data-ke-size=&quot;size16&quot;&gt;이 작업 때문에 코드 실행 시점에서는 선언문이 마치 위로 올라가 있는 것처럼 동작하게 되는 것.&lt;/p&gt;
&lt;h3 data-path-to-node=&quot;4&quot; data-ke-size=&quot;size23&quot;&gt;2. 왜 var는 안 쓰고 let, const를 쓰나?&lt;/h3&gt;
&lt;p data-path-to-node=&quot;5&quot; data-ke-size=&quot;size16&quot;&gt;이 둘의 호이스팅 방식이 다르기 때문&lt;/p&gt;
&lt;h4 data-path-to-node=&quot;6&quot; data-ke-size=&quot;size20&quot;&gt;var의 경우 (예측 불가능)&lt;/h4&gt;
&lt;p data-path-to-node=&quot;7&quot; data-ke-size=&quot;size16&quot;&gt;var는 선언과 동시에 undefined라는 값으로 &lt;b data-index-in-node=&quot;29&quot; data-path-to-node=&quot;7&quot;&gt;초기화&lt;/b&gt;까지 해버린다.&lt;/p&gt;
&lt;div data-ved=&quot;0CAAQhtANahgKEwi23LT6op-VAxUAAAAAHQAAAAAQpwI&quot; data-hveid=&quot;0&quot;&gt;&lt;br /&gt;
&lt;div&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;957&quot; data-origin-height=&quot;139&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bStCtv/dJMcafmO7g1/vLpeTMEBL1vkKiGBiKXGKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bStCtv/dJMcafmO7g1/vLpeTMEBL1vkKiGBiKXGKK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bStCtv/dJMcafmO7g1/vLpeTMEBL1vkKiGBiKXGKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbStCtv%2FdJMcafmO7g1%2FvLpeTMEBL1vkKiGBiKXGKK%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;957&quot; height=&quot;139&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;957&quot; data-origin-height=&quot;139&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-path-to-node=&quot;9&quot; data-ke-size=&quot;size16&quot;&gt;이러면 개발자가 실수로 변수를 선언하기 전에 사용해도 에러가 안 나서 나중에 큰 버그가 됩니다.&lt;/p&gt;
&lt;h4 data-path-to-node=&quot;10&quot; data-ke-size=&quot;size20&quot;&gt;let, const의 경우 (안전함)&lt;/h4&gt;
&lt;p data-path-to-node=&quot;11&quot; data-ke-size=&quot;size16&quot;&gt;let과 const도 호이스팅은 된다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;11&quot; data-ke-size=&quot;size16&quot;&gt;하지만 선언문 위치에 도달하기 전까지 &quot;이 변수는 존재하지만 아직 사용할 수 없다&quot;라는 상태(TDZ, 일시적 사각지대)에 가둔다.&lt;/p&gt;
&lt;div data-ved=&quot;0CAAQhtANahgKEwi23LT6op-VAxUAAAAAHQAAAAAQqAI&quot; data-hveid=&quot;0&quot;&gt;
&lt;div&gt;
&lt;div&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;860&quot; data-origin-height=&quot;147&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sxNPh/dJMcaaMxnP1/p4USsvfBZBwJs7k0Lah55k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sxNPh/dJMcaaMxnP1/p4USsvfBZBwJs7k0Lah55k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sxNPh/dJMcaaMxnP1/p4USsvfBZBwJs7k0Lah55k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsxNPh%2FdJMcaaMxnP1%2Fp4USsvfBZBwJs7k0Lah55k%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;860&quot; height=&quot;147&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;860&quot; data-origin-height=&quot;147&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-path-to-node=&quot;13&quot; data-ke-size=&quot;size16&quot;&gt;이 덕분에 변수를 선언하기 전에 쓰려고 하면 바로 에러를 띄워주어, 개발자가 실수를 바로 잡을 수 있게 해줌&lt;/p&gt;
&lt;h3 data-path-to-node=&quot;15&quot; data-ke-size=&quot;size23&quot;&gt;3. &quot;선언만 끌어올리고 할당은 그대로 남는다&quot;는 의미&lt;/h3&gt;
&lt;p data-path-to-node=&quot;16&quot; data-ke-size=&quot;size16&quot;&gt;이 부분이 가장 중요한데, 선언(변수의 이름만 만드는 것)과 할당(값을 넣는 것)을 분리해서 봐본다.&lt;/p&gt;
&lt;div data-ved=&quot;0CAAQhtANahgKEwi23LT6op-VAxUAAAAAHQAAAAAQqQI&quot; data-hveid=&quot;0&quot;&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;611&quot; data-origin-height=&quot;158&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lWRKt/dJMcahrpiAk/qKJXdUilIL555me6Qt5bH0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lWRKt/dJMcahrpiAk/qKJXdUilIL555me6Qt5bH0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lWRKt/dJMcahrpiAk/qKJXdUilIL555me6Qt5bH0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlWRKt%2FdJMcahrpiAk%2FqKJXdUilIL555me6Qt5bH0%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;611&quot; height=&quot;158&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;611&quot; data-origin-height=&quot;158&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;p data-path-to-node=&quot;18&quot; data-ke-size=&quot;size16&quot;&gt;컴퓨터가 읽을 때는 실제로 이렇게 바뀐 것처럼 작동&lt;/p&gt;
&lt;div data-ved=&quot;0CAAQhtANahgKEwi23LT6op-VAxUAAAAAHQAAAAAQqgI&quot; data-hveid=&quot;0&quot;&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-path-to-node=&quot;21&quot; data-ke-size=&quot;size23&quot;&gt;요약&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;22&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;22,0,0&quot;&gt;호이스팅:&lt;/b&gt; 코드를 실행하기 전 엔진이 선언문을 먼저 읽어 메모리에 등록하는 것.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;22,1,0&quot;&gt;var:&lt;/b&gt; 선언과 함께 undefined로 초기화까지 해버려서, 선언 전에도 값이 있는 것처럼 보여 위험함.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;22,2,0&quot;&gt;let/const:&lt;/b&gt; 호이스팅은 되지만 초기화는 안 해줌. 따라서 선언 전에 쓰면 에러가 나서 안전함.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-path-to-node=&quot;23&quot; data-ke-size=&quot;size16&quot;&gt;처음 배우실 때는 &quot;선언문(let, const, function)은 무조건 코드 가장 위쪽에서 작성하는 습관을 들이자&quot;고 생각하면 호이스팅으로 인한 문제를 완벽히 피할 수 있다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;23&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-24 163123.png&quot; data-origin-width=&quot;733&quot; data-origin-height=&quot;741&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mME74/dJMcacKpu62/LLxkCrKkycw562ktBJrL4k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mME74/dJMcacKpu62/LLxkCrKkycw562ktBJrL4k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mME74/dJMcacKpu62/LLxkCrKkycw562ktBJrL4k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmME74%2FdJMcacKpu62%2FLLxkCrKkycw562ktBJrL4k%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;733&quot; height=&quot;741&quot; data-filename=&quot;스크린샷 2026-06-24 163123.png&quot; data-origin-width=&quot;733&quot; data-origin-height=&quot;741&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;3,0,0&quot;&gt;var의 문제점&lt;/b&gt;&lt;/span&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;3,0,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;3,0,1,0,0&quot;&gt;선언 전 참조&lt;/b&gt;: 에러 없이&lt;span style=&quot;color: #f89009;&quot;&gt; undefined가 출력되어 버그를 찾기 어렵게&lt;/span&gt; 만든다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;3,0,1,1,0&quot;&gt;재선언 가능&lt;/b&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;: 같은 이름으로 변수를 다시 만들어도 에러가 나지 않아 큰 혼란&lt;/span&gt;을 준다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;3,1,0&quot;&gt;let / const 의 장점&lt;/b&gt;:&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;3,1,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;3,1,1,0,0&quot;&gt;TDZ&lt;/b&gt;(Temporal Dead Zone): &lt;span style=&quot;color: #006dd7;&quot;&gt;변수 선언문이 실행되기 전까지는 변수에 접근하는 것을 철저히 막는다&lt;/span&gt;.&lt;/li&gt;
&lt;li&gt;덕분에 &quot;변수를 선언하지 않고 사용했다&quot;는 사실을 바로 알 수 있어 매우 안전&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;3,1,1,1,0&quot;&gt;재선언 불가&lt;/b&gt;: 같은 이름으로 변수를 다시 만들려고 하면 즉시 에러를 띄워 실수를 방지&lt;/li&gt;
&lt;/ul&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;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&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;스크린샷 2026-06-24 174847.png&quot; data-origin-width=&quot;739&quot; data-origin-height=&quot;199&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/egJa45/dJMcagF2ZQt/siY29tUOmN5vfYcQZ891ek/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/egJa45/dJMcagF2ZQt/siY29tUOmN5vfYcQZ891ek/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/egJa45/dJMcagF2ZQt/siY29tUOmN5vfYcQZ891ek/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FegJa45%2FdJMcagF2ZQt%2FsiY29tUOmN5vfYcQZ891ek%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;739&quot; height=&quot;199&quot; data-filename=&quot;스크린샷 2026-06-24 174847.png&quot; data-origin-width=&quot;739&quot; data-origin-height=&quot;199&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-path-to-node=&quot;0&quot; data-ke-size=&quot;size26&quot;&gt;연산자는 거듭제곱(Exponentiation)을 계산하는 것&lt;/h2&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-path-to-node=&quot;8&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;연산자&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;명칭&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;예시&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;결과&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;8,1,0,0&quot;&gt;+&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;8,1,1,0&quot;&gt;더하기&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;8,1,2,0&quot;&gt;10 + 3&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;8,1,3,0&quot;&gt;13&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;8,2,0,0&quot;&gt;-&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;8,2,1,0&quot;&gt;빼기&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;8,2,2,0&quot;&gt;10 - 3&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;8,2,3,0&quot;&gt;7&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;8,3,0,0&quot;&gt;*&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;8,3,1,0&quot;&gt;곱하기&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;8,3,2,0&quot;&gt;10 * 3&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;8,3,3,0&quot;&gt;30&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;8,4,0,0&quot;&gt;/&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;8,4,1,0&quot;&gt;나누기&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;8,4,2,0&quot;&gt;10 / 3&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;8,4,3,0&quot;&gt;3.333...&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;8,5,0,0&quot;&gt;%&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;8,5,1,0&quot;&gt;나머지&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;8,5,2,0&quot;&gt;10 % 3&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;8,5,3,0&quot;&gt;1&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;8,6,0,0&quot;&gt;**&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;8,6,1,0&quot;&gt;거듭제곱&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;8,6,2,0&quot;&gt;2 ** 10&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;8,6,3,0&quot;&gt;1024&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-path-to-node=&quot;0&quot; data-ke-size=&quot;size26&quot;&gt;비교 연산자&lt;/h2&gt;
&lt;p data-path-to-node=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;두 개의 값(피연산자)을 비교하여 그 결과가 참(true)인지 거짓(false)인지를 판별하는 연산자&lt;/p&gt;
&lt;p data-path-to-node=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;조건문이나 반복문에서 특정 조건을 검사할 때 주로 사용된다.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-path-to-node=&quot;2&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;연산자&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;의미&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;설명&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;2,1,0,0&quot;&gt;==&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;2,1,1,0&quot;&gt;동등 연산자&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;2,1,2,0&quot;&gt;두 값이 같은지 비교 (타입이 다르면 변환 후 비교)&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;2,2,0,0&quot;&gt;===&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;2,2,1,0&quot;&gt;일치 연산자&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;2,2,2,0&quot;&gt;두 값과 &lt;b data-index-in-node=&quot;5&quot; data-path-to-node=&quot;2,2,2,0&quot;&gt;타입&lt;/b&gt;이 모두 같은지 비교 (권장)&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;2,3,0,0&quot;&gt;!=&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;2,3,1,0&quot;&gt;부등 연산자&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;2,3,2,0&quot;&gt;두 값이 다른지 비교 (타입이 다르면 변환 후 비교)&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;2,4,0,0&quot;&gt;!==&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;2,4,1,0&quot;&gt;불일치 연산자&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;2,4,2,0&quot;&gt;두 값 또는 &lt;b data-index-in-node=&quot;7&quot; data-path-to-node=&quot;2,4,2,0&quot;&gt;타입&lt;/b&gt;이 다른지 비교&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;2,5,0,0&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;2,5,1,0&quot;&gt;크다&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;2,5,2,0&quot;&gt;왼쪽 값이 오른쪽 값보다 큰지 확인&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;2,6,0,0&quot;&gt;&amp;lt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;2,6,1,0&quot;&gt;작다&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;2,6,2,0&quot;&gt;왼쪽 값이 오른쪽 값보다 작은지 확인&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;2,7,0,0&quot;&gt;&amp;gt;=&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;2,7,1,0&quot;&gt;크거나 같다&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;2,7,2,0&quot;&gt;왼쪽 값이 오른쪽 값보다 크거나 같은지 확인&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;2,8,0,0&quot;&gt;&amp;lt;=&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;2,8,1,0&quot;&gt;작거나 같다&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;2,8,2,0&quot;&gt;왼쪽 값이 오른쪽 값보다 작거나 같은지 확인&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-path-to-node=&quot;4&quot; data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-path-to-node=&quot;4&quot; data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-path-to-node=&quot;4&quot; data-ke-size=&quot;size23&quot;&gt;핵심 주의사항:&amp;nbsp; &amp;nbsp; &amp;nbsp; == vs ===&lt;/h3&gt;
&lt;p data-path-to-node=&quot;5&quot; data-ke-size=&quot;size16&quot;&gt;자바스크립트에서 값을 비교할 때는 &lt;b&gt;=== (일치 연산자)&lt;/b&gt;를 사용하는 것이 좋다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;5&quot; data-ke-size=&quot;size16&quot;&gt;==는 비교 과정에서 자바스크립트가 자&lt;u&gt;동으로 타입을 변환(Type Coercion)하기 때문에 예기치 않은 결과가 발생할 수 있기 때문&lt;/u&gt;&lt;/p&gt;
&lt;blockquote data-path-to-node=&quot;5&quot; data-ke-style=&quot;style3&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;console.&lt;/span&gt;&lt;/b&gt;log(&lt;span style=&quot;color: #ee2323;&quot;&gt;5&lt;/span&gt; == '&lt;span style=&quot;color: #409d00;&quot;&gt;5&lt;/span&gt;'); // &lt;span style=&quot;color: #006dd7;&quot;&gt;true&lt;/span&gt; (타입은 다르지만 값만 비교)&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;console.&lt;/span&gt;&lt;/b&gt;log(&lt;span style=&quot;color: #ee2323;&quot;&gt;5&lt;/span&gt; === '&lt;span style=&quot;color: #409d00;&quot;&gt;5&lt;/span&gt;'); //&lt;span style=&quot;color: #ee2323;&quot;&gt; false&lt;/span&gt; (값은 같지만 타입이 숫자와 문자열로 다름) &lt;br /&gt;&lt;b&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;console&lt;/span&gt;&lt;/b&gt;.log(&lt;span style=&quot;color: #ee2323;&quot;&gt;0&lt;/span&gt; == &lt;span style=&quot;color: #ef5369;&quot;&gt;false&lt;/span&gt;); // &lt;span style=&quot;color: #006dd7;&quot;&gt;true&lt;/span&gt; &lt;br /&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;&lt;b&gt;console&lt;/b&gt;&lt;/span&gt;.&lt;/span&gt;log(&lt;span style=&quot;color: #ef5369;&quot;&gt;0&lt;/span&gt; === &lt;span style=&quot;color: #ef5369;&quot;&gt;false&lt;/span&gt;); // &lt;span style=&quot;color: #ee2323;&quot;&gt;false&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;비교 연산의 결과는 항상 &lt;b data-index-in-node=&quot;14&quot; data-path-to-node=&quot;8&quot;&gt;불리언(Boolean)&lt;/b&gt; 데이터 타입인 true 또는 false로 반환된다.&amp;nbsp;&lt;/p&gt;</description>
      <category>개발자 호소인/Front</category>
      <author>리제 </author>
      <guid isPermaLink="true">https://bookstairs.tistory.com/83</guid>
      <comments>https://bookstairs.tistory.com/83#entry83comment</comments>
      <pubDate>Wed, 24 Jun 2026 16:19:44 +0900</pubDate>
    </item>
    <item>
      <title>[javascript]  1. JS개요와 실행 환경 /메서드 오버로딩(Method Overloading)</title>
      <link>https://bookstairs.tistory.com/82</link>
      <description>&lt;p data-path-to-node=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1 style=&quot;text-align: center;&quot;&gt;크립트 언어와 자바스크립트&lt;/h1&gt;
&lt;h3 style=&quot;text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;스크립트 언어란?&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;프로그램의 동작을 사용자의 요구사항에 맞게 수행되도록 해주는 용도&lt;/li&gt;
&lt;li&gt;비교적 유연하게 동작하여 쉽게 사용이 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 style=&quot;text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;자바스크립트란&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;웹 브라우저에서 사용되는 인터프리터 방식의 스크립트 언어&lt;/li&gt;
&lt;li&gt;브라우저에 엔진(V8)이 탑재되어 있어 별도의 컴파일 없이 동작&lt;/li&gt;
&lt;li&gt;인터프리터 방식: 코드를 한 줄씩 읽어가며 바로 실행하는 방식
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;실시간으로 텍스트를 분석해서 실행 &amp;rarr; 문법 오류가 있으면 런타임 시점에 알려줌&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 style=&quot;text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;웹의 3요소에서 JS의 역할&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;HTML: 웹 문서의 큰 틀을 잡을 때 사용 (DOM Tree 구성)&lt;/li&gt;
&lt;li&gt;CSS: HTML로 구성된 DOM에 다양한 스타일 속성을 부여&lt;/li&gt;
&lt;li&gt;JS: 웹 문서에서 이벤트가 발생했을 때 실행할 기능을 정의 &amp;rarr; HTML로 구성된 DOM을 편집&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;js를 웹에서 사용하는 방법&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;inline(인라인): 태그 내에서 간단한 소스코드를 작성해서 실행되게 하는 방법&lt;/li&gt;
&lt;li&gt;internal(내부): HTML 문서 내에 소스코드를 작성해서 실행되게 하는 방법&lt;/li&gt;
&lt;li&gt;external(외부): 별도의 .js 파일로 소스코드를 작성해서 가져다가 실행되게 하는 방법&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;inline&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;표현법: &amp;lt;태그 on이벤트명=&quot;해당 요소의 이벤트 발생시 실행할 코드&quot;&amp;gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-24 172935.png&quot; data-origin-width=&quot;648&quot; data-origin-height=&quot;93&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qMo5H/dJMb997U3AF/H4sAHov8xzwKUB3JjAX1u0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qMo5H/dJMb997U3AF/H4sAHov8xzwKUB3JjAX1u0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qMo5H/dJMb997U3AF/H4sAHov8xzwKUB3JjAX1u0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqMo5H%2FdJMb997U3AF%2FH4sAHov8xzwKUB3JjAX1u0%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;648&quot; height=&quot;93&quot; data-filename=&quot;스크린샷 2026-06-24 172935.png&quot; data-origin-width=&quot;648&quot; data-origin-height=&quot;93&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;h4 data-ke-size=&quot;size20&quot;&gt;internal&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&amp;lt;script&amp;gt; 태그 영역 안에 소스코드를 작성&lt;/li&gt;
&lt;li&gt;&amp;lt;script&amp;gt; 태그는 head, body 어디에서건 사용 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-24 173013.png&quot; data-origin-width=&quot;678&quot; data-origin-height=&quot;218&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ttDZR/dJMcacp5OFj/vN1kshNsT4rrGN2vRk0f50/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ttDZR/dJMcacp5OFj/vN1kshNsT4rrGN2vRk0f50/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ttDZR/dJMcacp5OFj/vN1kshNsT4rrGN2vRk0f50/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FttDZR%2FdJMcacp5OFj%2FvN1kshNsT4rrGN2vRk0f50%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;678&quot; height=&quot;218&quot; data-filename=&quot;스크린샷 2026-06-24 173013.png&quot; data-origin-width=&quot;678&quot; data-origin-height=&quot;218&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;&amp;nbsp;&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;external&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;외부의 .js 파일을 생성해서 따로 js 코드를 작성&lt;/li&gt;
&lt;li&gt;head 영역에서 &amp;lt;script src=&quot;./sample.js&quot;&amp;gt;&amp;lt;/script&amp;gt;로 연결&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-24 173037.png&quot; data-origin-width=&quot;685&quot; data-origin-height=&quot;233&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/C0p4D/dJMcabdxP5l/3dZaEkm2GDvxJRZk3L3M1k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/C0p4D/dJMcabdxP5l/3dZaEkm2GDvxJRZk3L3M1k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/C0p4D/dJMcabdxP5l/3dZaEkm2GDvxJRZk3L3M1k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FC0p4D%2FdJMcabdxP5l%2F3dZaEkm2GDvxJRZk3L3M1k%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;685&quot; height=&quot;233&quot; data-filename=&quot;스크린샷 2026-06-24 173037.png&quot; data-origin-width=&quot;685&quot; data-origin-height=&quot;233&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;p data-path-to-node=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-path-to-node=&quot;0&quot; data-ke-size=&quot;size26&quot;&gt;메서드 오버로딩(Method Overloading)은&lt;/h2&gt;
&lt;p data-path-to-node=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;자바와 같은 객체지향 언어에서 &lt;b data-index-in-node=&quot;47&quot; data-path-to-node=&quot;0&quot;&gt;같은 이름의 메서드를 여러 개 정의하는 것&lt;/b&gt;을 의미.&lt;/p&gt;
&lt;p data-path-to-node=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;단순히 이름만 같다고 되는 것이 아니라, 반드시 아래의 &lt;b data-index-in-node=&quot;110&quot; data-path-to-node=&quot;0&quot;&gt;조건&lt;/b&gt;을 충족해야 한다.&lt;/p&gt;
&lt;h3 data-path-to-node=&quot;2&quot; data-ke-size=&quot;size23&quot;&gt;메서드 오버로딩의 필수 조건&lt;/h3&gt;
&lt;p data-path-to-node=&quot;3&quot; data-ke-size=&quot;size16&quot;&gt;메서드 오버로딩이 성립하려면 &lt;b data-index-in-node=&quot;16&quot; data-path-to-node=&quot;3&quot;&gt;메서드 이름은 같아야 하며, 파라미터(매개변수)의 구성이 달라야한다.&lt;/b&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-path-to-node=&quot;4&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;4,0,0&quot;&gt;파라미터의 개수가 달라야 한다.&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;4,1,0&quot;&gt;파라미터의 타입(자료형)이 달라야 한다.&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;4,2,0&quot;&gt;파라미터의 순서가 달라야 한다.&lt;/b&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote data-path-to-node=&quot;5&quot; data-ke-style=&quot;style2&quot;&gt;
&lt;p data-path-to-node=&quot;5,0&quot; data-ke-size=&quot;size16&quot;&gt;주의: 리턴 타입(반환형)만 다른 것은 오버로딩 조건이 아닙니다. 리턴 타입은 메서드 호출 시 어떤 메서드를 실행할지 결정하는 데 영향을 주지 않기 때문&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 data-path-to-node=&quot;0&quot; data-ke-size=&quot;size26&quot;&gt;프로그래밍에서 스코프(Scope)란&lt;/h2&gt;
&lt;h3 data-path-to-node=&quot;0&quot; data-ke-size=&quot;size23&quot;&gt;'변수나 함수에 접근할 수 있는 범위'를 의미한다.&lt;/h3&gt;
&lt;h3 data-path-to-node=&quot;0&quot; data-ke-size=&quot;size23&quot;&gt;쉽게 말해, &quot;어디서 이 변수를 가져다 쓸 수 있는가?&quot;를 결정하는 영역&lt;/h3&gt;
&lt;p data-path-to-node=&quot;1&quot; data-ke-size=&quot;size16&quot;&gt;스코프를 이해하면 프로그램 안에서 변수 이름이 겹쳐도 서로 충돌하지 않는 이유를 알 수 있다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;1&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;1&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-path-to-node=&quot;3&quot; data-ke-size=&quot;size23&quot;&gt;1. 전역 스코프 (Global Scope)&lt;/h3&gt;
&lt;p data-path-to-node=&quot;4&quot; data-ke-size=&quot;size16&quot;&gt;코드의 가장 바깥쪽에 선언된 변수. 파일 전체 어디서든 참조할 수 있다.&lt;/p&gt;
&lt;div data-ved=&quot;0CAAQhtANahgKEwiupOTw3J6VAxUAAAAAHQAAAAAQogQ&quot; data-hveid=&quot;0&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&lt;span&gt;JavaScript&lt;/span&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;pre class=&quot;javascript&quot;&gt;&lt;code&gt;let globalName = &quot;전역 변수&quot;;

function print() {
    console.log(globalName); // 함수 안에서도 잘 동작함
}
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-path-to-node=&quot;6&quot; data-ke-size=&quot;size23&quot;&gt;2. 지역 스코프 (Local/Block Scope)&lt;/h3&gt;
&lt;p data-path-to-node=&quot;7&quot; data-ke-size=&quot;size16&quot;&gt;특정 코드 블록({ }) 안에서만 유효한 변수. 블록 밖에서는 이 변수를 절대 부를 수 없다.&lt;/p&gt;
&lt;div data-ved=&quot;0CAAQhtANahgKEwiupOTw3J6VAxUAAAAAHQAAAAAQowQ&quot; data-hveid=&quot;0&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&lt;span&gt;JavaScript&lt;/span&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;pre class=&quot;javascript&quot;&gt;&lt;code&gt;function localFunction() {
    let localName = &quot;지역 변수&quot;;
    console.log(localName); // 함수 안에서는 가능
}

// console.log(localName); // 에러! 함수 밖에서는 접근 불가
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-path-to-node=&quot;10&quot; data-ke-size=&quot;size23&quot;&gt;스코프의 핵심 규칙&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-path-to-node=&quot;11&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;11,0,0&quot;&gt;안쪽에서 바깥쪽으로:&lt;/b&gt; 안쪽 스코프는 바깥쪽 스코프의 변수를 사용할 수 있다. 하지만 반대로, 바깥쪽 스코프에서는 안쪽 스코프의 변수를 사용할 수 없다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;11,1,0&quot;&gt;가까운 것이 우선:&lt;/b&gt; 변수 이름이 겹친다면, 현재 내가 있는 곳에서 &lt;b data-index-in-node=&quot;37&quot; data-path-to-node=&quot;11,1,0&quot;&gt;가장 가까운 스코프&lt;/b&gt;에 정의된 변수를 먼저 사용한다.&lt;/li&gt;
&lt;/ol&gt;
&lt;div data-ved=&quot;0CAAQhtANahgKEwiupOTw3J6VAxUAAAAAHQAAAAAQpAQ&quot; data-hveid=&quot;0&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&lt;span&gt;JavaScript&lt;/span&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;pre class=&quot;javascript&quot;&gt;&lt;code&gt;let name = &quot;바깥쪽&quot;;

function outer() {
    let name = &quot;안쪽&quot;; // 바깥쪽 name을 가림 (Shadowing)
    console.log(name); // &quot;안쪽&quot; 출력
}
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-path-to-node=&quot;13&quot; data-ke-size=&quot;size23&quot;&gt;왜 스코프가 중요한가요?&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;14&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;14,0,0&quot;&gt;이름 충돌 방지:&lt;/b&gt; 스코프가 없다면 모든 변수 이름을 다 다르게 지어야 해서 코딩이 매우 힘들어짐&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;14,1,0&quot;&gt;메모리 절약:&lt;/b&gt; 사용이 끝난 지역 변수는 해당 스코프를 벗어나는 순간 메모리에서 해제될 수 있어 효율적&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;14,2,0&quot;&gt;보안:&lt;/b&gt; 외부에서 접근하면 안 되는 중요한 데이터를 특정 스코프 안에 가두어 보호할 수 있디/&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-path-to-node=&quot;15&quot; data-ke-size=&quot;size16&quot;&gt;자바스크립트 학습 중에 let과 const가 &lt;b data-index-in-node=&quot;25&quot; data-path-to-node=&quot;15&quot;&gt;블록 레벨 스코프&lt;/b&gt;(중괄호 { } 단위)를 따른다는 점은 매우 중요. 변수가 선언된 중괄호 밖으로는 나갈 수 없다고 생각하면 된다.&lt;/p&gt;</description>
      <category>개발자 호소인/Front</category>
      <author>리제 </author>
      <guid isPermaLink="true">https://bookstairs.tistory.com/82</guid>
      <comments>https://bookstairs.tistory.com/82#entry82comment</comments>
      <pubDate>Wed, 24 Jun 2026 14:32:49 +0900</pubDate>
    </item>
    <item>
      <title>[JavaScript] 3. 형변환</title>
      <link>https://bookstairs.tistory.com/81</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-24 113928.png&quot; data-origin-width=&quot;552&quot; data-origin-height=&quot;282&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bYLqs7/dJMcajbxVCN/lyooJjohNvV2K1LgMSbo41/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bYLqs7/dJMcajbxVCN/lyooJjohNvV2K1LgMSbo41/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bYLqs7/dJMcajbxVCN/lyooJjohNvV2K1LgMSbo41/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbYLqs7%2FdJMcajbxVCN%2FlyooJjohNvV2K1LgMSbo41%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;552&quot; height=&quot;282&quot; data-filename=&quot;스크린샷 2026-06-24 113928.png&quot; data-origin-width=&quot;552&quot; data-origin-height=&quot;282&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-path-to-node=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;자바스크립트의 '묵시적 형변환(Implicit Type Conversion)'은 프로그래밍 언어가 데이터 타입을 자동으로 바꾸어 계산하는 아주 편리하지만 주의해야 할 기능이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;1&quot; data-ke-size=&quot;size16&quot;&gt;.&lt;/p&gt;
&lt;h3 data-path-to-node=&quot;3&quot; data-ke-size=&quot;size23&quot;&gt;1. 덧셈(+) 연산자: &quot;문자열이 깡패다&quot;&lt;/h3&gt;
&lt;p data-path-to-node=&quot;4&quot; data-ke-size=&quot;size16&quot;&gt;자바스크립트에서 + 연산자는 &lt;b data-index-in-node=&quot;16&quot; data-path-to-node=&quot;4&quot;&gt;문자열이 하나라도 섞이면, 숫자를 문자열로 바꿔서 이어 붙여버린다.&lt;/b&gt; 이를 '문자열 연결'이라 한다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;5&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;console.log(1 + &quot;1&quot;);
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;5,0,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;숫자 1과 문자열 &quot;1&quot;이 만났다. 자바스크립트는 숫자 1을 문자열 &quot;1&quot;로 변환한 뒤, 두 문자열을 붙인다.&lt;/li&gt;
&lt;li&gt;결과: &quot;11&quot; (문자열)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;console.log(&quot;5&quot; + 3);
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;5,1,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;문자열 &quot;5&quot;와 숫자 3이 만났다. 역시 숫자 3을 문자열 &quot;3&quot;으로 변환하여 이어 붙인다.&lt;/li&gt;
&lt;li&gt;결과: &quot;53&quot; (문자열)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-path-to-node=&quot;7&quot; data-ke-size=&quot;size23&quot;&gt;2. 뺄셈(-), 곱셈(*), 나눗셈(/) 연산자: &quot;숫자가 우선이다&quot;&lt;/h3&gt;
&lt;p data-path-to-node=&quot;8&quot; data-ke-size=&quot;size16&quot;&gt;덧셈과 달리, 뺄셈이나 곱셈은 문자열로 계산할 수 없기 때문에, 자바스크립트는 &lt;b data-index-in-node=&quot;44&quot; data-path-to-node=&quot;8&quot;&gt;문자열을 숫자로 바꿔서 수학 계산&lt;/b&gt;을 시도한다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;9&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;console.log(1 - &quot;1&quot;);
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;9,0,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;문자열 &quot;1&quot;을 숫자 1로 변환, 1 - 1을 계산&lt;/li&gt;
&lt;li&gt;결과: 0 (숫자)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;console.log(&quot;5&quot; * &quot;2&quot;);
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;9,1,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;문자열 &quot;5&quot;와 &quot;2&quot;를 각각 숫자 5와 2로 변환,. 5 * 2를 계산&lt;/li&gt;
&lt;li&gt;결과: 10 (숫자)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-path-to-node=&quot;11&quot; data-ke-size=&quot;size23&quot;&gt;3. 마지막 문제: true - &quot;20&quot;&lt;/h3&gt;
&lt;p data-path-to-node=&quot;12&quot; data-ke-size=&quot;size16&quot;&gt;. 자바스크립트에서 &lt;b&gt;true는 숫자 1로, false는 0&lt;/b&gt;으로 취급&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;13&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;console.log(true - &quot;20&quot;);
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;13,0,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;true는 숫자 1로 변환&lt;/li&gt;
&lt;li&gt;&quot;20&quot;은 숫자 20으로 변환됩&lt;/li&gt;
&lt;li&gt;결과: 1 - 20이 되어 -19가 출력&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-path-to-node=&quot;15&quot; data-ke-size=&quot;size23&quot;&gt;요약하자면&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;16&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;16,0,0&quot;&gt;+&lt;/b&gt;: &quot;문자열이 하나라도 있으면 다 문자열로 합치자!&quot;&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;16,1,0&quot;&gt;-, *, /&lt;/b&gt;: &quot;수학 계산을 해야 하니 일단 다 숫자로 바꿔보자!&quot;&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;&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;h2 data-ke-size=&quot;size26&quot;&gt;&amp;lt;명시적 형변환&amp;gt;&lt;/h2&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-path-to-node=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b data-path-to-node=&quot;0&quot; data-index-in-node=&quot;0&quot;&gt;명시적(Explicit) 형변환&lt;/b&gt;은 말 그대로 &quot;내가 직접 타입을 바꾸겠어!&quot;라고 개발자가 코드로 의도를 명확하게 드러내는 것이다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-path-to-node=&quot;1&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;'암묵적 형변환'이 JS 엔진이 몰래(자동으로) 바꾸는 것이라면, 명시적 형변환은&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b data-path-to-node=&quot;1&quot; data-index-in-node=&quot;53&quot;&gt;함수나 기호를 사용해 개발자가 강제로 형식을 지정&lt;/b&gt;하는 것입으로 이해하면 된다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-path-to-node=&quot;1&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-path-to-node=&quot;2&quot; data-ke-size=&quot;size23&quot;&gt;예시로 보는 명시적 형변환의 이유&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;991&quot; data-origin-height=&quot;258&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cOcNi7/dJMcafG9tx6/PiYnYOuU6nU4bdJy1Sa3R0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cOcNi7/dJMcafG9tx6/PiYnYOuU6nU4bdJy1Sa3R0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cOcNi7/dJMcafG9tx6/PiYnYOuU6nU4bdJy1Sa3R0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcOcNi7%2FdJMcafG9tx6%2FPiYnYOuU6nU4bdJy1Sa3R0%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;991&quot; height=&quot;258&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;991&quot; data-origin-height=&quot;258&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-path-to-node=&quot;3&quot; data-ke-size=&quot;size20&quot;&gt;1. Number(&quot;123&quot;)&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;4&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;4,0,0&quot;&gt;의도&lt;/b&gt;: &quot;이 문자열 데이터를 반드시 &lt;b data-index-in-node=&quot;20&quot; data-path-to-node=&quot;4,0,0&quot;&gt;숫자&lt;/b&gt;로 처리하겠다.&quot;&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;4,1,0&quot;&gt;이유&lt;/b&gt;: typeof를 찍어보면 확실히 string이었던 값이 number로 바뀜. 연산 시 에러를 방지하기 위해 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-path-to-node=&quot;5&quot; data-ke-size=&quot;size20&quot;&gt;2. parseInt(&quot;12px&quot;)&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;6&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;6,0,0&quot;&gt;의도&lt;/b&gt;: &quot;이 문자열 앞부분에 있는 숫자만 추출해서 정수(Integer)로 쓰겠다.&quot;&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;6,1,0&quot;&gt;이유&lt;/b&gt;: &quot;12px&quot;라는 문자열에서 숫자 12만 쏙 뽑아내어 계산에 쓰고 싶을 때 사용합니다. Number(&quot;12px&quot;)를 쓰면 NaN(Not a Number, 숫자가 아님)이 나오는데, parseInt를 쓰면 똑똑하게 숫자만 골라줌.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-path-to-node=&quot;7&quot; data-ke-size=&quot;size20&quot;&gt;3. String(123)&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;8&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;8,0,0&quot;&gt;의도&lt;/b&gt;: &quot;숫자 123을 화면에 보여주기 위해 &lt;b data-index-in-node=&quot;25&quot; data-path-to-node=&quot;8,0,0&quot;&gt;문자열&lt;/b&gt;로 바꾸겠다.&quot;&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;8,1,0&quot;&gt;이유&lt;/b&gt;: 숫자를 그대로 쓰면 안 되고, 다른 글자와 합치거나 HTML에 텍스트로 넣어야 할 때 명확하게 문자열로 변환&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-path-to-node=&quot;9&quot; data-ke-size=&quot;size20&quot;&gt;4. Boolean(0)&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;10&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;10,0,0&quot;&gt;의도&lt;/b&gt;: &quot;숫자 0을 &lt;b data-index-in-node=&quot;11&quot; data-path-to-node=&quot;10,0,0&quot;&gt;참(true)인가 거짓(false)인가&lt;/b&gt; 하는 논리값으로 변환하겠다.&quot;&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;10,1,0&quot;&gt;이유&lt;/b&gt;: JS에서 0은 false로 취급됩니다. 이를 명시적으로 확인하고 싶을 때 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-path-to-node=&quot;11&quot; data-ke-size=&quot;size20&quot;&gt;5. !!&quot;hello&quot; (이중 부정)&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;12&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;12,0,0&quot;&gt;의도&lt;/b&gt;: &quot;문자열을 &lt;b data-index-in-node=&quot;10&quot; data-path-to-node=&quot;12,0,0&quot;&gt;확실한 true/false 값&lt;/b&gt;으로 바꾸겠다.&quot;&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;12,1,0&quot;&gt;이유&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;12,1,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;! (부정): &quot;hello&quot;는 참인데 부정(!)하면 false가 됨&lt;/li&gt;
&lt;li&gt;!! (이중 부정): false를 다시 부정하면 true가 됨&lt;/li&gt;
&lt;li&gt;즉, 어떤 데이터든 !!를 붙이면 그 데이터가&lt;b&gt; &quot;참 같은 값(truthy)&quot;&lt;/b&gt;인지 &quot;&lt;b&gt;거짓 같은 값(falsy&lt;/b&gt;)&quot;인지 확실하게 &lt;span style=&quot;color: #009a87;&quot;&gt;true나&lt;/span&gt; &lt;span style=&quot;color: #ee2323;&quot;&gt;false&lt;/span&gt;로 바꿔주는 &lt;b data-index-in-node=&quot;87&quot; data-path-to-node=&quot;12,1,1,2,0&quot;&gt;트릭&lt;/b&gt;&lt;/li&gt;
&lt;/ul&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;&lt;/p&gt;
&lt;h2 data-path-to-node=&quot;0&quot; data-ke-size=&quot;size26&quot;&gt;&amp;lt;암묵적 형변환(Implicit Type Conversion)&amp;gt;&lt;/h2&gt;
&lt;p data-path-to-node=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;은 자바스크립트 엔진이 개발자의 의도와 상관없이 &quot;데이터의 형식이 맞지 않으니,&lt;/p&gt;
&lt;p data-path-to-node=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;연산이 가능하도록 알아서 타입을 바꾸자!&quot;라고 판단하여 자동으로 처리하는 과정.&lt;/p&gt;
&lt;p data-path-to-node=&quot;1&quot; data-ke-size=&quot;size16&quot;&gt;이를 '&lt;b&gt;타입 강제 변환(Type Coercion)&lt;/b&gt;'이라고도 부르는데,. 핵심은 '연산자'에 따라 자바스크립트가 어떤 전략을 취하느냐다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;1&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;2&quot; data-ke-size=&quot;size16&quot;&gt;1. + 연산자: &quot;문자열이 우선이야&quot;&lt;/p&gt;
&lt;p data-path-to-node=&quot;3&quot; data-ke-size=&quot;size16&quot;&gt;+ 연산자는 &lt;b data-index-in-node=&quot;7&quot; data-path-to-node=&quot;3&quot;&gt;덧셈&lt;/b&gt;도 하지만 &lt;b data-index-in-node=&quot;15&quot; data-path-to-node=&quot;3&quot;&gt;문자열을 이어 붙이는(연결)&lt;/b&gt; 역할도한다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;3&quot; data-ke-size=&quot;size16&quot;&gt;자바스크립트는 둘 중 하나라도 문자열이 있으면, 나머지 하나도 문자열로 바꿔서 연결하는 것을 우선으로 한다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;4&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;1 + &quot;1&quot; &amp;rarr; 1을 문자열 &quot;1&quot;로 변환 &amp;rarr; &quot;1&quot; + &quot;1&quot; = &quot;11&quot;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;true + &quot;1&quot; &amp;rarr; true를 문자열 &quot;true&quot;로 변환 &amp;rarr; &quot;true&quot; + &quot;1&quot; = &quot;true1&quot;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-path-to-node=&quot;5&quot; data-ke-size=&quot;size23&quot;&gt;2. -, *, / 연산자: &quot;숫자가 우선이야&quot;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;&lt;s&gt; (앞에도 강조했지만...)&amp;nbsp;&lt;/s&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-path-to-node=&quot;6&quot; data-ke-size=&quot;size16&quot;&gt;이 연산자들은 오직 &lt;b data-index-in-node=&quot;11&quot; data-path-to-node=&quot;6&quot;&gt;수학적 계산&lt;/b&gt;만을 위해 존재한다. 따라서 문자열이 섞여 있어도 일단 숫자로 변환하려고 시도한다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;7&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&quot;5&quot; * 2 &amp;rarr; &quot;5&quot;를 숫자 5로 변환 &amp;rarr; 5 * 2 = 10&lt;/li&gt;
&lt;li&gt;&quot;10&quot; - 5 &amp;rarr; &quot;10&quot;을 숫자 10으로 변환 &amp;rarr; 10 - 5 = 5&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-path-to-node=&quot;8&quot; data-ke-size=&quot;size23&quot;&gt;3. 논리 평가 (if, &amp;amp;&amp;amp;, ||): &quot;참인지 거짓인지가 중요해&quot;&lt;/h3&gt;
&lt;p data-path-to-node=&quot;9&quot; data-ke-size=&quot;size16&quot;&gt;if 문이나 논리 연산자(&amp;amp;&amp;amp;, ||) 안에서는 데이터의 값이 '참 같은 값(Truthy)'인지 '거짓 같은 값(Falsy)'인지가 중요하다. 그래서&lt;span style=&quot;background-color: #9feec3;&quot;&gt; 모든 데이터를 불린(Boolean) &lt;/span&gt;타입으로 평가한다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;10&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;10,0,0&quot;&gt;Falsy한 값 (거짓으로 평가되는 것들): 0, &quot;&quot; (빈 문자열), null, undefined, NaN, false&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;10,1,0&quot;&gt;Truthy한 값:&lt;/b&gt; 위를 제외한 나머지 전부 (심지어 &lt;b&gt;&lt;u&gt;&quot;0&quot;&lt;/u&gt;&lt;/b&gt; 같은 문자열도 참)&lt;/li&gt;
&lt;/ul&gt;
&lt;div data-ved=&quot;0CAAQhtANahgKEwiu3OrykaSVAxUAAAAAHQAAAAAQ5QY&quot; data-hveid=&quot;0&quot;&gt;
&lt;div&gt;&lt;br /&gt;
&lt;div&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-26 155024.png&quot; data-origin-width=&quot;896&quot; data-origin-height=&quot;240&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/YQnbf/dJMcadJcv0L/g7M23SuYk3FpdxoCzHOxlk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/YQnbf/dJMcadJcv0L/g7M23SuYk3FpdxoCzHOxlk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/YQnbf/dJMcadJcv0L/g7M23SuYk3FpdxoCzHOxlk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FYQnbf%2FdJMcadJcv0L%2Fg7M23SuYk3FpdxoCzHOxlk%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;896&quot; height=&quot;240&quot; data-filename=&quot;스크린샷 2026-06-26 155024.png&quot; data-origin-width=&quot;896&quot; data-origin-height=&quot;240&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-path-to-node=&quot;12&quot; data-ke-size=&quot;size23&quot;&gt;왜 암묵적 형변환을 조심해야 할까?&lt;/h3&gt;
&lt;p data-path-to-node=&quot;13&quot; data-ke-size=&quot;size16&quot;&gt;자바스크립트 엔진이 똑똑하게 변환해주지만, 때로는 개발자의 예상을 벗어나는 결과를 냄.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;14&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;[] + 1의 결과는 무엇일까요? 배열을 비우면 &quot;&quot;(빈 문자열)이 되어 &quot;1&quot;이 됨.&lt;/li&gt;
&lt;li&gt;null + 1은 어떻게 될까요? null을 0으로 변환하여 1이 됨&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-path-to-node=&quot;15&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;암묵적 형변환은 편리하지만, &quot;내가 의도하지 않은 결과&quot;를 낳을 위험이 큼&lt;/p&gt;
&lt;p data-path-to-node=&quot;15&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;그래서 코드의 안전성을 위해서는 최대한 Number(), String() 등을 사용해 &lt;b data-index-in-node=&quot;97&quot; data-path-to-node=&quot;15&quot;&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;/p&gt;
&lt;h3 data-path-to-node=&quot;1&quot; data-ke-size=&quot;size23&quot;&gt;&amp;lt;1 + &quot;1&quot;이 &quot;11&quot;인 이유&amp;gt;&lt;/h3&gt;
&lt;p data-path-to-node=&quot;2&quot; data-ke-size=&quot;size16&quot;&gt;자바스크립트에서 + 연산자는 두 가지 의미가 있다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;3&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;3,0,0&quot;&gt;숫자 더하기:&lt;/b&gt; &lt;span data-index-in-node=&quot;8&quot; data-math=&quot;1 + 2 = 3&quot;&gt;$1 + 2 = 3$&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;3,1,0&quot;&gt;문자열 연결:&lt;/b&gt; &quot;안녕&quot; + &quot;하세요&quot; = &quot;안녕하세요&quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-path-to-node=&quot;4&quot; data-ke-size=&quot;size16&quot;&gt;그런데 +의 한쪽이라도 문자열(String)이 있으면, 자바스크립트는 다른 한쪽도 문자열로 바꿔서 &quot;연결&quot;해 버림&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;5&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&quot;1&quot;은 문자열이므로, 앞에 있는 1도 문자열 &quot;1&quot;로 바뀐다.&lt;/li&gt;
&lt;li&gt;결과적으로 &quot;1&quot; + &quot;1&quot;이 되어 &quot;11&quot;이 된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-path-to-node=&quot;7&quot; data-ke-size=&quot;size23&quot;&gt;&amp;lt; &quot;5&quot; * 2가 10인 이유&amp;gt;&lt;/h3&gt;
&lt;p data-path-to-node=&quot;8&quot; data-ke-size=&quot;size16&quot;&gt;*(곱하기), -(빼기), /(나누기) 연산자는 오직 &lt;b data-index-in-node=&quot;30&quot; data-path-to-node=&quot;8&quot;&gt;숫자 계산&lt;/b&gt;을 위해서만 존재합니다. 따라서 문자열 &quot;5&quot;가 섞여 있어도 자바스크립트는 &quot;아, 이건 곱하기를 해야 하니까 문자열을 숫자로 바꿔야겠다!&quot;라고 판단&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;9&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&quot;5&quot;를 숫자 5로 자동 변환&lt;/li&gt;
&lt;li&gt;&lt;span data-index-in-node=&quot;0&quot; data-math=&quot;5 \times 2 = 10&quot;&gt;$5 \times 2 = 10$&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-path-to-node=&quot;11&quot; data-ke-size=&quot;size23&quot;&gt;&amp;lt; true + 1이 2인 이유&amp;gt;&lt;/h3&gt;
&lt;p data-path-to-node=&quot;12&quot; data-ke-size=&quot;size16&quot;&gt;자바스크립트에서 불린(Boolean) 타입은 숫자와 계산될 때 &lt;b data-index-in-node=&quot;35&quot; data-path-to-node=&quot;12&quot;&gt;true는 1로, false는 0으로&lt;/b&gt; 변환되는 약속&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;13&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;true는 1로 바꿘다.&lt;/li&gt;
&lt;li&gt;&lt;span data-index-in-node=&quot;0&quot; data-math=&quot;1 + 1 = 2&quot;&gt;$1 + 1 = 2$&lt;/span&gt;가 됨&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-path-to-node=&quot;14&quot; data-ke-size=&quot;size20&quot;&gt;한눈에 정리하는 규칙&lt;/h4&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 84px;&quot; border=&quot;1&quot; data-path-to-node=&quot;15&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;&lt;b&gt;상황&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;&lt;b&gt;변환 방식&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;&lt;b&gt;이유&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;&lt;span data-path-to-node=&quot;15,1,0,0&quot;&gt;+ 연산자&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;&lt;span data-path-to-node=&quot;15,1,1,0&quot;&gt;문자열 우선&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;&lt;span data-path-to-node=&quot;15,1,2,0&quot;&gt;문자열과 만나면 무조건 '연결'&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;&lt;span data-path-to-node=&quot;15,2,0,0&quot;&gt;*, -, /&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;&lt;span data-path-to-node=&quot;15,2,1,0&quot;&gt;숫자 우선&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;&lt;span data-path-to-node=&quot;15,2,2,0&quot;&gt;계산을 하려면 무조건 '숫자'여야 함&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;&lt;span data-path-to-node=&quot;15,3,0,0&quot;&gt;true&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;&lt;span data-path-to-node=&quot;15,3,1,0&quot;&gt;1로 변환&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;&lt;span data-path-to-node=&quot;15,3,2,0&quot;&gt;불린이 숫자와 계산될 때의 약속&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-path-to-node=&quot;17&quot; data-ke-size=&quot;size16&quot;&gt;처음엔 당황스럽겠지만, 이는 &quot;사용자가 어떤 데이터를 넣든 에러를 내지 않고 최대한 결과를 만들어내겠다&quot;는&lt;/p&gt;
&lt;p data-path-to-node=&quot;17&quot; data-ke-size=&quot;size16&quot;&gt;자바스크립트의 철학 때문이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;18&quot; data-ke-size=&quot;size16&quot;&gt;하지만 이런 암묵적 형변환은 코드가 커지면 버그의 원인이 되기도 한다고,&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;18&quot; data-ke-size=&quot;size16&quot;&gt;그래서 실무에서는 보통 Number(&quot;5&quot;) * 2처럼 명시적으로 타입을 바꾸는 것을 더 권장한다고 한다.&lt;/p&gt;</description>
      <category>개발자 호소인/Front</category>
      <author>리제 </author>
      <guid isPermaLink="true">https://bookstairs.tistory.com/81</guid>
      <comments>https://bookstairs.tistory.com/81#entry81comment</comments>
      <pubDate>Wed, 24 Jun 2026 12:09:58 +0900</pubDate>
    </item>
    <item>
      <title>CSS 코드와 웹사이트의 구조</title>
      <link>https://bookstairs.tistory.com/80</link>
      <description>&lt;p data-path-to-node=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-path-to-node=&quot;2&quot; data-ke-size=&quot;size23&quot;&gt;1. 초기화 및 기본 설정 (Reset &amp;amp; Base)&lt;/h3&gt;
&lt;p data-path-to-node=&quot;3&quot; data-ke-size=&quot;size16&quot;&gt;모든 브라우저는 기본 스타일을 가지고 있어서, 이를 초기화해야 원하는 대로 디자인할 수 있다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;4&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;&lt;b&gt;*&lt;/b&gt;&lt;/span&gt;{ &lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;margin: 0; padding: 0; box-sizing: border-box&lt;/span&gt;;&lt;/b&gt;&lt;/span&gt; }: 모든 요소의 기본 여백을 없애고, 테두리까지 포함해서 크기를 계산하도록 설정. (레이아웃 설계의 필수)&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;body&lt;/span&gt;{ ... }: 페이지 전체의 기본 글꼴, 색상, 배경색을 지정.&lt;/li&gt;
&lt;li&gt;a{&lt;span style=&quot;color: #8a3db6;&quot;&gt;&lt;b&gt; text-decoration: none; color: inherit;&lt;/b&gt;&lt;/span&gt; }: 링크의 밑줄을 없애고, 색상은 부모 요소의 색상을 그대로 따라가게 함&lt;/li&gt;
&lt;li&gt;img{&lt;b&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt; max-width: 100%; display: block;&lt;/span&gt; &lt;/b&gt;}: 이미지가 부모 영역보다 커져서 튀어나가는 것을 방지합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-path-to-node=&quot;6&quot; data-ke-size=&quot;size23&quot;&gt;2. 레이아웃의 틀 (Wrapper &amp;amp; Header)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;7&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;.wrapper{ max-width: 1120px; margin: 0 auto;&lt;/span&gt; }: 사이트 콘텐츠를 화면 중앙에 1120px 너비로 고정하여 배치&lt;/li&gt;
&lt;li&gt;.header{ &lt;b&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;display: flex; justify-content: space-between;&lt;/span&gt; &lt;/b&gt;... }: 로고, 검색창, 메뉴를 가로로 배치하고 양쪽 끝으로 밀어내어 균형을 맞춤&lt;/li&gt;
&lt;li&gt;.search{ flex: 1; ... }: 검색창이 헤더의 남은 공간을 알아서 차지하도록 설정&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-path-to-node=&quot;9&quot; data-ke-size=&quot;size23&quot;&gt;3. 내비게이션 &amp;amp; 드롭다운 (Navigation)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;10&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;.nav .submenu&lt;/span&gt;{&lt;b&gt; &lt;span style=&quot;color: #8a3db6;&quot;&gt;position: absolute; ... opacity: 0; visibility: hidden&lt;/span&gt;;&lt;/b&gt; }: 서브 메뉴를 기본적으로 숨겨두었다가, 마우스를 올렸을 때 나타나도록 함&lt;/li&gt;
&lt;li&gt;.nav &amp;gt; ul &amp;gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;&lt;b&gt; li:hover .submenu{ opacity: 1; ... }&lt;/b&gt;&lt;/span&gt;: 마우스를 올렸을 때 서브 메뉴를 부드럽게 나타나게 함&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-path-to-node=&quot;12&quot; data-ke-size=&quot;size23&quot;&gt;4. 메인 컨텐츠 (Flex &amp;amp; Grid)&lt;/h3&gt;
&lt;p data-path-to-node=&quot;13&quot; data-ke-size=&quot;size16&quot;&gt;정렬&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;14&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;.main{ display:&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt; flex&lt;/b&gt;&lt;/span&gt;; gap: 24px; }: 메인 영역을&lt;span style=&quot;color: #006dd7;&quot;&gt; &lt;b&gt;왼쪽(Section&lt;/b&gt;)&lt;/span&gt;과 &lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;오른쪽(Aside)&lt;/b&gt;&lt;/span&gt;으로 나눔&lt;/li&gt;
&lt;li&gt;.main &lt;span style=&quot;color: #006dd7;&quot;&gt;.section{ flex:&lt;/span&gt; 7; } .main &lt;span style=&quot;color: #006dd7;&quot;&gt;.aside{ flex&lt;/span&gt;: 3; }: 전체 화면을 10:3 비율로 나누어 왼쪽을 훨씬 넓게 씀.&lt;/li&gt;
&lt;li&gt;.cards{ &lt;span style=&quot;color: #006dd7;&quot;&gt;display: grid; grid-template-columns: repeat&lt;/span&gt;(3, 1fr); &lt;span style=&quot;color: #006dd7;&quot;&gt;gap:&lt;/span&gt; 16px; }: 카드 3개를 가로로 똑같은 크기(1fr)로 3등분하여 정렬&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-path-to-node=&quot;16&quot; data-ke-size=&quot;size23&quot;&gt;5. 컴포넌트 세부 디자인 (Banner &amp;amp; Card &amp;amp; Login)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;17&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;.banner{ background:&lt;span style=&quot;color: #006dd7;&quot;&gt; linear-gradient(...);&lt;/span&gt; }: 단색이 아닌 그라데이션 색상을 사용하여 세련된 느낌을 준다.&lt;/li&gt;
&lt;li&gt;.notice{ display: flex; &lt;span style=&quot;color: #006dd7;&quot;&gt;align-items: center;&lt;/span&gt; }: 공지사항 아이콘과 텍스트를 수평으로 정렬.&lt;/li&gt;
&lt;li&gt;.box{ border: 1px solid gainsboro; &lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;border-radius:&lt;/span&gt;&lt;/b&gt; 12px; }: 모서리가 둥근 테두리 박스를 만들어 강조.&lt;/li&gt;
&lt;li&gt;.login input, .login button{ ... }: 로그인 폼의 높이, 테두리, 여백을 설정하여 버튼과 입력창을 보기 좋게 만든다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-path-to-node=&quot;19&quot; data-ke-size=&quot;size23&quot;&gt;  학습 포인트&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-path-to-node=&quot;21&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;21,0,0&quot;&gt;Flexbox&lt;/b&gt;: 메뉴나 헤더처럼 한 줄로 정렬할 때 (display: flex)&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;21,1,0&quot;&gt;Grid&lt;/b&gt;: 카드 목록처럼 여러 줄로 정렬할 때 (display: grid)&lt;/li&gt;
&lt;/ol&gt;</description>
      <category>개발자 호소인/Front</category>
      <author>리제 </author>
      <guid isPermaLink="true">https://bookstairs.tistory.com/80</guid>
      <comments>https://bookstairs.tistory.com/80#entry80comment</comments>
      <pubDate>Wed, 24 Jun 2026 12:07:17 +0900</pubDate>
    </item>
    <item>
      <title>자유 실습 - 내가 만들고 싶은 단일 페이지 사이트 만들기</title>
      <link>https://bookstairs.tistory.com/79</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;실습 개요&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번엔 따라 치는 실습이 아닙니다. &lt;b&gt;평소에 만들어 보고 싶었던 사이트&lt;/b&gt;를 직접 기획하고, 그동안 배운 박스 모델&amp;middot;flex 영역 분할&amp;middot;시맨틱 구조를 적용해 한 페이지로 완성하는 것이 목표입니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;예제를 따라 칠 때는 쉬워 보여도, 빈 화면에서 직접 짜 보면 약한 부분이 분명히 드러납니다. 바로 그 지점에서 실력이 늡니다.&lt;/li&gt;
&lt;li&gt;화려함보다 &lt;b&gt;완성&lt;/b&gt;을 우선하세요. 한 화면을 끝까지 다듬는 편이 여러 페이지를 절반씩 만들다 마는 것보다 훨씬 많이 남습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;실습 조건&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;HTML &amp;middot; CSS만 사용&lt;/b&gt; - JavaScript는 아직 배우지 않았으므로, 클릭 동작 같은 기능이 필요 없는 형태로 만듭니다.(이미 알고계신분들은 사용하셔도 됩니다.)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;js없이 만들때는 정보를 보여주는(읽는) 사이트&lt;/b&gt;가 적합합니다. (소개형 &amp;middot; 안내형 &amp;middot; 목록형)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;내가 평소 만들고 싶었던 사이트는 &lt;a title=&quot;국립국어원 표준국어대사전&quot; href=&quot;https://stdict.korean.go.kr/main/main.do&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://stdict.korean.go.kr/main/main.do&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1782112294436&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;국립국어원 표준국어대사전&quot; data-og-description=&quot;이 누리집은 대한민국 공식 전자정부 누리집입니다.&quot; data-og-host=&quot;stdict.korean.go.kr&quot; data-og-source-url=&quot;https://stdict.korean.go.kr/main/main.do&quot; data-og-url=&quot;https://stdict.korean.go.kr/main/main.do&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://stdict.korean.go.kr/main/main.do&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://stdict.korean.go.kr/main/main.do&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;국립국어원 표준국어대사전&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;이 누리집은 대한민국 공식 전자정부 누리집입니다.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;stdict.korean.go.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;세련됐다고 할 수는 없지만, ux부분에서 크게 하자가 없는 이 사이트를 기본으로 정했다.&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;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;성재영이즈피부과_er0251-1.jpg&quot; data-origin-width=&quot;740&quot; data-origin-height=&quot;512&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c4m5zo/dJMcab5ISbC/ucbDDOKrX14ITbpSW808S0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c4m5zo/dJMcab5ISbC/ucbDDOKrX14ITbpSW808S0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c4m5zo/dJMcab5ISbC/ucbDDOKrX14ITbpSW808S0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc4m5zo%2FdJMcab5ISbC%2FucbDDOKrX14ITbpSW808S0%2Fimg.jpg&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;740&quot; height=&quot;512&quot; data-filename=&quot;성재영이즈피부과_er0251-1.jpg&quot; data-origin-width=&quot;740&quot; data-origin-height=&quot;512&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;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-22 161451.png&quot; data-origin-width=&quot;1901&quot; data-origin-height=&quot;908&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qoowh/dJMb997Ti0j/bss11W7V1YR66m4iBG4XR1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qoowh/dJMb997Ti0j/bss11W7V1YR66m4iBG4XR1/img.png&quot; data-alt=&quot;F12 로 살짝본 코드&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qoowh/dJMb997Ti0j/bss11W7V1YR66m4iBG4XR1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fqoowh%2FdJMb997Ti0j%2Fbss11W7V1YR66m4iBG4XR1%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;1901&quot; height=&quot;908&quot; data-filename=&quot;스크린샷 2026-06-22 161451.png&quot; data-origin-width=&quot;1901&quot; data-origin-height=&quot;908&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;F12 로 살짝본 코드&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;국립국어원 표준국어대사전 사이트의 구조를 벤치마킹하여, 자개(Mother-of-pearl) 컨셉의 단일 페이지 웹사이트를 구현하기 위한 가이드를 정리해보았다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-path-to-node=&quot;1&quot; data-ke-size=&quot;size23&quot;&gt;1. 시맨틱 구조 설계 (HTML)&lt;/h3&gt;
&lt;p data-path-to-node=&quot;2&quot; data-ke-size=&quot;size16&quot;&gt;박스 모델을 활용하여 화면을 논리적으로 분할&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;3&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;3,0,0&quot;&gt;&amp;lt;header&amp;gt;&lt;/b&gt;: 제목 및 로고 (자개 질감의 로고 이미지 혹은 텍스트)&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;3,1,0&quot;&gt;&amp;lt;nav&amp;gt;&lt;/b&gt;: 검색 메뉴 레이아웃 (검색창과 메뉴바 형태)&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;3,2,0&quot;&gt;&amp;lt;main&amp;gt;&lt;/b&gt;: 핵심 콘텐츠 (단어 검색 결과 예시 등)&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;3,3,0&quot;&gt;&amp;lt;section&amp;gt;&lt;/b&gt;: 추가 정보 또는 목록 (가독성을 위한 카드형 레이아웃)&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;3,4,0&quot;&gt;&amp;lt;footer&amp;gt;&lt;/b&gt;: 저작권 및 안내 사항&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-path-to-node=&quot;4&quot; data-ke-size=&quot;size23&quot;&gt;2. 디자인 및 레이아웃 (CSS)&lt;/h3&gt;
&lt;p data-path-to-node=&quot;5&quot; data-ke-size=&quot;size16&quot;&gt;자개 느낌과 한국적 미를 살리기 위한 주요 스타일링 포인트입&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;6&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;6,0,0&quot;&gt;배경 및 색상&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;6,0,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;background-color: #000000; (검은색 바탕) - &amp;gt; 너무 어두우면 텍스쳐가 있는 이미지를 바탕에 깔아볼까한다.&lt;/li&gt;
&lt;li&gt;자개 느낌은 linear-gradient와 background-clip: text를 활용한 텍스트 효과로 구현 가능하다고 제미니가...&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;6,1,0&quot;&gt;Flexbox 활용&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;6,1,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;display: flex;를 사용하여 내비게이션 바와 콘텐츠 영역을 정렬&lt;/li&gt;
&lt;li&gt;justify-content: space-between; 등으로&amp;nbsp; 탁트인 레이아웃&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;6,3,0&quot;&gt;박스 모델&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;6,3,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;padding, margin, border를 활용해 요소 간의 적절한 여백을 확보하여 가독성을 높이자&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&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;스크린샷 2026-06-22 170807.png&quot; data-origin-width=&quot;1890&quot; data-origin-height=&quot;892&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zAiTT/dJMcaay0tR9/EwDLcSXS8O6M40DVDDpJt0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zAiTT/dJMcaay0tR9/EwDLcSXS8O6M40DVDDpJt0/img.png&quot; data-alt=&quot;1차&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zAiTT/dJMcaay0tR9/EwDLcSXS8O6M40DVDDpJt0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzAiTT%2FdJMcaay0tR9%2FEwDLcSXS8O6M40DVDDpJt0%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;1890&quot; height=&quot;892&quot; data-filename=&quot;스크린샷 2026-06-22 170807.png&quot; data-origin-width=&quot;1890&quot; data-origin-height=&quot;892&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;1차&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1차로 만들어본 기본 뼈대.&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;/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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;알려주면 내가 스스로 조금씩 고치면서 공부를 해나갔다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-22 170949.png&quot; data-origin-width=&quot;921&quot; data-origin-height=&quot;695&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bbp51T/dJMcabYZVwQ/WZSbObpLIK0MMgT6tptQoK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bbp51T/dJMcabYZVwQ/WZSbObpLIK0MMgT6tptQoK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bbp51T/dJMcabYZVwQ/WZSbObpLIK0MMgT6tptQoK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbbp51T%2FdJMcabYZVwQ%2FWZSbObpLIK0MMgT6tptQoK%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;921&quot; height=&quot;695&quot; data-filename=&quot;스크린샷 2026-06-22 170949.png&quot; data-origin-width=&quot;921&quot; data-origin-height=&quot;695&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-path-to-node=&quot;4&quot; data-ke-size=&quot;size23&quot;&gt;참고사항을 친절하게 알려준 덕분에 주요 팁들도 놓치지 않을 수 있었다.&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;5&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;5,0,0&quot;&gt;색상 코드&lt;/b&gt;: #333 대신 원하는 색상의&lt;b&gt; 16진수 코드(예: #4a4a4a, #0056b3)를 입력&lt;/b&gt;하면된다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;5,1,0&quot;&gt;위치&lt;/b&gt;: style2.css 파일 안이라면 어디든 괜찮지만, &lt;b&gt;가독성을 위해 기존의 .user-menu 스타일 근처에 배치하&lt;/b&gt;는 것이 좋다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-22 173051.png&quot; data-origin-width=&quot;1893&quot; data-origin-height=&quot;832&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ckCTdg/dJMcabYZWAs/P5N3jbqKRukD1bKQogGw91/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ckCTdg/dJMcabYZWAs/P5N3jbqKRukD1bKQogGw91/img.png&quot; data-alt=&quot;2차 수정&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ckCTdg/dJMcabYZWAs/P5N3jbqKRukD1bKQogGw91/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FckCTdg%2FdJMcabYZWAs%2FP5N3jbqKRukD1bKQogGw91%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;1893&quot; height=&quot;832&quot; data-filename=&quot;스크린샷 2026-06-22 173051.png&quot; data-origin-width=&quot;1893&quot; data-origin-height=&quot;832&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;2차 수정&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p 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-filename=&quot;스크린샷 2026-06-22 173210.png&quot; data-origin-width=&quot;985&quot; data-origin-height=&quot;624&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bEisG2/dJMcahdO8P3/q8Zzr0xvXKO5OSNMj03hT1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bEisG2/dJMcahdO8P3/q8Zzr0xvXKO5OSNMj03hT1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bEisG2/dJMcahdO8P3/q8Zzr0xvXKO5OSNMj03hT1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbEisG2%2FdJMcahdO8P3%2Fq8Zzr0xvXKO5OSNMj03hT1%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;985&quot; height=&quot;624&quot; data-filename=&quot;스크린샷 2026-06-22 173210.png&quot; data-origin-width=&quot;985&quot; data-origin-height=&quot;624&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이쯤에서 또 제미니한테 어떻게 하면 좋을지 물어봤다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;친절히 알려주고 있지만 레고 조각들을 일부 건내는 것과 같아서,&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;/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;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;/* 1. 공통/초기화 (Reset): 전체 페이지에 영향을 주는 스타일 */&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;body&lt;/span&gt; { ... }&lt;/b&gt; &lt;br /&gt;/* 2. 레이아웃 (Layout): 크게 크게 구획을 나누는 스타일 */&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;header, main, footer&lt;/span&gt; { ... }&lt;/b&gt; &lt;br /&gt;/* 3. 섹션별 상세 스타일 (Component): 헤더 내부, 알립니다 섹션 내부 */&lt;br /&gt;&lt;br /&gt;/* 3-1. Header 상세 */ &lt;br /&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;&lt;b&gt;.top-util { ... } &lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;&lt;b&gt;.main-header{ ... }&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;&lt;b&gt; .search-wrap { ... }&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;/* 3-2. Main 상세 */&lt;br /&gt;&lt;b&gt;.&lt;span style=&quot;color: #8a3db6;&quot;&gt;notice-section { ... } &lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;&lt;b&gt;.notice-header { ... }&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;&lt;b&gt; .notice-list { ... }&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;/* 3-3. Footer 상세 */ &lt;br /&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;footer { ... }&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&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-filename=&quot;스크린샷 2026-06-22 182456.png&quot; data-origin-width=&quot;1415&quot; data-origin-height=&quot;883&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/KQEUY/dJMcajinqra/Ps9vdeo26yDPc3SNttwpN0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/KQEUY/dJMcajinqra/Ps9vdeo26yDPc3SNttwpN0/img.png&quot; data-alt=&quot;3차 수정.. 기괴하다...백룸같다...&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/KQEUY/dJMcajinqra/Ps9vdeo26yDPc3SNttwpN0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKQEUY%2FdJMcajinqra%2FPs9vdeo26yDPc3SNttwpN0%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;1415&quot; height=&quot;883&quot; data-filename=&quot;스크린샷 2026-06-22 182456.png&quot; data-origin-width=&quot;1415&quot; data-origin-height=&quot;883&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;3차 수정.. 기괴하다...백룸같다...&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p 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;더블체크를 하지않고, 코드를 모두 ai에게 짜달라고 요구하고 복붙을 했을 경우가 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;피드백을 받고, 그 수정안을 또 ai한테 보여주면서 멋대로 바꾸지 못하도록 해야하고, 오타도 같이 수정해 나가야 한다는 것을 배웠다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-23 120429.png&quot; data-origin-width=&quot;1879&quot; data-origin-height=&quot;905&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/DShlW/dJMcaicL7IC/n4LeU3lHXeTxayJgXIaxh0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/DShlW/dJMcaicL7IC/n4LeU3lHXeTxayJgXIaxh0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/DShlW/dJMcaicL7IC/n4LeU3lHXeTxayJgXIaxh0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDShlW%2FdJMcaicL7IC%2Fn4LeU3lHXeTxayJgXIaxh0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1879&quot; height=&quot;905&quot; data-filename=&quot;스크린샷 2026-06-23 120429.png&quot; data-origin-width=&quot;1879&quot; data-origin-height=&quot;905&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내가 최종적으로 완성한 화면이다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Gemini_Generated_Image_q2t8w8q2t8w8q2t8.png&quot; data-origin-width=&quot;1617&quot; data-origin-height=&quot;656&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bA8YLe/dJMcaasfrA9/C7Qigof2oJeZ62amXiIKW0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bA8YLe/dJMcaasfrA9/C7Qigof2oJeZ62amXiIKW0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bA8YLe/dJMcaasfrA9/C7Qigof2oJeZ62amXiIKW0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbA8YLe%2FdJMcaasfrA9%2FC7Qigof2oJeZ62amXiIKW0%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;1617&quot; height=&quot;656&quot; data-filename=&quot;Gemini_Generated_Image_q2t8w8q2t8w8q2t8.png&quot; data-origin-width=&quot;1617&quot; data-origin-height=&quot;656&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;원래는 이 그림을 뒤에 배경처럼 깔고싶은데, 표준국어대사전 로고를 캡쳐로 만든 상태라 이질적인 화면이 되어버린다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;효과적으로 사용하지 못해 아쉽다.&amp;nbsp;&lt;/p&gt;</description>
      <category>개발자 호소인</category>
      <author>리제 </author>
      <guid isPermaLink="true">https://bookstairs.tistory.com/79</guid>
      <comments>https://bookstairs.tistory.com/79#entry79comment</comments>
      <pubDate>Mon, 22 Jun 2026 17:40:20 +0900</pubDate>
    </item>
    <item>
      <title>Visual Studio Code 실습문제 톺아보기</title>
      <link>https://bookstairs.tistory.com/78</link>
      <description>&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&amp;lt;&lt;span style=&quot;color: #006dd7;&quot;&gt;nav&lt;/span&gt;&lt;span style=&quot;color: #ffc1c8;&quot;&gt; class&lt;/span&gt;=&quot;&lt;span style=&quot;color: #409d00;&quot;&gt;navbar&lt;/span&gt;&quot;&amp;gt; &amp;lt;div&lt;span style=&quot;color: #ffc1c8;&quot;&gt; class&lt;/span&gt;=&lt;span style=&quot;color: #009a87;&quot;&gt;&quot;&lt;span style=&quot;color: #409d00;&quot;&gt;logo&lt;/span&gt;&lt;/span&gt;&quot;&amp;gt;MyPortfolio&amp;lt;&lt;span style=&quot;color: #006dd7;&quot;&gt;/div&lt;/span&gt;&amp;gt; &lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;&lt;span style=&quot;color: #006dd7;&quot;&gt;ul&lt;/span&gt; &lt;span style=&quot;color: #ffc1c8;&quot;&gt;class&lt;/span&gt;=&quot;&lt;span style=&quot;color: #409d00;&quot;&gt;menu&lt;/span&gt;&quot;&amp;gt; &amp;lt;&lt;span style=&quot;color: #006dd7;&quot;&gt;li&lt;/span&gt;&amp;gt;홈&amp;lt;&lt;span style=&quot;color: #006dd7;&quot;&gt;/li&lt;/span&gt;&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;lt;/&lt;span style=&quot;color: #006dd7;&quot;&gt;ul&lt;/span&gt;&amp;gt;&lt;br /&gt;&amp;lt;&lt;span style=&quot;color: #006dd7;&quot;&gt;/nav&lt;/span&gt;&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;&lt;span style=&quot;color: #006dd7;&quot;&gt;header&lt;/span&gt; &lt;span style=&quot;color: #ffc1c8;&quot;&gt;class=&lt;/span&gt;&quot;&lt;span style=&quot;color: #409d00;&quot;&gt;hero&quot;&lt;/span&gt;&amp;gt; &lt;span style=&quot;color: #006dd7;&quot;&gt;&amp;lt;h1&lt;/span&gt;&amp;gt;안녕하세요, CSS를 배우는 중입니다&amp;lt;&lt;span style=&quot;color: #006dd7;&quot;&gt;/h1&lt;/span&gt;&amp;gt;&lt;br /&gt;&amp;lt;&lt;span style=&quot;color: #006dd7;&quot;&gt;/header&lt;/span&gt;&amp;gt;&lt;br /&gt;&amp;lt;&lt;span style=&quot;color: #006dd7;&quot;&gt;section&amp;gt; &amp;lt;h2&lt;/span&gt; &lt;span style=&quot;color: #ffc1c8;&quot;&gt;class&lt;/span&gt;=&quot;&lt;span style=&quot;color: #409d00;&quot;&gt;section-title&lt;/span&gt;&quot;&amp;gt;프로필&amp;lt;&lt;span style=&quot;color: #006dd7;&quot;&gt;/h2&lt;/span&gt;&amp;gt; &lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;&lt;span style=&quot;color: #006dd7;&quot;&gt;div&lt;/span&gt; &lt;span style=&quot;color: #ffc1c8;&quot;&gt;class&lt;/span&gt;=&quot;&lt;span style=&quot;color: #409d00;&quot;&gt;profile-card&lt;/span&gt;&quot;&amp;gt; &amp;lt;&lt;span style=&quot;color: #006dd7;&quot;&gt;span&lt;/span&gt; &lt;span style=&quot;color: #ffc1c8;&quot;&gt;class=&lt;/span&gt;&lt;span style=&quot;color: #409d00;&quot;&gt;&quot;badge&lt;/span&gt;&quot;&amp;gt;NEW&amp;lt;/&lt;span style=&quot;color: #006dd7;&quot;&gt;span&lt;/span&gt;&amp;gt;&amp;lt;&lt;span style=&quot;color: #006dd7;&quot;&gt;h3&lt;/span&gt;&amp;gt;최지원&lt;span style=&quot;color: #006dd7;&quot;&gt;&amp;lt;/h3&lt;/span&gt;&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;lt;/&lt;span style=&quot;color: #006dd7;&quot;&gt;div&lt;/span&gt;&amp;gt;&lt;br /&gt;&amp;lt;&lt;span style=&quot;color: #006dd7;&quot;&gt;/section&lt;/span&gt;&amp;gt;&lt;/blockquote&gt;
&lt;h4 data-path-to-node=&quot;7&quot; data-ke-size=&quot;size20&quot;&gt;① 왜 &amp;lt;header&amp;gt;, &amp;lt;section&amp;gt;, &amp;lt;nav&amp;gt; 태그를 쓰나요?&lt;/h4&gt;
&lt;p data-path-to-node=&quot;8&quot; data-ke-size=&quot;size16&quot;&gt;이것들은 '시맨틱 태그(Semantic Tags)'입니다. 브라우저에게 &quot;이 부분은 메뉴야&quot;, &quot;이 부분은 본문이야&quot;라고 &lt;b data-index-in-node=&quot;68&quot; data-path-to-node=&quot;8&quot;&gt;의미를 전달&lt;/b&gt;합니다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;8&quot; data-ke-size=&quot;size16&quot;&gt;단순히 &amp;lt;div&amp;gt;로만 도배하는 것보다 검색 엔진이 내 페이지를 더 잘 이해하게 도와줍니다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;8&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-path-to-node=&quot;9&quot; data-ke-size=&quot;size20&quot;&gt;② 왜 position: relative와 absolute를 쓰나요?&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;10&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;10,0,0&quot;&gt;relative (상대적 위치)&lt;/b&gt;: &quot;나를 기준으로 자식을 배치하겠다&quot;라는 선언입니다. .profile-card에 설정된 이유입니다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;10,1,0&quot;&gt;absolute (절대적 위치)&lt;/b&gt;: &quot;가장 가까운 relative 부모를 기준으로 위치를 잡겠다&quot;입니다. 덕분에 NEW 뱃지가 카드 밖으로 나가지 않고 정확히 카드 내부 우측 상단에 고정됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-path-to-node=&quot;11&quot; data-ke-size=&quot;size20&quot;&gt;③ 왜 display: flex를 자주 쓰나요?&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;13&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;justify-content: 요소들을 가로로 어디에 둘지 정합니다 (중앙, 양 끝 등).&lt;/li&gt;
&lt;li&gt;gap: 요소들 사이의 간격을 한 줄로 깔끔하게 처리합니다.&lt;/li&gt;
&lt;li&gt;flex-wrap: 화면이 좁아지면 아래로 넘길지 말지 결정합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;br /&gt;&amp;lt;!DOCTYPE&amp;nbsp;html&amp;gt;&lt;br /&gt;&amp;lt;html&amp;nbsp;lang=&quot;ko&quot;&amp;gt;&amp;nbsp;&amp;lt;head&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;meta&amp;nbsp;charset=&quot;UTF-8&quot;&amp;gt;&amp;nbsp;&amp;lt;meta&amp;nbsp;name=&quot;viewport&quot;&amp;nbsp;content=&quot;width=device-width,&amp;nbsp;initial-scale=1.0&quot;&amp;gt;&amp;nbsp;&amp;lt;title&amp;gt;CSS&amp;nbsp;종합&amp;nbsp;실습&amp;nbsp;(문제)&amp;lt;/title&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;link&amp;nbsp;rel=&quot;preconnect&quot;&amp;nbsp;href=&quot;&lt;br /&gt;https://fonts.googleapis.com&lt;br /&gt;&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;link&amp;nbsp;rel=&quot;preconnect&quot;&amp;nbsp;href=&quot;&lt;br /&gt;https://fonts.gstatic.com&lt;br /&gt;&quot;&amp;nbsp;crossorigin&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;link&amp;nbsp;href=&quot;&lt;br /&gt;https://fonts.googleapis.com/css2?family=Noto+Sans+KR:wght@100..900&amp;amp;display=swap&lt;br /&gt;&quot;&amp;nbsp;rel=&quot;stylesheet&quot;&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;style&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;b&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;&amp;nbsp;/*&amp;nbsp;[전체&amp;nbsp;초기화]&amp;nbsp;모든&amp;nbsp;요소의&amp;nbsp;기본&amp;nbsp;마진/패딩을&amp;nbsp;0으로&amp;nbsp;없애고&amp;nbsp;크기&amp;nbsp;계산을&amp;nbsp;border&amp;nbsp;포함으로&amp;nbsp;통일합니다.&amp;nbsp;*/&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #ef6f53;&quot;&gt;&lt;b&gt;&amp;nbsp;&lt;span style=&quot;color: #0593d3;&quot;&gt;&amp;nbsp;margin:&amp;nbsp;0;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #0593d3;&quot;&gt;&lt;b&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;padding:&amp;nbsp;0;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #0593d3;&quot;&gt;&lt;b&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;box-sizing:&amp;nbsp;border-box;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #8a3db6;&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;및&amp;nbsp;상단&amp;nbsp;고정&amp;nbsp;메뉴를&amp;nbsp;고려해&amp;nbsp;위쪽&amp;nbsp;여백을&amp;nbsp;줍니다.&amp;nbsp;*/&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;body&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #006dd7;&quot;&gt;&amp;nbsp;font-family&lt;/span&gt;:&amp;nbsp;&quot;Noto&amp;nbsp;Sans&amp;nbsp;KR&quot;,&amp;nbsp;sans-serif;&lt;br /&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;background:&amp;nbsp;#f0f0f0;&lt;br /&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;color:&amp;nbsp;black;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #006dd7;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;padding-top:&amp;nbsp;55px;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #006dd7;&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;line-height:&amp;nbsp;1.6;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;b&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;&amp;nbsp;/*&amp;nbsp;[리스트&amp;nbsp;초기화]&amp;nbsp;ul,&amp;nbsp;ol&amp;nbsp;태그의&amp;nbsp;기본&amp;nbsp;불렛&amp;nbsp;포인트(점)를&amp;nbsp;제거합니다.&amp;nbsp;*/&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #0593d3;&quot;&gt;&amp;nbsp;&amp;nbsp;ul,&amp;nbsp;ol&amp;nbsp;{&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #0593d3;&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;list-style:&amp;nbsp;none;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;&lt;b&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;상단에&amp;nbsp;고정하며,&amp;nbsp;Flexbox를&amp;nbsp;사용하여&amp;nbsp;요소들을&amp;nbsp;양옆으로&amp;nbsp;배치합니다.&amp;nbsp;*/&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.navbar&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #0593d3;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;position:&amp;nbsp;fixed;&lt;/span&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #0593d3;&quot;&gt;&amp;nbsp;&lt;/span&gt;/*&amp;nbsp;스크롤해도&amp;nbsp;화면&amp;nbsp;상단에&amp;nbsp;고정됩니다.&amp;nbsp;*/&lt;/b&gt;&lt;/span&gt;&lt;br /&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;top:&amp;nbsp;0;&lt;br /&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;left:&amp;nbsp;0;&lt;br /&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;width:&amp;nbsp;100%;&lt;br /&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;height:&amp;nbsp;55px;&lt;br /&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;background:&amp;nbsp;#2c3e50;&lt;br /&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;span style=&quot;color: #006dd7;&quot;&gt;border-bottom:&amp;nbsp;3px&amp;nbsp;solid&amp;nbsp;white;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #009a87;&quot;&gt;&amp;nbsp;display:&amp;nbsp;flex&lt;/span&gt;;&lt;span style=&quot;color: #8a3db6;&quot;&gt;&amp;nbsp;&lt;i&gt;/*&amp;nbsp;자식&amp;nbsp;요소들을&amp;nbsp;가로로&amp;nbsp;나열합니다.&amp;nbsp;*/&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #0593d3;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;justify-content:&amp;nbsp;space-between;&lt;/span&gt;&lt;i&gt;&lt;b&gt;&amp;nbsp;&lt;span style=&quot;color: #8a3db6;&quot;&gt;/*&amp;nbsp;로고와&amp;nbsp;메뉴&amp;nbsp;사이를&amp;nbsp;최대한&amp;nbsp;벌립니다.&amp;nbsp;*/&lt;/span&gt;&lt;/b&gt;&lt;/i&gt;&lt;br /&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;padding:&amp;nbsp;0&amp;nbsp;24px;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #0593d3;&quot;&gt;&amp;nbsp;&amp;nbsp;align-items:&amp;nbsp;center;&lt;/span&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;&lt;span style=&quot;color: #0593d3;&quot;&gt;&amp;nbsp;&lt;/span&gt;/*&amp;nbsp;세로&amp;nbsp;중앙&amp;nbsp;정렬을&amp;nbsp;합니다.&amp;nbsp;*/&lt;/span&gt;&lt;br /&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;color:&amp;nbsp;white;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #8a3db6;&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;항목들을&amp;nbsp;가로로&amp;nbsp;배치하고&amp;nbsp;gap으로&amp;nbsp;간격을&amp;nbsp;줍니다.&amp;nbsp;*/&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.menu&amp;nbsp;{&lt;br /&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;display:&amp;nbsp;flex;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #0593d3;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;gap:&lt;/span&gt;&amp;nbsp;20px;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #8a3db6;&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;커서를&amp;nbsp;올렸을&amp;nbsp;때의&amp;nbsp;변화(transition)를&amp;nbsp;설정합니다.&amp;nbsp;*&lt;/span&gt;/&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.menu&amp;nbsp;li&amp;nbsp;{&lt;br /&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;cursor:&amp;nbsp;pointer;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #0593d3;&quot;&gt;&amp;nbsp;transition:&amp;nbsp;all&amp;nbsp;0.1s&amp;nbsp;ease;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #0593d3;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #8a3db6;&quot;&gt;/*&amp;nbsp;[메뉴&amp;nbsp;Hover]&amp;nbsp;마우스가&amp;nbsp;올라가면&amp;nbsp;살짝&amp;nbsp;작아지고&amp;nbsp;글씨가&amp;nbsp;굵어집니다.&amp;nbsp;*/&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #0593d3;&quot;&gt;.menu&amp;nbsp;li:&lt;b&gt;hover&lt;/b&gt;&amp;nbsp;{&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #0593d3;&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;scale:&amp;nbsp;calc(0.98);&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #0593d3;&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;font-weight:&amp;nbsp;600;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #8a3db6;&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;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #0593d3;&quot;&gt;&amp;nbsp;.hero&amp;nbsp;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #006dd7;&quot;&gt;&amp;nbsp;text-align:&amp;nbsp;center;&lt;/span&gt;&lt;br /&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;color:&amp;nbsp;white;&lt;br /&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;background:&amp;nbsp;#4a90d9;&lt;br /&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;padding:&amp;nbsp;55px&amp;nbsp;0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.hero&amp;nbsp;h1&amp;nbsp;{&lt;br /&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;font-size:&amp;nbsp;30px;&lt;br /&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;margin-bottom:&amp;nbsp;10px;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #8a3db6;&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;구역의&amp;nbsp;제목을&amp;nbsp;중앙에&amp;nbsp;배치하고&amp;nbsp;여백을&amp;nbsp;줍니다.&amp;nbsp;*/&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.section-title&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #0593d3;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;text-align:&amp;nbsp;center;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #0593d3;&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;margin:&amp;nbsp;30px&amp;nbsp;0;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #8a3db6;&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;요소&amp;nbsp;배치를&amp;nbsp;위해&amp;nbsp;position을&amp;nbsp;relative로&amp;nbsp;설정합니다.&amp;nbsp;*/&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.profile-card&amp;nbsp;{&lt;br /&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;width:&amp;nbsp;300px;&lt;br /&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;background:&amp;nbsp;white;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #0593d3;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;margin:&amp;nbsp;0&amp;nbsp;auto;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #8a3db6;&quot;&gt;/*&amp;nbsp;좌우&amp;nbsp;마진&amp;nbsp;자동&amp;nbsp;적용으로&amp;nbsp;중앙&amp;nbsp;정렬&amp;nbsp;*/&lt;/span&gt;&lt;br /&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;padding:&amp;nbsp;24px;&lt;br /&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;border:&amp;nbsp;1px&amp;nbsp;solid&amp;nbsp;#e4e4e4;&lt;br /&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;border-radius:&amp;nbsp;8px;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #0593d3;&quot;&gt;&amp;nbsp;&amp;nbsp;position:&amp;nbsp;relative;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #8a3db6;&quot;&gt;/*&amp;nbsp;자식의&amp;nbsp;absolute&amp;nbsp;위치&amp;nbsp;배치의&amp;nbsp;기준점(기준점&amp;nbsp;생성)&amp;nbsp;*/&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;i&gt;&amp;nbsp;&lt;b&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;/*&amp;nbsp;[뱃지]&amp;nbsp;부모&amp;nbsp;카드&amp;nbsp;내&amp;nbsp;우측&amp;nbsp;상단에&amp;nbsp;절대&amp;nbsp;위치로&amp;nbsp;배치합니다.&amp;nbsp;*/&lt;/span&gt;&lt;/b&gt;&lt;/i&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #0593d3;&quot;&gt;&amp;nbsp;&amp;nbsp;.badge&lt;/span&gt;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #6164c6;&quot;&gt;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #0593d3;&quot;&gt;&amp;nbsp;&amp;nbsp;position:&amp;nbsp;absolute&lt;/span&gt;&lt;/span&gt;&lt;i&gt;&lt;span style=&quot;color: #0593d3;&quot;&gt;;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #8a3db6;&quot;&gt;&lt;b&gt;/*&amp;nbsp;부모(profile-card)를&amp;nbsp;기준으로&amp;nbsp;위치&amp;nbsp;*/&lt;/b&gt;&lt;/span&gt;&lt;/i&gt;&lt;br /&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;right:&amp;nbsp;10px;&lt;br /&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;top:&amp;nbsp;10px;&lt;br /&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;background:&amp;nbsp;#e74c3c;&lt;br /&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;color:&amp;nbsp;white;&lt;br /&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;font-size:&amp;nbsp;12px;&lt;br /&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;padding:&amp;nbsp;4px&amp;nbsp;8px;&lt;br /&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;border-radius:&amp;nbsp;4px;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #8a3db6;&quot;&gt;&lt;b&gt;&lt;i&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/*&amp;nbsp;[기술&amp;nbsp;스택&amp;nbsp;컨테이너]&amp;nbsp;Flexbox를&amp;nbsp;이용해&amp;nbsp;카드를&amp;nbsp;가로로&amp;nbsp;나열하고&amp;nbsp;줄바꿈(wrap)을&amp;nbsp;허용합니다.&amp;nbsp;*/&lt;/i&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.cards&amp;nbsp;{&lt;br /&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;display:&amp;nbsp;flex;&lt;br /&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;justify-content:&amp;nbsp;center;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #0593d3;&quot;&gt;&amp;nbsp;&amp;nbsp;flex-wrap:&amp;nbsp;wrap;&amp;nbsp;&lt;/span&gt;/*&amp;nbsp;화면이&amp;nbsp;좁아지면&amp;nbsp;다음&amp;nbsp;줄로&amp;nbsp;넘어갑니다.&amp;nbsp;*/&lt;br /&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;gap:&amp;nbsp;20px;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;&lt;i&gt;&lt;b&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;카드의&amp;nbsp;크기와&amp;nbsp;테두리,&amp;nbsp;그림자(box-shadow)를&amp;nbsp;지정합니다.&amp;nbsp;*/&lt;/b&gt;&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.card&amp;nbsp;{&lt;br /&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;width:&amp;nbsp;240px;&lt;br /&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;padding:&amp;nbsp;24px;&lt;br /&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;background:&amp;nbsp;white;&lt;br /&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;border:&amp;nbsp;1px&amp;nbsp;solid&amp;nbsp;#e4e4e4;&lt;br /&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;border-radius:&amp;nbsp;8px;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #0593d3;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;box-shadow:&amp;nbsp;&lt;/span&gt;0&amp;nbsp;2px&amp;nbsp;4px&amp;nbsp;#e4e4e4;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&lt;i&gt;&lt;b&gt;&lt;span style=&quot;color: #8a3db6;&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;후손&amp;nbsp;선택자]&amp;nbsp;.relation&amp;nbsp;내부의&amp;nbsp;모든&amp;nbsp;p&amp;nbsp;태그&amp;nbsp;적용&amp;nbsp;*/&lt;/span&gt;&lt;/b&gt;&lt;/i&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #0593d3;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;.relation&amp;nbsp;p&lt;/span&gt;&amp;nbsp;{&lt;br /&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;color:&amp;nbsp;purple;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #8a3db6;&quot;&gt;&lt;i&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/*&amp;nbsp;[선택자&amp;nbsp;연습&amp;nbsp;-&amp;nbsp;자식&amp;nbsp;선택자]&amp;nbsp;.relation&amp;nbsp;바로&amp;nbsp;아래의&amp;nbsp;span&amp;nbsp;태그만&amp;nbsp;적용&amp;nbsp;*&lt;/b&gt;&lt;/i&gt;&lt;/span&gt;/&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #0593d3;&quot;&gt;&lt;b&gt;&amp;nbsp;.relation&amp;nbsp;&amp;gt;&amp;nbsp;span&amp;nbsp;{&lt;/b&gt;&lt;/span&gt;&lt;br /&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;color:&amp;nbsp;orange;&lt;br /&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;font-weight:&amp;nbsp;bold;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;&lt;i&gt;&lt;b&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;ID&amp;nbsp;선택자]&amp;nbsp;특정&amp;nbsp;ID를&amp;nbsp;가진&amp;nbsp;요소만&amp;nbsp;적용&amp;nbsp;*/&lt;/b&gt;&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #0593d3;&quot;&gt;&amp;nbsp;#special&amp;nbsp;{&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #0593d3;&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;background:&amp;nbsp;#fff3cd;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #0593d3;&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;padding:&amp;nbsp;12px;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;&lt;i&gt;&lt;b&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;반응형]&amp;nbsp;가로폭&amp;nbsp;768px&amp;nbsp;이하에서&amp;nbsp;레이아웃을&amp;nbsp;세로로&amp;nbsp;변경합니다.&amp;nbsp;*/&lt;/b&gt;&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #0593d3;&quot;&gt;&lt;b&gt;@media&amp;nbsp;(max-width:&amp;nbsp;768px)&amp;nbsp;{&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #0593d3;&quot;&gt;&lt;b&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;.cards&amp;nbsp;{&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #0593d3;&quot;&gt;&lt;b&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;flex-direction:&amp;nbsp;column;&lt;/b&gt;&lt;i&gt;&amp;nbsp;&lt;span style=&quot;color: #8a3db6;&quot;&gt;/*&amp;nbsp;세로&amp;nbsp;정렬&amp;nbsp;*/&lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #0593d3;&quot;&gt;&lt;b&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;align-items:&amp;nbsp;center;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #0593d3;&quot;&gt;&lt;b&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;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #0593d3;&quot;&gt;&lt;b&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;.menu&amp;nbsp;{&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #0593d3;&quot;&gt;&lt;b&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;gap:&amp;nbsp;10px;&lt;/b&gt;&lt;/span&gt;&lt;br /&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/style&amp;gt;&lt;br /&gt;&amp;lt;/head&amp;gt;&lt;br /&gt;&amp;lt;body&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;nav&amp;nbsp;class=&quot;navbar&quot;&amp;gt;...&amp;lt;/nav&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;header&amp;nbsp;class=&quot;hero&quot;&amp;gt;...&amp;lt;/header&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;section&amp;gt;프로필...&amp;lt;/section&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;section&amp;gt;기술&amp;nbsp;스택...&amp;lt;/section&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;section&amp;gt;선택자&amp;nbsp;연습...&amp;lt;/section&amp;gt;&lt;br /&gt;&amp;lt;/body&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>개발자 호소인/Front</category>
      <author>리제 </author>
      <guid isPermaLink="true">https://bookstairs.tistory.com/78</guid>
      <comments>https://bookstairs.tistory.com/78#entry78comment</comments>
      <pubDate>Mon, 22 Jun 2026 11:57:20 +0900</pubDate>
    </item>
    <item>
      <title>[CSS] &amp;quot;소수는 어렵고 배수는 쉽다&amp;quot; 는 무슨 뜻일까? / Relation 이해하기</title>
      <link>https://bookstairs.tistory.com/76</link>
      <description>&lt;h3 data-path-to-node=&quot;6&quot; data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;p data-path-to-node=&quot;7&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;CSS 수치(px, em, rem 등)를 다룰 때 &lt;b data-index-in-node=&quot;31&quot; data-path-to-node=&quot;7&quot;&gt;계산의 효율성&lt;/b&gt;과 &lt;b data-index-in-node=&quot;40&quot; data-path-to-node=&quot;7&quot;&gt;유지보수&lt;/b&gt;를 말하는 것.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;8&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;8,0,0&quot;&gt;소수가 어려운 이유&lt;/b&gt;: 13.333px, 17.4px처럼 소수점이 생기면 브라우저가 화면을 그릴 때 '렌더링 오차'가 발생해. 아주 미세하게 선이 뭉개지거나, 1px 차이로 레이아웃이 미묘하게 어긋나는 현상이 생긴다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;8,1,0&quot;&gt;배수가 쉬운 이유 (8점 그리드 시스템)&lt;/b&gt;: 실무에서는 보통 &lt;b data-index-in-node=&quot;33&quot; data-path-to-node=&quot;8,1,0&quot;&gt;8의 배수&lt;/b&gt;(8, 16, 24, 32, 40, 48...)로 간격을 설정하도록 되어있다..
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;8,1,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;8,1,1,0,0&quot;&gt;일관성&lt;/b&gt;: 모든 요소의 간격이 8의 배수로 통일되면 디자인이 규칙적이고 정돈돼 보인다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;8,1,1,1,0&quot;&gt;계산&lt;/b&gt;: 8, 16, 24는 암산하기 쉽고, 화면을 절반으로 나누거나 1/4로 나눌 때도 소수점 없이 딱 떨어져서 레이아웃이 깨지지 않는다.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-path-to-node=&quot;9&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9&quot;&gt;즉, &quot;배수를 쓰면 계산이 직관적이라 실수가 줄어들고, 브라우저가 화면을 그릴 때도 정확하다&quot;&lt;/b&gt;&lt;/p&gt;
&lt;p data-path-to-node=&quot;9&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;9&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;9&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-path-to-node=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;1&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-path-to-node=&quot;2&quot; data-ke-size=&quot;size23&quot;&gt;코딩에서의 3가지 핵심 관계&lt;/h3&gt;
&lt;p data-path-to-node=&quot;3&quot; data-ke-size=&quot;size16&quot;&gt;HTML 구조는 가계도와 비슷하다. 부모, 자식, 형제 관계라고 표현하는 것이 보통&amp;nbsp;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-path-to-node=&quot;4&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;4,0,0&quot;&gt;부모-자식 관계 (Parent-Child)&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;4,0,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;태그를 감싸고 있는 상위 태그가 '부모', 그 안에 들어있는 하위 태그가 '자식'&lt;/li&gt;
&lt;li&gt;예: &amp;lt;body&amp;gt; 안에 &amp;lt;div&amp;gt;가 있다면, body는 부모, div는 자식&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;4,1,0&quot;&gt;조상-후손 관계 (Ancestor-Descendant)&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;4,1,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;부모의 부모, 그 부모의 부모까지 포함한 더 넓은 범위의 상위를 '조상', 그 아래에 있는 모든 태그를 '후손'이라고 부른다.&lt;/li&gt;
&lt;li&gt;예: &amp;lt;body&amp;gt; 안에 &amp;lt;div&amp;gt;가 있고, 그 &amp;lt;div&amp;gt; 안에 &amp;lt;p&amp;gt;가 있다면, body는 &amp;lt;p&amp;gt;의 조상이고, &amp;lt;p&amp;gt;는 body의 후손이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;4,2,0&quot;&gt;형제 관계 (Sibling)&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;4,2,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;같은 부모를 둔 태그들끼리는 서로 '형제'&lt;/li&gt;
&lt;li&gt;예: &amp;lt;ul&amp;gt; 안에 &amp;lt;li&amp;gt;가 여러 개 있다면, 이 &amp;lt;li&amp;gt;들은 서로 형제 관계&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 data-path-to-node=&quot;6&quot; data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;p data-path-to-node=&quot;7&quot; data-ke-size=&quot;size16&quot;&gt;CSS에서 특정 태그만 골라 스타일을 입히고 싶을 때, 이 관계(Relation)를 정확히 지정해야 하기 때문&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;8&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;div &amp;gt; p (자식 선택자): div의 &lt;b data-index-in-node=&quot;23&quot; data-path-to-node=&quot;8,0,0&quot;&gt;바로 아래&lt;/b&gt;에 있는 p 태그만 선택.&lt;/li&gt;
&lt;li&gt;div p (후손 선택자): div 안에 있는 &lt;b data-index-in-node=&quot;26&quot; data-path-to-node=&quot;8,1,0&quot;&gt;모든&lt;/b&gt; p 태그(깊이와 상관없이)를 선택.&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>개발자 호소인/Front</category>
      <author>리제 </author>
      <guid isPermaLink="true">https://bookstairs.tistory.com/76</guid>
      <comments>https://bookstairs.tistory.com/76#entry76comment</comments>
      <pubDate>Mon, 22 Jun 2026 10:20:06 +0900</pubDate>
    </item>
    <item>
      <title>[Web Front]웹 구조에 시각적 표현을 입히는 언어 CSS</title>
      <link>https://bookstairs.tistory.com/75</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;CSS(Cascading Style Sheets)&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;HTML 문서에 &lt;b&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;HTML이 문서의 뼈대(구조)를 정의한다면, CSS는 그 위에 &lt;b&gt;색상, 글꼴, 간격, 레이아웃, 애니메이션&lt;/b&gt; 등을 더해 사용자가 보기 편한 화면을 만든다.&lt;/li&gt;
&lt;li&gt;이름의 &lt;b&gt;Cascading&lt;/b&gt;은 여러 스타일 규칙이 겹쳤을 때, &lt;b&gt;우선순위와 소스의 선언 순서&lt;/b&gt;에 따라 최종적으로 적용되는 방식을 의미한다.&lt;/li&gt;
&lt;li&gt;즉, CSS는 웹사이트를 &lt;b&gt;단순한 텍스트 구조에서 완성된 디자인 화면으로 바꿔주는&lt;/b&gt; 역할을 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;CSS 적용 방법 3가지&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;인라인 스타일&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;HTML 태그의 style 속성 안에 직접 작성하는 방식&lt;/li&gt;
&lt;li&gt;장점: 간단한 테스트나 특정 요소에만 바로 적용 가능&lt;/li&gt;
&lt;li&gt;단점: 코드가 지저분해지고 유지보수 어려움&lt;/li&gt;
&lt;li&gt;예시: 버튼 하나의 글자색만 급하게 바꿀 때 사용&lt;/li&gt;
&lt;li&gt;&amp;rarr; &amp;lt;button style=&quot;color:red;&quot;&amp;gt;삭제&amp;lt;/button&amp;gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;내부 스타일(Internal)&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&amp;lt;head&amp;gt; 안의 &amp;lt;style&amp;gt; 태그에 작성하여 문서 전체에 적용&lt;/li&gt;
&lt;li&gt;장점: 한 문서 안에서 빠르게 스타일링 가능&lt;/li&gt;
&lt;li&gt;단점: 여러 HTML 파일에 동일한 스타일을 적용하기 어려움&lt;/li&gt;
&lt;li&gt;예시: 단일 페이지 과제에서 제목 색상, 본문 폰트를 지정할 때&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;외부 스타일(External)&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;별도의 .css 파일을 만들고 &amp;lt;link&amp;gt; 태그로 HTML과 연결&lt;/li&gt;
&lt;li&gt;장점: 여러 페이지에서 재사용 가능, 유지보수와 협업에 유리&lt;/li&gt;
&lt;li&gt;단점: 파일을 따로 관리해야 함&lt;/li&gt;
&lt;li&gt;예시: 회사 웹사이트 전체에 통일된 색상/레이아웃을 적용할 때&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;rarr; 실무에서는 외부 스타일 방식&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 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;h2 data-ke-size=&quot;size26&quot;&gt;CSS 적용 방법 3가지&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;인라인 스타일&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;HTML 태그의 style 속성 안에 직접 작성하는 방식&lt;/li&gt;
&lt;li&gt;장점: 간단한 테스트나 특정 요소에만 바로 적용 가능&lt;/li&gt;
&lt;li&gt;단점: 코드가 지저분해지고 유지보수 어려움&lt;/li&gt;
&lt;li&gt;예시: 버튼 하나의 글자색만 급하게 바꿀 때 사용&lt;/li&gt;
&lt;li&gt;&amp;rarr; &amp;lt;button style=&quot;color:red;&quot;&amp;gt;삭제&amp;lt;/button&amp;gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;내부 스타일(Internal)&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&amp;lt;head&amp;gt; 안의 &amp;lt;style&amp;gt; 태그에 작성하여 문서 전체에 적용&lt;/li&gt;
&lt;li&gt;장점: 한 문서 안에서 빠르게 스타일링 가능&lt;/li&gt;
&lt;li&gt;단점: 여러 HTML 파일에 동일한 스타일을 적용하기 어려움&lt;/li&gt;
&lt;li&gt;예시: 단일 페이지 과제에서 제목 색상, 본문 폰트를 지정할 때&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;외부 스타일(External)&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;별도의 .css 파일을 만들고 &amp;lt;link&amp;gt; 태그로 HTML과 연결&lt;/li&gt;
&lt;li&gt;장점: 여러 페이지에서 재사용 가능, 유지보수와 협업에 유리&lt;/li&gt;
&lt;li&gt;단점: 파일을 따로 관리해야 함&lt;/li&gt;
&lt;li&gt;예시: 회사 웹사이트 전체에 통일된 색상/레이아웃을 적용할 때&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;rarr; 실무에서는 외부 스타일 방식&lt;/b&gt;을 가장 많이 사용한다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;선택자와 우선순위&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;선택자(Selector)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: 어떤 HTML 요소에 스타일을 적용할지를 알려주는 규칙.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;예: 태그 선택자(p), 클래스 선택자(.box), 아이디 선택자(#main), 속성 선택자([type=text]), 가상 클래스(:hover) 등&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;우선순위 규칙&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: 같은 요소에 여러 스타일이 겹칠 경우, 더 높은 우선순위를 가진 규칙이 적용된다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;인라인 스타일(태그 안 직접 작성) &amp;rarr; 가장 강력&lt;/li&gt;
&lt;li&gt;ID 선택자 &amp;rarr; 특정 요소 1개만 지정할 수 있어 강함&lt;/li&gt;
&lt;li&gt;클래스 / 속성 / 가상 클래스 선택자 &amp;rarr; 중간 정도&lt;/li&gt;
&lt;li&gt;태그 선택자 &amp;rarr; 낮음&lt;/li&gt;
&lt;li&gt;전체 선택자(*) &amp;rarr; 가장 약함&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;rarr; 동일한 수준의 선택자&lt;/b&gt;가 충돌하면, &lt;b&gt;나중에 작성된 스타일&lt;/b&gt;이 최종적으로 적용된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;!important&lt;/b&gt;: 모든 우선순위를 무시하고 강제로 적용하는 규칙.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 유지보수성이 크게 떨어지고 다른 개발자와 협업 시 혼란을 주므로 꼭 필요한 경우에만 사용해야 한다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;상속과 캐스케이딩&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&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;캐스케이딩&lt;/b&gt;: 여러 규칙이 겹칠 때 &lt;b&gt;우선순위 &amp;rarr; 소스 순서&lt;/b&gt;에 따라 최종 결과가 정해진다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;박스 모델(Box Model)&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;모든 HTML 요소는 사각형 박스로 표현된다.&lt;/li&gt;
&lt;li&gt;구조: 콘텐츠(content) &amp;rarr; 패딩(padding) &amp;rarr; 보더(border) &amp;rarr; 마진(margin).&lt;/li&gt;
&lt;li&gt;실제 요소 크기를 계산할 때, 이 네 가지를 모두 고려해야 한다.&lt;/li&gt;
&lt;li&gt;유지보수 편의를 위해 보통 box-sizing을 전체 요소에 통일한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-22 090603.png&quot; data-origin-width=&quot;659&quot; data-origin-height=&quot;436&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wtDvS/dJMcadibSyJ/njkBLYo72Q2vbLu9FVFEh0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wtDvS/dJMcadibSyJ/njkBLYo72Q2vbLu9FVFEh0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wtDvS/dJMcadibSyJ/njkBLYo72Q2vbLu9FVFEh0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwtDvS%2FdJMcadibSyJ%2FnjkBLYo72Q2vbLu9FVFEh0%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;659&quot; height=&quot;436&quot; data-filename=&quot;스크린샷 2026-06-22 090603.png&quot; data-origin-width=&quot;659&quot; data-origin-height=&quot;436&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;단위와 색상&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;단위(Unit)&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;절대 단위&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;px : 화면의 실제 픽셀을 기준으로 한 고정 크기.&lt;/li&gt;
&lt;li&gt;장점: 결과가 예측 가능 &amp;rarr; 버튼, 아이콘 같은 &lt;b&gt;고정 크기 요소&lt;/b&gt;에 자주 사용.&lt;/li&gt;
&lt;li&gt;단점: 화면 크기&amp;middot;해상도가 달라져도 크기가 변하지 않음.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;상대 단위&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;% : 부모 요소 크기를 기준으로 비율 적용.&lt;/li&gt;
&lt;li&gt;em : 부모 요소의 글꼴 크기를 기준으로 배율 적용.&lt;/li&gt;
&lt;li&gt;rem : 문서의 최상위(html) 글꼴 크기를 기준으로 배율 적용 &amp;rarr; &lt;b&gt;실무에서 가장 많이 사용&lt;/b&gt; (일관된 글자 크기와 간격 유지 가능).&lt;/li&gt;
&lt;li&gt;vw / vh : 화면(viewport)의 너비/높이를 기준으로 퍼센트 적용 &amp;rarr; 화면 전체 배경, 반응형 레이아웃에 활용.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;색상(Color)&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;표현 방식&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;HEX(16진수)&lt;/b&gt; : #RRGGBB 형태 &amp;rarr; 웹에서 가장 흔히 사용됨.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;RGB&lt;/b&gt; : rgb(255, 0, 0) 형태, 빨강/초록/파랑 값 지정.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;HSL&lt;/b&gt; : 색상(Hue), 채도(Saturation), 명도(Lightness)로 지정 &amp;rarr; 색조를 조절하기 편리.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;투명도(Alpha 값)&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;rgba, hsla 등 알파 채널을 추가해 불투명도(0~1) 지정 가능.&lt;/li&gt;
&lt;li&gt;예: 버튼 호버 시 살짝 반투명한 배경, 오버레이 효과에 활용.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;레이아웃&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;display&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;요소가 화면에 배치되는 기본 방식을 결정하는 속성.&lt;/li&gt;
&lt;li&gt;block은 줄바꿈이 되는 큰 덩어리(예: &amp;lt;div&amp;gt;), inline은 한 줄 안에 이어 붙는 요소(예: &amp;lt;span&amp;gt;).&lt;/li&gt;
&lt;li&gt;최신 웹에서는 flex와 grid가 주로 사용되며, 복잡한 레이아웃을 효율적으로 구현할 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;position&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;요소를 문서 내에서 배치하는 방식.&lt;/li&gt;
&lt;li&gt;static(기본 흐름), relative(자기 위치 기준 이동), absolute(상위 기준 위치 고정), fixed(브라우저 화면 고정), sticky(스크롤에 따라 상대/고정 혼합).&lt;/li&gt;
&lt;li&gt;예: 상단 네비게이션 고정, 버튼에 뱃지 표시 등 다양한 UI에서 활용.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;float&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;원래는 텍스트 주위에 이미지를 배치하기 위한 속성이었음.&lt;/li&gt;
&lt;li&gt;과거에는 레이아웃 구현(컬럼 구조 등)에도 자주 쓰였지만, 현재는 Flexbox와 Grid 등장으로 &lt;b&gt;제한적 용도(이미지 배치 등)&lt;/b&gt; 에만 사용된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Flexbox (Flexible Box)&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;1차원(가로 혹은 세로 방향)&lt;/b&gt; 레이아웃에 강력.&lt;/li&gt;
&lt;li&gt;수평/수직 정렬, 요소 간 간격 조정, 공간 분배가 간단해짐.&lt;/li&gt;
&lt;li&gt;예: 네비게이션 메뉴, 버튼 그룹, 카드 나열 등.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Grid&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;2차원(행과 열 동시에)&lt;/b&gt; 레이아웃을 관리.&lt;/li&gt;
&lt;li&gt;복잡한 페이지 구조(헤더/사이드바/메인/푸터 등)를 체계적으로 배치 가능.&lt;/li&gt;
&lt;li&gt;예: 대시보드, 갤러리, 잡지형 레이아웃.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-22 102640.png&quot; data-origin-width=&quot;728&quot; data-origin-height=&quot;310&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Yj2W0/dJMcaglCVZe/ZcnKG6IwrgoUnZ8xFhl5ok/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Yj2W0/dJMcaglCVZe/ZcnKG6IwrgoUnZ8xFhl5ok/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Yj2W0/dJMcaglCVZe/ZcnKG6IwrgoUnZ8xFhl5ok/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FYj2W0%2FdJMcaglCVZe%2FZcnKG6IwrgoUnZ8xFhl5ok%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;728&quot; height=&quot;310&quot; data-filename=&quot;스크린샷 2026-06-22 102640.png&quot; data-origin-width=&quot;728&quot; data-origin-height=&quot;310&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>개발자 호소인/Front</category>
      <author>리제 </author>
      <guid isPermaLink="true">https://bookstairs.tistory.com/75</guid>
      <comments>https://bookstairs.tistory.com/75#entry75comment</comments>
      <pubDate>Mon, 22 Jun 2026 09:11:42 +0900</pubDate>
    </item>
    <item>
      <title>[Web Front 2] HTML 기초</title>
      <link>https://bookstairs.tistory.com/74</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;HTML 문서의 기본 구조&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모든 HTML 문서는 &lt;b&gt;머리(head) + 몸(body)&lt;/b&gt; 구조로 이루어져 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-18 171123.png&quot; data-origin-width=&quot;891&quot; data-origin-height=&quot;327&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/k1ADT/dJMcaa6OGqZ/EK7TyY42pIpyZZF4F44vgk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/k1ADT/dJMcaa6OGqZ/EK7TyY42pIpyZZF4F44vgk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/k1ADT/dJMcaa6OGqZ/EK7TyY42pIpyZZF4F44vgk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fk1ADT%2FdJMcaa6OGqZ%2FEK7TyY42pIpyZZF4F44vgk%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;891&quot; height=&quot;327&quot; data-filename=&quot;스크린샷 2026-06-18 171123.png&quot; data-origin-width=&quot;891&quot; data-origin-height=&quot;327&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;구성 요소&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style5&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 51.0465%; text-align: center;&quot;&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;/td&gt;
&lt;td style=&quot;width: 25.2325%;&quot;&gt;HTML5 문서 선언&lt;/td&gt;
&lt;td style=&quot;width: 23.6047%;&quot;&gt;문서 맨 위 1줄&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 51.0465%; text-align: center;&quot;&gt;&amp;lt;html lang=&quot;ko&quot;&amp;gt;&lt;/td&gt;
&lt;td style=&quot;width: 25.2325%;&quot;&gt;문서 전체 영역 / 언어 지정&lt;/td&gt;
&lt;td style=&quot;width: 23.6047%;&quot;&gt;가장 바깥 태그&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 51.0465%; text-align: center;&quot;&gt;&amp;lt;head&amp;gt;&lt;/td&gt;
&lt;td style=&quot;width: 25.2325%;&quot;&gt;문서 정보 영역&lt;/td&gt;
&lt;td style=&quot;width: 23.6047%;&quot;&gt;&lt;b&gt;화면에 안 보임&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 51.0465%; text-align: center;&quot;&gt;&amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;&lt;/td&gt;
&lt;td style=&quot;width: 25.2325%;&quot;&gt;문자 인코딩 지정&lt;/td&gt;
&lt;td style=&quot;width: 23.6047%;&quot;&gt;&lt;b&gt;없으면 한글 깨짐&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 51.0465%; text-align: center;&quot;&gt;&amp;lt;title&amp;gt;&lt;/td&gt;
&lt;td style=&quot;width: 25.2325%;&quot;&gt;브라우저 탭 제목&lt;/td&gt;
&lt;td style=&quot;width: 23.6047%;&quot;&gt;즐겨찾기 이름&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 51.0465%; text-align: center;&quot;&gt;&amp;lt;body&amp;gt;&lt;/td&gt;
&lt;td style=&quot;width: 25.2325%;&quot;&gt;실제 콘텐츠 영역&lt;/td&gt;
&lt;td style=&quot;width: 23.6047%;&quot;&gt;&lt;b&gt;화면에 보임&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  head vs bodyhead는 무대 뒤(설정), body는 무대 위(관객이 보는 것)라고 이해하면 쉽다.&lt;br /&gt;우리가 작성하는 대부분의 태그는 body 안에 들어간다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;글자 관련 태그 : 제목과 구분&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;함수 목록&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;태그 설명 특징&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 73px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;태그&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;설명&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;특징&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;text-align: center; height: 21px;&quot;&gt;&lt;b&gt;&amp;lt;h1&amp;gt; ~ &amp;lt;h6&amp;gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center; height: 21px;&quot;&gt;&lt;b&gt;제목 태그&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center; height: 21px;&quot;&gt;&lt;b&gt;숫자가 클수록 글자가 작아짐&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;text-align: center; height: 21px;&quot;&gt;&lt;b&gt;&amp;lt;hr&amp;gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center; height: 21px;&quot;&gt;&lt;b&gt;수평선&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center; height: 21px;&quot;&gt;&lt;b&gt;단독 태그&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;text-align: center; height: 21px;&quot;&gt;&lt;b&gt;&amp;lt;br&amp;gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center; height: 21px;&quot;&gt;&lt;b&gt;줄바꿈&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center; height: 21px;&quot;&gt;&lt;b&gt;단독 태그&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-18 171209.png&quot; data-origin-width=&quot;886&quot; data-origin-height=&quot;204&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/djPKKO/dJMcafNP9pM/3IyDCEVgoTToiMWWL5tjIk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/djPKKO/dJMcafNP9pM/3IyDCEVgoTToiMWWL5tjIk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/djPKKO/dJMcafNP9pM/3IyDCEVgoTToiMWWL5tjIk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdjPKKO%2FdJMcafNP9pM%2F3IyDCEVgoTToiMWWL5tjIk%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;886&quot; height=&quot;204&quot; data-filename=&quot;스크린샷 2026-06-18 171209.png&quot; data-origin-width=&quot;886&quot; data-origin-height=&quot;204&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  숫자는 크기가 아니라 &lt;b&gt;위계가 중요&lt;/b&gt;&lt;br /&gt;h1은 페이지 대제목, h2는 소제목...처럼 중요도(문서 구조) 를 나타낸다.&lt;br /&gt;단순히 글자를 많이 넣기 위해 h1을 너무 남발하지 않도록 주의해야 한다.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;글자 관련 태그 : 문단 (p vs pre)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문단을 나누는 태그는 &amp;lt;p&amp;gt;와 &amp;lt;pre&amp;gt; 두 가지가 있고,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;줄 바꿈&amp;middot;공백 처리 방식&lt;/b&gt;이 다르다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 63px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style3&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;text-align: center; height: 21px;&quot;&gt;구분&lt;/td&gt;
&lt;td style=&quot;text-align: center; height: 21px;&quot;&gt;&amp;lt;p&amp;gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center; height: 21px;&quot;&gt;&amp;lt;pre&amp;gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;text-align: center; height: 21px;&quot;&gt;줄바꿈&lt;/td&gt;
&lt;td style=&quot;text-align: center; height: 21px;&quot;&gt;무시됨 &amp;rarr; &amp;lt;br&amp;gt; 필요&lt;/td&gt;
&lt;td style=&quot;text-align: center; height: 21px;&quot;&gt;입력한 그대로 적용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;text-align: center; height: 21px;&quot;&gt;공백&lt;/td&gt;
&lt;td style=&quot;text-align: center; height: 21px;&quot;&gt;여러 칸도 1칸으로&lt;/td&gt;
&lt;td style=&quot;text-align: center; height: 21px;&quot;&gt;입력한 그대로 적용&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;예제&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-18 171226.png&quot; data-origin-width=&quot;896&quot; data-origin-height=&quot;331&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/brnPUj/dJMcaftsFXs/7dA3n3HEkVJ45kRW6zMK3K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/brnPUj/dJMcaftsFXs/7dA3n3HEkVJ45kRW6zMK3K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/brnPUj/dJMcaftsFXs/7dA3n3HEkVJ45kRW6zMK3K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbrnPUj%2FdJMcaftsFXs%2F7dA3n3HEkVJ45kRW6zMK3K%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;896&quot; height=&quot;331&quot; data-filename=&quot;스크린샷 2026-06-18 171226.png&quot; data-origin-width=&quot;896&quot; data-origin-height=&quot;331&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  &lt;b&gt;HTML은 공백과 줄 바꿈을 무시&lt;/b&gt;&lt;br /&gt;코드에서 줄을 여러 번 바꾸거나 공백을 여러 칸 넣어도 화면에는 공백 1칸으로만 나옴.&lt;br /&gt;그래서 p 안에서는&lt;span style=&quot;background-color: #f6e199;&quot;&gt; &lt;b&gt;&amp;lt;br&amp;gt;(줄 바꿈)&lt;/b&gt;와 &lt;b&gt;&amp;amp;nbsp;(공백)&lt;/b&gt;&lt;/span&gt;가 필요하다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;글자 관련 태그 : 엔티티 코드&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lt;, &amp;gt;, &amp;amp; 같은 기호는 태그 문법에 쓰이는 특수문자라서 &lt;b&gt;그대로 못 쓰고&lt;/b&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;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style3&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;코드&lt;/td&gt;
&lt;td&gt;출력&lt;/td&gt;
&lt;td&gt;의미&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;&amp;amp;nbsp;&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;(공백)&lt;/td&gt;
&lt;td&gt;공백 1칸 강제 삽입&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;&amp;amp;lt;&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&amp;lt;&lt;/td&gt;
&lt;td&gt;부등호 열기 (less than)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;&amp;amp;gt;&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&amp;gt;&lt;/td&gt;
&lt;td&gt;부등호 닫기 (greater than)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;&amp;amp;amp;&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&amp;amp;&lt;/td&gt;
&lt;td&gt;앰퍼샌드&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-18 171247.png&quot; data-origin-width=&quot;881&quot; data-origin-height=&quot;157&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/9j61G/dJMb997QK8p/Z5jKwBASrjLyYfcP9SyXJK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/9j61G/dJMb997QK8p/Z5jKwBASrjLyYfcP9SyXJK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/9j61G/dJMb997QK8p/Z5jKwBASrjLyYfcP9SyXJK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F9j61G%2FdJMb997QK8p%2FZ5jKwBASrjLyYfcP9SyXJK%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;881&quot; height=&quot;157&quot; data-filename=&quot;스크린샷 2026-06-18 171247.png&quot; data-origin-width=&quot;881&quot; data-origin-height=&quot;157&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;글자 관련 태그 : 텍스트 서식&lt;/h2&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style6&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&amp;lt;b&amp;gt;&lt;/td&gt;
&lt;td&gt;굵게&lt;/td&gt;
&lt;td&gt;단순 굵게 (의미 X)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&amp;lt;strong&amp;gt;&lt;/td&gt;
&lt;td&gt;굵게&lt;/td&gt;
&lt;td&gt;&lt;b&gt;중요성 강조 (의미 O)&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&amp;lt;i&amp;gt;&lt;/td&gt;
&lt;td&gt;기울임&lt;/td&gt;
&lt;td&gt;단순 기울임 (의미 X)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&amp;lt;em&amp;gt;&lt;/td&gt;
&lt;td&gt;기울임&lt;/td&gt;
&lt;td&gt;&lt;b&gt;강조 (의미 O)&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&amp;lt;mark&amp;gt;&lt;/td&gt;
&lt;td&gt;형광펜&lt;/td&gt;
&lt;td&gt;하이라이트&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&amp;lt;u&amp;gt;&lt;/td&gt;
&lt;td&gt;밑줄&lt;/td&gt;
&lt;td&gt;underline&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&amp;lt;s&amp;gt;&lt;/td&gt;
&lt;td&gt;취소선&lt;/td&gt;
&lt;td&gt;strike&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&amp;lt;sub&amp;gt;&lt;/td&gt;
&lt;td&gt;아래첨자&lt;/td&gt;
&lt;td&gt;H₂O&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&amp;lt;sup&amp;gt;&lt;/td&gt;
&lt;td&gt;윗첨자&lt;/td&gt;
&lt;td&gt;x&amp;sup2;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;예제&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-18 171301.png&quot; data-origin-width=&quot;896&quot; data-origin-height=&quot;325&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cVLNH1/dJMcabYXaOB/jYPuBAzcx1uCeybZcD5aB1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cVLNH1/dJMcabYXaOB/jYPuBAzcx1uCeybZcD5aB1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cVLNH1/dJMcabYXaOB/jYPuBAzcx1uCeybZcD5aB1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcVLNH1%2FdJMcabYXaOB%2FjYPuBAzcx1uCeybZcD5aB1%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;896&quot; height=&quot;325&quot; data-filename=&quot;스크린샷 2026-06-18 171301.png&quot; data-origin-width=&quot;896&quot; data-origin-height=&quot;325&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  &lt;b&gt;b vs strong, i vs em의&lt;/b&gt; 차이&lt;br /&gt;화면에 보이는 모양은 같지만 의미(시맨틱)가 다르다&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;b&amp;middot;i &amp;rarr; 그냥 모양만 (굵게/기울임)&lt;/li&gt;
&lt;li&gt;strong&amp;middot;em &amp;rarr; &quot;중요하다 / 강조한다&quot;는 &lt;b&gt;의미&lt;/b&gt;까지 포함 &amp;rarr; 검색엔진&amp;middot;스크린리더가 다르게 인식&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모양이 같다고 아무거나 쓰지 말고 &lt;b&gt;의미에 맞는 태그&lt;/b&gt;를 고르는 습관이 중요&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;⚠️ 태그 중첩 시 닫는 순서 주의&lt;br /&gt;여는 순서의 역순으로 닫아야 한다.&lt;br /&gt;&amp;lt;strong&amp;gt;&amp;lt;em&amp;gt;... &amp;lt;/em&amp;gt;&amp;lt;/strong&amp;gt; (O) / &amp;lt;/strong&amp;gt;&amp;lt;/em&amp;gt; (X)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;목록 관련 태그&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;목록은 &amp;lt;li&amp;gt;(목록 아이템)를 &amp;lt;ul&amp;gt; 또는 &amp;lt;ol&amp;gt;로 감싸서 만든다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;함수 목록&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style3&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 12.4419%; text-align: center;&quot;&gt;태그&lt;/td&gt;
&lt;td style=&quot;width: 39.5349%; text-align: center;&quot;&gt;설명&lt;/td&gt;
&lt;td style=&quot;width: 48.0233%; text-align: center;&quot;&gt;표식&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 12.4419%; text-align: center;&quot;&gt;&amp;lt;ul&amp;gt;&lt;/td&gt;
&lt;td style=&quot;width: 39.5349%; text-align: center;&quot;&gt;순서 &lt;b&gt;없는&lt;/b&gt; 목록 (Unordered List)&lt;/td&gt;
&lt;td style=&quot;width: 48.0233%; text-align: center;&quot;&gt;● 점&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 12.4419%; text-align: center;&quot;&gt;&amp;lt;ol&amp;gt;&lt;/td&gt;
&lt;td style=&quot;width: 39.5349%; text-align: center;&quot;&gt;순서 &lt;b&gt;있는&lt;/b&gt; 목록 (Ordered List)&lt;/td&gt;
&lt;td style=&quot;width: 48.0233%; text-align: center;&quot;&gt;1, 2, 3 번호&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 12.4419%; text-align: center;&quot;&gt;&amp;lt;li&amp;gt;&lt;/td&gt;
&lt;td style=&quot;width: 39.5349%; text-align: center;&quot;&gt;목록 아이템 (List Item)&lt;/td&gt;
&lt;td style=&quot;width: 48.0233%; text-align: center;&quot;&gt;ul/ol 안에 위치&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;ul / ol 기본&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-18 171321.png&quot; data-origin-width=&quot;887&quot; data-origin-height=&quot;375&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cA4b8k/dJMb997QLao/lzwTGQ2huFCr1JXIsedjak/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cA4b8k/dJMb997QLao/lzwTGQ2huFCr1JXIsedjak/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cA4b8k/dJMb997QLao/lzwTGQ2huFCr1JXIsedjak/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcA4b8k%2FdJMb997QLao%2FlzwTGQ2huFCr1JXIsedjak%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;887&quot; height=&quot;375&quot; data-filename=&quot;스크린샷 2026-06-18 171321.png&quot; data-origin-width=&quot;887&quot; data-origin-height=&quot;375&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;ol 주요 속성&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style7&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;type&lt;/td&gt;
&lt;td&gt;번호 형식 (1 A a I i)&lt;/td&gt;
&lt;td&gt;type=&quot;A&quot; &amp;rarr; A, B, C&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;start&lt;/td&gt;
&lt;td&gt;시작 번호 지정&lt;/td&gt;
&lt;td&gt;start=&quot;5&quot; &amp;rarr; 5부터&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;reversed&lt;/td&gt;
&lt;td&gt;역순 정렬&lt;/td&gt;
&lt;td&gt;큰 수 &amp;rarr; 작은 수&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&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-filename=&quot;스크린샷 2026-06-18 171336.png&quot; data-origin-width=&quot;891&quot; data-origin-height=&quot;580&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/1XEAt/dJMcagsnsjg/UduLRRJt5vZnsetNRERxlk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/1XEAt/dJMcagsnsjg/UduLRRJt5vZnsetNRERxlk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/1XEAt/dJMcagsnsjg/UduLRRJt5vZnsetNRERxlk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F1XEAt%2FdJMcagsnsjg%2FUduLRRJt5vZnsetNRERxlk%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;891&quot; height=&quot;580&quot; data-filename=&quot;스크린샷 2026-06-18 171336.png&quot; data-origin-width=&quot;891&quot; data-origin-height=&quot;580&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;⚠️ 중첩 위치 주의&lt;br /&gt;&lt;b&gt;자식 &amp;lt;ul&amp;gt;은 반드시 부모 &lt;span style=&quot;color: #ef6f53;&quot;&gt;&amp;lt;li&amp;gt; 안쪽&lt;/span&gt;에 넣어야 한다.&lt;/b&gt;&lt;br /&gt;&amp;lt;li&amp;gt; 바깥에 두면 구조가 깨짐.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>개발자 호소인/Front</category>
      <author>리제 </author>
      <guid isPermaLink="true">https://bookstairs.tistory.com/74</guid>
      <comments>https://bookstairs.tistory.com/74#entry74comment</comments>
      <pubDate>Thu, 18 Jun 2026 17:11:05 +0900</pubDate>
    </item>
    <item>
      <title>[Web Front 1] 웹을 구성하는 기본구조 HTML</title>
      <link>https://bookstairs.tistory.com/73</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-18 142342.png&quot; data-origin-width=&quot;1558&quot; data-origin-height=&quot;699&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rdsea/dJMcacwLo8e/NWo27O0ua7OjUNiY1uZwBK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rdsea/dJMcacwLo8e/NWo27O0ua7OjUNiY1uZwBK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rdsea/dJMcacwLo8e/NWo27O0ua7OjUNiY1uZwBK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Frdsea%2FdJMcacwLo8e%2FNWo27O0ua7OjUNiY1uZwBK%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;1558&quot; height=&quot;699&quot; data-filename=&quot;스크린샷 2026-06-18 142342.png&quot; data-origin-width=&quot;1558&quot; data-origin-height=&quot;699&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 style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;visual studio code에서 프로그램을 설치하기&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;h2 data-ke-size=&quot;size26&quot;&gt;인터넷과 웹의 차이&amp;nbsp;&lt;/h2&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 105px;&quot; border=&quot;1&quot; data-path-to-node=&quot;5&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style7&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;&lt;b&gt;구분&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;&lt;b&gt;인터넷 (Internet)&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;&lt;b&gt;웹 (World Wide Web)&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;&lt;span data-path-to-node=&quot;5,1,0,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;5,1,0,0&quot;&gt;정의&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;&lt;span data-path-to-node=&quot;5,1,1,0&quot;&gt;전 세계를 연결하는 네트워크망&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;&lt;span data-path-to-node=&quot;5,1,2,0&quot;&gt;인터넷 기반의 정보 공유 서비스&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;&lt;span data-path-to-node=&quot;5,2,0,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;5,2,0,0&quot;&gt;역할&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;&lt;span data-path-to-node=&quot;5,2,1,0&quot;&gt;데이터 전달을 위한 하드웨어적 기반&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;&lt;span data-path-to-node=&quot;5,2,2,0&quot;&gt;정보를 시각적으로 보여주는 소프트웨어적 수단&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;&lt;span data-path-to-node=&quot;5,3,0,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;5,3,0,0&quot;&gt;구성 요소&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;&lt;span data-path-to-node=&quot;5,3,1,0&quot;&gt;케이블, 라우터, 서버, IP 주소&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;&lt;span data-path-to-node=&quot;5,3,2,0&quot;&gt;HTML, CSS, HTTP 프로토콜, 브라우저&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;&lt;span data-path-to-node=&quot;5,4,0,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;5,4,0,0&quot;&gt;관점&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;&lt;span data-path-to-node=&quot;5,4,1,0&quot;&gt;거대한 인프라(길)&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;&lt;span data-path-to-node=&quot;5,4,2,0&quot;&gt;그 위에서 이용하는 서비스(택배)&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;licensed-image.jpg&quot; data-origin-width=&quot;3999&quot; data-origin-height=&quot;2283&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/x7qqM/dJMcadPTvMq/3NmH7tNRQzf2xyEXGQI8Y1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/x7qqM/dJMcadPTvMq/3NmH7tNRQzf2xyEXGQI8Y1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/x7qqM/dJMcadPTvMq/3NmH7tNRQzf2xyEXGQI8Y1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fx7qqM%2FdJMcadPTvMq%2F3NmH7tNRQzf2xyEXGQI8Y1%2Fimg.jpg&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;3999&quot; height=&quot;2283&quot; data-filename=&quot;licensed-image.jpg&quot; data-origin-width=&quot;3999&quot; data-origin-height=&quot;2283&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-path-to-node=&quot;1&quot; data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-path-to-node=&quot;1&quot; data-ke-size=&quot;size23&quot;&gt;1. 웹의 처리 과정: 데이터의 왕복&lt;/h3&gt;
&lt;p data-path-to-node=&quot;2&quot; data-ke-size=&quot;size16&quot;&gt;웹은 &lt;b data-index-in-node=&quot;3&quot; data-path-to-node=&quot;2&quot;&gt;요청&lt;/b&gt;과 &lt;b data-index-in-node=&quot;7&quot; data-path-to-node=&quot;2&quot;&gt;응답&lt;/b&gt;이라는 단순하지만 강력한 규칙으로 돌아간다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-path-to-node=&quot;3&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;3,0,0&quot;&gt;Request (요청)&lt;/b&gt;: 사용자가 브라우저 주소창에 주소를 입력하면, 브라우저가 서버에게 &quot;이 주소의 데이터를 보내라&quot; 명령&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;3,1,0&quot;&gt;Response (응답)&lt;/b&gt;: 서버는 요청받은 데이터를 찾아서, 브라우저가 읽을 수 있는 HTML 문서 형태로 다시 보내줌.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;3,2,0&quot;&gt;Rendering (해석 및 출력)&lt;/b&gt;: 브라우저는 받은 HTML 코드를 해석해서 우리가 눈으로 볼 수 있는 화면(웹사이트)으로 그려냄.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 data-path-to-node=&quot;6&quot; data-ke-size=&quot;size23&quot;&gt;2. 웹의 핵심 특징&lt;/h3&gt;
&lt;p data-path-to-node=&quot;7&quot; data-ke-size=&quot;size16&quot;&gt;웹은 단순히 글을 읽는 곳을 넘어, 복합적인 데이터 교환 환경을 제공한다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;8&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;8,0,0&quot;&gt;HTTP 기반&lt;/b&gt;: 데이터를 주고받을 때 서로 약속된 통신 규격인 HTTP(HyperText Transfer Protocol)를 사용한다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;8,1,0&quot;&gt;멀티미디어 통합&lt;/b&gt;: 텍스트뿐만 아니라 그래픽, 오디오, 비디오 등 다양한 매체를 하나의 문서 안에서 통합하여 제공한다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;8,2,0&quot;&gt;다양한 환경 적응&lt;/b&gt;: 사용자의 기기(스마트폰, 태블릿, PC) 환경에 맞춰 화면이 변하는 &lt;b data-index-in-node=&quot;49&quot; data-path-to-node=&quot;8,2,0&quot;&gt;반응형(Responsive)&lt;/b&gt; 설계가 기본이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-path-to-node=&quot;10&quot; data-ke-size=&quot;size23&quot;&gt;3. 웹의 3요소: HTML이 하는 일&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-path-to-node=&quot;12&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style7&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;요소&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;역할&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;비유&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;12,1,0,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;12,1,0,0&quot;&gt;HTML&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;12,1,1,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;12,1,1,0&quot;&gt;구조(Structure)&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;12,1,2,0&quot;&gt;건물의 철근과 뼈대&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;12,2,0,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;12,2,0,0&quot;&gt;CSS&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;12,2,1,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;12,2,1,0&quot;&gt;디자인(Style)&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;12,2,2,0&quot;&gt;벽지, 인테리어, 페인트&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;12,3,0,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;12,3,0,0&quot;&gt;JS&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;12,3,1,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;12,3,1,0&quot;&gt;기능(Behavior)&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;12,3,2,0&quot;&gt;전기 배선, 자동문, 엘리베이터&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-path-to-node=&quot;13&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;13&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;13&quot;&gt;HTML은 웹의 뼈대&lt;/b&gt;&lt;/p&gt;
&lt;p data-path-to-node=&quot;13&quot; data-ke-size=&quot;size16&quot;&gt;브라우저에게 &quot;이것은 제목(Heading)이다&quot;, &quot;이것은 본문(Paragraph)이다&quot;, &quot;여기에 이미지를 넣어라&quot;라고 알려주는 지도와 같다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;13&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;하이퍼링크 관련 태그 (a)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lt;a&amp;gt; 태그는 클릭하면 &lt;b&gt;연결된 곳으로 이동&lt;/b&gt;시키는, 웹의 가장 핵심적인 기능&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;href&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;이동할 &lt;b&gt;링크 경로&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;href=&quot;&amp;lt;&lt;a href=&quot;https://naver.com&quot;&gt;https://naver.com&lt;/a&gt;&amp;gt;&quot;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;target&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;어느 탭에서 열지 지정&lt;/td&gt;
&lt;td&gt;_self(기본) / _blank(새 탭)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-path-to-node=&quot;13&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-path-to-node=&quot;13&quot; data-ke-style=&quot;style3&quot;&gt;&amp;lt;!-- 다른 페이지로 이동 --&amp;gt;&lt;br /&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;&amp;lt;a&lt;/span&gt; &lt;span style=&quot;color: #a6bc00;&quot;&gt;href=&quot;./01_글자 관련태그. html&quot;&amp;gt; 글자&lt;/span&gt; 관련 태그로 이동 &amp;lt;/a&amp;gt;&lt;br /&gt;&amp;lt;!-- 외부 사이트를 새 탭에서 열기 --&amp;gt;&lt;br /&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;&amp;lt;a&lt;/span&gt;&lt;span style=&quot;color: #a6bc00;&quot;&gt; href&lt;/span&gt;=&lt;span style=&quot;color: #006dd7;&quot;&gt;&quot;https://www.naver.com&quot;&lt;/span&gt;&lt;span style=&quot;color: #a6bc00;&quot;&gt; target&lt;/span&gt;=&lt;span style=&quot;color: #006dd7;&quot;&gt;&quot;_blank&quot;&lt;/span&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;&amp;gt;&lt;/span&gt;네이버 (새 탭)&lt;span style=&quot;color: #8a3db6;&quot;&gt;&amp;lt;/a&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;!-- 이미지를 클릭하면 링크로 이동 (a 안에 img 중첩) --&amp;gt; &lt;br /&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;&amp;lt;a&lt;/span&gt; &lt;span style=&quot;color: #a6bc00;&quot;&gt;href=&lt;/span&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&quot;https://www.naver.com&lt;/span&gt;&quot;&amp;gt; &lt;br /&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;&amp;lt;img&lt;/span&gt; &lt;span style=&quot;color: #a6bc00;&quot;&gt;src=&quot;&lt;/span&gt;.&lt;span style=&quot;color: #006dd7;&quot;&gt;/images/sample.jpg&lt;/span&gt;&quot; &lt;span style=&quot;color: #409d00;&quot;&gt;alt=&lt;/span&gt;&quot;&lt;span style=&quot;color: #006dd7;&quot;&gt;네이버로 이동&lt;/span&gt;&quot;&amp;gt;&lt;br /&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;&amp;lt;/a&amp;gt; &lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  target 속성&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;&lt;span style=&quot;color: #ef6f53;&quot;&gt;_self&lt;/span&gt;&lt;/b&gt; : 현재 탭에서 이동 (기본값)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;color: #ef6f53;&quot;&gt;_blank&lt;/span&gt;&lt;/b&gt; : 새 탭에서 열기 (외부 사이트로 보낼 때 자주 사용)&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;h3 data-path-to-node=&quot;2&quot; data-ke-size=&quot;size23&quot;&gt;하이퍼링크: 페이지 내 이동 (id 활용)&lt;/h3&gt;
&lt;p data-path-to-node=&quot;3&quot; data-ke-size=&quot;size16&quot;&gt;웹 페이지가 길어질 때, 특정 위치로 즉시 이동하는 기능. 핵심은 '식별자(ID)'를 이용한 표식이다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;4&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;4,0,0&quot;&gt;원리&lt;/b&gt;:
&lt;ol style=&quot;list-style-type: decimal;&quot; data-path-to-node=&quot;4,0,1&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;목적지에 id=&quot;이름&quot; 속성을 붙여 고유한 주소를 만든다.&lt;/li&gt;
&lt;li&gt;이동 버튼에 href=&quot;#이름&quot;을 설정하여 그 주소를 가리킨다.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;4,1,0&quot;&gt;중요 규칙&lt;/b&gt;: id는 한 페이지 내에서 유일(Unique) 해야 합니다. 주민등록번호처럼 한 명에게만 부여되는 식별자&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&amp;lt;!-- 목적지 : id 부여 --&amp;gt;&lt;br /&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;&amp;lt;h3&lt;/span&gt; &lt;span style=&quot;color: #a6bc00;&quot;&gt;id=&lt;/span&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&quot;main&quot;&lt;/span&gt;&amp;gt;맨 위 영역&lt;span style=&quot;color: #8a3db6;&quot;&gt;&amp;lt;/h3&lt;/span&gt;&amp;gt; &lt;br /&gt;&amp;lt;!-- 링크 :&lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt; #아이디&lt;/span&gt;&lt;/b&gt; 로 이동 --&amp;gt;&lt;br /&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;&amp;lt;a&lt;/span&gt; &lt;span style=&quot;color: #a6bc00;&quot;&gt;href&lt;/span&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;=&quot;&lt;b&gt;#&lt;/b&gt;main&quot;&lt;/span&gt;&amp;gt;맨 위로 이동&lt;span style=&quot;color: #8a3db6;&quot;&gt;&amp;lt;/a&amp;gt; &lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-path-to-node=&quot;5&quot; data-ke-style=&quot;style2&quot;&gt;
&lt;p data-path-to-node=&quot;5,0&quot; data-ke-size=&quot;size16&quot;&gt;  긴 문서에서 &quot;목차 &amp;rarr; 본문&quot;, &quot;맨 아래 &amp;rarr; 맨 위로 가기&quot; 같은 이동에 활용한다.&lt;/p&gt;
&lt;div&gt;&lt;span style=&quot;background-color: #ffffff; color: #eb5757;&quot; data-token-index=&quot;1&quot;&gt;href=&quot;#아이디&quot;&lt;/span&gt;처럼 &lt;span data-token-index=&quot;3&quot;&gt;앞에 &lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #eb5757;&quot; data-token-index=&quot;4&quot;&gt;#&lt;/span&gt;을 붙이는 것이 중요&lt;/div&gt;
&lt;/blockquote&gt;
&lt;h3 data-path-to-node=&quot;7&quot; data-ke-size=&quot;size23&quot;&gt;2. 입력 양식: &lt;span style=&quot;background-color: #c0d1e7;&quot;&gt;input / label / button&lt;/span&gt;&lt;/h3&gt;
&lt;p data-path-to-node=&quot;8&quot; data-ke-size=&quot;size16&quot;&gt;사용자와 시스템이 대화하는 통로&lt;/p&gt;
&lt;h4 data-path-to-node=&quot;9&quot; data-ke-size=&quot;size20&quot;&gt;① 핵심 요소 정리&lt;/h4&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 83px;&quot; border=&quot;1&quot; data-path-to-node=&quot;10&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style3&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;&lt;b&gt;태그&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;&lt;b&gt;역할&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot; data-path-to-node=&quot;10,1,0,0&quot;&gt;&amp;lt;input&amp;gt;&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;&lt;span data-path-to-node=&quot;10,1,1,0&quot;&gt;데이터를 입력받는 &lt;b data-index-in-node=&quot;10&quot; data-path-to-node=&quot;10,1,1,0&quot;&gt;실질적인 칸&lt;/b&gt; (텍스트, 비밀번호, 버튼 등)&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot; data-path-to-node=&quot;10,2,0,0&quot;&gt;&amp;lt;label&amp;gt;&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;&lt;span data-path-to-node=&quot;10,2,1,0&quot;&gt;입력칸에 이름을 붙이는 &lt;b data-index-in-node=&quot;13&quot; data-path-to-node=&quot;10,2,1,0&quot;&gt;설명문&lt;/b&gt; (UX 편의성 향상)&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot; data-path-to-node=&quot;10,3,0,0&quot;&gt;&amp;lt;button&amp;gt;&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;&lt;span data-path-to-node=&quot;10,3,1,0&quot;&gt;사용자가 의도적인 동작을 수행할 때 누르는 &lt;b data-index-in-node=&quot;24&quot; data-path-to-node=&quot;10,3,1,0&quot;&gt;제어 장치&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote data-path-to-node=&quot;11&quot; data-ke-style=&quot;style3&quot;&gt;아이디 :&lt;span style=&quot;color: #8a3db6;&quot;&gt; &amp;lt;input&lt;/span&gt;&lt;span style=&quot;color: #a6bc00;&quot;&gt; type&lt;/span&gt;=&lt;span style=&quot;color: #006dd7;&quot;&gt;&quot;text&quot;&lt;/span&gt;&amp;gt; &lt;span style=&quot;color: #8a3db6;&quot;&gt;&amp;lt;br&amp;gt;&lt;/span&gt; &lt;br /&gt;비밀번호 :&lt;span style=&quot;color: #8a3db6;&quot;&gt; &amp;lt;input&lt;/span&gt; &lt;span style=&quot;color: #a6bc00;&quot;&gt;type&lt;/span&gt;=&lt;span style=&quot;color: #006dd7;&quot;&gt;&quot;password&lt;/span&gt;&quot;&amp;gt; &lt;span style=&quot;color: #8a3db6;&quot;&gt;&amp;lt;br&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;!-- label로 input을 감싸면 글자를 눌러도 입력칸이 선택됨 --&amp;gt; &lt;br /&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;&amp;lt;label&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;&amp;nbsp; &amp;lt;input&lt;/span&gt;&lt;span style=&quot;color: #a6bc00;&quot;&gt; type=&lt;/span&gt;&quot;&lt;span style=&quot;color: #006dd7;&quot;&gt;radio&lt;/span&gt;&quot; &lt;span style=&quot;color: #a6bc00;&quot;&gt;name=&lt;/span&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&quot;gender&lt;/span&gt;&quot; &lt;span style=&quot;color: #a6bc00;&quot;&gt;checked&lt;/span&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;&amp;gt;&lt;/span&gt; 남&amp;nbsp;&lt;br /&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;&amp;nbsp;&amp;lt;/label&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;&amp;lt;label&amp;gt;&lt;/span&gt; &lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span style=&quot;color: #8a3db6;&quot;&gt;&amp;lt;input&lt;/span&gt;&lt;span style=&quot;color: #a6bc00;&quot;&gt; type&lt;/span&gt;=&quot;&lt;span style=&quot;color: #006dd7;&quot;&gt;radio&lt;/span&gt;&quot; &lt;span style=&quot;color: #a6bc00;&quot;&gt;name&lt;/span&gt;=&quot;&lt;span style=&quot;color: #006dd7;&quot;&gt;gender&lt;/span&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;&quot;&amp;gt;&lt;/span&gt; 여&lt;br /&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;&amp;nbsp;&amp;lt;/label&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;&amp;lt;input&lt;/span&gt;&lt;span style=&quot;color: #a6bc00;&quot;&gt; type=&lt;/span&gt;&quot;&lt;span style=&quot;color: #006dd7;&quot;&gt;button&quot;&lt;/span&gt;&lt;span style=&quot;color: #a6bc00;&quot;&gt; value&lt;/span&gt;=&lt;span style=&quot;color: #006dd7;&quot;&gt;&quot;회원가입&lt;/span&gt;&quot;&amp;gt;&lt;br /&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;&amp;lt;button&amp;gt;&lt;/span&gt;취소&lt;span style=&quot;color: #8a3db6;&quot;&gt;&amp;lt;/button&amp;gt; &lt;/span&gt;&lt;/blockquote&gt;
&lt;h4 data-path-to-node=&quot;11&quot; data-ke-size=&quot;size20&quot;&gt;② label 사용의 이유&lt;/h4&gt;
&lt;p data-path-to-node=&quot;12&quot; data-ke-size=&quot;size16&quot;&gt;&amp;lt;label&amp;gt;로 &amp;lt;input&amp;gt;을 감싸면,&lt;/p&gt;
&lt;p data-path-to-node=&quot;12&quot; data-ke-size=&quot;size16&quot;&gt;사용자가 입력칸의 작은 사각형을 정확히 클릭하지 않아도 &lt;b data-index-in-node=&quot;54&quot; data-path-to-node=&quot;12&quot;&gt;글자(라벨)만 클릭해도 입력칸이 활성화됨.&lt;/b&gt;&lt;/p&gt;
&lt;p data-path-to-node=&quot;12&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;모바일 환경에서 매우 중요한 사용자 경험(UX) 요소&amp;nbsp;&lt;/p&gt;
&lt;div&gt;&lt;span style=&quot;background-color: #000000; color: #eb5757;&quot; data-token-index=&quot;2&quot;&gt;label&lt;/span&gt;로 설명을 연결하면 글자를 클릭해도 해당 입력칸이 선택되어 &lt;span data-token-index=&quot;4&quot;&gt;사용성&amp;middot;접근성&lt;/span&gt;이 좋아진다.&lt;/div&gt;
&lt;h4 data-path-to-node=&quot;13&quot; data-ke-size=&quot;size20&quot;&gt;③ input vs button&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;14&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&amp;lt;input type=&quot;button&quot;&amp;gt;: 과거부터 사용된 방식. value 속성으로 버튼의 텍스트를 정함.&lt;/li&gt;
&lt;li&gt;&amp;lt;button&amp;gt;: 최신 방식이며, 태그 사이에 텍스트나 아이콘을 자유롭게 넣을 수 있어 디자인적으로 훨씬 유연한다.&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>개발자 호소인/Front</category>
      <author>리제 </author>
      <guid isPermaLink="true">https://bookstairs.tistory.com/73</guid>
      <comments>https://bookstairs.tistory.com/73#entry73comment</comments>
      <pubDate>Thu, 18 Jun 2026 16:40:10 +0900</pubDate>
    </item>
    <item>
      <title>사양(斜陽) 산업인 '책', 출판사들은 왜 계속 찍어낼까?</title>
      <link>https://bookstairs.tistory.com/72</link>
      <description>&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;/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;책과 완벽히 같은 내용을 담은 다른 콘텐츠를 소비했을 때, 특히 무형 데이터로 접했다면&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;인간이 가진 &lt;b data-index-in-node=&quot;48&quot; data-path-to-node=&quot;0&quot;&gt;진화적&amp;middot;감각적 본능&lt;/b&gt;이 형태가 없는 디지털 기술을 따라가지 못해 발생하는 인지적 갭(Gap)이 생긴다.&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;1&quot; data-ke-size=&quot;size16&quot;&gt;이를 뇌과학, 심리학에서는 감각의 부재라고 하는데 &amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;4&quot; data-ke-size=&quot;size16&quot;&gt;인간은 수백만 년 동안 손으로 만지고, 무게를 느끼고, 눈으로 위치를 확인하며 '소유'를 인지해 왔기에 , 종이의 질감, 책장을 넘기는 소리, 특유의 나무 냄새(후각), 묵직한 무게감 등 &lt;b data-index-in-node=&quot;51&quot; data-path-to-node=&quot;5,0,0&quot;&gt;오감을 자극한다&lt;/b&gt;. 뇌는 이 감각 자극을 통해 &quot;이 물건은 내 것&quot;이라는 실질적인 소유감을 느낀다. 다만, 영상매체를 비롯한 e-book은 매끈한 스크린을 스와이프 하는 하나로 모든 감각이 통일되어 느끼게 된다.&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;4&quot; data-ke-size=&quot;size16&quot;&gt;전자기기에&amp;nbsp; &lt;span style=&quot;letter-spacing: 0px;&quot;&gt;수백 권의 책이 들어가 있어도 무게는 늘어나지 않고, 냄새도 없으며, 물리적 실체가 없다. 뇌 입장에서는 픽셀의 변화일 뿐이라 &lt;/span&gt;&lt;b data-index-in-node=&quot;128&quot; data-path-to-node=&quot;5,1,0&quot;&gt;'소유했다'는 실감이 나지 않는 괴리&lt;/b&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;가 생기게 되는 것이다.&amp;nbsp;&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;또한 이런 무형 콘텐츠는&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 data-index-in-node=&quot;0&quot; data-path-to-node=&quot;11,1,0&quot;&gt;&lt;/b&gt;그리고 이런 소유권에 대한 불안감도 타당성이 있다. 우리는 E-book을 '구매'했다고 생각하지만, 사실은 '플랫폼이 제공하는 열람 권한(라이선스)을 대여'한 것에 가깝다. 만약 해당 서점이 망하거나 계약이 종료되면 내가 돈을 주고 산 책이 서재에서 사라질 수 있는 연결성 데이터다. 타인에게 중고로 팔 수도, 마음대로 선물할 수도 없으니 '생색'도 불가능하다.&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;인간이 아무리 편리함을 추구하는 디지털 시대에 살고 있어도, 수만 년간 물리적 물성을 만지며 살아온 DNA가 남아있기 때문에 이 두 영역 사이의 괴리는 좁혀지기 어렵다. 석양 사업이라 불리는 종이책이 인쇄를 멈추지 않는 가장 강력한 이유가 바로 이 괴리 속에 있다.&lt;/p&gt;</description>
      <category>뻘소리</category>
      <author>리제 </author>
      <guid isPermaLink="true">https://bookstairs.tistory.com/72</guid>
      <comments>https://bookstairs.tistory.com/72#entry72comment</comments>
      <pubDate>Thu, 18 Jun 2026 15:03:23 +0900</pubDate>
    </item>
    <item>
      <title>[SQL] SQL재사용 프로시저 ( Stored Procedure )</title>
      <link>https://bookstairs.tistory.com/71</link>
      <description>&lt;p data-path-to-node=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;데이터베이스에서 프로시저(Stored Procedure)란&lt;/p&gt;
&lt;p data-path-to-node=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;, &lt;b data-index-in-node=&quot;34&quot; data-path-to-node=&quot;0&quot;&gt;여러 개의 SQL 문장을 하나의 함수처럼 묶어서 데이터베이스에 저장해두고 필요할 때마다 호출하여 실행하는 객체&lt;/b&gt;를 말한다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;1&quot; data-ke-size=&quot;size16&quot;&gt;매번 길고 복잡한 쿼리를 타이핑하는 대신, &quot;이름표를 붙여둔 쿼리 묶음&quot;이다.&lt;/p&gt;
&lt;h3 data-path-to-node=&quot;3&quot; data-ke-size=&quot;size23&quot;&gt;1. 프로시저의 핵심 특징&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;4&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;4,0,0&quot;&gt;모듈화&lt;/b&gt;: 복잡한 비즈니스 로직을 하나로 묶어 관리가 편함.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;4,1,0&quot;&gt;성능 향상&lt;/b&gt;: 처음 실행될 때 데이터베이스가 쿼리를 분석하고 최적화(컴파일)해두기 때문에, 반복 실행 시 일반 쿼리보다 빠름&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;4,2,0&quot;&gt;보안 및 권한 관리&lt;/b&gt;: 사용자에게 테이블을 직접 보여주지 않고 프로시저만 실행할 수 있는 권한을 부여하여 데이터 접근을 제어할 수 있다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;4,3,0&quot;&gt;네트워크 트래픽 감소&lt;/b&gt;: 클라이언트에서 여러 번 쿼리를 요청할 필요 없이, 프로시저 이름만 부르면 서버 내부에서 모든 처리가 끝나므로 데이터 전송량이 줄어든다.&lt;/li&gt;
&lt;/ul&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style7&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;재사용성&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;한 번 만들어두면 CALL로 반복 호출 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;성능&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;SQL이 서버에 미리 컴파일되어 실행 속도 향상&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;유지보수&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;로직을 DB에 모아두어 관리 편리&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;DELIMITER&lt;/span&gt;&lt;/b&gt; // -- 쿼리 구분자를 임시로 변경합니다.&lt;br /&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;CREATE PROCEDUR&lt;/span&gt;E InsertEmployee( &lt;br /&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; IN&lt;/span&gt; p_name VARCHAR(&lt;span style=&quot;color: #f89009;&quot;&gt;50&lt;/span&gt;), &lt;br /&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;IN&lt;/span&gt; p_dept_id VARCHAR(&lt;span style=&quot;color: #f89009;&quot;&gt;10&lt;/span&gt;)&lt;br /&gt;&lt;br /&gt;) &lt;br /&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;BEGIN&lt;/span&gt; &lt;br /&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; INSERT INTO&lt;/span&gt; EMPLOYEE (EMP_NAME, DEPT_CODE) &lt;br /&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;VALUES&lt;/span&gt; (p_name, p_dept_id);&lt;br /&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;END&lt;/span&gt; //&lt;br /&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;DELIMITER&lt;/b&gt; &lt;/span&gt;; -- 다시 구분자를 원래대로 돌립니다.&lt;/blockquote&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;이렇게 저장해두면, 나중에 한줄로 실행가능&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;CALL&lt;/span&gt;&lt;/b&gt; InsertEmployee('홍길동', 'D1');&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-path-to-node=&quot;11&quot; data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;함수(Function)와&amp;nbsp; 차이&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;12&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;12,0,0&quot;&gt;함수(Function)&lt;/b&gt;: 반드시 &lt;b&gt;결과값(Return)을 반환&lt;/b&gt;해야 하며, &lt;b&gt;SELECT 문 안에서 호출할 수&lt;/b&gt; 있다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;12,1,0&quot;&gt;프로시저(Procedure)&lt;/b&gt;: 결과값을&lt;b&gt; 반환할 수도 있고 안 할 수도 있으&lt;/b&gt;며, SELECT 문 내부가 아닌 &lt;b&gt;CALL 명령어를 통해 실행&lt;/b&gt;합니다. 더 복잡한 로직(데이터 수정, 삭제 등) 처리에 특화되어 있다.\\1. 구분자(DELIMITER) 변경의 이유&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-path-to-node=&quot;2&quot; data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-path-to-node=&quot;2&quot; data-ke-size=&quot;size23&quot;&gt;&amp;lt;구분자(DELIMITER) 변경의 이유&amp;gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;3&quot; data-ke-size=&quot;size16&quot;&gt;프로시저의 핵심은&lt;b&gt; BEGIN&lt;/b&gt;과 &lt;b&gt;END&lt;/b&gt; 사이에 &lt;b&gt;여러 줄의 SQL 문을 담는 것&lt;/b&gt;&lt;/p&gt;
&lt;p data-path-to-node=&quot;3&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;4,0,0&quot;&gt;문제점&lt;/b&gt;: MySQL은 기본적으로&lt;b&gt; ;(&lt;/b&gt;세미콜론)을 만나면 &quot;여기까지가 하나의 명령어다&quot;라고 판단하고 즉시 실행한다,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로시저 내부의 SQL 문장 뒤에도 당연히 &lt;b&gt;;&lt;/b&gt;이 들어가야 하는데, 이 때문에 &lt;u&gt;프로시저가 완성되기도 전에 실행되는 오류가 발생.&lt;/u&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 data-index-in-node=&quot;0&quot; data-path-to-node=&quot;4,1,0&quot;&gt;해결책&lt;/b&gt;: &lt;span style=&quot;color: #8a3db6;&quot;&gt;&lt;b&gt;DELIMITER $$&lt;/b&gt;&lt;/span&gt;를 통해 &quot;이제부터는 $$를 만날 때까지는 실행하지 말고 하나의 덩어리로 봐라&quot;고 데이터베이스에 명령을 내리는 것.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;4,2,0&quot;&gt;마무리&lt;/b&gt;: 프로시저 작성이 끝나면 DELIMITER ;로 돌아와서, 다시 평소처럼 ;을 문장의 끝으로 사용하도록 설정합니다.&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;① 생성 (CREATE PROCEDURE)&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;7&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;프로시저의 이름과 로직을 정의함&lt;/li&gt;
&lt;li&gt;BEGIN과 END는 프로시저 실행 영역의 시작과 끝을 나타내는 블록.&lt;/li&gt;
&lt;li&gt;이 안에 작성된 SQL 문들이 CALL을 통해 호출될 때마다 순차적으로 실행된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;② 실행 (CALL)&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;9&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;저장된 프로시저를 호출.&lt;/li&gt;
&lt;li&gt;CALL 명령어는 데이터베이스 엔진이 저장해둔 프로시저 로직을 불러와 실행하도록 트리거 역할을 함.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;③ 삭제 (DROP PROCEDURE)&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;11&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;저장된 프로시저를 삭제.&lt;/li&gt;
&lt;li&gt;IF EXISTS를 사용하는 이유는 해당 프로시저가 이미 없는 상태에서 삭제 명령을 내릴 경우 발생하는 오류를 방지하기 위함이다.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-path-to-node=&quot;2&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;&lt;b&gt;단계&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;&lt;b&gt;명령어&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;&lt;b&gt;역할&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;&lt;b&gt;핵심 포인트&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;&lt;span data-path-to-node=&quot;2,1,0,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;2,1,0,0&quot;&gt;1. 생성&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;&lt;span data-path-to-node=&quot;2,1,1,0&quot;&gt;CREATE PROCEDURE&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;&lt;span data-path-to-node=&quot;2,1,2,0&quot;&gt;데이터베이스에 로직 저장&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;&lt;span data-path-to-node=&quot;2,1,3,0&quot;&gt;DELIMITER로 구분자를 재정의해야 함&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;&lt;span data-path-to-node=&quot;2,2,0,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;2,2,0,0&quot;&gt;2. 실행&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;&lt;span data-path-to-node=&quot;2,2,1,0&quot;&gt;CALL&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;&lt;span data-path-to-node=&quot;2,2,2,0&quot;&gt;저장된 로직 호출 및 수행&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;&lt;span data-path-to-node=&quot;2,2,3,0&quot;&gt;언제든 필요할 때 호출 가능&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;&lt;span data-path-to-node=&quot;2,3,0,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;2,3,0,0&quot;&gt;3. 삭제&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;&lt;span data-path-to-node=&quot;2,3,1,0&quot;&gt;DROP PROCEDURE&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;&lt;span data-path-to-node=&quot;2,3,2,0&quot;&gt;데이터베이스에서 로직 제거&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;&lt;span data-path-to-node=&quot;2,3,3,0&quot;&gt;IF EXISTS로 안전하게 삭제 권장&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-17 173033.png&quot; data-origin-width=&quot;823&quot; data-origin-height=&quot;442&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lIA8C/dJMcaicHW8u/xci6wbE2kXeLImzqb7CBG0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lIA8C/dJMcaicHW8u/xci6wbE2kXeLImzqb7CBG0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lIA8C/dJMcaicHW8u/xci6wbE2kXeLImzqb7CBG0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlIA8C%2FdJMcaicHW8u%2Fxci6wbE2kXeLImzqb7CBG0%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;823&quot; height=&quot;442&quot; data-filename=&quot;스크린샷 2026-06-17 173033.png&quot; data-origin-width=&quot;823&quot; data-origin-height=&quot;442&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;&amp;nbsp;&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;--&amp;nbsp;기본&amp;nbsp;프로시저&lt;br /&gt;&lt;br /&gt;--&amp;nbsp;1.&amp;nbsp;시작전&amp;nbsp;구분자&amp;nbsp;변경&amp;nbsp;;&amp;nbsp;-&amp;gt;&amp;nbsp;//&lt;br /&gt;delimiter&amp;nbsp;//&lt;br /&gt;&lt;br /&gt;--&amp;nbsp;2.&amp;nbsp;프로시저&amp;nbsp;생성&lt;br /&gt;create&amp;nbsp;procedure&amp;nbsp;pro_all_emp()&lt;br /&gt;begin&lt;br /&gt;--&amp;nbsp;내부에서&amp;nbsp;자유롭게&amp;nbsp;sql문을&amp;nbsp;사용&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;select&amp;nbsp;emp_id,&amp;nbsp;emp_name,&amp;nbsp;dept_code,&amp;nbsp;salary&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;from&amp;nbsp;employee;&lt;br /&gt;end&amp;nbsp;//&lt;br /&gt;&lt;br /&gt;--&amp;nbsp;3.&amp;nbsp;생성&amp;nbsp;후&amp;nbsp;구분자&amp;nbsp;변경&amp;nbsp;//&amp;nbsp;-&amp;gt;&amp;nbsp;;&lt;br /&gt;delimiter&amp;nbsp;;&lt;br /&gt;&lt;br /&gt;--&amp;nbsp;저장된&amp;nbsp;프로시저&amp;nbsp;호출&amp;nbsp;방법&lt;br /&gt;--&amp;nbsp;call&amp;nbsp;프로시저명()&lt;br /&gt;call&amp;nbsp;pro_all_emp();&lt;br /&gt;&lt;br /&gt;drop&amp;nbsp;procedure&amp;nbsp;if&amp;nbsp;exists&amp;nbsp;pro_all_emp;&lt;br /&gt;&lt;br /&gt;/*&lt;br /&gt;매개변수가&amp;nbsp;있는&amp;nbsp;프로시저&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;외부에서&amp;nbsp;값을&amp;nbsp;전달받아&amp;nbsp;쿼리에&amp;nbsp;사용하는&amp;nbsp;방법&lt;br /&gt;*/&lt;br /&gt;&lt;br /&gt;delimiter&amp;nbsp;//&lt;br /&gt;&lt;br /&gt;create&amp;nbsp;procedure&amp;nbsp;pro_sal_raise(&lt;br /&gt;in&amp;nbsp;p_dept_code&amp;nbsp;varchar(3),&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;in&amp;nbsp;p_raise_rate&amp;nbsp;decimal(3,2)&lt;br /&gt;)&lt;br /&gt;begin&lt;br /&gt;update&amp;nbsp;employee&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;set&amp;nbsp;salary&amp;nbsp;=&amp;nbsp;salary&amp;nbsp;*&amp;nbsp;(1&amp;nbsp;+&amp;nbsp;p_raise_rate)&lt;br /&gt;where&amp;nbsp;dept_code&amp;nbsp;=&amp;nbsp;p_dept_code;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;select&amp;nbsp;emp_name,&amp;nbsp;dept_code,&amp;nbsp;salary&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;from&amp;nbsp;employee&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;where&amp;nbsp;dept_code&amp;nbsp;=&amp;nbsp;p_dept_code;&lt;br /&gt;end//&lt;br /&gt;&lt;br /&gt;delimiter&amp;nbsp;;&lt;br /&gt;&lt;br /&gt;select&amp;nbsp;emp_name,&amp;nbsp;dept_code,&amp;nbsp;salary&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;from&amp;nbsp;employee;&lt;br /&gt;&lt;br /&gt;--&amp;nbsp;D5부서의&amp;nbsp;사원들의&amp;nbsp;급여를&amp;nbsp;10%인상&amp;nbsp;&lt;br /&gt;call&amp;nbsp;pro_sal_raise('D5',&amp;nbsp;0.1);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;/*&lt;br /&gt;반환값이&amp;nbsp;있는&amp;nbsp;프로시저&lt;br /&gt;*/&lt;br /&gt;&lt;br /&gt;delimiter&amp;nbsp;//&lt;br /&gt;&lt;br /&gt;create&amp;nbsp;procedure&amp;nbsp;pro_emp_count(&lt;br /&gt;in&amp;nbsp;p_dept_code&amp;nbsp;varchar(3),&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;out&amp;nbsp;p_emp_count&amp;nbsp;int&lt;br /&gt;)&lt;br /&gt;begin&lt;br /&gt;select&amp;nbsp;count(*)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;into&amp;nbsp;p_emp_count&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;from&amp;nbsp;employee&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;where&amp;nbsp;dept_code&amp;nbsp;=&amp;nbsp;p_dept_code;&lt;br /&gt;end//&lt;br /&gt;&lt;br /&gt;delimiter&amp;nbsp;;&lt;br /&gt;&lt;br /&gt;--&amp;nbsp;반환값을&amp;nbsp;받아줄&amp;nbsp;변수는&amp;nbsp;@+변수명으로&amp;nbsp;넘겨준다&lt;br /&gt;call&amp;nbsp;pro_emp_count('D5',&amp;nbsp;@res_count);&lt;br /&gt;&lt;br /&gt;select&amp;nbsp;@res_count&amp;nbsp;as&amp;nbsp;'dept_emp_count';&lt;br /&gt;&lt;br /&gt;/*&lt;br /&gt;제어문(if&amp;nbsp;~&amp;nbsp;then&amp;nbsp;~&amp;nbsp;else)&amp;nbsp;활용&lt;br /&gt;*/&lt;br /&gt;&lt;br /&gt;--&amp;nbsp;사원의&amp;nbsp;사번을&amp;nbsp;전달받아&lt;br /&gt;--&amp;nbsp;보너스를&amp;nbsp;지급받는&amp;nbsp;사원인지&amp;nbsp;아닌지&amp;nbsp;확인후&lt;br /&gt;--&amp;nbsp;보너스를&amp;nbsp;받는&amp;nbsp;사람이면&amp;nbsp;~~~사원의&amp;nbsp;보너스율은&amp;nbsp;~입니다.&lt;br /&gt;--&amp;nbsp;보너스를&amp;nbsp;받지&amp;nbsp;않는&amp;nbsp;사람이면&amp;nbsp;~~사원은&amp;nbsp;보너스&amp;nbsp;지급대상이&amp;nbsp;아닙니다.&lt;br /&gt;delimiter&amp;nbsp;//&lt;br /&gt;&lt;br /&gt;create&amp;nbsp;procedure&amp;nbsp;pro_check_bouns(&lt;br /&gt;in&amp;nbsp;p_emp_id&amp;nbsp;varchar(3)&lt;br /&gt;)&lt;br /&gt;begin&lt;br /&gt;--&amp;nbsp;프로시저&amp;nbsp;내부에서&amp;nbsp;사용할&amp;nbsp;지역변수는&amp;nbsp;declare로&amp;nbsp;선언가능&lt;br /&gt;declare&amp;nbsp;v_bonus&amp;nbsp;decimal(3,2);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;declare&amp;nbsp;v_emp_name&amp;nbsp;varchar(20);&lt;br /&gt;&lt;br /&gt;select&amp;nbsp;emp_name,&amp;nbsp;bonus&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;into&amp;nbsp;v_emp_name,&amp;nbsp;v_bonus&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;from&amp;nbsp;employee&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;where&amp;nbsp;emp_id&amp;nbsp;=&amp;nbsp;p_emp_id;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;v_bonus&amp;nbsp;is&amp;nbsp;null&amp;nbsp;&lt;br /&gt;then&amp;nbsp;select&amp;nbsp;concat(v_emp_name,&amp;nbsp;'사원은&amp;nbsp;보너스&amp;nbsp;지급대상이&amp;nbsp;아닙니다.')&amp;nbsp;as&amp;nbsp;result;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else&lt;br /&gt;select&amp;nbsp;concat(v_emp_name,&amp;nbsp;'사원의&amp;nbsp;보너스율은&amp;nbsp;',&amp;nbsp;v_bonus,&amp;nbsp;'입니다')&amp;nbsp;as&amp;nbsp;result;&lt;br /&gt;end&amp;nbsp;if;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/*&lt;br /&gt;if&amp;nbsp;조건&lt;br /&gt;then&amp;nbsp;조건만족시&amp;nbsp;실행할&amp;nbsp;코드&lt;br /&gt;else&lt;br /&gt;불만족시&amp;nbsp;실행할&amp;nbsp;코드&lt;br /&gt;end&amp;nbsp;if;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*/&lt;br /&gt;end//&lt;br /&gt;&lt;br /&gt;delimiter&amp;nbsp;;&lt;br /&gt;&lt;br /&gt;call&amp;nbsp;pro_check_bouns('200');&lt;br /&gt;call&amp;nbsp;pro_check_bouns('201');&lt;br /&gt;call&amp;nbsp;pro_check_bouns('209');&lt;br /&gt;&lt;br /&gt;/*&lt;br /&gt;프로시저&amp;nbsp;반복문(while)&lt;br /&gt;*/&lt;br /&gt;&lt;br /&gt;create&amp;nbsp;table&amp;nbsp;if&amp;nbsp;not&amp;nbsp;exists&amp;nbsp;test_loop_tb(&lt;br /&gt;id&amp;nbsp;int&amp;nbsp;auto_increment&amp;nbsp;primary&amp;nbsp;key,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;memo&amp;nbsp;varchar(50)&lt;br /&gt;);&lt;br /&gt;&lt;br /&gt;--&amp;nbsp;내가원하는&amp;nbsp;숫자를&amp;nbsp;입력하면&amp;nbsp;그&amp;nbsp;숫자만큼&amp;nbsp;더미데이터를&amp;nbsp;넣어주는&amp;nbsp;프로시저&lt;br /&gt;delimiter&amp;nbsp;//&lt;br /&gt;&lt;br /&gt;create&amp;nbsp;procedure&amp;nbsp;pro_insert_dummy(&lt;br /&gt;in&amp;nbsp;p_count&amp;nbsp;int&lt;br /&gt;)&lt;br /&gt;begin&lt;br /&gt;--&amp;nbsp;반복에&amp;nbsp;사용할&amp;nbsp;변수&amp;nbsp;생성&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;declare&amp;nbsp;v_count&amp;nbsp;int&amp;nbsp;default&amp;nbsp;1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;--&amp;nbsp;반복문을&amp;nbsp;통해서&amp;nbsp;p_count만큰&amp;nbsp;더미데이터를&amp;nbsp;추가&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;while&amp;nbsp;v_count&amp;nbsp;&amp;lt;=&amp;nbsp;p_count&amp;nbsp;do&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;--&amp;nbsp;반복해서&amp;nbsp;실행할&amp;nbsp;코드&lt;br /&gt;insert&amp;nbsp;into&amp;nbsp;test_loop_tb(memo)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;values(concat('더미데이터&amp;nbsp;:&amp;nbsp;',&amp;nbsp;v_count));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;set&amp;nbsp;v_count&amp;nbsp;=&amp;nbsp;v_count&amp;nbsp;+&amp;nbsp;1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;end&amp;nbsp;while;&amp;nbsp;--&amp;nbsp;반복문&amp;nbsp;종료&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/*&lt;br /&gt;while&amp;nbsp;조건&amp;nbsp;do&lt;br /&gt;반복할&amp;nbsp;코드&lt;br /&gt;end&amp;nbsp;while;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*/&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;select&amp;nbsp;concat(p_count,&amp;nbsp;'개의&amp;nbsp;더미데이터&amp;nbsp;추가&amp;nbsp;완료')&amp;nbsp;as&amp;nbsp;msg;&lt;br /&gt;end//&lt;br /&gt;&lt;br /&gt;delimiter&amp;nbsp;;&lt;br /&gt;&lt;br /&gt;call&amp;nbsp;pro_insert_dummy(100);&lt;br /&gt;select&amp;nbsp;*&amp;nbsp;from&amp;nbsp;test_loop_tb;&lt;br /&gt;&lt;br /&gt;/*&lt;br /&gt;프로시저를&amp;nbsp;예외처리,&amp;nbsp;트랜잭션과&amp;nbsp;함께&amp;nbsp;사용하는&amp;nbsp;경우가&amp;nbsp;많음&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;프로시저&amp;nbsp;도중&amp;nbsp;에러가&amp;nbsp;발생하면&amp;nbsp;전부&amp;nbsp;롤백하거나&amp;nbsp;커밋.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;예외처리&lt;br /&gt;declare&amp;nbsp;처리방식&amp;nbsp;handler&amp;nbsp;for&amp;nbsp;예외조건&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;begin&lt;br /&gt;--&amp;nbsp;예외발생시&amp;nbsp;실행할&amp;nbsp;대체쿼리&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;end;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;처리방식&amp;nbsp;:&amp;nbsp;exit(종료),&amp;nbsp;continue(에러가&amp;nbsp;발생한&amp;nbsp;다음줄부터&amp;nbsp;다시&amp;nbsp;시작)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;예외조건&amp;nbsp;:&amp;nbsp;sqlexception(sql오류),&amp;nbsp;sqlwarning(오류는아닌&amp;nbsp;경고수준),&amp;nbsp;not&amp;nbsp;found(결과값없음)&lt;br /&gt;*/&lt;br /&gt;&lt;br /&gt;delimiter&amp;nbsp;//&lt;br /&gt;&lt;br /&gt;create&amp;nbsp;procedure&amp;nbsp;pro_safe_transfer()&lt;br /&gt;begin&lt;br /&gt;--&amp;nbsp;만약&amp;nbsp;db에러(sqlexception)가&amp;nbsp;발생하면&amp;nbsp;특정&amp;nbsp;코드를&amp;nbsp;실행하고&amp;nbsp;종료.(exit)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;declare&amp;nbsp;exit&amp;nbsp;handler&amp;nbsp;for&amp;nbsp;sqlexception&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;begin&lt;br /&gt;rollback;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;select&amp;nbsp;'오류가&amp;nbsp;발생해서&amp;nbsp;모두&amp;nbsp;rollback함'&amp;nbsp;as&amp;nbsp;msg;&lt;br /&gt;end;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;--&amp;nbsp;트랜잭션&amp;nbsp;시작&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;start&amp;nbsp;transaction;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;delete&amp;nbsp;from&amp;nbsp;employee&amp;nbsp;where&amp;nbsp;emp_id&amp;nbsp;=&amp;nbsp;'200';&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;insert&amp;nbsp;into&amp;nbsp;department&amp;nbsp;values('D999',&amp;nbsp;'에러관리부',&amp;nbsp;'L1');&amp;nbsp;--&amp;nbsp;에러발생&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;commit;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;select&amp;nbsp;'모든&amp;nbsp;작업&amp;nbsp;완료&amp;nbsp;후&amp;nbsp;commit'&amp;nbsp;as&amp;nbsp;msg;&lt;br /&gt;end//&lt;br /&gt;&lt;br /&gt;drop&lt;br /&gt;&lt;br /&gt;delimiter&amp;nbsp;;&lt;br /&gt;&lt;br /&gt;call&amp;nbsp;pro_safe_transfer();&lt;br /&gt;&lt;br /&gt;select&amp;nbsp;*&amp;nbsp;from&amp;nbsp;employee&amp;nbsp;where&amp;nbsp;emp_id&amp;nbsp;=&amp;nbsp;'200';&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;</description>
      <category>개발자 호소인/SQL</category>
      <author>리제 </author>
      <guid isPermaLink="true">https://bookstairs.tistory.com/71</guid>
      <comments>https://bookstairs.tistory.com/71#entry71comment</comments>
      <pubDate>Wed, 17 Jun 2026 17:31:38 +0900</pubDate>
    </item>
    <item>
      <title>[SQL] 가상테이블 VIEW</title>
      <link>https://bookstairs.tistory.com/70</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;VIEW는 복잡한 SELECT문을 &lt;b&gt;하나의 이름으로 저장&lt;/b&gt;해두고, 마치 테이블처럼 조회할 수 있는 &lt;b&gt;가상 테이블&lt;/b&gt;.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;실제 데이터를 저장하지 않는다.&lt;/b&gt; 뷰를 조회하면 내부에 저장된 SELECT가 실행&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;복잡한 쿼리를 반복 작성할 필요 없이, &lt;b&gt;뷰 이름 하나로 간편하게 재사용&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 84px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style5&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;&lt;b&gt;재사용성&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;복잡한 JOIN 쿼리를 반복 작성하지 않음&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;3개 테이블 JOIN을 뷰로 저장&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;&lt;b&gt;보안&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;민감한 컬럼을 숨기고 필요한 것만 노출&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;주민번호, 급여 제외 후 뷰 제공&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;&lt;b&gt;추상화&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;사용자에게 간결한 데이터 구조 제공&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;개발팀에 필요한 정보만 뷰로 정리&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;&lt;b&gt;유지보수&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;쿼리 수정 시 뷰만 변경하면 전체 반영&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;기준이 바뀌면 뷰 정의만 수정&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt; &lt;br /&gt;VIEW는 자주 쓰는 검색 조건을&lt;b&gt; 즐겨찾기 해두는 것&lt;/b&gt;과 비슷&lt;br /&gt;&amp;nbsp;매번 복잡한 쿼리를 처음부터 작성하는 대신, 한 번 정의해두고 이름만 호출하면 됨.&lt;/blockquote&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;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;복잡한 JOIN 쿼리를 VIEW로 정의&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;-- 매번 이렇게 긴 쿼리를 작성해야하는 수고를 계속하는건 비효율적이다.&lt;br /&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;SELECT&lt;/span&gt; &lt;span style=&quot;color: #000000;&quot;&gt;e.emp_id, e.emp_name, d.dept_title, e.salary, n.national_name&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;FROM&lt;/span&gt; &lt;span style=&quot;color: #000000;&quot;&gt;employee e&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;JOIN&lt;/span&gt; &lt;span style=&quot;color: #000000;&quot;&gt;department d&lt;/span&gt; &lt;span style=&quot;color: #f89009;&quot;&gt;ON&lt;/span&gt; &lt;span style=&quot;color: #000000;&quot;&gt;e.dept_code = d.dept_id&lt;/span&gt; &lt;br /&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;JOIN&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; location l&lt;/span&gt; &lt;span style=&quot;color: #f89009;&quot;&gt;ON&lt;/span&gt; &lt;span style=&quot;color: #000000;&quot;&gt;d.location_id = l.local_code&lt;/span&gt; &lt;br /&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;JOIN&lt;/span&gt; &lt;span style=&quot;color: #000000;&quot;&gt;national n&lt;/span&gt; &lt;span style=&quot;color: #f89009;&quot;&gt;ON&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; l.national_code = n.national_code&lt;/span&gt; &lt;br /&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;WHERE&lt;/span&gt; &lt;span style=&quot;color: #000000;&quot;&gt;n.national_name =&lt;/span&gt; '&lt;span style=&quot;color: #409d00;&quot;&gt;한국&lt;/span&gt;';&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;수정 및 삭제&lt;/h2&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;VIEW&lt;span&gt;&amp;nbsp;&lt;/span&gt;수정 &amp;mdash; CREATE OR REPLACE VIEW&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존 뷰를 수정할 때 CREATE OR REPLACE VIEW를 사용. 뷰가 &lt;b&gt;없으면 새로 생성&lt;/b&gt;되고, &lt;b&gt;있으면 덮어씀&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-16 163053.png&quot; data-origin-width=&quot;876&quot; data-origin-height=&quot;220&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/u7FrS/dJMcag6Wk4B/4WGJYPqlUOFJKhyZqdHGX1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/u7FrS/dJMcag6Wk4B/4WGJYPqlUOFJKhyZqdHGX1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/u7FrS/dJMcag6Wk4B/4WGJYPqlUOFJKhyZqdHGX1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fu7FrS%2FdJMcag6Wk4B%2F4WGJYPqlUOFJKhyZqdHGX1%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;876&quot; height=&quot;220&quot; data-filename=&quot;스크린샷 2026-06-16 163053.png&quot; data-origin-width=&quot;876&quot; data-origin-height=&quot;220&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;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;VIEW 삭제 : DROP VIEW&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-16 163156.png&quot; data-origin-width=&quot;881&quot; data-origin-height=&quot;165&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ctewKc/dJMcagslCmE/yGlkm7VwRrkqQtEk4WEbW0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ctewKc/dJMcagslCmE/yGlkm7VwRrkqQtEk4WEbW0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ctewKc/dJMcagslCmE/yGlkm7VwRrkqQtEk4WEbW0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FctewKc%2FdJMcagslCmE%2FyGlkm7VwRrkqQtEk4WEbW0%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;881&quot; height=&quot;165&quot; data-filename=&quot;스크린샷 2026-06-16 163156.png&quot; data-origin-width=&quot;881&quot; data-origin-height=&quot;165&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;VIEW 목록 확인&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-16 163348.png&quot; data-origin-width=&quot;898&quot; data-origin-height=&quot;183&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/JVeva/dJMcaf7Z9Xj/J304GlkXQUKXBVYS0xsGSk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/JVeva/dJMcaf7Z9Xj/J304GlkXQUKXBVYS0xsGSk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/JVeva/dJMcaf7Z9Xj/J304GlkXQUKXBVYS0xsGSk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJVeva%2FdJMcaf7Z9Xj%2FJ304GlkXQUKXBVYS0xsGSk%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;898&quot; height=&quot;183&quot; data-filename=&quot;스크린샷 2026-06-16 163348.png&quot; data-origin-width=&quot;898&quot; data-origin-height=&quot;183&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;뷰 컬럼에 별칭이 필수인 경우&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;VIEW의 SELECT에 &lt;b&gt;산술식, 함수식, 집계 함수&lt;/b&gt; 등이 포함되면 컬럼 이름이 자동 생성되지 않으므로 &lt;b&gt;반드시 별칭(alias)을 지정&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 widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-16 163423.png&quot; data-origin-width=&quot;571&quot; data-origin-height=&quot;449&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/boIZYU/dJMb99UhHsw/6bQWqpGAUFo9QVTaaQkPnK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/boIZYU/dJMb99UhHsw/6bQWqpGAUFo9QVTaaQkPnK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/boIZYU/dJMb99UhHsw/6bQWqpGAUFo9QVTaaQkPnK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FboIZYU%2FdJMb99UhHsw%2F6bQWqpGAUFo9QVTaaQkPnK%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;571&quot; height=&quot;449&quot; data-filename=&quot;스크린샷 2026-06-16 163423.png&quot; data-origin-width=&quot;571&quot; data-origin-height=&quot;449&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;별칭 지정하는 법은 2가지&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;방법 1. SELECT 절에서 AS로 별칭 지정&amp;nbsp;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;909&quot; data-origin-height=&quot;135&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/F2pJH/dJMcagFWqd1/fc4g9dqi9g5oECuL05nK7k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/F2pJH/dJMcagFWqd1/fc4g9dqi9g5oECuL05nK7k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/F2pJH/dJMcagFWqd1/fc4g9dqi9g5oECuL05nK7k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FF2pJH%2FdJMcagFWqd1%2Ffc4g9dqi9g5oECuL05nK7k%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;909&quot; height=&quot;135&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;909&quot; data-origin-height=&quot;135&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;h4 data-ke-size=&quot;size20&quot;&gt;방법 2. 뷰 이름 뒤에 컬럼명 나열&amp;nbsp;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-16 163659.png&quot; data-origin-width=&quot;879&quot; data-origin-height=&quot;139&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b7qPTv/dJMcaiKp0tT/nGSsyPZPkMIeYW5pnE1Rw1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b7qPTv/dJMcaiKp0tT/nGSsyPZPkMIeYW5pnE1Rw1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b7qPTv/dJMcaiKp0tT/nGSsyPZPkMIeYW5pnE1Rw1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb7qPTv%2FdJMcaiKp0tT%2FnGSsyPZPkMIeYW5pnE1Rw1%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;879&quot; height=&quot;139&quot; data-filename=&quot;스크린샷 2026-06-16 163659.png&quot; data-origin-width=&quot;879&quot; data-origin-height=&quot;139&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;size18&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,2,0&quot;&gt; &lt;span style=&quot;color: #666666; text-align: left;&quot;&gt; &lt;/span&gt; 구조 이해&lt;/b&gt;: 인라인 뷰는 SELECT 결과물을 하나의 임시 테이블(V)로 취급하는 것&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;따라서 &lt;b&gt;SELECT * FROM (인라인 뷰 쿼리) V WHERE&lt;/b&gt; 조건 형식을 기억하기 편하다.&lt;/p&gt;
&lt;h3 data-path-to-node=&quot;1&quot; data-ke-size=&quot;size23&quot;&gt;1. 각 키워드의 역할 구분&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 105px;&quot; border=&quot;1&quot; data-path-to-node=&quot;2&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style15&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt; &lt;b&gt;키워드&lt;/b&gt; &lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt; &lt;b&gt;주요 사용 위치&lt;/b&gt; &lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt; &lt;b&gt;역할&lt;/b&gt; &lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;height: 21px; text-align: center;&quot;&gt;&lt;span data-path-to-node=&quot;2,1,0,0&quot;&gt;IN&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 21px; text-align: center;&quot;&gt;&lt;span data-path-to-node=&quot;2,1,1,0&quot;&gt;WHERE&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 21px; text-align: center;&quot;&gt;&lt;span data-path-to-node=&quot;2,1,2,0&quot;&gt;특정 값들의 목록 중 하나와 일치하는지 확인&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;height: 21px; text-align: center;&quot;&gt;&lt;span data-path-to-node=&quot;2,2,0,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;2,2,0,0&quot;&gt;AS&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 21px; text-align: center;&quot;&gt;&lt;span data-path-to-node=&quot;2,2,1,0&quot;&gt;SELECT, FROM&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 21px; text-align: center;&quot;&gt;&lt;span data-path-to-node=&quot;2,2,2,0&quot;&gt;컬럼이나 테이블에 별칭(Alias)을 부여&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;height: 21px; text-align: center;&quot;&gt;&lt;span data-path-to-node=&quot;2,3,0,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;2,3,0,0&quot;&gt;ON&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 21px; text-align: center;&quot;&gt;&lt;span data-path-to-node=&quot;2,3,1,0&quot;&gt;JOIN&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 21px; text-align: center;&quot;&gt;&lt;span data-path-to-node=&quot;2,3,2,0&quot;&gt;두 테이블을 연결할 조건(연결고리)을 지정&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;height: 21px; text-align: center;&quot;&gt;&lt;span data-path-to-node=&quot;2,4,0,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;2,4,0,0&quot;&gt;INTO&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 21px; text-align: center;&quot;&gt;&lt;span data-path-to-node=&quot;2,4,1,0&quot;&gt;INSERT&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 21px; text-align: center;&quot;&gt;&lt;span data-path-to-node=&quot;2,4,2,0&quot;&gt;데이터를 넣을 대상 테이블을 지정&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-path-to-node=&quot;4&quot; data-ke-size=&quot;size23&quot;&gt;2. 왜 WHERE 뒤에 나머지는 올 수 없나요?&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;5&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;5,0,0&quot;&gt;AS (별칭)&lt;/b&gt;: SELECT 컬럼명 AS 별칭 또는 FROM 테이블명 AS 별칭 처럼 &lt;b data-index-in-node=&quot;48&quot; data-path-to-node=&quot;5,0,0&quot;&gt;이름을 지어주는 역할&lt;/b&gt;을 합니다. WHERE는 데이터를 거르는 역할이지 이름을 짓는 곳이 아닙니다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;5,1,0&quot;&gt;ON (연결 조건)&lt;/b&gt;: JOIN 문법에서 &quot;어떤 기준으로 테이블을 붙일까?&quot;를 정하는 전용 키워드입니다. WHERE는 이미 붙여진 테이블에서 행을 필터링하는 곳이므로 용도가 다릅니다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;5,2,0&quot;&gt;INTO (대상 지정)&lt;/b&gt;: 데이터를 &lt;b data-index-in-node=&quot;19&quot; data-path-to-node=&quot;5,2,0&quot;&gt;새로 넣을 때&lt;/b&gt; 사용하는 INSERT INTO 구문의 일부입니다. 데이터를 조회하거나 필터링하는 WHERE와는 함께 쓰이지 않습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-path-to-node=&quot;7&quot; data-ke-size=&quot;size23&quot;&gt;3. 잘못된 사용 예시 vs 올바른 예시&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;8&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;8,0,0&quot;&gt;❌ 잘못된 예시&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;8,0,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;WHERE emp_id INTO 300; (X) -&amp;gt; INSERT 구문에서 쓰는 단어입니다.&lt;/li&gt;
&lt;li&gt;WHERE emp_id ON 300; (X) -&amp;gt; JOIN에서 쓰는 단어입니다.&lt;/li&gt;
&lt;li&gt;WHERE emp_name AS '김철수'; (X) -&amp;gt; SELECT에서 쓰는 단어입니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;8,1,0&quot;&gt;✅ 올바른 예시 (WHERE 절)&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;8,1,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;WHERE emp_id IN (100, 200, 300); (O)&lt;/li&gt;
&lt;li&gt;WHERE emp_name = '김철수'; (O)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-path-to-node=&quot;9&quot; data-ke-size=&quot;size23&quot;&gt;요약&lt;/h3&gt;
&lt;p data-path-to-node=&quot;10&quot; data-ke-size=&quot;size16&quot;&gt;WHERE는 &quot;어떤 데이터를 가져올 것인가?&quot;를 결정하는 필터입니다. AS, ON, INTO는 각각 &lt;b data-index-in-node=&quot;56&quot; data-path-to-node=&quot;10&quot;&gt;이름 지정, 테이블 연결, 데이터 삽입&lt;/b&gt;이라는 다른 목적을 가진 명령어들이기 때문에 WHERE 절 안에 들어갈 수 없습니다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;11&quot; data-ke-size=&quot;size16&quot;&gt;이제 이 키워드들이 서로 다른 구문에서 사용된다는 점이 이해되시나요? 각 명령어의 '소속'을 기억하시면 쿼리 작성 시 실수를 크게 줄일 수 있습니다.&lt;/p&gt;</description>
      <category>개발자 호소인/SQL</category>
      <author>리제 </author>
      <guid isPermaLink="true">https://bookstairs.tistory.com/70</guid>
      <comments>https://bookstairs.tistory.com/70#entry70comment</comments>
      <pubDate>Tue, 16 Jun 2026 16:41:29 +0900</pubDate>
    </item>
    <item>
      <title>[SQL] 데이터제어와 트랜잭션 DCL, TCL</title>
      <link>https://bookstairs.tistory.com/69</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;DCL (Data Control Language)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용자의 데이터베이스 &lt;b&gt;접근 권한을 부여(GRANT)&lt;/b&gt;하거나&lt;b&gt; 회수(REVOKE)&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;b&gt;누가&lt;/b&gt; (DB 사용자가) &lt;b&gt;어떤 객체에&lt;/b&gt; (테이블, 뷰 등) &lt;b&gt;무엇을 할 수 있는지&lt;/b&gt; 제어&lt;/li&gt;
&lt;li&gt;대표 명령어: &lt;span style=&quot;background-color: #f6e199;&quot;&gt;GRANT, REVOKE&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;권한의 종류&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;글로벌 권한&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;서버 전체에 대한 관리 권한&lt;/td&gt;
&lt;td&gt;사용자 생성, DB 생성, 복제 등&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;데이터베이스 권한&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;특정 DB에 대한 권한&lt;/td&gt;
&lt;td&gt;특정 DB의 테이블 생성&amp;middot;삭제&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;테이블 권한&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;특정 테이블에 대한 조회/조작 권한&lt;/td&gt;
&lt;td&gt;SELECT, INSERT, UPDATE, DELETE&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-16 160158.png&quot; data-origin-width=&quot;909&quot; data-origin-height=&quot;261&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/NVdMB/dJMcagZ8NSh/6sWF6h8vd0R5j08aq16sTk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/NVdMB/dJMcagZ8NSh/6sWF6h8vd0R5j08aq16sTk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/NVdMB/dJMcagZ8NSh/6sWF6h8vd0R5j08aq16sTk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNVdMB%2FdJMcagZ8NSh%2F6sWF6h8vd0R5j08aq16sTk%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;909&quot; height=&quot;261&quot; data-filename=&quot;스크린샷 2026-06-16 160158.png&quot; data-origin-width=&quot;909&quot; data-origin-height=&quot;261&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-16 160224.png&quot; data-origin-width=&quot;569&quot; data-origin-height=&quot;440&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bHmn8x/dJMcabkkjqK/7mvVjQUTVhpiMsYvhhhkX1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bHmn8x/dJMcabkkjqK/7mvVjQUTVhpiMsYvhhhkX1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bHmn8x/dJMcabkkjqK/7mvVjQUTVhpiMsYvhhhkX1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbHmn8x%2FdJMcabkkjqK%2F7mvVjQUTVhpiMsYvhhhkX1%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;569&quot; height=&quot;440&quot; data-filename=&quot;스크린샷 2026-06-16 160224.png&quot; data-origin-width=&quot;569&quot; data-origin-height=&quot;440&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-16 160235.png&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;426&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d41FNJ/dJMcagZ8NSj/Kuy6fhCF6f2eK3cGATPyP1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d41FNJ/dJMcagZ8NSj/Kuy6fhCF6f2eK3cGATPyP1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d41FNJ/dJMcagZ8NSj/Kuy6fhCF6f2eK3cGATPyP1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd41FNJ%2FdJMcagZ8NSj%2FKuy6fhCF6f2eK3cGATPyP1%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;600&quot; height=&quot;426&quot; data-filename=&quot;스크린샷 2026-06-16 160235.png&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;426&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-16 160347.png&quot; data-origin-width=&quot;644&quot; data-origin-height=&quot;217&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vGDbn/dJMcagMHYYH/yt8RHpk5hNk40IOkT39AZk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vGDbn/dJMcagMHYYH/yt8RHpk5hNk40IOkT39AZk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vGDbn/dJMcagMHYYH/yt8RHpk5hNk40IOkT39AZk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvGDbn%2FdJMcagMHYYH%2Fyt8RHpk5hNk40IOkT39AZk%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;644&quot; height=&quot;217&quot; data-filename=&quot;스크린샷 2026-06-16 160347.png&quot; data-origin-width=&quot;644&quot; data-origin-height=&quot;217&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;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;TCL ( Transaction Control Language )&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하나 이상의 DML 명령을 &lt;b&gt;묶어서 일괄 처리&lt;/b&gt;할 수 있도록 제어하는 명령어&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;트랜잭션(Transaction)이란?&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;하나의 논리적인 작업 단위&lt;/b&gt;.&lt;/li&gt;
&lt;li&gt;: &quot;A가 B에게 10만 원 이체&quot; = 출금(UPDATE) + 입금(UPDATE) &amp;rarr;&lt;b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;둘 다 성공하거나, 둘 다 취소되어야 한다&lt;/b&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;TCL 주요 명령어명령어 설명&lt;/b&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 94px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;&lt;span style=&quot;color: #a6bc00;&quot;&gt;COMMIT&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;변경사항을 &lt;b&gt;확정&lt;/b&gt;하고 DB에 영구 반영&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;ROLLBACK&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;변경사항을 &lt;b&gt;취소&lt;/b&gt;하고 이전 상태로 복원&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;SAVEPOINT&lt;/span&gt; 이름&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;중간 저장 지점을 지정&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;ROLLBACK TO&lt;/span&gt; 이름&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;지정한 SAVEPOINT 지점까지만 되돌리기&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;MySQL의 &lt;b&gt;AUTOCOMMIT&lt;/b&gt; &lt;span&gt;⭐&lt;/span&gt; 핵심적 차이&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MySQL은 기본적으로 &lt;span data-token-index=&quot;1&quot;&gt;AUTOCOMMIT이&lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt; ON&lt;/span&gt;&lt;/b&gt;이 디폴트값이다.&lt;/span&gt;&lt;span data-token-index=&quot;1&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; DML 하나를 실행&lt;/b&gt;하면 &lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;자동으로 COMMIT&lt;/span&gt;&lt;/b&gt;이 되기 때문에, &lt;span data-token-index=&quot;1&quot;&gt;트랜잭션 실습을 하려면 반드시&lt;span style=&quot;color: #ee2323;&quot;&gt; AUTOCOMMIT을 끄거&lt;/span&gt;나&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span data-token-index=&quot;1&quot;&gt; &lt;span style=&quot;color: #009a87;&quot;&gt;START TRANSACTION&lt;/span&gt;을 사용해야한다.&lt;/span&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 widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-16 160857.png&quot; data-origin-width=&quot;595&quot; data-origin-height=&quot;304&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vsQ00/dJMcaftqRbc/6gChGjD4CQk84tQCDK4Bf0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vsQ00/dJMcaftqRbc/6gChGjD4CQk84tQCDK4Bf0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vsQ00/dJMcaftqRbc/6gChGjD4CQk84tQCDK4Bf0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvsQ00%2FdJMcaftqRbc%2F6gChGjD4CQk84tQCDK4Bf0%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;595&quot; height=&quot;304&quot; data-filename=&quot;스크린샷 2026-06-16 160857.png&quot; data-origin-width=&quot;595&quot; data-origin-height=&quot;304&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;트랜잭션을 사용하는 2가지 방법&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. AUTOCOMMIT 을 끄는 법&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;898&quot; data-origin-height=&quot;170&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d11bZo/dJMcaf1fbrF/KT15xzWDKfpZUxHGeRaKK1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d11bZo/dJMcaf1fbrF/KT15xzWDKfpZUxHGeRaKK1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d11bZo/dJMcaf1fbrF/KT15xzWDKfpZUxHGeRaKK1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd11bZo%2FdJMcaf1fbrF%2FKT15xzWDKfpZUxHGeRaKK1%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;898&quot; height=&quot;170&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;898&quot; data-origin-height=&quot;170&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2. START TRANSACTION 사용(권장)&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-16 161658.png&quot; data-origin-width=&quot;894&quot; data-origin-height=&quot;181&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Dy5Yn/dJMcagslByB/gju6EiHkYmAMMyo5foSb0k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Dy5Yn/dJMcagslByB/gju6EiHkYmAMMyo5foSb0k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Dy5Yn/dJMcagslByB/gju6EiHkYmAMMyo5foSb0k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDy5Yn%2FdJMcagslByB%2Fgju6EiHkYmAMMyo5foSb0k%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;894&quot; height=&quot;181&quot; data-filename=&quot;스크린샷 2026-06-16 161658.png&quot; data-origin-width=&quot;894&quot; data-origin-height=&quot;181&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-16 161803.png&quot; data-origin-width=&quot;576&quot; data-origin-height=&quot;381&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ubA4N/dJMcajoYSwn/U1uffDIOcZ3sijwKvDWkek/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ubA4N/dJMcajoYSwn/U1uffDIOcZ3sijwKvDWkek/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ubA4N/dJMcajoYSwn/U1uffDIOcZ3sijwKvDWkek/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FubA4N%2FdJMcajoYSwn%2FU1uffDIOcZ3sijwKvDWkek%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;576&quot; height=&quot;381&quot; data-filename=&quot;스크린샷 2026-06-16 161803.png&quot; data-origin-width=&quot;576&quot; data-origin-height=&quot;381&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;h2 data-ke-size=&quot;size26&quot;&gt;DDL과 트랜잭션의 관계&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;⚠️ DDL 실행 시 자동으로 COMMIT이 발생. CREATE, ALTER, DROP, TRUNCATE 등 DDL문은 실행 즉시 암묵적 COMMIT(Implicit Commit) 이 발생. 따라서 진행 중인 트랜잭션이 있다면 DDL 실행 전에 COMMIT 또는 ROLLBACK을 먼저 해야 한다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-16 162002.png&quot; data-origin-width=&quot;568&quot; data-origin-height=&quot;403&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/k1bSX/dJMcaf1fbSj/1ltvL4LRxN67YyikTdcaOK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/k1bSX/dJMcaf1fbSj/1ltvL4LRxN67YyikTdcaOK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/k1bSX/dJMcaf1fbSj/1ltvL4LRxN67YyikTdcaOK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fk1bSX%2FdJMcaf1fbSj%2F1ltvL4LRxN67YyikTdcaOK%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;568&quot; height=&quot;403&quot; data-filename=&quot;스크린샷 2026-06-16 162002.png&quot; data-origin-width=&quot;568&quot; data-origin-height=&quot;403&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;h2 data-ke-size=&quot;size26&quot;&gt;트랜잭션의 4대 속성 (ACID)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;속성 이름 설명&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;A&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;원자성 (Atomicity)&lt;/td&gt;
&lt;td&gt;트랜잭션 내 모든 작업은 &lt;b&gt;전부 성공하거나 전부 취소&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;C&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;일관성 (Consistency)&lt;/td&gt;
&lt;td&gt;트랜잭션 전후 &lt;b&gt;데이터 무결성과 제약조건을 항상 만족&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;I&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;독립성 (Isolation)&lt;/td&gt;
&lt;td&gt;동시 실행되는 트랜잭션은 &lt;b&gt;서로 영향을 주지 않음&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;D&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;지속성 (Durability)&lt;/td&gt;
&lt;td&gt;COMMIT된 결과는 &lt;b&gt;시스템 장애가 발생해도 영구 보존&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  은행 이체 예시로 복습 A 계좌에서 B 계좌로 10만 원 이체 시:&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;원자성&lt;/b&gt;: A 출금 + B 입금이 둘 다 성공하거나, 둘 다 취소&lt;/li&gt;
&lt;li&gt;&lt;b&gt;일관성&lt;/b&gt;: 이체 전후 A+B 총액은 동일&lt;/li&gt;
&lt;li&gt;&lt;b&gt;독립성&lt;/b&gt;: 다른 사람의 이체가 이 거래를 방해하지 않음&lt;/li&gt;
&lt;li&gt;&lt;b&gt;지속성&lt;/b&gt;: 이체 완료 후 서버가 꺼져도 데이터는 보존&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;</description>
      <category>개발자 호소인/SQL</category>
      <author>리제 </author>
      <guid isPermaLink="true">https://bookstairs.tistory.com/69</guid>
      <comments>https://bookstairs.tistory.com/69#entry69comment</comments>
      <pubDate>Tue, 16 Jun 2026 15:46:29 +0900</pubDate>
    </item>
    <item>
      <title>[SQL]데이터베이스 정의어 DDL /SELECT SUBQUERY</title>
      <link>https://bookstairs.tistory.com/68</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;DDL - CREATE, ALTER, DROP&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;DDL이란?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DDL(Data Definition Language, &lt;b&gt;데이터 정의어&lt;/b&gt;)은 데이터베이스에서 &lt;b&gt;테이블, 뷰, 인덱스 등 객체의 구조를 정의&amp;middot;변경&amp;middot;삭제&lt;/b&gt;할 때 사용하는 SQL 명령어입니다.&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;구조(틀)&lt;/b&gt; 를 정의하는 언어입니다.&lt;/li&gt;
&lt;li&gt;실행 즉시 &lt;b&gt;자동 커밋(Auto Commit)&lt;/b&gt; 이 발생하므로 ROLLBACK이 불가능합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;명령어 역할&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;CREATE&lt;/td&gt;
&lt;td&gt;새 객체(테이블 등) 생성&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ALTER&lt;/td&gt;
&lt;td&gt;기존 객체 구조 변경&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DROP&lt;/td&gt;
&lt;td&gt;객체 완전 삭제&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TRUNCATE&lt;/td&gt;
&lt;td&gt;테이블 데이터 전체 삭제 (구조는 유지)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;⚠️ &lt;b&gt;DDL은 ROLLBACK이 안 된다&lt;/b&gt; DML(INSERT, UPDATE, DELETE)은 ROLLBACK으로 되돌릴 수 있지만, DDL(CREATE, ALTER, DROP)은 실행 즉시 확정되므로 &lt;b&gt;신중하게 실행&lt;/b&gt;해야 한다.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 data-path-to-node=&quot;1&quot; data-ke-size=&quot;size23&quot;&gt;데이터베이스 제약조건(Constraint) 요약표&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-path-to-node=&quot;2&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;제약조건&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;의미&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;특징&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;2,1,0,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;2,1,0,0&quot;&gt;NOT NULL&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;2,1,1,0&quot;&gt;빈칸 금지&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;2,1,2,0&quot;&gt;값이 반드시 입력되어야 함&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;2,2,0,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;2,2,0,0&quot;&gt;UNIQUE&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;2,2,1,0&quot;&gt;중복 금지&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;2,2,2,0&quot;&gt;데이터 값이 유일해야 함 (중복 불가)&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;2,3,0,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;2,3,0,0&quot;&gt;CHECK&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;2,3,1,0&quot;&gt;조건 검사&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;2,3,2,0&quot;&gt;입력되는 값의 범위를 제한함&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;2,4,0,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;2,4,0,0&quot;&gt;PRIMARY KEY&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;2,4,1,0&quot;&gt;행 고유 식별자&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;2,4,2,0&quot;&gt;NOT NULL + UNIQUE (대표 번호)&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;2,5,0,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;2,5,0,0&quot;&gt;FOREIGN KEY&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;2,5,1,0&quot;&gt;다른 테이블 참조&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;2,5,2,0&quot;&gt;다른 테이블과의 관계(연결고리)를 생성&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-path-to-node=&quot;2&quot; data-ke-size=&quot;size23&quot;&gt;&amp;lt; 데이터 타입 선택 기준 &amp;gt;&lt;/h3&gt;
&lt;p data-path-to-node=&quot;3&quot; data-ke-size=&quot;size16&quot;&gt;테이블을 만들 때 가장 중요한 것은 데이터를 어떤 '형태'로 저장할지 정하는 것&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;4&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;4,0,0&quot;&gt;INT (Integer)&lt;/b&gt;: 정수형 숫자 (예: 회원번호, 나이)&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;4,1,0&quot;&gt;VARCHAR(n) (Variable Character)&lt;/b&gt;: 길이가 변하는 문자열. n은 저장할 수 있는 &lt;b data-index-in-node=&quot;58&quot; data-path-to-node=&quot;4,1,0&quot;&gt;최대 길이&lt;/b&gt;&amp;nbsp;(예: 아이디, 이름, 이메일)&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;4,2,0&quot;&gt;DATETIME&lt;/b&gt;: 날짜와 시간을 동시에 저장할 때 사용. (예: 생성일, 수정일)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-path-to-node=&quot;5&quot; data-ke-size=&quot;size23&quot;&gt;&amp;lt;제약조건 (Constraints) - &quot;데이터 품질 관리&quot; &amp;gt;&lt;/h3&gt;
&lt;p data-path-to-node=&quot;6&quot; data-ke-size=&quot;size16&quot;&gt;단순히 그릇을 만드는 것보다 중요한 것이 '잘못된 데이터가 들어오지 못하게 막는 것'&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-15 164928.png&quot; data-origin-width=&quot;935&quot; data-origin-height=&quot;248&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bkFTHx/dJMcajvPFR7/oVNdrEDWER1wBF0xtrxt11/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bkFTHx/dJMcajvPFR7/oVNdrEDWER1wBF0xtrxt11/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bkFTHx/dJMcajvPFR7/oVNdrEDWER1wBF0xtrxt11/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbkFTHx%2FdJMcajvPFR7%2FoVNdrEDWER1wBF0xtrxt11%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;935&quot; height=&quot;248&quot; data-filename=&quot;스크린샷 2026-06-15 164928.png&quot; data-origin-width=&quot;935&quot; data-origin-height=&quot;248&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;h3 data-path-to-node=&quot;8&quot; data-ke-size=&quot;size23&quot;&gt;테이블 설계 시 팁&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-path-to-node=&quot;8&quot;&gt;&lt;b&gt;PK(기본키)는 항상 정할 것&lt;/b&gt;: 어떤 데이터를 유일하게 식별할지(보통 번호) 지정해야 나중에 데이터를 찾거나 수정하기 편하다&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,1,0&quot;&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li data-path-to-node=&quot;8&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,1,0&quot;&gt;NOT NULL을 적극 활용할 것&lt;/b&gt;: 이름이나 아이디처럼 꼭 있어야 하는 컬럼에는 NOT NULL을 걸어서 데이터 누락을 방지.&lt;/li&gt;
&lt;li data-path-to-node=&quot;8&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,2,0&quot;&gt;최적의 사이즈 설정&lt;/b&gt;: VARCHAR(5000)처럼 무조건 크게 잡으면 메모리를 낭비합니다. 들어올 데이터의 예상 크기보다 약간 여유 있게 잡는 것이 좋다.&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;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-path-to-node=&quot;3,1,0&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;비교(CHAR vs VARCHAR):&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;3,1,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;CHAR(30): 5글자만 넣어도 &lt;b data-index-in-node=&quot;19&quot; data-path-to-node=&quot;3,1,1,0,0&quot;&gt;무조건 30만큼의 공간을 다 차지&lt;/b&gt;&amp;nbsp;(고정 길이)&lt;/li&gt;
&lt;li&gt;VARCHAR(30): 5글자만 넣으면 &lt;b data-index-in-node=&quot;22&quot; data-path-to-node=&quot;3,1,1,1,0&quot;&gt;5글자만큼의 공간만 차지&lt;/b&gt;&amp;nbsp;(가변 길이)&lt;/li&gt;
&lt;li&gt;VARCHAR는 글자 길이에 따라 저장 공간을 알아서 조절하는 똑똑한 자료형&lt;/li&gt;
&lt;li&gt;VARCHAR(n)에서 n은 '최대 글자 수'를 의미&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;제약조건의 특징과 사용하는 이유&lt;/b&gt;&lt;/h4&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-path-to-node=&quot;4&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;제약조건&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;비유&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;설명&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;4,1,0,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;4,1,0,0&quot;&gt;NOT NULL&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;4,1,1,0&quot;&gt;&quot;빈칸 금지&quot;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;4,1,2,0&quot;&gt;이름이나 이메일처럼 꼭 채워야 하는 칸에 빈 값을 넣지 못하게 한다.&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;4,2,0,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;4,2,0,0&quot;&gt;UNIQUE&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;4,2,1,0&quot;&gt;&quot;중복 금지&quot;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;4,2,2,0&quot;&gt;아이디나 전화번호처럼 고유해야 하는 정보가 똑같은 게 두 번 들어오지 못하게 한다.&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;4,3,0,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;4,3,0,0&quot;&gt;CHECK&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;4,3,1,0&quot;&gt;&quot;조건 필터&quot;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;4,3,2,0&quot;&gt;나이는 0보다 커야 한다거나, 성별은 '남' 아니면 '여'여야 한다는 식의 범위를 정한다.&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;4,4,0,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;4,4,0,0&quot;&gt;PRIMARY KEY&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;4,4,1,0&quot;&gt;&quot;주민등록번호&quot;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;4,4,2,0&quot;&gt;테이블 내에서 이 행을 유일하게 찾아낼 수 있는 '대표 번호'. (NULL 불가 + 중복 불가)&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;4,5,0,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;4,5,0,0&quot;&gt;FOREIGN KEY&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;4,5,1,0&quot;&gt;&quot;연결고리&quot;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;4,5,2,0&quot;&gt;&amp;nbsp;테이블의 데이터가 다른 테이블에 실제로 존재하는지 확인하여 관계를 맺는다&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&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 data-index-in-node=&quot;0&quot; data-path-to-node=&quot;7,0,0&quot;&gt;데이터 무결성(Data Integrity) 보장&lt;/b&gt;: 잘못된 데이터(예: 나이가 -5살, 이름이 없음)가 들어오는 것을 원천 차단&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;7,1,0&quot;&gt;데이터 신뢰도 상승&lt;/b&gt;: 데이터가 규칙에 맞게 저장되어 있으므로, 나중에 데이터를 조회하거나 분석할 때 정확한 결과가 나옴&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;7,2,0&quot;&gt;실수 방지&lt;/b&gt;: 데이터베이스 시스템이 직접 규칙을 검사하므로, 사람이 입력할 때 발생하는 실수를 자동으로 잡아줌&lt;/li&gt;
&lt;/ul&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;스크린샷 2026-06-15 171845.png&quot; data-origin-width=&quot;908&quot; data-origin-height=&quot;183&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zDZiS/dJMcah5TVfy/KLpmY2dCdVVa6TXntejmL1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zDZiS/dJMcah5TVfy/KLpmY2dCdVVa6TXntejmL1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zDZiS/dJMcah5TVfy/KLpmY2dCdVVa6TXntejmL1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzDZiS%2FdJMcah5TVfy%2FKLpmY2dCdVVa6TXntejmL1%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;908&quot; height=&quot;183&quot; data-filename=&quot;스크린샷 2026-06-15 171845.png&quot; data-origin-width=&quot;908&quot; data-origin-height=&quot;183&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&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;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;서브쿼리 (Subquery)&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; 서브쿼리(Subquery)란, SQL문 안에 &lt;b&gt;포함된 또 다른 SELECT 문&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;b&gt;필요한 값을 보조적으로 제공&lt;/b&gt;하는 역할&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,0,0&quot;&gt;한 번에 해결 안 되는 문제 해결&lt;/b&gt;: &quot;평균보다 많이 받는 사람&quot;을 찾으려면, 일단 '평균'을 먼저 계산해야 합니다. 계산한 결과가 나와야 필터링을 할 수 있죠. 이 &lt;b data-index-in-node=&quot;92&quot; data-path-to-node=&quot;9,0,0&quot;&gt;단계적 처리&lt;/b&gt;를 가능하게 해준다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,1,0&quot;&gt;복잡한 코드의 단순화&lt;/b&gt;: 만약 서브쿼리가 없다면, 평균을 구하는 쿼리를 따로 실행해서 그 값을 메모장에 적어두고, 다시 그 값을 메인 쿼리에 직접 입력해야 한다. 서브쿼리는 이 과정을 한 줄로 처리해 준다.&lt;/li&gt;
&lt;/ul&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;스크린샷 2026-06-15 163144.png&quot; data-origin-width=&quot;735&quot; data-origin-height=&quot;367&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/StlMe/dJMcagskOFk/uhFudedbaG9rySYITmgXN1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/StlMe/dJMcagskOFk/uhFudedbaG9rySYITmgXN1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/StlMe/dJMcagskOFk/uhFudedbaG9rySYITmgXN1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FStlMe%2FdJMcagskOFk%2FuhFudedbaG9rySYITmgXN1%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;735&quot; height=&quot;367&quot; data-filename=&quot;스크린샷 2026-06-15 163144.png&quot; data-origin-width=&quot;735&quot; data-origin-height=&quot;367&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;메인 쿼리가 하기 복잡하거나 모르는 정보를 먼저 처리해서 답을 가져다주는 역할을 하는 것이 바로 서브쿼리&lt;/p&gt;
&lt;div data-ved=&quot;0CAAQhtANahgKEwiDuZCGzIiVAxUAAAAAHQAAAAAQxwI&quot; data-hveid=&quot;0&quot;&gt;
&lt;div&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-15 170830.png&quot; data-origin-width=&quot;820&quot; data-origin-height=&quot;579&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bbQmC2/dJMcadPQZNq/SbNUPiKVHkqqdZ7OKSmsX1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bbQmC2/dJMcadPQZNq/SbNUPiKVHkqqdZ7OKSmsX1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bbQmC2/dJMcadPQZNq/SbNUPiKVHkqqdZ7OKSmsX1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbbQmC2%2FdJMcadPQZNq%2FSbNUPiKVHkqqdZ7OKSmsX1%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;820&quot; height=&quot;579&quot; data-filename=&quot;스크린샷 2026-06-15 170830.png&quot; data-origin-width=&quot;820&quot; data-origin-height=&quot;579&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;br /&gt;
&lt;div&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-15 163426.png&quot; data-origin-width=&quot;928&quot; data-origin-height=&quot;181&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/loVhg/dJMcajvPENI/8bmSo1kPnAalplkoKjr80k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/loVhg/dJMcajvPENI/8bmSo1kPnAalplkoKjr80k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/loVhg/dJMcajvPENI/8bmSo1kPnAalplkoKjr80k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FloVhg%2FdJMcajvPENI%2F8bmSo1kPnAalplkoKjr80k%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;928&quot; height=&quot;181&quot; data-filename=&quot;스크린샷 2026-06-15 163426.png&quot; data-origin-width=&quot;928&quot; data-origin-height=&quot;181&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-path-to-node=&quot;2&quot; data-ke-size=&quot;size23&quot;&gt;상세 설명&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;3&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;3,0,0&quot;&gt;CREATE TABLE TB_DEPT&lt;/b&gt;: TB_DEPT라는 이름의 새로운 테이블을 만드는 명령어&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;3,1,0&quot;&gt;DEPT_CD INT PRIMARY KEY&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;3,1,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;정수형은 INT 사용&lt;/li&gt;
&lt;li&gt;기본키(Primary Key)는 테이블의 각 행을 유일하게 식별하는 기준이 되므로 PRIMARY KEY 제약조건을 붙인다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;3,2,0&quot;&gt;DEPT_NAME VARCHAR(30) NOT NULL&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;3,2,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;가변 문자열은 VARCHAR를 사용합니다. 30은 최대 길이를 의미&lt;/li&gt;
&lt;li&gt;값이 반드시 존재해야 하므로 NOT NULL 제약조건을 추가&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-path-to-node=&quot;4&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;4&quot;&gt;참고:&lt;/b&gt; 데이터베이스 엔진(MySQL 등)에 따라&lt;/p&gt;
&lt;p data-path-to-node=&quot;4&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1781509037799&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT 컬럼명
FROM 테이블명
WHERE 컬럼명 비교연산자 (
    SELECT 컬럼명       -- 서브쿼리 (괄호 안)
    FROM 테이블명
    WHERE 조건
);&lt;/code&gt;&lt;/pre&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;스크린샷 2026-06-15 163426.png&quot; data-origin-width=&quot;928&quot; data-origin-height=&quot;181&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cqlwO5/dJMcadoMbwL/NK7JjZjw4ROEXplAur3cRk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cqlwO5/dJMcadoMbwL/NK7JjZjw4ROEXplAur3cRk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cqlwO5/dJMcadoMbwL/NK7JjZjw4ROEXplAur3cRk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcqlwO5%2FdJMcadoMbwL%2FNK7JjZjw4ROEXplAur3cRk%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;928&quot; height=&quot;181&quot; data-filename=&quot;스크린샷 2026-06-15 163426.png&quot; data-origin-width=&quot;928&quot; data-origin-height=&quot;181&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-15 170932.png&quot; data-origin-width=&quot;757&quot; data-origin-height=&quot;530&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c2kp4O/dJMcaa6LTeq/PJVGkqFC224lSlT21aHji1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c2kp4O/dJMcaa6LTeq/PJVGkqFC224lSlT21aHji1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c2kp4O/dJMcaa6LTeq/PJVGkqFC224lSlT21aHji1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc2kp4O%2FdJMcaa6LTeq%2FPJVGkqFC224lSlT21aHji1%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;757&quot; height=&quot;530&quot; data-filename=&quot;스크린샷 2026-06-15 170932.png&quot; data-origin-width=&quot;757&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-15 174032.png&quot; data-origin-width=&quot;880&quot; data-origin-height=&quot;403&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/DEDW2/dJMcad3oFBi/xSxZMlDlZ329hblgIHkHv1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/DEDW2/dJMcad3oFBi/xSxZMlDlZ329hblgIHkHv1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/DEDW2/dJMcad3oFBi/xSxZMlDlZ329hblgIHkHv1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDEDW2%2FdJMcad3oFBi%2FxSxZMlDlZ329hblgIHkHv1%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;880&quot; height=&quot;403&quot; data-filename=&quot;스크린샷 2026-06-15 174032.png&quot; data-origin-width=&quot;880&quot; data-origin-height=&quot;403&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>개발자 호소인/SQL</category>
      <author>리제 </author>
      <guid isPermaLink="true">https://bookstairs.tistory.com/68</guid>
      <comments>https://bookstairs.tistory.com/68#entry68comment</comments>
      <pubDate>Mon, 15 Jun 2026 16:34:36 +0900</pubDate>
    </item>
    <item>
      <title>[강릉] 독서하기 좋은 곳 : 한길서가</title>
      <link>https://bookstairs.tistory.com/67</link>
      <description>&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;4284&quot; data-origin-height=&quot;5712&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bexaXp/dJMcagTo9Iv/DiQzGkTrI5DNCY7DdfVB31/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bexaXp/dJMcagTo9Iv/DiQzGkTrI5DNCY7DdfVB31/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bexaXp/dJMcagTo9Iv/DiQzGkTrI5DNCY7DdfVB31/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbexaXp%2FdJMcagTo9Iv%2FDiQzGkTrI5DNCY7DdfVB31%2Fimg.jpg&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;4284&quot; height=&quot;5712&quot; data-origin-width=&quot;4284&quot; data-origin-height=&quot;5712&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;4284&quot; data-origin-height=&quot;5712&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/AJhON/dJMcaayTPxn/DHzbmR8t8bZMJ4TnFUOtz0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/AJhON/dJMcaayTPxn/DHzbmR8t8bZMJ4TnFUOtz0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/AJhON/dJMcaayTPxn/DHzbmR8t8bZMJ4TnFUOtz0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAJhON%2FdJMcaayTPxn%2FDHzbmR8t8bZMJ4TnFUOtz0%2Fimg.jpg&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;4284&quot; height=&quot;5712&quot; data-origin-width=&quot;4284&quot; data-origin-height=&quot;5712&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: left;&quot;&gt;네이버 지도엔 한길서가라고 쳐도 나오지 않는다.&lt;br&gt;왜일까. &lt;br&gt;대신 테라로사 로 검색하면 나온다.&lt;br&gt;&lt;br&gt;[네이버지도]&lt;br&gt;테라로사 경포호수점&lt;br&gt;강원 강릉시 난설헌로 145 &lt;br&gt;&lt;a href=&quot;https://naver.me/5yhxVx9E&quot; target=&quot;_blank&quot;&gt;&lt;span&gt;https://naver.me/5yhxVx9E&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;figure data-ke-type=&quot;opengraph&quot; data-og-title=&quot;네이버지도&quot; data-ke-align=&quot;alignCenter&quot; data-og-description=&quot;테라로사 경포호수점&quot; data-og-host=&quot;map.naver.com&quot; data-og-source-url=&quot;https://map.naver.com/p/entry/place/1097742719&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/LemPg/dJMb83kBuRO/O8qeFpGGJr7V2Mbg5DKik0/img.jpg?width=256&amp;amp;height=256&amp;amp;face=0_0_256_256&quot; data-og-url=&quot;https://map.naver.com/p/entry/place/1097742719&quot;&gt;&lt;a href=&quot;https://map.naver.com/p/entry/place/1097742719&quot; target=&quot;_blank&quot; data-source-url=&quot;https://map.naver.com/p/entry/place/1097742719&quot;&gt;&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/LemPg/dJMb83kBuRO/O8qeFpGGJr7V2Mbg5DKik0/img.jpg?width=256&amp;amp;height=256&amp;amp;face=0_0_256_256')&quot;&gt; &lt;/div&gt;&lt;div class=&quot;og-text&quot;&gt;&lt;p class=&quot;og-title&quot;&gt;네이버지도&lt;/p&gt;&lt;p class=&quot;og-desc&quot;&gt;테라로사 경포호수점&lt;/p&gt;&lt;p class=&quot;og-host&quot;&gt;map.naver.com&lt;/p&gt;&lt;/div&gt;&lt;/a&gt;&lt;/figure&gt;&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: left;&quot;&gt;이곳은 강릉 테라로사 경포호수점인데 한길사와 콜라보를 한 곳이다. 2019년부터 운영하고 있으며, &lt;br&gt;3층 공간은 한길사 책으로만 꾸며져 있다.&lt;br&gt;커피를 마시며 책도 읽 을 수 있고,도서 구매도 가능.&lt;br&gt;&lt;br&gt;&lt;br&gt;왜 한길서가는 이렇게 멋지게 지어놓고&lt;br&gt;홈페이지나 인스타 관리는 안하는 걸까.&lt;br&gt;인스타는 계정자체가 없어서 갔다온 후기만 많은 곳&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;4284&quot; data-origin-height=&quot;5712&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dTHFHL/dJMcaayTPxr/rTilW7VfsJ15HFlAG0KFN1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dTHFHL/dJMcaayTPxr/rTilW7VfsJ15HFlAG0KFN1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dTHFHL/dJMcaayTPxr/rTilW7VfsJ15HFlAG0KFN1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdTHFHL%2FdJMcaayTPxr%2FrTilW7VfsJ15HFlAG0KFN1%2Fimg.jpg&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;4284&quot; height=&quot;5712&quot; data-origin-width=&quot;4284&quot; data-origin-height=&quot;5712&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: left;&quot;&gt;비가 왔다.&lt;br&gt;그럼 모든 색들이 더 선명해지지.&lt;br&gt;해가 들어 젖은 테이블을 말리기 시작했다&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;4032&quot; data-origin-height=&quot;2268&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b4WmOU/dJMcadCfGfM/EmryrQyxPBFMr3WhGXb0cK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b4WmOU/dJMcadCfGfM/EmryrQyxPBFMr3WhGXb0cK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b4WmOU/dJMcadCfGfM/EmryrQyxPBFMr3WhGXb0cK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb4WmOU%2FdJMcadCfGfM%2FEmryrQyxPBFMr3WhGXb0cK%2Fimg.jpg&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;4032&quot; height=&quot;2268&quot; data-origin-width=&quot;4032&quot; data-origin-height=&quot;2268&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: left;&quot;&gt;압도적인 스케일, 권위가 느껴지는 책장을 등지고 태연하게 커피를 만들고 있는 바리스타들.&lt;br&gt;메뉴가 생각보다 많았다. 선물용으로 포장되어있는 원두도 있었다. &lt;br&gt;&lt;br&gt;&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;4284&quot; data-origin-height=&quot;5712&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/buJKGI/dJMcaayTPxs/DDApNTna18mjoKnJJgqao0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/buJKGI/dJMcaayTPxs/DDApNTna18mjoKnJJgqao0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/buJKGI/dJMcaayTPxs/DDApNTna18mjoKnJJgqao0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbuJKGI%2FdJMcaayTPxs%2FDDApNTna18mjoKnJJgqao0%2Fimg.jpg&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;4284&quot; height=&quot;5712&quot; data-origin-width=&quot;4284&quot; data-origin-height=&quot;5712&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: left;&quot;&gt;층과 층을 오고갈때 인테리어들이 바뀐다.&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;4032&quot; data-origin-height=&quot;3024&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nqUEl/dJMcadCfGfP/hWjMuYPp1jw35FGWiMjUhk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nqUEl/dJMcadCfGfP/hWjMuYPp1jw35FGWiMjUhk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nqUEl/dJMcadCfGfP/hWjMuYPp1jw35FGWiMjUhk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnqUEl%2FdJMcadCfGfP%2FhWjMuYPp1jw35FGWiMjUhk%2Fimg.jpg&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;4032&quot; height=&quot;3024&quot; data-origin-width=&quot;4032&quot; data-origin-height=&quot;3024&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: left;&quot;&gt;여긴 서점 &lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;5712&quot; data-origin-height=&quot;4284&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bAJHhG/dJMcadCfGfO/iiYDfsRy1UtIlBuk5ZQfn1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bAJHhG/dJMcadCfGfO/iiYDfsRy1UtIlBuk5ZQfn1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bAJHhG/dJMcadCfGfO/iiYDfsRy1UtIlBuk5ZQfn1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbAJHhG%2FdJMcadCfGfO%2FiiYDfsRy1UtIlBuk5ZQfn1%2Fimg.jpg&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;5712&quot; height=&quot;4284&quot; data-origin-width=&quot;5712&quot; data-origin-height=&quot;4284&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: left;&quot;&gt;식물관련 책들이 많다.&lt;br&gt;이런곳에가면&amp;nbsp;&amp;nbsp;굿즈같은 것들을 종종 파는데 &lt;br&gt;여기는 그렇게 임펙트 있는 굿즈들이 없어서 사지는 않았다. 깔&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2376&quot; data-origin-height=&quot;4224&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/otw4C/dJMcaayTPxo/kzuWdMDODQQBXteLW3i3Ak/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/otw4C/dJMcaayTPxo/kzuWdMDODQQBXteLW3i3Ak/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/otw4C/dJMcaayTPxo/kzuWdMDODQQBXteLW3i3Ak/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fotw4C%2FdJMcaayTPxo%2FkzuWdMDODQQBXteLW3i3Ak%2Fimg.jpg&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;2376&quot; height=&quot;4224&quot; data-origin-width=&quot;2376&quot; data-origin-height=&quot;4224&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2376&quot; data-origin-height=&quot;4224&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/V6502/dJMcaayTPxq/Q7lQPK9fUePvEKbsMId9Xk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/V6502/dJMcaayTPxq/Q7lQPK9fUePvEKbsMId9Xk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/V6502/dJMcaayTPxq/Q7lQPK9fUePvEKbsMId9Xk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FV6502%2FdJMcaayTPxq%2FQ7lQPK9fUePvEKbsMId9Xk%2Fimg.jpg&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;2376&quot; height=&quot;4224&quot; data-origin-width=&quot;2376&quot; data-origin-height=&quot;4224&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2376&quot; data-origin-height=&quot;4224&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bBPh1Y/dJMcadCfGfR/W8wnNHZnQSyiN3aEbL2vrK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bBPh1Y/dJMcadCfGfR/W8wnNHZnQSyiN3aEbL2vrK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bBPh1Y/dJMcadCfGfR/W8wnNHZnQSyiN3aEbL2vrK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbBPh1Y%2FdJMcadCfGfR%2FW8wnNHZnQSyiN3aEbL2vrK%2Fimg.jpg&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;2376&quot; height=&quot;4224&quot; data-origin-width=&quot;2376&quot; data-origin-height=&quot;4224&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2376&quot; data-origin-height=&quot;4224&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pfjVM/dJMcadCfGfU/cMK4sAlWw7nqh4rhSCZHfk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pfjVM/dJMcadCfGfU/cMK4sAlWw7nqh4rhSCZHfk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pfjVM/dJMcadCfGfU/cMK4sAlWw7nqh4rhSCZHfk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpfjVM%2FdJMcadCfGfU%2FcMK4sAlWw7nqh4rhSCZHfk%2Fimg.jpg&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;2376&quot; height=&quot;4224&quot; data-origin-width=&quot;2376&quot; data-origin-height=&quot;4224&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: left;&quot;&gt;아늑한 공간처럼 꾸며놓았지만, 확실히 상업적인 곳&lt;br&gt;그럼에도 나쁘지 않았고, 두어시간 책만 보며 재미있게 놀았다.&lt;br&gt;내가 읽은 책은 &lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;4284&quot; data-origin-height=&quot;5712&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HOmRm/dJMcaf7YaWg/FfhKQf9F0qCOylEonn0i2k/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HOmRm/dJMcaf7YaWg/FfhKQf9F0qCOylEonn0i2k/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HOmRm/dJMcaf7YaWg/FfhKQf9F0qCOylEonn0i2k/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHOmRm%2FdJMcaf7YaWg%2FFfhKQf9F0qCOylEonn0i2k%2Fimg.jpg&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;4284&quot; height=&quot;5712&quot; data-origin-width=&quot;4284&quot; data-origin-height=&quot;5712&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: left;&quot;&gt;영원한 천국…&lt;br&gt;아쉽게도 정유정 작가 책중에서 제일 실망스러웠다.&lt;br&gt;제목이 내용에 비해 거창하고 극중 캐릭터가&lt;br&gt;매력을 다 못보여주고 끝난느낌.&lt;br&gt;그치만 ‘새’가 등장하는 작품은 그냥 다 좋다.&lt;br&gt;그래서 ? 이 책도 분위기 합격 ㅎㅎ&lt;br&gt;&lt;br&gt;&lt;/p&gt;</description>
      <category>개발자 호소인/SQL</category>
      <author>리제 </author>
      <guid isPermaLink="true">https://bookstairs.tistory.com/67</guid>
      <comments>https://bookstairs.tistory.com/67#entry67comment</comments>
      <pubDate>Sat, 13 Jun 2026 10:02:28 +0900</pubDate>
    </item>
    <item>
      <title>[SQL] 서브쿼리 ( Subquery )</title>
      <link>https://bookstairs.tistory.com/66</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp; &amp;nbsp; 서브쿼리Subquery&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; SQL문 안에 &lt;b&gt;포함된 또 다른 SELECT 문&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;b&gt;필요한 값을 보조적으로 제공&lt;/b&gt;하는 역할&lt;/li&gt;
&lt;li&gt;WHERE, FROM, HAVING, SELECT 절 어디서든 사용가능&lt;/li&gt;
&lt;li&gt;실행 흐름: &lt;b&gt;서브쿼리가 먼저 실행되고&lt;/b&gt;, 그 결과가 메인 쿼리에 전달&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-12 164412.png&quot; data-origin-width=&quot;835&quot; data-origin-height=&quot;565&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ApCW3/dJMcaftopjt/TANkpvfGaZHdOCu5vP16i0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ApCW3/dJMcaftopjt/TANkpvfGaZHdOCu5vP16i0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ApCW3/dJMcaftopjt/TANkpvfGaZHdOCu5vP16i0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FApCW3%2FdJMcaftopjt%2FTANkpvfGaZHdOCu5vP16i0%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;835&quot; height=&quot;565&quot; data-filename=&quot;스크린샷 2026-06-12 164412.png&quot; data-origin-width=&quot;835&quot; data-origin-height=&quot;565&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;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-path-to-node=&quot;3&quot; data-ke-size=&quot;size23&quot;&gt;서브쿼리의 종류 (결과값의 형태에 따른 분류)&lt;/h3&gt;
&lt;p data-path-to-node=&quot;4&quot; data-ke-size=&quot;size16&quot;&gt;서브쿼리는 반환되는 결과값의 행(row) 수와 열(column) 수에 따라 크게 3가지로 나뉠 수 있다.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 84px;&quot; border=&quot;1&quot; data-path-to-node=&quot;5&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;&lt;b&gt;분류&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;&lt;b&gt;결과 형태&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;&lt;b&gt;특징 및 사용법&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;&lt;span data-path-to-node=&quot;5,1,0,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;5,1,0,0&quot;&gt;단일행 서브쿼리&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;&lt;span data-path-to-node=&quot;5,1,1,0&quot;&gt;1행 1열&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;&lt;span data-path-to-node=&quot;5,1,2,0&quot;&gt;결과값이 &lt;b data-index-in-node=&quot;5&quot; data-path-to-node=&quot;5,1,2,0&quot;&gt;딱 하나&lt;/b&gt; =, &amp;gt;, &amp;lt; 등 일반 비교 연산자 사용 가능&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;&lt;span data-path-to-node=&quot;5,2,0,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;5,2,0,0&quot;&gt;다중행 서브쿼리&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;&lt;span data-path-to-node=&quot;5,2,1,0&quot;&gt;N행 1열&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;&lt;span data-path-to-node=&quot;5,2,2,0&quot;&gt;결과값이 &lt;b data-index-in-node=&quot;5&quot; data-path-to-node=&quot;5,2,2,0&quot;&gt;여러 행&lt;/b&gt;. IN, ANY, ALL, EXISTS 등 집합 연산자 사용 필수&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;&lt;span data-path-to-node=&quot;5,3,0,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;5,3,0,0&quot;&gt;다중열 서브쿼리&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;&lt;span data-path-to-node=&quot;5,3,1,0&quot;&gt;N행 N열&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;&lt;span data-path-to-node=&quot;5,3,2,0&quot;&gt;결과값이 &lt;b data-index-in-node=&quot;5&quot; data-path-to-node=&quot;5,3,2,0&quot;&gt;여러 행과 여러 열&lt;/b&gt;. 주로 여러 컬럼을 동시에 비교할 때 사용&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div data-ved=&quot;0CAAQhtANahgKEwj0zvL2rICVAxUAAAAAHQAAAAAQmgQ&quot; data-hveid=&quot;0&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-12 165050.png&quot; data-origin-width=&quot;957&quot; data-origin-height=&quot;331&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/D4r77/dJMcaiKnyYx/9CZUaXK3fkuehgvPUkbhk1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/D4r77/dJMcaiKnyYx/9CZUaXK3fkuehgvPUkbhk1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/D4r77/dJMcaiKnyYx/9CZUaXK3fkuehgvPUkbhk1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FD4r77%2FdJMcaiKnyYx%2F9CZUaXK3fkuehgvPUkbhk1%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;957&quot; height=&quot;331&quot; data-filename=&quot;스크린샷 2026-06-12 165050.png&quot; data-origin-width=&quot;957&quot; data-origin-height=&quot;331&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div data-ved=&quot;0CAAQhtANahgKEwj0zvL2rICVAxUAAAAAHQAAAAAQmwQ&quot; data-hveid=&quot;0&quot;&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div data-ved=&quot;0CAAQhtANahgKEwj0zvL2rICVAxUAAAAAHQAAAAAQnAQ&quot; data-hveid=&quot;0&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;965&quot; data-origin-height=&quot;662&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/LFxjZ/dJMcahrgeLx/d6IEHbihJy0bsSLAgKR351/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/LFxjZ/dJMcahrgeLx/d6IEHbihJy0bsSLAgKR351/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/LFxjZ/dJMcahrgeLx/d6IEHbihJy0bsSLAgKR351/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLFxjZ%2FdJMcahrgeLx%2Fd6IEHbihJy0bsSLAgKR351%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;965&quot; height=&quot;662&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;965&quot; data-origin-height=&quot;662&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;h2 data-ke-size=&quot;size26&quot;&gt;쿼리 실행 논리 순서 (단계별 풀이)&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;b&gt;문제 : 직급이 '과장'인 사원들 중 어느 한 명의 급여보다라도 더 많이 받는 '대리' 사원 조회&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;1단계: 서브쿼리 실행 (비교 대상 확보)&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;
&lt;pre id=&quot;code_1781251945694&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;(SELECT salary FROM employee JOIN job USING (job_code) WHERE job_name = '과장')&lt;/code&gt;&lt;/pre&gt;
&lt;span style=&quot;color: #9d9d9d;&quot;&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt; &lt;span style=&quot;background-color: #fcfcfc; color: #9d9d9d; text-align: left;&quot;&gt;메인 쿼리를 실행하기 전에, 먼저 괄호 안의 서브쿼리가 실행&lt;br /&gt;&lt;br /&gt;&lt;/span&gt; &lt;/span&gt;&lt;/span&gt;
&lt;p data-path-to-node=&quot;7&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;2단계: 메인 테이블 로드 및 조인 (FROM &amp;amp; JOIN)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;div data-ved=&quot;0CAAQhtANahgKEwj0zvL2rICVAxUAAAAAHQAAAAAQ-QQ&quot; data-hveid=&quot;0&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;FROM employee JOIN job USING (job_code)&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;employee 테이블과 job 테이블을 job_code를 기준으로 합침&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;3단계: 1차 필터링 (WHERE - 메인 조건)&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1781252031197&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;WHERE job_name = '대리'&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;합쳐진 전체 사원 데이터 중에서 직급이 '대리'인 사람만 남기고 나머지는 모두 버린다&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;4단계: 2차 필터링 및 조건 비교 (AND salary &amp;gt; ANY)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1781252095390&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;AND salary &amp;gt; ANY (...)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;3단계에서 남은 '대리'들의 급여를 하나씩 꺼내어, 1단계에서 확보한 '과장' 급여 리스트와 비교&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;15,1,0&quot;&gt;작동 원리&lt;/b&gt;: ANY는 &quot;과장들의 급여 중 어느 하나보다만 크면 참(True)&quot;으로 판단&lt;br /&gt;즉, 과장 급여들 중 가장 작은 값보다만 크면 조건이 성립&lt;/p&gt;
&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt; 5단계: 최종 결과 출력 (SELECT)&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;/b&gt;
&lt;pre id=&quot;code_1781252183366&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT emp_name, job_name, salary&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 조건들을 모두 통과한(과장들 중 최소 급여를 받는 사람보다 많은 급여를 받는 대리들) 행들만 골라내어&lt;br /&gt;최종적으로 이름, 직급명, 급여를 화면에 보여준다.&lt;br /&gt;&lt;br /&gt;답:&lt;/p&gt;
&lt;pre id=&quot;code_1781252250742&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;select emp_name, job_name, salary

from employee

join job using(job_code)

where job_name = '대리'

  and salary &amp;gt; any (select salary

from employee

join job using (job_code)

where job_name = '과장');&lt;/code&gt;&lt;/pre&gt;
&lt;/blockquote&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;&amp;lt;실습&amp;gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Q. 노옹철 사원과 같은 부서에 속한 사원을 조회&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;b&gt;A: &lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;-- 1. 메인 쿼리에서 가져올 대상 컬럼 선택&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #409d00;&quot;&gt; SELECT&lt;/span&gt; emp_name, dept_code&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;-- 2. 데이터가 담긴 원본 테이블 지정&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #409d00;&quot;&gt;&amp;nbsp;FROM&lt;/span&gt; employee&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&lt;span style=&quot;color: #9d9d9d;&quot;&gt;- 3. 조건 지정 (부서 코드가 '노옹철의 부서'와 같은 행만 필터링) &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #409d00;&quot;&gt;WHERE&lt;/span&gt; dept_code &lt;span&gt;=&amp;nbsp; &amp;nbsp; &amp;nbsp;( &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;-- 4. 서브쿼리가 먼저 실행되어 노옹철의 부서 코드를 찾아옴 &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&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; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span style=&quot;color: #f89009;&quot;&gt;SELECT&lt;/span&gt;&lt;/span&gt; dept_code&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&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; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span style=&quot;color: #f89009;&quot;&gt; FROM&lt;/span&gt;&lt;/span&gt; employee&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&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; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span style=&quot;color: #f89009;&quot;&gt;WHERE&lt;/span&gt;&lt;/span&gt; emp_name &lt;span&gt;=&lt;/span&gt; &lt;span&gt;'노옹철'&lt;/span&gt; &lt;span&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt; Q. &amp;nbsp;직급이&amp;nbsp;'과장'인&amp;nbsp;사원들&amp;nbsp;중&amp;nbsp;어느&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;/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&gt;A:&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #409d00;&quot;&gt;select&lt;/span&gt; emp_name, job_name, salary &lt;span style=&quot;color: #9d9d9d;&quot;&gt;---1. 최종적으로 출력할 정보들을 명시 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #409d00;&quot;&gt;from&amp;nbsp;&lt;/span&gt;employee&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;span style=&quot;color: #409d00;&quot;&gt;join&lt;/span&gt;&amp;nbsp;job&amp;nbsp;&lt;span style=&quot;color: #409d00;&quot;&gt;using&lt;/span&gt;(job_code)&amp;nbsp; &amp;nbsp;--&lt;span style=&quot;color: #9d9d9d;&quot;&gt;-2. 데이터 원본 테이블에 없음으로 job에서 코드를 쓸거다&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #409d00;&quot;&gt;where&lt;/span&gt; job_name = '대리' &lt;span style=&quot;color: #666666;&quot;&gt;-- 조회하려는 메인 대상인 '대리' 사원들을 필터링&lt;/span&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #409d00;&quot;&gt;and&lt;/span&gt;&amp;nbsp;salary&amp;nbsp;&amp;gt;&amp;nbsp;&lt;span style=&quot;color: #409d00;&quot;&gt;any&lt;/span&gt;&amp;nbsp;(&lt;span style=&quot;color: #f89009;&quot;&gt;select&lt;/span&gt; salary&amp;nbsp; -----&lt;span style=&quot;color: #a6bc00;&quot;&gt; AND&lt;/span&gt;&lt;span style=&quot;color: #666666;&quot;&gt;를 사용해 추가 필터 조건을 붙였고,&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&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; &amp;nbsp; &amp;nbsp; &amp;nbsp; &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;span style=&quot;color: #a6bc00;&quot;&gt;&amp;nbsp;ANY&lt;/span&gt; &lt;span style=&quot;color: #666666;&quot;&gt;연산자를 사용하여 '과장들의 급여 중 어느 하나라도'라는 비교 범위를 명시&lt;/span&gt; &lt;br /&gt;&lt;span style=&quot;color: #f89009;&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; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;from &lt;/span&gt;employee&lt;br /&gt;&lt;span style=&quot;color: #f89009;&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; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;join&lt;/span&gt;&amp;nbsp;job&amp;nbsp;&lt;span style=&quot;color: #f89009;&quot;&gt;using&lt;/span&gt;&amp;nbsp;(job_code)&lt;br /&gt;&lt;span style=&quot;color: #f89009;&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; &amp;nbsp; &amp;nbsp; &amp;nbsp; where&lt;/span&gt; job_name = '과장');&amp;nbsp; ---- &lt;span style=&quot;color: #666666;&quot;&gt;서브쿼리 내부에서 비교의 기준이 되는 '과장'들의 급여 데이터만 뽑아내겠다&lt;/span&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #666666;&quot;&gt;-- 회사 전체 사원의 평균 급여보다 같거나 많은 급여를 받는 사원들의 사번, 사원명, 급여를 조회하시오&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&amp;nbsp;select emp_no, enp_namem salary&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&amp;nbsp;from employee&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #666666;&quot;&gt;join&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;</description>
      <category>개발자 호소인/SQL</category>
      <author>리제 </author>
      <guid isPermaLink="true">https://bookstairs.tistory.com/66</guid>
      <comments>https://bookstairs.tistory.com/66#entry66comment</comments>
      <pubDate>Fri, 12 Jun 2026 18:04:41 +0900</pubDate>
    </item>
    <item>
      <title>[SQL] - join : 관계를 활용한 데이터 조회</title>
      <link>https://bookstairs.tistory.com/65</link>
      <description>&lt;p data-path-to-node=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;테이블 간의 연관 관계는 데이터베이스 설계의 핵심&lt;/p&gt;
&lt;p data-path-to-node=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1:1 관계 (One-to-One)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;한 레코드는 &lt;b&gt;다른 테이블의 한 레코드와만 연결, 논리적으로 서로 하나의 값만 가질 수 있음&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;드물지만 보안, 성능 등을 위해 테이블을 나누는 경우 사용함&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-path-to-node=&quot;4&quot; data-ke-size=&quot;size16&quot;&gt;한쪽 테이블의 데이터 1건이 다른 쪽 테이블의 데이터 1건과 정확히 1대1로 대응되는 관계&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;EMPLOYEEEMP_DETAIL&lt;/p&gt;
&lt;table id=&quot;37b435fc-bd9d-80bb-87bf-f9de77cb475e&quot; style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr id=&quot;37b435fc-bd9d-8022-b29d-de83dfa3c188&quot;&gt;
&lt;td id=&quot;HoQ]&quot;&gt;EMP_ID (PK)&lt;/td&gt;
&lt;td id=&quot;_c&amp;lt;Q&quot;&gt;EMP_ID (PK, FK)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr id=&quot;37b435fc-bd9d-80ef-a732-dc08feb136cd&quot;&gt;
&lt;td id=&quot;HoQ]&quot;&gt;EMP_NAME&lt;/td&gt;
&lt;td id=&quot;_c&amp;lt;Q&quot;&gt;ADDRESS&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-path-to-node=&quot;4&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-filename=&quot;스크린샷 2026-06-11 174051.png&quot; data-origin-width=&quot;828&quot; data-origin-height=&quot;152&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/coZKiO/dJMcabEvxxZ/3LDdMQGXa5yFMSfDNLhwq0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/coZKiO/dJMcabEvxxZ/3LDdMQGXa5yFMSfDNLhwq0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/coZKiO/dJMcabEvxxZ/3LDdMQGXa5yFMSfDNLhwq0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcoZKiO%2FdJMcabEvxxZ%2F3LDdMQGXa5yFMSfDNLhwq0%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;828&quot; height=&quot;152&quot; data-filename=&quot;스크린샷 2026-06-11 174051.png&quot; data-origin-width=&quot;828&quot; data-origin-height=&quot;152&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-path-to-node=&quot;4&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;4&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;4&quot; data-ke-size=&quot;size16&quot;&gt;원래는 한 테이블에 다 넣어도 되지만, '보안'이나 &lt;b data-index-in-node=&quot;42&quot; data-path-to-node=&quot;5,0,0&quot;&gt;'성능'&lt;/b&gt; 때문에 억지로 분리하는 경우가 많다&lt;/p&gt;
&lt;p data-path-to-node=&quot;4&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;4&quot; data-ke-size=&quot;size16&quot;&gt;사원 테이블(EMPLOYEE)에는 '이름'처럼 자주 조회하는 정보를 두고, 사원 상세 정보(EMP_DETAIL)에는 '주민번호', '급여'처럼 민감하거나 조회 빈도가 낮은 정보를 따로 보관하는 식&lt;/p&gt;
&lt;p data-path-to-node=&quot;4&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;4&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;5,2,0&quot;&gt;특징&lt;/b&gt;: EMP_DETAIL 테이블의 EMP_ID는 자기 자신의 PK(기본키)이면서 동시에 EMPLOYEE 테이블을 가리키는 FK(외래키) 역할을 한다.&lt;/p&gt;
&lt;h3 data-path-to-node=&quot;7&quot; data-ke-size=&quot;size23&quot;&gt;1:N 관계 (One-to-Many) - 가장 일반적!&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;한 레코드는 &lt;b&gt;다른 테이블의 여러 레코드와 연결&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;대부분의 JOIN은 이 구조를 기반으로 설계됨&lt;/li&gt;
&lt;/ul&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;스크린샷 2026-06-11 174116.png&quot; data-origin-width=&quot;835&quot; data-origin-height=&quot;316&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bcVNlp/dJMcaicDiZR/qIBlGnstbgPfQvejHvozok/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bcVNlp/dJMcaicDiZR/qIBlGnstbgPfQvejHvozok/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bcVNlp/dJMcaicDiZR/qIBlGnstbgPfQvejHvozok/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbcVNlp%2FdJMcaicDiZR%2FqIBlGnstbgPfQvejHvozok%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;835&quot; height=&quot;316&quot; data-filename=&quot;스크린샷 2026-06-11 174116.png&quot; data-origin-width=&quot;835&quot; data-origin-height=&quot;316&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;N:M 관계 (Many-to-Many)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;여러 레코드가 &lt;b&gt;여러 레코드와 연결&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;일반적으로 서로 FK를 가질 수 없는 관계로 중간에 연결 테이블(Junction Table)을 둬서 구현함.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;예시&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-11 174158.png&quot; data-origin-width=&quot;833&quot; data-origin-height=&quot;517&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rYuPN/dJMcah5Q6E9/iMim2kKoNflqwPARU6PUJ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rYuPN/dJMcah5Q6E9/iMim2kKoNflqwPARU6PUJ1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rYuPN/dJMcah5Q6E9/iMim2kKoNflqwPARU6PUJ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrYuPN%2FdJMcah5Q6E9%2FiMim2kKoNflqwPARU6PUJ1%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;833&quot; height=&quot;517&quot; data-filename=&quot;스크린샷 2026-06-11 174158.png&quot; data-origin-width=&quot;833&quot; data-origin-height=&quot;517&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-path-to-node=&quot;3&quot; data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;</description>
      <category>개발자 호소인/SQL</category>
      <author>리제 </author>
      <guid isPermaLink="true">https://bookstairs.tistory.com/65</guid>
      <comments>https://bookstairs.tistory.com/65#entry65comment</comments>
      <pubDate>Thu, 11 Jun 2026 17:39:50 +0900</pubDate>
    </item>
    <item>
      <title>[SQL] 관계형 데이터베이스 (RDB: SQL)/ 비관계형 데이터베이스 (NoSQL)</title>
      <link>https://bookstairs.tistory.com/64</link>
      <description>&lt;h2 data-path-to-node=&quot;2&quot; data-ke-size=&quot;size26&quot;&gt;1. 관계형 데이터베이스 (RDB: SQL)&lt;/h2&gt;
&lt;p data-path-to-node=&quot;3&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;3&quot;&gt;&quot;규칙이 확실하고, 데이터의 무결성이 중요한 곳&quot;&lt;/b&gt;&lt;/p&gt;
&lt;p data-path-to-node=&quot;4&quot; data-ke-size=&quot;size16&quot;&gt;RDB는 데이터를 엑셀의 '표'처럼 저장합니다. 데이터의 구조(스키마)가 매우 엄격하며, 데이터 간의 연결고리를 중요하게 생각한다.&lt;/p&gt;
&lt;h3 data-path-to-node=&quot;5&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #9feec3;&quot;&gt;핵심 개념: ACID 원칙&lt;/span&gt;&lt;/h3&gt;
&lt;p data-path-to-node=&quot;6&quot; data-ke-size=&quot;size16&quot;&gt;데이터의 &lt;b data-index-in-node=&quot;5&quot; data-path-to-node=&quot;6&quot;&gt;정확성&lt;/b&gt;을 보장하기 위한 4가지 약속&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;7&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;7,0,0&quot;&gt;Atomicity(원자성):&lt;/b&gt; 한 번에 처리되거나, 아예 안 되거나 (중간은 없다).&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;7,1,0&quot;&gt;Consistency(일관성):&lt;/b&gt; 규칙에 어긋난 데이터는 저장될 수 없다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;7,2,0&quot;&gt;Isolation(고립성):&lt;/b&gt; 여러 작업이 동시에 일어나도 서로 방해하지 않는다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;7,3,0&quot;&gt;Durability(지속성):&lt;/b&gt; 한 번 저장된 결과는 영원히 기록된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-path-to-node=&quot;9&quot; data-ke-size=&quot;size26&quot;&gt;2. 비관계형 데이터베이스 (NoSQL)&lt;/h2&gt;
&lt;p data-path-to-node=&quot;10&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;10&quot;&gt;&quot;유연하고 빠르며, 대량의 데이터를 다루는 곳&quot;&lt;/b&gt;&lt;/p&gt;
&lt;p data-path-to-node=&quot;11&quot; data-ke-size=&quot;size16&quot;&gt;데이터의 형태가 수시로 바뀌거나, 너무 방대해서 테이블 구조로 묶기 힘들 때 사용&lt;/p&gt;
&lt;p data-path-to-node=&quot;11&quot; data-ke-size=&quot;size16&quot;&gt;정해진 형식 없이 자유롭게 데이터를 담는다&lt;/p&gt;
&lt;h3 data-path-to-node=&quot;12&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #9feec3;&quot;&gt;대표적인 4가지 형태&lt;/span&gt;&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-path-to-node=&quot;13&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;13,0,0&quot;&gt;문서형(Document):&lt;/b&gt; JSON 파일처럼 데이터를 통째로 저장 (예: MongoDB)&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;13,1,0&quot;&gt;키-값형(Key-Value):&lt;/b&gt; 딕셔너리처럼 빠르게 데이터를 찾음 (예: Redis)&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;13,2,0&quot;&gt;열지향(Column-Family):&lt;/b&gt; 방대한 데이터를 컬럼 단위로 나눠서 저장 (예: Cassandra)&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;13,3,0&quot;&gt;그래프형(Graph):&lt;/b&gt; 데이터 간의 관계를 노드로 연결 (예: Neo4j)&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 data-path-to-node=&quot;15&quot; data-ke-size=&quot;size26&quot;&gt;3. 한눈에 보는 비교 (RDB vs NoSQL)&lt;/h2&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 126px;&quot; border=&quot;1&quot; data-path-to-node=&quot;16&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;&lt;b&gt;비교 항목&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;&lt;b&gt;RDB (SQL)&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;&lt;b&gt;NoSQL&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;&lt;span data-path-to-node=&quot;16,1,0,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;16,1,0,0&quot;&gt;핵심 가치&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;&lt;span data-path-to-node=&quot;16,1,1,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;16,1,1,0&quot;&gt;정확성&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;&lt;span data-path-to-node=&quot;16,1,2,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;16,1,2,0&quot;&gt;유연성 &amp;amp; 속도&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;&lt;span data-path-to-node=&quot;16,2,0,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;16,2,0,0&quot;&gt;저장 방식&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;&lt;span data-path-to-node=&quot;16,2,1,0&quot;&gt;표 (테이블)&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;&lt;span data-path-to-node=&quot;16,2,2,0&quot;&gt;문서, 키-값, 그래프 등&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;&lt;span data-path-to-node=&quot;16,3,0,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;16,3,0,0&quot;&gt;스키마&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;&lt;span data-path-to-node=&quot;16,3,1,0&quot;&gt;엄격함 (고정)&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;&lt;span data-path-to-node=&quot;16,3,2,0&quot;&gt;자유로움 (유연)&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;&lt;span data-path-to-node=&quot;16,4,0,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;16,4,0,0&quot;&gt;확장성&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;&lt;span data-path-to-node=&quot;16,4,1,0&quot;&gt;수직적 (성능 강화)&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;&lt;span data-path-to-node=&quot;16,4,2,0&quot;&gt;수평적 (서버 증설)&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;&lt;span data-path-to-node=&quot;16,5,0,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;16,5,0,0&quot;&gt;대표 분야&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;&lt;span data-path-to-node=&quot;16,5,1,0&quot;&gt;금융, 결제, 시스템 관리&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;&lt;span data-path-to-node=&quot;16,5,2,0&quot;&gt;SNS, 실시간 데이터, 로그&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 data-path-to-node=&quot;18&quot; data-ke-size=&quot;size26&quot;&gt;  요약: 무엇을 선택해야 할까?&lt;/h2&gt;
&lt;blockquote data-path-to-node=&quot;19&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-path-to-node=&quot;19,0&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;19,0&quot;&gt;RDB가 정답인 경우:&lt;/b&gt; &quot;데이터가 서로 복잡하게 연결되어 있고, 돈이나 개인정보처럼 틀리면 큰일 나는 작업&quot; (예: 은행 시스템, 쇼핑몰 결제)&lt;/p&gt;
&lt;p data-path-to-node=&quot;19,1&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;19,1&quot;&gt;NoSQL이 정답인 경우:&lt;/b&gt; &quot;데이터의 구조가 자주 바뀌고, 너무 빠르게 늘어나서 실시간으로 처리해야 하는 작업&quot; (예: 좋아요 횟수, 로그 분석, 친구 추천 시스템)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-path-to-node=&quot;20&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;결국 &quot;데이터의 성격이 무엇인가?&quot;가 기술을 선택하는 가장 중요한 기준이 된다. &lt;/b&gt;&lt;/p&gt;
&lt;p data-path-to-node=&quot;20&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;데이터의 정확함이 최우선인지, 아니면 수만 명의 접속자를 감당할 유연함이 우선인지 고민해보는 것이 좋다&lt;/b&gt;.&lt;/p&gt;</description>
      <category>개발자 호소인/SQL</category>
      <author>리제 </author>
      <guid isPermaLink="true">https://bookstairs.tistory.com/64</guid>
      <comments>https://bookstairs.tistory.com/64#entry64comment</comments>
      <pubDate>Thu, 11 Jun 2026 17:26:35 +0900</pubDate>
    </item>
    <item>
      <title>[SQL] GROUP BY, HAVING</title>
      <link>https://bookstairs.tistory.com/63</link>
      <description>&lt;h1&gt;GROUP BY&lt;/h1&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;GROUP BY는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;특정 컬럼 값을 기준으로 행들을 그룹화&lt;/b&gt;하고&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;각 그룹에 대해 SUM, AVG, COUNT 같은&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;집계 함수&lt;/b&gt;를 적용할 수 있게 해주는 절은 데이터를&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b data-path-to-node=&quot;0&quot; data-index-in-node=&quot;23&quot;&gt;그룹 단위로 묶고 그 그룹에 대해 필터링&lt;/b&gt;을 할 때 사용하는 SQL의 핵심 구문이다.&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;color: #333333; text-align: start;&quot; data-path-to-node=&quot;1&quot;&gt;간단히 비유하자면, GROUP BY는 흩어진 데이터를 분류하는 '상자'이고, HAVING은 그 상자들 중에서 특정 조건에 맞는 것만 골라내는 '검수 작업'&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-path-to-node=&quot;3&quot; data-ke-size=&quot;size23&quot;&gt;1. GROUP BY: 데이터를 그룹으로 묶기&lt;/h3&gt;
&lt;p data-path-to-node=&quot;4&quot; data-ke-size=&quot;size16&quot;&gt;GROUP BY는 테이블의 행들을 특정 컬럼을 기준으로 나누어, 각 그룹별로 계산(집계)할 수 있게 한다.&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;5&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;5,0,0&quot;&gt;용도&lt;/b&gt;: 부서별 급여 합계, 직급별 사원 수, 성별 평균 점수 등 그룹 통계 산출.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;5,1,0&quot;&gt;주의사항&lt;/b&gt;: SELECT 절에 오는 컬럼은 반드시 GROUP BY에 포함되어 있거나, SUM(), COUNT() 같은 &lt;b data-index-in-node=&quot;65&quot; data-path-to-node=&quot;5,1,0&quot;&gt;집계 함수&lt;/b&gt;에 감싸져 있어야 한다. &lt;s&gt;여기서 실수가 많이 일어나는 부분이다.&amp;nbsp;&lt;/s&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-path-to-node=&quot;6&quot; data-ke-size=&quot;size23&quot;&gt;2. HAVING: 그룹화된 결과 필터링하기&lt;/h3&gt;
&lt;p data-path-to-node=&quot;7&quot; data-ke-size=&quot;size16&quot;&gt;HAVING은 GROUP BY로 묶인 결과에 조건을 걸어 데이터를 걸러낸다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;7&quot; data-ke-size=&quot;size16&quot;&gt;WHERE와 비슷해 보이지만, &lt;b data-index-in-node=&quot;61&quot; data-path-to-node=&quot;7&quot;&gt;적용 시점에서 차이가 난다.&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;8&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;8,0,0&quot;&gt;WHERE&lt;/b&gt;: 그룹을 만들기&lt;span style=&quot;color: #009a87;&quot;&gt; &lt;b data-index-in-node=&quot;15&quot; data-path-to-node=&quot;8,0,0&quot;&gt;전&lt;/b&gt;&lt;/span&gt;에, 개별 행(row) 하나하나를 걸러냄.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;8,1,0&quot;&gt;HAVING&lt;/b&gt;: 그룹을 만든 &lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b data-index-in-node=&quot;15&quot; data-path-to-node=&quot;8,1,0&quot;&gt;후&lt;/b&gt;&lt;/span&gt;에, 집계된 결과(결과물)를 걸러냄.&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt; SELECT&lt;/span&gt; dept_code, SUM(salary)&lt;span style=&quot;color: #8a3db6;&quot;&gt; AS&lt;/span&gt; &quot;부서별 급여합&quot;&lt;br /&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;FROM&lt;/span&gt; employee&lt;br /&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;GROUP BY&amp;nbsp; &lt;span style=&quot;background-color: #fcfcfc; color: #666666; text-align: left;&quot;&gt;dept_code&lt;/span&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;&amp;nbsp;&lt;span style=&quot;background-color: #fcfcfc; color: #7e98b1; text-align: left;&quot;&gt; -- 1. 부서별로 그룹을 묶음&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&lt;span style=&quot;color: #006dd7;&quot;&gt;HAVING&lt;/span&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt; SUM&lt;/span&gt;(salary) &amp;gt;= &lt;span style=&quot;color: #ffc1c8;&quot;&gt;10000000&lt;/span&gt;;&amp;nbsp; &amp;nbsp;-&lt;span style=&quot;color: #7e98b1;&quot;&gt;- 2. 합계가 1000만 원 이상인 그룹만 남김 &lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  쉽게 이해하기 사원 명단 전체에서 &quot;부서별 평균 급여&quot;를 구하고 싶다면? &lt;br /&gt;&amp;rarr; 먼저 부서별로 줄을 세운 다음 (GROUP BY), 각 줄의 평균을 계산 (AVG)하는 것&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;기본 문법&lt;/h3&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;SELECT 그룹기준컬럼, 집계함수
FROM 테이블명
GROUP BY 그룹기준컬럼;
&lt;/code&gt;&lt;/pre&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 data-index-in-node=&quot;0&quot; data-path-to-node=&quot;15,1,0&quot;&gt;WHERE&lt;/b&gt;: 그룹화하기 전, 불필요한 개별 데이터를 삭제&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;15,2,0&quot;&gt;GROUP BY&lt;/b&gt;: 남은 데이터를 그룹으로 분류&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;15,3,0&quot;&gt;HAVING&lt;/b&gt;: 그룹화된 결과 중 조건에 맞지 않는 그룹 삭제&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;15,5,0&quot;&gt;ORDER BY&lt;/b&gt;: 정렬&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;15,4,0&quot;&gt;SELECT&lt;/b&gt;: 그룹기준컬럼 : 어떤 테이블에서 가져올지 결정&lt;/li&gt;
&lt;li&gt;&lt;b data-path-to-node=&quot;15,0,0&quot; data-index-in-node=&quot;0&quot;&gt;FROM&lt;/b&gt;&lt;span&gt;: 테이블 명&amp;nbsp;&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;&lt;/p&gt;
&lt;h3 data-path-to-node=&quot;17&quot; data-ke-size=&quot;size23&quot;&gt;요약 비교&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-path-to-node=&quot;18&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;특징&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;WHERE&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;HAVING&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;18,1,0,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;18,1,0,0&quot;&gt;적용 시점&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;18,1,1,0&quot;&gt;그룹화(GROUP BY) 전&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;18,1,2,0&quot;&gt;그룹화 후&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;18,2,0,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;18,2,0,0&quot;&gt;대상&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;18,2,1,0&quot;&gt;개별 행 (Row)&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;18,2,2,0&quot;&gt;그룹화된 결과 (Group)&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;18,3,0,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;18,3,0,0&quot;&gt;사용 여부&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;18,3,1,0&quot;&gt;필수 아님&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;18,3,2,0&quot;&gt;GROUP BY가 있을 때만 사용&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;</description>
      <category>개발자 호소인/SQL</category>
      <author>리제 </author>
      <guid isPermaLink="true">https://bookstairs.tistory.com/63</guid>
      <comments>https://bookstairs.tistory.com/63#entry63comment</comments>
      <pubDate>Thu, 11 Jun 2026 11:43:18 +0900</pubDate>
    </item>
    <item>
      <title>[SQL] 함수(Function) 이해 및 활용</title>
      <link>https://bookstairs.tistory.com/60</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-10 112837.png&quot; data-origin-width=&quot;953&quot; data-origin-height=&quot;499&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dlAc8x/dJMcadbaESp/e1o5zoV8f7WltXkYjIo1a0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dlAc8x/dJMcadbaESp/e1o5zoV8f7WltXkYjIo1a0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dlAc8x/dJMcadbaESp/e1o5zoV8f7WltXkYjIo1a0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdlAc8x%2FdJMcadbaESp%2Fe1o5zoV8f7WltXkYjIo1a0%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;953&quot; height=&quot;499&quot; data-filename=&quot;스크린샷 2026-06-10 112837.png&quot; data-origin-width=&quot;953&quot; data-origin-height=&quot;499&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;함수(Function)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;함수(Function)는 입력값(인자)을 받아 &lt;b&gt;계산 또는 가공&lt;/b&gt;하여 &lt;b&gt;결과값을 반환&lt;/b&gt;하는 SQL 도구&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;SELECT문에서 데이터를 &lt;b&gt;가공, 변환, 요약, 계산&lt;/b&gt;할 때 자주 사용됨&lt;/li&gt;
&lt;li&gt;반복되는 처리 로직을 함수 하나로 간결하게 표현할 수 있다&lt;/li&gt;
&lt;/ul&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;&amp;nbsp; &amp;nbsp;전달된 컬럼값을 읽어서 함수(기능)를 실행한 결과를 반환 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;단일행함수&amp;nbsp;:&amp;nbsp;N개의&amp;nbsp;값을&amp;nbsp;읽어서&amp;nbsp;N개의&amp;nbsp;결과값을&amp;nbsp;반환(행마다&amp;nbsp;실행&amp;nbsp;결과를&amp;nbsp;반환) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;그룹함수&amp;nbsp;:&amp;nbsp;N개의&amp;nbsp;값을&amp;nbsp;읽어서&amp;nbsp;1개의&amp;nbsp;결과값을&amp;nbsp;반환(그룹별로&amp;nbsp;함수&amp;nbsp;실행&amp;nbsp;결과를&amp;nbsp;반환)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;단일행 함수 vs 그룹 함수 비교&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-path-to-node=&quot;15&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;구분&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;단일행 함수 (Scalar Function)&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;그룹 함수 (Aggregate Function)&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;15,1,0,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;15,1,0,0&quot;&gt;처리 대상&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;15,1,1,0&quot;&gt;데이터 행(Row) 하나하나&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;15,1,2,0&quot;&gt;데이터의 집합(Group) 전체&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;15,2,0,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;15,2,0,0&quot;&gt;결과 반환&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;15,2,1,0&quot;&gt;입력한 행의 개수와 동일한 결과&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;15,2,2,0&quot;&gt;집계된 그룹의 개수만큼 결과 반환&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;15,3,0,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;15,3,0,0&quot;&gt;주요 사례&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;15,3,1,0&quot;&gt;UPPER, SUBSTRING, IFNULL, DATEDIFF&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;15,3,2,0&quot;&gt;SUM, AVG, COUNT, MAX, MIN&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;15,4,0,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;15,4,0,0&quot;&gt;WHERE 절 사용&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;15,4,1,0&quot;&gt;가능&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;15,4,2,0&quot;&gt;불가능 (HAVING 사용 필요)&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;함수의 용도&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;문자열&amp;middot;숫자&amp;middot;날짜 데이터 &lt;b&gt;가공 및 변환&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;NULL 값 &lt;b&gt;처리&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;여러 행을 하나의 값으로 &lt;b&gt;집계 (합계, 평균 등)&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-path-to-node=&quot;3&quot; data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;p data-path-to-node=&quot;4&quot; data-ke-size=&quot;size16&quot;&gt;SUBSTRING(데이터, 시작위치, 추출할길이)&lt;/p&gt;
&lt;p data-path-to-node=&quot;4&quot; 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 data-index-in-node=&quot;0&quot; data-path-to-node=&quot;5,0,0&quot;&gt;데이터&lt;/b&gt;: 대상이 되는 컬럼이나 문자열&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;5,1,0&quot;&gt;시작위치&lt;/b&gt;: 몇 번째 글자부터 시작할 것인가&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;5,2,0&quot;&gt;추출할길이&lt;/b&gt;: 총 몇 글자를 가져올 것인&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;4&quot; data-ke-size=&quot;size16&quot;&gt;SUBSTRING('900101-1234567', 1, 6) 라고 한다면 답은 900101&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;SQL 함수의 분류&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;함수 종류 설명 특징&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;단일행 함수&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;행 하나에 적용되어 결과 하나를 반환&lt;/td&gt;
&lt;td&gt;SELECT, WHERE, ORDER BY 어디서든 사용 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;그룹 함수&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;여러 행을 묶어 집계한 결과 하나를 반환&lt;/td&gt;
&lt;td&gt;주로 GROUP BY와 함께 사용&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;SQL에서 IS NULL은 컬럼에 저장된 값이 정말로 아무것도 없는 상태(NULL)인지 확인하는 조건식&lt;/p&gt;
&lt;h3 data-path-to-node=&quot;1&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;&lt;b&gt;' = '&lt;/b&gt;&lt;/span&gt; 대신&amp;nbsp; ' &lt;span style=&quot;color: #009a87;&quot;&gt;IS NULL ' &lt;/span&gt;을 쓰는 이유&lt;/h3&gt;
&lt;p data-path-to-node=&quot;2&quot; data-ke-size=&quot;size16&quot;&gt;데이터베이스에서 NULL은 '값 없음'을 나타내기 때문에, 컴퓨터는 NULL이 정확히 어떤 값인지 알지 못한다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;2&quot; data-ke-size=&quot;size16&quot;&gt;따라서 &quot;이 값이 NULL과 같은가?&quot;를 물어볼 때,&lt;/p&gt;
&lt;p data-path-to-node=&quot;2&quot; data-ke-size=&quot;size16&quot;&gt;일반적인 등호(=) 연산자를 쓰면 결과가 항상 False(혹은 알 수 없음)로 나온다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;3&quot; data-ke-size=&quot;size16&quot;&gt;이런 논리적 오류를 방지하기 위해 특별히 IS 연산자를 사용한다.&lt;/p&gt;
&lt;h3 data-path-to-node=&quot;5&quot; data-ke-size=&quot;size23&quot;&gt;실무 활용 예시&lt;/h3&gt;
&lt;p data-path-to-node=&quot;6&quot; data-ke-size=&quot;size16&quot;&gt;직원 데이터 테이블(Employees)에서 전화번호가 등록되지 않은(NULL인) 직원을 찾고 싶다면 다음과 같이 작성.&lt;/p&gt;
&lt;div data-ved=&quot;0CAAQhtANahcKEwj7xr6Dy_uUAxUAAAAAHQAAAAAQeQ&quot; data-hveid=&quot;0&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div data-ved=&quot;0CAAQhtANahcKEwj7xr6Dy_uUAxUAAAAAHQAAAAAQeg&quot; data-hveid=&quot;0&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-10 173736.png&quot; data-origin-width=&quot;896&quot; data-origin-height=&quot;357&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bAq4Kn/dJMcahdFUcn/QFktrVZHUtLL2iy3Pq4Xx0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bAq4Kn/dJMcahdFUcn/QFktrVZHUtLL2iy3Pq4Xx0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bAq4Kn/dJMcahdFUcn/QFktrVZHUtLL2iy3Pq4Xx0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbAq4Kn%2FdJMcahdFUcn%2FQFktrVZHUtLL2iy3Pq4Xx0%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;896&quot; height=&quot;357&quot; data-filename=&quot;스크린샷 2026-06-10 173736.png&quot; data-origin-width=&quot;896&quot; data-origin-height=&quot;357&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-path-to-node=&quot;10&quot; data-ke-size=&quot;size23&quot;&gt;요약 비교&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-path-to-node=&quot;11&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;표현식&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;결과&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;이유&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;11,1,0,0&quot;&gt;WHERE col = NULL&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;11,1,1,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;11,1,1,0&quot;&gt;사용 불가&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;11,1,2,0&quot;&gt;NULL은 어떤 값과도 '='로 비교할 수 없음&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;11,2,0,0&quot;&gt;WHERE col IS NULL&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;11,2,1,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;11,2,1,0&quot;&gt;사용 가능&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;11,2,2,0&quot;&gt;NULL 상태인 데이터를 정확히 식별&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;DATE_FORMAT 주요 형식 코드&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;형식 의미 예시&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;%Y&lt;/td&gt;
&lt;td&gt;4자리 연도&lt;/td&gt;
&lt;td&gt;2025&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;%y&lt;/td&gt;
&lt;td&gt;2자리 연도&lt;/td&gt;
&lt;td&gt;25&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;%m&lt;/td&gt;
&lt;td&gt;2자리 월 (01~12)&lt;/td&gt;
&lt;td&gt;06&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;%d&lt;/td&gt;
&lt;td&gt;2자리 일 (01~31)&lt;/td&gt;
&lt;td&gt;09&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;%H&lt;/td&gt;
&lt;td&gt;24시간 형식 시&lt;/td&gt;
&lt;td&gt;14&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;%i&lt;/td&gt;
&lt;td&gt;분&lt;/td&gt;
&lt;td&gt;30&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;%s&lt;/td&gt;
&lt;td&gt;초&lt;/td&gt;
&lt;td&gt;00&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;%W&lt;/td&gt;
&lt;td&gt;요일 전체 이름&lt;/td&gt;
&lt;td&gt;Monday&lt;br /&gt;&lt;br /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-path-to-node=&quot;0&quot; data-ke-size=&quot;size26&quot;&gt;TRUNCATE 함수&lt;/h2&gt;
&lt;h4 data-path-to-node=&quot;0&quot; data-ke-size=&quot;size20&quot;&gt;숫자를 &lt;b data-index-in-node=&quot;17&quot; data-path-to-node=&quot;0&quot;&gt;지정한 위치에서 가차 없이 잘라버리는(버림)&lt;/b&gt; 함수&lt;/h4&gt;
&lt;p data-path-to-node=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;핵심은 '어디를 기준으로 자를 것인가'를 결정하는 숫자(위치값)입니다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;1&quot; data-ke-size=&quot;size16&quot;&gt;기본 원칙은 &lt;b data-index-in-node=&quot;7&quot; data-path-to-node=&quot;1&quot;&gt;0을 소수점 바로 뒤&lt;/b&gt;로 생각하시면 됩니다.&lt;/p&gt;
&lt;h3 data-path-to-node=&quot;3&quot; data-ke-size=&quot;size23&quot;&gt;위치값(자릿수) 규칙&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;4&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;4,0,0&quot;&gt;양수(1, 2, ...)&lt;/b&gt;: 소수점 아래 자릿수를 보존합니다. (나머지는 다 버림)&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;4,1,0&quot;&gt;0&lt;/b&gt;: 소수점 아래를 모두 버리고 정수만 남깁니다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;4,2,0&quot;&gt;음수(-1, -2, ...)&lt;/b&gt;: 소수점 왼쪽, 즉 정수 부분을 버립니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-path-to-node=&quot;6&quot; data-ke-size=&quot;size23&quot;&gt;예시 분석 (123.456)&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-path-to-node=&quot;7&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;코드&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;위치&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;결과&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;설명&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;7,1,0,0&quot;&gt;truncate(123.456, 0)&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;7,1,1,0&quot;&gt;0&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;7,1,2,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;7,1,2,0&quot;&gt;123&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;7,1,3,0&quot;&gt;소수점 아래는 다 버리고 123만 남음&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;7,2,0,0&quot;&gt;truncate(123.456, 1)&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;7,2,1,0&quot;&gt;1&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;7,2,2,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;7,2,2,0&quot;&gt;123.4&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;7,2,3,0&quot;&gt;소수점 첫째 자리까지만 남기고 나머지는 버림&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;7,3,0,0&quot;&gt;truncate(123.456, -1)&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;7,3,1,0&quot;&gt;-1&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;7,3,2,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;7,3,2,0&quot;&gt;120&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;7,3,3,0&quot;&gt;일의 자리를 버리고 십의 자리까지 표시&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;그룹 함수 (집계 함수)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여러 행의 값을 &lt;b&gt;하나로 요약(집계)&lt;/b&gt; 하여 단일 결과를 반환합니다. GROUP BY와 함께 쓰면 &lt;b&gt;그룹별 집계&lt;/b&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-10 173644.png&quot; data-origin-width=&quot;903&quot; data-origin-height=&quot;255&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/beS7ap/dJMb99012rq/49n5BvmVNXnHKOzTDzZESk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/beS7ap/dJMb99012rq/49n5BvmVNXnHKOzTDzZESk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/beS7ap/dJMb99012rq/49n5BvmVNXnHKOzTDzZESk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbeS7ap%2FdJMb99012rq%2F49n5BvmVNXnHKOzTDzZESk%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;903&quot; height=&quot;255&quot; data-filename=&quot;스크린샷 2026-06-10 173644.png&quot; data-origin-width=&quot;903&quot; data-origin-height=&quot;255&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  &lt;b&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;WHERE에서 COUNT(*) 같은 집계 함수를 쓸 수 없는 이유 &amp;rarr; WHERE는 GROUP BY 전에 실행되기 때문&lt;/li&gt;
&lt;li&gt;HAVING에서 SELECT의 별칭을 쓸 수 없는 이유 &amp;rarr; HAVING은 SELECT보다 먼저 실행되기 때문&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-10 173649.png&quot; data-origin-width=&quot;890&quot; data-origin-height=&quot;264&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ZtxXe/dJMcabEuHXW/U6Lb0k8Ek70C61KUkkMiiK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ZtxXe/dJMcabEuHXW/U6Lb0k8Ek70C61KUkkMiiK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ZtxXe/dJMcabEuHXW/U6Lb0k8Ek70C61KUkkMiiK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZtxXe%2FdJMcabEuHXW%2FU6Lb0k8Ek70C61KUkkMiiK%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;890&quot; height=&quot;264&quot; data-filename=&quot;스크린샷 2026-06-10 173649.png&quot; data-origin-width=&quot;890&quot; data-origin-height=&quot;264&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 style=&quot;color: #000000; text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;오늘 선생님의 한마디&lt;/h2&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&quot;완벽하게 만들 생각보다는 서비스를 실행 하는 것을 목적으로 하라. &quot;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>개발자 호소인/SQL</category>
      <author>리제 </author>
      <guid isPermaLink="true">https://bookstairs.tistory.com/60</guid>
      <comments>https://bookstairs.tistory.com/60#entry60comment</comments>
      <pubDate>Wed, 10 Jun 2026 17:39:46 +0900</pubDate>
    </item>
    <item>
      <title>[SQL] select (조회) , WHERE(필터링)</title>
      <link>https://bookstairs.tistory.com/61</link>
      <description>&lt;p data-path-to-node=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1 data-path-to-node=&quot;2&quot;&gt;&amp;nbsp;&lt;/h1&gt;
&lt;p data-path-to-node=&quot;3&quot; data-ke-size=&quot;size16&quot;&gt;SQL은&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;엑셀을 다루는 것과 비슷하지만 좀 더 정교화되어있고, &lt;/span&gt;&lt;/p&gt;
&lt;p data-path-to-node=&quot;3&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;선택적으로 원하는 것들을 조회하는 것에&amp;nbsp; 특화되어있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-path-to-node=&quot;3&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;'테이블'에서 데이터를 다룬다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;데이터 조회하기 (SELECT)&lt;/h2&gt;
&lt;p data-path-to-node=&quot;5&quot; data-ke-size=&quot;size16&quot;&gt;테이블은 행(Row)과 열(Column)로 구성&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-path-to-node=&quot;6&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;기능&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;SQL 예시&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;설명&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;6,1,0,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;6,1,0,0&quot;&gt;전체 조회&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;6,1,1,0&quot;&gt;SELECT&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt; *&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;FROM job;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;6,1,2,0&quot;&gt;테이블의&lt;b&gt; 모든&lt;/b&gt; 컬럼을 조회&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;6,2,0,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;6,2,0,0&quot;&gt;부분 조회&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;6,2,1,0&quot;&gt;SELECT &lt;span style=&quot;color: #8a3db6;&quot;&gt;emp_name, email&lt;/span&gt;&lt;br /&gt;FROM employee;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;6,2,2,0&quot;&gt;필요한&lt;b&gt; 특정 컬럼만&lt;/b&gt; 골라서 조회&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;6,3,0,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;6,3,0,0&quot;&gt;데이터 결합&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;6,3,1,0&quot;&gt;SELECT&lt;span style=&quot;color: #409d00;&quot;&gt; CONCAT(name, '님')&lt;/span&gt; &lt;br /&gt;FROM employee;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;6,3,2,0&quot;&gt;여러 값을 &lt;b&gt;하나로 합쳐서&lt;/b&gt; 조회&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;6,4,0,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;6,4,0,0&quot;&gt;중복 제거&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;6,4,1,0&quot;&gt;SELECT &lt;span style=&quot;color: #ef5369;&quot;&gt;DISTINCT dept_code&lt;/span&gt;&lt;br /&gt;FROM employee;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;6,4,2,0&quot;&gt;&lt;b&gt;중복된 값은 한 번씩만&lt;/b&gt; 출력&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;별칭(Alias) 활용 :&amp;nbsp;&lt;span style=&quot;color: #1a5490;&quot;&gt;&lt;b&gt; AS&lt;/b&gt;&lt;/span&gt;를 사용&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;10,1,0&quot;&gt;NULL 값 처리:&lt;/b&gt; 데이터가 비어있는 NULL은 연산 시 주의가 필요합니다. IFNULL(bonus, 0)을 사용해 NULL을 0으로 바꿔주면 계산 오류를 방지할 수 있다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;10,2,0&quot;&gt;날짜 연산:&lt;/b&gt; DATEDIFF(now(), hire_date)를 사용하면 오늘을 기준으로 근무 기간 등을 계산할 수 있다.&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;WHERE (조건에 맞는 데이터만 가져오기)&lt;/span&gt;&lt;/h2&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-path-to-node=&quot;15&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;조건 유형&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;SQL 예시&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;설명&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;15,1,0,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;15,1,0,0&quot;&gt;비교 연산&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;15,1,1,0&quot;&gt;&lt;span style=&quot;color: #1a5490;&quot;&gt;WHERE&lt;/span&gt; salary &amp;gt;= 4000000;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;15,1,2,0&quot;&gt;400만원 이상인 사원만 조회&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;15,2,0,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;15,2,0,0&quot;&gt;범위 연산&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;15,2,1,0&quot;&gt;&lt;span style=&quot;color: #1a5490;&quot;&gt;WHERE&lt;/span&gt; salary BETWEEN 350 AND 600;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;15,2,2,0&quot;&gt;350~600만원 사이인 사원&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;15,3,0,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;15,3,0,0&quot;&gt;목록 연산&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;15,3,1,0&quot;&gt;&lt;span style=&quot;color: #1a5490;&quot;&gt;WHERE&lt;/span&gt; dept_code IN ('D6', 'D8');&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;15,3,2,0&quot;&gt;특정 부서 코드에 포함된 사원&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;15,4,0,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;15,4,0,0&quot;&gt;패턴 검색&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;15,4,1,0&quot;&gt;&lt;span style=&quot;color: #1a5490;&quot;&gt;WHERE&lt;/span&gt; emp_name LIKE '전%';&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;15,4,2,0&quot;&gt;'전'씨 성을 가진 모든 사원&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&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;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;주의할 점&amp;nbsp;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;17,1,0&quot;&gt;NULL 값 판별 :&lt;/b&gt; * 데이터베이스에서 NULL은 '값 없음'을 의미하므로 = NULL로 비교할 수 X.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반드시 &lt;b data-index-in-node=&quot;66&quot; data-path-to-node=&quot;17,1,0&quot;&gt;IS NULL&lt;/b&gt; 또는 IS NOT NULL을 사용해야 한다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;IN&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;IN 연산자는 &quot;여러 조건을 일일이 나열하지 않고, 리스트(목록) 안에 포함되어 있는지 확인&quot;할 때 사용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;3&quot; data-ke-size=&quot;size16&quot;&gt;부서 코드가 'D6', 'D8', 'D5' 중 하나인 사원을 찾을 때, OR 연산자를 사용하면 다음과 같이 코드가 길어진다.&lt;/p&gt;
&lt;div data-ved=&quot;0CAAQhtANahgKEwj7xr6Dy_uUAxUAAAAAHQAAAAAQrwU&quot; data-hveid=&quot;0&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;lasso&quot;&gt;&lt;code&gt;WHERE dept_code = 'd6' OR dept_code = 'd8' OR dept_code = 'd5';
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-path-to-node=&quot;5&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-path-to-node=&quot;5&quot; data-ke-size=&quot;size16&quot;&gt;IN 넣기(뽀로롱~)&lt;/p&gt;
&lt;div&gt;&amp;darr;&lt;/div&gt;
&lt;pre class=&quot;aspectj&quot;&gt;&lt;code&gt;WHERE dept_code IN ('d6', 'd8', 'd5');&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 IN 연산자를 사용하면 괄호 () 안에 포함하고 싶은 값들을 쉼표로 구분하여 한 번에 나열이 가능&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 data-index-in-node=&quot;0&quot; data-path-to-node=&quot;10,0,0&quot;&gt;데이터 타입 일치&lt;/b&gt;: 괄호 안에 넣는 값들은 컬럼의 데이터 타입과 일치해야 한다. (문자열 컬럼이면 작은따옴표 ' ' 필수, 숫자 컬럼이면 숫자 그대로)&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;10,1,0&quot;&gt;부정 표현&lt;/b&gt;: 만약 특정 값들을 제외하고 싶다면 &lt;span style=&quot;color: #6164c6;&quot;&gt;&lt;b&gt;NOT&lt;/b&gt;&lt;/span&gt; IN ('d6', 'd8', 'd5')처럼 앞에&lt;span style=&quot;color: #000000;&quot;&gt; NOT을&lt;/span&gt; 붙인다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-path-to-node=&quot;2&quot; data-ke-size=&quot;size23&quot;&gt;SQL의 패턴 매칭 연산자: LIKE&lt;/h3&gt;
&lt;p data-path-to-node=&quot;3&quot; data-ke-size=&quot;size16&quot;&gt;LIKE 연산자는 데이터베이스 내의 문자열 데이터 중, 사용자가 지정한 특정 패턴과 일치하는 항목을 추출하고자 할 때 활용하는 도구이다. 이는 &lt;b&gt;정확한 값의 일치 여부를 판단하는 동등 비교 연산자(=)와 달리, 데이터의 구성 형태를 추론하여 검색하는 방식.&lt;/b&gt;&lt;/p&gt;
&lt;p data-path-to-node=&quot;4&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-path-to-node=&quot;5&quot; data-ke-size=&quot;size20&quot;&gt;1. 퍼센트 기호 (%)&lt;/h4&gt;
&lt;p data-path-to-node=&quot;6&quot; data-ke-size=&quot;size16&quot;&gt;퍼센트 기호는 &lt;span style=&quot;color: #009a87;&quot;&gt;'0글자 이상의 모든 문자&lt;/span&gt;'를 의미.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;7&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;7,0,0&quot;&gt;예시:&lt;/b&gt; LIKE '전&lt;span style=&quot;color: #009a87;&quot;&gt;&lt;b&gt;%&lt;/b&gt;&lt;/span&gt;'
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;7,0,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;'전'으로 시작하는 모든 문자열을 추출&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;7,1,0&quot;&gt;예시:&lt;/b&gt; LIKE '&lt;span style=&quot;color: #009a87;&quot;&gt;%&lt;/span&gt;하'
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;7,1,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;'하'로 끝나는 모든 문자열을 추출&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;7,2,0&quot;&gt;예시:&lt;/b&gt; LIKE '&lt;span style=&quot;color: #009a87;&quot;&gt;%&lt;/span&gt;하&lt;span style=&quot;color: #009a87;&quot;&gt;%&lt;/span&gt;'
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;7,2,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;위치에 상관없이 '하'라는 문자가 포함된 모든 문자열을 추출&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-path-to-node=&quot;8&quot; data-ke-size=&quot;size20&quot;&gt;2. 언더바 기호 (_)&lt;/h4&gt;
&lt;p data-path-to-node=&quot;9&quot; data-ke-size=&quot;size16&quot;&gt;언더바 기호는 &lt;span style=&quot;color: #009a87;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;span style=&quot;color: #a6bc00;&quot;&gt;'&lt;/span&gt;&lt;span style=&quot;color: #5f6d2b;&quot;&gt;정확히 1글자&lt;/span&gt;&lt;/span&gt;'&lt;/b&gt;&lt;/span&gt;의 임의 문자를 의미&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;10&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;10,0,0&quot;&gt;예시:&lt;/b&gt; LIKE '전&lt;span style=&quot;color: #5f6d2b;&quot;&gt;_&lt;/span&gt;'
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;10,0,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #a6bc00;&quot;&gt;'전'으로 시작&lt;/span&gt;하며 &lt;span style=&quot;color: #a6bc00;&quot;&gt;전체 길이가 2글자인&lt;span style=&quot;color: #000000;&quot;&gt; 문&lt;/span&gt;&lt;/span&gt;자열을 추출&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;10,1,0&quot;&gt;예시:&lt;/b&gt; LIKE '&lt;span style=&quot;color: #5f6d2b;&quot;&gt;_&lt;/span&gt;하&lt;span style=&quot;color: #a6bc00;&quot;&gt;_&lt;/span&gt;'
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;10,1,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #a6bc00;&quot;&gt;두 번째 글자&lt;/span&gt;가&lt;span style=&quot;color: #a6bc00;&quot;&gt; '하'인 3글자&lt;/span&gt; 문자열을 추출&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>개발자 호소인/SQL</category>
      <author>리제 </author>
      <guid isPermaLink="true">https://bookstairs.tistory.com/61</guid>
      <comments>https://bookstairs.tistory.com/61#entry61comment</comments>
      <pubDate>Wed, 10 Jun 2026 17:20:47 +0900</pubDate>
    </item>
    <item>
      <title>[SQL] 선언형 언어 / 함수( function)</title>
      <link>https://bookstairs.tistory.com/59</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;SQL 핵심용어&lt;/p&gt;
&lt;div data-ved=&quot;0CAAQhtANahgKEwj7xr6Dy_uUAxUAAAAAHQAAAAAQ7wQ&quot; data-hveid=&quot;0&quot;&gt;
&lt;div&gt;
&lt;div&gt;&lt;a href=&quot;https://www.notion.so/Python-Elasticsearch-35d435fcbd9d802290eedd6bd4ee3757?p=37a435fcbd9d807eade8f9c5a642714f&amp;amp;pm=s&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.notion.so/Python-Elasticsearch-35d435fcbd9d802290eedd6bd4ee3757?p=37a435fcbd9d807eade8f9c5a642714f&amp;amp;pm=s&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;figure id=&quot;og_1781145525606&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;MySQL 핵심 용어 | Notion&quot; data-og-description=&quot;데이터 저장의 기본 구조&quot; data-og-host=&quot;www.notion.so&quot; data-og-source-url=&quot;https://www.notion.so/Python-Elasticsearch-35d435fcbd9d802290eedd6bd4ee3757?p=37a435fcbd9d807eade8f9c5a642714f&amp;amp;pm=s&quot; data-og-url=&quot;https://www.notion.so/MySQL-37a435fcbd9d807eade8f9c5a642714f&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/NFcgv/dJMb8U81VMe/bQ6mIcE73pKYM4pMTcjLV1/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/xKMe0/dJMb8QeutIw/fteFoxrdHRMyS42cul8ysk/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://www.notion.so/Python-Elasticsearch-35d435fcbd9d802290eedd6bd4ee3757?p=37a435fcbd9d807eade8f9c5a642714f&amp;amp;pm=s&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.notion.so/Python-Elasticsearch-35d435fcbd9d802290eedd6bd4ee3757?p=37a435fcbd9d807eade8f9c5a642714f&amp;amp;pm=s&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/NFcgv/dJMb8U81VMe/bQ6mIcE73pKYM4pMTcjLV1/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/xKMe0/dJMb8QeutIw/fteFoxrdHRMyS42cul8ysk/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;MySQL 핵심 용어 | Notion&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;데이터 저장의 기본 구조&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.notion.so&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div data-ved=&quot;0CAAQhtANahgKEwj7xr6Dy_uUAxUAAAAAHQAAAAAQ8QQ&quot; data-hveid=&quot;0&quot;&gt;선언형 언어&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div data-ved=&quot;0CAAQhtANahgKEwj7xr6Dy_uUAxUAAAAAHQAAAAAQ8QQ&quot; data-hveid=&quot;0&quot;&gt;절차형 언어 (JAVA 등)는 데이터 처리를 위해 단계별 명령을 직접 설계해야하지만, SQL은 데이터베이스 시스템이 가장 효율적인 방법을 알아서 찾을 것이라 가정하고 '무엇을 얻고싶은지'만 정의한 상태&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div data-ved=&quot;0CAAQhtANahgKEwj7xr6Dy_uUAxUAAAAAHQAAAAAQ8QQ&quot; data-hveid=&quot;0&quot;&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;테이블&lt;/b&gt;&lt;/h2&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;데이터베이스에서&amp;nbsp;데이터를&amp;nbsp;저장하는&amp;nbsp;기본&amp;nbsp;개념&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;행(Row)과&amp;nbsp;열(Column)로&amp;nbsp;구성된&amp;nbsp;데이터&amp;nbsp;집합&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;row&amp;nbsp;:&amp;nbsp;각각의&amp;nbsp;데이터&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;column&amp;nbsp;:&amp;nbsp;테이블에&amp;nbsp;저장되는&amp;nbsp;속성&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;span style=&quot;color: #1a5490;&quot;&gt;=&amp;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;/span&gt;.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;select&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;select&amp;nbsp;컬럼명1,&amp;nbsp;컬럼명2...&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;from&amp;nbsp;테이블명&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[where&amp;nbsp;조건]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[order&amp;nbsp;by&amp;nbsp;정렬기준]&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;861&quot; data-origin-height=&quot;347&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/QVNls/dJMcahdFUHI/YuKS0pL3Ew5a7Zr7xWuvX0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/QVNls/dJMcahdFUHI/YuKS0pL3Ew5a7Zr7xWuvX0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/QVNls/dJMcahdFUHI/YuKS0pL3Ew5a7Zr7xWuvX0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQVNls%2FdJMcahdFUHI%2FYuKS0pL3Ew5a7Zr7xWuvX0%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;861&quot; height=&quot;347&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;861&quot; data-origin-height=&quot;347&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;874&quot; data-origin-height=&quot;263&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ch4Q9a/dJMcadbbaeC/qv8ksLKXa7wvcYml1VIX51/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ch4Q9a/dJMcadbbaeC/qv8ksLKXa7wvcYml1VIX51/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ch4Q9a/dJMcadbbaeC/qv8ksLKXa7wvcYml1VIX51/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fch4Q9a%2FdJMcadbbaeC%2Fqv8ksLKXa7wvcYml1VIX51%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;874&quot; height=&quot;263&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;874&quot; data-origin-height=&quot;263&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; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; SQL은 내부 엔젠이 어떤 인덱스를 탈지, 어떤 순서로 데이터를 읽을지를 스스로 결정.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;사용자는 데이터의 상태와 조건만 선언하면 된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-10 164428.png&quot; data-origin-width=&quot;892&quot; data-origin-height=&quot;675&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/2fg0L/dJMcacXIe5h/YKqCUpAObHrtdFumytovI0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/2fg0L/dJMcacXIe5h/YKqCUpAObHrtdFumytovI0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/2fg0L/dJMcacXIe5h/YKqCUpAObHrtdFumytovI0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F2fg0L%2FdJMcacXIe5h%2FYKqCUpAObHrtdFumytovI0%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;892&quot; height=&quot;675&quot; data-filename=&quot;스크린샷 2026-06-10 164428.png&quot; data-origin-width=&quot;892&quot; data-origin-height=&quot;675&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-path-to-node=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;SQL 함수는 데이터를 내 입맛에 맞게 '가공'하는 도구.&lt;/p&gt;
&lt;p data-path-to-node=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;은 데이터를 조회할 때 &lt;b data-index-in-node=&quot;65&quot; data-path-to-node=&quot;0&quot;&gt;글자를 바꾸거나, 자르거나, 합치는 작업&lt;/b&gt;을 수행&lt;/p&gt;
&lt;p data-path-to-node=&quot;1&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-path-to-node=&quot;3&quot; data-ke-size=&quot;size23&quot;&gt;1. 모양을 바꾸는 함수 (대소문자)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;4,0,0&quot;&gt;UPPER(str) / LOWER(str)&lt;/b&gt;: 글자 전체를 대문자나 소문자로 바꾼다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;4,0,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;예: UPPER('hello') -&amp;gt; 'HELLO'&lt;/li&gt;
&lt;li&gt;실무 사용: 사용자가 대소문자를 섞어서 검색해도 동일한 결과를 찾을 때 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-path-to-node=&quot;5&quot; data-ke-size=&quot;size23&quot;&gt;2. 크기와 위치를 찾는 함수&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;6&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;6,0,0&quot;&gt;LENGTH(str) / CHAR_LENGTH(str)&lt;/b&gt;: 문자열의 길이를 숫자로 반환.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;6,1,0&quot;&gt;INSTR(str, substr)&lt;/b&gt;: 특정 글자가 문자열의 몇 번째에 있는지 위치(숫자)를 알려준다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;6,1,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;예: INSTR('apple', 'p') -&amp;gt; 2 (첫 번째 'p'의 위치)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-path-to-node=&quot;7&quot; data-ke-size=&quot;size23&quot;&gt;3. 글자를 자르고 합치는 함수&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;CONCAT(str1, str2)&lt;/b&gt;&lt;/span&gt;: 두 글자를 이어 붙인다. (데이터베이스에 따라 &lt;b&gt;||&lt;/b&gt; 기호를 쓰기도 함.)&lt;br /&gt;&lt;br /&gt;&lt;b&gt;SUBSTRING(str, pos, len)&lt;/b&gt;&lt;br /&gt;: 원하는 위치부터 원하는 길이만큼만 잘라냄&lt;br /&gt;&lt;br /&gt;예:&lt;span style=&quot;color: #009a87;&quot;&gt; SUBSTRING&lt;/span&gt;('20260611', 1, 4) -&amp;gt; '&lt;span style=&quot;color: #ffc1c8;&quot;&gt;2026&lt;/span&gt;' (연도만 추출)&lt;br /&gt;&lt;br /&gt;&lt;/blockquote&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-path-to-node=&quot;9&quot; data-ke-size=&quot;size23&quot;&gt;4. 정리하는 함수 (공백 및 치환)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;10&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;10,0,0&quot;&gt;TRIM(str) / LTRIM(str) / RTRIM(str)&lt;/b&gt;: 글자 앞뒤의 쓸데없는 공백을 지워준다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;10,1,0&quot;&gt;REPLACE(str, from, to)&lt;/b&gt;: 문자열 안의 특정 글자를 다른 글자로 바꾼다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;10,1,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;예: REPLACE('010-1234-5678', '-', '') -&amp;gt; '01012345678' (하이픈 제거)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-path-to-node=&quot;11&quot; data-ke-size=&quot;size23&quot;&gt;5. 자리를 맞추는 함수 (채움)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;12&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;12,0,0&quot;&gt;LPAD(str, len, pad) / RPAD(str, len, pad)&lt;/b&gt;: 글자 길이가 일정하지 않을 때, 빈 공간을 특정 문자로 채워 길이를 맞춥니다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;12,0,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;예: LPAD('1', 3, '0') -&amp;gt; '001' (보고서 출력 시 자릿수 맞추기에 유용)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;함수의 용도&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;문자열&amp;middot;숫자&amp;middot;날짜 데이터 &lt;b&gt;가공 및 변환&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;NULL 값 &lt;b&gt;처리&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;여러 행을 하나의 값으로 &lt;b&gt;집계 (합계, 평균 등)&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-10 174404.png&quot; data-origin-width=&quot;884&quot; data-origin-height=&quot;264&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dLaHtj/dJMcaiKlNpV/EcrYuX3aA776vnUkFqnKE1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dLaHtj/dJMcaiKlNpV/EcrYuX3aA776vnUkFqnKE1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dLaHtj/dJMcaiKlNpV/EcrYuX3aA776vnUkFqnKE1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdLaHtj%2FdJMcaiKlNpV%2FEcrYuX3aA776vnUkFqnKE1%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;884&quot; height=&quot;264&quot; data-filename=&quot;스크린샷 2026-06-10 174404.png&quot; data-origin-width=&quot;884&quot; data-origin-height=&quot;264&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;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;관계형 데이터베이스(RDB)&lt;/h2&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;모든 데이터를&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;테이블(표) 형태&lt;/b&gt;로 저장하고,&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;테이블 간의&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;관계(Relation)&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;를 통해 데이터의 연결성과 정합성을 유지하는 데이터베이스&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;3&quot; data-ke-size=&quot;size16&quot;&gt;엑셀은 데이터를 그냥 나열하는 '파일'이지만, RDB는 데이터를 '구조적으로 관리'.&lt;/p&gt;
&lt;p data-path-to-node=&quot;3&quot; data-ke-size=&quot;size16&quot;&gt;이 구조를 만드는 핵심이 바로 기본키(Primary Key)와 외래키(Foreign Key)라는 개념이다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;4&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;4,0,0&quot;&gt;기본키(Primary Key, PK):&lt;/b&gt; 테이블에서 &quot;너 누구야?&quot;라고 물었을 때, 딱 한 사람만 지목할 수 있는 고유한 값. (예: 회원번호)&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;4,1,0&quot;&gt;외래키(Foreign Key, FK):&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 style=&quot;text-align: center;&quot; data-path-to-node=&quot;5&quot; data-ke-size=&quot;size20&quot;&gt;[이해를 돕는 예시]&lt;/h4&gt;
&lt;p style=&quot;text-align: left;&quot; data-path-to-node=&quot;6&quot; data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;여기 '회원' 테이블과 '주문' 테이블이 있다&lt;/i&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;7&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;7,0,0&quot;&gt;회원 테이블&lt;/b&gt; (PK: 회원번호)
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;7,0,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;1번, 홍길동, 서울&lt;/li&gt;
&lt;li&gt;2번, 김철수, 부산&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;7,1,0&quot;&gt;주문 테이블&lt;/b&gt; (PK: 주문번호, &lt;b data-index-in-node=&quot;18&quot; data-path-to-node=&quot;7,1,0&quot;&gt;FK: 회원번호&lt;/b&gt;)
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;7,1,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;101번, 사과, 1번 회원&lt;/li&gt;
&lt;li&gt;102번, 배, 1번 회원&lt;/li&gt;
&lt;li&gt;103번, 포도, 2번 회원&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;text-align: center;&quot; data-path-to-node=&quot;8&quot; data-ke-size=&quot;size16&quot;&gt;만약 홍길동(1번)이 이사를 가서 주소를 수정해야 한다면? RDB는 &lt;b data-index-in-node=&quot;38&quot; data-path-to-node=&quot;8&quot;&gt;회원 테이블의 주소만 딱 한 번 수정&lt;/b&gt;하면 된다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;8&quot; data-ke-size=&quot;size16&quot;&gt;주문 테이블은 그냥 '1번 회원'을 계속 가리키고 있기 때문. 엑셀처럼 모든 주문 내역을 뒤져서 홍길동의 주소를 일일이 바꿀 필요가 X. 이것이 바로 데이터가 꼬이지 않게 유지하는 '&lt;u&gt;데이터 적합성&lt;/u&gt;'이라고 한다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;8&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;핵심 구성 요소&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;테이블 (Table)&lt;/td&gt;
&lt;td&gt;데이터를 저장하는 기본 단위 (= 엑셀 시트)&lt;/td&gt;
&lt;td&gt;users, orders, products&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;행 (Row)&lt;/td&gt;
&lt;td&gt;하나의 레코드, 실제 데이터 1건&lt;/td&gt;
&lt;td&gt;홍길동, &lt;a href=&quot;mailto:hong@example.com&quot;&gt;hong@example.com&lt;/a&gt;, 25&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;열 (Column)&lt;/td&gt;
&lt;td&gt;데이터의 속성(항목)&lt;/td&gt;
&lt;td&gt;name, email, age&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;기본키 (PK)&lt;/td&gt;
&lt;td&gt;각 행을 고유하게 식별하는 값&lt;/td&gt;
&lt;td&gt;user_id = 1, 2, 3...&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;외래키 (FK)&lt;/td&gt;
&lt;td&gt;다른 테이블의 기본키를 참조하는 값&lt;/td&gt;
&lt;td&gt;orders.user_id &amp;rarr; &lt;a href=&quot;http://users.id&quot;&gt;users.id&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;SQL의 주요 특징&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;선언형 언어&lt;/td&gt;
&lt;td&gt;무엇을 할지만 작성하면, 어떻게 처리할지는 DB가 결정&lt;/td&gt;
&lt;td&gt;SELECT name FROM users&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;표준 언어&lt;/td&gt;
&lt;td&gt;ANSI/ISO 표준 &amp;rarr; MySQL, Oracle, PostgreSQL 모두 사용 가능&lt;/td&gt;
&lt;td&gt;대부분의 문법이 DB 간 호환&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DDL&lt;/td&gt;
&lt;td&gt;데이터 구조(테이블) 정의&lt;/td&gt;
&lt;td&gt;CREATE, ALTER, DROP&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DML&lt;/td&gt;
&lt;td&gt;데이터 조작 (조회&amp;middot;입력&amp;middot;수정&amp;middot;삭제)&lt;/td&gt;
&lt;td&gt;SELECT, INSERT, UPDATE, DELETE&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DCL&lt;/td&gt;
&lt;td&gt;접근 권한 제어&lt;/td&gt;
&lt;td&gt;GRANT, REVOKE&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TCL&lt;/td&gt;
&lt;td&gt;트랜잭션 제어&lt;/td&gt;
&lt;td&gt;COMMIT, ROLLBACK&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-path-to-node=&quot;0&quot; data-ke-size=&quot;size26&quot;&gt;트랜잭션(Transaction)&lt;/h2&gt;
&lt;p data-path-to-node=&quot;0&quot; data-ke-size=&quot;size18&quot;&gt;데이터베이스의 상태를 변화시키기 위해 수행하는 &lt;b data-index-in-node=&quot;45&quot; data-path-to-node=&quot;0&quot;&gt;작업의 단위.&lt;/b&gt;&lt;/p&gt;
&lt;p data-path-to-node=&quot;0&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;단순히 하나의 쿼리문이 아니라, 여러 작업을 하나로 묶어 처리할 때 사용&lt;/p&gt;
&lt;p data-path-to-node=&quot;1&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;2&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;2,0,0&quot;&gt;원자성 (Atomicity):&lt;/b&gt; 트랜잭션 내의 모든 작업은 반&lt;span style=&quot;color: #ee2323;&quot;&gt;드시 모두 성공하거나, 모두 실패해야 한다&lt;/span&gt;. 하나라도 실패하면 전체가 취소됩니다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;2,1,0&quot;&gt;일관성 (Consistency):&lt;/b&gt; 트랜잭션이 완료되면 데이터베이스는 언제나 &lt;span style=&quot;color: #ee2323;&quot;&gt;일관된 상태&lt;/span&gt;를 유지해야 한다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;2,2,0&quot;&gt;격리성 (Isolation):&lt;/b&gt; 트랜잭션 수행 중에는 다른 트랜잭션의 작업이 끼어들지 못하도록 &lt;span style=&quot;color: #ee2323;&quot;&gt;독립성을 보장&lt;span style=&quot;color: #000000;&quot;&gt;해야한다.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;2,3,0&quot;&gt;지속성 (Durability):&lt;/b&gt; 성공적으로 완료된 트랜잭션의 결과는 영구적으로 데이터베이스에 반영되어야 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-path-to-node=&quot;3&quot; data-ke-size=&quot;size16&quot;&gt;쉽게 말해, 계좌 이체를 할 때 '내 계좌에서 돈이 빠지는 작업'과 '상대 계좌에 돈이 들어가는 작업'은 &lt;b data-index-in-node=&quot;59&quot; data-path-to-node=&quot;3&quot;&gt;하나의 트랜잭션&lt;/b&gt;으로 묶여야 한다. 둘 중 하나만 성공하면 데이터에 오류가 생기기 때문.&lt;/p&gt;
&lt;p data-path-to-node=&quot;3&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;img style=&quot;text-align: center; caret-color: transparent; color: #333333; font-size: 16px; letter-spacing: 0px;&quot; src=&quot;https://blog.kakaocdn.net/dna/blx555/dJMcad3k9J9/AAAAAAAAAAAAAAAAAAAAALtgNjlFmC97oTJ2LWM9kmgIo4zCz7DpQ_pbs4hRFXgr/img.png?credential=yqXZFxpELC7KVnFOS48ylbz2pIh7yKj8&amp;amp;expires=1782831599&amp;amp;allow_ip=&amp;amp;allow_referer=&amp;amp;signature=HIGpck%2B%2FI8LE8dJRwNxGShKJkSs%3D&quot; data-origin-width=&quot;906&quot; data-origin-height=&quot;558&quot; data-filename=&quot;스크린샷 2026-06-10 174349.png&quot; data-is-animation=&quot;false&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;&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;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;lt;연습문제&amp;gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;use&amp;nbsp;tdb; &lt;br /&gt;&lt;br /&gt;&lt;b&gt;--&amp;nbsp;1.&amp;nbsp;이름이&amp;nbsp;'연'으로&amp;nbsp;끝나는&amp;nbsp;사원들의&amp;nbsp;사원명,&amp;nbsp;입사일&amp;nbsp;조회&lt;/b&gt; &lt;br /&gt;select&amp;nbsp;emp_name,&amp;nbsp;hire_date &lt;br /&gt;from&amp;nbsp;employee &lt;br /&gt;where&amp;nbsp;emp_name&amp;nbsp;like&amp;nbsp;'%연'; &lt;br /&gt;&lt;br /&gt;&lt;b&gt;--&amp;nbsp;2.&amp;nbsp;전화번호&amp;nbsp;처음&amp;nbsp;3자리가&amp;nbsp;010이&amp;nbsp;아닌&amp;nbsp;사원들의&amp;nbsp;사원명,&amp;nbsp;전화번호&amp;nbsp;조회&lt;/b&gt; &lt;br /&gt;select&amp;nbsp;emp_name,&amp;nbsp;phone &lt;br /&gt;from&amp;nbsp;employee &lt;br /&gt;where&amp;nbsp;phone&amp;nbsp;not&amp;nbsp;like&amp;nbsp;'010%'; &lt;br /&gt;&lt;br /&gt;&lt;b&gt;--&amp;nbsp;3.&amp;nbsp;이름에&amp;nbsp;'하'가&amp;nbsp;포함되어있고&amp;nbsp;급여가&amp;nbsp;240만원&amp;nbsp;이상인&amp;nbsp;사원들의&amp;nbsp;사원명,&amp;nbsp;급여&amp;nbsp;조회&lt;/b&gt; &lt;br /&gt;select&amp;nbsp;emp_name,&amp;nbsp;salary &lt;br /&gt;from&amp;nbsp;employee &lt;br /&gt;where&amp;nbsp;emp_name&amp;nbsp;like&amp;nbsp;'%하%'&amp;nbsp;and&amp;nbsp;salary&amp;nbsp;&amp;gt;=&amp;nbsp;2400000; &lt;br /&gt;&lt;br /&gt;&lt;b&gt;--&amp;nbsp;4.&amp;nbsp;부서(DEPARTMENT)&amp;nbsp;테이블에서&amp;nbsp;해외영업부서인&amp;nbsp;부서들의&amp;nbsp;부서코드,&amp;nbsp;부서명&amp;nbsp;조회&lt;/b&gt; &lt;br /&gt;select&amp;nbsp;dept_id,&amp;nbsp;dept_title &lt;br /&gt;from&amp;nbsp;department &lt;br /&gt;where&amp;nbsp;dept_title&amp;nbsp;like&amp;nbsp;'해외영업%'; &lt;br /&gt;&lt;br /&gt;&lt;b&gt;--&amp;nbsp;5.&amp;nbsp;사수(MANAGER)가&amp;nbsp;없고&amp;nbsp;부서배치도&amp;nbsp;받지&amp;nbsp;않은&amp;nbsp;사원들의&amp;nbsp;사원명,&amp;nbsp;사번,&amp;nbsp;부서코드&amp;nbsp;조회&lt;/b&gt; &lt;br /&gt;select&amp;nbsp;emp_name,&amp;nbsp;emp_id,&amp;nbsp;dept_code &lt;br /&gt;from&amp;nbsp;employee &lt;br /&gt;where&amp;nbsp;manager_id&amp;nbsp;is&amp;nbsp;null&amp;nbsp;and&amp;nbsp;dept_code&amp;nbsp;is&amp;nbsp;null; &lt;br /&gt;&lt;br /&gt;&lt;b&gt;--&amp;nbsp;6.&amp;nbsp;연봉(급여&amp;nbsp;*&amp;nbsp;12)이&amp;nbsp;3천만원&amp;nbsp;이상이고&amp;nbsp;보너스를&amp;nbsp;받지&amp;nbsp;않는&amp;nbsp;사원들의&amp;nbsp;사번,&amp;nbsp;사원명,&amp;nbsp;급여,&amp;nbsp;보너스&amp;nbsp;조회&lt;/b&gt; &lt;br /&gt;select&amp;nbsp;emp_id,&amp;nbsp;emp_name,&amp;nbsp;salary,&amp;nbsp;bonus &lt;br /&gt;from&amp;nbsp;employee &lt;br /&gt;where&amp;nbsp;(salary&amp;nbsp;*&amp;nbsp;12)&amp;nbsp;&amp;gt;=&amp;nbsp;30000000&amp;nbsp;and&amp;nbsp;bonus&amp;nbsp;is&amp;nbsp;null; &lt;br /&gt;&lt;br /&gt;&lt;b&gt;--&amp;nbsp;7.&amp;nbsp;입사일이&amp;nbsp;'1995-01-01'&amp;nbsp;이상이고&amp;nbsp;부서배치를&amp;nbsp;받지&amp;nbsp;않은&amp;nbsp;사원들의&amp;nbsp;사번,&amp;nbsp;사원명,&amp;nbsp;입사일,&amp;nbsp;부서코드&amp;nbsp;조회&lt;/b&gt; &lt;br /&gt;select&amp;nbsp;emp_id,&amp;nbsp;emp_name,&amp;nbsp;hire_date,&amp;nbsp;dept_code &lt;br /&gt;from&amp;nbsp;employee &lt;br /&gt;where&amp;nbsp;hire_date&amp;nbsp;&amp;gt;=&amp;nbsp;'1995-01-01'&amp;nbsp;and&amp;nbsp;dept_code&amp;nbsp;is&amp;nbsp;null; &lt;br /&gt;&lt;br /&gt;&lt;b&gt;--&amp;nbsp;8.&amp;nbsp;급여가&amp;nbsp;200만원&amp;nbsp;이상&amp;nbsp;500만원&amp;nbsp;이하이면서&amp;nbsp;입사일이&amp;nbsp;'2001-01-01'&amp;nbsp;이상이고&amp;nbsp;보너스를&amp;nbsp;받지&amp;nbsp;않는&amp;nbsp;사원&amp;nbsp;조회&lt;/b&gt; &lt;br /&gt;select&amp;nbsp;*&amp;nbsp; &lt;br /&gt;from&amp;nbsp;employee &lt;br /&gt;where&amp;nbsp;salary&amp;nbsp;between&amp;nbsp;2000000&amp;nbsp;and&amp;nbsp;5000000 &lt;br /&gt;&amp;nbsp;&amp;nbsp;and&amp;nbsp;hire_date&amp;nbsp;&amp;gt;=&amp;nbsp;'2001-01-01' &lt;br /&gt;&amp;nbsp;&amp;nbsp;and&amp;nbsp;bonus&amp;nbsp;is&amp;nbsp;null; &lt;br /&gt;&lt;br /&gt;&lt;b&gt;--&amp;nbsp;9.&amp;nbsp;보너스를&amp;nbsp;포함한&amp;nbsp;연봉((SALARY&amp;nbsp;+&amp;nbsp;(SALARY&amp;nbsp;*&amp;nbsp;BONUS))&amp;nbsp;*&amp;nbsp;12)이&amp;nbsp;NULL이&amp;nbsp;아니고&amp;nbsp;이름에&amp;nbsp;'하'가&amp;nbsp;포함된&amp;nbsp;사원&amp;nbsp;조회&lt;/b&gt; &lt;br /&gt;select&amp;nbsp;*&amp;nbsp;from&amp;nbsp;employee &lt;br /&gt;where&amp;nbsp;((SALARY&amp;nbsp;+&amp;nbsp;(SALARY&amp;nbsp;*&amp;nbsp;BONUS))&amp;nbsp;*&amp;nbsp;12)&amp;nbsp;is&amp;nbsp;not&amp;nbsp;null &lt;br /&gt;and&amp;nbsp;emp_name&amp;nbsp;like&amp;nbsp;'%하%'; &lt;br /&gt;&lt;br /&gt;&lt;b&gt;--&amp;nbsp;10.&amp;nbsp;사원명(이름)이&amp;nbsp;'이'로&amp;nbsp;시작하거나&amp;nbsp;'연'으로&amp;nbsp;끝나는&amp;nbsp;사원들의&amp;nbsp;사번,&amp;nbsp;사원명&amp;nbsp;조회&lt;/b&gt; &lt;br /&gt;select&amp;nbsp;emp_id,&amp;nbsp;emp_name &lt;br /&gt;from&amp;nbsp;employee &lt;br /&gt;where&amp;nbsp;emp_name&amp;nbsp;like&amp;nbsp;'이%'&amp;nbsp;or&amp;nbsp;emp_name&amp;nbsp;like&amp;nbsp;'%연'; &lt;br /&gt;&lt;br /&gt;&lt;b&gt;--&amp;nbsp;11.&amp;nbsp;부서코드가&amp;nbsp;'D1',&amp;nbsp;'D2',&amp;nbsp;'D3'&amp;nbsp;중&amp;nbsp;하나이면서,&amp;nbsp;사수(MANAGER)가&amp;nbsp;배정되어&amp;nbsp;있는&amp;nbsp;사원들의&amp;nbsp;사원명,&amp;nbsp;직급코드,&amp;nbsp;부서코드,&amp;nbsp;관리자사번&amp;nbsp;조회&lt;/b&gt; &lt;br /&gt;select&amp;nbsp;emp_name,&amp;nbsp;job_code,&amp;nbsp;dept_code,&amp;nbsp;manager_id &lt;br /&gt;from&amp;nbsp;employee &lt;br /&gt;where&amp;nbsp;dept_code&amp;nbsp;in&amp;nbsp;('d1',&amp;nbsp;'d2',&amp;nbsp;'d3') &lt;br /&gt;&amp;nbsp;&amp;nbsp;and&amp;nbsp;manager_id&amp;nbsp;is&amp;nbsp;not&amp;nbsp;null; &lt;br /&gt;&lt;br /&gt;&lt;b&gt;--&amp;nbsp;12.&amp;nbsp;급여가&amp;nbsp;250만&amp;nbsp;원&amp;nbsp;이상&amp;nbsp;350만&amp;nbsp;원&amp;nbsp;이하인&amp;nbsp;사원&amp;nbsp;중에서,&amp;nbsp;직급코드(JOB_CODE)가&amp;nbsp;'J3'가&amp;nbsp;아닌&amp;nbsp;사원들의&amp;nbsp;사원명,&amp;nbsp;급여,&amp;nbsp;직급코드&amp;nbsp;조회&lt;/b&gt; &lt;br /&gt;select&amp;nbsp;emp_name,&amp;nbsp;salary,&amp;nbsp;job_code &lt;br /&gt;from&amp;nbsp;employee &lt;br /&gt;where&amp;nbsp;salary&amp;nbsp;between&amp;nbsp;2500000&amp;nbsp;and&amp;nbsp;3500000 &lt;br /&gt;&amp;nbsp;&amp;nbsp;and&amp;nbsp;job_code&amp;nbsp;!=&amp;nbsp;'j3'; &lt;br /&gt;&lt;br /&gt;&lt;b&gt;--&amp;nbsp;13.&amp;nbsp;2000년&amp;nbsp;1월&amp;nbsp;1일&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;/b&gt;&lt;br /&gt;&lt;b&gt;--&amp;nbsp;(단,&amp;nbsp;보너스가&amp;nbsp;없는&amp;nbsp;사원은&amp;nbsp;0으로&amp;nbsp;계산할&amp;nbsp;것)&lt;/b&gt; &lt;br /&gt;select&amp;nbsp;emp_name,&amp;nbsp;hire_date,&amp;nbsp;salary&amp;nbsp;+&amp;nbsp;(salary&amp;nbsp;*&amp;nbsp;ifnull(bonus,&amp;nbsp;0))&amp;nbsp;as&amp;nbsp;실수령금 &lt;br /&gt;from&amp;nbsp;employee &lt;br /&gt;where&amp;nbsp;hire_date&amp;nbsp;&amp;lt;&amp;nbsp;'2000-01-01'; &lt;br /&gt;&lt;br /&gt;&lt;b&gt;--&amp;nbsp;14.&amp;nbsp;전화번호&amp;nbsp;중간에&amp;nbsp;'666'이&amp;nbsp;포함되고,&amp;nbsp;부서코드가&amp;nbsp;'D9'&amp;nbsp;또는&amp;nbsp;'D6'인&amp;nbsp;사원들의&amp;nbsp;사원명,&amp;nbsp;전화번호,&amp;nbsp;부서코드&amp;nbsp;조회&lt;/b&gt; &lt;br /&gt;select&amp;nbsp;emp_name,&amp;nbsp;phone,&amp;nbsp;dept_code &lt;br /&gt;from&amp;nbsp;employee &lt;br /&gt;where&amp;nbsp;phone&amp;nbsp;like&amp;nbsp;'%666%' &lt;br /&gt;&amp;nbsp;&amp;nbsp;and&amp;nbsp;dept_code&amp;nbsp;in&amp;nbsp;('d9',&amp;nbsp;'d6'); &lt;br /&gt;&lt;br /&gt;&lt;b&gt;--&amp;nbsp;15.&amp;nbsp;이메일(EMAIL)&amp;nbsp;주소에&amp;nbsp;'kh.co.kr'이&amp;nbsp;포함된&amp;nbsp;사원들&amp;nbsp;중,&amp;nbsp;급여가&amp;nbsp;300만원&amp;nbsp;이상인&amp;nbsp;사원들의&amp;nbsp;사원명,&amp;nbsp;이메일,&amp;nbsp;급여를&amp;nbsp;조회&lt;/b&gt; &lt;br /&gt;select&amp;nbsp;emp_name,&amp;nbsp;email,&amp;nbsp;salary &lt;br /&gt;from&amp;nbsp;employee &lt;br /&gt;where&amp;nbsp;email&amp;nbsp;like&amp;nbsp;'%kh.co.kr%' &lt;br /&gt;&amp;nbsp;&amp;nbsp;and&amp;nbsp;salary&amp;nbsp;&amp;gt;=&amp;nbsp;3000000;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;</description>
      <category>개발자 호소인/SQL</category>
      <author>리제 </author>
      <guid isPermaLink="true">https://bookstairs.tistory.com/59</guid>
      <comments>https://bookstairs.tistory.com/59#entry59comment</comments>
      <pubDate>Tue, 9 Jun 2026 18:43:59 +0900</pubDate>
    </item>
    <item>
      <title>[책 추천] 유발 하라리 - 넥서스</title>
      <link>https://bookstairs.tistory.com/58</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/MN0vn/dJMcagltaBx/PLghdDj9qS4lRidG1nWPQk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/MN0vn/dJMcagltaBx/PLghdDj9qS4lRidG1nWPQk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/MN0vn/dJMcagltaBx/PLghdDj9qS4lRidG1nWPQk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMN0vn%2FdJMcagltaBx%2FPLghdDj9qS4lRidG1nWPQk%2Fimg.jpg&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;3024&quot; height=&quot;4032&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;오랜만에 읽는 유발하라리의 책 #넥서스 #Nexus&lt;br /&gt;표지의 비둘기가 무슨 뜻인지 궁금하지 않은가? &lt;br /&gt;&lt;br /&gt;비둘기는 인류 역사에서 아주 오랫동안 가장 빠르고 &lt;br /&gt;효율적인 정보 전달 매개체 역할을 했다. &lt;br /&gt;&lt;br /&gt;인류가 생존과 권력을 위해 정보를 &lt;br /&gt;연결하기 시작했던 가장 원초적인 &amp;rsquo;넥서스&amp;lsquo;인 셈이다.&lt;br /&gt;&lt;br /&gt;저자는 비둘기로 대변되는 과거의 순수한 정보 네트워크가, 어떻게 현대에 이르러 인류를 위협하는 거대하고 통제 불가능한 AI 넥서스로 진화했는지를 극적으로 대비시키기 위해 이 상징을 사용한 것이다.&lt;br /&gt;&lt;br /&gt;비둘기가 현대의 인터넷을 거쳐, 미래의 AI(알고리즘)라는 새로운 넥서스로 이어지는 과정과 그 위험성을 경고하는 메세지를 담고 있는 이책은, &lt;br /&gt;&lt;br /&gt;자기 교정 능력의 상실이 얼마나 위험한지 경고한다. &lt;br /&gt;과거 비둘기가 나르는 편지는 인간이 쓰고 인간이 검검할 수 있었다.&lt;br /&gt;정보에 오류가 있으면 인간이 수정하는 스스로 교정 하는 시스템이 있었다, &lt;br /&gt;&lt;br /&gt;하지만 지금의 AI와 알고리즘은 인간의 통제를 벗어나 스스로 정보를 생산하고 연결망을 확장하고 있다.&lt;br /&gt;&lt;br /&gt;우리는 무엇을 위해 &lt;br /&gt;무엇을 내어주고 있는가&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bfvPkK/dJMcabYOVv0/NgwZQtNoqnp4U3e7xRKAR1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bfvPkK/dJMcabYOVv0/NgwZQtNoqnp4U3e7xRKAR1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bfvPkK/dJMcabYOVv0/NgwZQtNoqnp4U3e7xRKAR1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbfvPkK%2FdJMcabYOVv0%2FNgwZQtNoqnp4U3e7xRKAR1%2Fimg.jpg&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;3024&quot; height=&quot;4032&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bc4bij/dJMcagltaBt/xGeX1Phc0LSu5ukp3az1b0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bc4bij/dJMcagltaBt/xGeX1Phc0LSu5ukp3az1b0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bc4bij/dJMcagltaBt/xGeX1Phc0LSu5ukp3az1b0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbc4bij%2FdJMcagltaBt%2FxGeX1Phc0LSu5ukp3az1b0%2Fimg.jpg&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;3024&quot; height=&quot;4032&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ldf5e/dJMcabYOVv8/xXLLvMxpOVfIwudlmMsxE1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ldf5e/dJMcabYOVv8/xXLLvMxpOVfIwudlmMsxE1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ldf5e/dJMcabYOVv8/xXLLvMxpOVfIwudlmMsxE1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fldf5e%2FdJMcabYOVv8%2FxXLLvMxpOVfIwudlmMsxE1%2Fimg.jpg&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;3024&quot; height=&quot;4032&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>책추천</category>
      <author>리제 </author>
      <guid isPermaLink="true">https://bookstairs.tistory.com/58</guid>
      <comments>https://bookstairs.tistory.com/58#entry58comment</comments>
      <pubDate>Mon, 8 Jun 2026 18:54:29 +0900</pubDate>
    </item>
    <item>
      <title>[잉크] 페리스 휠 프레스 - 스윗 허니듀</title>
      <link>https://bookstairs.tistory.com/57</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;945&quot; data-origin-height=&quot;1522&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/SN6RO/dJMcagMBLBG/6Jsho0a3G6a89D5RAU51hk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/SN6RO/dJMcagMBLBG/6Jsho0a3G6a89D5RAU51hk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/SN6RO/dJMcagMBLBG/6Jsho0a3G6a89D5RAU51hk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FSN6RO%2FdJMcagMBLBG%2F6Jsho0a3G6a89D5RAU51hk%2Fimg.jpg&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;945&quot; height=&quot;1522&quot; data-origin-width=&quot;945&quot; data-origin-height=&quot;1522&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;캐나다브랜드 페리스 휠 프레스 &lt;br /&gt;향수병같은 이쁜 디자인과 과감한 색으로 유명한 브랜드다.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;4032&quot; data-origin-height=&quot;3024&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bzm2iR/dJMcagMBLBN/fGveMycekPQpr1N3E2kkvK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bzm2iR/dJMcagMBLBN/fGveMycekPQpr1N3E2kkvK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bzm2iR/dJMcagMBLBN/fGveMycekPQpr1N3E2kkvK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbzm2iR%2FdJMcagMBLBN%2FfGveMycekPQpr1N3E2kkvK%2Fimg.jpg&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;4032&quot; height=&quot;3024&quot; data-origin-width=&quot;4032&quot; data-origin-height=&quot;3024&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;딥펜과 같이 샀는데 &lt;br /&gt;딥펜은 &amp;hellip; 불만족이다.. 유격이 문제가 있는지 &lt;br /&gt;무척 흔들리고 잉크를 생각보다 많이 품지못해서 &lt;br /&gt;유리펜이 차라리 낫다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;4032&quot; data-origin-height=&quot;3024&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/AJq7A/dJMcagMBLBO/gBwxp54ypFtyH1qkcZ5To1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/AJq7A/dJMcagMBLBO/gBwxp54ypFtyH1qkcZ5To1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/AJq7A/dJMcagMBLBO/gBwxp54ypFtyH1qkcZ5To1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAJq7A%2FdJMcagMBLBO%2FgBwxp54ypFtyH1qkcZ5To1%2Fimg.jpg&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;4032&quot; height=&quot;3024&quot; data-origin-width=&quot;4032&quot; data-origin-height=&quot;3024&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;4032&quot; data-origin-height=&quot;3024&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cHukg9/dJMcabdmkun/lCFmzFRqfmWWMk4EvZmKkK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cHukg9/dJMcabdmkun/lCFmzFRqfmWWMk4EvZmKkK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cHukg9/dJMcabdmkun/lCFmzFRqfmWWMk4EvZmKkK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcHukg9%2FdJMcabdmkun%2FlCFmzFRqfmWWMk4EvZmKkK%2Fimg.jpg&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;4032&quot; height=&quot;3024&quot; data-origin-width=&quot;4032&quot; data-origin-height=&quot;3024&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cIIz4B/dJMcagMBLBP/qjXK5doTXeUZ1IwFO5mKlk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cIIz4B/dJMcagMBLBP/qjXK5doTXeUZ1IwFO5mKlk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cIIz4B/dJMcagMBLBP/qjXK5doTXeUZ1IwFO5mKlk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcIIz4B%2FdJMcagMBLBP%2FqjXK5doTXeUZ1IwFO5mKlk%2Fimg.jpg&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;3024&quot; height=&quot;4032&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/BkY4p/dJMcabdmkup/KTYBaYUHsirEEo4nrCBvz0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/BkY4p/dJMcabdmkup/KTYBaYUHsirEEo4nrCBvz0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/BkY4p/dJMcabdmkup/KTYBaYUHsirEEo4nrCBvz0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBkY4p%2FdJMcabdmkup%2FKTYBaYUHsirEEo4nrCBvz0%2Fimg.jpg&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;3024&quot; height=&quot;4032&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;마개있는 잉크는 첨본다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ZXE2m/dJMcabdmkuo/sPUlF2iUTcl5xKAu565WG1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ZXE2m/dJMcabdmkuo/sPUlF2iUTcl5xKAu565WG1/img.jpg&quot; data-alt=&quot;발색샷!&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ZXE2m/dJMcabdmkuo/sPUlF2iUTcl5xKAu565WG1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZXE2m%2FdJMcabdmkuo%2FsPUlF2iUTcl5xKAu565WG1%2Fimg.jpg&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;3024&quot; height=&quot;4032&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;발색샷!&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;메론 속살 색! 매우 이쁘다!&lt;br /&gt;어린 녹차잎같기도&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/3cdfb/dJMcabdmkur/2G7TsbjkhA0rXN1paAHtVk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3cdfb/dJMcabdmkur/2G7TsbjkhA0rXN1paAHtVk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3cdfb/dJMcabdmkur/2G7TsbjkhA0rXN1paAHtVk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3cdfb%2FdJMcabdmkur%2F2G7TsbjkhA0rXN1paAHtVk%2Fimg.jpg&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;3024&quot; height=&quot;4032&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;4284&quot; data-origin-height=&quot;5712&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bCYL0j/dJMcabdmkut/s9xxCXSg9ckeVwDwxfuC1K/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bCYL0j/dJMcabdmkut/s9xxCXSg9ckeVwDwxfuC1K/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bCYL0j/dJMcabdmkut/s9xxCXSg9ckeVwDwxfuC1K/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbCYL0j%2FdJMcabdmkut%2Fs9xxCXSg9ckeVwDwxfuC1K%2Fimg.jpg&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;4284&quot; height=&quot;5712&quot; data-origin-width=&quot;4284&quot; data-origin-height=&quot;5712&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;종이 발색을 해봤다.&lt;br /&gt;왕의길이나 녹차랑 비교했는 때 확실히 명도가 높고 맑다.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>연장⛏ (만년필, 잉크,노트 등)</category>
      <author>리제 </author>
      <guid isPermaLink="true">https://bookstairs.tistory.com/57</guid>
      <comments>https://bookstairs.tistory.com/57#entry57comment</comments>
      <pubDate>Mon, 8 Jun 2026 18:51:07 +0900</pubDate>
    </item>
    <item>
      <title>Java 미니 프로젝트 제작 과제</title>
      <link>https://bookstairs.tistory.com/56</link>
      <description>&lt;h3 data-path-to-node=&quot;2&quot; 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;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;3&quot; data-ke-size=&quot;size16&quot;&gt;서울과 같은 대도시에서 우리는 필연적으로 타인과 밀접한 거리에서 살아갑니다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;3&quot; data-ke-size=&quot;size16&quot;&gt;한국에서 유독 '비누 향' 향수가 큰 사랑을 받는 이유는 바로 이 밀집된 환경 때문이라고 생각합니다. 비누 향은 타인에게 '위생적이고 관리된 상태'라는 신뢰를 주며, 가장 안전하고 배려 깊은 에티켓으로 기능하기 때문입니다. 저는 여기서 한 걸음 더 나아가, 위생적인 에티켓을 넘어 &lt;b data-index-in-node=&quot;219&quot; data-path-to-node=&quot;3&quot;&gt;나만의 향기로운 취향을 타인에게도 안전하게 전달할 방법&lt;/b&gt;을 고민해 보았습니다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;4&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;4&quot; data-ke-size=&quot;size16&quot;&gt;기존의 향수 추천 서비스들은 향조, 분위기, 혹은 이미지라는 감성적 요소에만 집중해 왔습니다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;4&quot; data-ke-size=&quot;size16&quot;&gt;하지만 저는 여기에 '타인에 대한 배려'라는 새로운 기준을 더했습니다. 우리가 향수 때문에 불쾌감을 느꼈던 순간을 떠올려 보면,&lt;/p&gt;
&lt;p data-path-to-node=&quot;4&quot; data-ke-size=&quot;size16&quot;&gt;대개 '원치 않는 향기를 강제적으로 맡아야 하는 상황', 특히 출퇴근길과 같은 밀집된 공간에서 발생하는 불편함이었습니다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;5&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;5&quot; data-ke-size=&quot;size16&quot;&gt;향수는 발향력과 지속성이라는 두 가지 고유한 속성을 갖습니다.보통 발향력이 좋은 향이 지속성도 좋지만&amp;nbsp; 항상 그렇지는 않습니다. 어떤 향수는 지속력은 좋지만 내 몸 주변에 응축되어 머무르기도 하거든요. 저는 이 발향력과 지속성의 차이를 &lt;b data-index-in-node=&quot;150&quot; data-path-to-node=&quot;5&quot;&gt;생활공간의 밀집도&lt;/b&gt;와 연결하여 데이터를 설계했습니다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;5&quot; data-ke-size=&quot;size16&quot;&gt;사용자가 머무는 환경에 따라 가장 적합한 향을 선택할 수 있도록 리스트를 구조화하였고, 이를 통해&amp;nbsp; &amp;nbsp;취향과 배려가 공존하는 향기 큐레이션을 구현하고자 했습니다.&lt;br /&gt;&amp;nbsp;사용자 경험(UX)을 중요하게 생각하기 때문에 단순 과제로 그치지 않고,&amp;nbsp; 실전에서 쓸 수 있도록 계속 디벨롭을 할 예정입니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;5&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;5&quot; data-ke-size=&quot;size16&quot;&gt;&lt;s&gt;---여기까지는 대본이라 존댓말.&lt;/s&gt;&lt;/p&gt;
&lt;p data-path-to-node=&quot;5&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;5&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-filename=&quot;blob&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;948&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wtgi0/dJMcabLltvc/pHrbL52Nkl42uQEwVloL20/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wtgi0/dJMcabLltvc/pHrbL52Nkl42uQEwVloL20/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wtgi0/dJMcabLltvc/pHrbL52Nkl42uQEwVloL20/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fwtgi0%2FdJMcabLltvc%2FpHrbL52Nkl42uQEwVloL20%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;1024&quot; height=&quot;948&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;948&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-path-to-node=&quot;5&quot; 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 style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;밀집도 기준은&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;u&gt;출퇴근 지옥철을&lt;/u&gt;&amp;nbsp;&lt;span style=&quot;color: #ee2323;&quot;&gt;혼잡&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;u&gt;착석 가능한 버스&lt;/u&gt; 안을 &lt;span style=&quot;color: #f89009;&quot;&gt;여유&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;u&gt;도보&lt;/u&gt;를 &lt;span style=&quot;color: #1b711d;&quot;&gt;쾌적&lt;span style=&quot;color: #000000;&quot;&gt;으로&lt;/span&gt;&amp;nbsp;&lt;/span&gt;&amp;nbsp;잡았다.&amp;nbsp;&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 data-ke-size=&quot;size16&quot;&gt;혼잡한 지하철에는 퍼스널스페이스라는 말이 무색할 정도로 타인과 밀착될 수밖에 없는 공간이기 때문에&amp;nbsp; 지속력과 발향력이 낮은 이른바 &lt;b&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;/b&gt; 향수들을 설정했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;u&gt;바닐라, 머스크,레더같이 호불호가 강한 향수는 일부러 배제했다&lt;/u&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;THIS IS A LIST ( 최종 아님 )&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 274px;&quot; border=&quot;1&quot; data-path-to-node=&quot;3&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;&lt;b&gt;계절&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;&lt;b&gt;이동수단&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;&lt;b&gt;테토&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;&lt;b&gt;에겐&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;&lt;span data-path-to-node=&quot;3,1,0,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;3,1,0,0&quot;&gt;봄&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;&lt;span data-path-to-node=&quot;3,1,1,0&quot;&gt;지하철&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;메종 마르지엘라 레플리카 프롬 더 가든&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;킬리안 뱀부하모니&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;&lt;span data-path-to-node=&quot;3,2,1,0&quot;&gt;버스&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;크리드 어벤투스&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;&lt;span data-path-to-node=&quot;3,2,3,0&quot;&gt;니샤네 우롱차 엑스트레&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;&lt;span data-path-to-node=&quot;3,3,1,0&quot;&gt;도보&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;크리드 실버마운틴&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;&lt;span data-path-to-node=&quot;3,3,3,0&quot;&gt; 바이레도 블랑쉬 &lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;&lt;span data-path-to-node=&quot;3,4,0,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;3,4,0,0&quot;&gt;여름&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;&lt;span data-path-to-node=&quot;3,4,1,0&quot;&gt;지하철&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;돌체 앤 가바나 라이트 블루&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;조 말론 우드 세이지 앤 씨 솔트&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;&lt;span data-path-to-node=&quot;3,5,1,0&quot;&gt;버스&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;&lt;span data-path-to-node=&quot;3,5,2,0&quot;&gt; 톰 포드 네롤리 포르토피노 &lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;메종 프란시스 커정 아라로즈&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 22px;&quot;&gt;
&lt;td style=&quot;height: 22px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;height: 22px;&quot;&gt;&lt;span data-path-to-node=&quot;3,6,1,0&quot;&gt;도보&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 22px;&quot;&gt;
&lt;div style=&quot;background-color: #ffffff; color: #191919; text-align: left;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;span style=&quot;text-align: right;&quot;&gt;메종 프란시스 커정 &lt;/span&gt;724&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td style=&quot;height: 22px;&quot;&gt;킬리안 선키스드 가데스&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;&lt;span data-path-to-node=&quot;3,7,0,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;3,7,0,0&quot;&gt;가을&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;&lt;span data-path-to-node=&quot;3,7,1,0&quot;&gt;지하철&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;바이레도 슈퍼 시더&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;딥디크 &lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;필로시코스&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;&lt;span data-path-to-node=&quot;3,8,1,0&quot;&gt;버스&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;딥티크 탐 다오&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;바이레도 로즈 오브 노 맨즈 랜드&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;&lt;span data-path-to-node=&quot;3,9,1,0&quot;&gt;도보&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;에르메스 테르 데르메스&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;딥티크 플레르 드 뽀&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;&lt;span data-path-to-node=&quot;3,10,0,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;3,10,0,0&quot;&gt;겨울&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;&lt;span data-path-to-node=&quot;3,10,1,0&quot;&gt;지하철&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;&lt;span data-path-to-node=&quot;3,10,2,0&quot;&gt; 퍼퓸 드 말리 레이튼 &lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;구찌 티얼스 프롬 더 문&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;&lt;span data-path-to-node=&quot;3,11,1,0&quot;&gt;버스&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;지방시 젠틀맨 리저브 프리베&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;바이레도 모하비 고스트&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;&lt;span data-path-to-node=&quot;3,12,1,0&quot;&gt;도보&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;&lt;span data-path-to-node=&quot;3,12,2,0&quot;&gt;킬리안 엔젤스 쉐어&amp;nbsp;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;샤넬 꼬로망델&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;전체적으로 니치 향수의 고급스러움은 유지하되, 지나치게 파격적이거나 호불호가 극명하게 갈리는 향들은 절제하고 대중적인 선호도가 높은 향수들 위주로 균형을 맞추기위해 여러번 수정을 거쳤다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;숨어있는 레더향과 앰보록산 향조를 찾아 여러번 바꿔서 최대한 호불호가 없는 향수들로 결정했다.&lt;/p&gt;
&lt;h3 data-path-to-node=&quot;1&quot; data-ke-size=&quot;size23&quot;&gt;  에겐(Egen) 무드: 본능을 자극하는 우아함&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;2&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;2,0,0&quot;&gt;조 말론 우드 세이지 앤 씨 솔트&lt;/b&gt;: 바다 내음 가득한 해안가에서 느끼는 자유롭고 청량한 휴식.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;2,1,0&quot;&gt;메종 프란시스 커정 아라로즈&lt;/b&gt;: 아침 이슬을 머금은 장미 꽃다발을 품에 안은 듯한 순수함.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;2,2,0&quot;&gt;킬리안 선키스드 가데스&lt;/b&gt;: 황금빛 햇살 아래 꽃들이 만개한, 매혹적이고 호화로운 여름의 정점.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;2,3,0&quot;&gt;킬리안 뱀부하모니&lt;/b&gt;: 안개 낀 대나무 숲을 거니는 듯한 정갈하고 맑은 초록빛의 정수.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;2,4,0&quot;&gt;니샤네 우롱차 엑스트레&lt;/b&gt;: 쌉싸름한 찻잎이 은은하게 번져나가는, 차분하고 깊은 사색의 향기.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;2,5,0&quot;&gt;바이레도 블랑쉬&lt;/b&gt;: 방금 세탁한 하얀 린넨에서 느껴지는 가장 깨끗하고 순수한 살냄새.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;2,6,0&quot;&gt;딥티크 필로시코스&lt;/b&gt;: 무화과 열매의 달콤함과 갓 벤 나뭇가지의 싱그러움이 어우러진 여름날의 산책.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;2,7,0&quot;&gt;바이레도 로즈 오브 노 맨즈 랜드&lt;/b&gt;: 서늘한 바람 속에서도 꺾이지 않는, 지적이고 고결한 장미의 품격.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;2,8,0&quot;&gt;딥티크 플레르 드 뽀&lt;/b&gt;: 살결과 하나 되어 더 깊고 포근하게 스며드는, 사람을 끌어당기는 치명적인 살냄새.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;2,9,0&quot;&gt;구찌 티얼스 프롬 더 문&lt;/b&gt;: 달빛이 내려앉은 정원을 거니는 듯한 맑고 신비로운 꽃들의 합창.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;2,10,0&quot;&gt;바이레도 모하비 고스트&lt;/b&gt;: 차가운 공기 속에서도 은은하게 피어나는 세련되고 따스한 머스크의 위로.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;2,11,0&quot;&gt;샤넬 꼬로망델&lt;/b&gt;: 시대를 초월한 깊이감과 압도적인 고급스러움으로 존재감을 완성하는 우아함.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-path-to-node=&quot;3&quot; data-ke-size=&quot;size23&quot;&gt;  테토(Teto) 무드: 경계를 허무는 강렬한 존재감&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;4&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;4,0,0&quot;&gt;돌체 앤 가바나 라이트 블루&lt;/b&gt;: 지중해의 뜨거운 태양과 시원한 바다가 조화된, 시트러스의 폭발적인 생기.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;4,1,0&quot;&gt;톰 포드 네롤리 포르토피노&lt;/b&gt;: 이탈리아 리비에라의 여름, 찰나의 순간을 포착한 눈부신 청량감.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;4,2,0&quot;&gt;메종 프란시스 커정 724&lt;/b&gt;: 현대 도시의 에너지를 담아낸, 막 샤워를 마친 듯한 모던하고 깨끗한 향.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;4,3,0&quot;&gt;메종 마르지엘라 프롬 더 가든&lt;/b&gt;: 흙내음이 섞인 갓 수확한 채소의 싱그러움이 전하는 자연의 순수함.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;4,4,0&quot;&gt;크리드 어벤투스&lt;/b&gt;: 정상을 향해 달리는 승리자의 자신감을 담은, 압도적인 카리스마의 정점.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;4,5,0&quot;&gt;크리드 실버마운틴&lt;/b&gt;: 눈 덮인 만년설 산맥의 서늘하고 맑은 공기를 머금은 듯한 차가운 깨끗함.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;4,6,0&quot;&gt;바이레도 슈퍼 시더&lt;/b&gt;: 잘 깎아 놓은 연필심처럼 정갈하고 차분하게 마음을 가다듬어주는 나무 향.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;4,7,0&quot;&gt;딥티크 탐 다오&lt;/b&gt;: 오래된 사찰의 숲길을 걷는 듯한, 영혼을 감싸는 부드러운 우디의 깊이.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;4,8,0&quot;&gt;에르메스 테르 데르메스&lt;/b&gt;: 흙과 나무, 대지의 생명력을 고스란히 담아낸 세련된 남성미의 완성.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;4,9,0&quot;&gt;퍼퓸 드 말리 레이튼&lt;/b&gt;: 바닐라와 라벤더가 엮어내는 관능적이고 따뜻한 밤의 유혹.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;4,10,0&quot;&gt;지방시 젠틀맨 리저브 프리베&lt;/b&gt;: 위스키의 깊고 중후한 풍미가 빚어낸 성숙한 남자의 여유.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;4,11,0&quot;&gt;킬리안 엔젤스 쉐어&lt;/b&gt;: 최고급 코냑에서 영감을 얻은, 거부할 수 없이 치명적인 달콤함의 유혹.&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;text-align: center;&quot; data-path-to-node=&quot;3&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div data-ved=&quot;0CAAQhtANahgKEwjYgY3WkO-UAxUAAAAAHQAAAAAQtwY&quot; data-hveid=&quot;0&quot;&gt;
&lt;div&gt;
&lt;h3 data-path-to-node=&quot;2&quot; data-ke-size=&quot;size23&quot;&gt;1. Perfume (데이터 모델)&lt;/h3&gt;
&lt;div data-ved=&quot;0CAAQhtANahgKEwjYgY3WkO-UAxUAAAAAHQAAAAAQ_hA&quot; data-hveid=&quot;0&quot;&gt;
&lt;div&gt;
&lt;div&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-05 173445.png&quot; data-origin-width=&quot;740&quot; data-origin-height=&quot;414&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/VKNng/dJMcagZ1p9Y/3AzmPQX4t6JMRfKfZvDrLK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/VKNng/dJMcagZ1p9Y/3AzmPQX4t6JMRfKfZvDrLK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/VKNng/dJMcagZ1p9Y/3AzmPQX4t6JMRfKfZvDrLK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FVKNng%2FdJMcagZ1p9Y%2F3AzmPQX4t6JMRfKfZvDrLK%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;740&quot; height=&quot;414&quot; data-filename=&quot;스크린샷 2026-06-05 173445.png&quot; data-origin-width=&quot;740&quot; data-origin-height=&quot;414&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;데이터 모델은 처음 설정하고 거의 바꾸지 않았다.&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-path-to-node=&quot;6&quot; data-ke-size=&quot;size23&quot;&gt;2. PerfumeLogic.java (로직 처리)&lt;/h3&gt;
&lt;h3 data-path-to-node=&quot;1&quot; data-ke-size=&quot;size23&quot;&gt;  변수 매칭 및 로직 처리 기준표&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-path-to-node=&quot;2&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;변수명&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;의미&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;데이터 타입&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;분류&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;값 (매칭 값)&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;2,1,0,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;2,1,0,0&quot;&gt;g&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;2,1,1,0&quot;&gt;Mood (성별/무드)&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;2,1,2,0&quot;&gt;int&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;2,1,3,0&quot;&gt;대분류&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;2,1,4,0&quot;&gt;1: 에겐(여성), 2: 테토(남성)&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;2,2,0,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;2,2,0,0&quot;&gt;s&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;2,2,1,0&quot;&gt;Temperature (기온)&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;2,2,2,0&quot;&gt;int&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;2,2,3,0&quot;&gt;중분류&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;2,2,4,0&quot;&gt;1: 25℃초과, 2: 19~25℃, 3: 11~18℃, 4: 10℃이하&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;2,3,0,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;2,3,0,0&quot;&gt;t&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;2,3,1,0&quot;&gt;Density (공간 밀집도)&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;2,3,2,0&quot;&gt;int&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;2,3,3,0&quot;&gt;소분류&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-path-to-node=&quot;10&quot; data-ke-size=&quot;size16&quot;&gt;변수매칭이 계속 바뀌었다.&amp;nbsp; 시즌을 나타내는 S는 계절보다는 기온을 직접 입력하도록 바꾸었고,&lt;/p&gt;
&lt;p data-path-to-node=&quot;10&quot; data-ke-size=&quot;size16&quot;&gt;성별은 무드로 바꾸어서 어쩌고 저쩌고 했다.&lt;/p&gt;
&lt;h3 data-path-to-node=&quot;10&quot; data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-path-to-node=&quot;10&quot; data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-path-to-node=&quot;10&quot; data-ke-size=&quot;size23&quot;&gt;3. Main&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-08 113407.png&quot; data-origin-width=&quot;970&quot; data-origin-height=&quot;493&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/5jDi1/dJMcahdDH9V/93rZjpRzAHVrvPnRCIhGQ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/5jDi1/dJMcahdDH9V/93rZjpRzAHVrvPnRCIhGQ1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/5jDi1/dJMcahdDH9V/93rZjpRzAHVrvPnRCIhGQ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F5jDi1%2FdJMcahdDH9V%2F93rZjpRzAHVrvPnRCIhGQ1%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;970&quot; height=&quot;493&quot; data-filename=&quot;스크린샷 2026-06-08 113407.png&quot; data-origin-width=&quot;970&quot; data-origin-height=&quot;493&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;콘솔에 보여지는 부분이기때문에 디자인 요소에 신경을 썼다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-08 113338.png&quot; data-origin-width=&quot;1225&quot; data-origin-height=&quot;612&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ctKtRg/dJMcahkrz3d/5BdiimkkcsBAvhsjMLfCt0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ctKtRg/dJMcahkrz3d/5BdiimkkcsBAvhsjMLfCt0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ctKtRg/dJMcahkrz3d/5BdiimkkcsBAvhsjMLfCt0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FctKtRg%2FdJMcahkrz3d%2F5BdiimkkcsBAvhsjMLfCt0%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;1225&quot; height=&quot;612&quot; data-filename=&quot;스크린샷 2026-06-08 113338.png&quot; data-origin-width=&quot;1225&quot; data-origin-height=&quot;612&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;좀 더 완성도를 높이고자 if choice 문을 더 했는데&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;오류&lt;/b&gt;&lt;/span&gt;가 자꾸 떴다.&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;darr;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #c0d1e7;&quot;&gt; System.out.print(&quot;향기로운 하루를 보내시겠어요? (1.네 / 2.다른 향으로): &quot;);&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #c0d1e7;&quot;&gt;&amp;nbsp;&amp;nbsp;if (choice == 1) break; &lt;/span&gt;&lt;/p&gt;
&lt;div style=&quot;background-color: #ffffff;&quot;&gt;
&lt;div style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;&amp;nbsp; 그 윗줄에&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #c0d1e7;&quot;&gt;int choice = sc.nextInt();&lt;/span&gt; 를 넣어 &lt;u&gt;choice변수를 정의해주니&lt;/u&gt; 컴파일 에러가 해결되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 선언이 있어야 if(choice ==1) 이 먹혔다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div data-ved=&quot;0CAAQhtANahgKEwjYgY3WkO-UAxUAAAAAHQAAAAAQuAY&quot; data-hveid=&quot;0&quot;&gt;&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;history 를 &quot; &quot; 아무것도 없는 빈 상태로 셋팅&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;while루프 밖에 두었다. 실수로 안에다 넣으면 루프가 돌때마다 이전 기록이 사라지기 때문이다.&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-08 120416.png&quot; data-origin-width=&quot;840&quot; data-origin-height=&quot;422&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/be8DGn/dJMcaiQ7hI5/9jrg7R7AKY7df0DCBuMnz1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/be8DGn/dJMcaiQ7hI5/9jrg7R7AKY7df0DCBuMnz1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/be8DGn/dJMcaiQ7hI5/9jrg7R7AKY7df0DCBuMnz1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbe8DGn%2FdJMcaiQ7hI5%2F9jrg7R7AKY7df0DCBuMnz1%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;840&quot; height=&quot;422&quot; data-filename=&quot;스크린샷 2026-06-08 120416.png&quot; data-origin-width=&quot;840&quot; data-origin-height=&quot;422&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;좀 더 참여형이면서 전문적인 느낌을 내고 싶어서 기온을 입력하는 방식을 추가했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #c0d1e7;&quot;&gt;if( temp &amp;lt;=10) s= 4;&lt;/span&gt;&amp;nbsp; 기온이 10도 이하면 겨울&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #c0d1e7;&quot;&gt;else if(temp &amp;lt;=18) s=3;&lt;/span&gt; 15도 이하면 가을&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #c0d1e7;&quot;&gt;&lt;b&gt;int t =0; &lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;이거 계속 빼먹는데 중요하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;초기화 과정으로서, 나중에 if문에서 사용자의 입력값을 넣기위해 일단 0으로 비워두고 시작하는것. 이걸 까먹으면 컴파일에러가 발생한다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&amp;lt;기술적 설계 논리 &amp;gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일단 나는 코딩에 코자도 모르고 이번에 수업을 들은 초초초초초보기 때문에&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;수업에서 배운 IF 문 원툴로 코드를 짰다.&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Main 클래스는 사용자와의 입출력만을 담당하고, PerfumeLogic클래스는 향수 추천 로직만 담당하도록 설계하였다.&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;추천 로직은 성별 -&amp;gt; 계절 -&amp;gt; 이동수단으로 이어지는 계층적 트리 구조를 따른다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이를 위해 각 변수의 조합에 따라 유일한 향수를 결정하는 모델로 if-else-if문이 가장 간단하고 결과도출이 빠르고 효율적이라고 판단했다.&amp;nbsp;&lt;/p&gt;
&lt;div data-ved=&quot;0CAAQhtANahgKEwjYgY3WkO-UAxUAAAAAHQAAAAAQuAY&quot; data-hveid=&quot;0&quot;&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;KakaoTalk_20260608_091819465.jpg&quot; data-origin-width=&quot;1179&quot; data-origin-height=&quot;1117&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dGJosF/dJMcajibEAd/iVipB66NAdKCYNeRbrRfKK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dGJosF/dJMcajibEAd/iVipB66NAdKCYNeRbrRfKK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dGJosF/dJMcajibEAd/iVipB66NAdKCYNeRbrRfKK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdGJosF%2FdJMcajibEAd%2FiVipB66NAdKCYNeRbrRfKK%2Fimg.jpg&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;1179&quot; height=&quot;1117&quot; data-filename=&quot;KakaoTalk_20260608_091819465.jpg&quot; data-origin-width=&quot;1179&quot; data-origin-height=&quot;1117&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마지막으로 데이터의 정합성을 위해 res변수를 활용한 방어적 프로그램을 적용했는데,&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; 또 혹시 모르니까... 프로그램이 예기치 못한 입력값에 의해 멈추는 것을 방지하고, 사용자에게 항상 유효한 응답을 전달하도록 설계했다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;완성도를 위한 욕심 추가&lt;/h2&gt;
&lt;div data-ved=&quot;0CAAQhtANahgKEwjYgY3WkO-UAxUAAAAAHQAAAAAQuAY&quot; data-hveid=&quot;0&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용자가 향수를 추천받은 뒤, 그 아래에 덧붙여서 &lt;b data-index-in-node=&quot;28&quot; data-path-to-node=&quot;6&quot;&gt;상호작용&lt;/b&gt;을 유도하는 메시지를 넣어보았다. &quot;다른 사람들은 이런 향을 썼어요&quot;라는 문구는 &lt;b data-index-in-node=&quot;35&quot; data-path-to-node=&quot;9,0,0&quot;&gt;소셜 프루프(Social Proof)&lt;/b&gt; 효과를 톡톡히 한다. 사람들은 자신의 선택이 틀리지 않았음을 확인받고 싶어 하니까,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Main을 고치는건 일이 안큰데, PerfumeLogic 수정이 좀 까다로웠다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존에 name과 desc로만 관리하던 구조를 MainName,sub1,sub2추가한 형태로 확장했다.&lt;/p&gt;
&lt;h3 data-path-to-node=&quot;1&quot; data-ke-size=&quot;size23&quot;&gt;✨ 기온 및 공간 밀집도별 향수 큐레이션&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-path-to-node=&quot;2&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;기온&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;공간 밀집도&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;테토 (남성 무드)&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;에겐 (여성 무드)&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;2,1,0,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;2,1,0,0&quot;&gt;25℃ 초과&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;2,1,1,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;2,1,1,0&quot;&gt;고밀도&lt;/b&gt; (지하철)&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;2,1,2,0&quot;&gt;돌체 앤 가바나 라이트 블루&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;(서브: 724, 네롤리)&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;2,1,3,0&quot;&gt;조 말론 우드 세이지 앤 씨 솔트&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;(서브: 아쿠아, 도손)&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;2,2,1,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;2,2,1,0&quot;&gt;중밀도&lt;/b&gt; (버스)&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;2,2,2,0&quot;&gt;톰 포드 네롤리 포르토피노&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;(서브: 어벤투스, 724)&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;2,2,3,0&quot;&gt;메종 프란시스 커정 아라로즈&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;(서브: 레드 로즈, 오 로즈)&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;2,3,1,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;2,3,1,0&quot;&gt;저밀도&lt;/b&gt; (도보)&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;2,3,2,0&quot;&gt;메종 프란시스 커정 724&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;(서브: 실버마운틴, 어벤투스)&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;2,3,3,0&quot;&gt;킬리안 선키스드 가데스&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;(서브: 브론즈 가디스, 솔레이 블랑)&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;2,4,0,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;2,4,0,0&quot;&gt;19℃ ~ 25℃&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;2,4,1,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;2,4,1,0&quot;&gt;고밀도&lt;/b&gt; (지하철)&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;2,4,2,0&quot;&gt;메종 마르지엘라 프롬 더 가든&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;(서브: 실버마운틴, 어벤투스)&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;2,4,3,0&quot;&gt;킬리안 뱀부하모니&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;(서브: 화이트 티, 오 드 민떼)&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;2,5,1,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;2,5,1,0&quot;&gt;중밀도&lt;/b&gt; (버스)&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;2,5,2,0&quot;&gt;크리드 어벤투스&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;(서브: 실버마운틴, 가든)&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;2,5,3,0&quot;&gt;니샤네 우롱차 엑스트레&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;(서브: 우롱 앙피니, 인플로레센스)&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;2,6,1,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;2,6,1,0&quot;&gt;저밀도&lt;/b&gt; (도보)&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;2,6,2,0&quot;&gt;크리드 실버마운틴&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;(서브: 어벤투스, 가든)&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;2,6,3,0&quot;&gt;바이레도 블랑쉬&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;(서브: 프리지아, 레이지 선데이)&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;2,7,0,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;2,7,0,0&quot;&gt;11℃ ~ 18℃&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;2,7,1,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;2,7,1,0&quot;&gt;고밀도&lt;/b&gt; (지하철)&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;2,7,2,0&quot;&gt;바이레도 슈퍼 시더&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;(서브: 탐 다오, 테르 데르메스)&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;2,7,3,0&quot;&gt;딥티크 필로시코스&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;(서브: 피그 앤 로터스, 피그)&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;2,8,1,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;2,8,1,0&quot;&gt;중밀도&lt;/b&gt; (버스)&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;2,8,2,0&quot;&gt;딥티크 탐 다오&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;(서브: 슈퍼 시더, 테르 데르메스)&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;2,8,3,0&quot;&gt;바이레도 로즈 오브 노 맨즈 랜드&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;(서브: 롬브르 단 로, 립스틱 로즈)&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;2,9,1,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;2,9,1,0&quot;&gt;저밀도&lt;/b&gt; (도보)&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;2,9,2,0&quot;&gt;에르메스 테르 데르메스&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;(서브: 탐 다오, 슈퍼 시더)&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;2,9,3,0&quot;&gt;딥티크 플레르 드 뽀&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;(서브: 모하비 고스트, 미르 앤 통카)&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;2,10,0,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;2,10,0,0&quot;&gt;10℃ 이하&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;2,10,1,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;2,10,1,0&quot;&gt;고밀도&lt;/b&gt; (지하철)&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;2,10,2,0&quot;&gt;퍼퓸 드 말리 레이튼&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;(서브: 리저브 프리베, 엔젤스 쉐어)&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;2,10,3,0&quot;&gt;구찌 티얼스 프롬 더 문&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;(서브: 플레르 드 뽀, 라 튤립)&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;2,11,1,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;2,11,1,0&quot;&gt;중밀도&lt;/b&gt; (버스)&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;2,11,2,0&quot;&gt;지방시 젠틀맨 리저브 프리베&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;(서브: 레이튼, 엔젤스 쉐어)&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;2,11,3,0&quot;&gt;바이레도 모하비 고스트&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;(서브: 우드 세이지, 위스퍼)&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;2,12,1,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;2,12,1,0&quot;&gt;저밀도&lt;/b&gt; (도보)&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;2,12,2,0&quot;&gt;킬리안 엔젤스 쉐어&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;(서브: 레이튼, 리저브 프리베)&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;2,12,3,0&quot;&gt;샤넬 꼬로망델&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;(서브: 보이, 화이트 스웨이드)&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;div data-ved=&quot;0CAAQhtANahgKEwjYgY3WkO-UAxUAAAAAHQAAAAAQuAY&quot; data-hveid=&quot;0&quot;&gt;다시 표를 만들어 정리하고 코드를 작성했다.&amp;nbsp;&lt;/div&gt;
&lt;div data-ved=&quot;0CAAQhtANahgKEwjYgY3WkO-UAxUAAAAAHQAAAAAQuAY&quot; data-hveid=&quot;0&quot;&gt;&lt;span style=&quot;background-color: #c0d1e7;&quot;&gt; if (t == 1) { name = &quot;킬리안 뱀부하모니&quot;; &lt;/span&gt;&lt;/div&gt;
&lt;div data-ved=&quot;0CAAQhtANahgKEwjYgY3WkO-UAxUAAAAAHQAAAAAQuAY&quot; data-hveid=&quot;0&quot;&gt;&lt;span style=&quot;background-color: #c0d1e7;&quot;&gt;desc = &quot;대나무 숲의 청량함과 신선함이 느껴지는 동양적인 향수입니다.&quot;;&lt;/span&gt;&lt;/div&gt;
&lt;div data-ved=&quot;0CAAQhtANahgKEwjYgY3WkO-UAxUAAAAAHQAAAAAQuAY&quot; data-hveid=&quot;0&quot;&gt;&lt;span style=&quot;background-color: #c0d1e7;&quot;&gt; sub1 = &quot;조 말론 화이트 티&quot;;&lt;/span&gt;&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div data-ved=&quot;0CAAQhtANahgKEwjYgY3WkO-UAxUAAAAAHQAAAAAQuAY&quot; data-hveid=&quot;0&quot;&gt;&lt;span style=&quot;background-color: #c0d1e7;&quot;&gt; sub2 = &quot;딥티크 오 드 민떼&quot;;&lt;/span&gt;&lt;/div&gt;
&lt;div data-ved=&quot;0CAAQhtANahgKEwjYgY3WkO-UAxUAAAAAHQAAAAAQuAY&quot; data-hveid=&quot;0&quot;&gt;&lt;span style=&quot;background-color: #c0d1e7;&quot;&gt; } &lt;/span&gt;&lt;/div&gt;
&lt;div data-ved=&quot;0CAAQhtANahgKEwjYgY3WkO-UAxUAAAAAHQAAAAAQuAY&quot; data-hveid=&quot;0&quot;&gt;코드 조건문 (if-else-if-else)을 사용하여, 사용자의 환경(t)에 따라 각기 다른 향수 정보(변수값)을 결정하는 과정이다.&lt;/div&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 data-index-in-node=&quot;0&quot; data-path-to-node=&quot;6,0,0&quot;&gt;if (t == 1)&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;6,0,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;t가 1(지하철/고밀도 상황)일 때 실행&lt;/li&gt;
&lt;li&gt;name = &quot;...&quot;: 추천할 향수의 &lt;b data-index-in-node=&quot;22&quot; data-path-to-node=&quot;6,0,1,1,0&quot;&gt;이름&lt;/b&gt;을 결정&lt;/li&gt;
&lt;li&gt;desc = &quot;...&quot;: 이 향수가 어떤 향인지 알려주는 &lt;b data-index-in-node=&quot;32&quot; data-path-to-node=&quot;6,0,1,2,0&quot;&gt;설명 글&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;sub1 = &quot;...&quot;, sub2 = &quot;...&quot;: 사용자가 메인 향수를 마음에 안 들어 할 경우를 대비한 대안 향수(서브)들을 제시&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;6,1,0&quot;&gt;else if (t == 2)&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;6,1,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;t가 1이 아닌데, 만약 2(버스/중밀도 상황)라면 이 내용을 실행&lt;/li&gt;
&lt;li&gt;마찬가지로 상황에 딱 맞는 이름, 설명, 서브 향수를 새로 세팅&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;6,2,0&quot;&gt;else&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;6,2,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;t가 1도 아니고 2도 아닌 경우(도보/저밀도 상황)를 의미&lt;/li&gt;
&lt;li&gt;그 외의 나머지 상황에 맞는 정보를 세팅&lt;/li&gt;
&lt;li&gt;이 방식은 &quot;데이터 선택형 구조&quot;로 코드를 실행하는 중간에 계산을 하는 것이 아니라, &lt;b data-index-in-node=&quot;51&quot; data-path-to-node=&quot;9&quot;&gt;상황에 맞는 '정답지'를 미리 준비해두고 사용자의 입력(t)에 따라 정답을 골라내는 방식&lt;/b&gt;이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;문제의식 : IF문이 반복될 수록 코드가 지저분해진다.&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-08 124344.png&quot; data-origin-width=&quot;1578&quot; data-origin-height=&quot;344&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cj9c4x/dJMcajoSHNP/5S1piiuxwkWEIJ4bUVJKMK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cj9c4x/dJMcajoSHNP/5S1piiuxwkWEIJ4bUVJKMK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cj9c4x/dJMcajoSHNP/5S1piiuxwkWEIJ4bUVJKMK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcj9c4x%2FdJMcajoSHNP%2F5S1piiuxwkWEIJ4bUVJKMK%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;1578&quot; height=&quot;344&quot; data-filename=&quot;스크린샷 2026-06-08 124344.png&quot; data-origin-width=&quot;1578&quot; data-origin-height=&quot;344&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;div data-ved=&quot;0CAAQhtANahgKEwjYgY3WkO-UAxUAAAAAHQAAAAAQuAY&quot; data-hveid=&quot;0&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;멀미날 것같은 if문의 지옥... 가독성을 잡기위해 swith문을 활용해서 훨씬 깔끔하고 구조적으로 수정해보았다.&amp;nbsp;&lt;/p&gt;
&lt;div data-ved=&quot;0CAAQhtANahgKEwjYgY3WkO-UAxUAAAAAHQAAAAAQuAY&quot; data-hveid=&quot;0&quot;&gt;&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;10&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;10,0,0&quot;&gt;어려웠던 점:&lt;/b&gt; 처음에는 추천 로직이 단순했지만, 성별/계절/이동수단의 경우의 수가 많아지면서 코드가 복잡했다. 그래서 t를 써 데이터의 개수가 가변적이고, 순차적으로 데이터를 조회하고 관리하기에 적합한 ArrayList를 사용했다. 또한 &amp;nbsp;if-else문을 계층적으로 설계하여 논리 오류를 줄였고, ArrayList의 removeIf나 forEach 같은 메서드를 찾아보며 코드를 간결하게 수정했다. 에러가 발생했을 때는 변수의 스코프와 입력 버퍼를 확인하며 디버깅했다.&amp;nbsp;&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;새롭게 알게된 점&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;10&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;객체 지향 프로그래밍에서 클래스를 역할별로 나누는 것의 중요성을 체감. 데이터, 로직, 실행부를 분리하니 유지보수가 훨씬 쉬웠다. 또한, 컬렉션 프레임워크가 데이터를 관리하는 데 얼마나 강력한지 직접 코드를 적어보니 실감했다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;소감 (이자 심정...)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=tjBATXGdUT8&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.youtube.com/watch?v=tjBATXGdUT8&lt;/a&gt;&lt;/p&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/watch?v=tjBATXGdUT8&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/hDD21/dJMb8WMxzPj/sy9LcvGCgL2Qjc9d7ZVj20/img.jpg?width=480&amp;amp;height=360&amp;amp;face=0_0_480_360&quot; data-video-width=&quot;480&quot; data-video-height=&quot;360&quot; data-video-origin-width=&quot;480&quot; data-video-origin-height=&quot;360&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-title=&quot;전설이된 낙법 지도 영상ㅋㅋㅋㅋㅋㅋㅋㅋ&quot; data-original-url=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/tjBATXGdUT8&quot; width=&quot;480&quot; height=&quot;360&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption style=&quot;display: none;&quot;&gt;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;0:37초부터..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아니 코드를 고치면 int안에 설명글을 추가할게 생기고, 추가하면 콘솔에 오류뜨고, 재민이한테 물어보고 고치면, 또 설명글 사라져 있고,,그거 수정하고 질문지 위치 좀 수정하면 또 오류뜨고, 그거 고치면 int 안에 \n 문장 다 사라져있고...&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;&amp;nbsp;&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;div style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #7f0055;&quot;&gt;package&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; com.kh.Test;&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;color: #7f0055;&quot;&gt;public&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #7f0055;&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; PerfumeLogic {&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;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #7f0055;&quot;&gt;public&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; String getPerfume(&lt;/span&gt;&lt;span style=&quot;color: #7f0055;&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #6a3e3e;&quot;&gt;g&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #7f0055;&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #6a3e3e;&quot;&gt;s&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #7f0055;&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #6a3e3e;&quot;&gt;t&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;) {&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #3f7f5f;&quot;&gt;// g=1(에겐/여성), g=2(테토/남성)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #7f0055;&quot;&gt;return&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color: #6a3e3e;&quot;&gt;g&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; == 1) ? &lt;/span&gt;&lt;span style=&quot;background-color: #d4d4d4; color: #000000;&quot;&gt;getEgenPerfume&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #6a3e3e;&quot;&gt;s&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #6a3e3e;&quot;&gt;t&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;) : getTetoPerfume(&lt;/span&gt;&lt;span style=&quot;color: #6a3e3e;&quot;&gt;s&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #6a3e3e;&quot;&gt;t&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;);&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&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;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #7f0055;&quot;&gt;private&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; String &lt;/span&gt;&lt;span style=&quot;background-color: #d4d4d4; color: #000000;&quot;&gt;getEgenPerfume&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #7f0055;&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #6a3e3e;&quot;&gt;s&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #7f0055;&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #6a3e3e;&quot;&gt;t&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;) {&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt; String &lt;/span&gt;&lt;span style=&quot;color: #6a3e3e;&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color: #2a00ff;&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #6a3e3e;&quot;&gt;desc&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color: #2a00ff;&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #6a3e3e;&quot;&gt;sub1&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color: #2a00ff;&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #6a3e3e;&quot;&gt;sub2&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color: #2a00ff;&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&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;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #7f0055;&quot;&gt;switch&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color: #6a3e3e;&quot;&gt;s&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;) {&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #7f0055;&quot;&gt;case&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; 1: &lt;/span&gt;&lt;span style=&quot;color: #3f7f5f;&quot;&gt;// 에겐 여름&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #7f0055;&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color: #6a3e3e;&quot;&gt;t&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; == 1) { &lt;/span&gt;&lt;span style=&quot;color: #6a3e3e;&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color: #2a00ff;&quot;&gt;&quot;조 말론 우드 세이지 앤 씨 솔트&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color: #6a3e3e;&quot;&gt;desc&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color: #2a00ff;&quot;&gt;&quot;거친 파도가 빚어낸 소금기 섞인 바닷바람과 세이지의 흙내음이 어우러진 \n 세상의 틀을 벗어난 가장 자유로운 영혼의 향기&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color: #6a3e3e;&quot;&gt;sub1&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color: #2a00ff;&quot;&gt;&quot;아쿠아 디 파르마 피코 디 아말피&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color: #6a3e3e;&quot;&gt;sub2&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color: #2a00ff;&quot;&gt;&quot;딥티크 도 손&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;; }&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #7f0055;&quot;&gt;else&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #7f0055;&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color: #6a3e3e;&quot;&gt;t&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; == 2) { &lt;/span&gt;&lt;span style=&quot;color: #6a3e3e;&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color: #2a00ff;&quot;&gt;&quot;메종 프란시스 커정 아라로즈&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color: #6a3e3e;&quot;&gt;desc&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color: #2a00ff;&quot;&gt;&quot;꾸밈없는 첫사랑의 설렘을 닮은 싱그러운 장미 향이 당신을 감싸 안는\n 세상에서 가장 순수하고 고결한 장미의 정수&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color: #6a3e3e;&quot;&gt;sub1&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color: #2a00ff;&quot;&gt;&quot;조 말론 레드 로즈&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color: #6a3e3e;&quot;&gt;sub2&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color: #2a00ff;&quot;&gt;&quot;딥티크 오 로즈&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;; }&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #7f0055;&quot;&gt;else&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; { &lt;/span&gt;&lt;span style=&quot;color: #6a3e3e;&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color: #2a00ff;&quot;&gt;&quot;킬리안 선키스드 가데스&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color: #6a3e3e;&quot;&gt;desc&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color: #2a00ff;&quot;&gt;&quot;지평선 끝에서 내려온 태양의 온기를 머금은 꽃들의 합창\n 한 번의 분사로 일상을 찬란한 휴양지의 여신으로 탈바꿈시키는 향의 마스터피스&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color: #6a3e3e;&quot;&gt;sub1&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color: #2a00ff;&quot;&gt;&quot;에스티로더 브론즈 가디스&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color: #6a3e3e;&quot;&gt;sub2&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color: #2a00ff;&quot;&gt;&quot;톰포드 솔레이 블랑&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;; }&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #7f0055;&quot;&gt;break&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #7f0055;&quot;&gt;case&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; 2: &lt;/span&gt;&lt;span style=&quot;color: #3f7f5f;&quot;&gt;// 에겐 봄&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #7f0055;&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color: #6a3e3e;&quot;&gt;t&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; == 1) { &lt;/span&gt;&lt;span style=&quot;color: #6a3e3e;&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color: #2a00ff;&quot;&gt;&quot;킬리안 뱀부하모니&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color: #6a3e3e;&quot;&gt;desc&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color: #2a00ff;&quot;&gt;&quot;안개 낀 고요한 대나무 숲을 거니는 듯한\n 영혼까지 맑아지는 투명하고 신선한 초록빛의 정&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color: #6a3e3e;&quot;&gt;sub1&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color: #2a00ff;&quot;&gt;&quot;조 말론 화이트 티&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color: #6a3e3e;&quot;&gt;sub2&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color: #2a00ff;&quot;&gt;&quot;딥티크 오 드 민떼&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;; }&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #7f0055;&quot;&gt;else&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #7f0055;&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color: #6a3e3e;&quot;&gt;t&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; == 2) { &lt;/span&gt;&lt;span style=&quot;color: #6a3e3e;&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color: #2a00ff;&quot;&gt;&quot;니샤네 우롱차 엑스트레&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color: #6a3e3e;&quot;&gt;desc&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color: #2a00ff;&quot;&gt;&quot;쌉싸름한 찻잎의 깊은 향취가 공기 중에 안개처럼 번져나가는 \n 당신의 하루를 차분하고 깊은 사색의 시간으로 이끄는 니치 향수의 정수&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color: #6a3e3e;&quot;&gt;sub1&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color: #2a00ff;&quot;&gt;&quot;아틀리에 코롱 우롱 앙피니&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color: #6a3e3e;&quot;&gt;sub2&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color: #2a00ff;&quot;&gt;&quot;바이레도 인플로레센스&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;; }&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #7f0055;&quot;&gt;else&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; { &lt;/span&gt;&lt;span style=&quot;color: #6a3e3e;&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color: #2a00ff;&quot;&gt;&quot;바이레도 블랑쉬&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color: #6a3e3e;&quot;&gt;desc&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color: #2a00ff;&quot;&gt;&quot;방금 세탁을 마친 하얀 린넨 위로 내려앉은 햇살처럼 \n 세상에서 가장 투명하고 순수한 살냄새의 결정체&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color: #6a3e3e;&quot;&gt;sub1&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color: #2a00ff;&quot;&gt;&quot;산타마리아 노벨라 프리지아&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color: #6a3e3e;&quot;&gt;sub2&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color: #2a00ff;&quot;&gt;&quot;메종 마르지엘라 레이지 선데이 모닝&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;; }&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #7f0055;&quot;&gt;break&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #7f0055;&quot;&gt;case&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; 3: &lt;/span&gt;&lt;span style=&quot;color: #3f7f5f;&quot;&gt;// 에겐 가을&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #7f0055;&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color: #6a3e3e;&quot;&gt;t&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; == 1) { &lt;/span&gt;&lt;span style=&quot;color: #6a3e3e;&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color: #2a00ff;&quot;&gt;&quot;딥티크 필로시코스&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color: #6a3e3e;&quot;&gt;desc&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color: #2a00ff;&quot;&gt;&quot;무화과나무의 뿌리부터 열매까지 한 병에 담아낸 깊고 선명한 향취 \n 피부에 닿는 순간 주변을 자연의 고요함으로 물들이는 독보적인 향기&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color: #6a3e3e;&quot;&gt;sub1&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color: #2a00ff;&quot;&gt;&quot;조 말론 피그 앤 로터스&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color: #6a3e3e;&quot;&gt;sub2&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color: #2a00ff;&quot;&gt;&quot;조르지오 아르마니 피그&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;; }&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #7f0055;&quot;&gt;else&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #7f0055;&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color: #6a3e3e;&quot;&gt;t&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; == 2) { &lt;/span&gt;&lt;span style=&quot;color: #6a3e3e;&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color: #2a00ff;&quot;&gt;&quot;바이레도 로즈 오브 노 맨즈 랜드&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color: #6a3e3e;&quot;&gt;desc&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color: #2a00ff;&quot;&gt;&quot;황량한 전쟁터에서도 피어나는 장미처럼\n 가장 힘든 순간 당신의 곁을 지켜주는 숭고하고도 강인한 위로의 향기&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color: #6a3e3e;&quot;&gt;sub1&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color: #2a00ff;&quot;&gt;&quot;딥티크 롬브르 단 로&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color: #6a3e3e;&quot;&gt;sub2&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color: #2a00ff;&quot;&gt;&quot;프레데릭 말 립스틱 로즈&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;; }&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #7f0055;&quot;&gt;else&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; { &lt;/span&gt;&lt;span style=&quot;color: #6a3e3e;&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color: #2a00ff;&quot;&gt;&quot;딥티크 플레르 드 뽀&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color: #6a3e3e;&quot;&gt;desc&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color: #2a00ff;&quot;&gt;&quot;피부에 닿는 순간 밀착되어 완성되는 섬세한 향의 결 \n 시간이 지날수록 당신의 본연의 향과 어우러져 가장 우아하고 고혹적인 존재감을 드러냅니다&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color: #6a3e3e;&quot;&gt;sub1&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color: #2a00ff;&quot;&gt;&quot;바이레도 모하비 고스트&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color: #6a3e3e;&quot;&gt;sub2&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color: #2a00ff;&quot;&gt;&quot;조 말론 미르 앤 통카&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;; }&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #7f0055;&quot;&gt;break&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #7f0055;&quot;&gt;case&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; 4: &lt;/span&gt;&lt;span style=&quot;color: #3f7f5f;&quot;&gt;// 에겐 겨울&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #7f0055;&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color: #6a3e3e;&quot;&gt;t&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; == 1) { &lt;/span&gt;&lt;span style=&quot;color: #6a3e3e;&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color: #2a00ff;&quot;&gt;&quot;구찌 티얼스 프롬 더 문&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color: #6a3e3e;&quot;&gt;desc&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color: #2a00ff;&quot;&gt;&quot;달빛이 맺힌 꽃들의 부드러운 속삭임\n 밤의 정원에서 마주하는 듯한 신비롭고 매혹적인 향의 조화가\n 당신의 존재를 특별하게 완성합니다&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color: #6a3e3e;&quot;&gt;sub1&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color: #2a00ff;&quot;&gt;&quot;딥티크 플레르 드 뽀&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color: #6a3e3e;&quot;&gt;sub2&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color: #2a00ff;&quot;&gt;&quot;바이레도 라 튤립&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;; }&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #7f0055;&quot;&gt;else&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #7f0055;&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color: #6a3e3e;&quot;&gt;t&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; == 2) { &lt;/span&gt;&lt;span style=&quot;color: #6a3e3e;&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color: #2a00ff;&quot;&gt;&quot;바이레도 모하비 고스트&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color: #6a3e3e;&quot;&gt;desc&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color: #2a00ff;&quot;&gt;&quot;황량한 모하비 사막 속에서 피어난 강인하고도 아름다운 꽃의 생명력\n 당신의 살결 위에서 신비롭게 번져나가는 이국적인 자연의 찬가&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color: #6a3e3e;&quot;&gt;sub1&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color: #2a00ff;&quot;&gt;&quot;조 말론 우드 세이지 앤 씨 솔트&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color: #6a3e3e;&quot;&gt;sub2&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color: #2a00ff;&quot;&gt;&quot;메종 마르지엘라 위스퍼 인 더 라이브러리&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;; }&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #7f0055;&quot;&gt;else&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; { &lt;/span&gt;&lt;span style=&quot;color: #6a3e3e;&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color: #2a00ff;&quot;&gt;&quot;샤넬 꼬로망델&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color: #6a3e3e;&quot;&gt;desc&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color: #2a00ff;&quot;&gt;&quot;피부 위에서 부드러운 우디 노트와 패출리의 깊은 울림이 섞여드는\n 당신의 일상에 품격 있는 무게감을 더해줄 압도적인 오리엔탈의 기록&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color: #6a3e3e;&quot;&gt;sub1&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color: #2a00ff;&quot;&gt;&quot;샤넬 보이&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color: #6a3e3e;&quot;&gt;sub2&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color: #2a00ff;&quot;&gt;&quot;톰포드 화이트 스웨이드&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;; }&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #7f0055;&quot;&gt;break&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt; }&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #7f0055;&quot;&gt;return&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; formatResult(&lt;/span&gt;&lt;span style=&quot;color: #6a3e3e;&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #6a3e3e;&quot;&gt;desc&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #6a3e3e;&quot;&gt;sub1&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #6a3e3e;&quot;&gt;sub2&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;);&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&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;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #7f0055;&quot;&gt;private&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; String getTetoPerfume(&lt;/span&gt;&lt;span style=&quot;color: #7f0055;&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #6a3e3e;&quot;&gt;s&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #7f0055;&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #6a3e3e;&quot;&gt;t&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;) {&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt; String &lt;/span&gt;&lt;span style=&quot;color: #6a3e3e;&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color: #2a00ff;&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #6a3e3e;&quot;&gt;desc&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color: #2a00ff;&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #6a3e3e;&quot;&gt;sub1&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color: #2a00ff;&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #6a3e3e;&quot;&gt;sub2&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color: #2a00ff;&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&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;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #7f0055;&quot;&gt;switch&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color: #6a3e3e;&quot;&gt;s&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;) {&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #7f0055;&quot;&gt;case&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; 1: &lt;/span&gt;&lt;span style=&quot;color: #3f7f5f;&quot;&gt;// 테토 여름&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #7f0055;&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color: #6a3e3e;&quot;&gt;t&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; == 1) { &lt;/span&gt;&lt;span style=&quot;color: #6a3e3e;&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color: #2a00ff;&quot;&gt;&quot;돌체 앤 가바나 라이트 블루&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color: #6a3e3e;&quot;&gt;desc&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color: #2a00ff;&quot;&gt;&quot;한 번의 분사로 펼쳐지는 이탈리아 해안가의 여유 \n 차가운 바닷바람을 맞으며 거니는 듯한 시원하고 산뜻한 해방감을 선사합니다&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color: #6a3e3e;&quot;&gt;sub1&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color: #2a00ff;&quot;&gt;&quot;메종 프란시스 커정 724&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color: #6a3e3e;&quot;&gt;sub2&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color: #2a00ff;&quot;&gt;&quot;톰 포드 네롤리 포르토피노&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;; }&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #7f0055;&quot;&gt;else&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #7f0055;&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color: #6a3e3e;&quot;&gt;t&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; == 2) { &lt;/span&gt;&lt;span style=&quot;color: #6a3e3e;&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color: #2a00ff;&quot;&gt;&quot;톰 포드 네롤리 포르토피노&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color: #6a3e3e;&quot;&gt;desc&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color: #2a00ff;&quot;&gt;&quot;상쾌한 네롤리 꽃향기가 여름날의 청량함을 더해줍니다.&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color: #6a3e3e;&quot;&gt;sub1&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color: #2a00ff;&quot;&gt;&quot;크리드 어벤투스&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color: #6a3e3e;&quot;&gt;sub2&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color: #2a00ff;&quot;&gt;&quot;메종 프란시스 커정 724&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;; }&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #7f0055;&quot;&gt;else&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; { &lt;/span&gt;&lt;span style=&quot;color: #6a3e3e;&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color: #2a00ff;&quot;&gt;&quot;메종 프란시스 커정 724&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color: #6a3e3e;&quot;&gt;desc&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color: #2a00ff;&quot;&gt;&quot;거대한 메트로폴리스의 역동적인 리듬을 담아낸 \n 맑고 투명하면서도 압도적인 존재감을 발산하는 현대적인 서명&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color: #6a3e3e;&quot;&gt;sub1&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color: #2a00ff;&quot;&gt;&quot;크리드 실버마운틴&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color: #6a3e3e;&quot;&gt;sub2&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color: #2a00ff;&quot;&gt;&quot;크리드 어벤투스&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;; }&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #7f0055;&quot;&gt;break&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #7f0055;&quot;&gt;case&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; 2: &lt;/span&gt;&lt;span style=&quot;color: #3f7f5f;&quot;&gt;// 테토 봄&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #7f0055;&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color: #6a3e3e;&quot;&gt;t&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; == 1) { &lt;/span&gt;&lt;span style=&quot;color: #6a3e3e;&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color: #2a00ff;&quot;&gt;&quot;메종 마르지엘라 프롬 더 가든&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color: #6a3e3e;&quot;&gt;desc&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color: #2a00ff;&quot;&gt;&quot;태양 아래 갓 수확한 토마토 잎의 알싸하고 푸릇한 향기\n 흙의 촉촉함이 어우러져 평온한 오후의 정원을 그대로 옮겨 놓은 듯한 생생한 자연의 기록&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color: #6a3e3e;&quot;&gt;sub1&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color: #2a00ff;&quot;&gt;&quot;크리드 실버마운틴&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color: #6a3e3e;&quot;&gt;sub2&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color: #2a00ff;&quot;&gt;&quot;크리드 어벤투스&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;; }&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #7f0055;&quot;&gt;else&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #7f0055;&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color: #6a3e3e;&quot;&gt;t&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; == 2) { &lt;/span&gt;&lt;span style=&quot;color: #6a3e3e;&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color: #2a00ff;&quot;&gt;&quot;크리드 어벤투스&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color: #6a3e3e;&quot;&gt;desc&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color: #2a00ff;&quot;&gt;&quot;폭발적인 에너지가 느껴지는 신선함 뒤로 숨겨진 묵직한 카리스마 \n 당신의 존재감을 세상에 각인시킬 완벽한 마스터피스&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color: #6a3e3e;&quot;&gt;sub1&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color: #2a00ff;&quot;&gt;&quot;크리드 실버마운틴&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color: #6a3e3e;&quot;&gt;sub2&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color: #2a00ff;&quot;&gt;&quot;메종 마르지엘라 가든&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;; }&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #7f0055;&quot;&gt;else&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; { &lt;/span&gt;&lt;span style=&quot;color: #6a3e3e;&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color: #2a00ff;&quot;&gt;&quot;크리드 실버마운틴&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color: #6a3e3e;&quot;&gt;desc&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color: #2a00ff;&quot;&gt;&quot;알프스 산맥의 만년설을 녹여낸 듯한 투명하고 서늘한 향기\n 도시의 열기를 단번에 식혀줄 압도적인 청량함의 결정체&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color: #6a3e3e;&quot;&gt;sub1&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color: #2a00ff;&quot;&gt;&quot;크리드 어벤투스&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color: #6a3e3e;&quot;&gt;sub2&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color: #2a00ff;&quot;&gt;&quot;메종 마르지엘라 가든&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;; }&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #7f0055;&quot;&gt;break&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #7f0055;&quot;&gt;case&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; 3: &lt;/span&gt;&lt;span style=&quot;color: #3f7f5f;&quot;&gt;// 테토 가을&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #7f0055;&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color: #6a3e3e;&quot;&gt;t&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; == 1) { &lt;/span&gt;&lt;span style=&quot;color: #6a3e3e;&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color: #2a00ff;&quot;&gt;&quot;바이레도 슈퍼 시더&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color: #6a3e3e;&quot;&gt;desc&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color: #2a00ff;&quot;&gt;&quot;나무본연의 깊고 따스한 향취에 현대적인 감각을 더한 향\n 불필요한 장식을 덜어내고 \n오직 시더우드의 맑고 단단한 결만을 투명하게&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color: #6a3e3e;&quot;&gt;sub1&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color: #2a00ff;&quot;&gt;&quot;딥티크 탐 다오&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color: #6a3e3e;&quot;&gt;sub2&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color: #2a00ff;&quot;&gt;&quot;에르메스 테르 데르메스&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;; }&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #7f0055;&quot;&gt;else&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #7f0055;&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color: #6a3e3e;&quot;&gt;t&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; == 2) { &lt;/span&gt;&lt;span style=&quot;color: #6a3e3e;&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color: #2a00ff;&quot;&gt;&quot;딥티크 탐 다오&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color: #6a3e3e;&quot;&gt;desc&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color: #2a00ff;&quot;&gt;&quot;인도차이나의 울창한 숲속\n 안개 낀 사원을 거니는 듯한 샌달우드의 깊고 신비로운 향취가 \n 당신의 공간을 차분한 고요함으로 채웁니다&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color: #6a3e3e;&quot;&gt;sub1&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color: #2a00ff;&quot;&gt;&quot;바이레도 슈퍼 시더&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color: #6a3e3e;&quot;&gt;sub2&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color: #2a00ff;&quot;&gt;&quot;에르메스 테르 데르메스&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;; }&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #7f0055;&quot;&gt;else&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; { &lt;/span&gt;&lt;span style=&quot;color: #6a3e3e;&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color: #2a00ff;&quot;&gt;&quot;에르메스 테르 데르메스&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color: #6a3e3e;&quot;&gt;desc&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color: #2a00ff;&quot;&gt;&quot;태고의 흙 내음과 하늘의 기운이 조화를 이룬 \n 대지를 딛고 선 남자의 강인한 서사가 담긴 독보적인 향기&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color: #6a3e3e;&quot;&gt;sub1&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color: #2a00ff;&quot;&gt;&quot;딥티크 탐 다오&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color: #6a3e3e;&quot;&gt;sub2&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color: #2a00ff;&quot;&gt;&quot;바이레도 슈퍼 시더&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;; }&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #7f0055;&quot;&gt;break&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #7f0055;&quot;&gt;case&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; 4: &lt;/span&gt;&lt;span style=&quot;color: #3f7f5f;&quot;&gt;// 테토 겨울&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #7f0055;&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color: #6a3e3e;&quot;&gt;t&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; == 1) { &lt;/span&gt;&lt;span style=&quot;color: #6a3e3e;&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color: #2a00ff;&quot;&gt;&quot;퍼퓸 드 말리 레이튼&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color: #6a3e3e;&quot;&gt;desc&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color: #2a00ff;&quot;&gt;&quot;세련된 스파이스와 달콤한 바닐라의 조화로 완성된 \n 당신의 존재감을 압도적으로 각인시킬 치명적인 향의 미학.&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color: #6a3e3e;&quot;&gt;sub1&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color: #2a00ff;&quot;&gt;&quot;지방시 리저브 프리베&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color: #6a3e3e;&quot;&gt;sub2&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color: #2a00ff;&quot;&gt;&quot;킬리안 엔젤스 쉐어&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;; }&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #7f0055;&quot;&gt;else&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #7f0055;&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color: #6a3e3e;&quot;&gt;t&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; == 2) { &lt;/span&gt;&lt;span style=&quot;color: #6a3e3e;&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color: #2a00ff;&quot;&gt;&quot;지방시 젠틀맨 리저브 프리베&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color: #6a3e3e;&quot;&gt;desc&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color: #2a00ff;&quot;&gt;&quot;한 모금 머금은 위스키처럼 짙고도 감미로운 \n 존재만으로도 주변을 매료시키는 성숙한 남자의 깊은 비밀&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color: #6a3e3e;&quot;&gt;sub1&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color: #2a00ff;&quot;&gt;&quot;레이튼&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color: #6a3e3e;&quot;&gt;sub2&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color: #2a00ff;&quot;&gt;&quot;엔젤스 쉐어&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;; }&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #7f0055;&quot;&gt;else&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; { &lt;/span&gt;&lt;span style=&quot;color: #6a3e3e;&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color: #2a00ff;&quot;&gt;&quot;킬리안 엔젤스 쉐어&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color: #6a3e3e;&quot;&gt;desc&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color: #2a00ff;&quot;&gt;&quot;황금빛 코냑 한 방울이 살결 위에 떨어져 피어나는 \n 한 번 맡으면 잊을 수 없는 짙은 관능의 마스터피스&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color: #6a3e3e;&quot;&gt;sub1&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color: #2a00ff;&quot;&gt;&quot;퍼퓸 드 말리 레이튼&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color: #6a3e3e;&quot;&gt;sub2&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color: #2a00ff;&quot;&gt;&quot;지방시 리저브 프리베&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;; }&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #7f0055;&quot;&gt;break&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt; }&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #7f0055;&quot;&gt;return&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; formatResult(&lt;/span&gt;&lt;span style=&quot;color: #6a3e3e;&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #6a3e3e;&quot;&gt;desc&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #6a3e3e;&quot;&gt;sub1&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #6a3e3e;&quot;&gt;sub2&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;);&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&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;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #7f0055;&quot;&gt;private&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; String formatResult(String &lt;/span&gt;&lt;span style=&quot;color: #6a3e3e;&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;, String &lt;/span&gt;&lt;span style=&quot;color: #6a3e3e;&quot;&gt;desc&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;, String &lt;/span&gt;&lt;span style=&quot;color: #6a3e3e;&quot;&gt;sub1&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;, String &lt;/span&gt;&lt;span style=&quot;color: #6a3e3e;&quot;&gt;sub2&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;) {&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #7f0055;&quot;&gt;return&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #2a00ff;&quot;&gt;&quot;✨ [오늘의 메인 추천]\n &quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; + &lt;/span&gt;&lt;span style=&quot;color: #6a3e3e;&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; + &lt;/span&gt;&lt;span style=&quot;color: #2a00ff;&quot;&gt;&quot;\n &quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; + &lt;/span&gt;&lt;span style=&quot;color: #6a3e3e;&quot;&gt;desc&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; + &lt;/span&gt;&lt;span style=&quot;color: #2a00ff;&quot;&gt;&quot;\n\n&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; +&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #2a00ff;&quot;&gt;&quot;  매니저의 한마디: 같은 무드를 좋아하시는 분들이 이 향수도 많이 찾으셨어요!\n\n&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; +&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #2a00ff;&quot;&gt;&quot;  [비슷한 취향의 다른 선택]\n 1. &quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; + &lt;/span&gt;&lt;span style=&quot;color: #6a3e3e;&quot;&gt;sub1&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; + &lt;/span&gt;&lt;span style=&quot;color: #2a00ff;&quot;&gt;&quot;\n 2. &quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; + &lt;/span&gt;&lt;span style=&quot;color: #6a3e3e;&quot;&gt;sub2&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt; }&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;}&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;</description>
      <category>개발자 호소인/JAVA</category>
      <author>리제 </author>
      <guid isPermaLink="true">https://bookstairs.tistory.com/56</guid>
      <comments>https://bookstairs.tistory.com/56#entry56comment</comments>
      <pubDate>Sat, 6 Jun 2026 18:37:12 +0900</pubDate>
    </item>
    <item>
      <title>[잉크] 세일러 - 지기 (知己) みをしれる(미오시레루)</title>
      <link>https://bookstairs.tistory.com/50</link>
      <description>&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;745&quot; data-origin-height=&quot;829&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dcaAzt/dJMcafUj2Iz/Xi7K97QEM0uw3FNo03g9y1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dcaAzt/dJMcafUj2Iz/Xi7K97QEM0uw3FNo03g9y1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dcaAzt/dJMcafUj2Iz/Xi7K97QEM0uw3FNo03g9y1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdcaAzt%2FdJMcafUj2Iz%2FXi7K97QEM0uw3FNo03g9y1%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;745&quot; height=&quot;829&quot; data-origin-width=&quot;745&quot; data-origin-height=&quot;829&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/MiR9A/dJMcaglrRop/0o1qiB8q1ZqDtkqrxqkcMk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/MiR9A/dJMcaglrRop/0o1qiB8q1ZqDtkqrxqkcMk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/MiR9A/dJMcaglrRop/0o1qiB8q1ZqDtkqrxqkcMk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMiR9A%2FdJMcaglrRop%2F0o1qiB8q1ZqDtkqrxqkcMk%2Fimg.jpg&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;3024&quot; height=&quot;4032&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: left;&quot;&gt;뒤에 휴지 발색까지 다 지기이다.&lt;br&gt;휴지에서 노란테가 더 많이 보인다.&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/L7uSy/dJMcaglrRoO/GCXKWfbZEkA899a1weyBo0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/L7uSy/dJMcaglrRoO/GCXKWfbZEkA899a1weyBo0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/L7uSy/dJMcaglrRoO/GCXKWfbZEkA899a1weyBo0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FL7uSy%2FdJMcaglrRoO%2FGCXKWfbZEkA899a1weyBo0%2Fimg.jpg&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;3024&quot; height=&quot;4032&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;유사한 색들 모아서&amp;nbsp;발색샷!&lt;br&gt;&lt;br&gt;&amp;nbsp;&lt;br&gt;세일러(Sailor)의 일본 지역 한정 잉크 시리즈 중 하나인 'STAs 오리지널 잉크'&lt;br&gt;&amp;nbsp;&lt;br&gt;STAs는 일본 시즈오카현의 유명 문구점 연합(Shizuoka Stationery Association)을 뜻한다.&lt;br&gt;&amp;nbsp;&lt;br&gt;이 시리즈는 일본의 고전 문학이나 지역의 아름다운 정취를 테마로 잉크를 출시하는 것으로 유명하다는데 나는 이번에 알았지… &lt;br&gt;&lt;br&gt;그중에서도 다섯번째 시리즈 지기는 저의 최애 잉크중 하나 &lt;br&gt;&amp;nbsp;&lt;br&gt;&lt;b&gt;알 지(知)&lt;/b&gt; + &lt;b&gt;자기 기(己)&lt;/b&gt;: &lt;u&gt;자기 자신을 알아주는 사람&lt;/u&gt;&lt;br&gt;&amp;nbsp;&lt;br&gt;단순한 지인을 넘어, 내 마음과 속사정, 그리고 진정한 가치를 깊이 이해해 주는 &lt;b&gt;절친한 친구&lt;/b&gt;를 이르는 말인데, &lt;br&gt;흔히 '지기지우(知己之友)'라고도 부르며,&lt;br&gt;'선비는 자신을 알아주는 사람(지기)을 위해 목숨을 바친다'라고도 한다.&lt;br&gt;그때나 지금이나 다들 '나를 진정으로 알아주는 자'에 대한 욕망은 여전한가 보다&lt;br&gt;최근에 [멋진 신세계]&lt;u&gt;드라마에서 지기라는 말이 언급이 되길래 더욱 반가웠다. &lt;/u&gt;&lt;br&gt;&amp;nbsp;&lt;/p&gt;&lt;h3 data-ke-size=&quot;size23&quot;&gt;  장점: 매혹적인 색감과 시각적 즐거움&lt;/h3&gt;&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;&lt;li&gt;&lt;b&gt;독보적인 테와 농담 표현:&lt;/b&gt; 딥펜(특히 글라스펜) 사용 시 잉크 본연의 아름다운 농담(그라데이션)과 매력적인 테를 풍부하게 즐길 수 있음&lt;/li&gt;&lt;li&gt;&lt;b&gt;반전 매력의 색 변화:&lt;/b&gt; 펜을 닦아낸 휴지에서 사르르 피어나는 &lt;b&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;짐승 용량:&lt;/b&gt; 50ml라는 넉넉한 용량 덕분에 잔여량 걱정 없이 마음껏 시필하고 필사할 수 있음!!&lt;/li&gt;&lt;/ul&gt;&lt;h3 data-ke-size=&quot;size23&quot;&gt;  단점: 높은 진입 장벽과 부담감&lt;/h3&gt;&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;&lt;li&gt;&lt;b&gt;과한 용량의 부담:&lt;/b&gt; 50ml는 잉크를 자주 바꾸는 사용자나 가볍게 경험해 보고 싶은 사람에게는 다소 부담스러운 대용량&lt;/li&gt;&lt;li&gt;&lt;b&gt;극악의 접근성:&lt;/b&gt; 본품 자체를 구하기가 매우 힘들고 귀함. 직구도 어렵고..&lt;/li&gt;&lt;li&gt;&lt;b&gt;소분 구매의 어려움:&lt;/b&gt; 양이 많아 소분(나눔) 형태로 먼저 찍먹해보고 싶어도, 소분 매물마저 구하기가 까다로워 진입 장벽이 높다&lt;/li&gt;&lt;/ul&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1500&quot; data-origin-height=&quot;2000&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b21uZN/dJMcaglrRoz/K7pd2HNTdGzjJl7L4H7KC1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b21uZN/dJMcaglrRoz/K7pd2HNTdGzjJl7L4H7KC1/img.jpg&quot; data-alt=&quot;사진에서는 지기가 더 연해버이지만 실제로 발색은 라일락 마이에나가 더 연함&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b21uZN/dJMcaglrRoz/K7pd2HNTdGzjJl7L4H7KC1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb21uZN%2FdJMcaglrRoz%2FK7pd2HNTdGzjJl7L4H7KC1%2Fimg.jpg&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;1500&quot; height=&quot;2000&quot; data-origin-width=&quot;1500&quot; data-origin-height=&quot;2000&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;사진에서는 지기가 더 연해버이지만 실제로 발색은 라일락 마이에나가 더 연함&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: left;&quot;&gt;&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/7cYuc/dJMb990Y7YI/K93nmV1ooQAnqT7dFRKnTk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/7cYuc/dJMb990Y7YI/K93nmV1ooQAnqT7dFRKnTk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/7cYuc/dJMb990Y7YI/K93nmV1ooQAnqT7dFRKnTk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F7cYuc%2FdJMb990Y7YI%2FK93nmV1ooQAnqT7dFRKnTk%2Fimg.jpg&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;3024&quot; height=&quot;4032&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: left;&quot;&gt;펜입해서 발색!&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1500&quot; data-origin-height=&quot;2000&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bF6rXD/dJMb990Y7YF/qzKjlTgROoBMILbAu306U0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bF6rXD/dJMb990Y7YF/qzKjlTgROoBMILbAu306U0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bF6rXD/dJMb990Y7YF/qzKjlTgROoBMILbAu306U0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbF6rXD%2FdJMb990Y7YF%2FqzKjlTgROoBMILbAu306U0%2Fimg.jpg&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;1500&quot; height=&quot;2000&quot; data-origin-width=&quot;1500&quot; data-origin-height=&quot;2000&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1500&quot; data-origin-height=&quot;2000&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bMzCiK/dJMb990Y7YG/vuwOAAVXyaJ7txM6B24RM0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bMzCiK/dJMb990Y7YG/vuwOAAVXyaJ7txM6B24RM0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bMzCiK/dJMb990Y7YG/vuwOAAVXyaJ7txM6B24RM0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbMzCiK%2FdJMb990Y7YG%2FvuwOAAVXyaJ7txM6B24RM0%2Fimg.jpg&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;1500&quot; height=&quot;2000&quot; data-origin-width=&quot;1500&quot; data-origin-height=&quot;2000&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;4284&quot; data-origin-height=&quot;5712&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/LkYE8/dJMcaglrRo0/NgZlq18DpiP9sJCKww9aok/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/LkYE8/dJMcaglrRo0/NgZlq18DpiP9sJCKww9aok/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/LkYE8/dJMcaglrRo0/NgZlq18DpiP9sJCKww9aok/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLkYE8%2FdJMcaglrRo0%2FNgZlq18DpiP9sJCKww9aok%2Fimg.jpg&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;4284&quot; height=&quot;5712&quot; data-origin-width=&quot;4284&quot; data-origin-height=&quot;5712&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;휴지 발색에서&lt;br&gt;밑에 있는것이 지기 &lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&amp;nbsp;&lt;br&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>연장⛏ (만년필, 잉크,노트 등)</category>
      <author>리제 </author>
      <guid isPermaLink="true">https://bookstairs.tistory.com/50</guid>
      <comments>https://bookstairs.tistory.com/50#entry50comment</comments>
      <pubDate>Sat, 6 Jun 2026 12:29:58 +0900</pubDate>
    </item>
    <item>
      <title>[Class-13] 제네릭 / 컬렉션</title>
      <link>https://bookstairs.tistory.com/55</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://st-lab.tistory.com/243&quot;&gt;자바 [JAVA] - Comparable 과 Comparator의 이해&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1780550459070&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;자바 [JAVA] - Comparable 과 Comparator의 이해&quot; data-og-description=&quot;아마 이 글을 찾아 오신 분들 대개는 Comparable과 Comparator의 차이가 무엇인지 모르거나 궁금해서 찾아오셨을 것이다. 사실 알고보면 두 개는 그렇게 어렵지 않으나 아무래도 자바를 학습하면서 객&quot; data-og-host=&quot;st-lab.tistory.com&quot; data-og-source-url=&quot;https://st-lab.tistory.com/243&quot; data-og-url=&quot;https://st-lab.tistory.com/243&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/eFVfK/dJMb9frMOGa/2s33vW3LANGEplQ8OKfks0/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/bvKAdV/dJMb9kmj15v/rZlxKkpYmshrtIWjRaS2m0/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/PPico/dJMb9frMOGc/p9eujBxHuXHZglxHs1V2a0/img.png?width=1082&amp;amp;height=1464&amp;amp;face=0_0_1082_1464&quot;&gt;&lt;a href=&quot;https://st-lab.tistory.com/243&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://st-lab.tistory.com/243&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/eFVfK/dJMb9frMOGa/2s33vW3LANGEplQ8OKfks0/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/bvKAdV/dJMb9kmj15v/rZlxKkpYmshrtIWjRaS2m0/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/PPico/dJMb9frMOGc/p9eujBxHuXHZglxHs1V2a0/img.png?width=1082&amp;amp;height=1464&amp;amp;face=0_0_1082_1464');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;자바 [JAVA] - Comparable 과 Comparator의 이해&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;아마 이 글을 찾아 오신 분들 대개는 Comparable과 Comparator의 차이가 무엇인지 모르거나 궁금해서 찾아오셨을 것이다. 사실 알고보면 두 개는 그렇게 어렵지 않으나 아무래도 자바를 학습하면서 객&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;st-lab.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;s&gt;선생님 블로그.&amp;nbsp;&lt;/s&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;s&gt;이해할 때 까지 읽는다.&lt;/s&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&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-filename=&quot;스크린샷 2026-06-02 163707.png&quot; data-origin-width=&quot;877&quot; data-origin-height=&quot;579&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bFjhvW/dJMcagTig22/VTHXQX300ohwmvzHE2wka1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bFjhvW/dJMcagTig22/VTHXQX300ohwmvzHE2wka1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bFjhvW/dJMcagTig22/VTHXQX300ohwmvzHE2wka1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbFjhvW%2FdJMcagTig22%2FVTHXQX300ohwmvzHE2wka1%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;877&quot; height=&quot;579&quot; data-filename=&quot;스크린샷 2026-06-02 163707.png&quot; data-origin-width=&quot;877&quot; data-origin-height=&quot;579&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;h3 data-path-to-node=&quot;2&quot; data-ke-size=&quot;size23&quot;&gt;◆ 제네릭 이전 코드의 문제점: &quot;타입 안전성의 붕괴&quot;&lt;/h3&gt;
&lt;p data-path-to-node=&quot;3&quot; data-ke-size=&quot;size16&quot;&gt;제네릭 코드는&amp;nbsp; 아무거나 다 담을 수 있는 장점이 될 수 있지만, 동시에 &quot;무엇이 담겨 있는지 확인할 방법이 없다&quot;는 치명적인 약점이 있다.&lt;/p&gt;
&lt;h4 data-path-to-node=&quot;4&quot; data-ke-size=&quot;size20&quot;&gt;1. 프로그래머의 실수 시나리오&lt;/h4&gt;
&lt;div data-ved=&quot;0CAAQhtANahgKEwiU7onHyOyUAxUAAAAAHQAAAAAQqgM&quot; data-hveid=&quot;0&quot;&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;pre class=&quot;reasonml&quot;&gt;&lt;code&gt;// 제네릭이 없는 List (Object를 저장함)
List list = new ArrayList();

// 프로그래머는 당연히 Human 객체만 들어있을 것이라 가정하고 코드를 짬
list.add(new Human(&quot;이무진&quot;, 25));
list.add(new Human(&quot;이창섭&quot;, 30));

// 실수 발생: 실수로 Human 객체가 아닌 String 문자열을 넣어버림
list.add(&quot;임재현&quot;); 
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;h4 data-path-to-node=&quot;6&quot; data-ke-size=&quot;size20&quot;&gt;2. 컴파일러의 태도&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;7&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;7,0,0&quot;&gt;컴파일 과정:&lt;/b&gt; 컴파일러는 list.add(&quot;임재현&quot;); 구문을 볼 때 &quot;어, ArrayList는 Object를 담는 곳이네? 문자열(String)도 Object의 자식이니까 허용!&quot;이라고 판단.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;7,1,0&quot;&gt;결과:&lt;/b&gt; &lt;b data-index-in-node=&quot;4&quot; data-path-to-node=&quot;7,1,0&quot;&gt;오류(Error)가 전혀 발생하지 않는다.&lt;/b&gt; 컴파일러는 프로그래머가 실수로 다른 타입을 넣었는지 전혀 알지 못함&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-path-to-node=&quot;8&quot; data-ke-size=&quot;size20&quot;&gt;3. 런타임(실행 시)의 재앙&lt;/h4&gt;
&lt;p data-path-to-node=&quot;9&quot; data-ke-size=&quot;size16&quot;&gt;문제는 데이터를 꺼낼 때 발생한다. 프로그래머는 리스트에 Human만 있다고 믿고 강제 형변환(Casting)을 시도.&lt;/p&gt;
&lt;div data-ved=&quot;0CAAQhtANahgKEwiU7onHyOyUAxUAAAAAHQAAAAAQqwM&quot; data-hveid=&quot;0&quot;&gt;
&lt;div&gt;&lt;br /&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;pre class=&quot;lisp&quot;&gt;&lt;code&gt;for (int i = 0; i &amp;lt; list.size(); i++) {
    //   프로그래머: &quot;여긴 다 Human 객체야!&quot;
    Human h = (Human) list.get(i); 
    System.out.println(h.getName());
}
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;11&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;11,0,0&quot;&gt;결과:&lt;/b&gt; 리스트에 들어있던 String 객체를 Human으로 강제 형변환하려는 순간, ClassCastException이라는 런타임 오류가 발생하며 프로그램이 그 자리에서 &lt;b data-index-in-node=&quot;95&quot; data-path-to-node=&quot;11,0,0&quot;&gt;강제 종료&lt;/b&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-path-to-node=&quot;13&quot; data-ke-size=&quot;size23&quot;&gt;◆ 핵심 차이점: &quot;컴파일 vs 런타임&quot;&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-path-to-node=&quot;14&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;구분&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;제네릭 이전 (Object 관리)&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;제네릭 이후 (&amp;lt;Human&amp;gt; 명시)&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;14,1,0,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;14,1,0,0&quot;&gt;타입 확인 시점&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;14,1,1,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;14,1,1,0&quot;&gt;런타임 (프로그램 실행 중)&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;14,1,2,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;14,1,2,0&quot;&gt;컴파일 (코드 작성 및 빌드 중)&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;14,2,0,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;14,2,0,0&quot;&gt;오류 발견&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;14,2,1,0&quot;&gt;실행 중에 터져서 프로그램 멈춤&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;14,2,2,0&quot;&gt;코드를 짜는 중에 빨간 줄로 경고함&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;14,3,0,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;14,3,0,0&quot;&gt;안전성&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;14,3,1,0&quot;&gt;매우 낮음 (실수 방지 불가)&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;14,3,2,0&quot;&gt;매우 높음 (실수 즉시 수정 가능)&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-path-to-node=&quot;16&quot; data-ke-size=&quot;size23&quot;&gt;◆ 제네릭이 해결하는 방식 (실수 원천 차단)&lt;/h3&gt;
&lt;p data-path-to-node=&quot;17&quot; data-ke-size=&quot;size16&quot;&gt;만약 List&amp;lt;Human&amp;gt; list = new ArrayList&amp;lt;&amp;gt;();라고 제네릭을 명시했다면 어떤 일이 생길까.&lt;/p&gt;
&lt;div data-ved=&quot;0CAAQhtANahgKEwiU7onHyOyUAxUAAAAAHQAAAAAQrgM&quot; data-hveid=&quot;0&quot;&gt;
&lt;div&gt;&lt;br /&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;pre class=&quot;lasso&quot;&gt;&lt;code&gt;List&amp;lt;Human&amp;gt; list = new ArrayList&amp;lt;&amp;gt;();
list.add(new Human(&quot;이무진&quot;, 25));

// ❌ 컴파일러의 강력한 제재
// &quot;Human 타입만 들어올 수 있는데, 왜 String을 넣으려 해?&quot;
list.add(&quot;임재현&quot;); //   여기서 즉시 컴파일 에러 발생!
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p data-path-to-node=&quot;19&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;19&quot;&gt;요약하자면:&lt;/b&gt;&lt;/p&gt;
&lt;p data-path-to-node=&quot;19&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;제네릭은 컴파일러가 &quot;작성한 코드가 타입 측면에서 완벽한지 미리 검사&quot;하게 함으로써, 프로그래머의 사소한 실수(다른 타입 입력)를 즉시 수정 가능한 상태로 잡아주는 것&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-04 101941.png&quot; data-origin-width=&quot;928&quot; data-origin-height=&quot;543&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/G2nvy/dJMcabxDVZJ/4Bbhw3igSE7G0BCP8aCaiK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/G2nvy/dJMcabxDVZJ/4Bbhw3igSE7G0BCP8aCaiK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/G2nvy/dJMcabxDVZJ/4Bbhw3igSE7G0BCP8aCaiK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FG2nvy%2FdJMcabxDVZJ%2F4Bbhw3igSE7G0BCP8aCaiK%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;928&quot; height=&quot;543&quot; data-filename=&quot;스크린샷 2026-06-04 101941.png&quot; data-origin-width=&quot;928&quot; data-origin-height=&quot;543&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-path-to-node=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;자바 컬렉션 프레임워크는 데이터를 효율적으로 관리하려고 만든 '데이터 보관소' 모음임. 상황에 따라 골라 쓸 수 있게 도구들이 정리되어 있음.&lt;/p&gt;
&lt;h3 data-path-to-node=&quot;1&quot; data-ke-size=&quot;size23&quot;&gt;1. 컬렉션 프레임워크 핵심&lt;/h3&gt;
&lt;p data-path-to-node=&quot;2&quot; data-ke-size=&quot;size16&quot;&gt;자바에서 데이터를 담는 인터페이스들이야. 크게 세 가지(Set, List, Queue)와 독립적인 Map이 있음. 다들 제네릭(&amp;lt;E&amp;gt;)을 써서 원하는 자료형만 딱 담을 수 있게 구현되어 있음.&lt;/p&gt;
&lt;h3 data-path-to-node=&quot;3&quot; data-ke-size=&quot;size23&quot;&gt;2. Set 인터페이스와 HashSet&lt;/h3&gt;
&lt;p data-path-to-node=&quot;4&quot; data-ke-size=&quot;size16&quot;&gt;Set은 '중복 없는 주머니'라고 생각하면 됨.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;5&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;5,0,0&quot;&gt;순서 없음:&lt;/b&gt; 넣은 순서대로 나오지 않음.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;5,1,0&quot;&gt;중복 불가:&lt;/b&gt; 같은 데이터를 또 넣으려고 하면 거부함.&lt;/li&gt;
&lt;/ul&gt;
&lt;div data-ved=&quot;0CAAQhtANahgKEwiU7onHyOyUAxUAAAAAHQAAAAAQ9gM&quot; data-hveid=&quot;0&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&lt;span&gt;Java&lt;/span&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;pre class=&quot;gams&quot;&gt;&lt;code&gt;Set&amp;lt;String&amp;gt; set = new HashSet&amp;lt;&amp;gt;();
set.add(&quot;Toy&quot;);
set.add(&quot;Box&quot;);
set.add(&quot;Robot&quot;);
set.add(&quot;Box&quot;); // 이미 있어서 추가 안 됨
// 결과적으로 데이터는 3개만 남음
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-path-to-node=&quot;7&quot; data-ke-size=&quot;size23&quot;&gt;3. &quot;그렇다면 동일 인스턴스의 기준은?&quot;&lt;/h3&gt;
&lt;p data-path-to-node=&quot;8&quot; data-ke-size=&quot;size16&quot;&gt;Set이 중복을 판별하려면 '이게 같은 데이터인지' 알아야 함.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;9&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,0,0&quot;&gt;기본 클래스(String 등):&lt;/b&gt; 자바가 이미 같은지 비교하는 법을 알고 있어서 문제없음.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,1,0&quot;&gt;직접 만든 클래스(Human 등):&lt;/b&gt; 자바가 모름. 그래서 우리가 직접 equals()랑 hashCode()를 재정의해서 알려줘야 함.&lt;/li&gt;
&lt;/ul&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-path-to-node=&quot;10&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;10,0,0&quot;&gt;hashCode():&lt;/b&gt; 데이터를 담을 때 해시값(주소표) 생성.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;10,1,0&quot;&gt;equals():&lt;/b&gt; 해시값이 같을 때, 실제 내용물이 같은지 1:1 비교.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-path-to-node=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-path-to-node=&quot;1&quot; data-ke-size=&quot;size23&quot;&gt;1. 해시 알고리즘의 핵심 개념&lt;/h3&gt;
&lt;p data-path-to-node=&quot;2&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;해시(Hash) 알고리즘은&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b data-path-to-node=&quot;0&quot; data-index-in-node=&quot;15&quot;&gt;데이터를 빠르게 찾기 위해 데이터를 분류해 놓는 기술&lt;/b&gt;&lt;/p&gt;
&lt;p data-path-to-node=&quot;2&quot; data-ke-size=&quot;size16&quot;&gt;쉽게 말해 '도서관의 분류 체계'와 비슷&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;3&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;3,0,0&quot;&gt;분류 대상:&lt;/b&gt; 3, 5, 7, 12, 25, 31&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;3,1,0&quot;&gt;분류 규칙(해시 함수):&lt;/b&gt; num % 3 (숫자를 3으로 나눈 나머지)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-path-to-node=&quot;4&quot; data-ke-size=&quot;size16&quot;&gt;데이터를 3으로 나눈 나머지에 따라 방(연산결과)을 0, 1, 2번으로 나눴음.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;5&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;5,0,0&quot;&gt;연산결과 0:&lt;/b&gt; 3(3%3=0), 12(12%3=0)&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;5,1,0&quot;&gt;연산결과 1:&lt;/b&gt; 7(7%3=1), 25(25%3=1), 31(31%3=1)&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;5,2,0&quot;&gt;연산결과 2:&lt;/b&gt; 5(5%3=2)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-path-to-node=&quot;6&quot; data-ke-size=&quot;size23&quot;&gt;2. 왜 이렇게 분류함? (속도 때문)&lt;/h3&gt;
&lt;p data-path-to-node=&quot;7&quot; data-ke-size=&quot;size16&quot;&gt;만약 데이터를 섞어놓고 &quot;25가 있니?&quot;라고 물어보면, 무식하게 하나씩 다 뒤져야 함. 하지만 위처럼 분류를 해놓으면?&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;8&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&quot;25 찾으려면? 25 % 3 = 1이니까 &lt;b data-index-in-node=&quot;24&quot; data-path-to-node=&quot;8,0,0&quot;&gt;연산결과 1번 방만 뒤지면 됨.&lt;/b&gt;&quot;&lt;/li&gt;
&lt;li&gt;나머지 0번 방과 2번 방은 아예 쳐다볼 필요도 없음. 이게 탐색 속도가 미친 듯이 빨라지는 이유임.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-path-to-node=&quot;9&quot; data-ke-size=&quot;size23&quot;&gt;3. 자바의 hashCode() 메서드&lt;/h3&gt;
&lt;p data-path-to-node=&quot;10&quot; data-ke-size=&quot;size16&quot;&gt;자바의 Object 클래스에 있는 hashCode()는 바로 이 역할을 함.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;11&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;우리가 HashSet에 객체를 넣으면, 자바는 그 객체의 hashCode()를 호출해서 &quot;이 녀석은 몇 번 바구니에 담을까?&quot;를 결정함.&lt;/li&gt;
&lt;li&gt;그리고 나서 equals()를 호출해 &quot;혹시 이 바구니에 똑같은 내용물 가진 놈이 이미 있나?&quot;를 확인해서 중복을 걸러내는 것임.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-path-to-node=&quot;12&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;12&quot;&gt;요약하자면:&lt;/b&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-path-to-node=&quot;13&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;13,0,0&quot;&gt;hashCode()&lt;/b&gt;: 데이터를 담을 바구니 주소를 정하는 '분류 알고리즘'&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;13,1,0&quot;&gt;equals()&lt;/b&gt;: 바구니 안에서 진짜 같은지 확인하는 '검증 알고리즘'&lt;/li&gt;
&lt;/ol&gt;</description>
      <category>개발자 호소인/JAVA</category>
      <author>리제 </author>
      <guid isPermaLink="true">https://bookstairs.tistory.com/55</guid>
      <comments>https://bookstairs.tistory.com/55#entry55comment</comments>
      <pubDate>Thu, 4 Jun 2026 14:32:15 +0900</pubDate>
    </item>
    <item>
      <title>[Class-12] 기본 API</title>
      <link>https://bookstairs.tistory.com/54</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-02 091409.png&quot; data-origin-width=&quot;1121&quot; data-origin-height=&quot;717&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/42sef/dJMcagloJ17/dYA6KnsU1BK601HKKjPyc1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/42sef/dJMcagloJ17/dYA6KnsU1BK601HKKjPyc1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/42sef/dJMcagloJ17/dYA6KnsU1BK601HKKjPyc1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F42sef%2FdJMcagloJ17%2FdYA6KnsU1BK601HKKjPyc1%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;1121&quot; height=&quot;717&quot; data-filename=&quot;스크린샷 2026-06-02 091409.png&quot; data-origin-width=&quot;1121&quot; data-origin-height=&quot;717&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 style=&quot;text-align: center;&quot; data-path-to-node=&quot;6&quot; data-ke-size=&quot;size26&quot;&gt;원시 타입과 객체 타입의 메모리 구조&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;7&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;7,0,0&quot;&gt;원시 타입 (int, boolean, char 등):&lt;/b&gt; 변수 상자 안에 진짜 실제 데이터 값이 알맹이로 직접 들어감. 메모리의 스택(Stack) 영역만 사용하며 null을 가질 수 없음.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;7,1,0&quot;&gt;객체 타입 (String, Book, 배열 등):&lt;/b&gt; 진짜 데이터 본체는 힙(Heap) 메모리 창고에 따로 생성됨. 변수 상자 안에는 그 본체가 있는 창고의 주소(화살표)만 저장됨. 연결된 본체가 없을 때 null 상태가 됨.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-02 092646.png&quot; data-origin-width=&quot;747&quot; data-origin-height=&quot;388&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/S2GWF/dJMcab5tIVn/wH2nrKbsKBe6UMW6cTlgG1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/S2GWF/dJMcab5tIVn/wH2nrKbsKBe6UMW6cTlgG1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/S2GWF/dJMcab5tIVn/wH2nrKbsKBe6UMW6cTlgG1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FS2GWF%2FdJMcab5tIVn%2FwH2nrKbsKBe6UMW6cTlgG1%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;747&quot; height=&quot;388&quot; data-filename=&quot;스크린샷 2026-06-02 092646.png&quot; data-origin-width=&quot;747&quot; data-origin-height=&quot;388&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-02 092828.png&quot; data-origin-width=&quot;1273&quot; data-origin-height=&quot;711&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bSgDty/dJMcagFLy1W/fiNkENXOXESGijI2GHaNPk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bSgDty/dJMcagFLy1W/fiNkENXOXESGijI2GHaNPk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bSgDty/dJMcagFLy1W/fiNkENXOXESGijI2GHaNPk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbSgDty%2FdJMcagFLy1W%2FfiNkENXOXESGijI2GHaNPk%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;1273&quot; height=&quot;711&quot; data-filename=&quot;스크린샷 2026-06-02 092828.png&quot; data-origin-width=&quot;1273&quot; data-origin-height=&quot;711&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;777&quot; data-origin-height=&quot;187&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/RkMts/dJMcahEAE2q/5SIeTlcLlZAz5zq7LlF1Vk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/RkMts/dJMcahEAE2q/5SIeTlcLlZAz5zq7LlF1Vk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/RkMts/dJMcahEAE2q/5SIeTlcLlZAz5zq7LlF1Vk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FRkMts%2FdJMcahEAE2q%2F5SIeTlcLlZAz5zq7LlF1Vk%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;777&quot; height=&quot;187&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;777&quot; data-origin-height=&quot;187&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-path-to-node=&quot;12&quot; data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-path-to-node=&quot;12&quot; data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-path-to-node=&quot;12&quot; data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h2 style=&quot;text-align: center;&quot; data-path-to-node=&quot;12&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;날짜 API: Date vs LocalDateTime&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;13&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;13,0,0&quot;&gt;java.util.Date:&lt;/b&gt; 연도 계산 시 1900을 빼야 하고 월 계산 시 1을 빼야 해서 연산이 매우 불편함. 내부 값을 임의로 바꿀 수 있어(setter 존재) 데이터 오염에 취약함. 현재는 사용을 권장하지 않음(deprecated).&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;13,1,0&quot;&gt;java.time.LocalDateTime:&lt;/b&gt; 자바 8부터 도입된 표준임. 입력한 숫자 그대로 연도와 월을 인식하며, 내부 값을 바꿀 수 없는 &lt;b data-index-in-node=&quot;79&quot; data-path-to-node=&quot;13,1,0&quot;&gt;불변 객체&lt;/b&gt;라 멀티스레드 환경이나 아키텍처 설계상 매우 안전함.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;String의 불변성과 상수풀(String Pool)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자바에서 String은 일반적인 객체들과 완전히 다른 방식으로 메모리를 관리함.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-02 124932.png&quot; data-origin-width=&quot;837&quot; data-origin-height=&quot;575&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/m9rMV/dJMcahxSrJs/FK76CdiYZHubpCvpTskouK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/m9rMV/dJMcahxSrJs/FK76CdiYZHubpCvpTskouK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/m9rMV/dJMcahxSrJs/FK76CdiYZHubpCvpTskouK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fm9rMV%2FdJMcahxSrJs%2FFK76CdiYZHubpCvpTskouK%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;837&quot; height=&quot;575&quot; data-filename=&quot;스크린샷 2026-06-02 124932.png&quot; data-origin-width=&quot;837&quot; data-origin-height=&quot;575&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-02 140653.png&quot; data-origin-width=&quot;803&quot; data-origin-height=&quot;571&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/clAcrm/dJMb990Wgow/fkpakkNyiP5dSnw4NdnqG0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/clAcrm/dJMb990Wgow/fkpakkNyiP5dSnw4NdnqG0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/clAcrm/dJMb990Wgow/fkpakkNyiP5dSnw4NdnqG0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FclAcrm%2FdJMb990Wgow%2FfkpakkNyiP5dSnw4NdnqG0%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;803&quot; height=&quot;571&quot; data-filename=&quot;스크린샷 2026-06-02 140653.png&quot; data-origin-width=&quot;803&quot; data-origin-height=&quot;571&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-02 140700.png&quot; data-origin-width=&quot;806&quot; data-origin-height=&quot;329&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/phWMO/dJMb990Wgrf/LRoB48AcheWogoSQnuo0U0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/phWMO/dJMb990Wgrf/LRoB48AcheWogoSQnuo0U0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/phWMO/dJMb990Wgrf/LRoB48AcheWogoSQnuo0U0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FphWMO%2FdJMb990Wgrf%2FLRoB48AcheWogoSQnuo0U0%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;806&quot; height=&quot;329&quot; data-filename=&quot;스크린샷 2026-06-02 140700.png&quot; data-origin-width=&quot;806&quot; data-origin-height=&quot;329&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>개발자 호소인/JAVA</category>
      <author>리제 </author>
      <guid isPermaLink="true">https://bookstairs.tistory.com/54</guid>
      <comments>https://bookstairs.tistory.com/54#entry54comment</comments>
      <pubDate>Tue, 2 Jun 2026 18:41:21 +0900</pubDate>
    </item>
    <item>
      <title>[Class -11] 상속 / 예외처리 / 입출력(OI)</title>
      <link>https://bookstairs.tistory.com/53</link>
      <description>&lt;h3 data-path-to-node=&quot;2&quot; data-ke-size=&quot;size23&quot;&gt;◆ 상속의 기본적인 특성과 특징&lt;/h3&gt;
&lt;p data-path-to-node=&quot;3&quot; data-ke-size=&quot;size16&quot;&gt;상속은 기존 클래스(부모)의 변수와 메서드를 새로운 클래스(자식)가 물려받아 그대로 사용하거나 기능을 확장하는 매커니즘임.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;4&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;4,0,0&quot;&gt;키워드:&lt;/b&gt; extends (확장하다) 기호를 사용하여 구현함.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;4,1,0&quot;&gt;적용 범위:&lt;/b&gt; 부모의 멤버 중 private 지시자가 붙은 변수나 메서드는 상속은 되지만 자식이 직접 접근할 수 없음. 또한 &lt;b data-index-in-node=&quot;69&quot; data-path-to-node=&quot;4,1,0&quot;&gt;생성자&lt;/b&gt;는 상속 대상에서 완전히 제외됨.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;4,2,0&quot;&gt;이점:&lt;/b&gt; 이미 검증된 코드를 재사용하므로 중복 코드가 획기적으로 줄어들고, 유지보수가 쉬워지며 프로그램의 확장성이 극대화됨.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-path-to-node=&quot;6&quot; data-ke-size=&quot;size23&quot;&gt;◆ 모든 클래스의 조상: Object 클래스 후손&lt;/h3&gt;
&lt;p data-path-to-node=&quot;7&quot; data-ke-size=&quot;size16&quot;&gt;자바에서 개발자가 만드는 모든 클래스는 별도로 extends를 적지 않아도 &lt;b data-index-in-node=&quot;42&quot; data-path-to-node=&quot;7&quot;&gt;무조건 java.lang.Object 클래스를 자동으로 상속받도록 설계&lt;/b&gt;되어 있음.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;8&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;8,0,0&quot;&gt;최상위 조상:&lt;/b&gt; 모든 클래스는 최하위 후손이며, Object가 제공하는 기본 메서드들을 물려받아 사용할 수 있음.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;8,1,0&quot;&gt;주요 물려받는 메서드:&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;8,1,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;toString(): 객체의 텍스트 표현(주소값 또는 데이터)을 반환함.&lt;/li&gt;
&lt;li&gt;equals(Object obj): 두 객체가 메모리상에서 동일한지 비교함.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-path-to-node=&quot;10&quot; data-ke-size=&quot;size23&quot;&gt;◆ 단일 상속 vs 다중 상속&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;11&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;11,0,0&quot;&gt;단일 상속 (자바의 표준 규칙):&lt;/b&gt; 자바는 클래스 간의 &lt;b data-index-in-node=&quot;30&quot; data-path-to-node=&quot;11,0,0&quot;&gt;다중 상속을 절대 허용하지 않음&lt;/b&gt;. 즉, class Child extends Father, Mother와 같이 두 개 이상의 부모를 동시에 지정할 수 없음.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;11,1,0&quot;&gt;이유 (다이아몬드 문제 방지):&lt;/b&gt; 만약 두 부모 클래스에 이름이 똑같은 메서드가 존재할 경우, 자식 객체가 어떤 부모의 메서드를 실행해야 할지 컴퓨터 시스템이 판단할 수 없는 모호성이 발생하기 때문임.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;11,2,0&quot;&gt;해결책:&lt;/b&gt; 다중 상속의 효과를 내기 위해 자바는 인터페이스(Interface)라는 특수 구조를 제공함.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-path-to-node=&quot;13&quot; data-ke-size=&quot;size23&quot;&gt;◆ 생성자 호출 관계 파악&lt;/h3&gt;
&lt;p data-path-to-node=&quot;14&quot; data-ke-size=&quot;size16&quot;&gt;자식 객체를 생성할 때, 메모리(Heap) 내부에서는 자식 혼자 태어나지 않음. 반드시 부모 객체가 먼저 생성된 후 자식 객체가 그 겉을 감싸며 결합하는 아키텍처를 가짐.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;15&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;15,0,0&quot;&gt;실행 순서:&lt;/b&gt; 자식 생성자가 호출되면, 내부적으로 &lt;b data-index-in-node=&quot;27&quot; data-path-to-node=&quot;15,0,0&quot;&gt;부모 생성자가 먼저 완벽하게 실행을 끝낸 뒤&lt;/b&gt; 자식 생성자의 나머지 본문 코드가 가동됨.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-path-to-node=&quot;17&quot; data-ke-size=&quot;size23&quot;&gt;◆ super() 와 super 의 차이점&lt;/h3&gt;
&lt;p data-path-to-node=&quot;18&quot; data-ke-size=&quot;size16&quot;&gt;이름은 비슷하지만 메모리를 제어하는 용도가 완전히 다름.&lt;/p&gt;
&lt;h4 data-path-to-node=&quot;19&quot; data-ke-size=&quot;size20&quot;&gt;① super() : 부모의 생성자 호출 명령&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;20&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;자식 생성자 내부에서 부모의 생성자를 강제로 가동시키는 메서드 형태의 명령어임.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;20,1,0&quot;&gt;규칙:&lt;/b&gt; 자식 생성자 본문에서 &lt;b data-index-in-node=&quot;16&quot; data-path-to-node=&quot;20,1,0&quot;&gt;반드시 첫 줄에만&lt;/b&gt; 위치해야 함. 생략하면 컴파일러가 부모의 기본 생성자를 부르는 super();를 자동으로 맨 첫 줄에 삽입함.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-path-to-node=&quot;21&quot; data-ke-size=&quot;size20&quot;&gt;② super : 부모 객체의 메모리 주소록(참조 변수)&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;22&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;자식 클래스 내부에서 내 변수와 부모의 변수 이름이 중복되어 충돌할 때, &lt;b data-index-in-node=&quot;41&quot; data-path-to-node=&quot;22,0,0&quot;&gt;부모의 자원을 콕 집어서 가리키는 키워드&lt;/b&gt;임.&lt;/li&gt;
&lt;li&gt;this가 현재 나 자신의 메모리 주소를 뜻한다면, super는 내 부모 방의 주소를 의미함.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-path-to-node=&quot;24&quot; data-ke-size=&quot;size23&quot;&gt;◆ 상속이 도움이 되는 상황의 예시&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;25&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;25,0,0&quot;&gt;상황:&lt;/b&gt; 회사에서 '정직원' 관리 프로그램과 '알바생' 관리 프로그램을 따로 구축해야 하는 경우.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;25,1,0&quot;&gt;상속 미적용 시:&lt;/b&gt; 두 클래스 모두에 이름, 나이, 사원번호, 입사일 등 똑같은 변수와 출력 메서드를 중복해서 타이핑해야 함.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;25,2,0&quot;&gt;상속 적용 시:&lt;/b&gt; 공통 분모인 '사원(Employee)' 클래스를 위 상위에 정의하고, '정직원(Regular)'과 '알바생(PartTime)'은 상위 클래스를 extends 한 뒤 각각 보너스 계산법이나 시급 계산법 등 자신만의 고유 차별점만 아래에 추가 구현하면 됨.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-path-to-node=&quot;27&quot; data-ke-size=&quot;size23&quot;&gt;◆ 단순 인맥 관리 프로그램 예제 (관리 대상이 둘인 구조)&lt;/h3&gt;
&lt;p data-path-to-node=&quot;28&quot; data-ke-size=&quot;size16&quot;&gt;관리 대상이 &quot;동창(UnivFriend)&quot;과 &lt;b data-index-in-node=&quot;25&quot; data-path-to-node=&quot;28&quot;&gt;&quot;직장 동료(CompanyFriend)&quot;&lt;/b&gt; 둘인 경우의 아키텍처 설계 코드임. 공통 데이터는 상위 클래스(Friend)로 묶고 상속을 통해 구현함.&lt;/p&gt;
&lt;h4 data-path-to-node=&quot;29&quot; data-ke-size=&quot;size20&quot;&gt;1. 공통 상위 클래스 정의&lt;/h4&gt;
&lt;div data-ved=&quot;0CAAQhtANahgKEwi4q-2ioOeUAxUAAAAAHQAAAAAQngc&quot; data-hveid=&quot;0&quot;&gt;
&lt;div&gt;&lt;br /&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;pre class=&quot;arduino&quot;&gt;&lt;code&gt;//   공통 부모 클래스
class Friend {
    protected String name; // 자식 클래스에서 직접 접근할 수 있도록 protected 배치
    protected String phone;

    public Friend(String name, String phone) {
        this.name = name;
        this.phone = phone;
    }

    public void showInfo() {
        System.out.println(&quot;이름: &quot; + name);
        System.out.println(&quot;전화: &quot; + phone);
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;h4 data-path-to-node=&quot;31&quot; data-ke-size=&quot;size20&quot;&gt;2. 두 개의 자식 클래스 대상 정의 및 상속 구현 코드&lt;/h4&gt;
&lt;div data-ved=&quot;0CAAQhtANahgKEwi4q-2ioOeUAxUAAAAAHQAAAAAQnwc&quot; data-hveid=&quot;0&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;pre class=&quot;scala&quot;&gt;&lt;code&gt;//   관리 대상 1: 대학교 동창 클래스
class UnivFriend extends Friend {
    private String major; // 동창만의 고유 특성 (전공)

    public UnivFriend(String name, String phone, String major) {
        super(name, phone); //   super()를 통해 부모 생성자에 이름과 전화번호 재료 전달
        this.major = major;
    }

    @Override
    public void showInfo() {
        super.showInfo(); //   super 키워드로 부모의 출력 기능 먼저 가동
        System.out.println(&quot;전공: &quot; + major);
    }
}

//   관리 대상 2: 직장 동료 클래스
class CompanyFriend extends Friend {
    private String department; // 직장 동료만의 고유 특성 (부서)

    public CompanyFriend(String name, String phone, String department) {
        super(name, phone); // 부모 생성자 호출
        this.department = department;
    }

    @Override
    public void showInfo() {
        super.showInfo(); // 부모의 공통 정보 출력 활용
        System.out.println(&quot;부서: &quot; + department);
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4 data-path-to-node=&quot;33&quot; data-ke-size=&quot;size20&quot;&gt;3. 메인 실행 및 제어 코드&lt;/h4&gt;
&lt;div data-ved=&quot;0CAAQhtANahgKEwi4q-2ioOeUAxUAAAAAHQAAAAAQoAc&quot; data-hveid=&quot;0&quot;&gt;
&lt;div&gt;&lt;br /&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;pre class=&quot;arduino&quot;&gt;&lt;code&gt;public class Main {
    public static void main(String[] args) {
        // 동창 객체와 직장 동료 객체 각각 생성 (Heap 메모리에 부모 공간과 함께 배치됨)
        UnivFriend uFriend = new UnivFriend(&quot;홍길동&quot;, &quot;010-1111-2222&quot;, &quot;컴퓨터공학&quot;);
        CompanyFriend cFriend = new CompanyFriend(&quot;이순신&quot;, &quot;010-3333-4444&quot;, &quot;개발팀&quot;);

        System.out.println(&quot;--- 동창 정보 출력 ---&quot;);
        uFriend.showInfo();

        System.out.println(&quot;\n--- 직장 동료 정보 출력 ---&quot;);
        cFriend.showInfo();
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-path-to-node=&quot;2&quot; data-ke-size=&quot;size23&quot;&gt;◆ 1. static 자원도 상속이 되는가?&lt;/h3&gt;
&lt;p data-path-to-node=&quot;3&quot; data-ke-size=&quot;size16&quot;&gt;결론부터 말하면, &lt;b data-index-in-node=&quot;10&quot; data-path-to-node=&quot;3&quot;&gt;static 변수와 static 메서드도 자식 클래스에게 상속됨.&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;4&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;4,0,0&quot;&gt;원리:&lt;/b&gt; 부모 클래스에 static으로 선언된 자원은 자식 클래스 이름을 통해서도 그대로 접근하고 사용할 수 있음.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;4,1,0&quot;&gt;코드 예시:&lt;/b&gt;&lt;/li&gt;
&lt;li data-ved=&quot;0CAAQhtANahgKEwi4q-2ioOeUAxUAAAAAHQAAAAAQtgc&quot; data-hveid=&quot;0&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&lt;span&gt;Java&lt;/span&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;pre class=&quot;arduino&quot;&gt;&lt;code&gt;class Parent {
    static int sharedVal = 100;
    static void staticMethod() {
        System.out.println(&quot;부모의 스태틱 메서드&quot;);
    }
}

class Child extends Parent {
    // 아무것도 적지 않아도 부모의 static 자원을 물려받음
}

public class Main {
    public static void main(String[] args) {
        //   자식 클래스 이름을 통해 부모의 static 자원에 접근 가능
        System.out.println(Child.sharedVal); // 출력: 100
        Child.staticMethod();                // 출력: 부모의 스태틱 메서드
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-path-to-node=&quot;6&quot; data-ke-size=&quot;size23&quot;&gt;◆ 2. 메모리 아키텍처로 보는 상속의 진실: &quot;공유&quot;&lt;/h3&gt;
&lt;p data-path-to-node=&quot;7&quot; data-ke-size=&quot;size16&quot;&gt;상속이라고 하면 부모의 공간을 자식이 복사해서 소유하는 것처럼 느껴지지만, static은 완전히 다르게 작동함.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;8&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;8,0,0&quot;&gt;인스턴스 변수 상속:&lt;/b&gt; 자식 객체를 new로 생성할 때마다 힙(Heap) 영역에 부모의 변수 공간과 자식의 변수 공간이 각각 새롭게 파짐.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;8,1,0&quot;&gt;static 자수 상속:&lt;/b&gt; static 변수는 인스턴스(객체)에 속하지 않고 오직 &lt;b data-index-in-node=&quot;45&quot; data-path-to-node=&quot;8,1,0&quot;&gt;Static(Method) 영역&lt;/b&gt;에 단 한 개만 생성됨. 자식 클래스가 이를 상속받는다는 것은, 새로운 상자가 생기는 것이 아니라 &lt;b data-index-in-node=&quot;117&quot; data-path-to-node=&quot;8,1,0&quot;&gt;Static 영역에 존재하는 하나의 똑같은 상자를 부모와 자식이 '공유'하는 구조&lt;/b&gt;임.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;8,2,0&quot;&gt;코드 증명 예시:&lt;/b&gt;&lt;/li&gt;
&lt;li data-ved=&quot;0CAAQhtANahgKEwi4q-2ioOeUAxUAAAAAHQAAAAAQtwc&quot; data-hveid=&quot;0&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&lt;span&gt;Java&lt;/span&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;pre class=&quot;reasonml&quot;&gt;&lt;code&gt;Child.sharedVal = 500; // 자식 쪽에서 static 변수 값을 바꿈
System.out.println(Parent.sharedVal); //   출력: 500 (부모 쪽 값도 바뀜, 결국 같은 상자이기 때문)
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-path-to-node=&quot;10&quot; data-ke-size=&quot;size23&quot;&gt;◆ 3. ⚠️ static 메서드는 오버라이딩(Overriding)이 불가능하다&lt;/h3&gt;
&lt;p data-path-to-node=&quot;11&quot; data-ke-size=&quot;size16&quot;&gt;인스턴스 메서드는 부모의 것을 자식이 재정의(Overriding)하여 다형성을 구현할 수 있음. 하지만 &lt;b data-index-in-node=&quot;58&quot; data-path-to-node=&quot;11&quot;&gt;static 메서드는 오버라이딩 규칙이 적용되지 않음.&lt;/b&gt;&lt;/p&gt;
&lt;p data-path-to-node=&quot;12&quot; data-ke-size=&quot;size16&quot;&gt;자식 클래스에서 부모의 static 메서드와 완전히 똑같은 이름과 형태로 메서드를 다시 정의하면, 오버라이딩된 것이 아니라 &lt;b data-index-in-node=&quot;69&quot; data-path-to-node=&quot;12&quot;&gt;'메서드 숨김(Method Hiding)'&lt;/b&gt; 현상이 발생함.&lt;/p&gt;
&lt;h4 data-path-to-node=&quot;13&quot; data-ke-size=&quot;size20&quot;&gt;❌ 잘못된 오버라이딩 이해와 '메서드 숨김' 예시&lt;/h4&gt;
&lt;div data-ved=&quot;0CAAQhtANahgKEwi4q-2ioOeUAxUAAAAAHQAAAAAQuAc&quot; data-hveid=&quot;0&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&lt;span&gt;Java&lt;/span&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;pre class=&quot;arduino&quot;&gt;&lt;code&gt;class SuperClass {
    static void print() {
        System.out.println(&quot;부모 스태틱&quot;);
    }
}

class SubClass extends SuperClass {
    // @Override ❌ 에러 발생: 스태틱 메서드에는 오버라이딩 마크를 붙일 수 없음
    static void print() {
        System.out.println(&quot;자식 스태틱&quot;); // 부모 메서드를 가려버림(Hiding)
    }
}

public class Main {
    public static void main(String[] args) {
        SuperClass sub = new SubClass(); // 다형성 구조로 객체 생성
        sub.print(); //   출력 결과: &quot;부모 스태틱&quot;
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;15&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;15,0,0&quot;&gt;이유 (컴파일 타임 바인딩):&lt;/b&gt; 일반 인스턴스 메서드는 프로그램 실행 도중(Runtime)에 진짜 힙에 있는 객체가 무엇인지 확인하고 메서드를 찾아감. 반면, static 메서드는 실행되기도 전인 &lt;b data-index-in-node=&quot;109&quot; data-path-to-node=&quot;15,0,0&quot;&gt;컴파일 시점&lt;/b&gt;에 참조 변수의 '타입'만 보고 실행할 메서드를 미리 결정해 버림. 위 코드에서 sub 변수의 타입이 SuperClass이기 때문에 실제 알맹이가 SubClass일지라도 부모의 메서드를 실행해 버리는 것임.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-path-to-node=&quot;17&quot; data-ke-size=&quot;size23&quot;&gt;◆ 최종 요약&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;18&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;부모의 static 변수와 메서드는 자식에게 &lt;b data-index-in-node=&quot;25&quot; data-path-to-node=&quot;18,0,0&quot;&gt;상속&lt;/b&gt;되어 자식 이름으로 사용 가능함.&lt;/li&gt;
&lt;li&gt;물리적으로 복사되는 것이 아니라 &lt;b data-index-in-node=&quot;18&quot; data-path-to-node=&quot;18,1,0&quot;&gt;Static 영역의 단 하나의 자원을 부모와 자식이 공유&lt;/b&gt;하는 메커니즘임.&lt;/li&gt;
&lt;li&gt;static 메서드는 실행 시점이 아닌 컴파일 시점에 결합하므로 &lt;b data-index-in-node=&quot;36&quot; data-path-to-node=&quot;18,2,0&quot;&gt;오버라이딩(다형성)이 불가능&lt;/b&gt;하며, 똑같이 만들 경우 단순히 부모의 메서드를 가리는 '메서드 숨김(Hiding)'이 일어남.&lt;/li&gt;
&lt;/ul&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;스크린샷 2026-06-02 160720.png&quot; data-origin-width=&quot;923&quot; data-origin-height=&quot;575&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/XXW36/dJMcac4nfmL/NqHfR39ROexsAaklePqr5k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/XXW36/dJMcac4nfmL/NqHfR39ROexsAaklePqr5k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/XXW36/dJMcac4nfmL/NqHfR39ROexsAaklePqr5k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FXXW36%2FdJMcac4nfmL%2FNqHfR39ROexsAaklePqr5k%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;923&quot; height=&quot;575&quot; data-filename=&quot;스크린샷 2026-06-02 160720.png&quot; data-origin-width=&quot;923&quot; data-origin-height=&quot;575&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-path-to-node=&quot;2&quot; data-ke-size=&quot;size23&quot;&gt;◆ 프로그램 오류 (Error)의 종류&lt;/h3&gt;
&lt;p data-path-to-node=&quot;3&quot; data-ke-size=&quot;size16&quot;&gt;컴퓨터 프로그램이 실행되는 과정에서 발생하는 오류는 발생 시점과 성격에 따라 3가지로 분류됨.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;4&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;4,0,0&quot;&gt;컴파일 오류 (Compile-time Error):&lt;/b&gt; 소스 코드의 문법이 틀려 자바 컴파일러(javac)가 실행 파일(.class)을 만들지 못하고 빨간 줄을 띄우는 오류임. 가장 안전하고 발견하기 쉬움.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;4,1,0&quot;&gt;논리적 오류 (Logical Error):&lt;/b&gt; 컴파일도 잘 되고 프로그램도 멈추지 않고 실행되지만, 개발자의 계산 실수 등으로 인해 원하는 결과가 나오지 않는 오류임 (예: 덧셈 연산에 뺄셈 기호를 넣음).&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;4,2,0&quot;&gt;런타임 오류 (Runtime Error):&lt;/b&gt; 컴파일은 완벽히 끝났으나, 프로그램이 &lt;b data-index-in-node=&quot;45&quot; data-path-to-node=&quot;4,2,0&quot;&gt;실행되는 도중(Runtime)&lt;/b&gt; 예측하지 못한 상황을 만나 강제로 고장 나는 오류임. 예외 처리는 바로 이 런타임 오류를 방지하기 위해 사용함.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-path-to-node=&quot;6&quot; data-ke-size=&quot;size23&quot;&gt;◆ 오류 종료와 해결 방법&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;7&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;7,0,0&quot;&gt;오류 종료 (Abnormal Termination):&lt;/b&gt; 런타임 오류가 발생하면 자바 가상 머신(JVM)은 즉시 구동을 중단하고 에러 메시지를 쏟아내며 프로그램을 강제 종료시킴. 웹 서버나 금융 프로그램의 경우 시스템 전체가 마비되는 치명적인 결과를 초래함.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;7,1,0&quot;&gt;해결 방법 (예외 처리 - Exception Handling):&lt;/b&gt; 프로그램이 급작스럽게 죽는 것을 막고, 오류가 발생했을 때 우회 도로를 개설하여 프로그램을 끝까지 정상 실행시키도록 제어하는 메커니즘임. 자바에서는 &lt;b data-index-in-node=&quot;119&quot; data-path-to-node=&quot;7,1,0&quot;&gt;try - catch - finally&lt;/b&gt; 블록을 아키텍처로 사용함.
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;try {
    //   예외가 발생할 가능성이 있는 위험한 코드 배치
    int result = 10 / 0; 
} catch (ArithmeticException e) {
    //   예외가 발생했을 때 실행할 수습용 우회 코드 배치
    System.out.println(&quot;0으로 나눌 수 없습니다. 기본값으로 대체합니다.&quot;);
} finally {
    //   예외 발생 여부와 상관없이 무조건 마지막에 실행되어야 하는 정리 코드 (자원 해제 등)
}
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-path-to-node=&quot;9&quot; data-ke-size=&quot;size23&quot;&gt;◆ 예외 클래스의 계층 구조&lt;/h3&gt;
&lt;p data-path-to-node=&quot;10&quot; data-ke-size=&quot;size16&quot;&gt;자바는 프로그램 실행 중 발생할 수 있는 모든 오류 상황을 '객체'로 만들어서 관리함. 따라서 오류도 부모-자식 상속 구조를 가짐.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;11&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;11,0,0&quot;&gt;Throwable :&lt;/b&gt; 자바에서 오류로 던져질 수 있는 모든 클래스의 최상위 조상임.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;11,1,0&quot;&gt;Error 후손:&lt;/b&gt; 시스템 메모리 부족(OutOfMemoryError)이나 하드웨어 고장 등 프로그램 코드로 수습할 수 없는 심각한 구조적 오류임. 개발자가 코드로 잡을 수 없음.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;11,2,0&quot;&gt;Exception 후손:&lt;/b&gt; 개발자가 발생을 예측하고 코드를 통해 정상 상태로 수습할 수 있는 가벼운 오류임. 예외 처리의 직접적인 대상임.
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;11,2,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;11,2,1,0,0&quot;&gt;Checked Exception:&lt;/b&gt; RuntimeException을 상속받지 않은 예외들. 컴파일러가 예외 처리를 무조건 명시하라고 강제함. 안 적으면 컴파일(빨간 줄) 자체가 안 됨 (예: IOException, SQLException).&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;11,2,1,1,0&quot;&gt;Unchecked Exception:&lt;/b&gt; RuntimeException과 그 자식들. 컴파일러가 강제하지 않아 개발자의 주의력에 의존함.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-path-to-node=&quot;13&quot; data-ke-size=&quot;size23&quot;&gt;◆ RuntimeException (Unchecked Exception)&lt;/h3&gt;
&lt;p data-path-to-node=&quot;14&quot; data-ke-size=&quot;size16&quot;&gt;예외 계층 구조 중 가장 독특하고 빈번하게 만나는 영역임.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;15&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;15,0,0&quot;&gt;특징:&lt;/b&gt; 주로 개발자의 논리적 오류나 코딩 실수(주의 부족)로 인해 발생하는 예외들을 모아놓은 클래스임.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;15,1,0&quot;&gt;매커니즘:&lt;/b&gt; 컴파일러가 수습 코드를 적었는지 감시하지 않기 때문에(try-catch를 안 써도 컴파일은 통과됨) 프로그램 실행 전까지 오류를 인지하기 어려움. 철저한 코드 검증과 예외 처리가 동반되어야 함.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;15,2,0&quot;&gt;대표적인 자식 클래스들:&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;15,2,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;NullPointerException : 객체 주소록이 비어있는 상태(null)인데 그 안의 변수나 메서드를 참조하려고 접근할 때 발생함.&lt;/li&gt;
&lt;li&gt;ArrayIndexOutOfBoundsException : 배열의 크기가 5인데 6번 인덱스 칸을 열어달라고 요청할 때 발생함.&lt;/li&gt;
&lt;li&gt;ArithmeticException : 정수를 0으로 나누는 등 수학적으로 불가능한 연산을 명령할 때 발생함.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-path-to-node=&quot;17&quot; data-ke-size=&quot;size23&quot;&gt;◆ Java API Document 확인하는 예시&lt;/h3&gt;
&lt;p data-path-to-node=&quot;18&quot; data-ke-size=&quot;size16&quot;&gt;내가 쓰려는 자바 표준 메서드가 어떤 예외를 던지는지 알고 싶을 때 공식 API 문서를 확인하는 방법임. (주로 오라클 공식 사이트의 자바 API 문서를 기준함)&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;19&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;19,0,0&quot;&gt;상황:&lt;/b&gt; 문자열을 정수로 바꿔주는 Integer.parseInt(String s) 메서드를 사용하려는 경우.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;19,1,0&quot;&gt;확인 순서:&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;19,1,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: none;&quot;&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-path-to-node=&quot;19,1,1,0,0&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;문서 검색창에 Integer 클래스를 찾고, 메서드 리스트 중 parseInt(String s) 명세서를 찾음.&lt;/li&gt;
&lt;/ol&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-path-to-node=&quot;19,1,1,1,0&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;메서드 선언부 하단의 &lt;b data-index-in-node=&quot;12&quot; data-path-to-node=&quot;19,1,1,1,0,0,0&quot;&gt;&quot;Throws&quot;&lt;/b&gt; 항목을 정밀 확인해야 함.&lt;/li&gt;
&lt;/ol&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-path-to-node=&quot;19,1,1,2,0&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;문서를 보면 &lt;b data-index-in-node=&quot;7&quot; data-path-to-node=&quot;19,1,1,2,0,0,0&quot;&gt;Throws: NumberFormatException&lt;/b&gt; 이라고 명시되어 있음. 그 옆의 설명을 읽어보면 *&quot;문자열이 정수로 변환될 수 있는 형태가 아닐 때 발생한다&quot;*고 적혀 있음.&lt;/li&gt;
&lt;/ol&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-path-to-node=&quot;19,1,1,3,0&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;19,1,1,3,0,0,0&quot;&gt;결과 매핑:&lt;/b&gt; 개발자는 이 명세를 보고 아래와 같이 방어 코드를 아키텍처에 미리 심어둘 수 있음.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div data-ved=&quot;0CAAQhtANahgKEwi4q-2ioOeUAxUAAAAAHQAAAAAQzQc&quot; data-hveid=&quot;0&quot;&gt;
&lt;div&gt;&lt;br /&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;pre class=&quot;reasonml&quot;&gt;&lt;code&gt;String input = &quot;123abc&quot;; // 숫자가 아닌 문자가 섞임

try {
    int num = Integer.parseInt(input); //   Throws 명세에 적힌대로 NumberFormatException 발생함
} catch (NumberFormatException e) {
    System.out.println(&quot;숫자 포맷이 잘못되어 기본값 0으로 초기화합니다.&quot;);
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-path-to-node=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;자바(Java)에서 예외를 수습하는 핵심 도구인 &lt;b data-index-in-node=&quot;27&quot; data-path-to-node=&quot;0&quot;&gt;try - catch&lt;/b&gt; 문에 대한 구동 원리와 매커니즘 중심의 정리임.&lt;/p&gt;
&lt;h3 data-path-to-node=&quot;2&quot; data-ke-size=&quot;size23&quot;&gt;◆ try - catch 문의 정의와 기능&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;3&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;3,0,0&quot;&gt;정의:&lt;/b&gt; 프로그램 실행 중 발생할 수 있는 런타임 예외(오류)를 가로채서, 프로그램이 비정상적으로 죽지 않도록 방어막을 치는 제어문임.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;3,1,0&quot;&gt;기능:&lt;/b&gt; 예외가 발생했을 때 프로그램의 강제 종료를 막고, 개발자가 미리 준비한 우회 도로(대비책)를 따라 정상적인 실행 흐름을 유지시킵니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-path-to-node=&quot;5&quot; data-ke-size=&quot;size23&quot;&gt;◆ try - catch 기본 구조 및 매커니즘&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;6&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;6,0,0&quot;&gt;try 블록:&lt;/b&gt; 예외(오류)가 발생할 가능성이 있는 위험한 코드를 모아두는 공간임.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;6,1,0&quot;&gt;catch 블록:&lt;/b&gt; try 블록 안에서 진짜로 예외가 터졌을 때만 가동되는 비상 수습 공간임. 괄호 () 안에 수습하고자 하는 예외 객체의 타입을 명시해야 함.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-path-to-node=&quot;8&quot; data-ke-size=&quot;size23&quot;&gt;◆ 예외 발생 시나리오별 구동 흐름&lt;/h3&gt;
&lt;h4 data-path-to-node=&quot;9&quot; data-ke-size=&quot;size20&quot;&gt;시나리오 ①: try 블록 내에서 예외가 발생한 경우 (비상 상황)&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;10&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: none;&quot;&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-path-to-node=&quot;10,0,0&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;try 블록을 위에서부터 한 줄씩 실행하다가 예외가 발생하는 순간, 그 즉시 실행을 중단함 (밑에 남은 코드는 무시됨).&lt;/li&gt;
&lt;/ol&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-path-to-node=&quot;10,1,0&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;발생한 예외 객체와 일치하는 타입을 가진 catch 블록이 있는지 위에서부터 차례로 검사함.&lt;/li&gt;
&lt;/ol&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-path-to-node=&quot;10,2,0&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;일치하는 catch 블록을 찾으면 그 내부 코드를 실행하여 상황을 수습함.&lt;/li&gt;
&lt;/ol&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-path-to-node=&quot;10,3,0&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;try-catch 전체 문을 빠져나가 그 다음 줄의 코드를 정상적으로 이어서 실행함.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-path-to-node=&quot;11&quot; data-ke-size=&quot;size20&quot;&gt;시나리오 ②: try 블록 내에서 예외가 발생하지 않은 경우 (평화 상황)&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;12&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: none;&quot;&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-path-to-node=&quot;12,0,0&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;try 블록 안의 모든 코드가 정상적으로 끝까지 실행됨.&lt;/li&gt;
&lt;/ol&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-path-to-node=&quot;12,1,0&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;catch 블록은 실행되지 않고 통째로 패스됨.&lt;/li&gt;
&lt;/ol&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-path-to-node=&quot;12,2,0&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;try-catch 전체 문 아래의 코드를 이어서 실행함.&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-path-to-node=&quot;14&quot; data-ke-size=&quot;size23&quot;&gt;◆ 실무 코드 예시&lt;/h3&gt;
&lt;h4 data-path-to-node=&quot;15&quot; data-ke-size=&quot;size20&quot;&gt;❌ 예외 처리를 하지 않아 프로그램이 도중에 죽는 경우&lt;/h4&gt;
&lt;div data-ved=&quot;0CAAQhtANahgKEwi4q-2ioOeUAxUAAAAAHQAAAAAQ4Qc&quot; data-hveid=&quot;0&quot;&gt;
&lt;div&gt;&lt;br /&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;pre class=&quot;arduino&quot;&gt;&lt;code&gt;public class Main {
    public static void main(String[] args) {
        System.out.println(&quot;프로그램 시작&quot;);
        
        int sVal = 10 / 0; //   런타임 에러 발생 (ArithmeticException)
        
        // 에러 발생으로 인해 아래 코드는 실행되지 못하고 강제 종료됨
        System.out.println(&quot;연산 결과: &quot; + sVal); 
        System.out.println(&quot;프로그램 정상 종료&quot;);
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;h4 data-path-to-node=&quot;17&quot; data-ke-size=&quot;size20&quot;&gt;⭕ try - catch 로 예외를 수습하여 안전하게 실행하는 경우&lt;/h4&gt;
&lt;div data-ved=&quot;0CAAQhtANahgKEwi4q-2ioOeUAxUAAAAAHQAAAAAQ4gc&quot; data-hveid=&quot;0&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&lt;span&gt;Java&lt;/span&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;pre class=&quot;arduino&quot;&gt;&lt;code&gt;public class Main {
    public static void main(String[] args) {
        System.out.println(&quot;프로그램 시작&quot;);

        try {
            System.out.println(&quot;  [try] 연산을 시도합니다.&quot;);
            int sVal = 10 / 0; //   여기서 예외 발생! 즉시 catch 블록으로 순간이동함
            
            System.out.println(&quot;[try] 이 코드는 실행되지 않습니다.&quot;); 
        } catch (ArithmeticException e) {
            //   수습 가동
            System.out.println(&quot;⚠️ [catch] 에러 발생: 0으로 나눌 수 없어 결과를 0으로 처리합니다.&quot;);
        }

        //   수습이 완료되었으므로 아래 코드가 정상 실행됨
        System.out.println(&quot;프로그램 정상 종료&quot;);
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-path-to-node=&quot;20&quot; data-ke-size=&quot;size23&quot;&gt;◆ 다중 catch 블록 활용 규칙 (상속 계층 고려)&lt;/h3&gt;
&lt;p data-path-to-node=&quot;21&quot; data-ke-size=&quot;size16&quot;&gt;하나의 try 블록 안에서 여러 종류의 예외가 발생할 수 있다면, catch 블록을 아래로 여러 개 덧붙여 다중 방어벽을 세울 수 있음.&lt;/p&gt;
&lt;p data-path-to-node=&quot;22&quot; data-ke-size=&quot;size16&quot;&gt;이때 부모-자식 상속 계층에 따라 &lt;b data-index-in-node=&quot;19&quot; data-path-to-node=&quot;22&quot;&gt;자식 예외 클래스를 무조건 상위에, 부모 예외 클래스를 하위에 배치&lt;/b&gt;해야 함.&lt;/p&gt;
&lt;div data-ved=&quot;0CAAQhtANahgKEwi4q-2ioOeUAxUAAAAAHQAAAAAQ4wc&quot; data-hveid=&quot;0&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;pre class=&quot;reasonml&quot;&gt;&lt;code&gt;try {
    int[] arr = new int[3];
    arr[5] = 100; //   ArrayIndexOutOfBoundsException 발생 가능성
    
    int num = Integer.parseInt(&quot;abc&quot;); //   NumberFormatException 발생 가능성
} catch (ArrayIndexOutOfBoundsException e) {
    System.out.println(&quot;배열 인덱스 범위를 벗어났습니다.&quot;);
} catch (NumberFormatException e) {
    System.out.println(&quot;숫자로 바꿀 수 없는 문자열입니다.&quot;);
} catch (Exception e) {
    //   모든 예외의 조상인 Exception은 맨 마지막에 배치하여
    // 위에서 걸러지지 않은 예상치 못한 모든 예외를 최종 수습하는 안전장치로 씀
    System.out.println(&quot;알 수 없는 예외가 발생했습니다.&quot;);
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-path-to-node=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;자바(Java)에서 모든 예외와 오류의 시조이자 최상위 가리키는 설계도가 바로 &lt;b data-index-in-node=&quot;44&quot; data-path-to-node=&quot;0&quot;&gt;Throwable 클래스&lt;/b&gt;임.&lt;/p&gt;
&lt;p data-path-to-node=&quot;1&quot; data-ke-size=&quot;size16&quot;&gt;자바 프로그램에서 throw 키워드를 통해 던져질 수 있는(Throwable) 모든 객체는 반드시 이 클래스를 상속받아야 메모리 아키텍처 상에서 예외 시스템으로 인식됨.&lt;/p&gt;
&lt;h3 data-path-to-node=&quot;3&quot; data-ke-size=&quot;size23&quot;&gt;◆ 1. Throwable 클래스의 계층적 위치&lt;/h3&gt;
&lt;p data-path-to-node=&quot;4&quot; data-ke-size=&quot;size16&quot;&gt;자바의 모든 객체의 조상인 Object 바로 아래에 위치하며, 자식으로 Error와 Exception 두 개의 거대한 기둥을 거느리고 있음.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;5&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;5,0,0&quot;&gt;java.lang.Object&lt;/b&gt; (최상위 객체)
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;5,0,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;└── &lt;b data-index-in-node=&quot;4&quot; data-path-to-node=&quot;5,0,1,0,0&quot;&gt;java.lang.Throwable&lt;/b&gt; (모든 예외/오류의 시조)
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;5,0,1,0,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;├── &lt;b data-index-in-node=&quot;4&quot; data-path-to-node=&quot;5,0,1,0,1,0,0&quot;&gt;java.lang.Error&lt;/b&gt; (대형 사고: 코드로 수습 불가)&lt;/li&gt;
&lt;li&gt;└── &lt;b data-index-in-node=&quot;4&quot; data-path-to-node=&quot;5,0,1,0,1,1,0&quot;&gt;java.lang.Exception&lt;/b&gt; (일반 예외: 코드로 수습 가능)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-path-to-node=&quot;7&quot; data-ke-size=&quot;size23&quot;&gt;◆ 2. 두 종류의 후손(자식) 구별 핵심&lt;/h3&gt;
&lt;p data-path-to-node=&quot;8&quot; data-ke-size=&quot;size16&quot;&gt;Throwable을 상속받은 자식들은 성격이 완전히 극단적으로 나뉨.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;9&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,0,0&quot;&gt;Error 계열:&lt;/b&gt; JVM 내부 메모리 고갈(OutOfMemoryError), 스택 공간 오버플로우(StackOverflowError) 등 시스템 단위의 치명적인 결함임. 개발자가 코드 수준에서 try-catch로 가로채서 수습할 수 없으므로 무조건 프로그램이 죽음.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,1,0&quot;&gt;Exception 계열:&lt;/b&gt; 개발자의 실수나 사용자의 잘못된 조작으로 인해 일어나는 가벼운 오류 상황임. 예측이 가능하므로 try-catch로 잡아내어 우회 도로를 개설(수습)할 수 있음.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-path-to-node=&quot;11&quot; data-ke-size=&quot;size23&quot;&gt;◆ 3. Throwable 클래스의 핵심 내장 메서드 기능&lt;/h3&gt;
&lt;p data-path-to-node=&quot;12&quot; data-ke-size=&quot;size16&quot;&gt;Throwable 클래스는 자식들에게 예외가 발생한 상세 원인과 경로를 추적할 수 있는 강력한 핵심 메서드들을 물려줌. 개발자가 예외 처리를 할 때 가장 많이 사용하는 기능들임.&lt;/p&gt;
&lt;h4 data-path-to-node=&quot;13&quot; data-ke-size=&quot;size20&quot;&gt;① getMessage() : 에러 메시지 반환&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;14&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;예외 객체 내부에 저장된 발생 원인에 대한 핵심 요약 한 줄 코멘트(문자열)를 리턴함.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;14,1,0&quot;&gt;코드 예시:&lt;/b&gt; System.out.println(e.getMessage()); ➡️ 출력: &quot;/ by zero&quot; (0으로 나누었을 때)&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-path-to-node=&quot;15&quot; data-ke-size=&quot;size20&quot;&gt;② toString() : 예외 이름과 메시지 통합 반환&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;16&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;발생한 예외 클래스의 풀 네임(패키지 경로 포함)과 에러 메시지를 결합하여 문자열로 내놓음.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;16,1,0&quot;&gt;코드 예시:&lt;/b&gt; System.out.println(e.toString()); ➡️ 출력: &quot;java.lang.ArithmeticException: / by zero&quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-path-to-node=&quot;17&quot; data-ke-size=&quot;size20&quot;&gt;③ printStackTrace() : 추적 경로 상세 출력 (가장 중요)&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;18&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;예외가 최초로 발생한 소스 코드의 위치(클래스명, 메서드명, 줄 번호)부터 시작해서, 어떤 경로를 거쳐 변수가 타고 내려왔는지 스택(Stack) 영역의 메모리 이동 행적을 화면에 빨간 글씨로 전부 쏟아냄.&lt;/li&gt;
&lt;li&gt;예외 처리를 하더라도 이 메서드를 내부에 심어두어야 개발자가 나중에 로그를 보고 버그를 잡을 수 있음.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-path-to-node=&quot;20&quot; data-ke-size=&quot;size23&quot;&gt;◆ 4. 실제 작동 및 메서드 활용 예시&lt;/h3&gt;
&lt;div data-ved=&quot;0CAAQhtANahgKEwi4q-2ioOeUAxUAAAAAHQAAAAAQjQg&quot; data-hveid=&quot;0&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&lt;span&gt;Java&lt;/span&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;pre class=&quot;reasonml&quot;&gt;&lt;code&gt;public class ThrowableExample {
    public static void main(String[] args) {
        try {
            int[] arr = new int[2];
            System.out.println(arr[5]); //   ArrayIndexOutOfBoundsException 발생
            
        } catch (Throwable t) { 
            //   다형성 아키텍처: Exception의 조상인 Throwable 타입으로도 모든 예외를 다 받아낼 수 있음
            
            System.out.println(&quot;1. getMessage 결과: &quot; + t.getMessage());
            System.out.println(&quot;-------------------------------------&quot;);
            
            System.out.println(&quot;2. toString 결과: &quot; + t.toString());
            System.out.println(&quot;-------------------------------------&quot;);
            
            System.out.println(&quot;3. printStackTrace 결과:&quot;);
            t.printStackTrace(); // 콘솔에 상세 추적 이력 출력
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;22&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;22,0,0&quot;&gt;출력 결과 데이터 매핑:&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;22,0,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;getMessage : &quot;Index 5 out of bounds for length 2&quot;&lt;/li&gt;
&lt;li&gt;toString : &quot;java.lang.ArrayIndexOutOfBoundsException: Index 5 out of bounds for length 2&quot;&lt;/li&gt;
&lt;li&gt;printStackTrace : 소스코드 몇 번째 줄에서 배열 방 번호 에러가 터졌는지 추적 경로를 로그로 출력함.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 style=&quot;text-align: center;&quot; data-path-to-node=&quot;0&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;printStackTrace&lt;/h2&gt;
&lt;h3 data-path-to-node=&quot;2&quot; data-ke-size=&quot;size23&quot;&gt;◆ 1. printStackTrace()의 핵심 기능&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;3&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;3,0,0&quot;&gt;스택 메모리 추적:&lt;/b&gt; 예외가 터지기 직전까지 가상 머신(JVM)의 &lt;b data-index-in-node=&quot;36&quot; data-path-to-node=&quot;3,0,0&quot;&gt;Stack 영역&lt;/b&gt;에 어떤 메서드들이 순서대로 쌓여서 실행되고 있었는지 그 계보를 전부 찾아내어 파일명, 메서드명, 소스 코드 줄 번호(Line Number)까지 명시함.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;3,1,0&quot;&gt;비정상 종료 없는 확인:&lt;/b&gt; try-catch문으로 예외를 가로챘기 때문에 프로그램은 정상 구동 상태를 유지하지만, 이 메서드 덕분에 내부에 어떤 심각한 버그가 있었는지 개발자가 육안으로 추적할 수 있음.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-path-to-node=&quot;5&quot; data-ke-size=&quot;size23&quot;&gt;◆ 2. 콘솔 출력 결과 해체 (로그 읽는 방법)&lt;/h3&gt;
&lt;p data-path-to-node=&quot;6&quot; data-ke-size=&quot;size16&quot;&gt;예외가 발생했을 때 printStackTrace()가 쏟아내는 빨간 글씨의 로그는 &lt;b data-index-in-node=&quot;46&quot; data-path-to-node=&quot;6&quot;&gt;가장 아래쪽 줄부터 위쪽 줄 순서대로&lt;/b&gt; 읽어 올라가야 함.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;7&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;7,0,0&quot;&gt;맨 아랫줄:&lt;/b&gt; 프로그램의 시작점(main 메서드)임.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;7,1,0&quot;&gt;중간 줄들:&lt;/b&gt; main에서 어떤 메서드를 타고 들어갔는지 이동 경로를 나타냄.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;7,2,0&quot;&gt;맨 윗줄:&lt;/b&gt; 최종적으로 예외가 발생한 진짜 원인(예외 클래스 이름 및 메시지)과 사건이 터진 &lt;b data-index-in-node=&quot;51&quot; data-path-to-node=&quot;7,2,0&quot;&gt;최종 소스 코드 위치&lt;/b&gt;임.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-path-to-node=&quot;9&quot; data-ke-size=&quot;size23&quot;&gt;◆ 3. 실무 코드 및 출력 매핑 예시&lt;/h3&gt;
&lt;p data-path-to-node=&quot;10&quot; data-ke-size=&quot;size16&quot;&gt;일부러 메서드를 3단계로 거쳐서 예외를 발생시킨 뒤 printStackTrace()가 스택 메모리를 어떻게 역추적하는지 보여주는 구조임.&lt;/p&gt;
&lt;div data-ved=&quot;0CAAQhtANahgKEwi4q-2ioOeUAxUAAAAAHQAAAAAQoQg&quot; data-hveid=&quot;0&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&lt;span&gt;Java&lt;/span&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;pre class=&quot;arduino&quot;&gt;&lt;code&gt;public class Test {
    public static void main(String[] args) {
        try {
            methodA(); //   1. main에서 methodA 호출
        } catch (ArithmeticException e) {
            System.out.println(&quot;--- printStackTrace 출력 시작 ---&quot;);
            e.printStackTrace(); //   예외 추적 가동
            System.out.println(&quot;--- printStackTrace 출력 끝 ---&quot;);
        }
        System.out.println(&quot;프로그램은 죽지 않고 끝까지 실행됨&quot;);
    }

    public static void methodA() {
        methodB(); //   2. methodA에서 methodB 호출
    }

    public static void methodB() {
        int crash = 10 / 0; //   3. 여기서 최종 ArithmeticException 발생!
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4 data-path-to-node=&quot;12&quot; data-ke-size=&quot;size20&quot;&gt;  실제 콘솔 출력 결과 데이터:&lt;/h4&gt;
&lt;div data-ved=&quot;0CAAQhtANahgKEwi4q-2ioOeUAxUAAAAAHQAAAAAQogg&quot; data-hveid=&quot;0&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&lt;span&gt;Plaintext&lt;/span&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;pre class=&quot;reasonml&quot;&gt;&lt;code&gt;--- printStackTrace 출력 시작 ---
java.lang.ArithmeticException: / by zero
	at Test.methodB(Test.java:19)
	at Test.methodA(Test.java:15)
	at Test.main(Test.java:5)
--- printStackTrace 출력 끝 ---
프로그램은 죽지 않고 끝까지 실행됨
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;14&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;14,0,0&quot;&gt;추적 경로 해독:&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;14,0,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: none;&quot;&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-path-to-node=&quot;14,0,1,0,0&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;at Test.main(Test.java:5) ➡️ 5번째 줄에서 methodA()를 불렀음.&lt;/li&gt;
&lt;/ol&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-path-to-node=&quot;14,0,1,1,0&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;at Test.methodA(Test.java:15) ➡️ 15번째 줄에서 methodB()를 불렀음.&lt;/li&gt;
&lt;/ol&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-path-to-node=&quot;14,0,1,2,0&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;at Test.methodB(Test.java:19) ➡️ 19번째 줄에서 0으로 나누는 대형 사고가 터짐.&lt;/li&gt;
&lt;/ol&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-path-to-node=&quot;14,0,1,3,0&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;java.lang.ArithmeticException: / by zero ➡️ 사고 원인은 수학적 연산 오류임.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-path-to-node=&quot;16&quot; data-ke-size=&quot;size23&quot;&gt;◆ 4. 실무 운영 환경에서의 주의 사항 (보안 및 성능)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;17&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;17,0,0&quot;&gt;보안 취약점 발생:&lt;/b&gt; printStackTrace()는 소스 코드의 패키지 구조, 클래스명, 메서드명을 가감 없이 노출함. 만약 실제 서비스 중인 웹사이트 시스템 화면에 이 정보가 그대로 노출되면 해커에게 아키텍처 설계도를 넘겨주는 꼴이 되어 보안상 매우 위험함.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;17,1,0&quot;&gt;성능 저하:&lt;/b&gt; 이 메서드는 힙과 스택의 메모리 추적을 위해 시스템 자원을 생각보다 많이 소모함. 대규모 사용자가 몰리는 서버에서 남발하면 성능을 갉아먹음.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;17,2,0&quot;&gt;해결책:&lt;/b&gt; 현업 실무에서는 개발 중에만 콘솔로 확인하고, 실제 배포할 때는 콘솔 출력을 금지하며, Logback이나 log4j 같은 전문 &lt;b data-index-in-node=&quot;76&quot; data-path-to-node=&quot;17,2,0&quot;&gt;로깅 라이브러리&lt;/b&gt;를 결합하여 안전한 파일 시스템 형태로 에러 로그를 기록 관리함.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-path-to-node=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;자바(Java)에서 부모 클래스의 메서드를 자식 클래스에서 재정의하는 오버라이딩(Overriding)을 진행할 때, 메서드가 던지는 예외(Exception)에는 상속 관계에 따른 엄격한 아키텍처 규칙이 존재함.&lt;/p&gt;
&lt;p data-path-to-node=&quot;1&quot; data-ke-size=&quot;size16&quot;&gt;자바 컴파일러는 다형성 구현 시 안정성을 보장하기 위해 이 규칙을 강제함. 핵심 규칙과 메커니즘을 팩트 위주로 해체함.&lt;/p&gt;
&lt;h3 data-path-to-node=&quot;3&quot; data-ke-size=&quot;size23&quot;&gt;◆&amp;nbsp; 예외 오버라이딩의 대원칙: &quot;확장 불가, 축소 가능&quot;&lt;/h3&gt;
&lt;p data-path-to-node=&quot;4&quot; data-ke-size=&quot;size16&quot;&gt;자식 클래스에서 메서드를 오버라이딩할 때, 부모 메서드가 던지던 예외보다 &lt;b data-index-in-node=&quot;41&quot; data-path-to-node=&quot;4&quot;&gt;더 크거나(상위 클래스) 더 많은 종류의 Checked 예외를 던질 수 없음.&lt;/b&gt; 즉, 예외의 범위를 좁히거나 아예 던지지 않는 방향(축소)으로만 오버라이딩이 허용됨.&lt;/p&gt;
&lt;h4 data-path-to-node=&quot;5&quot; data-ke-size=&quot;size20&quot;&gt;⚠️ 준수해야 하는 3대 예외 규칙&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-path-to-node=&quot;6&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;6,0,0&quot;&gt;더 상위의 예외 선언 불가:&lt;/b&gt; 부모 메서드가 IOException을 던진다면, 자식 메서드는 그 조상인 Exception이나 Throwable을 던질 수 없음.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;6,1,0&quot;&gt;새로운 Checked 예외 추가 불가:&lt;/b&gt; 부모가 선언하지 않은 완전히 새로운 Checked 예외(예: SQLException)를 마음대로 추가할 수 없음.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;6,2,0&quot;&gt;자식 예외 선언은 가능 (축소):&lt;/b&gt; 부모 메서드가 Exception을 던진다면, 자식 메서드는 그 자식 클래스인 IOException이나 NullPointerException으로 좁혀서 던지는 것이 가능함. 또한 예외를 아예 던지지 않도록 수정하는 것도 허용됨.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 data-path-to-node=&quot;8&quot; data-ke-size=&quot;size23&quot;&gt;◆ 에러가 발생하는 잘못된 오버라이딩 예시&lt;/h3&gt;
&lt;div data-ved=&quot;0CAAQhtANahgKEwi4q-2ioOeUAxUAAAAAHQAAAAAQuQg&quot; data-hveid=&quot;0&quot;&gt;
&lt;div&gt;&lt;br /&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;pre class=&quot;scala&quot;&gt;&lt;code&gt;import java.io.IOException;
import java.sql.SQLException;

class Parent {
    //   부모 메서드는 IOException(Checked Exception)을 던지도록 설계됨
    public void process() throws IOException {
        System.out.println(&quot;부모 처리&quot;);
    }
}

class Child extends Parent {
    // ❌ 컴파일 에러 발생: 부모보다 더 광범위한 상위 예외(Exception)를 던질 수 없음
    @Override
    public void process() throws Exception { 
        System.out.println(&quot;자식 처리&quot;);
    }
}

class Child2 extends Parent {
    // ❌ 컴파일 에러 발생: 부모 설계도에 없던 새로운 Checked 예외(SQLException)를 추가할 수 없음
    @Override
    public void process() throws SQLException { 
        System.out.println(&quot;자식 처리 2&quot;);
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;h3 data-path-to-node=&quot;11&quot; data-ke-size=&quot;size23&quot;&gt;◆ 정상적으로 작동하는 올바른 오버라이딩 예시&lt;/h3&gt;
&lt;div data-ved=&quot;0CAAQhtANahgKEwi4q-2ioOeUAxUAAAAAHQAAAAAQugg&quot; data-hveid=&quot;0&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;pre class=&quot;scala&quot;&gt;&lt;code&gt;import java.io.FileNotFoundException;
import java.io.IOException;

class Parent {
    public void process() throws IOException {
        System.out.println(&quot;부모 처리&quot;);
    }
}

class ChildGood1 extends Parent {
    // ⭕ 가능: 부모가 선언한 IOException의 하위(자식) 예외인 FileNotFoundException으로 범위를 좁힘
    @Override
    public void process() throws FileNotFoundException {
        System.out.println(&quot;자식 처리 1&quot;);
    }
}

class ChildGood2 extends Parent {
    // ⭕ 가능: 자식 메서드 내부에서 예외를 완벽히 수습하여 외부로 아예 안 던지도록 축소함
    @Override
    public void process() {
        System.out.println(&quot;자식 처리 2&quot;);
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-path-to-node=&quot;14&quot; data-ke-size=&quot;size23&quot;&gt;◆이러한 제약 규칙이 존재하는 이유: 다형성 보장&lt;/h3&gt;
&lt;p data-path-to-node=&quot;15&quot; data-ke-size=&quot;size16&quot;&gt;자바 컴파일러가 왜 자식의 예외 확장을 막는지 다형성 호출 구조 관점에서 해체해야 함.&lt;/p&gt;
&lt;div data-ved=&quot;0CAAQhtANahgKEwi4q-2ioOeUAxUAAAAAHQAAAAAQuwg&quot; data-hveid=&quot;0&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&lt;span&gt;Java&lt;/span&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;pre class=&quot;arduino&quot;&gt;&lt;code&gt;public class Main {
    public static void main(String[] args) {
        //   다형성: 부모 타입 리모컨(Parent)으로 자식 객체(Child)를 조종함
        Parent obj = new Child(); 
        
        try {
            obj.process(); //   컴파일러는 리모컨 타입인 'Parent.process()'의 명세만 보고 코드를 검사함
        } catch (IOException e) {
            // 개발자는 부모 명세에 적힌 IOException만 잡도록 대비책(catch)을 세워둠
            System.out.println(&quot;부모가 선언한 예외 수습 완료&quot;);
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;17&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;17,0,0&quot;&gt;메커니즘 비틀기:&lt;/b&gt; 만약 자식 클래스인 Child가 오버라이딩을 하면서 부모 몰래 SQLException이라는 완전히 새로운 예외를 던지도록 허용해 버렸다면 어떻게 될까?&lt;/li&gt;
&lt;li&gt;실제 프로그램 실행 시 obj.process() 구동 도중 SQLException이 터져 흘러나오게 됨. 하지만 상위 main 메서드에는 오직 IOException만 잡는 방어막(catch)만 쳐져 있기 때문에, 이 예외를 가로채지 못하고 프로그램이 그 자리에서 &lt;b data-index-in-node=&quot;147&quot; data-path-to-node=&quot;17,1,0&quot;&gt;강제 오류 종료&lt;/b&gt;되는 치명적인 구멍이 생김.&lt;/li&gt;
&lt;li&gt;자바 컴파일러는 이러한 다형성 구동 시의 런타임 붕괴를 원천 차단하기 위해, 오버라이딩 시 부모가 선언한 예외의 울타리를 자식이 절대 넘어가지 못하도록 규제하는 것임.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-path-to-node=&quot;19&quot; data-ke-size=&quot;size23&quot;&gt;◆ 예외 규칙의 유일한 예외: RuntimeException&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;20&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;20,0,0&quot;&gt;Unchecked Exception(RuntimeException 계열)은 이 오버라이딩 제약 규칙에서 완전히 자유로움.&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;자식 클래스에서 오버라이딩할 때 부모 메서드가 선언하지 않은 NullPointerException이나 ArrayIndexOutOfBoundsException 같은 예외는 제한 없이 얼마든지 던지도록 추가할 수 있음.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;20,2,0&quot;&gt;이유:&lt;/b&gt; Unchecked 예외는 애초에 컴파일러가 try-catch 선언을 강제 감시하지 않는 영역이기 때문에 규칙 매핑 자체에서 제외하기 때문임.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-02 161550.png&quot; data-origin-width=&quot;875&quot; data-origin-height=&quot;584&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cum5Kw/dJMb990WpUk/Pa1ExKZW4IgwZGdNStBgpk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cum5Kw/dJMb990WpUk/Pa1ExKZW4IgwZGdNStBgpk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cum5Kw/dJMb990WpUk/Pa1ExKZW4IgwZGdNStBgpk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcum5Kw%2FdJMb990WpUk%2FPa1ExKZW4IgwZGdNStBgpk%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;875&quot; height=&quot;584&quot; data-filename=&quot;스크린샷 2026-06-02 161550.png&quot; data-origin-width=&quot;875&quot; data-origin-height=&quot;584&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-path-to-node=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;데이터 이동 핵심 메커니즘인 입출력(I/O - Input/Output)과 &lt;b data-index-in-node=&quot;51&quot; data-path-to-node=&quot;0&quot;&gt;스트림(Stream)&lt;/b&gt; 아키텍처를 팩트 기반으로 해체하여 정리함.&lt;/p&gt;
&lt;h3 data-path-to-node=&quot;2&quot; data-ke-size=&quot;size23&quot;&gt;◆&amp;nbsp; 입출력(I/O)의 정의와 기능&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;3&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;3,0,0&quot;&gt;정의:&lt;/b&gt; 컴퓨터 내부 프로그램과 외부 장치(파일, 키보드, 모니터, 네트워크, 메모리 등) 간에 데이터를 주고받는 일련의 행위를 의미함.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;3,1,0&quot;&gt;기능:&lt;/b&gt; * &lt;b data-index-in-node=&quot;6&quot; data-path-to-node=&quot;3,1,0&quot;&gt;Input (입력):&lt;/b&gt; 외부 장치에 존재하는 데이터를 프로그램 메모리 안으로 읽어 들이는 기능 (Read 연산)
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;3,1,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;3,1,1,0,0&quot;&gt;Output (출력):&lt;/b&gt; 프로그램이 메모리상에서 연산한 데이터 결과물을 외부 장치로 내보내어 저장하거나 표시하는 기능 (Write 연산)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-path-to-node=&quot;5&quot; data-ke-size=&quot;size23&quot;&gt;◆ 스트림(Stream)의 정의 및 핵심 개념&lt;/h3&gt;
&lt;p data-path-to-node=&quot;6&quot; data-ke-size=&quot;size16&quot;&gt;자바의 I/O는 스트림(Stream)이라는 모델을 통해 물리적인 장치 종류와 상관없이 동일한 방식으로 데이터를 제어함.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;7&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;7,0,0&quot;&gt;스트림의 정의:&lt;/b&gt; 데이터가 이동하는 &lt;b data-index-in-node=&quot;19&quot; data-path-to-node=&quot;7,0,0&quot;&gt;'단방향 통로'&lt;/b&gt; 또는 '흐르는 물줄기'를 뜻함.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;7,1,0&quot;&gt;단방향성의 원칙:&lt;/b&gt; 하나의 통로(스트림)로는 한 가지 방향으로만 데이터가 흐를 수 있음. 즉, 입력과 출력을 동시에 처리할 수 없으므로 입력용 통로와 출력용 통로를 각각 별도로 개설해야 함.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;7,2,0&quot;&gt;FIFO (First-In-First-Out):&lt;/b&gt; 통로에 먼저 들어간 데이터가 반대쪽 끝으로 먼저 나오는 선입선출 구조를 따름.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-path-to-node=&quot;9&quot; data-ke-size=&quot;size23&quot;&gt;◆ 스트림(Stream)의 3대 분류 기준&lt;/h3&gt;
&lt;p data-path-to-node=&quot;10&quot; data-ke-size=&quot;size16&quot;&gt;자바는 효율적인 자원 제어를 위해 스트림을 세 가지 기준(방향, 데이터 형태, 기능)에 따라 명확하게 분류함.&lt;/p&gt;
&lt;h4 data-path-to-node=&quot;11&quot; data-ke-size=&quot;size20&quot;&gt;기준 ①: 데이터 흐름의 방향에 따른 분류 (단방향 원칙)&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;12&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;12,0,0&quot;&gt;입력 스트림 (Input Stream):&lt;/b&gt; 대상 목적지로부터 프로그램으로 데이터를 밀어 넣어주는 읽기 전용 통로.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;12,1,0&quot;&gt;출력 스트림 (Output Stream):&lt;/b&gt; 프로그램 내부 데이터를 대상 장치로 밀어내 주는 쓰기 전용 통로.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-path-to-node=&quot;13&quot; data-ke-size=&quot;size20&quot;&gt;기준 ②: 다루는 데이터의 최소 단주(형태)에 따른 분류&lt;/h4&gt;
&lt;p data-path-to-node=&quot;14&quot; data-ke-size=&quot;size16&quot;&gt;데이터 알맹이를 어떤 크기로 쪼개서 전송하느냐에 따라 물리적 처리 방식이 완전히 나뉨.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;15&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;15,0,0&quot;&gt;바이트 스트림 (Byte Stream):&lt;/b&gt; * 데이터를 &lt;b data-index-in-node=&quot;30&quot; data-path-to-node=&quot;15,0,0&quot;&gt;1바이트(byte, 8bit) 단위&lt;/b&gt;로 가공 없이 그대로 주고받는 가장 원시적이고 강력한 통로임.
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;15,0,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;그림 파일(.jpg), 음악(.mp3), 동영상, 실행 파일(.exe) 등 모든 형태의 바이너리 데이터를 깨짐 없이 완벽하게 전송할 수 있음.&lt;/li&gt;
&lt;li&gt;클래스 이름 접미사: 입력은 &lt;b data-index-in-node=&quot;16&quot; data-path-to-node=&quot;15,0,1,1,0&quot;&gt;~InputStream&lt;/b&gt;, 출력은 &lt;b data-index-in-node=&quot;34&quot; data-path-to-node=&quot;15,0,1,1,0&quot;&gt;~OutputStream&lt;/b&gt; 형식을 취함. (예: FileInputStream)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;15,1,0&quot;&gt;문자 스트림 (Character Stream):&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;15,1,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;데이터를 &lt;b data-index-in-node=&quot;5&quot; data-path-to-node=&quot;15,1,1,0,0&quot;&gt;2바이트(2byte, 16bit) 단위&lt;/b&gt;로 쪼개어 전송하며, 전송 과정에서 자바 내장 인코딩(UTF-16 등) 규격에 맞춰 문자(Text)로 자동 번역해 주는 통로임.&lt;/li&gt;
&lt;li&gt;오직 텍스트 파일(.txt, .csv, 소스 코드) 전용이며, 영어 외의 전 세계 문자(한글, 한자 등 2바이트 이상 문자)가 깨지지 않도록 보장함.&lt;/li&gt;
&lt;li&gt;클래스 이름 접미사: 입력은 &lt;b data-index-in-node=&quot;16&quot; data-path-to-node=&quot;15,1,1,2,0&quot;&gt;~Reader&lt;/b&gt;, 출력은 &lt;b data-index-in-node=&quot;29&quot; data-path-to-node=&quot;15,1,1,2,0&quot;&gt;~Writer&lt;/b&gt; 형식을 취함. (예: FileReader)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-path-to-node=&quot;16&quot; data-ke-size=&quot;size20&quot;&gt;기준 ③: 스트림의 역할 및 결합 아키텍처에 따른 분류&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;17&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;17,0,0&quot;&gt;기반 스트림 (1차 스트림):&lt;/b&gt; 파일이나 메모리 같은 데이터 소스에 &lt;b data-index-in-node=&quot;37&quot; data-path-to-node=&quot;17,0,0&quot;&gt;직접&lt;/b&gt; 빨대를 꽂아 통로를 개설하는 스트림임. 혼자서 데이터를 직접 퍼 올릴 수 있음. (예: FileInputStream, FileReader)&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;17,1,0&quot;&gt;보조 스트림 (2차 스트림 / 필터 스트림):&lt;/b&gt; 데이터 소스에 직접 연결할 수 없음. 대신 이미 개설된 1차 기반 스트림 주변을 감싸서 &lt;b data-index-in-node=&quot;75&quot; data-path-to-node=&quot;17,1,0&quot;&gt;버퍼 기능(속도 향상), 문자 인코딩 변환, 성능 업그레이드 등 부가 기능만 데코레이션&lt;/b&gt;해 주는 특수 스트림임. (예: BufferedInputStream, BufferedReader)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-path-to-node=&quot;9&quot; data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-path-to-node=&quot;9&quot; data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-path-to-node=&quot;9&quot; data-ke-size=&quot;size23&quot;&gt;◆ File 클래스&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;&amp;nbsp;하드디스크 같은 물리적 저장 장치에 존재하는 실제 파일이나 디렉터리(폴더)를 자바 객체 아키텍처로 추상화하여 제어하는 도구임.◆ File 클래스의 객체 형성(생성) 방식 및 메커니즘&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;5&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;5,0,0&quot;&gt;절대 경로:&lt;/b&gt; 드라이브의 최상위 루트부터 파일이 있는 위치까지 전체 경로를 전부 다 적어주는 방식임.
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;5,0,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;예시: C:\java_project\test.txt&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;5,1,0&quot;&gt;상대 경로:&lt;/b&gt; 현재 프로그램(프로젝트 폴더)이 실행되고 있는 위치를 기준점(./)으로 잡고 파일의 위치를 찾아가는 방식임. 경로 유연성이 높아 실무 아키텍처에서 훨씬 선호됨.
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;5,1,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;예시: src/data/test.txt&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;◆ File 객체 형성 및 핵심 메서드 제어 예시&lt;/p&gt;
&lt;div data-ved=&quot;0CAAQhtANahgKEwi4q-2ioOeUAxUAAAAAHQAAAAAQgwk&quot; data-hveid=&quot;0&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&lt;span&gt;Java&lt;/span&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;pre class=&quot;gradle&quot;&gt;&lt;code&gt;import java.io.File;
import java.io.IOException;

public class FileExample {
    public static void main(String[] args) {
        
        //   1. 디렉터리(폴더) 제어용 File 객체 형성
        File dir = new File(&quot;src/myFolder&quot;);
        
        //   2. 파일 제어용 File 객체 형성 (경로와 파일명 결합)
        File file = new File(dir, &quot;sample.txt&quot;);

        try {
            // ◆ 물리적 폴더 생성 메커니즘
            if (!dir.exists()) { // 해당 경로에 폴더가 존재하지 않는다면
                dir.mkdir();     // 하드디스크에 진짜 폴더를 파냄
                System.out.println(&quot;  폴더 생성 완료&quot;);
            }

            // ◆ 물리적 파일 생성 메커니즘
            if (!file.exists()) {  // 해당 파일이 존재하지 않는다면
                file.createNewFile(); //   Checked Exception 발생하므로 try-catch 필수 구조, 진짜 파일 생성
                System.out.println(&quot;  파일 생성 완료&quot;);
            }

            // ◆ 형성된 File 객체를 통한 상태 데이터 조회 기능
            System.out.println(&quot;--------------------------------&quot;);
            System.out.println(&quot;파일 절대경로: &quot; + file.getAbsolutePath());
            System.out.println(&quot;파일 크기(Byte): &quot; + file.length());
            System.out.println(&quot;읽기 가능 여부: &quot; + file.canRead());
            System.out.println(&quot;쓰기 가능 여부: &quot; + file.canWrite());
            System.out.println(&quot;이것은 파일인가?: &quot; + file.isFile());
            System.out.println(&quot;이것은 폴더인가?: &quot; + file.isDirectory());
            System.out.println(&quot;--------------------------------&quot;);

            // ◆ 파일 삭제 메커니즘 (테스트 필요 시 주석 해제)
            // if (file.exists()) {
            //     file.delete(); // 물리 파일 삭제
            //     System.out.println(&quot; ️ 파일 삭제 완료&quot;);
            // }

        } catch (IOException e) {
            // printStackTrace를 활용한 경로 역추적 에러 로그 출력
            e.printStackTrace(); 
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;◆ ⚠️ 주의 사항 및 구동 팩트&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;12&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;12,0,0&quot;&gt;객체 생성 vs 물리 파일 생성 분리:&lt;/b&gt; File file = new File(&quot;test.txt&quot;); 문장을 실행했다고 해서 하드디스크에 파일이 즉시 만들어지는 것이 아님. 단지 메모리 스택 영역에 주소 상자(자바 객체)만 파진 상태임.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;12,1,0&quot;&gt;존재 여부 확인 필수:&lt;/b&gt; 반드시 객체 형성 이후 file.exists() 메서드로 파일이 실제 하드디스크에 있는지 확인한 뒤, createNewFile()이나 mkdir() 메서드를 명시적으로 가동해야 물리 공간에 할당됨.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;17&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-path-to-node=&quot;8&quot;&gt;아래 코드는 상대 경로 구조를 사용하여 실제 파일 시스템에 물리적 파일과 폴더를 탄생시키고 속성을 조회하는 전체 시퀀스임.&lt;/li&gt;
&lt;li data-path-to-node=&quot;4&quot;&gt;File 객체를 생성하기 위해서는 대상 파일이 위치한 물리적 경로(Path) 문자열을 지정해야 함. 이때 경로는 두 가지 방식으로 매핑할 수 있음.&lt;/li&gt;
&lt;li data-path-to-node=&quot;1&quot;&gt;실제 파일 내부의 데이터 알맹이를 읽고 쓰는 기능은 없으며, 파일의 경로, 이름, 크기, 수정 날짜 등을 조회하거나 파일을 생성, 삭제, 이름 변경하는 등의 외형적 관리 기능만 수행함.&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>개발자 호소인/JAVA</category>
      <category>ㅌ</category>
      <author>리제 </author>
      <guid isPermaLink="true">https://bookstairs.tistory.com/53</guid>
      <comments>https://bookstairs.tistory.com/53#entry53comment</comments>
      <pubDate>Mon, 1 Jun 2026 16:31:53 +0900</pubDate>
    </item>
  </channel>
</rss>