<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>불타는 키보드</title>
    <link>https://fierycoding.tistory.com/</link>
    <description>keyboard crasher</description>
    <language>ko</language>
    <pubDate>Wed, 19 Aug 2026 05:03:28 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>moonionn</managingEditor>
    <image>
      <title>불타는 키보드</title>
      <url>https://tistory1.daumcdn.net/tistory/4024040/attach/7747f424f4a64108b83aa2fed694f90d</url>
      <link>https://fierycoding.tistory.com</link>
    </image>
    <item>
      <title>[육아휴직자 감잡기 D+5]삽질하는 신입,, 아니 클로드 바로잡기</title>
      <link>https://fierycoding.tistory.com/110</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2026-03-19 at 11.39.25 AM.png&quot; data-origin-width=&quot;1640&quot; data-origin-height=&quot;1528&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kRJKQ/dJMcafy9F1K/kkmagchiCDxhNegsL6r8KK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kRJKQ/dJMcafy9F1K/kkmagchiCDxhNegsL6r8KK/img.png&quot; data-alt=&quot;(질끈)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kRJKQ/dJMcafy9F1K/kkmagchiCDxhNegsL6r8KK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkRJKQ%2FdJMcafy9F1K%2FkkmagchiCDxhNegsL6r8KK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;373&quot; data-filename=&quot;Screenshot 2026-03-19 at 11.39.25 AM.png&quot; data-origin-width=&quot;1640&quot; data-origin-height=&quot;1528&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;blockquote data-ke-style=&quot;style2&quot;&gt;내용 미리 요약: 아직은 개발자 몇 년 더 할 수 있을 거 같은데...&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저번 프론트 작업에 이어 백엔드 작업을 시켜보았다.&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&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2026-03-19 at 11.47.31 AM.png&quot; data-origin-width=&quot;1244&quot; data-origin-height=&quot;1014&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/IZjV2/dJMcah4NFRA/aMOXwHMw1Vh4xKRbaqRZ5K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/IZjV2/dJMcah4NFRA/aMOXwHMw1Vh4xKRbaqRZ5K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/IZjV2/dJMcah4NFRA/aMOXwHMw1Vh4xKRbaqRZ5K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FIZjV2%2FdJMcah4NFRA%2FaMOXwHMw1Vh4xKRbaqRZ5K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;408&quot; data-filename=&quot;Screenshot 2026-03-19 at 11.47.31 AM.png&quot; data-origin-width=&quot;1244&quot; data-origin-height=&quot;1014&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;본인이 다 짜놓고 테스트가 실패한단다&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇담 디버깅도 네 몫이다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2026-03-19 at 11.48.51 AM.png&quot; data-origin-width=&quot;868&quot; data-origin-height=&quot;622&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dtdqYu/dJMcahDHs08/AlNnCHpqv5AeVA7qfcplh1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dtdqYu/dJMcahDHs08/AlNnCHpqv5AeVA7qfcplh1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dtdqYu/dJMcahDHs08/AlNnCHpqv5AeVA7qfcplh1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdtdqYu%2FdJMcahDHs08%2FAlNnCHpqv5AeVA7qfcplh1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;622&quot; data-filename=&quot;Screenshot 2026-03-19 at 11.48.51 AM.png&quot; data-origin-width=&quot;868&quot; data-origin-height=&quot;622&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;...? 얘 뭔가 삽질 하는 거 같은데...?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 믿고 기다려준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2026-03-19 at 11.50.52 AM.png&quot; data-origin-width=&quot;868&quot; data-origin-height=&quot;792&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dV26NW/dJMcagY6mWw/vKonY63yLCt6QxoYA2Fkm1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dV26NW/dJMcagY6mWw/vKonY63yLCt6QxoYA2Fkm1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dV26NW/dJMcagY6mWw/vKonY63yLCt6QxoYA2Fkm1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdV26NW%2FdJMcagY6mWw%2FvKonY63yLCt6QxoYA2Fkm1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;456&quot; data-filename=&quot;Screenshot 2026-03-19 at 11.50.52 AM.png&quot; data-origin-width=&quot;868&quot; data-origin-height=&quot;792&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;슬슬 대차게 삽질하기 시작하는 거 같다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실무였으면 토큰 아까워서 바로 껐을 거 같은데&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어디까지 가나 계속 돌려보겠다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2026-03-19 at 11.52.51 AM.png&quot; data-origin-width=&quot;868&quot; data-origin-height=&quot;792&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bjNmIe/dJMcagEP5Fm/kKKAvJcEvkyN7hl5etcHEK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bjNmIe/dJMcagEP5Fm/kKKAvJcEvkyN7hl5etcHEK/img.png&quot; data-alt=&quot;뭐해?&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bjNmIe/dJMcagEP5Fm/kKKAvJcEvkyN7hl5etcHEK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbjNmIe%2FdJMcagEP5Fm%2FkKKAvJcEvkyN7hl5etcHEK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;792&quot; data-filename=&quot;Screenshot 2026-03-19 at 11.52.51 AM.png&quot; data-origin-width=&quot;868&quot; data-origin-height=&quot;792&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;RestAssured에서 NullPointerException 발생하는 현상이었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;왜 삽질이라 하냐면 보통 이런 문제는 버전충돌 문제일 가능성이 농후하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내가 Spring Boot 메이저 4로 실험해보고 있었는데&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;메이저 4가 가장 최신버전이니 RestAssured랑 호환이 안 되는 부분이 있을 수도 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2026-03-19 at 12.21.17 PM.png&quot; data-origin-width=&quot;1270&quot; data-origin-height=&quot;352&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/2qa9I/dJMcajuKbWY/lmMzm8nKPEwnau4ekSKWik/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/2qa9I/dJMcajuKbWY/lmMzm8nKPEwnau4ekSKWik/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/2qa9I/dJMcajuKbWY/lmMzm8nKPEwnau4ekSKWik/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F2qa9I%2FdJMcajuKbWY%2FlmMzm8nKPEwnau4ekSKWik%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1270&quot; height=&quot;352&quot; data-filename=&quot;Screenshot 2026-03-19 at 12.21.17 PM.png&quot; data-origin-width=&quot;1270&quot; data-origin-height=&quot;352&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;AI에게 없는 게 하나 있다면 그것은 실무진 촉이 아닐까...&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아니 모르면 검색을 해보라고~&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자꾸 RestAssured 메서드만 고쳐써보고 있지 말고!&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 data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2026-03-19 at 11.59.25 AM.png&quot; data-origin-width=&quot;868&quot; data-origin-height=&quot;792&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dvZ8zx/dJMcaaLmWEr/EtKLGYkS3kkdWMlHxYGmJ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dvZ8zx/dJMcaaLmWEr/EtKLGYkS3kkdWMlHxYGmJ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dvZ8zx/dJMcaaLmWEr/EtKLGYkS3kkdWMlHxYGmJ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdvZ8zx%2FdJMcaaLmWEr%2FEtKLGYkS3kkdWMlHxYGmJ0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;456&quot; data-filename=&quot;Screenshot 2026-03-19 at 11.59.25 AM.png&quot; data-origin-width=&quot;868&quot; data-origin-height=&quot;792&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;RestAssured 버전을 다운그레이드 해본다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2026-03-19 at 12.01.11 PM.png&quot; data-origin-width=&quot;566&quot; data-origin-height=&quot;792&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bAoV07/dJMcabjelVH/poKib9kX5JkJMgD6OvxhA1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bAoV07/dJMcabjelVH/poKib9kX5JkJMgD6OvxhA1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bAoV07/dJMcabjelVH/poKib9kX5JkJMgD6OvxhA1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbAoV07%2FdJMcabjelVH%2FpoKib9kX5JkJMgD6OvxhA1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;792&quot; data-filename=&quot;Screenshot 2026-03-19 at 12.01.11 PM.png&quot; data-origin-width=&quot;566&quot; data-origin-height=&quot;792&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;근데 그게 쉽게 되겠니&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;버전명시가 점점 더러워지길래 그냥 꺼버렸다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(계속 시켜볼걸...!!! 지금 생각하니 조금 아쉽네...)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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 data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2026-03-19 at 12.06.05 PM.png&quot; data-origin-width=&quot;826&quot; data-origin-height=&quot;794&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bCUhbU/dJMcagkuRJT/KKJ8BXAfURGjCrPidHDRc1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bCUhbU/dJMcagkuRJT/KKJ8BXAfURGjCrPidHDRc1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bCUhbU/dJMcagkuRJT/KKJ8BXAfURGjCrPidHDRc1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbCUhbU%2FdJMcagkuRJT%2FKKJ8BXAfURGjCrPidHDRc1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;794&quot; data-filename=&quot;Screenshot 2026-03-19 at 12.06.05 PM.png&quot; data-origin-width=&quot;826&quot; data-origin-height=&quot;794&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내 코드가 아닌 dependency 문제인 게 명확하니&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;심플한 기본 테스트코드를 별도로 만들어서 디버깅하게 한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실제 API 테스트코드에서 디버깅시키니 부수적인 요소들에 distracted되어 AI가 헤매는 거 같달까&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2026-03-19 at 12.11.29 PM.png&quot; data-origin-width=&quot;816&quot; data-origin-height=&quot;792&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cU0YKy/dJMcadg1jzF/llk5raowCsvba60GVtLk2K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cU0YKy/dJMcadg1jzF/llk5raowCsvba60GVtLk2K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cU0YKy/dJMcadg1jzF/llk5raowCsvba60GVtLk2K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcU0YKy%2FdJMcadg1jzF%2Fllk5raowCsvba60GVtLk2K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;792&quot; data-filename=&quot;Screenshot 2026-03-19 at 12.11.29 PM.png&quot; data-origin-width=&quot;816&quot; data-origin-height=&quot;792&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2026-03-19 at 12.11.59 PM.png&quot; data-origin-width=&quot;854&quot; data-origin-height=&quot;792&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/MvBqu/dJMcaaLmW52/CR2KUkmopaNGqtQCcd9saK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/MvBqu/dJMcaaLmW52/CR2KUkmopaNGqtQCcd9saK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/MvBqu/dJMcaaLmW52/CR2KUkmopaNGqtQCcd9saK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMvBqu%2FdJMcaaLmW52%2FCR2KUkmopaNGqtQCcd9saK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;792&quot; data-filename=&quot;Screenshot 2026-03-19 at 12.11.59 PM.png&quot; data-origin-width=&quot;854&quot; data-origin-height=&quot;792&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번엔 예상대로 훨씬 빨리 문제를 찾아냈다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 선택의 순간이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 아이는 RestAssuredMockMvc를 쓰는 방안을 제시한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 인수테스트인데 Mock을 쓰라고...? 나는 달갑지가 않다.&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;바로 Spring Boot 3을 쓰는 것 ! ㅎ&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2026-03-19 at 12.36.11 PM.png&quot; data-origin-width=&quot;854&quot; data-origin-height=&quot;792&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bjQvWe/dJMcahKvyIe/kTHbTrlZb7iLPCVJnxKyek/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bjQvWe/dJMcahKvyIe/kTHbTrlZb7iLPCVJnxKyek/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bjQvWe/dJMcahKvyIe/kTHbTrlZb7iLPCVJnxKyek/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbjQvWe%2FdJMcahKvyIe%2FkTHbTrlZb7iLPCVJnxKyek%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;792&quot; data-filename=&quot;Screenshot 2026-03-19 at 12.36.11 PM.png&quot; data-origin-width=&quot;854&quot; data-origin-height=&quot;792&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;한큐에 촤르륵 완벽하게 만들어주는 걸 생각했는데 나의 기대가 컸나보다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실망이야 클로드...&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>나의 기록</category>
      <author>moonionn</author>
      <guid isPermaLink="true">https://fierycoding.tistory.com/110</guid>
      <comments>https://fierycoding.tistory.com/110#entry110comment</comments>
      <pubDate>Thu, 19 Mar 2026 12:39:56 +0900</pubDate>
    </item>
    <item>
      <title>[육아휴직자 감잡기 D+4]프론트는 할 줄 모르지만</title>
      <link>https://fierycoding.tistory.com/109</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-filename=&quot;Screenshot 2026-03-11 at 11.37.34 AM.png&quot; data-origin-width=&quot;694&quot; data-origin-height=&quot;688&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xUT3Q/dJMcacbeUyi/mIMeFQK1fdzjMZAbEMXXw0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xUT3Q/dJMcacbeUyi/mIMeFQK1fdzjMZAbEMXXw0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xUT3Q/dJMcacbeUyi/mIMeFQK1fdzjMZAbEMXXw0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxUT3Q%2FdJMcacbeUyi%2FmIMeFQK1fdzjMZAbEMXXw0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;397&quot; data-filename=&quot;Screenshot 2026-03-11 at 11.37.34 AM.png&quot; data-origin-width=&quot;694&quot; data-origin-height=&quot;688&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;이제는 AI가 코드를 다 짜준다고 하니 간단한 어플리케이션을 만들어보도록 해야겠다.&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;u&gt;'남편에게 아기 밥 차리게 만들기'&lt;/u&gt;를 가능케 만들도록 하는 것.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전에 &quot;냉장고 맨윗칸에 있는 토마토 꺼내서 먹여&quot; 했다가&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;못 찾겠다고 씩씩대는 걸 보고는 기가 찬 적이 있다. (냉장고 문 열면 바로 앞에 있었음)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;s&gt;아니 밖에서 돈은 어떻게 벌어오는걸까?&lt;/s&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 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;h3 data-ke-size=&quot;size23&quot;&gt;화면 만들기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고로 난 프론트엔드에는 꽤 많이 취약하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코드만 봐도 짜증난다.&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;하지만 요즘은 AI가 다 해준다지?&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 alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1074&quot; data-origin-height=&quot;982&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wY0z6/dJMcagYZ3IY/6Pei4KEKlQE6ZT7OkVtqV1/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wY0z6/dJMcagYZ3IY/6Pei4KEKlQE6ZT7OkVtqV1/img.webp&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wY0z6/dJMcagYZ3IY/6Pei4KEKlQE6ZT7OkVtqV1/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwY0z6%2FdJMcagYZ3IY%2F6Pei4KEKlQE6ZT7OkVtqV1%2Fimg.webp&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;457&quot; data-origin-width=&quot;1074&quot; data-origin-height=&quot;982&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2026-03-11 at 11.49.18 AM.png&quot; data-origin-width=&quot;1074&quot; data-origin-height=&quot;488&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/boFGOY/dJMcafeLJDK/jv6MfI4G69mMykkEUqO6w0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/boFGOY/dJMcafeLJDK/jv6MfI4G69mMykkEUqO6w0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/boFGOY/dJMcafeLJDK/jv6MfI4G69mMykkEUqO6w0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FboFGOY%2FdJMcafeLJDK%2Fjv6MfI4G69mMykkEUqO6w0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;488&quot; data-filename=&quot;Screenshot 2026-03-11 at 11.49.18 AM.png&quot; data-origin-width=&quot;1074&quot; data-origin-height=&quot;488&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;당연히 Vite + React지&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 alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2026-03-11 at 11.50.43 AM.png&quot; data-origin-width=&quot;1074&quot; data-origin-height=&quot;822&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/IlH7z/dJMcaaYMCOf/JvtLQJvVejwYphtbhfAI30/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/IlH7z/dJMcaaYMCOf/JvtLQJvVejwYphtbhfAI30/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/IlH7z/dJMcaaYMCOf/JvtLQJvVejwYphtbhfAI30/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FIlH7z%2FdJMcaaYMCOf%2FJvtLQJvVejwYphtbhfAI30%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;822&quot; data-filename=&quot;Screenshot 2026-03-11 at 11.50.43 AM.png&quot; data-origin-width=&quot;1074&quot; data-origin-height=&quot;822&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 alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2026-03-11 at 11.58.21 AM.png&quot; data-origin-width=&quot;1074&quot; data-origin-height=&quot;730&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bNByJN/dJMcacvzgn1/HfDWLQ4ACAsntf5Vp8QhaK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bNByJN/dJMcacvzgn1/HfDWLQ4ACAsntf5Vp8QhaK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bNByJN/dJMcacvzgn1/HfDWLQ4ACAsntf5Vp8QhaK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbNByJN%2FdJMcacvzgn1%2FHfDWLQ4ACAsntf5Vp8QhaK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;340&quot; data-filename=&quot;Screenshot 2026-03-11 at 11.58.21 AM.png&quot; data-origin-width=&quot;1074&quot; data-origin-height=&quot;730&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;냅다 화면 짜달라고 하면 당연히 곤란하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일단 이 아이디어가 내 머릿속에만 있기 때문에 이 친구에게 공유를 해줘야 하고,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기능 명세부터 정리해야 어떤 화면을 구성할지 흐름이 잡히기 때문이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2026-03-11 at 12.09.26 PM.png&quot; data-origin-width=&quot;1074&quot; data-origin-height=&quot;730&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rFFKZ/dJMcagLuKrX/KJ3z9WXeLUGSXOWXjvL3O1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rFFKZ/dJMcagLuKrX/KJ3z9WXeLUGSXOWXjvL3O1/img.png&quot; data-alt=&quot;기능명세 일부&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rFFKZ/dJMcagLuKrX/KJ3z9WXeLUGSXOWXjvL3O1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrFFKZ%2FdJMcagLuKrX%2FKJ3z9WXeLUGSXOWXjvL3O1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;730&quot; data-filename=&quot;Screenshot 2026-03-11 at 12.09.26 PM.png&quot; data-origin-width=&quot;1074&quot; data-origin-height=&quot;730&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;몇 번의 티키타카를 하며 기능명세서를 작성했다.&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&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2026-03-11 at 12.12.15 PM.png&quot; data-origin-width=&quot;880&quot; data-origin-height=&quot;882&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lPEUM/dJMcagxVamc/NanzhepkuSghce9KHXFRDk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lPEUM/dJMcagxVamc/NanzhepkuSghce9KHXFRDk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lPEUM/dJMcagxVamc/NanzhepkuSghce9KHXFRDk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlPEUM%2FdJMcagxVamc%2FNanzhepkuSghce9KHXFRDk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;501&quot; data-filename=&quot;Screenshot 2026-03-11 at 12.12.15 PM.png&quot; data-origin-width=&quot;880&quot; data-origin-height=&quot;882&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;하지만 그런들 어떠하리 디자인 퀄리티는 별 상관 없다.&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&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2026-03-11 at 12.16.21 PM.png&quot; data-origin-width=&quot;880&quot; data-origin-height=&quot;1556&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/PUCeV/dJMcabi7Ngf/x3K1ZRuz6FeTwX4et8E0G1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/PUCeV/dJMcabi7Ngf/x3K1ZRuz6FeTwX4et8E0G1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/PUCeV/dJMcabi7Ngf/x3K1ZRuz6FeTwX4et8E0G1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPUCeV%2FdJMcabi7Ngf%2Fx3K1ZRuz6FeTwX4et8E0G1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;1556&quot; data-filename=&quot;Screenshot 2026-03-11 at 12.16.21 PM.png&quot; data-origin-width=&quot;880&quot; data-origin-height=&quot;1556&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;혼자 뭘 뚝딱뚝딱 하더니 몇초만에 완성됐다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이야! 이게 요즘 세상의 코딩? 어디 한번 코드를 볼까?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2026-03-11 at 12.24.10 PM.png&quot; data-origin-width=&quot;836&quot; data-origin-height=&quot;838&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qLa9V/dJMcagdEH6v/hz6aasrvutyMQKnLP4j7U0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qLa9V/dJMcagdEH6v/hz6aasrvutyMQKnLP4j7U0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qLa9V/dJMcagdEH6v/hz6aasrvutyMQKnLP4j7U0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqLa9V%2FdJMcagdEH6v%2Fhz6aasrvutyMQKnLP4j7U0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;838&quot; data-filename=&quot;Screenshot 2026-03-11 at 12.24.10 PM.png&quot; data-origin-width=&quot;836&quot; data-origin-height=&quot;838&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;약간의 밤티스러운 부분들이 있지만 초안이라 감안되는 수준이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;생각보다 드래프트 코드를 잘 구성해서 당황스럽다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다른 페이지도 만들어보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2026-03-11 at 1.29.09 PM.png&quot; data-origin-width=&quot;878&quot; data-origin-height=&quot;318&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/duAr1N/dJMcacI6f2b/okCIvrkyyZrMDxkSzT8liK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/duAr1N/dJMcacI6f2b/okCIvrkyyZrMDxkSzT8liK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/duAr1N/dJMcacI6f2b/okCIvrkyyZrMDxkSzT8liK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FduAr1N%2FdJMcacI6f2b%2FokCIvrkyyZrMDxkSzT8liK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;318&quot; data-filename=&quot;Screenshot 2026-03-11 at 1.29.09 PM.png&quot; data-origin-width=&quot;878&quot; data-origin-height=&quot;318&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;1273&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/biSqCl/dJMcagSfXdb/XkOkbxNLejp8IXnQIf6ONk/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/biSqCl/dJMcagSfXdb/XkOkbxNLejp8IXnQIf6ONk/img.gif&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/biSqCl/dJMcagSfXdb/XkOkbxNLejp8IXnQIf6ONk/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/biSqCl/dJMcagSfXdb/XkOkbxNLejp8IXnQIf6ONk/img.gif&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;1273&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;1273&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아 적응 안 되네;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다들 나 빼고 이렇게 꿀 빨면서 개발하고 있던거?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저 이제 오후 3시에 퇴근해도 되나요&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 alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2026-03-11 at 1.30.58 PM.png&quot; data-origin-width=&quot;772&quot; data-origin-height=&quot;518&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pAucd/dJMcaduofDh/MXIyX0fyqqrcMjOxRaEzu0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pAucd/dJMcaduofDh/MXIyX0fyqqrcMjOxRaEzu0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pAucd/dJMcaduofDh/MXIyX0fyqqrcMjOxRaEzu0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpAucd%2FdJMcaduofDh%2FMXIyX0fyqqrcMjOxRaEzu0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;518&quot; data-filename=&quot;Screenshot 2026-03-11 at 1.30.58 PM.png&quot; data-origin-width=&quot;772&quot; data-origin-height=&quot;518&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사실 프론트는 내가 잘 아는 영역이 아니라서 감탄만 하다 끝난 거 같은데&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;본격적으로 API를 만들게 시키면 문제점이 드러나지 않을까하는 기대감(?)이 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;과연...&lt;/p&gt;</description>
      <category>나의 기록</category>
      <author>moonionn</author>
      <guid isPermaLink="true">https://fierycoding.tistory.com/109</guid>
      <comments>https://fierycoding.tistory.com/109#entry109comment</comments>
      <pubDate>Wed, 11 Mar 2026 13:36:31 +0900</pubDate>
    </item>
    <item>
      <title>아무도 관심 없을 워킹맘 이야기</title>
      <link>https://fierycoding.tistory.com/108</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;걷지도 못하는 게 아침마다 사회생활을 하러 간다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 내 아이는 가족이 아닌 타인의 손에 자란다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;&amp;lt;나는 솔로&amp;gt; 30기에는 공사현장에서 일하는 '영자'라는 당찬 여성이 나온다.&lt;/span&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;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;남편과 나는 그 순간 서로를 바라보며 실소했다.&lt;/span&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;무자녀였던 나도, 아니 아기가 10개월이 될 때까지의 나조차도 그렇게 생각했지.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;관심도 없었지 사실.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 제목이 그렇다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;아무도 관심 없을 워킹맘 이야기&quot;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;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;&quot;저를 낳고 전업주부가 된 엄마를 보며, 저는 절대 결혼하지 않겠다고 다심했습니다.&quot;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;고등학교 1학년 때 했던 나의 자기소개다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;'일 관두지 말걸'하며 툴툴대는 엄마에게 질려버린 탓이었을 터.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;무엇보다 남자랑 똑같이 교육받아놓고 전업주부가 되는 건 억울한 일이라 여겼다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아! 나 또한 그랬듯, 이 '엄마'라는 존재를 우리는 얼마나 쉽게 폄하해왔던가.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;입주 육아도우미와 가정부의 대략적인 월급은 각각 500만 원 선이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;엄마의 노동이 실로 어마어마하다는 걸, 왜 직접 당해보고서야 깨닫게 되는 걸까.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;멋진 프로젝트를 성공시켜 사회에서 이름을 날리는 게 정말 중요한 일이었나?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어쩌면 나는 그저 남의 인정을 받아야만 성공한 것이라 믿어왔던 건 아닐까.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이젠 나도 잘 모르겠다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;많은 엄마들은 그럼에도 불구하고, 각자의 사정으로 워킹맘이 된다.&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;미혼일 땐 &quot;맘에 안 들면 관두지 뭐&quot;라는 생각이 일상다반사였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;회사는 왜 다니니?&quot; 라고 누가 묻는다면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;코딩이 재밌는데요, 코딩한다고 돈도 줘요&quot;라고 답할 정도로 재미를 좇아 일을 했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 알다시피 일은 반드시 재미없어지는 순간이 온다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나는 운명의 장난처럼 딱 그 시기에 엄마가 되었다.&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;이제 누가 &quot;회사는 왜 다니니?&quot; 라고 묻는다면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아이러니하게도 &quot;아기가 있어서요&quot; 라고 대답하게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 이 목적은, 투지를 그 무엇보다 강하고 지속적으로&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;2021년, 어떤 회사에 입사해야 할지 고뇌하던 사회초년생 시절이었다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;한 시니어가 내게 해준 말이 기억에 남는다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;고민이 많았나보구나.&lt;br /&gt;그런데 있지, 어떤 회사에 다니느냐는 인생 전체에서 사실 그렇게 중요하지 않아.&lt;br /&gt;인생의 갈림길은 누구랑 결혼을 하느냐, 아이를 낳느냐, 어떻게 키우느냐, 그런거더라.&lt;br /&gt;그러니 지금 너의 선택에 무게를 두고 스트레스받을 필요 없다.&lt;/blockquote&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; 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 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;</description>
      <category>나의 기록</category>
      <author>moonionn</author>
      <guid isPermaLink="true">https://fierycoding.tistory.com/108</guid>
      <comments>https://fierycoding.tistory.com/108#entry108comment</comments>
      <pubDate>Thu, 5 Mar 2026 02:51:34 +0900</pubDate>
    </item>
    <item>
      <title>[육아휴직자 감잡기 D+3]개발자 괜히 했나</title>
      <link>https://fierycoding.tistory.com/107</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;600&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b4k4Ru/dJMcagq4hvL/22eaVHVKZusKpbn7FTI8jk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b4k4Ru/dJMcagq4hvL/22eaVHVKZusKpbn7FTI8jk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b4k4Ru/dJMcagq4hvL/22eaVHVKZusKpbn7FTI8jk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb4k4Ru%2FdJMcagq4hvL%2F22eaVHVKZusKpbn7FTI8jk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;400&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;600&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;D+3가 늦은 이유: 독감&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내가 아니라, 남편이 독감에 걸렸다.&lt;br /&gt;(저번엔 혼자 코로나 걸리더니&amp;hellip;?)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아기에게 옮기면 안 되니 남편은 셀프 격리에 들어갔다.&lt;br /&gt;그렇게 나는 일주일간 독박육아와 독박살림을 맡게 되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서였을까.&lt;br /&gt;남편이 가정에 복귀하자마자 이번엔 내가 원인 모를 두통과 근육통에 시달렸다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(그렇다고 편히 쉬진 못했다^^... 난 엄마..니까...ㅎ)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아기 있는 집은 한 명이 아프면 모두가 올스톱 된다더니 정말 그랬다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;한계 봉착&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;몇 주간 OpenClaw가 핫하다.&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;br /&gt;&amp;ldquo;개발자 워킹맘&amp;rdquo;은 과연 가능한 것일까?&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;요즘은 AI가 알아서 일하게끔 만드는 흐름이 대세인 듯하다.&lt;/p&gt;
