<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>개발공부일지</title>
    <link>https://dead-end.tistory.com/</link>
    <description>화이트해커를 향해 매일매일 한 걸음</description>
    <language>ko</language>
    <pubDate>Mon, 17 Aug 2026 12:00:37 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>SpruceMoon</managingEditor>
    <image>
      <title>개발공부일지</title>
      <url>https://tistory1.daumcdn.net/tistory/7224426/attach/e37fc4c8ea5c4a27a0531a6a553dc425</url>
      <link>https://dead-end.tistory.com</link>
    </image>
    <item>
      <title>[Dreamhack] Flying Chars</title>
      <link>https://dead-end.tistory.com/48</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1113&quot; data-origin-height=&quot;667&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cLG8cE/dJMcadbwdpP/zpxD3hSBTOxHfGfI27wsuk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cLG8cE/dJMcadbwdpP/zpxD3hSBTOxHfGfI27wsuk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cLG8cE/dJMcadbwdpP/zpxD3hSBTOxHfGfI27wsuk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcLG8cE%2FdJMcadbwdpP%2FzpxD3hSBTOxHfGfI27wsuk%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;1113&quot; height=&quot;667&quot; data-origin-width=&quot;1113&quot; data-origin-height=&quot;667&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1157&quot; data-origin-height=&quot;392&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cUglGl/dJMcahkQwV5/svR2hSVbzvqnMIvbCKuKn0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cUglGl/dJMcahkQwV5/svR2hSVbzvqnMIvbCKuKn0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cUglGl/dJMcahkQwV5/svR2hSVbzvqnMIvbCKuKn0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcUglGl%2FdJMcahkQwV5%2FsvR2hSVbzvqnMIvbCKuKn0%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;1157&quot; height=&quot;392&quot; data-origin-width=&quot;1157&quot; data-origin-height=&quot;392&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코드에서 순서까지 알려주기 때문에,&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저거 다 순서대로 일일이 메모해서 연결해봐도 되겠지만 좀 더 스마트한 방법을 쓰고 싶은데...&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1536&quot; data-origin-height=&quot;328&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/SCRU4/dJMcaiRwJ5Y/CBy7khUp8Rqa18yaM0eKM1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/SCRU4/dJMcaiRwJ5Y/CBy7khUp8Rqa18yaM0eKM1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/SCRU4/dJMcaiRwJ5Y/CBy7khUp8Rqa18yaM0eKM1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FSCRU4%2FdJMcaiRwJ5Y%2FCBy7khUp8Rqa18yaM0eKM1%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;328&quot; data-origin-width=&quot;1536&quot; data-origin-height=&quot;328&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-origin-width=&quot;1536&quot; data-origin-height=&quot;163&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/TKblo/dJMcadiqiRQ/NN5FkywWTPtTK9xXDn8LJk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/TKblo/dJMcadiqiRQ/NN5FkywWTPtTK9xXDn8LJk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/TKblo/dJMcadiqiRQ/NN5FkywWTPtTK9xXDn8LJk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTKblo%2FdJMcadiqiRQ%2FNN5FkywWTPtTK9xXDn8LJk%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;163&quot; data-origin-width=&quot;1536&quot; data-origin-height=&quot;163&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;... 더 모르겠다. 그냥 일일이 순서 맞춰서 입력할란다..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;812&quot; data-origin-height=&quot;180&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/de1G53/dJMcafHjCTe/KiOx68dWGuYWjqoENW1aY0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/de1G53/dJMcafHjCTe/KiOx68dWGuYWjqoENW1aY0/img.png&quot; data-alt=&quot;노가다 해결~&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/de1G53/dJMcafHjCTe/KiOx68dWGuYWjqoENW1aY0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fde1G53%2FdJMcafHjCTe%2FKiOx68dWGuYWjqoENW1aY0%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;812&quot; height=&quot;180&quot; data-origin-width=&quot;812&quot; data-origin-height=&quot;180&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;노가다 해결~&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>Security/WebHacking</category>
      <author>SpruceMoon</author>
      <guid isPermaLink="true">https://dead-end.tistory.com/48</guid>
      <comments>https://dead-end.tistory.com/48#entry48comment</comments>
      <pubDate>Thu, 9 Jul 2026 17:41:46 +0900</pubDate>
    </item>
    <item>
      <title>[Dreamhack] command-injection-chatgpt</title>
      <link>https://dead-end.tistory.com/47</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;568&quot; data-origin-height=&quot;251&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bGyzgY/dJMcaccGO2s/XSCo8oB1KmVbD3dDX8Mc3k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bGyzgY/dJMcaccGO2s/XSCo8oB1KmVbD3dDX8Mc3k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bGyzgY/dJMcaccGO2s/XSCo8oB1KmVbD3dDX8Mc3k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbGyzgY%2FdJMcaccGO2s%2FXSCo8oB1KmVbD3dDX8Mc3k%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;251&quot; data-origin-width=&quot;568&quot; data-origin-height=&quot;251&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;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/6HBTw/dJMcaiYcPWy/5fVhctHK4KWbl2M2NPNwB1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/6HBTw/dJMcaiYcPWy/5fVhctHK4KWbl2M2NPNwB1/img.png&quot; data-origin-width=&quot;527&quot; data-origin-height=&quot;300&quot; data-is-animation=&quot;false&quot; style=&quot;width: 57.6953%; margin-right: 10px;&quot; data-widthpercent=&quot;58.37&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/6HBTw/dJMcaiYcPWy/5fVhctHK4KWbl2M2NPNwB1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F6HBTw%2FdJMcaiYcPWy%2F5fVhctHK4KWbl2M2NPNwB1%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;527&quot; height=&quot;300&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/NWwQK/dJMcaa646NT/RJkvlD5ZyLQmEx7aBxyM5K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/NWwQK/dJMcaa646NT/RJkvlD5ZyLQmEx7aBxyM5K/img.png&quot; data-origin-width=&quot;471&quot; data-origin-height=&quot;376&quot; data-is-animation=&quot;false&quot; style=&quot;width: 41.1419%;&quot; data-widthpercent=&quot;41.63&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/NWwQK/dJMcaa646NT/RJkvlD5ZyLQmEx7aBxyM5K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNWwQK%2FdJMcaa646NT%2FRJkvlD5ZyLQmEx7aBxyM5K%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;471&quot; height=&quot;376&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;보면은 이렇게 입력한 ip로 ping을 보낼 수 있게 해주는 서비스다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;492&quot; data-origin-height=&quot;216&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bGcxtr/dJMcagznS8R/IRlVjirQoyvNKaXMxS6661/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bGcxtr/dJMcagznS8R/IRlVjirQoyvNKaXMxS6661/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bGcxtr/dJMcagznS8R/IRlVjirQoyvNKaXMxS6661/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbGcxtr%2FdJMcagznS8R%2FIRlVjirQoyvNKaXMxS6661%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;492&quot; height=&quot;216&quot; data-origin-width=&quot;492&quot; data-origin-height=&quot;216&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: center;&quot;&gt; 그렇다면 다른 OS 커맨드들을 차단하고 있는지 한 번 볼까. &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;568&quot; data-origin-height=&quot;312&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bXWWtJ/dJMcaa0e1iN/K5O5PvgxRXxnF81b9PBQdK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bXWWtJ/dJMcaa0e1iN/K5O5PvgxRXxnF81b9PBQdK/img.png&quot; data-alt=&quot;엥? 찾았다&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bXWWtJ/dJMcaa0e1iN/K5O5PvgxRXxnF81b9PBQdK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbXWWtJ%2FdJMcaa0e1iN%2FK5O5PvgxRXxnF81b9PBQdK%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;312&quot; data-origin-width=&quot;568&quot; data-origin-height=&quot;312&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;엥? 찾았다&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 저 누가봐도 수상해보이는 저 flag.py를 실행시켜보면,&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/zeKoG/dJMcaiDZ2Ou/T7lzvRMjPwI6bDliEiCLx0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zeKoG/dJMcaiDZ2Ou/T7lzvRMjPwI6bDliEiCLx0/img.png&quot; data-origin-width=&quot;405&quot; data-origin-height=&quot;217&quot; data-is-animation=&quot;false&quot; style=&quot;width: 45.7828%; margin-right: 10px;&quot; data-widthpercent=&quot;46.32&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zeKoG/dJMcaiDZ2Ou/T7lzvRMjPwI6bDliEiCLx0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzeKoG%2FdJMcaiDZ2Ou%2FT7lzvRMjPwI6bDliEiCLx0%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;405&quot; height=&quot;217&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/VMaf3/dJMcaiDZ2Ob/tWX1UG08KobW86mWWlpsK1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/VMaf3/dJMcaiDZ2Ob/tWX1UG08KobW86mWWlpsK1/img.png&quot; data-origin-width=&quot;372&quot; data-origin-height=&quot;172&quot; data-is-animation=&quot;false&quot; data-widthpercent=&quot;53.68&quot; style=&quot;width: 53.0544%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/VMaf3/dJMcaiDZ2Ob/tWX1UG08KobW86mWWlpsK1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FVMaf3%2FdJMcaiDZ2Ob%2FtWX1UG08KobW86mWWlpsK1%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;372&quot; height=&quot;172&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;플래그를 얻었다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;807&quot; data-origin-height=&quot;182&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cWzSvz/dJMcag0pBkL/uGkBXxARqburvLRTPjebh0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cWzSvz/dJMcag0pBkL/uGkBXxARqburvLRTPjebh0/img.png&quot; data-alt=&quot;해결~&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cWzSvz/dJMcag0pBkL/uGkBXxARqburvLRTPjebh0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcWzSvz%2FdJMcag0pBkL%2FuGkBXxARqburvLRTPjebh0%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;182&quot; data-origin-width=&quot;807&quot; data-origin-height=&quot;182&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;해결~&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;</description>
      <author>SpruceMoon</author>
      <guid isPermaLink="true">https://dead-end.tistory.com/47</guid>
      <comments>https://dead-end.tistory.com/47#entry47comment</comments>
      <pubDate>Thu, 9 Jul 2026 16:06:47 +0900</pubDate>
    </item>
    <item>
      <title>[Dreamhack] image-storage</title>
      <link>https://dead-end.tistory.com/46</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;587&quot; data-origin-height=&quot;232&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zAMOM/dJMcaf1whAE/NcKmAaeHk7StuwpnRM3owK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zAMOM/dJMcaf1whAE/NcKmAaeHk7StuwpnRM3owK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zAMOM/dJMcaf1whAE/NcKmAaeHk7StuwpnRM3owK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzAMOM%2FdJMcaf1whAE%2FNcKmAaeHk7StuwpnRM3owK%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;587&quot; height=&quot;232&quot; data-origin-width=&quot;587&quot; data-origin-height=&quot;232&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문제는 이렇게 생겼다. 보아하니 파일 업로드 취약점을 이용하라는데, 사이트에 들어가보면, 파일을 업로드하는 곳이 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자고로 파일 업로드 기능이 있다면 그 자체로 취약점의 가능성이 있다고들 하더라..&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-origin-width=&quot;447&quot; data-origin-height=&quot;271&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Hbell/dJMcabrkYEr/276fbx2sN0hWqH6PYOahk1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Hbell/dJMcabrkYEr/276fbx2sN0hWqH6PYOahk1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Hbell/dJMcabrkYEr/276fbx2sN0hWqH6PYOahk1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHbell%2FdJMcabrkYEr%2F276fbx2sN0hWqH6PYOahk1%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;447&quot; height=&quot;271&quot; data-origin-width=&quot;447&quot; data-origin-height=&quot;271&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&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;cmd 명령어를 실행할 수 있도록 만들어두었다.&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-origin-width=&quot;521&quot; data-origin-height=&quot;117&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/baZwko/dJMcacjp40M/gh6RG5X7N3p0fZg0SRdKm0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/baZwko/dJMcacjp40M/gh6RG5X7N3p0fZg0SRdKm0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/baZwko/dJMcacjp40M/gh6RG5X7N3p0fZg0SRdKm0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbaZwko%2FdJMcacjp40M%2Fgh6RG5X7N3p0fZg0SRdKm0%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;521&quot; height=&quot;117&quot; data-origin-width=&quot;521&quot; data-origin-height=&quot;117&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 뜬다. 보아하니 따로 php 파일 필터링이나 화이트박스를 걸어두지 않은 것 같다.&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;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;587&quot; data-origin-height=&quot;120&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bwfRdN/dJMcadbwbHK/MO9qBnWL0h1vGNlyuPJ2aK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bwfRdN/dJMcadbwbHK/MO9qBnWL0h1vGNlyuPJ2aK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bwfRdN/dJMcadbwbHK/MO9qBnWL0h1vGNlyuPJ2aK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbwfRdN%2FdJMcadbwbHK%2FMO9qBnWL0h1vGNlyuPJ2aK%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;587&quot; height=&quot;120&quot; data-origin-width=&quot;587&quot; data-origin-height=&quot;120&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러면 이렇게 뜨는데, 뒤에 cmd 명령어 기능으로 한 번 서버를 뒤적거려보자&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;676&quot; data-origin-height=&quot;167&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cLtoYy/dJMcadP81R4/GzKZq8hINxZb7FjbNZkWEK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cLtoYy/dJMcadP81R4/GzKZq8hINxZb7FjbNZkWEK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cLtoYy/dJMcadP81R4/GzKZq8hINxZb7FjbNZkWEK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcLtoYy%2FdJMcadP81R4%2FGzKZq8hINxZb7FjbNZkWEK%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;676&quot; height=&quot;167&quot; data-origin-width=&quot;676&quot; data-origin-height=&quot;167&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ls -al 로 확인해보니 여기에는 아직 flag.txt가 없는 것 같다.&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-origin-width=&quot;706&quot; data-origin-height=&quot;177&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dlj1BP/dJMcadbwbLb/X24K9Rwv6VqSACrtTdAknk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dlj1BP/dJMcadbwbLb/X24K9Rwv6VqSACrtTdAknk/img.png&quot; data-alt=&quot;없으니까 상위 디렉터리로..&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dlj1BP/dJMcadbwbLb/X24K9Rwv6VqSACrtTdAknk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdlj1BP%2FdJMcadbwbLb%2FX24K9Rwv6VqSACrtTdAknk%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;706&quot; height=&quot;177&quot; data-origin-width=&quot;706&quot; data-origin-height=&quot;177&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;없으니까 상위 디렉터리로..&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;713&quot; data-origin-height=&quot;137&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c0REyH/dJMcaijGM7N/pVuofifn2lX6HAQxY4Qso0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c0REyH/dJMcaijGM7N/pVuofifn2lX6HAQxY4Qso0/img.png&quot; data-alt=&quot;또 없으니까 위로..&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c0REyH/dJMcaijGM7N/pVuofifn2lX6HAQxY4Qso0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc0REyH%2FdJMcaijGM7N%2FpVuofifn2lX6HAQxY4Qso0%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;713&quot; height=&quot;137&quot; data-origin-width=&quot;713&quot; data-origin-height=&quot;137&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;또 없으니까 위로..&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;737&quot; data-origin-height=&quot;282&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nSQTP/dJMb99UyVT9/AUSNqimziksTL6HxRR5OPK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nSQTP/dJMb99UyVT9/AUSNqimziksTL6HxRR5OPK/img.png&quot; data-alt=&quot;위로..&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nSQTP/dJMb99UyVT9/AUSNqimziksTL6HxRR5OPK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnSQTP%2FdJMb99UyVT9%2FAUSNqimziksTL6HxRR5OPK%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;737&quot; height=&quot;282&quot; data-origin-width=&quot;737&quot; data-origin-height=&quot;282&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;위로..&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;728&quot; data-origin-height=&quot;392&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dEaMK0/dJMb99UyVUC/vZewZYdd6eM3qvdgDpKaxK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dEaMK0/dJMb99UyVUC/vZewZYdd6eM3qvdgDpKaxK/img.png&quot; data-alt=&quot;드디어 찾았다!&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dEaMK0/dJMb99UyVUC/vZewZYdd6eM3qvdgDpKaxK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdEaMK0%2FdJMb99UyVUC%2FvZewZYdd6eM3qvdgDpKaxK%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;392&quot; data-origin-width=&quot;728&quot; data-origin-height=&quot;392&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;드디어 찾았다!&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저기에 flag.txt가 보인다. 이제 이걸 열어보기만 하면 된다. 저 경로 그대로 ls 를 cat 명령어로 바꿔서 flag.txt를 열어보면,&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;767&quot; data-origin-height=&quot;150&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dxIacI/dJMcaazdL0k/DSvblMyhgh42X4cJNX9jk1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dxIacI/dJMcaazdL0k/DSvblMyhgh42X4cJNX9jk1/img.png&quot; data-alt=&quot;플래그를 잡았다&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dxIacI/dJMcaazdL0k/DSvblMyhgh42X4cJNX9jk1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdxIacI%2FdJMcaazdL0k%2FDSvblMyhgh42X4cJNX9jk1%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;150&quot; data-origin-width=&quot;767&quot; data-origin-height=&quot;150&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;플래그를 잡았다&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;803&quot; data-origin-height=&quot;205&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/LQ3C4/dJMcahZlt5y/nCfjPVSgcMMKoA9MvKB2c1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/LQ3C4/dJMcahZlt5y/nCfjPVSgcMMKoA9MvKB2c1/img.png&quot; data-alt=&quot;해결~&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/LQ3C4/dJMcahZlt5y/nCfjPVSgcMMKoA9MvKB2c1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLQ3C4%2FdJMcahZlt5y%2FnCfjPVSgcMMKoA9MvKB2c1%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;205&quot; data-origin-width=&quot;803&quot; data-origin-height=&quot;205&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;해결~&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;</description>
      <author>SpruceMoon</author>
      <guid isPermaLink="true">https://dead-end.tistory.com/46</guid>
      <comments>https://dead-end.tistory.com/46#entry46comment</comments>
      <pubDate>Thu, 9 Jul 2026 15:43:06 +0900</pubDate>
    </item>
    <item>
      <title>[Dreamhack] pathtraversal</title>
      <link>https://dead-end.tistory.com/45</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;505&quot; data-origin-height=&quot;210&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/F6ACv/dJMcabLInmx/tiVNgh5KRAPXNfcKuBkjA0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/F6ACv/dJMcabLInmx/tiVNgh5KRAPXNfcKuBkjA0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/F6ACv/dJMcabLInmx/tiVNgh5KRAPXNfcKuBkjA0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FF6ACv%2FdJMcabLInmx%2FtiVNgh5KRAPXNfcKuBkjA0%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;505&quot; height=&quot;210&quot; data-origin-width=&quot;505&quot; data-origin-height=&quot;210&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;요지는 간단하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문제에선 두 가지를 묻고 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;burp suite 써봤냐?&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;&amp;nbsp;&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-origin-width=&quot;440&quot; data-origin-height=&quot;322&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/TkyrM/dJMcage5Xyq/fD7n77AXFqzi6MgR4E7AKk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/TkyrM/dJMcage5Xyq/fD7n77AXFqzi6MgR4E7AKk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/TkyrM/dJMcage5Xyq/fD7n77AXFqzi6MgR4E7AKk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTkyrM%2FdJMcage5Xyq%2FfD7n77AXFqzi6MgR4E7AKk%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;440&quot; height=&quot;322&quot; data-origin-width=&quot;440&quot; data-origin-height=&quot;322&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;get user info 페이지가 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이미 문제에서 flag가 /api/flag에 있다고 말해줬기 때문에, 우리는 이 경로로 가보기만 하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;767&quot; data-origin-height=&quot;243&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cLV4Si/dJMcaaMJe8J/1ASGAgg1xfQuYuFBS6TSs0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cLV4Si/dJMcaaMJe8J/1ASGAgg1xfQuYuFBS6TSs0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cLV4Si/dJMcaaMJe8J/1ASGAgg1xfQuYuFBS6TSs0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcLV4Si%2FdJMcaaMJe8J%2F1ASGAgg1xfQuYuFBS6TSs0%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;243&quot; data-origin-width=&quot;767&quot; data-origin-height=&quot;243&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;우리는 저 get user info 페이지를 이용해서 해당 패킷에서 요청하는 내용을 flag가 있는 파일의 위치로 유도할 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;453&quot; data-origin-height=&quot;510&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lO3Xk/dJMcagznNUb/aVANThTNhdGd035HixNURk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lO3Xk/dJMcagznNUb/aVANThTNhdGd035HixNURk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lO3Xk/dJMcagznNUb/aVANThTNhdGd035HixNURk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlO3Xk%2FdJMcagznNUb%2FaVANThTNhdGd035HixNURk%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;453&quot; height=&quot;510&quot; data-origin-width=&quot;453&quot; data-origin-height=&quot;510&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;burp 로 잡아보면 밑에 userid=0 부분을 변조하면 될 수 있을 것 같다.&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;저 부분을 현재 위치 폴더를 이탈하고 /api/flag로 이동하도록 수정해주면,&amp;nbsp;&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/cwHKpS/dJMcahkQk5q/7ehvcWXqaEl7Fzz8tHmz31/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cwHKpS/dJMcahkQk5q/7ehvcWXqaEl7Fzz8tHmz31/img.png&quot; data-origin-width=&quot;473&quot; data-origin-height=&quot;558&quot; data-is-animation=&quot;false&quot; style=&quot;width: 41.9784%; margin-right: 10px;&quot; data-widthpercent=&quot;42.47&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cwHKpS/dJMcahkQk5q/7ehvcWXqaEl7Fzz8tHmz31/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcwHKpS%2FdJMcahkQk5q%2F7ehvcWXqaEl7Fzz8tHmz31%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;473&quot; height=&quot;558&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zarSG/dJMcahkQk6q/rsEXRDFRLuSDodxffebc41/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zarSG/dJMcahkQk6q/rsEXRDFRLuSDodxffebc41/img.png&quot; data-origin-width=&quot;310&quot; data-origin-height=&quot;270&quot; data-is-animation=&quot;false&quot; style=&quot;width: 56.8588%;&quot; data-widthpercent=&quot;57.53&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zarSG/dJMcahkQk6q/rsEXRDFRLuSDodxffebc41/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzarSG%2FdJMcahkQk6q%2FrsEXRDFRLuSDodxffebc41%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;310&quot; height=&quot;270&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;flag를 획득할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;813&quot; data-origin-height=&quot;397&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/M5gJx/dJMcafUPVp7/LJAAWG2hDJVFPslumKGcn0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/M5gJx/dJMcafUPVp7/LJAAWG2hDJVFPslumKGcn0/img.png&quot; data-alt=&quot;해결~&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/M5gJx/dJMcafUPVp7/LJAAWG2hDJVFPslumKGcn0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FM5gJx%2FdJMcafUPVp7%2FLJAAWG2hDJVFPslumKGcn0%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;813&quot; height=&quot;397&quot; data-origin-width=&quot;813&quot; data-origin-height=&quot;397&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;해결~&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>Security/WebHacking</category>
      <author>SpruceMoon</author>
      <guid isPermaLink="true">https://dead-end.tistory.com/45</guid>
      <comments>https://dead-end.tistory.com/45#entry45comment</comments>
      <pubDate>Thu, 9 Jul 2026 14:29:04 +0900</pubDate>
    </item>
    <item>
      <title>[Dreamhack] XSS Filtering Bypass</title>
      <link>https://dead-end.tistory.com/44</link>
      <description>&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/caN7TK/dJMcahkKD4O/JPlcXZbNkm8d4qJkwGVkI0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/caN7TK/dJMcahkKD4O/JPlcXZbNkm8d4qJkwGVkI0/img.png&quot; data-is-animation=&quot;false&quot; data-origin-height=&quot;278&quot; data-origin-width=&quot;522&quot; style=&quot;width: 52.4035%; margin-right: 10px;&quot; data-widthpercent=&quot;53.02&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/caN7TK/dJMcahkKD4O/JPlcXZbNkm8d4qJkwGVkI0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcaN7TK%2FdJMcahkKD4O%2FJPlcXZbNkm8d4qJkwGVkI0%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;522&quot; height=&quot;278&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/OmnmY/dJMcaftCD8c/Q00hEQ5uEf3vyfjrxwkZk0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/OmnmY/dJMcaftCD8c/Q00hEQ5uEf3vyfjrxwkZk0/img.png&quot; data-origin-width=&quot;386&quot; data-origin-height=&quot;232&quot; data-is-animation=&quot;false&quot; style=&quot;width: 46.4337%;&quot; data-widthpercent=&quot;46.98&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/OmnmY/dJMcaftCD8c/Q00hEQ5uEf3vyfjrxwkZk0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FOmnmY%2FdJMcaftCD8c%2FQ00hEQ5uEf3vyfjrxwkZk0%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;386&quot; height=&quot;232&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;XSS 문제다. 문제에도 나와있듯이 filtering이 걸려져 있다고 한다.&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-origin-width=&quot;710&quot; data-origin-height=&quot;586&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bXolBD/dJMcadP3xAX/EYetMwUh32gsZCKUYNVy1K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bXolBD/dJMcadP3xAX/EYetMwUh32gsZCKUYNVy1K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bXolBD/dJMcadP3xAX/EYetMwUh32gsZCKUYNVy1K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbXolBD%2FdJMcadP3xAX%2FEYetMwUh32gsZCKUYNVy1K%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;710&quot; height=&quot;586&quot; data-origin-width=&quot;710&quot; data-origin-height=&quot;586&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;이걸 보면 우리가 flag 페이지에서 뭔가를 실행하면, 관리자봇의 쿠키 안에 플래그를 넣어주는 것을 확인할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;605&quot; data-origin-height=&quot;432&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/S2EaS/dJMcaf1qODe/19986GJeO1sRO79cPiQN90/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/S2EaS/dJMcaf1qODe/19986GJeO1sRO79cPiQN90/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/S2EaS/dJMcaf1qODe/19986GJeO1sRO79cPiQN90/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FS2EaS%2FdJMcaf1qODe%2F19986GJeO1sRO79cPiQN90%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;605&quot; height=&quot;432&quot; data-origin-width=&quot;605&quot; data-origin-height=&quot;432&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;그리고, 이 관리자봇이 read_url 를 통해 check_xss에서 만들었던 vuln 페이지 url로 접속하도록 하고 있는 것을 알 수 있다.&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-origin-width=&quot;685&quot; data-origin-height=&quot;821&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cOMFPh/dJMcadoY9Xh/v58cPgOF8KexKKRkFclRA1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cOMFPh/dJMcadoY9Xh/v58cPgOF8KexKKRkFclRA1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cOMFPh/dJMcadoY9Xh/v58cPgOF8KexKKRkFclRA1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcOMFPh%2FdJMcadoY9Xh%2Fv58cPgOF8KexKKRkFclRA1%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;821&quot; data-origin-width=&quot;685&quot; data-origin-height=&quot;821&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;또한, 보면 script, on, javascript: 라는 단어를 필터링하도록 되어있다.&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-origin-width=&quot;597&quot; data-origin-height=&quot;77&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/79ZJR/dJMcacqbS8X/oFQfADRqDXW702ecL1VRYK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/79ZJR/dJMcacqbS8X/oFQfADRqDXW702ecL1VRYK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/79ZJR/dJMcacqbS8X/oFQfADRqDXW702ecL1VRYK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F79ZJR%2FdJMcacqbS8X%2FoFQfADRqDXW702ecL1VRYK%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;597&quot; height=&quot;77&quot; data-origin-width=&quot;597&quot; data-origin-height=&quot;77&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-origin-width=&quot;712&quot; data-origin-height=&quot;118&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bmujZw/dJMcaiw9ep2/H2sH2AeKMiNqdhpEqac5i1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bmujZw/dJMcaiw9ep2/H2sH2AeKMiNqdhpEqac5i1/img.png&quot; data-alt=&quot;최종 작성된 것&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bmujZw/dJMcaiw9ep2/H2sH2AeKMiNqdhpEqac5i1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbmujZw%2FdJMcaiw9ep2%2FH2sH2AeKMiNqdhpEqac5i1%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;712&quot; height=&quot;118&quot; data-origin-width=&quot;712&quot; data-origin-height=&quot;118&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;최종 작성된 것&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;437&quot; data-origin-height=&quot;492&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rPp7m/dJMb99UtvDO/qMWFmiBS0pklJkcouzK2zk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rPp7m/dJMb99UtvDO/qMWFmiBS0pklJkcouzK2zk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rPp7m/dJMb99UtvDO/qMWFmiBS0pklJkcouzK2zk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrPp7m%2FdJMb99UtvDO%2FqMWFmiBS0pklJkcouzK2zk%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;437&quot; height=&quot;492&quot; data-origin-width=&quot;437&quot; data-origin-height=&quot;492&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-origin-width=&quot;1012&quot; data-origin-height=&quot;251&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dZID8c/dJMcaijBaHI/jLSc4dBbFRBjtsCiE9mjHk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dZID8c/dJMcaijBaHI/jLSc4dBbFRBjtsCiE9mjHk/img.png&quot; data-alt=&quot;해결~&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dZID8c/dJMcaijBaHI/jLSc4dBbFRBjtsCiE9mjHk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdZID8c%2FdJMcaijBaHI%2FjLSc4dBbFRBjtsCiE9mjHk%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;1012&quot; height=&quot;251&quot; data-origin-width=&quot;1012&quot; data-origin-height=&quot;251&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;해결~&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코드를 종합적으로 보면 쉬웠던 문제.&lt;/p&gt;</description>
      <category>Security/WebHacking</category>
      <author>SpruceMoon</author>
      <guid isPermaLink="true">https://dead-end.tistory.com/44</guid>
      <comments>https://dead-end.tistory.com/44#entry44comment</comments>
      <pubDate>Thu, 2 Jul 2026 12:32:41 +0900</pubDate>
    </item>
    <item>
      <title>[Dreamhack] command-injection-1</title>
      <link>https://dead-end.tistory.com/43</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;750&quot; data-origin-height=&quot;281&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cUAcYq/dJMcajbEhIK/himu7nwm7meG5fctCbK7Tk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cUAcYq/dJMcajbEhIK/himu7nwm7meG5fctCbK7Tk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cUAcYq/dJMcajbEhIK/himu7nwm7meG5fctCbK7Tk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcUAcYq%2FdJMcajbEhIK%2Fhimu7nwm7meG5fctCbK7Tk%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;281&quot; data-origin-width=&quot;750&quot; data-origin-height=&quot;281&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;VM을 발급하고 링크에 들어가보면, ping을 보내는 서비스가 구현되어 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&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/mfgzU/dJMcabLCESM/GJovfSXMsGSZ2nX24UmU51/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mfgzU/dJMcabLCESM/GJovfSXMsGSZ2nX24UmU51/img.png&quot; data-is-animation=&quot;false&quot; data-origin-height=&quot;260&quot; data-origin-width=&quot;422&quot; style=&quot;width: 51.9022%; margin-right: 10px;&quot; data-widthpercent=&quot;52.51&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mfgzU/dJMcabLCESM/GJovfSXMsGSZ2nX24UmU51/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmfgzU%2FdJMcabLCESM%2FGJovfSXMsGSZ2nX24UmU51%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;422&quot; height=&quot;260&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/k6IeR/dJMcahdWUg3/SasIyLmm4TwudjeYhpVO0k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/k6IeR/dJMcahdWUg3/SasIyLmm4TwudjeYhpVO0k/img.png&quot; data-origin-width=&quot;546&quot; data-origin-height=&quot;372&quot; data-is-animation=&quot;false&quot; style=&quot;width: 46.935%;&quot; data-widthpercent=&quot;47.49&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/k6IeR/dJMcahdWUg3/SasIyLmm4TwudjeYhpVO0k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fk6IeR%2FdJMcahdWUg3%2FSasIyLmm4TwudjeYhpVO0k%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;546&quot; height=&quot;372&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;ping을 날려보면 제대로 잘 간다.&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;command injection의 원리에 따르면, 사이트가 입력값을 제대로 검증하지 않을 시 시스템은 뒤에 있는 명령어까지 다 실행해버리게 된다.&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;707&quot; data-origin-height=&quot;257&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uZ0TZ/dJMcaa6Za6t/kH8uegruSrtu3FMYHunLSK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uZ0TZ/dJMcaa6Za6t/kH8uegruSrtu3FMYHunLSK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uZ0TZ/dJMcaa6Za6t/kH8uegruSrtu3FMYHunLSK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuZ0TZ%2FdJMcaa6Za6t%2FkH8uegruSrtu3FMYHunLSK%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;707&quot; height=&quot;257&quot; data-origin-width=&quot;707&quot; data-origin-height=&quot;257&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;요청한 형식과 일치시키라는 말이 나오는데, 이거는 html안에서 입력값이 설정되어있는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1373&quot; data-origin-height=&quot;455&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/baHDYZ/dJMcadoY8HR/1kt47ImKjgN2jmlnhdcbK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/baHDYZ/dJMcadoY8HR/1kt47ImKjgN2jmlnhdcbK0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/baHDYZ/dJMcadoY8HR/1kt47ImKjgN2jmlnhdcbK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbaHDYZ%2FdJMcadoY8HR%2F1kt47ImKjgN2jmlnhdcbK0%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;1373&quot; height=&quot;455&quot; data-origin-width=&quot;1373&quot; data-origin-height=&quot;455&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개발자 도구를 열어보면 역시나 패턴을 적용시키는 부분이 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 부분을 지워버리면 잘 입력이 된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;707&quot; data-origin-height=&quot;383&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ceq8cM/dJMcaiX7pwW/r814uscF2xmzE7qaLQn6H0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ceq8cM/dJMcaiX7pwW/r814uscF2xmzE7qaLQn6H0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ceq8cM/dJMcaiX7pwW/r814uscF2xmzE7qaLQn6H0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fceq8cM%2FdJMcaiX7pwW%2Fr814uscF2xmzE7qaLQn6H0%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;707&quot; height=&quot;383&quot; data-origin-width=&quot;707&quot; data-origin-height=&quot;383&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;보아하니 flag.py가 보인다. 저걸 열면 될 것 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;517&quot; data-origin-height=&quot;257&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/z3P5x/dJMcabrfxRC/PfKWKWVRkdTov40sEeIjd0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/z3P5x/dJMcabrfxRC/PfKWKWVRkdTov40sEeIjd0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/z3P5x/dJMcabrfxRC/PfKWKWVRkdTov40sEeIjd0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fz3P5x%2FdJMcabrfxRC%2FPfKWKWVRkdTov40sEeIjd0%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;517&quot; height=&quot;257&quot; data-origin-width=&quot;517&quot; data-origin-height=&quot;257&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;737&quot; data-origin-height=&quot;436&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bSho5o/dJMcaay73FU/hRDo4ojM15vkcLP9ZQOMFk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bSho5o/dJMcaay73FU/hRDo4ojM15vkcLP9ZQOMFk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bSho5o/dJMcaay73FU/hRDo4ojM15vkcLP9ZQOMFk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbSho5o%2FdJMcaay73FU%2FhRDo4ojM15vkcLP9ZQOMFk%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;737&quot; height=&quot;436&quot; data-origin-width=&quot;737&quot; data-origin-height=&quot;436&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;그렇게 flag.py도 실행시켜서 안에 있는 flag 값을 얻어내었다!&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;988&quot; data-origin-height=&quot;227&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xOLjj/dJMcahSsNUD/A0jUKQcQHMgn5CssxYBJKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xOLjj/dJMcahSsNUD/A0jUKQcQHMgn5CssxYBJKK/img.png&quot; data-alt=&quot;해결~&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xOLjj/dJMcahSsNUD/A0jUKQcQHMgn5CssxYBJKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxOLjj%2FdJMcahSsNUD%2FA0jUKQcQHMgn5CssxYBJKK%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;988&quot; height=&quot;227&quot; data-origin-width=&quot;988&quot; data-origin-height=&quot;227&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;해결~&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사실 문제에 어떤 파일에 flag가 있는지까지 줘서 친절하고 쉬운 문제였다.&lt;/p&gt;</description>
      <category>Security/WebHacking</category>
      <author>SpruceMoon</author>
      <guid isPermaLink="true">https://dead-end.tistory.com/43</guid>
      <comments>https://dead-end.tistory.com/43#entry43comment</comments>
      <pubDate>Thu, 2 Jul 2026 11:43:03 +0900</pubDate>
    </item>
    <item>
      <title>[DataBase] &amp;quot;EZPC&amp;quot; 개발 프로젝트 후기</title>
      <link>https://dead-end.tistory.com/42</link>
      <description>&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;&amp;gt; &lt;a href=&quot;https://github.com/2026-Database-Gamerbase/EZPC&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://github.com/2026-Database-Gamerbase/EZPC&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내가 맡은 부분은,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- ticket, charge, grade 자바 구현&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- Login, Sign up, User, Owner 뷰 설계 및 뼈대 구현&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- userView, userController 구현 및 연결&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 30일 이상 휴면 회원 및 마지막 로그아웃 시간 조회 쿼리 작성&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;이렇게다. 사실 많은 부분에 있어 AI의 도움을 받았다. 특히 프론트 같은 경우엔 내가 관심을 가진 분야도 아니었을 뿐더러 미감(..)이 부족한 편이라 더더욱. GUI를 구성하면서도 자꾸 화면 밖으로 튕겨져 나가고 너무 줄였더니 다른 창이 안 보이기도 하고... 온갖 난리를 겪었다.&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;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/XCXTy/dJMcaayQRlp/xGi9dK5cFv0p3ugZP8tEQK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/XCXTy/dJMcaayQRlp/xGi9dK5cFv0p3ugZP8tEQK/img.png&quot; data-origin-width=&quot;361&quot; data-origin-height=&quot;214&quot; data-is-animation=&quot;false&quot; style=&quot;width: 30.0999%; margin-right: 10px;&quot; data-widthpercent=&quot;30.82&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/XCXTy/dJMcaayQRlp/xGi9dK5cFv0p3ugZP8tEQK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FXCXTy%2FdJMcaayQRlp%2FxGi9dK5cFv0p3ugZP8tEQK%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;361&quot; height=&quot;214&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dfdc6N/dJMcagFRbAJ/1klldS3VkkjvxAhDSKCmt0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dfdc6N/dJMcagFRbAJ/1klldS3VkkjvxAhDSKCmt0/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;366&quot; data-origin-height=&quot;165&quot; data-filename=&quot;image1.png&quot; style=&quot;width: 39.5793%; margin-right: 10px;&quot; data-widthpercent=&quot;40.52&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dfdc6N/dJMcagFRbAJ/1klldS3VkkjvxAhDSKCmt0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdfdc6N%2FdJMcagFRbAJ%2F1klldS3VkkjvxAhDSKCmt0%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;366&quot; height=&quot;165&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bUg44h/dJMcaicBExr/omK8Tks8Pm6tSqWBMYLGu1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bUg44h/dJMcaicBExr/omK8Tks8Pm6tSqWBMYLGu1/img.png&quot; data-origin-width=&quot;364&quot; data-origin-height=&quot;232&quot; data-is-animation=&quot;false&quot; data-filename=&quot;image2.png&quot; style=&quot;width: 27.9953%;&quot; data-widthpercent=&quot;28.66&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bUg44h/dJMcaicBExr/omK8Tks8Pm6tSqWBMYLGu1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbUg44h%2FdJMcaicBExr%2FomK8Tks8Pm6tSqWBMYLGu1%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;364&quot; height=&quot;232&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;24시간을 찍을 뻔 한 모각코&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1338&quot; data-origin-height=&quot;688&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bn1GgX/dJMcahks6A9/KqteFx5FU9Y1vc9EbPqBIk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bn1GgX/dJMcahks6A9/KqteFx5FU9Y1vc9EbPqBIk/img.png&quot; data-alt=&quot;노션&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bn1GgX/dJMcahks6A9/KqteFx5FU9Y1vc9EbPqBIk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbn1GgX%2FdJMcahks6A9%2FKqteFx5FU9Y1vc9EbPqBIk%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;1338&quot; height=&quot;688&quot; data-origin-width=&quot;1338&quot; data-origin-height=&quot;688&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;노션&lt;/figcaption&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;디버깅을 위해 필요한 DB와 더미데이터 생성 쿼리 등등도 이에 포함되었다.&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;AI가 생성해준 뷰에 하드코딩된 부분이 있었는데, 너무 자연스러웠던 탓 에 아무도 좌석 선택 화면에서 DB 값을 불러와 해당 지점의 좌석 수만큼의 좌석을 보여주지 않고 있던 것을 몰랐다. (어느 지점이든 30좌석으로 고정되어 떴다. 31번 좌석부터는 선택이 불가능했던 것.) 그 외에도 자잘한 트러블슈팅 문제가 있었다. 코 딩 테스트 외에도 여기에도 디버깅과 반례 찾아내는 게 중요하구나 느꼈다.&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;학기&amp;nbsp;자프실2에서&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;JDBC&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;br /&gt;&amp;nbsp;시험기간이었지만&amp;nbsp;16시간동안&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;많이&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;최소화해서&amp;nbsp;AI&amp;nbsp;도움을&amp;nbsp;받아&amp;nbsp;만들었는데도&amp;nbsp;시간이&amp;nbsp;만만찮게&amp;nbsp;걸렸다.&amp;nbsp;같은&amp;nbsp;노력을&amp;nbsp;들일&amp;nbsp;거라면&amp;nbsp;나중에는&amp;nbsp;GUI&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;</description>
      <category>Develop/DataBase</category>
      <author>SpruceMoon</author>
      <guid isPermaLink="true">https://dead-end.tistory.com/42</guid>
      <comments>https://dead-end.tistory.com/42#entry42comment</comments>
      <pubDate>Sat, 6 Jun 2026 23:57:38 +0900</pubDate>
    </item>
    <item>
      <title>Fuzzing 기초 1</title>
      <link>https://dead-end.tistory.com/41</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;1. 퍼징 (Fuzzing) 이란&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;524&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sU1E5/dJMcaiDmIbJ/4asvvFdhQWwfFAENdh3uPk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sU1E5/dJMcaiDmIbJ/4asvvFdhQWwfFAENdh3uPk/img.png&quot; data-alt=&quot;출처 : 카이스트 사이버보안연구센터&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sU1E5/dJMcaiDmIbJ/4asvvFdhQWwfFAENdh3uPk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsU1E5%2FdJMcaiDmIbJ%2F4asvvFdhQWwfFAENdh3uPk%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;485&quot; height=&quot;248&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;524&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출처 : 카이스트 사이버보안연구센터&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;- &lt;b&gt;비정상적인 데이터를 계속 던져서 프로그램이 언제 무너지는지 관찰&lt;/b&gt;하는 자동화 테스트&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;- 소프트웨어에 무작위이거나 의도적으로 Invalid/Unexpected data를 지속적으로 주입하는 테스팅 기법&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;- 이렇게 해서 약간 예외 사항이나 알고리즘으로 치면 &lt;u&gt;반례 같은 걸 찾아내는 과정&lt;/u&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; &amp;nbsp;- 엣지 케이스 :: 개발자 측면에선 최소/최대 경계값을 넣어서 테스트할 때 정상 동작하는지 확인하는 거!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;+) 코너 케이스는 뭐냐 -&amp;gt; 엣지 케이스는 만족하는데 외부 변수나 특정 조건에서 문제가 발생하는 경우 ... 약간 집에선 잘 되던 스마트폰이 등산하면 잘 안 터지는 그런 쪽 문제라고 이해했다!&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2. 퍼징 과정&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;1) Seed(초기값) 준비 :: 정상적인 파일을 초기 입력값으로 설정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;2) Mutation(변이) :: Seed 파일 비트나 바이트를 무작위로 뒤집거나 쪼개서 이상한 데이터들을 막 생성해보는 거 (방법론으로는 비트 플립, 바이트 스왑 등이 있다고 함.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;3) Execution(실행) :: 변이된 데이터를 타겟 프로그램에 입력해 실행&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;4) Monitoring(감시) :: 어떻게 돌아가는지 실시간으로 모니터링하기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;5) Logging(기록) :: 만약 크래시가 발생했다면 그 크래시를 유발한 정확한 입력 데이터를 별도로 저장 (추후 분석 및 디버깅에 사용)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;- 방법 자체는 간단하다!&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3. 퍼징의 종류&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;1) 블랙박스 퍼징 :: 내부 코드 모르는 상태로 입출력만 조작 (속도 빠름, 얕은 버그 탐지 유리)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;2) 화이트박스 퍼징 :: 소스코드 완벽 분석 + Symbolic Execution 등을 사용 (속도 느림, 깊숙한 코드 라인까지 도달, 분석에 연산량 多)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;3) &lt;b&gt;그레이박스 퍼징&lt;/b&gt; :: 블 + 화 합친 것. 코드를 완벽 분석까지는 아니어도 프로그램이 실행되는 경로는 추적함.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; ㄴ 이게 요즘 가장 많이 쓰이며, &lt;b&gt;AFL (American Fuzzy Lop) &lt;/b&gt;이 대표적.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;4. 커버리지 기반 퍼징 (Coverage-Guided Fuzzing)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;- &lt;b&gt;코드 커버리지 (Code Coverage)&lt;/b&gt; :: 프로그램 실행 시 전체 소스코드 중 어느 부분이 실행되었는지 나타내는 지표&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;- 어떻게 쓰는가 :: A 데이터 넣었을 때 이전에 안 가봤던 새로운 코드 경로가 나오면 그 A 데이터를 '좋은 시드'로 승격&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;- '좋은 시드'를 바탕으로 다시 변이가 진행 -&amp;gt; 프로그램의 로직을 점점 더 깊게 파고들게 됨!&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;5. Sanitizer&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;- 퍼징할 때 꼭 같이 세팅해야 하는 컴파일러 옵션 (GCC, Clang)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;- 필요한 이유? : 메모리 꼬였는데 &lt;u&gt;프로그램이 우연히 안 죽고 버티는 경우 (Silent Bug&lt;/u&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; &amp;nbsp;- 대표적으론 ASan (AddressSanitizer, BOF와 UAF 등의 메모리 침범 버그 특화)와 MSan(MemorySanitizer, 초기화되지 않은 메모리 사용 탐지)가 있다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;6. 퍼징에 대한 추가 팁?&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;1) Harness를 작성하자&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;- &lt;b&gt;하네스(Harness)&lt;/b&gt;는 무엇인가 :: &lt;u&gt;테스트하고 싶은 특정 함수만 따로 떼서&lt;/u&gt; 퍼저가 주는 입력값을 바로 먹일 수 있게 연결해주는 약간.. &lt;u&gt;바로가기 창 같은 걸 만들어주는 껍데기 코드&lt;/u&gt; 같은 것.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;- 하네스를 어떻게 짜느냐에 따라 퍼징의 속도와 질이 달라진다고 함!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;2) 시드를 최소화하자&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;- &lt;b&gt;Corpus&lt;/b&gt; :: 퍼저에게 줄 시드 파일의 묶음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;- 데이터를 최소화해서 작게 여러번 변이시키는 게 버그 확률도 낮고 속도도 빠르다!&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;- AFL 기준으론 두 가지 최소화 기법이 있는데,&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;b&gt;a) cmin (Corpus Minimization)&lt;/b&gt; :: 중복되는 &lt;u&gt;코드 경로&lt;/u&gt;를 실행하는 코드 파일을 걸러냄 (&lt;u&gt;중복 제거&lt;/u&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;b&gt;b) tmin (TestCase Minimization)&lt;/b&gt; :: &lt;u&gt;시드 파일 자체의 크기만 줄이기&lt;/u&gt; (경로는 그대로!)&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;3) 모든 크래시가 보안 취약점은 아님!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;- 크래시가 엄청나게 쌓였을 때도 단순 버그와 치명적 보안 취약점을 구분해낼 줄 알아야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;- &lt;b&gt;Triage&lt;/b&gt; :: 크래시를 유발한 입력값을 디버거에 넣고 돌려보면서 메모리의 어느 주소에서 프로그램이 죽었는지, 분석자가 메모리 값(레지스터 같은)을 조작할 수 있는지 분석하는 것! (매우 중요)&lt;/p&gt;</description>
      <category>Security</category>
      <author>SpruceMoon</author>
      <guid isPermaLink="true">https://dead-end.tistory.com/41</guid>
      <comments>https://dead-end.tistory.com/41#entry41comment</comments>
      <pubDate>Mon, 18 May 2026 19:27:54 +0900</pubDate>
    </item>
    <item>
      <title>[6주차] 뷰, 함수, 프로시져</title>
      <link>https://dead-end.tistory.com/40</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. View&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 뷰 :: 하나 이상의 테이블을 합쳐 만든 가상 테이블 (실제로 저장 X)&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;1.1. 뷰 생성하기&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 실습 : Book 테이블에서 축구라는 문구가 포함된 자료만 보여주는 뷰&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/lAjKu/dJMcad2D8iC/Mc3sFiBw3NF2bhsfoKnzI1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lAjKu/dJMcad2D8iC/Mc3sFiBw3NF2bhsfoKnzI1/img.png&quot; data-origin-width=&quot;475&quot; data-origin-height=&quot;160&quot; data-is-animation=&quot;false&quot; style=&quot;width: 53.4373%; margin-right: 10px;&quot; data-widthpercent=&quot;54.07&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lAjKu/dJMcad2D8iC/Mc3sFiBw3NF2bhsfoKnzI1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlAjKu%2FdJMcad2D8iC%2FMc3sFiBw3NF2bhsfoKnzI1%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;475&quot; height=&quot;160&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mFEbj/dJMcaibTkRn/gHlWMg6uf5IoP5KTHNhWu1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mFEbj/dJMcaibTkRn/gHlWMg6uf5IoP5KTHNhWu1/img.png&quot; data-origin-width=&quot;681&quot; data-origin-height=&quot;270&quot; data-is-animation=&quot;false&quot; data-widthpercent=&quot;45.93&quot; style=&quot;width: 45.3999%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mFEbj/dJMcaibTkRn/gHlWMg6uf5IoP5KTHNhWu1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmFEbj%2FdJMcaibTkRn%2FgHlWMg6uf5IoP5KTHNhWu1%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;681&quot; height=&quot;270&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;refresh하고 다시 보면 view가 생성되어있다!&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;- 뷰 생성문 예제 :: 세 테이블을 조인시켜서 주문 내역을 view로 생성해본다. 안 쓰고 조인 써도 되긴 함..&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;788&quot; data-origin-height=&quot;175&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cgWDrk/dJMcagZmMkr/55sc95PzStoQ3WnlKYU0k0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cgWDrk/dJMcagZmMkr/55sc95PzStoQ3WnlKYU0k0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cgWDrk/dJMcagZmMkr/55sc95PzStoQ3WnlKYU0k0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcgWDrk%2FdJMcagZmMkr%2F55sc95PzStoQ3WnlKYU0k0%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;788&quot; height=&quot;175&quot; data-origin-width=&quot;788&quot; data-origin-height=&quot;175&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;550&quot; data-origin-height=&quot;330&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/FQvUz/dJMcahKLZP7/nCS9myzKSCBzylsGUFJMeK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/FQvUz/dJMcahKLZP7/nCS9myzKSCBzylsGUFJMeK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/FQvUz/dJMcahKLZP7/nCS9myzKSCBzylsGUFJMeK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFQvUz%2FdJMcahKLZP7%2FnCS9myzKSCBzylsGUFJMeK%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;550&quot; height=&quot;330&quot; data-origin-width=&quot;550&quot; data-origin-height=&quot;330&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 실습 : 주소에 대한민국을 포함하는 고객들로 구성된 뷰 생성 후 조회하는 실습&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;558&quot; data-origin-height=&quot;331&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/XqizF/dJMcaiW9Muf/29XgCCq67K6ZlldhIx5B50/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/XqizF/dJMcaiW9Muf/29XgCCq67K6ZlldhIx5B50/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/XqizF/dJMcaiW9Muf/29XgCCq67K6ZlldhIx5B50/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FXqizF%2FdJMcaiW9Muf%2F29XgCCq67K6ZlldhIx5B50%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;558&quot; height=&quot;331&quot; data-origin-width=&quot;558&quot; data-origin-height=&quot;331&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;- 실습 : orders 테이블에서 고객이름과 도서이름을 바로 확인할 수 있는 뷰를 생성하고 김연아 고객이 구입한 도서의 주문번호, 도서이름, 주문액을 나타내기.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;764&quot; data-origin-height=&quot;321&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/t0Fk4/dJMcaduK5a6/kV6Auhajv3hrYXNW9c1bBK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/t0Fk4/dJMcaduK5a6/kV6Auhajv3hrYXNW9c1bBK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/t0Fk4/dJMcaduK5a6/kV6Auhajv3hrYXNW9c1bBK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Ft0Fk4%2FdJMcaduK5a6%2FkV6Auhajv3hrYXNW9c1bBK%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;764&quot; height=&quot;321&quot; data-origin-width=&quot;764&quot; data-origin-height=&quot;321&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;1.2. 뷰 수정/삭제하기&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 실습 : vw_customer 뷰에서 영국을 주소로 가진 고객을 보여주도록 뷰를 수정해보기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;- CREATE VIEW 문에 OR REPLACE 명령을 더하면 수정된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;683&quot; data-origin-height=&quot;299&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/chjnha/dJMcaaETlZK/AZ5AtU5eKiOecKKbGOtspk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/chjnha/dJMcaaETlZK/AZ5AtU5eKiOecKKbGOtspk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/chjnha/dJMcaaETlZK/AZ5AtU5eKiOecKKbGOtspk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fchjnha%2FdJMcaaETlZK%2FAZ5AtU5eKiOecKKbGOtspk%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;683&quot; height=&quot;299&quot; data-origin-width=&quot;683&quot; data-origin-height=&quot;299&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;- 실습 : vw_customer 뷰 삭제하기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; - DROP VIEW 뷰이름 형식으로 뷰를 삭제할 수 있음. (뷰가 이미 drop으로 지워져서 밑에서 select이 안되는 모습!)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;953&quot; data-origin-height=&quot;502&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/BUJ1c/dJMcahYhP0O/GwqX1v7kx1i6bs3Um3Mdg1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/BUJ1c/dJMcahYhP0O/GwqX1v7kx1i6bs3Um3Mdg1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/BUJ1c/dJMcahYhP0O/GwqX1v7kx1i6bs3Um3Mdg1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBUJ1c%2FdJMcahYhP0O%2FGwqX1v7kx1i6bs3Um3Mdg1%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;704&quot; height=&quot;371&quot; data-origin-width=&quot;953&quot; data-origin-height=&quot;502&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 이외에도 INSERT, UPDATE, DELETE 문으로 뷰를 활용할 수 있음. (근데 기본적으로 읽기전용이라 DISTINCT, GROUP BY 제약이 없을 때만 변경이 가능하단 점 기억하자)&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-ke-size=&quot;size23&quot;&gt;2. 인덱스&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2.1. 인덱스와 B-Tree&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Index :: 데이터를 쉽고 빠르게 찾을 수 있도록 만든 데이터 구조&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; -&amp;nbsp; B-Tree :: 데이터 검색 시간을 단축하기 위한 자료구조로, 비트리의 각 노드는 키 값과 포인터를 가지고 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; - 일반적으로 RDBMS의 index는 대부분 B-Tree 구조로 구성됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; - 테이블에서 한 개 이상의 속성을 이용해 생성할 수 있고, 효율적 레코드 접근 및 적은 공간 차지라는 장점이 있다!'&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2.2. MySQL 인덱스&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- MySQL의 인덱스 = 인덱스 &amp;amp; 보조 인덱스 로 나뉨&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; &amp;nbsp; &amp;nbsp;- &lt;u&gt;테이블당 하나만&lt;/u&gt; 존재하고 키값 정렬이 가능해 범위검색에 유리 (대신 변경/삽입에는 좀 약함)&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; &amp;nbsp; &amp;nbsp;- 데이터 자체를 정렬하지 않고 &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;&amp;nbsp;- 인덱스 남발하면 검색 속도도 느려지고 저장공간도 낭비되니까 속성의 모든 값이 다 다를때, 여러개의 중복값이 없을 때 사용하는 것이 유리하므로 알아서 잘 판단하고 사용할 것!! (unique)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;550&quot; data-origin-height=&quot;242&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/MdyYB/dJMcahRybQ8/0nWXJRn7LxeiCycSBlK7E1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/MdyYB/dJMcahRybQ8/0nWXJRn7LxeiCycSBlK7E1/img.png&quot; data-alt=&quot;실행 계획에서 확인 가능한 내용들 기억하자.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/MdyYB/dJMcahRybQ8/0nWXJRn7LxeiCycSBlK7E1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMdyYB%2FdJMcahRybQ8%2F0nWXJRn7LxeiCycSBlK7E1%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;434&quot; height=&quot;191&quot; data-origin-width=&quot;550&quot; data-origin-height=&quot;242&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;실행 계획에서 확인 가능한 내용들 기억하자.&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;- 실습 : book 테이블의 bookname 열을 대상으로 인덱스 ix_book 을 생성하기&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1140&quot; data-origin-height=&quot;745&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pCNTf/dJMcagyif03/6isd9A7UrDMpakHQegpDXk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pCNTf/dJMcagyif03/6isd9A7UrDMpakHQegpDXk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pCNTf/dJMcagyif03/6isd9A7UrDMpakHQegpDXk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpCNTf%2FdJMcagyif03%2F6isd9A7UrDMpakHQegpDXk%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;1140&quot; height=&quot;745&quot; data-origin-width=&quot;1140&quot; data-origin-height=&quot;745&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;- 실습 : book 테이블의 publisher, price 열을 대상으로 인덱스 ix_book2를 생성하기&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1132&quot; data-origin-height=&quot;701&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/3o773/dJMcai3Usfl/zoGU0p7zzoH7onpnVqLCs1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3o773/dJMcai3Usfl/zoGU0p7zzoH7onpnVqLCs1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3o773/dJMcai3Usfl/zoGU0p7zzoH7onpnVqLCs1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3o773%2FdJMcai3Usfl%2FzoGU0p7zzoH7onpnVqLCs1%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;1132&quot; height=&quot;701&quot; data-origin-width=&quot;1132&quot; data-origin-height=&quot;701&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;- 실습 : 대한미디어 출판사고 3000원 이상인 조건의 인덱스를 생성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;- EXPLAIN :: SQL문 앞에 붙이면 실행계획이 표시된다!&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/blaXak/dJMcacQdw9H/7xysK4wPMIbWVAEamotkL1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/blaXak/dJMcacQdw9H/7xysK4wPMIbWVAEamotkL1/img.png&quot; data-origin-width=&quot;913&quot; data-origin-height=&quot;329&quot; data-is-animation=&quot;false&quot; style=&quot;width: 49.3916%; margin-right: 10px;&quot; data-widthpercent=&quot;49.97&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/blaXak/dJMcacQdw9H/7xysK4wPMIbWVAEamotkL1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FblaXak%2FdJMcacQdw9H%2F7xysK4wPMIbWVAEamotkL1%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;913&quot; height=&quot;329&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zb3V0/dJMcahjIV2D/o5Ep8nn2UdcP7W3GrcZ9pk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zb3V0/dJMcahjIV2D/o5Ep8nn2UdcP7W3GrcZ9pk/img.png&quot; data-origin-width=&quot;914&quot; data-origin-height=&quot;329&quot; data-is-animation=&quot;false&quot; style=&quot;width: 49.4457%;&quot; data-widthpercent=&quot;50.03&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zb3V0/dJMcahjIV2D/o5Ep8nn2UdcP7W3GrcZ9pk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fzb3V0%2FdJMcahjIV2D%2Fo5Ep8nn2UdcP7W3GrcZ9pk%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;914&quot; height=&quot;329&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;- 실습 : book 테이블의 인덱스를 최적화하기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; - B-Tree 인덱스같은 경우엔 수정/삭제/삽입이 자주 일어나면 노드 갱신이 주기적으로 발생 -&amp;gt; 단편화 현상이 나타나므로, ANALYZE (TABLE) 명령어를 통해 인덱스를 다시 재구성하고 생성해주자.&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/UCxNJ/dJMcaax675V/5Ol3l6SiH4HHNfIrVkhabK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/UCxNJ/dJMcaax675V/5Ol3l6SiH4HHNfIrVkhabK/img.png&quot; data-origin-width=&quot;468&quot; data-origin-height=&quot;289&quot; data-is-animation=&quot;false&quot; data-widthpercent=&quot;64.72&quot; style=&quot;width: 63.969%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/UCxNJ/dJMcaax675V/5Ol3l6SiH4HHNfIrVkhabK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FUCxNJ%2FdJMcaax675V%2F5Ol3l6SiH4HHNfIrVkhabK%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;468&quot; height=&quot;289&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/U1Q8A/dJMcabX5egZ/19KgETM6HLgEVDxY7XyvUk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/U1Q8A/dJMcabX5egZ/19KgETM6HLgEVDxY7XyvUk/img.png&quot; data-origin-width=&quot;617&quot; data-origin-height=&quot;699&quot; data-is-animation=&quot;false&quot; style=&quot;width: 34.8682%;&quot; data-widthpercent=&quot;35.28&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/U1Q8A/dJMcabX5egZ/19KgETM6HLgEVDxY7XyvUk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FU1Q8A%2FdJMcabX5egZ%2F19KgETM6HLgEVDxY7XyvUk%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;617&quot; height=&quot;699&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;인덱스 최적화하고 삭제 (안 쓰는 인덱스 삭제 잊지말기!!)&lt;/figcaption&gt;