&lt;p data-end=&quot;1110&quot; data-start=&quot;1048&quot; data-ke-size=&quot;size16&quot;&gt;하지만 휴직자인 나는 그만한 토큰 비용을 감당할 재력도 없고&lt;br /&gt;로컬 LLM을 돌릴 빵빵한 컴퓨터도 없다.&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;우리 회사 기준으로 생각해 보면... 아니라고 본다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아, 이 방향은 아닌 것 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AI 트렌드를 쫓아가는 데 에너지를 다 쓰는 건&lt;br /&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;&amp;nbsp;&lt;/p&gt;</description>
      <category>나의 기록</category>
      <author>moonionn</author>
      <guid isPermaLink="true">https://fierycoding.tistory.com/107</guid>
      <comments>https://fierycoding.tistory.com/107#entry107comment</comments>
      <pubDate>Sun, 1 Mar 2026 02:02:28 +0900</pubDate>
    </item>
    <item>
      <title>[육아휴직자 감잡기 D+2]AI 맛보기</title>
      <link>https://fierycoding.tistory.com/106</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;600&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bWd06H/dJMcac9MaFe/M4lK3GfUPatn5dVktjM0ck/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bWd06H/dJMcac9MaFe/M4lK3GfUPatn5dVktjM0ck/img.webp&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bWd06H/dJMcac9MaFe/M4lK3GfUPatn5dVktjM0ck/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbWd06H%2FdJMcac9MaFe%2FM4lK3GfUPatn5dVktjM0ck%2Fimg.webp&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;300&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;600&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;1년 사이에 강산이 변해버렸다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;라떼는 챗지피티랑 코파일럿이 전부였는데...&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Cursor? Antigravity? 갑자기 난데 없는 IDE들이 눈에 띈다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;백문이 불여일견. 우선 Cursor를 깔아본다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2026-02-04 at 8.14.50 PM.png&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;1888&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bKeinL/dJMcabwihwT/OgFMyBPeg8I44ufgqe9Mp1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bKeinL/dJMcabwihwT/OgFMyBPeg8I44ufgqe9Mp1/img.png&quot; data-alt=&quot;화면이 익숙한듯 낯설어요&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bKeinL/dJMcabwihwT/OgFMyBPeg8I44ufgqe9Mp1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbKeinL%2FdJMcabwihwT%2FOgFMyBPeg8I44ufgqe9Mp1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;3024&quot; height=&quot;1888&quot; data-filename=&quot;Screenshot 2026-02-04 at 8.14.50 PM.png&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;1888&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;화면이 익숙한듯 낯설어요&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2026-02-04 at 8.17.09 PM.png&quot; data-origin-width=&quot;1056&quot; data-origin-height=&quot;238&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qD62V/dJMcadOmej9/w9kpWSBgEyiiIoC0k6Kg2k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qD62V/dJMcadOmej9/w9kpWSBgEyiiIoC0k6Kg2k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qD62V/dJMcadOmej9/w9kpWSBgEyiiIoC0k6Kg2k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqD62V%2FdJMcadOmej9%2Fw9kpWSBgEyiiIoC0k6Kg2k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;238&quot; data-filename=&quot;Screenshot 2026-02-04 at 8.17.09 PM.png&quot; data-origin-width=&quot;1056&quot; data-origin-height=&quot;238&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;좋은 모델을 쓰려면 돈을 내란다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2026-02-04 at 8.17.47 PM.png&quot; data-origin-width=&quot;1056&quot; data-origin-height=&quot;200&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cdzkK7/dJMcacBZfyL/cSqirSXvqiV6gbnLgfOkXK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cdzkK7/dJMcacBZfyL/cSqirSXvqiV6gbnLgfOkXK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cdzkK7/dJMcacBZfyL/cSqirSXvqiV6gbnLgfOkXK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcdzkK7%2FdJMcacBZfyL%2FcSqirSXvqiV6gbnLgfOkXK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;200&quot; data-filename=&quot;Screenshot 2026-02-04 at 8.17.47 PM.png&quot; data-origin-width=&quot;1056&quot; data-origin-height=&quot;200&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;무료로 몇마디 좀 주고받았더니 또 돈을 내라고 한다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이젠 코딩하려면 돈 내야 하는 세상인가?&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;오픈소스 마인드는 다 어디가고 전부 타락해버렸군.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;하지만 어림도 없지&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Antigravity로 갈아탄다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2026-02-06 at 2.32.36 AM.png&quot; data-origin-width=&quot;534&quot; data-origin-height=&quot;556&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bvKseS/dJMcahDhhpG/I0kxl60FWHLxkaKCYfJytk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bvKseS/dJMcahDhhpG/I0kxl60FWHLxkaKCYfJytk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bvKseS/dJMcahDhhpG/I0kxl60FWHLxkaKCYfJytk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbvKseS%2FdJMcahDhhpG%2FI0kxl60FWHLxkaKCYfJytk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;556&quot; data-filename=&quot;Screenshot 2026-02-06 at 2.32.36 AM.png&quot; data-origin-width=&quot;534&quot; data-origin-height=&quot;556&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아무래도 Cursor에 비하면 사용량 리밋이 꽤 자애롭다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아, 그 사이에 Claude 결제도 그냥 질렀다.&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;480&quot; data-origin-height=&quot;468&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bxeZVr/dJMcafFt3w3/I5k6KGzKK6Irf0QSKKYWfk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bxeZVr/dJMcafFt3w3/I5k6KGzKK6Irf0QSKKYWfk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bxeZVr/dJMcafFt3w3/I5k6KGzKK6Irf0QSKKYWfk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbxeZVr%2FdJMcafFt3w3%2FI5k6KGzKK6Irf0QSKKYWfk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;390&quot; data-origin-width=&quot;480&quot; data-origin-height=&quot;468&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아무래도 기본적인 기능부터 고찰해봐야겠다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;회원가입 기능부터 만들어보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2026-02-06 at 2.49.18 AM.png&quot; data-origin-width=&quot;2110&quot; data-origin-height=&quot;1576&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/biKyW0/dJMcadgAApK/Nmr9kLimwJmYlT7mhl51t0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/biKyW0/dJMcadgAApK/Nmr9kLimwJmYlT7mhl51t0/img.png&quot; data-alt=&quot;짠&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/biKyW0/dJMcadgAApK/Nmr9kLimwJmYlT7mhl51t0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbiKyW0%2FdJMcadgAApK%2FNmr9kLimwJmYlT7mhl51t0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2110&quot; height=&quot;1576&quot; data-filename=&quot;Screenshot 2026-02-06 at 2.49.18 AM.png&quot; data-origin-width=&quot;2110&quot; data-origin-height=&quot;1576&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;사실 AI 에이전트 기능을 탐색해보는 과정들이 있었는데&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;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;구현 과정&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일단 제미나이에게 기능명세서부터 작성해달라 했다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;기능명세서를 먼저 작성해볼까?&lt;br /&gt;&lt;br /&gt;우선 기본 인증기능부터.&lt;br /&gt;회원을 생성하려면 이메일, 전화번호, 비밀번호가 필요해.&lt;br /&gt;탈퇴, 토큰 갱신 등 기본적인 어플리케이션 인증기능들은 다 필요하고.&lt;br /&gt;특히 전화번호는 인증절차를 거쳐야 할 거 같아.&lt;br /&gt;엔드포인트는 &quot;/auth&quot;로 시작하는 게 좋겠어.&lt;br /&gt;&lt;br /&gt;그 외 추가적으로 필요한 기능이 있다면 알아서 작성해줘.&lt;/blockquote&gt;