&lt;/figure&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;2. 함수와 프로시져&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 프로시져 : 선언부와 실행부(begin - end)로 구성되며, 매개변수를 이용해 저장 프로시져가 호출될 때 그 프로시저에 값을 전달함.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;- 여러 SQL문 묶음, 단순 반복업무에 권장&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;599&quot; data-origin-height=&quot;485&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bmb6uX/dJMcahKOrvV/vScnAyYAyJkXov2RCTsmWk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bmb6uX/dJMcahKOrvV/vScnAyYAyJkXov2RCTsmWk/img.png&quot; data-alt=&quot;저장 프로그램의 제어문은 다음과 같음.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bmb6uX/dJMcahKOrvV/vScnAyYAyJkXov2RCTsmWk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbmb6uX%2FdJMcahKOrvV%2FvScnAyYAyJkXov2RCTsmWk%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;368&quot; height=&quot;298&quot; data-origin-width=&quot;599&quot; data-origin-height=&quot;485&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;저장 프로그램의 제어문은 다음과 같음.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- DELIMITER 실습 :: 뒤에 오는 기호는 마음대로 정해도 됨. 구문의 종료 기호를 설정하는 명령어!&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;369&quot; data-origin-height=&quot;277&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bZDYDI/dJMcadasBPg/f0ceJbb12zk5vNEkdBE6sK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bZDYDI/dJMcadasBPg/f0ceJbb12zk5vNEkdBE6sK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bZDYDI/dJMcadasBPg/f0ceJbb12zk5vNEkdBE6sK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbZDYDI%2FdJMcadasBPg%2Ff0ceJbb12zk5vNEkdBE6sK%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;369&quot; height=&quot;277&quot; data-origin-width=&quot;369&quot; data-origin-height=&quot;277&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;b&gt;트리거&lt;/b&gt; :: 테이블에 대해 특정 동작(insert, update, delete)이 수행될 때 자동으로 실행되는 저장된 프로그램&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;- 특정 이벤트 발생할 때 자동 실행 (다만 예측 불가능한 성능 저하 문제 존재)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; - person 테이블에 새로운 행 삽입될 때 같은 이름이 이미 존재하면 로그 테이블에 기록하는 트리거 실습&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;866&quot; data-origin-height=&quot;472&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/3du4b/dJMcafGbACa/ErX79FnUjQPhVS2NfsW7kK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3du4b/dJMcafGbACa/ErX79FnUjQPhVS2NfsW7kK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3du4b/dJMcafGbACa/ErX79FnUjQPhVS2NfsW7kK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3du4b%2FdJMcafGbACa%2FErX79FnUjQPhVS2NfsW7kK%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;695&quot; height=&quot;379&quot; data-origin-width=&quot;866&quot; data-origin-height=&quot;472&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;622&quot; data-origin-height=&quot;174&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/z3WQn/dJMcadO4b6z/KM5lOto10fwsZbaQRnF9w0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/z3WQn/dJMcadO4b6z/KM5lOto10fwsZbaQRnF9w0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/z3WQn/dJMcadO4b6z/KM5lOto10fwsZbaQRnF9w0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fz3WQn%2FdJMcadO4b6z%2FKM5lOto10fwsZbaQRnF9w0%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;622&quot; height=&quot;174&quot; data-origin-width=&quot;622&quot; data-origin-height=&quot;174&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;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rFJu0/dJMcaduK9FG/BEUTTMD7nBCulwueK9Q7Tk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rFJu0/dJMcaduK9FG/BEUTTMD7nBCulwueK9Q7Tk/img.png&quot; style=&quot;width: 58.7953%; margin-right: 10px;&quot; data-widthpercent=&quot;59.49&quot; data-is-animation=&quot;false&quot; data-origin-height=&quot;230&quot; data-origin-width=&quot;525&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rFJu0/dJMcaduK9FG/BEUTTMD7nBCulwueK9Q7Tk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrFJu0%2FdJMcaduK9FG%2FBEUTTMD7nBCulwueK9Q7Tk%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;525&quot; height=&quot;230&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bUBQVd/dJMcafGbzy1/r3fDFeAXNfYMZMkLBqNJTK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bUBQVd/dJMcafGbzy1/r3fDFeAXNfYMZMkLBqNJTK/img.png&quot; data-origin-width=&quot;513&quot; data-origin-height=&quot;330&quot; data-is-animation=&quot;false&quot; data-widthpercent=&quot;40.51&quot; style=&quot;width: 40.0419%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bUBQVd/dJMcafGbzy1/r3fDFeAXNfYMZMkLBqNJTK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbUBQVd%2FdJMcafGbzy1%2Fr3fDFeAXNfYMZMkLBqNJTK%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;513&quot; height=&quot;330&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;테이블 생성&lt;/figcaption&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/emPOEb/dJMcaaLDQyE/8JVAQyyZKBsDa9AWgYL7lK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/emPOEb/dJMcaaLDQyE/8JVAQyyZKBsDa9AWgYL7lK/img.png&quot; data-origin-width=&quot;397&quot; data-origin-height=&quot;401&quot; data-is-animation=&quot;false&quot; style=&quot;width: 56.7561%; margin-right: 10px;&quot; data-widthpercent=&quot;57.42&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/emPOEb/dJMcaaLDQyE/8JVAQyyZKBsDa9AWgYL7lK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FemPOEb%2FdJMcaaLDQyE%2F8JVAQyyZKBsDa9AWgYL7lK%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;397&quot; height=&quot;401&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/PIG3J/dJMcaaY9StW/Dvszq6oyGfwEtXkk9UbOpK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/PIG3J/dJMcaaY9StW/Dvszq6oyGfwEtXkk9UbOpK/img.png&quot; data-is-animation=&quot;false&quot; data-origin-height=&quot;564&quot; data-origin-width=&quot;414&quot; style=&quot;width: 42.0811%;&quot; data-widthpercent=&quot;42.58&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/PIG3J/dJMcaaY9StW/Dvszq6oyGfwEtXkk9UbOpK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPIG3J%2FdJMcaaY9StW%2FDvszq6oyGfwEtXkk9UbOpK%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;414&quot; height=&quot;564&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;+) 함수는 information 스키마에 저장됨&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;3. JDBC 기본&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- JDB를 설치하고 이클립스와 연동한다&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;648&quot; data-origin-height=&quot;471&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GoYUB/dJMcabRkX3P/EhUP4g7EVm2pKZTYgg61G0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GoYUB/dJMcabRkX3P/EhUP4g7EVm2pKZTYgg61G0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GoYUB/dJMcabRkX3P/EhUP4g7EVm2pKZTYgg61G0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGoYUB%2FdJMcabRkX3P%2FEhUP4g7EVm2pKZTYgg61G0%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;400&quot; height=&quot;291&quot; data-origin-width=&quot;648&quot; data-origin-height=&quot;471&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;-&amp;nbsp; Vscode를 사용해보고 싶었어서 vscode로 JDBC를 연동해보았다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1473&quot; data-origin-height=&quot;958&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bmRGy2/dJMcafM0WO9/u14e4n0kS2l1TK1vvxx7kk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bmRGy2/dJMcafM0WO9/u14e4n0kS2l1TK1vvxx7kk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bmRGy2/dJMcafM0WO9/u14e4n0kS2l1TK1vvxx7kk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbmRGy2%2FdJMcafM0WO9%2Fu14e4n0kS2l1TK1vvxx7kk%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;1473&quot; height=&quot;958&quot; data-origin-width=&quot;1473&quot; data-origin-height=&quot;958&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 아래처럼 JAVA PROJECTS 부분에 referenced libaries에 + 버튼을 눌러서 설치한 jdbc 드라이버를 연동할 수 있었다.&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;4. DAO, DTO, SOLID 기본개념&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- DAO (Data Access Object) :: DB 데이터에 접근하기 위한 전용 객체 / 비즈니스 로직과 DB 연동 로직 분리를 위해 사용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- DTO (Data Transfer Object) :: 계층 간 데이터를 교환 위한 객체 / 별도의 로직 없이 데이터(getter/setter)만 포함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- SOLID 원칙 ::&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; - 단일 책임 원칙(SRP)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; - 개방-폐쇄 원칙(OCP) &lt;br /&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; -&lt;span&gt; &lt;/span&gt;&lt;/span&gt;리스코프 치환 원칙(LSP) &lt;br /&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; -&lt;span&gt; &lt;/span&gt;&lt;/span&gt;인터페이스 분리 원칙(ISP) &lt;br /&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; -&lt;/span&gt; 의존 역전 원칙(DIP)&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;br /&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>Develop/DataBase</category>
      <author>SpruceMoon</author>
      <guid isPermaLink="true">https://dead-end.tistory.com/40</guid>
      <comments>https://dead-end.tistory.com/40#entry40comment</comments>
      <pubDate>Sat, 11 Apr 2026 23:58:35 +0900</pubDate>
    </item>
    <item>
      <title>[5주차] SQL 고급 쿼리</title>
      <link>https://dead-end.tistory.com/39</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. SQL 내장함수, NULL, 비교문&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- SQL에도 내장함수가 있다. 상수나 속성 이름을 입력값으로 받아 단일 값을 결과로 반환한다는 특징이 있음.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;550&quot; data-origin-height=&quot;369&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CfZ8D/dJMcahjF4Dc/phPeDUeNkKcNGQKJIOetr1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CfZ8D/dJMcahjF4Dc/phPeDUeNkKcNGQKJIOetr1/img.png&quot; data-alt=&quot;주요 내장 함수는 이 정도 된다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CfZ8D/dJMcahjF4Dc/phPeDUeNkKcNGQKJIOetr1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCfZ8D%2FdJMcahjF4Dc%2FphPeDUeNkKcNGQKJIOetr1%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;550&quot; height=&quot;369&quot; data-origin-width=&quot;550&quot; data-origin-height=&quot;369&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;주요 내장 함수는 이 정도 된다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1.1 숫자 함수&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;-&lt;b&gt; 질의 :&lt;/b&gt; +78과 -78의 절댓값 구하기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; - 절댓값을 구하는 ABS() 함수를 이용한다&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;380&quot; data-origin-height=&quot;327&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cMWd5F/dJMcabRcWop/JhIXxiaKplgMGpAcrxKZZk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cMWd5F/dJMcabRcWop/JhIXxiaKplgMGpAcrxKZZk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cMWd5F/dJMcabRcWop/JhIXxiaKplgMGpAcrxKZZk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcMWd5F%2FdJMcabRcWop%2FJhIXxiaKplgMGpAcrxKZZk%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;293&quot; height=&quot;252&quot; data-origin-width=&quot;380&quot; data-origin-height=&quot;327&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 질의 : 4.875를 소수 첫째 자리까지 반올림한 값을 구하시오.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;- ROUND() 함수를 통해 반올림한 값을 구할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 아래처럼 ROUND를 이용해서 소수아래자릿수와 소수점 윗자리수를 다 분해해볼 수도 있다.&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/usl6j/dJMcafF5Yqa/Qe3CQ9ooFyoIJ89HnKYBa1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/usl6j/dJMcafF5Yqa/Qe3CQ9ooFyoIJ89HnKYBa1/img.png&quot; data-origin-width=&quot;291&quot; data-origin-height=&quot;287&quot; data-is-animation=&quot;false&quot; style=&quot;width: 27.4245%; margin-right: 10px;&quot; data-widthpercent=&quot;27.75&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/usl6j/dJMcafF5Yqa/Qe3CQ9ooFyoIJ89HnKYBa1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fusl6j%2FdJMcafF5Yqa%2FQe3CQ9ooFyoIJ89HnKYBa1%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;291&quot; height=&quot;287&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bSwBb4/dJMcabcAHMc/jZTFwuThFmllwCYF3Dunh1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bSwBb4/dJMcabcAHMc/jZTFwuThFmllwCYF3Dunh1/img.png&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;303&quot; data-is-animation=&quot;false&quot; data-widthpercent=&quot;72.25&quot; style=&quot;width: 71.4127%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bSwBb4/dJMcabcAHMc/jZTFwuThFmllwCYF3Dunh1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbSwBb4%2FdJMcabcAHMc%2FjZTFwuThFmllwCYF3Dunh1%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;800&quot; height=&quot;303&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-origin-width=&quot;805&quot; data-origin-height=&quot;324&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cO56In/dJMcaiW4ndJ/Pqgn1A8UN65sDmaU6wI3Ek/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cO56In/dJMcaiW4ndJ/Pqgn1A8UN65sDmaU6wI3Ek/img.png&quot; data-alt=&quot;음수가 들어오면 자릿수대로 보여준다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cO56In/dJMcaiW4ndJ/Pqgn1A8UN65sDmaU6wI3Ek/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcO56In%2FdJMcaiW4ndJ%2FPqgn1A8UN65sDmaU6wI3Ek%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;805&quot; height=&quot;324&quot; data-origin-width=&quot;805&quot; data-origin-height=&quot;324&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;음수가 들어오면 자릿수대로 보여준다.&lt;/figcaption&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; &amp;nbsp;- REPLACE() 함수를 이용해 문자열을 치환할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;779&quot; data-origin-height=&quot;623&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/myiaL/dJMcahDSwm1/36oomEalwI4OXc3BfM0WxK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/myiaL/dJMcahDSwm1/36oomEalwI4OXc3BfM0WxK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/myiaL/dJMcahDSwm1/36oomEalwI4OXc3BfM0WxK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmyiaL%2FdJMcahDSwm1%2F36oomEalwI4OXc3BfM0WxK%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;608&quot; height=&quot;486&quot; data-origin-width=&quot;779&quot; data-origin-height=&quot;623&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;- LENGTH() 는 바이트 수를 가져오는 함수이고, CHAR_LENGTH() 함수는 문자의 수를 가져오는 함수다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;739&quot; data-origin-height=&quot;452&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/AxZ5M/dJMcagycJEd/MQebSZtVeJUlLLr7BExs61/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/AxZ5M/dJMcagycJEd/MQebSZtVeJUlLLr7BExs61/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/AxZ5M/dJMcagycJEd/MQebSZtVeJUlLLr7BExs61/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAxZ5M%2FdJMcagycJEd%2FMQebSZtVeJUlLLr7BExs61%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;578&quot; height=&quot;354&quot; data-origin-width=&quot;739&quot; data-origin-height=&quot;452&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;- repeat() 함수를 이용해서 강다니엘처럼 이름이 세 글자 이상인 경우 중간 글자 수만큼 *를 붙일 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;- 한 글자인 경우에는 CASE WHEN을 사용한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;855&quot; data-origin-height=&quot;289&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zHqOn/dJMcaiJxisb/HZ3Wf8yl9jmkKni9ibOa7K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zHqOn/dJMcaiJxisb/HZ3Wf8yl9jmkKni9ibOa7K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zHqOn/dJMcaiJxisb/HZ3Wf8yl9jmkKni9ibOa7K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzHqOn%2FdJMcaiJxisb%2FHZ3Wf8yl9jmkKni9ibOa7K%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;855&quot; height=&quot;289&quot; data-origin-width=&quot;855&quot; data-origin-height=&quot;289&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 날짜, 시간 함수는 아래와 같은 종류가 있음.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;- 날짜와 시간 부분을 나타내는 인수는 'format'으로 표기하고, format은 날짜 형식 지정자로 특별한 규칙이 있다!&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;465&quot; data-origin-height=&quot;322&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ZXGdh/dJMb99TrfRN/iP5yL77kjQmZm8uctY1iG1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ZXGdh/dJMb99TrfRN/iP5yL77kjQmZm8uctY1iG1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ZXGdh/dJMb99TrfRN/iP5yL77kjQmZm8uctY1iG1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZXGdh%2FdJMb99TrfRN%2FiP5yL77kjQmZm8uctY1iG1%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;465&quot; height=&quot;322&quot; data-origin-width=&quot;465&quot; data-origin-height=&quot;322&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; &amp;nbsp;- DBMS별로 서로 이름도 동작도 의미도 달라서 잘 보고 써야 함.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;-&amp;nbsp; NOW() 등은 DB서버의 타임존을 기준으로 하고 있어서 서버와 사용자가 다른 지역에 있으면 시간이 다르게 나옴..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;- 날짜 컬럼이 NULL이면 함수 적용 시 에러가 발생하므로 기본값을 꼭 지정해야함!!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;- SELECT에서 조회용으로 사용만 하고, 웬만해선 WHERE, JOIN, ORDER BY 같은 데서는 함수로 속성을 변환하지 말아야 한다!&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;- 질의 : 마당서점은 주문일로부터 10일 후에 매출을 확정한다. 각 주문의 확정일자를 구하시오.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;- ADDDATE : 지정한 날짜에 day 또는 interval을 더해 새로운 날짜를 반환하는 함수&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;620&quot; data-origin-height=&quot;535&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/USFNk/dJMcaibLlO0/t050oXxM4vWF8vhopR3YrK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/USFNk/dJMcaibLlO0/t050oXxM4vWF8vhopR3YrK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/USFNk/dJMcaibLlO0/t050oXxM4vWF8vhopR3YrK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FUSFNk%2FdJMcaibLlO0%2Ft050oXxM4vWF8vhopR3YrK%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;439&quot; height=&quot;379&quot; data-origin-width=&quot;620&quot; data-origin-height=&quot;535&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- format의 주요 지정자도 신경쓸 필요가 있음. 아래 표를 참고할 것...&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/1ywUF/dJMcabRfC4w/QgHZ512ifwREtC7FlLxGSK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/1ywUF/dJMcabRfC4w/QgHZ512ifwREtC7FlLxGSK/img.png&quot; data-origin-width=&quot;510&quot; data-origin-height=&quot;212&quot; data-is-animation=&quot;false&quot; style=&quot;width: 64.0643%; margin-right: 10px;&quot; data-widthpercent=&quot;64.82&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/1ywUF/dJMcabRfC4w/QgHZ512ifwREtC7FlLxGSK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F1ywUF%2FdJMcabRfC4w%2FQgHZ512ifwREtC7FlLxGSK%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;510&quot; height=&quot;212&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cAnYzk/dJMcaaY4f4S/RW4K4GORAGRTfmnJkPQoYk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cAnYzk/dJMcaaY4f4S/RW4K4GORAGRTfmnJkPQoYk/img.png&quot; data-origin-width=&quot;568&quot; data-origin-height=&quot;435&quot; data-is-animation=&quot;false&quot; data-widthpercent=&quot;35.18&quot; style=&quot;width: 34.7729%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cAnYzk/dJMcaaY4f4S/RW4K4GORAGRTfmnJkPQoYk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcAnYzk%2FdJMcaaY4f4S%2FRW4K4GORAGRTfmnJkPQoYk%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;435&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;- 질의 : 마당서점이 2024년 7월 7일에 주문받은 도서의 주문번호, 주문일, 고객번호, 도서번호를 모두 나타내시오. 단, 주문일은 %Y-%m-%d 형태로 표시한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;- SRT_TO_DATE :: char형으로 저장된 날짜를 date 형으로 변환&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;- DATE_FORMAT :: 날짜형을 문자형으로 변환&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;665&quot; data-origin-height=&quot;554&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/TwP1e/dJMcafF50de/H9Tqhof5BkMs87ilwjFR9k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/TwP1e/dJMcafF50de/H9Tqhof5BkMs87ilwjFR9k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/TwP1e/dJMcafF50de/H9Tqhof5BkMs87ilwjFR9k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTwP1e%2FdJMcafF50de%2FH9Tqhof5BkMs87ilwjFR9k%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;522&quot; height=&quot;435&quot; data-origin-width=&quot;665&quot; data-origin-height=&quot;554&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;- 질의 : DBMS 서버에 설정된 현재 날짜와 시간, 요일을 확인하시오.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; - SYSDATE() :: MySQL DB에 설정된 현재 날짜와 시간을 반환&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;662&quot; data-origin-height=&quot;344&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yX3bI/dJMcahRsYQ4/JNcXb1jrv7ToxcTAJ5KZL0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yX3bI/dJMcahRsYQ4/JNcXb1jrv7ToxcTAJ5KZL0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yX3bI/dJMcahRsYQ4/JNcXb1jrv7ToxcTAJ5KZL0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyX3bI%2FdJMcahRsYQ4%2FJNcXb1jrv7ToxcTAJ5KZL0%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;566&quot; height=&quot;294&quot; data-origin-width=&quot;662&quot; data-origin-height=&quot;344&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1.2. NULL 값 처리&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- NULL 값은 비교 연산자로 비교 불가하며 아직 지정되지 않은 값을 뜻한다. (값도 없고 적용도 안되고)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 모든 NULL 연산에 대한 결과는 NULL이다.&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; &amp;nbsp;- IFNULL 함수를 이용 -&amp;gt; NULL 값을 다른 값으로 대치하여 연산하거나 다른 값으로 출력&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;559&quot; data-origin-height=&quot;437&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uaQ2Y/dJMcadheJ6e/xBEJublskJYqHJUzYNyIi0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uaQ2Y/dJMcadheJ6e/xBEJublskJYqHJUzYNyIi0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uaQ2Y/dJMcadheJ6e/xBEJublskJYqHJUzYNyIi0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuaQ2Y%2FdJMcadheJ6e%2FxBEJublskJYqHJUzYNyIi0%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;405&quot; height=&quot;317&quot; data-origin-width=&quot;559&quot; data-origin-height=&quot;437&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 질의 : 고객 목록에서 고객번호, 이름, 전화번호를 앞의 2명만 나타내시오.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;- 참고로 MySQL에서는 변수는 @ 기호를 붙여서 표기하고 치환문에는 SET 과 := 기호를 사용함.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;482&quot; data-origin-height=&quot;316&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lBoW9/dJMcahxb1Ov/UHVVXLHvIKhUqzHtzSagtk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lBoW9/dJMcahxb1Ov/UHVVXLHvIKhUqzHtzSagtk/img.png&quot; data-alt=&quot;limit 2를 사용하면 순번 없이 2개의 튜플만 출력된다&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lBoW9/dJMcahxb1Ov/UHVVXLHvIKhUqzHtzSagtk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlBoW9%2FdJMcahxb1Ov%2FUHVVXLHvIKhUqzHtzSagtk%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;416&quot; height=&quot;273&quot; data-origin-width=&quot;482&quot; data-origin-height=&quot;316&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;limit 2를 사용하면 순번 없이 2개의 튜플만 출력된다&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- CASE WHEN 실습&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;476&quot; data-origin-height=&quot;511&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bC5qBi/dJMcabwWyIu/TqDtAMY9iHGVj2KMIUmpH1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bC5qBi/dJMcabwWyIu/TqDtAMY9iHGVj2KMIUmpH1/img.png&quot; data-alt=&quot;도서 가격에 따라 카테고리 분류하기&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bC5qBi/dJMcabwWyIu/TqDtAMY9iHGVj2KMIUmpH1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbC5qBi%2FdJMcabwWyIu%2FTqDtAMY9iHGVj2KMIUmpH1%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;362&quot; height=&quot;389&quot; data-origin-width=&quot;476&quot; data-origin-height=&quot;511&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;도서 가격에 따라 카테고리 분류하기&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;708&quot; data-origin-height=&quot;304&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/SQGAA/dJMcacvTpbe/sOknBtuZNK1KoKvIeJSu9k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/SQGAA/dJMcacvTpbe/sOknBtuZNK1KoKvIeJSu9k/img.png&quot; data-alt=&quot;집계 함수와 함께 연도별 매출 따로 합산하기&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/SQGAA/dJMcacvTpbe/sOknBtuZNK1KoKvIeJSu9k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FSQGAA%2FdJMcacvTpbe%2FsOknBtuZNK1KoKvIeJSu9k%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;533&quot; height=&quot;229&quot; data-origin-width=&quot;708&quot; data-origin-height=&quot;304&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;집계 함수와 함께 연도별 매출 따로 합산하기&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;688&quot; data-origin-height=&quot;334&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cand8q/dJMcadnYBP6/WWpMSH59rmYcDYj2gIzKS0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cand8q/dJMcadnYBP6/WWpMSH59rmYcDYj2gIzKS0/img.png&quot; data-alt=&quot;월별 매출 합계를 금액 구간으로 분류하기&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cand8q/dJMcadnYBP6/WWpMSH59rmYcDYj2gIzKS0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcand8q%2FdJMcadnYBP6%2FWWpMSH59rmYcDYj2gIzKS0%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;538&quot; height=&quot;261&quot; data-origin-width=&quot;688&quot; data-origin-height=&quot;334&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;월별 매출 합계를 금액 구간으로 분류하기&lt;/figcaption&gt;
&lt;/figure&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;2. 부속질의&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 부속질의란 : 하나의 SQL 문 안에 다른 SQL문이 중첩된 질의&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;393&quot; data-origin-height=&quot;179&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bV6NvH/dJMcaaEQu2F/QZpfXSsLPAMfvy3h4gsTq1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bV6NvH/dJMcaaEQu2F/QZpfXSsLPAMfvy3h4gsTq1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bV6NvH/dJMcaaEQu2F/QZpfXSsLPAMfvy3h4gsTq1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbV6NvH%2FdJMcaaEQu2F%2FQZpfXSsLPAMfvy3h4gsTq1%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;305&quot; height=&quot;139&quot; data-origin-width=&quot;393&quot; data-origin-height=&quot;179&quot;/&gt;&lt;/span&gt;&lt;/figure&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; &amp;nbsp;- 클린코드나 가독성은 join이 좋다고는 하지만 쿼리가 좀 더러워도 실무적으론 속도가 빠르면 부속질의를 쓰는 게 낫다고 함..&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;522&quot; data-origin-height=&quot;146&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vuPU2/dJMcaakwaGc/vQdVoEPrWn8NroYf0kFV2k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vuPU2/dJMcaakwaGc/vQdVoEPrWn8NroYf0kFV2k/img.png&quot; data-alt=&quot;부속질의의 종류&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vuPU2/dJMcaakwaGc/vQdVoEPrWn8NroYf0kFV2k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvuPU2%2FdJMcaakwaGc%2FvQdVoEPrWn8NroYf0kFV2k%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;472&quot; height=&quot;132&quot; data-origin-width=&quot;522&quot; data-origin-height=&quot;146&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;부속질의의 종류&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; &amp;nbsp; - WHERE 부속질의 이용 (비교 연산자나 IN, NOT IN, 등의 연산자를 사용)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;663&quot; data-origin-height=&quot;425&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/UCsMf/dJMcajaEwY1/HNsdko9xb6CzC5d2Gofhz1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/UCsMf/dJMcajaEwY1/HNsdko9xb6CzC5d2Gofhz1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/UCsMf/dJMcajaEwY1/HNsdko9xb6CzC5d2Gofhz1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FUCsMf%2FdJMcajaEwY1%2FHNsdko9xb6CzC5d2Gofhz1%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;488&quot; height=&quot;313&quot; data-origin-width=&quot;663&quot; data-origin-height=&quot;425&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; &amp;nbsp;- IN, NOT IN 등의 집합 연산자를 이용하자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;- IN : 주질의의 속성값이 부속질의에서 제공한 결과 집합에 있는지 확인하는 역할을 함&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;710&quot; data-origin-height=&quot;338&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/n6XRT/dJMcadO1f7T/R7fCykEYUobR9xpvpkjuD0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/n6XRT/dJMcadO1f7T/R7fCykEYUobR9xpvpkjuD0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/n6XRT/dJMcadO1f7T/R7fCykEYUobR9xpvpkjuD0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fn6XRT%2FdJMcadO1f7T%2FR7fCykEYUobR9xpvpkjuD0%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;542&quot; height=&quot;258&quot; data-origin-width=&quot;710&quot; data-origin-height=&quot;338&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 질의 : 3번 고객이 주문한 도서의 최고 금액보다 더 비싼 도서를 구입한 주문의 주문번호와 판매금액을 보이시오.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;- ALL, SOME/ANY 한정 연산자를 사용&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;632&quot; data-origin-height=&quot;373&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Xlosk/dJMcahqqdtu/X0MPHSnJiqv8EQZg9i4dt0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Xlosk/dJMcahqqdtu/X0MPHSnJiqv8EQZg9i4dt0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Xlosk/dJMcahqqdtu/X0MPHSnJiqv8EQZg9i4dt0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FXlosk%2FdJMcahqqdtu%2FX0MPHSnJiqv8EQZg9i4dt0%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;326&quot; data-origin-width=&quot;632&quot; data-origin-height=&quot;373&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 질의 : EXISTS 연산자를 사용하여 대한민국에 거주하는 고객에게 판매한 도서의 총판매액을 구하시오.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;- EXISTS : 데이터의 존재 여부를 확인하는 연산자&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;767&quot; data-origin-height=&quot;322&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cN1qqc/dJMcajhpQ69/9U4Hk1uYkbVaLz7g3Dxom1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cN1qqc/dJMcajhpQ69/9U4Hk1uYkbVaLz7g3Dxom1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cN1qqc/dJMcajhpQ69/9U4Hk1uYkbVaLz7g3Dxom1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcN1qqc%2FdJMcajhpQ69%2F9U4Hk1uYkbVaLz7g3Dxom1%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;686&quot; height=&quot;288&quot; data-origin-width=&quot;767&quot; data-origin-height=&quot;322&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;- 스칼라 부속질의 활용 -&amp;gt; 부속질의의 결과값을 단일행, 단일열의 스칼라 값으로 반환 (다중행/열이라면 에러, 없으면 NULL)&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/dYAu4M/dJMcajn9ocd/U9ltx6WftOCvO5p9q79xdk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dYAu4M/dJMcajn9ocd/U9ltx6WftOCvO5p9q79xdk/img.png&quot; data-origin-width=&quot;572&quot; data-origin-height=&quot;410&quot; data-is-animation=&quot;false&quot; width=&quot;490&quot; height=&quot;351&quot; data-widthpercent=&quot;49.53&quot; style=&quot;width: 48.9546%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dYAu4M/dJMcajn9ocd/U9ltx6WftOCvO5p9q79xdk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdYAu4M%2FdJMcajn9ocd%2FU9ltx6WftOCvO5p9q79xdk%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;572&quot; height=&quot;410&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cprlgH/dJMcagLMwR7/AL6uPniJdys6ZHPCRVVRP1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cprlgH/dJMcagLMwR7/AL6uPniJdys6ZHPCRVVRP1/img.png&quot; data-origin-width=&quot;580&quot; data-origin-height=&quot;408&quot; data-is-animation=&quot;false&quot; data-widthpercent=&quot;50.47&quot; style=&quot;width: 49.8826%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cprlgH/dJMcagLMwR7/AL6uPniJdys6ZHPCRVVRP1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcprlgH%2FdJMcagLMwR7%2FAL6uPniJdys6ZHPCRVVRP1%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;580&quot; height=&quot;408&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;- 질의 : orders 테이블에 각 주문에 맞는 도서이름을 입력하시오&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;- SELECT 부속질의 :: 스칼라 부속질의를 사용해 orders 테이블에 새로운 속성인 도서이름 bname을 추가&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/buJoG8/dJMcafTFPAu/zfqUnziKQomSA82I5G30y0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/buJoG8/dJMcafTFPAu/zfqUnziKQomSA82I5G30y0/img.png&quot; data-origin-width=&quot;685&quot; data-origin-height=&quot;150&quot; data-is-animation=&quot;false&quot; style=&quot;width: 65.9211%; margin-right: 10px;&quot; data-widthpercent=&quot;66.7&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/buJoG8/dJMcafTFPAu/zfqUnziKQomSA82I5G30y0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbuJoG8%2FdJMcafTFPAu%2FzfqUnziKQomSA82I5G30y0%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;150&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zbL6f/dJMcah41Ijd/BCOay4JZejN7RewMrkh94K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zbL6f/dJMcah41Ijd/BCOay4JZejN7RewMrkh94K/img.png&quot; data-origin-width=&quot;716&quot; data-origin-height=&quot;314&quot; data-is-animation=&quot;false&quot; data-widthpercent=&quot;33.3&quot; style=&quot;width: 32.9161%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zbL6f/dJMcah41Ijd/BCOay4JZejN7RewMrkh94K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzbL6f%2FdJMcah41Ijd%2FBCOay4JZejN7RewMrkh94K%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;716&quot; height=&quot;314&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;- 질의 : 고객번호가 2 이하인 고객의 판매액을 나타내시오.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;- FROM 부속질의 :: 뷰(기존 테이블로부터 일시적으로 만들어진 가상테이블) 이용&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;635&quot; data-origin-height=&quot;372&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/N9QaT/dJMcadVNS5h/ztNYXtO8uCoPy5WY9OvJT1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/N9QaT/dJMcadVNS5h/ztNYXtO8uCoPy5WY9OvJT1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/N9QaT/dJMcadVNS5h/ztNYXtO8uCoPy5WY9OvJT1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FN9QaT%2FdJMcadVNS5h%2FztNYXtO8uCoPy5WY9OvJT1%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;505&quot; height=&quot;296&quot; data-origin-width=&quot;635&quot; data-origin-height=&quot;372&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;2.1. CTE (Common Table Expression, WITH)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- WITH CTE명 AS (SELECT ...)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 복잡한 SQL 쿼리 내에서 일시적인 결과 집합(임시 테이블)을 정의하여 가독성을 높이고 쿼리를 구조화함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 쿼리 실행 시에만 존재하며 DB에 영구적으로 저장되지 않음&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;693&quot; data-origin-height=&quot;409&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cerNz6/dJMcagSxv2U/4jXvX7zHs65lKHUBXkoHM1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cerNz6/dJMcagSxv2U/4jXvX7zHs65lKHUBXkoHM1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cerNz6/dJMcagSxv2U/4jXvX7zHs65lKHUBXkoHM1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcerNz6%2FdJMcagSxv2U%2F4jXvX7zHs65lKHUBXkoHM1%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;693&quot; height=&quot;409&quot; data-origin-width=&quot;693&quot; data-origin-height=&quot;409&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- SQL 윈도우 함수 :: 테이블의 행과 행 간의 관계를 정의하여 데이터를 윈도우로 그룹화해 사용하는 함수&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3. SQL 문제풀이&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 특정 날짜의 게시글을 조회하고, 영문 거래 상태를 한글로 변환하는 문제였음.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- CASE WHEN을 사용해서 세 상태를 각각 판매중 예약중 거래완료 이렇게 바꾸어 출력한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- date_format으로 날짜를 원하는 형태로 만들어서 비교한다!&lt;/p&gt;
&lt;pre id=&quot;code_1775305979659&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT BOARD_ID, WRITER_ID, TITLE, PRICE, 
CASE STATUS
WHEN 'SALE' THEN '판매중' WHEN 'RESERVED' THEN '예약중' WHEN 'DONE' THEN '거래완료'
END AS STATUS
FROM USED_GOODS_BOARD
WHERE DATE_FORMAT(CREATED_DATE, '%Y-%m-%d') = '2022-10-05'
ORDER BY BOARD_ID DESC;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 2022/10에 작성된 게시글에 달린 댓글 정보 조회&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- INNER JOIN을 사용해서 공통 키인 board_id를 기준으로 두 테이블을 연결해 하나의 결과로 합치기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- order by로 댓글 작성일과 게시글 제목을 기준으로 정렬한다!&lt;/p&gt;
&lt;pre id=&quot;code_1775308397245&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT b.title, b.board_id, r.reply_id, r.writer_id, r.contents, date_format(r.created_date, '%Y-%m-%d') as created_date
from used_goods_board b
join used_goods_reply r on b.board_id = r.board_id
where date_format(b.created_date, '%Y-%m') = '2022-10'
order by r.created_date asc, b.title asc;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 경제 카테고리 도서의 정보와 저자 이름 함께 출력&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- JOIN을 이용해서 두 테이블을 author_id로 연결&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- where 절을 이용해서 문자열이 일치하는 것만 걸러냈다!&lt;/p&gt;
&lt;pre id=&quot;code_1775308413223&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;select b.book_id, a.author_name, date_format(b.published_date, '%Y-%m-%d') as published_date
from book b
join author a on b.author_id = a.author_id
where b.category = '경제'
order by b.published_date asc;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4.상품 카테고리 코드별 상품 개수 구하기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- left() 함수를 이용해서 product_code에서 왼쪽 두글자만 추출하고, count()를 이용해서 id의 개수를 센다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- group by로 데이터를 그룹화해서 상품 개수를 모두 구하도록 묶어준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- order by 로 정렬해주면 끝!&lt;/p&gt;
&lt;pre id=&quot;code_1775311549012&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT left(product_code, 2) as category, count(product_id) as products
from product
group by left(product_code, 2)
order by category asc;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 부속질의로는 아래와 같이 해결할 수도 있다!&lt;/p&gt;
&lt;pre id=&quot;code_1775312311663&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT B.BOOK_ID, 
    (SELECT A.AUTHOR_NAME FROM AUTHOR A WHERE A.AUTHOR_ID = B.AUTHOR_ID) AS AUTHOR_NAME, 
    DATE_FORMAT(B.PUBLISHED_DATE, '%Y-%m-%d') AS PUBLISHED_DATE