&lt;p style=&quot;background-color: #ffffff; color: #1f1f1f; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #1f1f1f; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;적당히 &quot;너 알아서 해줘&quot; 라는 늬앙스로 부탁했다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #1f1f1f; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이것이 바이브코딩?&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #1f1f1f; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;403&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sHMnV/dJMcabpzq9T/tKeJYkqfCrZ4dsrgLdnNe0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sHMnV/dJMcabpzq9T/tKeJYkqfCrZ4dsrgLdnNe0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sHMnV/dJMcabpzq9T/tKeJYkqfCrZ4dsrgLdnNe0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsHMnV%2FdJMcabpzq9T%2FtKeJYkqfCrZ4dsrgLdnNe0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2048&quot; height=&quot;403&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;403&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;제미나이가 뽑아준 기능명세서 엑셀시트이다.&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;blockquote data-ke-style=&quot;style3&quot;&gt;위 기능명세서 첨삭해줘.&lt;br /&gt;소셜로그인 기능은 지금 굳이 필요 없으니 지워줘.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2026-02-06 at 3.17.27 AM.png&quot; data-origin-width=&quot;2862&quot; data-origin-height=&quot;346&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/u6DJJ/dJMcadt4UNC/YH7n9dImHGihWsEPmdp6Kk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/u6DJJ/dJMcadt4UNC/YH7n9dImHGihWsEPmdp6Kk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/u6DJJ/dJMcadt4UNC/YH7n9dImHGihWsEPmdp6Kk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fu6DJJ%2FdJMcadt4UNC%2FYH7n9dImHGihWsEPmdp6Kk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2862&quot; height=&quot;346&quot; data-filename=&quot;Screenshot 2026-02-06 at 3.17.27 AM.png&quot; data-origin-width=&quot;2862&quot; data-origin-height=&quot;346&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;미약하게나마 개선된 것 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;불필요한 기능이 제거되었고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;API경로가 조금 더 보편적이고 RESTful해졌다.&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 alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2026-02-06 at 3.20.39 AM.png&quot; data-origin-width=&quot;874&quot; data-origin-height=&quot;168&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c0ZP3H/dJMcajgLfXD/WBldUV9E1Rj2lA2LzLIgK1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c0ZP3H/dJMcajgLfXD/WBldUV9E1Rj2lA2LzLIgK1/img.png&quot; data-alt=&quot;그냥 명세서를 던져준다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c0ZP3H/dJMcajgLfXD/WBldUV9E1Rj2lA2LzLIgK1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc0ZP3H%2FdJMcajgLfXD%2FWBldUV9E1Rj2lA2LzLIgK1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;168&quot; data-filename=&quot;Screenshot 2026-02-06 at 3.20.39 AM.png&quot; data-origin-width=&quot;874&quot; data-origin-height=&quot;168&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;그냥 맡겨놨더니 구현을 개발새발로 한다...!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러니까 코드는 잘 짜는데...&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;불필요한 if문들과 위계는 죽 쒀먹은 코드를 내놓는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아직은 결국 인간이 개입해야 하는군. (당연한 얘기)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;바이브코딩은 비개발자들이, 혹은 급한 데모 만들때나 쓰고&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;이젠 AI가 대신 다 읽어주고 파악해주는데&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;</description>
      <category>나의 기록</category>
      <author>moonionn</author>
      <guid isPermaLink="true">https://fierycoding.tistory.com/106</guid>
      <comments>https://fierycoding.tistory.com/106#entry106comment</comments>
      <pubDate>Fri, 6 Feb 2026 03:28:15 +0900</pubDate>
    </item>
    <item>
      <title>[육아휴직자 감잡기 D+1]변해버린 세상</title>
      <link>https://fierycoding.tistory.com/105</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;498&quot; data-origin-height=&quot;256&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/NuK4U/dJMcabpyFNe/RqvGdf0EgXfvMe3sudNPik/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/NuK4U/dJMcabpyFNe/RqvGdf0EgXfvMe3sudNPik/img.gif&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/NuK4U/dJMcabpyFNe/RqvGdf0EgXfvMe3sudNPik/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/NuK4U/dJMcabpyFNe/RqvGdf0EgXfvMe3sudNPik/img.gif&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;498&quot; height=&quot;256&quot; data-origin-width=&quot;498&quot; data-origin-height=&quot;256&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아기를 낳은 지 어언 1년.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;258&quot; data-start=&quot;179&quot; data-ke-size=&quot;size16&quot;&gt;여유가 생겼냐고 묻는다면, 딱히 그렇지는 않다.&lt;br /&gt;오히려 복직을 앞두고 본업에 대한 압박이 슬슬 몰려오기 시작했다.&lt;/p&gt;
&lt;p data-end=&quot;354&quot; data-start=&quot;260&quot; data-ke-size=&quot;size16&quot;&gt;그래서 정말 오랜만에 링크드인에 들어가 보았다.&lt;br /&gt;앤트로픽, 클로드, 커서, 에이전트 어쩌고저쩌고&amp;hellip;  &amp;zwj; &lt;br /&gt;피드는 온통 모르는 단어들로 가득했다.  &amp;zwj; &lt;/p&gt;
&lt;p data-end=&quot;389&quot; data-start=&quot;356&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;389&quot; data-start=&quot;356&quot; data-ke-size=&quot;size16&quot;&gt;아아&amp;hellip;&lt;br /&gt;1년 사이에 도대체 무슨 일이 있었던 거지?&lt;/p&gt;
&lt;p data-end=&quot;389&quot; data-start=&quot;356&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;400&quot; data-start=&quot;391&quot; data-ke-size=&quot;size16&quot;&gt;남편에게 물었다.&lt;/p&gt;
&lt;p data-end=&quot;497&quot; data-start=&quot;402&quot; data-ke-size=&quot;size16&quot;&gt; &amp;zwj; : 요즘은 AI가 다 코딩해 주는 거야?&lt;br /&gt; &amp;zwj;♂️: 자기 회사 복귀해서 손으로 코드 치고 있으면, 옆사람들 동공지진 날걸&lt;br /&gt; &amp;zwj; : &amp;hellip;&amp;hellip;&amp;hellip;?&lt;/p&gt;
&lt;p data-end=&quot;497&quot; data-start=&quot;402&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;536&quot; data-start=&quot;499&quot; data-ke-size=&quot;size16&quot;&gt;이 업계가 원래 이런 곳이었을까.(원래 좀 그렇긴 했지만)&lt;/p&gt;
&lt;p data-end=&quot;586&quot; data-start=&quot;538&quot; data-ke-size=&quot;size16&quot;&gt;아니면 내가 휴직한 타이밍이 유독 안 좋았던 걸까.(이것도 좀 그런 것 같고)&lt;/p&gt;
&lt;p data-end=&quot;633&quot; data-start=&quot;588&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;633&quot; data-start=&quot;588&quot; data-ke-size=&quot;size16&quot;&gt;불안하다.&lt;br /&gt;절망적이다.&lt;br /&gt;걱정된다.&lt;br /&gt;자신감은 눈에 띄게 하락 중이다.&lt;/p&gt;
&lt;p data-end=&quot;633&quot; data-start=&quot;588&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;703&quot; data-start=&quot;635&quot; data-ke-size=&quot;size16&quot;&gt;그래도! 이대로 주저앉을 수는 없다.&lt;/p&gt;
&lt;p data-end=&quot;703&quot; data-start=&quot;635&quot; data-ke-size=&quot;size16&quot;&gt;콩알만 한 아들을 위해서라도,&lt;/p&gt;
&lt;p data-end=&quot;703&quot; data-start=&quot;635&quot; data-ke-size=&quot;size16&quot;&gt;잠을 줄여서라도(이미 하루에 5시간 밖에 못 자지만)&lt;/p&gt;
&lt;p data-end=&quot;703&quot; data-start=&quot;635&quot; data-ke-size=&quot;size16&quot;&gt;다시 적응해야한다!&lt;/p&gt;
&lt;p data-end=&quot;703&quot; data-start=&quot;635&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;736&quot; data-start=&quot;705&quot; data-ke-size=&quot;size16&quot;&gt;엄마는&amp;hellip;&lt;/p&gt;
&lt;p data-end=&quot;736&quot; data-start=&quot;705&quot; data-ke-size=&quot;size16&quot;&gt;아마도 무엇이든 할 수 있다.&lt;br /&gt;아자아자.&lt;/p&gt;
&lt;p data-end=&quot;736&quot; data-start=&quot;705&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;736&quot; data-start=&quot;705&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;다음화: AI 에이전트 에디터 체험기&lt;/b&gt;&lt;/p&gt;</description>
      <category>나의 기록</category>
      <author>moonionn</author>
      <guid isPermaLink="true">https://fierycoding.tistory.com/105</guid>
      <comments>https://fierycoding.tistory.com/105#entry105comment</comments>
      <pubDate>Wed, 4 Feb 2026 20:33:07 +0900</pubDate>
    </item>
    <item>
      <title>1년 3개월만에 쓰는 글</title>
      <link>https://fierycoding.tistory.com/104</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;meme.jpg&quot; data-origin-width=&quot;608&quot; data-origin-height=&quot;591&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/J5wf1/dJMcahpd6zq/U3RshDm0IEVKXWFX6blQC1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/J5wf1/dJMcahpd6zq/U3RshDm0IEVKXWFX6blQC1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/J5wf1/dJMcahpd6zq/U3RshDm0IEVKXWFX6blQC1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJ5wf1%2FdJMcahpd6zq%2FU3RshDm0IEVKXWFX6blQC1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;389&quot; data-filename=&quot;meme.jpg&quot; data-origin-width=&quot;608&quot; data-origin-height=&quot;591&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;부제 : 엄마가 된 직장인&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마지막으로 글을 써본 게 작년 여름이다. 사실 그때도 나에겐 큰 변화가 일어나고 있었다. 임신 4개월 차였다. 그 이후로 여러 초안들을 작성했지만 완성시키지 못했다. 그렇게 겨울에 출산했고, 이제 아기는 어느덧 9개월 차가 되었다.&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;아기는 100일만 넘으면 밤에 쭉 잔다고 누가 그러던가. 우리 아기는 아직도 밤 9시에 겨우 잠들고, 새벽에 한두번씩 깬다. '100일의 기적'은 SNS가 만들어낸 허상이었다. 이유식 만들고 먹이는 것도 이렇게 힘든 일이었다니, 왜 아무도 알려주지 않았을까. 밤 9시에 겨우 재우고 나면 씻고, 밀린 집안일을 하고, 이유식을 만든다. 남편의 아침 메뉴까지 챙긴다. 중간중간 깨는 아기를 달래다 보면 어느새 새벽 3~4시. 아기가 아침 8시에 깨니, 수면 시간은 하루 4~5시간 남짓이다.&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;그렇게 살다 보니 코딩도, 개발도, 세상사도 모두 뒷전이 되었다. 물론 걱정됐다. 출산 후 IT업계는 빠르게 변했다. 출산휴가 전엔 낯설기만 했던 '바이브코딩'과 'MCP' 같은 개념이 이제는 뉴노멀이 되어 있었다. 이런 걱정들은 마음 한켠 작은 상자에 넣어두었지만, 언젠가 마주해야 할 현실임을 안다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;블로그도 마찬가지다. 이제 사람들은 모르는 게 생겨도 구글링을 하지 않는다. 스택오버플로우를 아직도 쓰는지 모르겠다(현직에 있다면 알려주길 바란다). 그래서 처음엔 '이제 블로그 시대는 끝난 게 아닐까' 생각했다. 그런데 좀 더 생각해보니, 결국 블로그는 '나'를 표현할 수 있는 몇 안 되는 공간이라고 결론내렸다. 아기 키우며 고군분투하는 개발자의 이야기는 AI가 경험하지 못하는 범위이지 않을까. &lt;br /&gt;&lt;s&gt;(링크드인은 너무 부끄럽다)&lt;/s&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1년 안에 정말 많은 일들이 있었다. 결혼, 임신, 출산, 육아, 신혼집마련 등등... 지금은 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;12월에 있을 이사 준비로 바쁘다.&lt;/span&gt;&amp;nbsp;이 이야기를 하는 이유는, 이사만 잘 끝나면 다시 사회로 복귀할 연습을 해야 하기 때문이다. 오랜만에 블로그에 들어온 것도 그 때문이다. 인생과업(?)이 어느정도 끝나가니 원래 하던 일들이 생각나기 시작한다. 글을 쓰고 있는 지금도 새벽 2시이지만 이렇게나마 짬을 내서 글을 다시 써본다.&lt;/p&gt;</description>
      <category>나의 기록</category>
      <author>moonionn</author>
      <guid isPermaLink="true">https://fierycoding.tistory.com/104</guid>
      <comments>https://fierycoding.tistory.com/104#entry104comment</comments>
      <pubDate>Thu, 13 Nov 2025 02:38:38 +0900</pubDate>
    </item>
    <item>
      <title>(스프링을 모르는 자의) 넥스트스텝 ATDD, 클린 코드 with Spring 교육 후기</title>
      <link>https://fierycoding.tistory.com/103</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;KakaoTalk_Photo_2024-08-19-17-00-45.jpeg&quot; data-origin-width=&quot;1440&quot; data-origin-height=&quot;1439&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Pn2Bq/btsI8Rd9HcY/f8mUJuh7KUZizqicICX810/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Pn2Bq/btsI8Rd9HcY/f8mUJuh7KUZizqicICX810/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Pn2Bq/btsI8Rd9HcY/f8mUJuh7KUZizqicICX810/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPn2Bq%2FbtsI8Rd9HcY%2Ff8mUJuh7KUZizqicICX810%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;400&quot; data-filename=&quot;KakaoTalk_Photo_2024-08-19-17-00-45.jpeg&quot; data-origin-width=&quot;1440&quot; data-origin-height=&quot;1439&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://edu.nextstep.camp/c/R89PYi5H/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://edu.nextstep.camp/c/R89PYi5H/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1717913795569&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;ATDD, 클린 코드 with Spring&quot; data-og-description=&quot;&quot; data-og-host=&quot;edu.nextstep.camp&quot; data-og-source-url=&quot;https://edu.nextstep.camp/c/R89PYi5H/&quot; data-og-url=&quot;https://edu.nextstep.camp/c/R89PYi5H&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/b4RSyw/hyWgU3Wski/5LVdLjknHF4bXK358Gc04k/img.png?width=650&amp;amp;height=430&amp;amp;face=0_0_650_430,https://scrap.kakaocdn.net/dn/dqvaaQ/hyWliaXFqy/dxxAzv2sdc7Z53nP0akE7K/img.png?width=650&amp;amp;height=430&amp;amp;face=0_0_650_430&quot;&gt;&lt;a href=&quot;https://edu.nextstep.camp/c/R89PYi5H/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://edu.nextstep.camp/c/R89PYi5H/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/b4RSyw/hyWgU3Wski/5LVdLjknHF4bXK358Gc04k/img.png?width=650&amp;amp;height=430&amp;amp;face=0_0_650_430,https://scrap.kakaocdn.net/dn/dqvaaQ/hyWliaXFqy/dxxAzv2sdc7Z53nP0akE7K/img.png?width=650&amp;amp;height=430&amp;amp;face=0_0_650_430');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;ATDD, 클린 코드 with Spring&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;edu.nextstep.camp&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;올 상반기 넥스트스텝에서 주관하는 ATDD 클린코드 교육을 들었습니다. 그리고 교육이 끝난지 반 년이 지난 지금, 이제서야 후기를 작성해보려 합니다. (상반기에 개인적으로 너무 바빴다고 핑계를...)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고로 스프링은커녕, 자바도 잘 모르는 상태로 교육에 참여했기 때문에 &quot;스프링을 해본 적이 없어 고민&quot;인 분들에게 이 후기가 조금이나마 도움이 될 수 있길 바라봅니다. &lt;b&gt;결론부터 말하자면, 고민하지 말고 신청하세요!&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;교육에 참여하게 된 이유&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;신입으로 입사한 첫 회사에서 2년을 쭉 다니다 보니, 슬슬 바깥세상이 궁금해지기 시작했습니다. 컨퍼런스에 참석해 연사의 이야기들을 듣는 것보다, 직접 부딪혀 무언가를 만들 수 있는 경험이 필요했습니다. 때마침 개발자 교육 플랫폼인 넥스트스텝에서 &quot;ATDD, 클린코드 with Spring&quot;이라는 강의가 오픈했고, 스프링 경험이 전무했지만 이래저래 따지면 할 수 있는 게 없을 것 같아 무작정 교육에 참여하였습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;ATDD란 무엇인가&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;누군가 &quot;ATDD&quot;를 언급하자, 어떤 사람이 &quot;ATDD는 TDD의 오타인가요?&quot;라고 되물은 걸 본 적이 있습니다. 이렇듯 ATDD는 TDD에 비해 개발자들에겐 낯선 존재입니다. 그렇다면 ATDD는 도대체 뭘까요? 쉬운 설명을 위해 예시 상황을 가져와 보았습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;KakaoTalk_Photo_2024-08-08-00-27-11.jpeg&quot; data-origin-width=&quot;811&quot; data-origin-height=&quot;811&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cAcUmD/btsIWDuNkm3/pfMkCAdGqb0koKw1K8p44K/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cAcUmD/btsIWDuNkm3/pfMkCAdGqb0koKw1K8p44K/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cAcUmD/btsIWDuNkm3/pfMkCAdGqb0koKw1K8p44K/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcAcUmD%2FbtsIWDuNkm3%2FpfMkCAdGqb0koKw1K8p44K%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;400&quot; data-filename=&quot;KakaoTalk_Photo_2024-08-08-00-27-11.jpeg&quot; data-origin-width=&quot;811&quot; data-origin-height=&quot;811&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기 개발자, 기획자, QA엔지니어, 디자이너로 구성된 팀이 있다고 가정해 보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 그들에게는, 한 달 내에 새로운 기능을 개발하고 배포까지 해야 하는 미션이 주어졌습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;KakaoTalk_Photo_2024-08-08-00-27-11.jpeg&quot; data-origin-width=&quot;811&quot; data-origin-height=&quot;811&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/by86CW/btsIXcKeY4u/NH4M1bWUcfA2JhImTrblRk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/by86CW/btsIXcKeY4u/NH4M1bWUcfA2JhImTrblRk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/by86CW/btsIXcKeY4u/NH4M1bWUcfA2JhImTrblRk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fby86CW%2FbtsIXcKeY4u%2FNH4M1bWUcfA2JhImTrblRk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;400&quot; data-filename=&quot;KakaoTalk_Photo_2024-08-08-00-27-11.jpeg&quot; data-origin-width=&quot;811&quot; data-origin-height=&quot;811&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;빠듯한 스케줄을 두고 이 팀은 분주해지기 시작합니다. 커뮤니케이션은 점점 산만해지고, 누군가는 업무 공유를 받지 못할 수도 있습니다. 떨어지는 업무 효율성만큼 결과물의 퀄리티도 낮아질 건 불 보듯 뻔합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 상황은 이 팀원들이 능력이 없어서 발생한 게 아닙니다. 아직 협력 시스템이 갖춰지지 않거나 총괄 매니저가 없는 팀이라면 어디서든 일어날 수 있는 상황입니다. 그렇다고 시스템 탓만 하며 이를 방치할 수는 없는 노릇입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2024-08-19 at 1.48.28 PM.png&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;804&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/2NyQl/btsI7i4RE39/kA71idMt5msILUofD9AXtK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/2NyQl/btsI7i4RE39/kA71idMt5msILUofD9AXtK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/2NyQl/btsI7i4RE39/kA71idMt5msILUofD9AXtK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F2NyQl%2FbtsI7i4RE39%2FkA71idMt5msILUofD9AXtK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;402&quot; data-filename=&quot;Screenshot 2024-08-19 at 1.48.28 PM.png&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;804&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;상황을 심각하게 받아들이고 있던 개발자가 어느 날, &quot;우리 이러지 말고 ATDD를 도입해 봅시다.&quot;라는 제안을 하며 &lt;b&gt;유저 시나리오&lt;/b&gt;라는 걸 작성해 옵니다. 이 유저 시나리오에 모두가 수긍한다면, 이것은 이제 해당 기능의 &lt;b&gt;&quot;인수 조건(Acceptance Criteria)&quot;&lt;/b&gt;이 됩니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;ATDD의 기본, 인수조건&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인수 조건은&amp;nbsp; &lt;b&gt;Given, When, Then&lt;/b&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;Given&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;ex: 로그인한 회원이 배송상품을 구매한 뒤&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시나리오를 진행하기 위한 최초 전제 조건입니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;When&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;ex: 내 배송현황을 조회하면&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시나리오가 테스트하고자 하는 바를 드러내는 메인 액션입니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Then&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;ex: 구매한 상품의 배송상태를 조회할 수 있다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시나리오의 예상결과입니다. 즉, 테스트의 예측 결괏값입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인수 조건에 따라 작성된 테스트를 &lt;b&gt;인수 테스트&lt;/b&gt;라 명칭 하며, 기능 개발 전 인수 테스트를 먼저 작성하는 걸 &lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;ATDD(Acceptance Test Driven Development)&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;라 칭합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;백엔드 API 개발 중 작성된 인수 테스트는 아마 아래와 비슷한 모양새를 지닐 겁니다.&lt;/p&gt;