FROM BOOK B
WHERE B.CATEGORY = '경제'
ORDER BY B.PUBLISHED_DATE ASC;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. 5/1을 기준으로 출고완료/출고대기/출고미정 상태 나누기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- date_format으로 out_date를 인식하도록 만들었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- case when을 사용해서 여기에서 날짜 범위는 부등호로 나눴다!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 그리고 order by 로 정렬하면 됨.&lt;/p&gt;
&lt;pre id=&quot;code_1775308863006&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT order_id, product_id, date_format(out_date, '%Y-%m-%d') as out_date,
case    when out_date &amp;lt;= '2022-05-01' then '출고완료'
        when out_date &amp;gt; '2022-05-01' then '출고대기' else '출고미정'
        end as '출고여부' 
from food_order
order by order_id asc;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;6. 음식 종류별로 가장 즐겨찾기 수가 많은 식당을 찾기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 서브쿼리를 이용해서 group by로 음식 종류별로 그룹화 후 max(favorites)로 해당 그룹들에서 가장 높은 즐겨찾기 수를 찾는다!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 메인 쿼리에서는 섭쿼리에서 찾은 음식 종류와 최대 즐겨찾기 수 조합과 일치하는 식당만 조회해서 id와 이름을 출력한다! (order by로 정렬도 해준다.)&lt;/p&gt;
&lt;pre id=&quot;code_1775312880466&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT food_type, rest_id, rest_name, favorites
from rest_info
where (food_type, favorites) in
    (select food_type, max(favorites) from rest_info group by food_type)