&lt;pre id=&quot;code_1722522815144&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const VALID_USER = {
  email: &quot;test@test.com&quot;,
  password: &quot;test1234&quot;
};

const DELIVERY_PRODUCT = {
  id : 1,
  price: 100000
};

// Given : 로그인한 회원이 배송상품을 구매한 뒤
// When  : 내 배송현황을 조회하면
// Then  : 구매한 상품의 배송상태를 조회할 수 있다.
test('배송현황 조회 성공', () =&amp;gt; {
  const app = startTestServer();
  
  // Given
  const token = app.post('auth/token', VALID_USER);
  app.post(`purchase/${DELIVERY_PRODUCT.id}`, { Authorization: token.accessToken });
  
  // When
  const result = app.get('my/deliveries', { Authorization: token.accessToken });
  
  // Then
  expect(result).contains(DELIVERY_PRODUCT);
})&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인수 테스트를 작성함으로써 얻을 수 있는 이점은 아래와 같습니다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;기능 명세에 대한 합의점이 명확해진다. (앞선 예시와 같은 상황)&lt;/li&gt;
&lt;li&gt;API 호출 흐름이 명확해져 개발자들끼리의 의사소통이 원활해진다.&lt;/li&gt;
&lt;li&gt;빠르게 개발할 수 있다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1번에 대한 예시는 이미 서술했으므로 2번부터 순차적으로 그 이유를 예시와 같이 설명해 보겠습니다.&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;API 호출 흐름이 명확해져 개발자들끼리의 의사소통이 원활해진다&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 예시의 백엔드 테스트코드는 문서의 역할도 할 수 있습니다. 일반적인 경우 스웨거 같은 오픈 API가 제공되곤 합니다. 그러나 시나리오가 복잡한 기능이라면 API 호출 흐름도 복잡해집니다. 이 경우 인수테스트가 있다면, 상황에 따른 API 호출순서가 가시화된다는 장점이 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;빠르게 개발할 수 있다.&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;- 병합에 대한 명확한 기준점 제공&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;팀, 혹은 팀원에 따라 PR에 대한 승인 기준이 제각각인 경우는 흔합니다. 프로토타입을 개발 중인 팀이라면 더더욱 그럴 겁니다. 이럴 때 ATDD는 PR이 통과되어도 되는지에 대한 기준점을 제공해 줍니다. PR에 포함된 인수테스트가 통과한다면, 그 PR은 병합되어도 되는 것이죠. 기술적으로 아쉬운 부분은 추후 보완할 기회가 제공될 때 수정하도록 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;- 테스트 케이스를 먼저 공유하면 엉뚱한 길로 빠지지 않는다&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이건 TDD 개념이 보편적으로 주장하는 사안이기도 합니다. 실무에 적용했을 때 가장 효용성을 느낀 게 바로 이 부분인데, 코드를 짜기 전 테스트 코드를 합의하는 시간을 가지면 업무 방향성을 빠르게 잡는 데 도움이 되더랍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;왜냐하면 기능 명세에 대한 합의가 이루어졌다 하더라도 이를 구현하는 방향은 가지각색이기 때문입니다. API 엔드포인트 디자인은 물론, 어느 레포지토리에 이 기능을 작성할지 등등... 그렇기 때문에 인수 테스트 껍데기를 먼저 첨삭받는다면 엉뚱한 길로 샐 일을 막을 수 있습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1722146518742&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;describe('인증/인가 API', () =&amp;gt; {
  // Given: 액세스 토큰으로 로그인 한 뒤
  // When: 내 정보 페이지로 접속하면
  // Then: 내 정보를 조회할 수 있다
  test('로그인 성공' async () =&amp;gt; {
    // Given
    const login = api.post(`/login`)
                     .query({ email: 'test@test.co.kr', password: '1234' });
	// When
    const mypage = api.get(`/me`)
                      .query({ accessToken: login.accessToken })
    // Then           
    expect(mypage.body.email).toBe('test@test.co.kr');
  });
});&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 어떤 동료가 위와 같은 테스트 파일을 먼저 작성했다고 가정해 봅시다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt; 어떤 리뷰를 해주고 싶은가요? 저라면 아래와 같은 부분에 대해 코멘트할 것 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;POST /login이라는 엔드포인트는 /auth라는 대분류 엔드포인트 하위로 두었으면 좋겠고&lt;/li&gt;
&lt;li&gt;로그인할 때 이메일과 패스워드 정보를 쿼리스트링으로 보내는 것도 고쳤으면 싶고&lt;/li&gt;
&lt;li&gt;내 정보 조회할 때 액세스 토큰을 헤더가 아니라 쿼리스트링에 담는 것도 고쳤으면 싶네요.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 테스트 케이스를 작성하고 첨삭받는 데까지 걸리는 시간은 매우 짧습니다. 하지만 잘못 디자인된 API를 수정하는 데에는 엄청난 비용이 듭니다. 테스트 케이스를 미리 합의한다면 이런 불필요한 추가작업에 리소스를 낭비하지 않아도 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;회사 프로젝트에 도입해 보기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마침 복잡한 기능의 데모 프로덕트 개발을 진행하고 있던 터라 배운 바를 바로 적용해 보았습니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2024-07-30 at 12.28.50 AM.png&quot; data-origin-width=&quot;1426&quot; data-origin-height=&quot;270&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/F6219/btsIPWHSe6S/1c9klgjCJ0kLKUKFDzVRjk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/F6219/btsIPWHSe6S/1c9klgjCJ0kLKUKFDzVRjk/img.png&quot; data-alt=&quot;혹시 몰라 중요부분들 블러 처리 ㅎㅎ&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/F6219/btsIPWHSe6S/1c9klgjCJ0kLKUKFDzVRjk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FF6219%2FbtsIPWHSe6S%2F1c9klgjCJ0kLKUKFDzVRjk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1426&quot; height=&quot;270&quot; data-filename=&quot;Screenshot 2024-07-30 at 12.28.50 AM.png&quot; data-origin-width=&quot;1426&quot; data-origin-height=&quot;270&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;위 코드는 유닛테스트입니다. 이렇게 코어 모듈 개발만 담당하는 경우에도 Given/When/Then 템플릿을 활용해 함수의 사용법과 기능을 명시하면 테스트 설명이 좀 더 명확해집니다. 특히 해당 프로젝트가 비교적 복잡하고 낯선 도메인에 해당되었기 때문에 이런 방식은 개발자들 간 도메인 지식 간극을 줄이는 데 큰 도움이 되었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;개인적인 후기&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;자바/스프링을 못하는 사람도 할 수 있는가?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- YES, but...&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;남들보다 두 배 가량 애를 써야 비슷한 코드 흉내라도 낼 수 있습니다. 이 말인즉슨 회사 7시 퇴근해도 새벽 2시까지는 코딩해야 한다는 뜻&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;얼마나 힘든가?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- 자바/스프링을 할 줄 안다면 주말 포함 매일 1~2시간 정도만 투자하면 될 거 같은데, &lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 그게 아니라면...&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;433&quot; data-origin-height=&quot;235&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dUw03K/btsITwA5hSQ/9vgPk05TNEFYQgzfi5MaX1/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dUw03K/btsITwA5hSQ/9vgPk05TNEFYQgzfi5MaX1/img.gif&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dUw03K/btsITwA5hSQ/9vgPk05TNEFYQgzfi5MaX1/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/dUw03K/btsITwA5hSQ/9vgPk05TNEFYQgzfi5MaX1/img.gif&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;433&quot; height=&quot;235&quot; data-origin-width=&quot;433&quot; data-origin-height=&quot;235&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;다음에도 넥스트스텝 교육과정에 참여할 의향이 있는가?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- YES&lt;/b&gt;&lt;/p&gt;</description>
      <category>소프트웨어</category>
      <category>ATDD</category>
      <category>Java</category>
      <category>spring boot</category>
      <category>넥스트스텝</category>
      <author>moonionn</author>
      <guid isPermaLink="true">https://fierycoding.tistory.com/103</guid>
      <comments>https://fierycoding.tistory.com/103#entry103comment</comments>
      <pubDate>Mon, 19 Aug 2024 17:07:36 +0900</pubDate>
    </item>
    <item>
      <title>Row vs Column oriented Databases</title>
      <link>https://fierycoding.tistory.com/102</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2023-12-03 at 11.37.51 PM.png&quot; data-origin-width=&quot;898&quot; data-origin-height=&quot;900&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/YahXL/btsBil9iXwi/KNx4WvuSjvTKiY3p1ZBPB1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/YahXL/btsBil9iXwi/KNx4WvuSjvTKiY3p1ZBPB1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/YahXL/btsBil9iXwi/KNx4WvuSjvTKiY3p1ZBPB1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FYahXL%2FbtsBil9iXwi%2FKNx4WvuSjvTKiY3p1ZBPB1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;401&quot; data-filename=&quot;Screenshot 2023-12-03 at 11.37.51 PM.png&quot; data-origin-width=&quot;898&quot; data-origin-height=&quot;900&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;혹시 통계 데이터 조회를 위해 구글 빅쿼리 혹은 아마존 레드시프트를 사용한다는 말, 들어보셨을까요? 흔히 사용되는 MySQL, PostreSQL 등 외에도 이런 별도의 데이터 저장소들을 사용하는 경우는 많이 보았을 겁니다. 막연하게 &quot;그냥 MySQL과는 다른 어떤 통계용 DB? 데이터 웨어하우스? 인가보다?&quot; 라고 생각하고 넘어갈 수 있지만, 오늘은 이 데이터 저장소들이 어떻게 차이가 나는지 적어보고자 합니다.&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;데이터베이스 시스템은 데이터를 어떻게 저장하느냐에 따라 크게 두 가지로 나뉩니다. 하나는 행(row)을 중심으로 저장하는 &lt;b&gt;row oriented&lt;/b&gt; (한국말로는 행 기반, 혹은 행 지향), 다른 하나는 열(column)을 중심으로 저장하는 &lt;b&gt;column oriented&lt;/b&gt; (한국말로는 열 기반, 혹은 열 지향) 방식입니다. 말로만 설명하면 이해하기 어려울 듯 싶으니 예시 테이블을 하나 준비해 보았습니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;이해를 돕기 위한 payment 테이블 (primary key 외 인덱스 없음)&lt;/h2&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 123px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 14.2857%; height: 17px;&quot;&gt;&lt;b&gt;id&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; height: 17px;&quot;&gt;&lt;b&gt;payer&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; height: 17px;&quot;&gt;&lt;b&gt;amount&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; height: 17px;&quot;&gt;&lt;b&gt;state&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; height: 17px;&quot;&gt;&lt;b&gt;created_at&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; height: 17px;&quot;&gt;&lt;b&gt;updated_at&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 14.2857%; height: 17px;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; height: 17px;&quot;&gt;James&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; height: 17px;&quot;&gt;100&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; height: 17px;&quot;&gt;Completed&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; height: 17px;&quot;&gt;2022-12-03&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; height: 17px;&quot;&gt;2022-12-03&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 14.2857%; height: 17px;&quot;&gt;2&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; height: 17px;&quot;&gt;John&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; height: 17px;&quot;&gt;200&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; height: 17px;&quot;&gt;Cancelled&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; height: 17px;&quot;&gt;2022-12-03&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; height: 17px;&quot;&gt;2022-12-04&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;width: 14.2857%; height: 19px;&quot;&gt;3&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; height: 19px;&quot;&gt;Parker&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; height: 19px;&quot;&gt;300&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; height: 19px;&quot;&gt;Completed&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; height: 19px;&quot;&gt;2022-12-04&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; height: 19px;&quot;&gt;2022-12-04&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;width: 14.2857%; height: 19px;&quot;&gt;4&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; height: 19px;&quot;&gt;Anne&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; height: 19px;&quot;&gt;400&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; height: 19px;&quot;&gt;Cancelled&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; height: 19px;&quot;&gt;2022-12-05&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; height: 19px;&quot;&gt;2022-12-06&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 14.2857%; height: 17px;&quot;&gt;5&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; height: 17px;&quot;&gt;Adam&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; height: 17px;&quot;&gt;500&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; height: 17px;&quot;&gt;Completed&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; height: 17px;&quot;&gt;2022-12-09&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; height: 17px;&quot;&gt;2022-12-09&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 14.2857%; height: 17px;&quot;&gt;6&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; height: 17px;&quot;&gt;Mary&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; height: 17px;&quot;&gt;600&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; height: 17px;&quot;&gt;Requested&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; height: 17px;&quot;&gt;2022-12-09&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; height: 17px;&quot;&gt;2022-12-09&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 테이블과 같은 데이터를 저장해야 한다고 할 때, Row vs Column 데이터베이스는 어떤 차이를 보일까요?&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;두 시스템을 비교하기에 앞서 디스크 읽기의 최소 단위인 &lt;b&gt;블락(block)&lt;/b&gt;에 대해 잠깐 설명하고자 합니다. 우리는 데이터베이스, 즉 디스크에서 데이터를 읽어오는 작업을&lt;b&gt; I/O(Input/Ouput)&lt;/b&gt; 라고도 표현하죠. 이 때 한 번의 I/O로 읽어오는 최소 데이터 단위를 블락(block)이라고 합니다. 즉 최대한 적은 I/O로 원하는 데이터를 얻는 것이 효율적인 디비 사용의 핵심이라고 할 수 있습니다. 이 row/column oriented 데이터베이스의 차이점 또한 이 블락 단위 안에 데이터가 어떻게 저장되는지에 따라 생긴다는 점을 일러두고 싶습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;i&gt;* MySQL의 경우 디폴트 블락 사이즈는 16KB&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Row-oriented database&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Row-oriented의 경우 행 단위로 하나의 블락이 구성됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예시의 payment 테이블인 경우 간단하게 아래 두 개의 블럭으로 구성된다고 가정해 보겠습니다. 블럭 안에 여러 행들이 포함되어 있으니, 내가 원하는 건 단 하나의 행 데이터라 하더라도 해당 블락 안에 포함된 그 외 행들도 읽어오게 되어 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;블럭 1&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 56px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 14.2857%; height: 17px;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; height: 17px;&quot;&gt;James&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; height: 17px;&quot;&gt;100&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; height: 17px;&quot;&gt;Completed&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; height: 17px;&quot;&gt;2022-12-03&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; height: 17px;&quot;&gt;2022-12-03&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 14.2857%; height: 17px;&quot;&gt;2&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; height: 17px;&quot;&gt;John&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; height: 17px;&quot;&gt;200&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; height: 17px;&quot;&gt;Cancelled&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; height: 17px;&quot;&gt;2022-12-03&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; height: 17px;&quot;&gt;2022-12-04&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;width: 14.2857%; height: 19px;&quot;&gt;3&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; height: 19px;&quot;&gt;Parker&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; height: 19px;&quot;&gt;300&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; height: 19px;&quot;&gt;Completed&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; height: 19px;&quot;&gt;2022-12-04&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; height: 19px;&quot;&gt;2022-12-04&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;블럭2&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 49px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;width: 14.2857%; height: 19px;&quot;&gt;4&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; height: 19px;&quot;&gt;Anne&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; height: 19px;&quot;&gt;400&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; height: 19px;&quot;&gt;Cancelled&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; height: 19px;&quot;&gt;2022-12-05&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; height: 19px;&quot;&gt;2022-12-06&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 14.2857%; height: 17px;&quot;&gt;5&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; height: 17px;&quot;&gt;Adam&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; height: 17px;&quot;&gt;500&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; height: 17px;&quot;&gt;Completed&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; height: 17px;&quot;&gt;2022-12-09&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; height: 17px;&quot;&gt;2022-12-09&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 14.2857%; height: 17px;&quot;&gt;6&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; height: 17px;&quot;&gt;Mary&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; height: 17px;&quot;&gt;600&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; height: 17px;&quot;&gt;Requested&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; height: 17px;&quot;&gt;2022-12-09&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; height: 17px;&quot;&gt;2022-12-09&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 여기서 아래와 같은 쿼리를 날린다면 내부적으로 어떤 일이 일어날까요?&lt;/p&gt;
&lt;pre id=&quot;code_1701538519272&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT payer FROM payment WHERE state = 'Requested';&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;첫 번째 읽어온 블럭의 경우 state가 Requested인 행이 없으니 다음 블럭을 또 읽어와야 합니다. 두 번째 읽어온 블럭에 Requested라는 값이 있는 행(id=6)을 발견하게 되는데 해당 행에 payer 컬럼에 대한 값도 포함되어 있으므로 Mary라는 결과물을 얻을 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예시의 경우 두 개의 블럭만 있었지만 만일 실세계에서 사용되는 데이터베이스였다면 엄청나게 많은 블락을 읽어와야 하고, 이 말인 즉슨 엄청나게 많은 I/O 작업을 필요로 한다는 뜻이기도 합니다.&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;해당 쿼리를 row-oriented 데이터베이스인 MySQL에서 explain 해봐도 풀스캔을 시행하는 걸 확인할 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2023-12-03 at 3.01.47 AM.png&quot; data-origin-width=&quot;1768&quot; data-origin-height=&quot;146&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pE8rm/btsBjFeFeSS/bIpveepbLEhwQ5QAXOmNv0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pE8rm/btsBjFeFeSS/bIpveepbLEhwQ5QAXOmNv0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pE8rm/btsBjFeFeSS/bIpveepbLEhwQ5QAXOmNv0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpE8rm%2FbtsBjFeFeSS%2FbIpveepbLEhwQ5QAXOmNv0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1768&quot; height=&quot;146&quot; data-filename=&quot;Screenshot 2023-12-03 at 3.01.47 AM.png&quot; data-origin-width=&quot;1768&quot; data-origin-height=&quot;146&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;pre id=&quot;code_1701540451213&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT * FROM payment WHERE id=6;&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;조건절에 쓰인 id 컬럼은 primary key이기 때문에 엉뚱한 블락을 가지고 올 필요도 없이 바로 아래 행에 접근할 수 있습니다. (primary key, index에 대한 글이 아니니 추가 설명은 스킵하도록 합니다.)&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 99.7674%; height: 12px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 14.2857%; height: 17px;&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;6&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; height: 17px;&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;Mary&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; height: 17px;&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;600&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; height: 17px;&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;Requested&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; height: 17px;&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;2022-12-09&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; height: 17px;&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;2022-12-09&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;중요한 점은, row-oriented의 경우 이미 이 행이 가지고 있는 컬럼값들이 동시에 조회되기 때문에 SELECT * 에 대한 부담이 비교적 덜 하다는 점입니다. 이 부분은 후술할 column-oriented를 보면 얼마나 극명하게 차이가 나는지 아실 수 있습니다.&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;이제 Aggregation 성격의 쿼리를 실행해 보겠습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1701540980598&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT sum(amount) FROM payment;&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;첫 번째 블럭을 읽어옵니다. 블럭에 포함된 행들의 amount 컬럼 값들을 합칩니다.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 53px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 14.2857%; height: 17px;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; height: 17px;&quot;&gt;James&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; height: 17px;&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;100&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; height: 17px;&quot;&gt;Completed&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; height: 17px;&quot;&gt;2022-12-03&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; height: 17px;&quot;&gt;2022-12-03&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 14.2857%; height: 17px;&quot;&gt;2&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; height: 17px;&quot;&gt;John&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; height: 17px;&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;200&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; height: 17px;&quot;&gt;Cancelled&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; height: 17px;&quot;&gt;2022-12-03&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; height: 17px;&quot;&gt;2022-12-04&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;width: 14.2857%; height: 19px;&quot;&gt;3&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; height: 19px;&quot;&gt;Parker&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; height: 19px;&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;300&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; height: 19px;&quot;&gt;Completed&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; height: 19px;&quot;&gt;2022-12-04&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; height: 19px;&quot;&gt;2022-12-04&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 두 번째 블럭을 읽어서 동일한 작업을 진행합니다. 예상 가능하다시피 테이블의 규모가 크면 클 수록 I/O는 늘어납니다.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 49px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;width: 14.2857%; height: 19px;&quot;&gt;4&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; height: 19px;&quot;&gt;Anne&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; height: 19px;&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;400&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; height: 19px;&quot;&gt;Cancelled&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; height: 19px;&quot;&gt;2022-12-05&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; height: 19px;&quot;&gt;2022-12-06&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 14.2857%; height: 17px;&quot;&gt;5&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; height: 17px;&quot;&gt;Adam&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; height: 17px;&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;500&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; height: 17px;&quot;&gt;Completed&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; height: 17px;&quot;&gt;2022-12-09&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; height: 17px;&quot;&gt;2022-12-09&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 14.2857%; height: 17px;&quot;&gt;6&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; height: 17px;&quot;&gt;Mary&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; height: 17px;&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;600&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; height: 17px;&quot;&gt;Requested&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; height: 17px;&quot;&gt;2022-12-09&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; height: 17px;&quot;&gt;2022-12-09&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 경우도 마찬가지로 풀 테이블 스캔을 시행해야 함을 알 수 있습니다. 다시 설명하자면, 현재 나의 관심 밖에 있는 payer, state, created_at, updated_at 컬럼 데이터들 또한 모두 메모리에 올라가게 됨을 의미합니다.&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;위 사례들에서 보았듯 통계성 데이터 조회에 row-oriented는 적합하지 않습니다. 물론 인덱스를 별도로 추가하면 또 달라지겠지만, 인덱스는 어디까지나 보충장치일 뿐 이는 근본적으로 사용 목적에 부합한 툴이 아님을 알 수 있습니다. 그리고 아무리 인덱스나 쿼리 튜닝으로 호흡기를 달아놔도 column-oriented와 비교했을 때 그 한계가 명확히 드러나는 시점이 올 수도 있습니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;Column-oriented database&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇다면 column-oriented는 뭐가 다를까요? 아까 테이블을 다시 봅시다.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 123px;&quot; border=&quot;1&quot; data-ke-style=&quot;style1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 14.2857%; height: 17px;&quot;&gt;&lt;b&gt;id&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; height: 17px;&quot;&gt;&lt;b&gt;payer&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; height: 17px;&quot;&gt;&lt;b&gt;amount&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; height: 17px;&quot;&gt;&lt;b&gt;state&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; height: 17px;&quot;&gt;&lt;b&gt;created_at&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; height: 17px;&quot;&gt;&lt;b&gt;updated_at&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 14.2857%; height: 17px;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; height: 17px;&quot;&gt;James&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; height: 17px;&quot;&gt;100&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; height: 17px;&quot;&gt;Completed&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; height: 17px;&quot;&gt;2022-12-03&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; height: 17px;&quot;&gt;2022-12-03&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 14.2857%; height: 17px;&quot;&gt;2&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; height: 17px;&quot;&gt;John&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; height: 17px;&quot;&gt;200&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; height: 17px;&quot;&gt;Cancelled&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; height: 17px;&quot;&gt;2022-12-03&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; height: 17px;&quot;&gt;2022-12-04&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;width: 14.2857%; height: 19px;&quot;&gt;3&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; height: 19px;&quot;&gt; Parker&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; height: 19px;&quot;&gt;300&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; height: 19px;&quot;&gt;Completed&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; height: 19px;&quot;&gt;2022-12-04&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; height: 19px;&quot;&gt;2022-12-04&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;width: 14.2857%; height: 19px;&quot;&gt;4&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; height: 19px;&quot;&gt;Anne&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; height: 19px;&quot;&gt;400&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; height: 19px;&quot;&gt;Cancelled&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; height: 19px;&quot;&gt;2022-12-05&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; height: 19px;&quot;&gt;2022-12-06&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 14.2857%; height: 17px;&quot;&gt;5&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; height: 17px;&quot;&gt;Adam&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; height: 17px;&quot;&gt;500&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; height: 17px;&quot;&gt;Completed&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; height: 17px;&quot;&gt;2022-12-09&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; height: 17px;&quot;&gt;2022-12-09&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 14.2857%; height: 17px;&quot;&gt;6&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; height: 17px;&quot;&gt;Mary&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; height: 17px;&quot;&gt;600&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; height: 17px;&quot;&gt;Requested&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; height: 17px;&quot;&gt;2022-12-09&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; height: 17px;&quot;&gt;2022-12-09&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;column-oriented의 경우 블락 단위는 대략 아래와 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;동일한 컬럼의 값 군집이 하나의 블락을 이루며, 각 데이터들에는 어떤 행에 매칭되는 데이터인지 유추할 수 있는 유니크 키(여기선 primary key, 즉 id)가 포함되어 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;u&gt;&lt;i&gt;(아래 다이어그램은 단순화되었지만 하나의 컬럼 != 하나의 블락 입니다. 엄연히 블락도 리밋 사이즈가 있기 때문에 하나의 컬럼에 대해 여러 블락이 생성됩니다!)&lt;/i&gt;&lt;/u&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 16.6667%;&quot;&gt;James:1&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%;&quot;&gt;John:2&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%;&quot;&gt;Parker:3&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%;&quot;&gt;Anne:4&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%;&quot;&gt;Adam:5&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%;&quot;&gt;Mary:6&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 16.6667%;&quot;&gt;100:1&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%;&quot;&gt;200:2&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%;&quot;&gt;300:3&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%;&quot;&gt;400:4&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%;&quot;&gt;500:5&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%;&quot;&gt;600:6&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 17px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 16.6667%; height: 17px;&quot;&gt;Completed:1&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%; height: 17px;&quot;&gt;Cancelled:2&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%; height: 17px;&quot;&gt;Completed:3&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%; height: 17px;&quot;&gt;Cancelled:4&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%; height: 17px;&quot;&gt;Completed:5&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%; height: 17px;&quot;&gt;Requested:6&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 16.6667%;&quot;&gt;2022-12-03:1&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%;&quot;&gt;2022-12-03:2&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%;&quot;&gt;2022-12-04:3&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%;&quot;&gt;2022-12-05:4&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%;&quot;&gt;2022-12-09:5&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%;&quot;&gt;2022-12-09:6&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 16.6667%;&quot;&gt;2022-12-03:1&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%;&quot;&gt;2022-12-04:2&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%;&quot;&gt;2022-12-04:3&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%;&quot;&gt;2022-12-06:4&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%;&quot;&gt;2022-12-09:5&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%;&quot;&gt;2022-12-09:6&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 여기에 아까 row-oriented에 사용했던 쿼리를 순차적으로 사용해 비교해보겠습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1701543291231&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT payer FROM payment WHERE state = 'Requested';&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;WHERE 절에 쓰인 것은 state 컬럼입니다. 따라서 우리는 state 컬럼에 대한 블락을 조회하면 됩니다. 그리고 그 중 Requested 값을 지닌 데이터는 id 6을 가리키고 있습니다.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 17px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 16.6667%; height: 17px;&quot;&gt;Completed:1&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%; height: 17px;&quot;&gt;Cancelled:2&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%; height: 17px;&quot;&gt;Completed:3&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%; height: 17px;&quot;&gt;Cancelled:4&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%; height: 17px;&quot;&gt;Completed:5&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%; height: 17px;&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;Requested:6&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그럼 이제 payer 컬럼에 대한 블락을 조회해 해당 id를 지닌 데이터를 조회하면 원하는 값을 얻을 수 있습니다.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 16.6667%;&quot;&gt;James:1&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%;&quot;&gt;John:2&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%;&quot;&gt;Parker:3&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%;&quot;&gt;Anne:4&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%;&quot;&gt;Adam:5&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%;&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;Mary:6&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;힌트 없이 모든 데이터를 스캔해야 했던 row-oriented와 비교해보면 효율적으로 보일 수 있습니다만, 이는 단순히 payer라는 단 하나의 컬럼만을 조회하기 때문입니다. 만일 payer 뿐 아니라 state, amount 등 여러 컬럼을 조회하려 한다면 과연 그 때도 효율적이라고 할 수 있을까요?&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;pre id=&quot;code_1701543755171&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT * FROM payment WHERE id=6;&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 데이터마다 id값을 지니고 있기에 찾는게 어려운 건 아닐테지만, 문제는 모든 컬럼을 가지고 와야 하기 때문에 모든 컬럼에 대한 블락을 읽어와야 합니다.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 16.6667%;&quot;&gt;James:1&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%;&quot;&gt;John:2&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%;&quot;&gt;Parker:3&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%;&quot;&gt;Anne:4&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%;&quot;&gt;Adam:5&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%;&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;Mary:6&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 16.6667%;&quot;&gt;100:1&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%;&quot;&gt;200:2&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%;&quot;&gt;300:3&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%;&quot;&gt;400:4&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%;&quot;&gt;500:5&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%;&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;600:6&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 17px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Completed:1&lt;/td&gt;
&lt;td&gt;Cancelled:2&lt;/td&gt;
&lt;td&gt;Completed:3&lt;/td&gt;
&lt;td&gt;Cancelled:4&lt;/td&gt;
&lt;td&gt;Completed:5&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;Requested:6&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 16.6667%;&quot;&gt;2022-12-03:1&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%;&quot;&gt;2022-12-03:2&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%;&quot;&gt;2022-12-04:3&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%;&quot;&gt;2022-12-05:4&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%;&quot;&gt;2022-12-09:5&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%;&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;2022-12-09:6&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 16.6667%;&quot;&gt;2022-12-03:1&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%;&quot;&gt;2022-12-04:2&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%;&quot;&gt;2022-12-04:3&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%;&quot;&gt;2022-12-06:4&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%;&quot;&gt;2022-12-09:5&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%;&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;2022-12-09:6&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단 한 번의 I/O만 필요로 했던 row-oriented와 비교해보면 column-oriented에서는 상당량의 I/O 작업이 필요하다는 걸 알 수 있습니다. column-oriented를 사용한다면 SELECT * 와 같은 액션은 되도록 피하는 게 좋겠습니다.&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;이제 column-oriented가 빛을 발할 수 있는 aggregation성 쿼리입니다.&lt;/p&gt;
&lt;pre id=&quot;code_1701544224851&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT sum(amount) FROM payment;&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;이미 예상했겠지만 amount라는 하나의 컬럼만 읽어오면 되기 때문에 불필요한 그 외 블락들을 읽어올 필요가 없게 됩니다. 앞선 row-oriented와 비교해보면 상당히 효율적임을 알 수 있습니다.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: ;&quot;&gt;
&lt;td style=&quot;width: 16.6667%;height: ;&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;100:1&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%;height: ;&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;200:2&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%;height: ;&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;300:3&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%;height: ;&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;400:4&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%;height: ;&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;500:5&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%;height: ;&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;600:6&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;결론&lt;/h2&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;row-oriented database&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 여러 컬럼을 조회하는 쿼리인 경우 효율적이다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 불필요한 컬럼과 같은 무의미한 데이터들까지 조회해올 수 있다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 위 이유로 인해 데이터 집합/연산 시 매우 비효율적이다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 데이터 저장 시 맨 마지막 블락 공간에 행을 추가해주기만 하면 되기에 쓰기가 빠르다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 대표적인 예: MySQL, Oracle, PostreSQL&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;column-based database&lt;/h4&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;- row-oriented와 반대의 이유로 데이터 집합/연산 시 효율적이다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 데이터 저장 시 각 컬럼들에 해당하는 구조물마다 삽입 처리를 해줘야 해서 쓰기가 느리다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 대표적인 예: Redshift, BigQuery, Cassandra, &lt;a href=&quot;https://wiki.postgresql.org/wiki/ColumnOrientedSTorage&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;PostreSQL&lt;/a&gt; (postre는 오픈소스답게 두 옵션을 다 지원하는 듯)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>데이터베이스</category>
      <category>database</category>
      <category>DBMS</category>
      <category>데이터베이스</category>
      <author>moonionn</author>
      <guid isPermaLink="true">https://fierycoding.tistory.com/102</guid>
      <comments>https://fierycoding.tistory.com/102#entry102comment</comments>
      <pubDate>Mon, 4 Dec 2023 00:29:15 +0900</pubDate>
    </item>
    <item>
      <title>[이모지와 유니코드]&amp;quot; &amp;quot; 얘랑 &amp;quot; &amp;quot; 얘가 같은 문자로 보이나요?</title>
      <link>https://fierycoding.tistory.com/101</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;(공부하기 싫어서 잼는 글 써보기)&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2023-11-01 at 11.56.49 PM.png&quot; data-origin-width=&quot;1092&quot; data-origin-height=&quot;1096&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/0SbFP/btszzEQns7T/trdjjBUuOeHnkyDKguVnQ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/0SbFP/btszzEQns7T/trdjjBUuOeHnkyDKguVnQ1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/0SbFP/btszzEQns7T/trdjjBUuOeHnkyDKguVnQ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F0SbFP%2FbtszzEQns7T%2FtrdjjBUuOeHnkyDKguVnQ1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;360&quot; height=&quot;1096&quot; data-filename=&quot;Screenshot 2023-11-01 at 11.56.49 PM.png&quot; data-origin-width=&quot;1092&quot; data-origin-height=&quot;1096&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;KakaoTalk_Snapshot_20231027_214708.png&quot; data-origin-width=&quot;780&quot; data-origin-height=&quot;1296&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bPM5on/btszlHrpAg0/3gobTbZrjQMGXB2cCucl11/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bPM5on/btszlHrpAg0/3gobTbZrjQMGXB2cCucl11/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bPM5on/btszlHrpAg0/3gobTbZrjQMGXB2cCucl11/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbPM5on%2FbtszlHrpAg0%2F3gobTbZrjQMGXB2cCucl11%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;498&quot; data-filename=&quot;KakaoTalk_Snapshot_20231027_214708.png&quot; data-origin-width=&quot;780&quot; data-origin-height=&quot;1296&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;며칠 전 친구와 대화 도중, 맥(Mac)환경에서 하얀피부의 사람신체 이모지를 보내면 윈도우 환경을 쓰는 친구에게는 사람신체 + 웬 사각형 블락이 표기된다는 사실을 알게 되었습니다.&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 alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;84jxyp.gif&quot; data-origin-width=&quot;260&quot; data-origin-height=&quot;77&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wuQ5f/btszCJ3WuQK/THBaoeIH26LWXQzE0wIgbK/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wuQ5f/btszCJ3WuQK/THBaoeIH26LWXQzE0wIgbK/img.gif&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wuQ5f/btszCJ3WuQK/THBaoeIH26LWXQzE0wIgbK/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/wuQ5f/btszCJ3WuQK/THBaoeIH26LWXQzE0wIgbK/img.gif&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;260&quot; height=&quot;77&quot; data-filename=&quot;84jxyp.gif&quot; data-origin-width=&quot;260&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;&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;h2 data-ke-size=&quot;size26&quot;&gt;유니코드란?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우리가 컴퓨터로 보는 이모지 글자 형태는 유니코드(Unicode)로 구현됩니다. 유니코드는 현존하는 대부분의 문자를 표현할 수 있죠. 이모지도 여기 포함됩니다. 그렇다면 유니코드는 어떻게 이 세상에 존재하는 그 많은 글자들을 표현할 수 있는걸까요?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;컴퓨터는 0과 1로만 동작한다는 이야기는 이 분야 전문가가 아니더라도 한 번쯤은 들어봤을법할 정도로 유명합니다. 여기서 0,1이 들어가는 자리의 단위를 비트(bit)라고 부르죠. 그리고 유니코드는 32비트를 활용할 수 있습니다. 그럼 한 비트 당 두 종류의 표현법(0,1)을 쓸 수 있는 거니까, 유니코드는 2의 32제곱, 즉 4,294,967,296개의 문자를 구현할 여유가 있습니다. (참고로 사실 정말 42억대의 글자를 표현할 수 있는 건 아닙니다만 이 이야기는 여기서 서술하지 않도록 하겠습니다.)&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;유니코드 표현식&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;유니코드는 코드 포인트(code point)라는 이름의 각자 고유한 코드를 가지고 있습니다. 이는 U+ (혹은 \u) 뒤에 16진수 넘버링 규칙을 준수하며, 범위는 U+0000 부터 U+10FFFF 까지입니다.&lt;/p&gt;