order by food_type desc;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;7.여러 대여 기록 중 하나라도 2022/10/16이 포함되어 있다면 대여중으로 출력하기&lt;/p&gt;
&lt;pre id=&quot;code_1775313151788&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT car_id, case
    when sum(case
        when '2022-10-16' between start_date and end_date then 1 else 0 end
        ) &amp;gt; 0 then '대여중'
else '대여 가능'
end as availability
from car_rental_company_rental_history
group by car_id
order by car_id desc;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;8. 2022/01 기준 저자 및 카테고리별로 총매출액 계산&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- join으로 도서/저자/판매량 테이블을 세 개 조인해서 데이터를 통합시켰다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- group by로 저자 id, 저자명, 카테고리로 데이터를 묶어줬다 -&amp;gt; 집계 함수를 쓰기 위해서 했음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- sum() 함수를 이용해서 수량 * 단가를 계산하고 이걸 total_sales로 표시했다.&lt;/p&gt;
&lt;pre id=&quot;code_1775307754439&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT a.author_id, a.author_name, b.category, sum(s.sales*b.price) as total_sales
from book b
join author a on b.author_id = a.author_id
join book_sales s on b.book_id = s.book_id
where date_format(s.sales_date, '%Y-%m')='2022-01'
group by a.author_id, a.author_name, b.category
order by a.author_id asc, b.category desc;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;9. 중고 거래 게시물을 3건 이상 등록한 사용자의 id, 닉네임, 전번을 조회하기&lt;/p&gt;
&lt;pre id=&quot;code_1775313402792&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT u.user_id, u.nickname,
    concat(u.city, ' ', u.street_address1, ' ', u.street_address2) as 전체주소,
    concat(substr(u.tlno, 1, 3), '-', substr(u.tlno, 4, 4), '-', substr(u.tlno, 8, 4)) as 전화번호
from used_goods_user u
join used_goods_board b on u.user_id = b.writer_id
group by u.user_id
having count(b.board_id) &amp;gt;= 3
order by u.user_id desc;&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Develop/DataBase</category>
      <author>SpruceMoon</author>
      <guid isPermaLink="true">https://dead-end.tistory.com/39</guid>
      <comments>https://dead-end.tistory.com/39#entry39comment</comments>
      <pubDate>Sat, 4 Apr 2026 21:09:11 +0900</pubDate>
    </item>
  </channel>
</rss>