&lt;pre id=&quot;code_1698755004311&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;U+270B  &amp;gt; '✋'
U+0041  &amp;gt; 'A'
U+0023  &amp;gt; '#'&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;JAVA&lt;/p&gt;
&lt;pre id=&quot;code_1698755397764&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;String str=&quot;\u270B&quot;
str ==&amp;gt; &quot;✋&quot;

String str=&quot;\u0041&quot;
str ==&amp;gt; &quot;A&quot;

String str=&quot;\u0023&quot;
str ==&amp;gt; &quot;#&quot;&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;Javascript&lt;/p&gt;
&lt;pre id=&quot;code_1698755530958&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;str='\u{270B}'
'✋'

str='\u{0041}'
'A'

str='\u{0023}'
'#'&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;유니코드 조합&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;재밌는 사실은, 어떤 문자(character)들은 여러 코드 포인트들의 조합으로 구성되었다는 점입니다.  &amp;zwj;  여기 농부 아저씨 이모지를 예시로 들어보겠습니다. 이 농부를 표현하기 위해 필요한 유니코드 코드 포인트는 총 몇개일까요?&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;Javascript&lt;/p&gt;
&lt;pre id=&quot;code_1698758148881&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;farmer='\u{1F468}\u{1F3FB}\u{200D}\u{1F33E}'
' &amp;zwj; '&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;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2023-10-31 at 10.20.49 PM.png&quot; data-origin-width=&quot;274&quot; data-origin-height=&quot;350&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cRWfB3/btszwiTR8nr/z7KFjMDMkLg5VFdAQZ72Xk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cRWfB3/btszwiTR8nr/z7KFjMDMkLg5VFdAQZ72Xk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cRWfB3/btszwiTR8nr/z7KFjMDMkLg5VFdAQZ72Xk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcRWfB3%2FbtszwiTR8nr%2Fz7KFjMDMkLg5VFdAQZ72Xk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;250&quot; height=&quot;319&quot; data-filename=&quot;Screenshot 2023-10-31 at 10.20.49 PM.png&quot; data-origin-width=&quot;274&quot; data-origin-height=&quot;350&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;답은 총 네 개 입니다. 코드 포인트를 하나하나 살펴보면 아래와 같습니다. 성인 남성 + 밝은 피부 톤 + 빈 공백 + 수확물 이모지의 조합으로 구성되었다는 것이 파악됩니다. 하나하나 살펴보면 밝은 피부의 성인 남성이 수확물을 들고 있는 걸 표현했구나... 라는걸 가늠할 수 있습니다만, 중간에 껴있는 +U200D 이건 뭘까요?&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;+U200D 코드는 흔히 &lt;b&gt;Zero Width Joiner&lt;/b&gt;, 줄여서 &lt;b&gt;ZWJ&lt;/b&gt;라 불립니다. (즈윋ㅈ..? 라고 발음하는듯...?) 이는 화면에 실제로 표현되는 문자는 아니며, 어떤 문자 뒤에 ZWJ가 붙으면 또 다른 문자와 조합해 새로운 문자를 표현한다고 볼 수 있습니다. 그래서 농부 = 사람 + 수확물 이기 때문에 ZWJ가 붙은 것이죠. 또 재밌는 사실을 말씀드리자면 국기 이모지도 사실 ZWJ를 사용한 여러 이모지의 조합입니다. 네모박스 K와 네모박스 R을 조합하면 태극기가 나온다는 사실 알고 계셨나요?&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2023-10-31 at 10.59.19 PM.png&quot; data-origin-width=&quot;612&quot; data-origin-height=&quot;266&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/erX9Ka/btszwhm5dGO/NFOouNzL4AXcm85Dfm6W01/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/erX9Ka/btszwhm5dGO/NFOouNzL4AXcm85Dfm6W01/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/erX9Ka/btszwhm5dGO/NFOouNzL4AXcm85Dfm6W01/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FerX9Ka%2Fbtszwhm5dGO%2FNFOouNzL4AXcm85Dfm6W01%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;130&quot; data-filename=&quot;Screenshot 2023-10-31 at 10.59.19 PM.png&quot; data-origin-width=&quot;612&quot; data-origin-height=&quot;266&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;이 외에도 ZWJ는 다른 언어에도 활용되곤 합니다. 아랍어, 말레이시아어 등 여러 국가들의 언어를 표현할 때도 필요한 요즘 시대 필수 유니코드라고 할 수 있죠.&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;zwj; )를 보면 피부색 조합에는 ZWJ가 사용되지 않음을 확인할 수 있습니다. 이는 피부색 조합의 경우 Fitzpatrick Skin Modifier 라는 유니코드가 붙으면 자동으로 피부색 결합이 되기 때문입니다. FitzPatrick Skin Modifier 유니코드 코드 포인트 범위는 +U1F3FB 부터 +U1F3FF 로 구성되어 있습니다.&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;그렇다고 아무 이모지나 스킨 모디파이어와 조합할 순 없겠죠? (ex:   + white skin tone ????) 스킨 모디파이어와 조합할 수 있는 이모지인지를 판별할 수 있는 기능을, 자바스크립트는 내장 지원한다는 사실을 아시나요?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1698845614119&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;gt; /\p{Emoji_Modifier_Base}/u.test(' ')
true

&amp;gt; /\p{Emoji_Modifier_Base}/u.test(' ')
false&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자바스크립트 같은 경우 위처럼 Emoji_Modifier_Base 라는 regexp를 별도 선언 없이 사용하면 스킨톤 변경이 가능한 이모지인지 아닌지를 판별해줍니다. 정말 편리한 기능이지 않습니까!!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;실생활 적용&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특정 텍스트를 20바이트까지만 잘라서 가공해줘~ 라는 요청이 들어왔다고 칩시다. 해당 문자는 이모지를 포함한 UTF-8 인코딩 텍스트라 가정합시다. (유니코드와 UTF-8에 대해서는 나중에 2탄 쓸 일 있으면 그때 서술하겠습니다  . UTF-8에 대해 잘 모르신다면 지금은 그냥 그렇다 치고 이해 바랍니다.)&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;pre id=&quot;code_1698847437138&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const text = '놓칠 수 없는 가족 세일! &amp;zwj; &amp;zwj; &amp;zwj;  오늘부터 10일간 진행됩니다';&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;만약 이런 이모지 특성을 고려하지 않고 텍스트를 트림(trim)해버린다면 무슨 일이 발생할까요?&lt;/p&gt;
&lt;pre id=&quot;code_1698847478049&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;function trimTextToBytes(text) {
  const MAX_BYTES = 50;

  let trimmedText = text;
  while (Buffer.byteLength(trimmedText, 'utf8') &amp;gt; MAX_BYTES) {
    trimmedText = trimmedText.slice(0, -1);
  }
  return trimmedText;
}

const text = '놓칠 수 없는 가족 세일! &amp;zwj; &amp;zwj; &amp;zwj;  오늘부터 10일간 진행됩니다';
const trimmedText = trimTextToBytes(text);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2023-11-01 at 11.05.01 PM.png&quot; data-origin-width=&quot;614&quot; data-origin-height=&quot;106&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c9cI0x/btszAmhBmLZ/PuvhlgFr5QzshnO1LLjQGK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c9cI0x/btszAmhBmLZ/PuvhlgFr5QzshnO1LLjQGK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c9cI0x/btszAmhBmLZ/PuvhlgFr5QzshnO1LLjQGK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc9cI0x%2FbtszAmhBmLZ%2FPuvhlgFr5QzshnO1LLjQGK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;614&quot; height=&quot;106&quot; data-filename=&quot;Screenshot 2023-11-01 at 11.05.01 PM.png&quot; data-origin-width=&quot;614&quot; data-origin-height=&quot;106&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;결과는 위와 같습니다. 이모지 결합을 고려하지 않아 아들래미가 빠진 이모지가 표현되게 됩니다. 아들램을 제거함으로써 50 바이트 리밋을 충족하기는 하나, 기존 텍스트와는 좀 다른 형상이 표현되게 되는 것이죠. 앞서 말한 내용들을 고려해 코드를 수정하면 이런 상황을 피할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1698850157353&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;function trimTextToBytes(text) {
  const MAX_BYTES = 50;
  const EMOJI_REGEXP = /([\uD800-\uDBFF][\uDC00-\uDFFF])/;
  const EMOJI_ZERO_WIDTH_JOINER = '\u200D';

  let trimmedText = '';
  let detectedEmoji = '';
  const splitTextByEmoji = text.split(EMOJI_REGEXP);

  splitTextByEmoji.forEach((text) =&amp;gt; {
    if (
      Buffer.byteLength(trimmedText + text + detectedEmoji, 'utf8') &amp;lt; MAX_BYTES
    ) {
      const isPlainText =
        !EMOJI_REGEXP.test(text) &amp;amp;&amp;amp; text !== EMOJI_ZERO_WIDTH_JOINER;

      if (isPlainText) {
        if (detectedEmoji) {
          trimmedText += detectedEmoji;
          detectedEmoji = '';
        }
        trimmedText += text;
      } else {
        detectedEmoji += text;
      }
    }
  });
  return trimmedText;
}

const text = '놓칠 수 없는 가족 세일! &amp;zwj; &amp;zwj; &amp;zwj;  오늘부터 10일간 진행됩니다';
const trimmedText = trimTextToBytes(text);
console.log(trimmedText);&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2023-11-01 at 11.49.53 PM.png&quot; data-origin-width=&quot;616&quot; data-origin-height=&quot;106&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/v7DyP/btszzVdfkQ7/1hUZNkSLPWN5D8rHNGhB7K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/v7DyP/btszzVdfkQ7/1hUZNkSLPWN5D8rHNGhB7K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/v7DyP/btszzVdfkQ7/1hUZNkSLPWN5D8rHNGhB7K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fv7DyP%2FbtszzVdfkQ7%2F1hUZNkSLPWN5D8rHNGhB7K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;616&quot; height=&quot;106&quot; data-filename=&quot;Screenshot 2023-11-01 at 11.49.53 PM.png&quot; data-origin-width=&quot;616&quot; data-origin-height=&quot;106&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;</description>
      <category>소프트웨어</category>
      <category>Unicode</category>
      <category>유니코드</category>
      <category>프로그래밍</category>
      <author>moonionn</author>
      <guid isPermaLink="true">https://fierycoding.tistory.com/101</guid>
      <comments>https://fierycoding.tistory.com/101#entry101comment</comments>
      <pubDate>Wed, 1 Nov 2023 23:59:38 +0900</pubDate>
    </item>
  </channel>
</rss>