<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Clzzi 개발 블로그]]></title><description><![CDATA[Frontend 개발자 손민재입니다.  방문해 주셔서 감사합니다!]]></description><link>https://clzzi.dev</link><generator>GatsbyJS</generator><lastBuildDate>Sun, 19 Oct 2025 11:55:29 GMT</lastBuildDate><item><title><![CDATA[정들었던 첫 회사를 떠나며]]></title><description><![CDATA[어느덧 프론트엔드 엔지니어로 일한 지도 3년이 흘러, 4년 차 엔지니어가 되었습니다. 2022년 10월, 고등학교 3학년 때 모두싸인에 입사해 3년이 지난 2025년 1…]]></description><link>https://clzzi.dev/first-job-leave/</link><guid isPermaLink="false">https://clzzi.dev/first-job-leave/</guid><pubDate>Fri, 17 Oct 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;어느덧 프론트엔드 엔지니어로 일한 지도 3년이 흘러, 4년 차 엔지니어가 되었습니다.&lt;br&gt;
2022년 10월, 고등학교 3학년 때 모두싸인에 입사해 3년이 지난 2025년 10월에 퇴사하게 되었어요.&lt;br&gt;
이번 글에서는 첫 회사를 떠나며, 그리고 이직을 준비했던 과정을 회고해보려 합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;gatsby-resp-image-figure&quot; style=&quot;margin: 1.45rem 0;&quot;&gt;
    &lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 1280px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 61.24999999999999%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAMCAYAAABiDJ37AAAACXBIWXMAAAsTAAALEwEAmpwYAAADGklEQVR42h2SS28bBRRG54+xYovURVkgQAgB3UCrtMUljp2HHbt2HI/f48d4PB6P348ZezwT20mcuGnjJKSPJLQVoqBKCBYI8SMOA4tPd3fuvTqf8PrZgOvTIefzOvNhDqcWYZDfQE8+opZZoyZtUpUCKJlNinEvcnKDWiFMT0vg9EvMnTrH+x3OFiOuzmcIby9srk66nE5Vpk2RUTnIoBhAz22gSVsuLEj5P1jC58LWUXNBmpU4g1Yee1Dm0K6zmHVYLkyeL13gq6M25xOVY1PCru1gqhF6lQha1k81u46S8iMnvJRTvv8X6MUQjXKUTjWO0UwzMVU3GvNJh4sTB2FpK8w7caaNKGY1QksOUy8EkVPr5EU/uXSITDpKoSQh1zTUThd95KCPD5AaA1JaD3mwT8OwWDgNhMWwhG31GO3tYVgWHcOgah9THB5TGJ+y254TbR7ilfp4Mh1+kAbcTzRJGmdoJ7/SPPmN4Yu/GC5/YWY1EfYGKrM3/3D06g2XZoYDy2BVHvO5J8JavsfX62m2FIuVmMrdSJnVbIsHLjjQPqF08JrW03f0l+8xLv9gZI8RHMtkcvkTbd3PtCvinN5Qf/KW8uQ5lf0ris4l3z2W+T7ZIDU8pzR9SXB8wyftn1k1rykYhyjOKd2z95hPrhH0dov6dMZj16TYGzO6+dt94U86Z79TW7yj4Lzk27DiXqgRUie0F9dU5lfca/9I3H6BPl3SPThjtLjEPnqGIMoVPFKNh4k8ydaI9uEF1eE+csskp+qIOQkxkyS6GyEY9BEO+ZGyMbSqhKak6eh5rL7K4V6PeNCDYA80uvW8W4UYTTdtJUqjsO3WZtM17XNNe0lFPYjhhyQijxCjPnYjXtLxTdRijH6rzHjYIOi/z53PPkI4NoscuaYPjAJWM4WhJ+i5HWsoO1RLUUrZbdK7fpIxnzs3SYtbZJIhpHSYSklk2K8R9K3wxe0PuffVbYSnkyZzq8rEkBm1ci4w5QJFWkqMWilCWQpRSAfIJQNIqW2KuR3KhThKUXRfzrD24Bs+vfUBd7+8xcqdj/kXEhWsbHh5W4UAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/b3253d43a76d331eb469a70bbab60498/4558e/Leo.avif 480w,
/static/b3253d43a76d331eb469a70bbab60498/57a30/Leo.avif 768w,
/static/b3253d43a76d331eb469a70bbab60498/c509e/Leo.avif 1024w,
/static/b3253d43a76d331eb469a70bbab60498/35038/Leo.avif 1280w,
/static/b3253d43a76d331eb469a70bbab60498/0b96e/Leo.avif 3024w&quot;
              sizes=&quot;(max-width: 1280px) 100vw, 1280px&quot;
              type=&quot;image/avif&quot;
            /&gt;&lt;source
              srcset=&quot;/static/b3253d43a76d331eb469a70bbab60498/42669/Leo.webp 480w,
/static/b3253d43a76d331eb469a70bbab60498/050c0/Leo.webp 768w,
/static/b3253d43a76d331eb469a70bbab60498/44907/Leo.webp 1024w,
/static/b3253d43a76d331eb469a70bbab60498/e2782/Leo.webp 1280w,
/static/b3253d43a76d331eb469a70bbab60498/28228/Leo.webp 3024w&quot;
              sizes=&quot;(max-width: 1280px) 100vw, 1280px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/b3253d43a76d331eb469a70bbab60498/ab158/Leo.png 480w,
/static/b3253d43a76d331eb469a70bbab60498/2d1ba/Leo.png 768w,
/static/b3253d43a76d331eb469a70bbab60498/f1720/Leo.png 1024w,
/static/b3253d43a76d331eb469a70bbab60498/f3baa/Leo.png 1280w,
/static/b3253d43a76d331eb469a70bbab60498/b5b4d/Leo.png 3024w&quot;
            sizes=&quot;(max-width: 1280px) 100vw, 1280px&quot;
            type=&quot;image/png&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/b3253d43a76d331eb469a70bbab60498/f3baa/Leo.png&quot;
            alt=&quot;이름표&quot;
            title=&quot;&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
    &lt;/span&gt;
    &lt;figcaption class=&quot;gatsby-resp-image-figcaption&quot;&gt;&lt;p&gt;이름표&lt;/p&gt;&lt;/figcaption&gt;
  &lt;/figure&gt;&lt;/p&gt;
&lt;h2 id=&quot;지난-3년간-나는-무엇을-했을까&quot; style=&quot;position:relative;&quot;&gt;지난 3년간 나는 무엇을 했을까?&lt;a href=&quot;#%EC%A7%80%EB%82%9C-3%EB%85%84%EA%B0%84-%EB%82%98%EB%8A%94-%EB%AC%B4%EC%97%87%EC%9D%84-%ED%96%88%EC%9D%84%EA%B9%8C&quot; aria-label=&quot;지난 3년간 나는 무엇을 했을까 permalink&quot; class=&quot;heading-anchor after&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;고등학생 때부터 사회생활을 시작했기 때문에, 첫 회사에서는 가능한 많은 것을 경험해보고 싶었어요.&lt;/p&gt;
&lt;p&gt;입사 당시 일반적인 취업흐름과 달리 대학교를 스킵하고 취업하였기 때문에 남들보다 더 열심히 해야 물경력이 되지 않을거라는 생각과,
남들보다 빠르게 일하기 시작한만큼 부스터(?)효과를 누려야겠다고 생각했기때문이에요.&lt;/p&gt;
&lt;p&gt;그 경험에는 &lt;code&gt;기술&lt;/code&gt;, &lt;code&gt;도메인 &amp;#x26; 비즈니스 이해&lt;/code&gt;, &lt;code&gt;재테크 공부&lt;/code&gt;, &lt;code&gt;네트워크 형성&lt;/code&gt;, &lt;code&gt;사회생활&lt;/code&gt; 등 다양한 요소가 있었고,&lt;br&gt;
3년 동안 &lt;strong&gt;멈추지 않고 성장하는 것&lt;/strong&gt;에 집중했던 것 같아요.&lt;/p&gt;
&lt;h3 id=&quot;무엇을-만들었나&quot; style=&quot;position:relative;&quot;&gt;무엇을 만들었나?&lt;a href=&quot;#%EB%AC%B4%EC%97%87%EC%9D%84-%EB%A7%8C%EB%93%A4%EC%97%88%EB%82%98&quot; aria-label=&quot;무엇을 만들었나 permalink&quot; class=&quot;heading-anchor after&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;모두싸인에서 근무하며 여러 기능을 개발했지만, 그중에서도 특히 기억에 남는 기능은 두 가지예요.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;홈화면&lt;/code&gt;&lt;/strong&gt;&lt;br&gt;
&lt;figure class=&quot;gatsby-resp-image-figure&quot; style=&quot;margin: 1.45rem 0;&quot;&gt;
    &lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 1280px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 56.666666666666664%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAYAAAB/Ca1DAAAACXBIWXMAABYlAAAWJQFJUiTwAAABf0lEQVR42nVTi2rDMAz0/39Iv2cMxqAwusK2hC5xYufhdzSfWoVsMIOJrcfpdHKU619oXVfeMUaStW3br7Pcj+dSCoWaU3KmlDLF+lWzfqO+7+lyeafb7UbOOQZOKf0LJCuEQNfrlQY9ULf2NPiRlAuZnd6tNI4jV40x1SKacgXFMtZWv+czOrH1joWiTdtQ89nQh/mi7wqqnFsIhWMMzE7Y4CyMvPecjAX2EoczwDm23DtQMCKh6zpafWTwzJokTpBWRYZdu9ou4qZpYl8umcpW7oCoMAzDPhQE474sy87EGMN2YQx5UEBrzfkAZ4YIggNBbESlhxM+XQWXBDDDRrx0AeB5ntnOgHBAaEzYGk0x1OfzaO18PtPpdKov4MIFkSj6AgwbzNEJfLgrBCLITnNNCjxhXdvFu/LekVsm2h66IQGa4Xu8owA2bEp0sXZigJQitW3LwahszMgFhZEM4f684t6y2BXAgA6mxz9Epvt3H2MAgKFAsq7r6en5lX4AA09aV5aPNXUAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/5226965f4f1cc898569f170d486f3bc4/4558e/Modusign-Home.avif 480w,
/static/5226965f4f1cc898569f170d486f3bc4/57a30/Modusign-Home.avif 768w,
/static/5226965f4f1cc898569f170d486f3bc4/c509e/Modusign-Home.avif 1024w,
/static/5226965f4f1cc898569f170d486f3bc4/35038/Modusign-Home.avif 1280w,
/static/5226965f4f1cc898569f170d486f3bc4/06ef2/Modusign-Home.avif 3428w&quot;
              sizes=&quot;(max-width: 1280px) 100vw, 1280px&quot;
              type=&quot;image/avif&quot;
            /&gt;&lt;source
              srcset=&quot;/static/5226965f4f1cc898569f170d486f3bc4/42669/Modusign-Home.webp 480w,
/static/5226965f4f1cc898569f170d486f3bc4/050c0/Modusign-Home.webp 768w,
/static/5226965f4f1cc898569f170d486f3bc4/44907/Modusign-Home.webp 1024w,
/static/5226965f4f1cc898569f170d486f3bc4/e2782/Modusign-Home.webp 1280w,
/static/5226965f4f1cc898569f170d486f3bc4/4b7a1/Modusign-Home.webp 3428w&quot;
              sizes=&quot;(max-width: 1280px) 100vw, 1280px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/5226965f4f1cc898569f170d486f3bc4/ab158/Modusign-Home.png 480w,
/static/5226965f4f1cc898569f170d486f3bc4/2d1ba/Modusign-Home.png 768w,
/static/5226965f4f1cc898569f170d486f3bc4/f1720/Modusign-Home.png 1024w,
/static/5226965f4f1cc898569f170d486f3bc4/f3baa/Modusign-Home.png 1280w,
/static/5226965f4f1cc898569f170d486f3bc4/7323a/Modusign-Home.png 3428w&quot;
            sizes=&quot;(max-width: 1280px) 100vw, 1280px&quot;
            type=&quot;image/png&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/5226965f4f1cc898569f170d486f3bc4/f3baa/Modusign-Home.png&quot;
            alt=&quot;현재의 홈화면&quot;
            title=&quot;&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
    &lt;/span&gt;
    &lt;figcaption class=&quot;gatsby-resp-image-figcaption&quot;&gt;&lt;p&gt;현재의 홈화면&lt;/p&gt;&lt;/figcaption&gt;
  &lt;/figure&gt;&lt;br&gt;
홈화면은 계약관리팀에서 진행했던 &lt;code&gt;1박 2일 해커톤&lt;/code&gt;을 통해 만들어진 기능이에요.&lt;br&gt;
당시 홈화면의 필요성은 인지하고 있었지만 직접적인 매출로 이어지는 기능이 아니다 보니 우선순위가 계속 밀렸어요.&lt;br&gt;
그래도 팀 내부에서 공감대가 잘 형성되었고, 정식 스프린트 대신 해커톤을 통해 만족할 만한 결과물을 낼 수 있어서 정말 뿌듯했던 기억이에요.&lt;/p&gt;
&lt;p&gt;거기다가 크리스마스 전에 개발을 마치고, 크리스마스 선물처럼 전사에 공유했던 기억이 아직도 생생하네요 🎁&lt;br&gt;
&lt;figure class=&quot;gatsby-resp-image-figure&quot; style=&quot;margin: 1.45rem 0;&quot;&gt;
    &lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 1280px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 53.125%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAYAAAB/Ca1DAAAACXBIWXMAABYlAAAWJQFJUiTwAAAByUlEQVR42m1S2XLbQAzzZzjWacm6r9V9+0razvT//wcl6cipmz5gdsmZBQlgd++zjfvswPM8WEcfzikghHAJJz/G0Q2l53oRIUaWxzBtB5rhQDdfoRlH7IZpwXq5oekm1O2AYVoJZ5yv77h//MLl9oFhXKGqFmleY50VDNPGXrNw0C28aV846ERYNQPafibC8UnWD4vU3TATFkzLBWXdIckUgqigsyTyClFS0MYVsqIW2I6PnTSpiNNCHnDND/iUe17Sdh2KsiG08MMEhuWS7NM3sOydFyQI45we5zS1FDAxb7CdfpjSQCWPHtLs/0I83Hyr2xHjfMa8XEX2Q/6Keb1jWq8yyKTN/g7g30CEsOlmIWOvyrrH5in711JQU5chTjJJ+EDb7Q/mM4TtzudzwzyNECaKZGfiGUtj8D2gXqWI7PPbsDVBlIkFJz+CH6TSD6JUfBVClXvIVY28KFGoCmXVQJW1gHv9SIm3tDmlzOHw92FUTS9BsRUcFvvLW+6Un0CRj5yeF8QyzfHCT4/IF5OlPEzfb3+O7m/aV/0iOapXxJffcLsbjuNPuOMPWNUKTS2EGVpByAboVOtpR+ihFxO0UD0CMV5D+QO/HkfkZzzwVQAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/99e6e1baebddcce1d2eee121cc898bfb/4558e/Modusign-Home-Slack.avif 480w,
/static/99e6e1baebddcce1d2eee121cc898bfb/57a30/Modusign-Home-Slack.avif 768w,
/static/99e6e1baebddcce1d2eee121cc898bfb/c509e/Modusign-Home-Slack.avif 1024w,
/static/99e6e1baebddcce1d2eee121cc898bfb/35038/Modusign-Home-Slack.avif 1280w,
/static/99e6e1baebddcce1d2eee121cc898bfb/f90fd/Modusign-Home-Slack.avif 1320w&quot;
              sizes=&quot;(max-width: 1280px) 100vw, 1280px&quot;
              type=&quot;image/avif&quot;
            /&gt;&lt;source
              srcset=&quot;/static/99e6e1baebddcce1d2eee121cc898bfb/42669/Modusign-Home-Slack.webp 480w,
/static/99e6e1baebddcce1d2eee121cc898bfb/050c0/Modusign-Home-Slack.webp 768w,
/static/99e6e1baebddcce1d2eee121cc898bfb/44907/Modusign-Home-Slack.webp 1024w,
/static/99e6e1baebddcce1d2eee121cc898bfb/e2782/Modusign-Home-Slack.webp 1280w,
/static/99e6e1baebddcce1d2eee121cc898bfb/7cfba/Modusign-Home-Slack.webp 1320w&quot;
              sizes=&quot;(max-width: 1280px) 100vw, 1280px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/99e6e1baebddcce1d2eee121cc898bfb/ab158/Modusign-Home-Slack.png 480w,
/static/99e6e1baebddcce1d2eee121cc898bfb/2d1ba/Modusign-Home-Slack.png 768w,
/static/99e6e1baebddcce1d2eee121cc898bfb/f1720/Modusign-Home-Slack.png 1024w,
/static/99e6e1baebddcce1d2eee121cc898bfb/f3baa/Modusign-Home-Slack.png 1280w,
/static/99e6e1baebddcce1d2eee121cc898bfb/7416a/Modusign-Home-Slack.png 1320w&quot;
            sizes=&quot;(max-width: 1280px) 100vw, 1280px&quot;
            type=&quot;image/png&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/99e6e1baebddcce1d2eee121cc898bfb/f3baa/Modusign-Home-Slack.png&quot;
            alt=&quot;계약관리팀 a.k.a FLAME-BOYS&quot;
            title=&quot;&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
    &lt;/span&gt;
    &lt;figcaption class=&quot;gatsby-resp-image-figcaption&quot;&gt;&lt;p&gt;계약관리팀 a.k.a FLAME-BOYS&lt;/p&gt;&lt;/figcaption&gt;
  &lt;/figure&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;테넌트 시스템&lt;/code&gt;&lt;/strong&gt;&lt;br&gt;
&lt;figure class=&quot;gatsby-resp-image-figure&quot; style=&quot;margin: 1.45rem 0;&quot;&gt;
    &lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 1280px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 25%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAFCAYAAABFA8wzAAAACXBIWXMAABYlAAAWJQFJUiTwAAAA7ElEQVR42qWPO0sDQRSFtxN7BW3EQmwEKyUiimhhJahNQIsEgoWVIGgr+Be3WNhln+LOTKySTWYfLOynGRghYOcHh3PvKe7DaZoGq6qqjLdta7yua5MtVJal8a7rsEj1RRRnJElCnHzwmUscIaQJoijCdV3CMCRNU9N7nkcQBKb2fZ8sy8wyy/3olfXtE3YP7tjcOePy+gFHKYGUEqUUeZ4jhDD1IhuPx0sDLPbK/vCFlbVjto7eWN045fxqhBMnIbNZ8fue1nrp/b+wAx+f3tk7vKF3MWS/d0t/8IzDP9C6ZDItmBYFkx/N55pvxn1iJqEOfYcAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/41dc9db444dc6dce6d5a9a26f74d71c3/4558e/Tenant-System.avif 480w,
/static/41dc9db444dc6dce6d5a9a26f74d71c3/57a30/Tenant-System.avif 768w,
/static/41dc9db444dc6dce6d5a9a26f74d71c3/c509e/Tenant-System.avif 1024w,
/static/41dc9db444dc6dce6d5a9a26f74d71c3/35038/Tenant-System.avif 1280w,
/static/41dc9db444dc6dce6d5a9a26f74d71c3/ae9bf/Tenant-System.avif 1394w&quot;
              sizes=&quot;(max-width: 1280px) 100vw, 1280px&quot;
              type=&quot;image/avif&quot;
            /&gt;&lt;source
              srcset=&quot;/static/41dc9db444dc6dce6d5a9a26f74d71c3/42669/Tenant-System.webp 480w,
/static/41dc9db444dc6dce6d5a9a26f74d71c3/050c0/Tenant-System.webp 768w,
/static/41dc9db444dc6dce6d5a9a26f74d71c3/44907/Tenant-System.webp 1024w,
/static/41dc9db444dc6dce6d5a9a26f74d71c3/e2782/Tenant-System.webp 1280w,
/static/41dc9db444dc6dce6d5a9a26f74d71c3/a282c/Tenant-System.webp 1394w&quot;
              sizes=&quot;(max-width: 1280px) 100vw, 1280px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/41dc9db444dc6dce6d5a9a26f74d71c3/ab158/Tenant-System.png 480w,
/static/41dc9db444dc6dce6d5a9a26f74d71c3/2d1ba/Tenant-System.png 768w,
/static/41dc9db444dc6dce6d5a9a26f74d71c3/f1720/Tenant-System.png 1024w,
/static/41dc9db444dc6dce6d5a9a26f74d71c3/f3baa/Tenant-System.png 1280w,
/static/41dc9db444dc6dce6d5a9a26f74d71c3/c6633/Tenant-System.png 1394w&quot;
            sizes=&quot;(max-width: 1280px) 100vw, 1280px&quot;
            type=&quot;image/png&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/41dc9db444dc6dce6d5a9a26f74d71c3/f3baa/Tenant-System.png&quot;
            alt=&quot;사내 블로그&quot;
            title=&quot;&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
    &lt;/span&gt;
    &lt;figcaption class=&quot;gatsby-resp-image-figcaption&quot;&gt;&lt;p&gt;사내 블로그&lt;/p&gt;&lt;/figcaption&gt;
  &lt;/figure&gt;&lt;br&gt;
테넌트 시스템은 구축형 프로젝트에서 만들었던 기능이에요.&lt;br&gt;
프로젝트의 FE 엔지니어가 저 혼자뿐이어서 시행착오도 많았지만, 결과적으로는 잘 완성되어서 다행이었어요.&lt;/p&gt;
&lt;p&gt;모두싸인은 8년 이상 된 코드가 남아 있었고, 그 부분까지 포함해 시스템적인 개선을 해야 했어요.&lt;br&gt;
이런 경험은 흔치 않은 기회라고 생각해요, 특히 저연차 엔지니어에게는 더더욱 그런것같아요.&lt;/p&gt;
&lt;p&gt;또한 변경 범위가 프론트엔드 챕터 전체에 영향을 주었기 때문에 회의 리딩이나 문서화까지 챙겨야 했고,&lt;br&gt;
그 과정에서 리딩 능력과 커뮤니케이션 역량도 많이 성장했어요.&lt;br&gt;
&lt;figure class=&quot;gatsby-resp-image-figure&quot; style=&quot;margin: 1.45rem 0;&quot;&gt;
    &lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 856px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 47.91666666666667%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAYAAAC0VX7mAAAACXBIWXMAAAsTAAALEwEAmpwYAAABOElEQVR42oWSaa6DMAyEOQWCwAukEoSdLMD9b+ZmHOCpaqv+sKxsX8ZjJ8uyUNM0ZFZDUv5Rnud3FEVBWmsyxtA8z7SuK43jyDnGQtZamqaJ7yIS5xy1rQ4HLgAryrLsBdj3PW3bxg9xFwKQ8QmgUkoqy5LvCyEosdawCheAVVW9KQRw33cG/APtywdKqfs+K9S6I2vsZ2DXkfeeH7sAQemAIbCPeDwUpWlKAkBsdOGR/aJwQMlB4XZCAbw+uLyFJchK1RGIku2PklnhCYE65OM4GA4v4WNZcsk2dLn9rnAY+AwAKLm6jIxzNAKBZnJTooe/FG53IwDz3t2Kr7FBrioZFbZte46N/Dg2AMau2ntssI7dFfcMFoWAh46B3nmq63eF0zQGr6KHUHfBUH7cW9jjvu9CyTk9Acn6I+EjQ6CjAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/fc92804c7735849f4c826395c962be9f/4558e/Onprem-Review.avif 480w,
/static/fc92804c7735849f4c826395c962be9f/57a30/Onprem-Review.avif 768w,
/static/fc92804c7735849f4c826395c962be9f/4dce2/Onprem-Review.avif 856w&quot;
              sizes=&quot;(max-width: 856px) 100vw, 856px&quot;
              type=&quot;image/avif&quot;
            /&gt;&lt;source
              srcset=&quot;/static/fc92804c7735849f4c826395c962be9f/42669/Onprem-Review.webp 480w,
/static/fc92804c7735849f4c826395c962be9f/050c0/Onprem-Review.webp 768w,
/static/fc92804c7735849f4c826395c962be9f/a5d5f/Onprem-Review.webp 856w&quot;
              sizes=&quot;(max-width: 856px) 100vw, 856px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/fc92804c7735849f4c826395c962be9f/ab158/Onprem-Review.png 480w,
/static/fc92804c7735849f4c826395c962be9f/2d1ba/Onprem-Review.png 768w,
/static/fc92804c7735849f4c826395c962be9f/f7ecb/Onprem-Review.png 856w&quot;
            sizes=&quot;(max-width: 856px) 100vw, 856px&quot;
            type=&quot;image/png&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/fc92804c7735849f4c826395c962be9f/f7ecb/Onprem-Review.png&quot;
            alt=&quot;수많은 회의들...&quot;
            title=&quot;&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
    &lt;/span&gt;
    &lt;figcaption class=&quot;gatsby-resp-image-figcaption&quot;&gt;&lt;p&gt;수많은 회의들…&lt;/p&gt;&lt;/figcaption&gt;
  &lt;/figure&gt;
&lt;figure class=&quot;gatsby-resp-image-figure&quot; style=&quot;margin: 1.45rem 0;&quot;&gt;
    &lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 1078px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 46.875%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAJCAYAAAAywQxIAAAACXBIWXMAABYlAAAWJQFJUiTwAAABfElEQVR42qWRS0/CQBSF/QvQzvRFaUuhVGiCtMQCCXVtIkYUCRvYKBsfIcZggjwEDTuDv8jfdpwOBl24ksXXuXPu7Zkz7Z5EFZi2hqMzAxlXRbxXVIbyP/aEhIzLYRYfnx6Or3RQSYa6iyElCqK2iYuRhWortVM6bhg/KLtmztWQ0lUmqizhD3Ff0zS+/tb/YmsoiiIII5lMslqAIAhIJBJcp5R814TrlFIITBc5G00QknyGG8bOlUqAIAhQq9VQYWs1DNFoNOD7PgqFAqIoQrFY5Hq898tl/k6pVEK1GiIMD9lMY2OY1nUMBtdYLF6wZDwMh3gajfC6XKDb7aLT6WC9fsfd7Q2ex2Oct1qYzabo93toNk8wnUwwn0+xWr1BY+F4QsNI8wTx6YZhwHEcjs4Oc7MZeKxXPghgZ2yk2aznebAsi/VTvLZtG6Zp8u/IDfNODoV9F5sfRCFJEgiVYKUUPLYjNOt19E7vkbPyEIm4nZFlGYQQXsfEV/4C4LkIKqNZL90AAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/e50e230ccb7b1f9a63e8baec7e8d7bc1/4558e/Tenant-System-Policy.avif 480w,
/static/e50e230ccb7b1f9a63e8baec7e8d7bc1/57a30/Tenant-System-Policy.avif 768w,
/static/e50e230ccb7b1f9a63e8baec7e8d7bc1/c509e/Tenant-System-Policy.avif 1024w,
/static/e50e230ccb7b1f9a63e8baec7e8d7bc1/0e1e7/Tenant-System-Policy.avif 1078w&quot;
              sizes=&quot;(max-width: 1078px) 100vw, 1078px&quot;
              type=&quot;image/avif&quot;
            /&gt;&lt;source
              srcset=&quot;/static/e50e230ccb7b1f9a63e8baec7e8d7bc1/42669/Tenant-System-Policy.webp 480w,
/static/e50e230ccb7b1f9a63e8baec7e8d7bc1/050c0/Tenant-System-Policy.webp 768w,
/static/e50e230ccb7b1f9a63e8baec7e8d7bc1/44907/Tenant-System-Policy.webp 1024w,
/static/e50e230ccb7b1f9a63e8baec7e8d7bc1/4005e/Tenant-System-Policy.webp 1078w&quot;
              sizes=&quot;(max-width: 1078px) 100vw, 1078px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/e50e230ccb7b1f9a63e8baec7e8d7bc1/ab158/Tenant-System-Policy.png 480w,
/static/e50e230ccb7b1f9a63e8baec7e8d7bc1/2d1ba/Tenant-System-Policy.png 768w,
/static/e50e230ccb7b1f9a63e8baec7e8d7bc1/f1720/Tenant-System-Policy.png 1024w,
/static/e50e230ccb7b1f9a63e8baec7e8d7bc1/79afa/Tenant-System-Policy.png 1078w&quot;
            sizes=&quot;(max-width: 1078px) 100vw, 1078px&quot;
            type=&quot;image/png&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/e50e230ccb7b1f9a63e8baec7e8d7bc1/79afa/Tenant-System-Policy.png&quot;
            alt=&quot;노션에 적은 정책서&quot;
            title=&quot;&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
    &lt;/span&gt;
    &lt;figcaption class=&quot;gatsby-resp-image-figcaption&quot;&gt;&lt;p&gt;노션에 적은 정책서&lt;/p&gt;&lt;/figcaption&gt;
  &lt;/figure&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;회사 보안정책상 테넌트 시스템 관련 내용을 자세히 적지 못하는 게 아쉽네요 🥲&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;이외에도 리마인더, 예약전송, API 연동 페이지, 그로스 프로젝트 등 다양한 기능을 개발했고,&lt;br&gt;
여러 팀을 오가며 다양한 경험을 쌓을 수 있었습니다.&lt;br&gt;
3년이 지나고 보니 전자계약 도메인과 B2B 비즈니스에 대한 이해도도 많이 깊어졌어요.&lt;br&gt;
이런 경험들은 앞으로의 커리어에도 큰 자산이 될 것 같습니다.&lt;/p&gt;
&lt;h3 id=&quot;다른-경험들&quot; style=&quot;position:relative;&quot;&gt;다른 경험들&lt;a href=&quot;#%EB%8B%A4%EB%A5%B8-%EA%B2%BD%ED%97%98%EB%93%A4&quot; aria-label=&quot;다른 경험들 permalink&quot; class=&quot;heading-anchor after&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;회사 생활을 하면서 팀원분들과도 많이 친해졌고,&lt;br&gt;
업무 외적으로도 재테크 공부나 네트워크 형성에 관심을 가지고 꾸준히 노력했어요.&lt;/p&gt;
&lt;p&gt;사진으로 보는 게 더 잘 전달될 것 같아요 ☺️&lt;br&gt;
&lt;figure class=&quot;gatsby-resp-image-figure&quot; style=&quot;margin: 1.45rem 0;&quot;&gt;
    &lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 1280px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 140%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDAAMCAgMCAgMDAwMEAwMEBQgFBQQEBQoHBwYIDAoMDAsKCwsNDhIQDQ4RDgsLEBYQERMUFRUVDA8XGBYUGBIUFRT/2wBDAQMEBAUEBQkFBQkUDQsNFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBT/wgARCAAcABQDASIAAhEBAxEB/8QAGQAAAgMBAAAAAAAAAAAAAAAAAAUDBAYH/8QAFAEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEAMQAAAB54pt1heQBqleSmLogD//xAAaEAEAAgMBAAAAAAAAAAAAAAAEAwUAAQIT/9oACAEBAAEFAh2G4SVj9+b0KROexKcdUmGHLRMCEiWCMdWoeWiiqSGzR1379mi3cL63/8QAFBEBAAAAAAAAAAAAAAAAAAAAIP/aAAgBAwEBPwEf/8QAFBEBAAAAAAAAAAAAAAAAAAAAIP/aAAgBAgEBPwEf/8QAJhAAAQMDAgUFAAAAAAAAAAAAAQIDEQAEEiFREyIjMZFBYaGxwf/aAAgBAQAGPwJgGyaWdEoxYni7wfFXLhtmS2XDkvhSG9qyFm0wIjEtgGms7JvlhXrzadx+1cF+xZSFrJBMwj2+vNBTVohpOIETTQdacSpoYq65kT3j4q6Cml9da0wXokbGgtm2cUjEJyKyZq3aKhi0orTpqNKfbQempWqSNu1TxfAAr//EAB4QAQEAAgIDAQEAAAAAAAAAAAERACExQVFhgaGx/9oACAEBAAE/IWiZQAUUAcg8r3l9UtvM2OZYE37yCy6Pub533m10Toa9/c10nnrE9QvOlp6CxrBgYyhXm/uAMmExvTTTFDyZQ3QEcNvx9cPEOM4T5CE9YpEgpU15eTRrDrNWI8v4MYKF3pPwz//aAAwDAQACAAMAAAAQAw4A/8QAFBEBAAAAAAAAAAAAAAAAAAAAIP/aAAgBAwEBPxAf/8QAFBEBAAAAAAAAAAAAAAAAAAAAIP/aAAgBAgEBPxAf/8QAGhABAQEBAQEBAAAAAAAAAAAAAREhADFBUf/aAAgBAQABPxAt30MNEBK6LWZwEaIJE6G6FFOerCiptiRFCtGCgeoqJ7+SQYwP0FBEXIEHLmyyqKlOlScjAUunUooPj9AfvJvJHpQUagAhK7BGvF7F7tgNYqeKPUc7DqT0oCpZ9xO1iMLyEFQKqfk4q5ur2JE+KZ7Np1yQUXC1YBVV8+9//9k=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/ac2337bfa09948d5de48143ce5799747/4558e/FLM-BYZ1.avif 480w,
/static/ac2337bfa09948d5de48143ce5799747/57a30/FLM-BYZ1.avif 768w,
/static/ac2337bfa09948d5de48143ce5799747/c509e/FLM-BYZ1.avif 1024w,
/static/ac2337bfa09948d5de48143ce5799747/35038/FLM-BYZ1.avif 1280w,
/static/ac2337bfa09948d5de48143ce5799747/9f29e/FLM-BYZ1.avif 1500w&quot;
              sizes=&quot;(max-width: 1280px) 100vw, 1280px&quot;
              type=&quot;image/avif&quot;
            /&gt;&lt;source
              srcset=&quot;/static/ac2337bfa09948d5de48143ce5799747/42669/FLM-BYZ1.webp 480w,
/static/ac2337bfa09948d5de48143ce5799747/050c0/FLM-BYZ1.webp 768w,
/static/ac2337bfa09948d5de48143ce5799747/44907/FLM-BYZ1.webp 1024w,
/static/ac2337bfa09948d5de48143ce5799747/e2782/FLM-BYZ1.webp 1280w,
/static/ac2337bfa09948d5de48143ce5799747/9579c/FLM-BYZ1.webp 1500w&quot;
              sizes=&quot;(max-width: 1280px) 100vw, 1280px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/ac2337bfa09948d5de48143ce5799747/55489/FLM-BYZ1.jpg 480w,
/static/ac2337bfa09948d5de48143ce5799747/8ba6c/FLM-BYZ1.jpg 768w,
/static/ac2337bfa09948d5de48143ce5799747/87945/FLM-BYZ1.jpg 1024w,
/static/ac2337bfa09948d5de48143ce5799747/38ece/FLM-BYZ1.jpg 1280w,
/static/ac2337bfa09948d5de48143ce5799747/9d81f/FLM-BYZ1.jpg 1500w&quot;
            sizes=&quot;(max-width: 1280px) 100vw, 1280px&quot;
            type=&quot;image/jpeg&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/ac2337bfa09948d5de48143ce5799747/38ece/FLM-BYZ1.jpg&quot;
            alt=&quot;FLAME-BOYS 여행&quot;
            title=&quot;&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
    &lt;/span&gt;
    &lt;figcaption class=&quot;gatsby-resp-image-figcaption&quot;&gt;&lt;p&gt;FLAME-BOYS 여행&lt;/p&gt;&lt;/figcaption&gt;
  &lt;/figure&gt;
&lt;figure class=&quot;gatsby-resp-image-figure&quot; style=&quot;margin: 1.45rem 0;&quot;&gt;
    &lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 1280px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 66.66666666666666%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDAAMCAgMCAgMDAwMEAwMEBQgFBQQEBQoHBwYIDAoMDAsKCwsNDhIQDQ4RDgsLEBYQERMUFRUVDA8XGBYUGBIUFRT/2wBDAQMEBAUEBQkFBQkUDQsNFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBT/wgARCAANABQDASIAAhEBAxEB/8QAGAAAAwEBAAAAAAAAAAAAAAAAAAMGBAX/xAAVAQEBAAAAAAAAAAAAAAAAAAAFBv/aAAwDAQACEAMQAAABhORKsmKdRgFDP//EABsQAAMAAgMAAAAAAAAAAAAAAAIDBAEFABIT/9oACAEBAAEFAqBTNqeoAbzP1GxqUv3VL5c1Nzz/xAAaEQACAgMAAAAAAAAAAAAAAAAAAQIEESEx/9oACAEDAQE/AZWUspjlvp//xAAcEQABAwUAAAAAAAAAAAAAAAABAAIDBBEhMUH/2gAIAQIBAT8BZRyN7fJQjIGl/8QAHhAAAQQCAwEAAAAAAAAAAAAAAQACESESMQMEkSL/2gAIAQEABj8C6OJH3GU7lOt4ADoIbtGj4uItd7abxF0YnYVulf/EAB0QAAEEAgMAAAAAAAAAAAAAAAEAESExQVFxkdH/2gAIAQEAAT8hFL0rUBx4nuWu4YHKCDXsFTLNBbc8oPYClliYz2ikpU6//9oADAMBAAIAAwAAABB0D//EABkRAQADAQEAAAAAAAAAAAAAAAEAESExUf/aAAgBAwEBPxBu0YUG+PYqm0//xAAbEQEAAgIDAAAAAAAAAAAAAAABACERMUGB8P/aAAgBAgEBPxCqAFFW7XjDrUICPdT/xAAdEAEBAQACAwEBAAAAAAAAAAABESEAMUFRcWGh/9oACAEBAAE/EAzRloosEiKVVmcFPzpoRlMl3z+Zy2xXf0ZDriKAMDCde6L4GYcM3RKGsxvt7h95Ynwp3Ah/Of/Z&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/2e0fb2b0b62dbe6ee5f421a1c4a08300/4558e/FLM-BYZ2.avif 480w,
/static/2e0fb2b0b62dbe6ee5f421a1c4a08300/57a30/FLM-BYZ2.avif 768w,
/static/2e0fb2b0b62dbe6ee5f421a1c4a08300/c509e/FLM-BYZ2.avif 1024w,
/static/2e0fb2b0b62dbe6ee5f421a1c4a08300/35038/FLM-BYZ2.avif 1280w,
/static/2e0fb2b0b62dbe6ee5f421a1c4a08300/113ff/FLM-BYZ2.avif 2048w&quot;
              sizes=&quot;(max-width: 1280px) 100vw, 1280px&quot;
              type=&quot;image/avif&quot;
            /&gt;&lt;source
              srcset=&quot;/static/2e0fb2b0b62dbe6ee5f421a1c4a08300/42669/FLM-BYZ2.webp 480w,
/static/2e0fb2b0b62dbe6ee5f421a1c4a08300/050c0/FLM-BYZ2.webp 768w,
/static/2e0fb2b0b62dbe6ee5f421a1c4a08300/44907/FLM-BYZ2.webp 1024w,
/static/2e0fb2b0b62dbe6ee5f421a1c4a08300/e2782/FLM-BYZ2.webp 1280w,
/static/2e0fb2b0b62dbe6ee5f421a1c4a08300/705b1/FLM-BYZ2.webp 2048w&quot;
              sizes=&quot;(max-width: 1280px) 100vw, 1280px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/2e0fb2b0b62dbe6ee5f421a1c4a08300/55489/FLM-BYZ2.jpg 480w,
/static/2e0fb2b0b62dbe6ee5f421a1c4a08300/8ba6c/FLM-BYZ2.jpg 768w,
/static/2e0fb2b0b62dbe6ee5f421a1c4a08300/87945/FLM-BYZ2.jpg 1024w,
/static/2e0fb2b0b62dbe6ee5f421a1c4a08300/38ece/FLM-BYZ2.jpg 1280w,
/static/2e0fb2b0b62dbe6ee5f421a1c4a08300/7a411/FLM-BYZ2.jpg 2048w&quot;
            sizes=&quot;(max-width: 1280px) 100vw, 1280px&quot;
            type=&quot;image/jpeg&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/2e0fb2b0b62dbe6ee5f421a1c4a08300/38ece/FLM-BYZ2.jpg&quot;
            alt=&quot;FLAME-BOYS 여행&quot;
            title=&quot;&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
    &lt;/span&gt;
    &lt;figcaption class=&quot;gatsby-resp-image-figcaption&quot;&gt;&lt;p&gt;FLAME-BOYS 여행&lt;/p&gt;&lt;/figcaption&gt;
  &lt;/figure&gt;
&lt;figure class=&quot;gatsby-resp-image-figure&quot; style=&quot;margin: 1.45rem 0;&quot;&gt;
    &lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 1280px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 75%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDAAMCAgMCAgMDAwMEAwMEBQgFBQQEBQoHBwYIDAoMDAsKCwsNDhIQDQ4RDgsLEBYQERMUFRUVDA8XGBYUGBIUFRT/2wBDAQMEBAUEBQkFBQkUDQsNFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBT/wgARCAAPABQDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAABgAEBf/EABYBAQEBAAAAAAAAAAAAAAAAAAIBA//aAAwDAQACEAMQAAABSGFXbzoCxSH/xAAaEAADAQEBAQAAAAAAAAAAAAACAwQBBQYV/9oACAEBAAEFAmVzT88epQtn07J2eZSRQYGltxknpf/EABYRAQEBAAAAAAAAAAAAAAAAAAABEf/aAAgBAwEBPwGNf//EABYRAQEBAAAAAAAAAAAAAAAAAAABEf/aAAgBAgEBPwGsf//EACQQAAIBBAAFBQAAAAAAAAAAAAECAwAEESEFEhMxQVFhcsLh/9oACAEBAAY/ArhrYuGEar1EO9t+VA4uJBv1z5qaNTzKsrjfyNXbrHE2ZBkT7GqwLPh5z7EfWr1AcATN2r//xAAdEAEAAwABBQAAAAAAAAAAAAABABEhUTFBcbHB/9oACAEBAAE/IVTCm0yohra11dO+2YJCk8hNuQUDhE1B48+4BacIi6EdLlv7P//aAAwDAQACAAMAAAAQlD//xAAXEQEBAQEAAAAAAAAAAAAAAAABACEx/9oACAEDAQE/ENAyh7f/xAAXEQEBAQEAAAAAAAAAAAAAAAABABEh/9oACAECAQE/EOFIKbl//8QAHRABAAMBAAIDAAAAAAAAAAAAAQARITFBUWFxsf/aAAgBAQABPxCzL7D0rN90fGMpCnWjeU4GBfBdq4RNHggAWvAD6inqttPAOjnPxHxdYWabfUGmEBR8sj//2Q==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/eaa9da482c9ab10b583499da68660b44/4558e/Money2.avif 480w,
/static/eaa9da482c9ab10b583499da68660b44/57a30/Money2.avif 768w,
/static/eaa9da482c9ab10b583499da68660b44/c509e/Money2.avif 1024w,
/static/eaa9da482c9ab10b583499da68660b44/35038/Money2.avif 1280w,
/static/eaa9da482c9ab10b583499da68660b44/baa34/Money2.avif 4032w&quot;
              sizes=&quot;(max-width: 1280px) 100vw, 1280px&quot;
              type=&quot;image/avif&quot;
            /&gt;&lt;source
              srcset=&quot;/static/eaa9da482c9ab10b583499da68660b44/42669/Money2.webp 480w,
/static/eaa9da482c9ab10b583499da68660b44/050c0/Money2.webp 768w,
/static/eaa9da482c9ab10b583499da68660b44/44907/Money2.webp 1024w,
/static/eaa9da482c9ab10b583499da68660b44/e2782/Money2.webp 1280w,
/static/eaa9da482c9ab10b583499da68660b44/ca3ff/Money2.webp 4032w&quot;
              sizes=&quot;(max-width: 1280px) 100vw, 1280px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/eaa9da482c9ab10b583499da68660b44/55489/Money2.jpg 480w,
/static/eaa9da482c9ab10b583499da68660b44/8ba6c/Money2.jpg 768w,
/static/eaa9da482c9ab10b583499da68660b44/87945/Money2.jpg 1024w,
/static/eaa9da482c9ab10b583499da68660b44/38ece/Money2.jpg 1280w,
/static/eaa9da482c9ab10b583499da68660b44/c2cc8/Money2.jpg 4032w&quot;
            sizes=&quot;(max-width: 1280px) 100vw, 1280px&quot;
            type=&quot;image/jpeg&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/eaa9da482c9ab10b583499da68660b44/38ece/Money2.jpg&quot;
            alt=&quot;책도 읽고&quot;
            title=&quot;&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
    &lt;/span&gt;
    &lt;figcaption class=&quot;gatsby-resp-image-figcaption&quot;&gt;&lt;p&gt;책도 읽고&lt;/p&gt;&lt;/figcaption&gt;
  &lt;/figure&gt;
&lt;figure class=&quot;gatsby-resp-image-figure&quot; style=&quot;margin: 1.45rem 0;&quot;&gt;
    &lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 642px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 86.875%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAARCAYAAADdRIy+AAAACXBIWXMAABYlAAAWJQFJUiTwAAAB00lEQVR42q1T207jMBD1///I/sE+IPGw2reVQNoHCm0TSpqkl7RAW3Kx48vZGaduSllRQIx0Mo7Hnsw5MxFt26JYrVEUa8wXBZbks9kCZVkhmHMO1lp8xERdN7gdRojuH3A7ijAYjvHn6i/Wj0+HZJ8x8V4wJEuSKaIo/lxCvsq0OElAoHn56zd+XlzCGHOWuoDWsMsCdrOjrCeHKQGenlHPF6imGZd8vkLHCac5HF18c4Eroka59SMcef+B85QtpJGwrtct4FiOj7ZGKFvix/UQqw2Q5zl1+h43d2PMl6uuYH4EvGMtMeUihKFHstWejVIKPEaKZpPn8ysmelLfY4LHIB3E0FLhhgZ8FE2QpDOPMCLsx/HEx3L6i9JshrtR7DEgeaqqhqEzlikzb6U6ep5y00CSb1v9WiOSoJHSy8FoGunP8Z4x/biJhipTdFlSUgavAzgWEGLH53rfnxMtdaPVxgfYh/Xxu6YKurU+eEXgfa33MdPBU9a0wVNRkhYVddnSUDINXjM22xfsXsrD+//2WQLO4Zti9n/ANM0xSdLDgG92JbaEUZxQk+Z0ufLvAfFDhiTr9hkuNIUboLX2iRm85ibU9FWv35GWp7oG/eS+sf8ApeYw4hiyF24AAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/e9726e745fa46b35185a2ef807239a66/4558e/Money.avif 480w,
/static/e9726e745fa46b35185a2ef807239a66/95b1c/Money.avif 642w&quot;
              sizes=&quot;(max-width: 642px) 100vw, 642px&quot;
              type=&quot;image/avif&quot;
            /&gt;&lt;source
              srcset=&quot;/static/e9726e745fa46b35185a2ef807239a66/42669/Money.webp 480w,
/static/e9726e745fa46b35185a2ef807239a66/fcb53/Money.webp 642w&quot;
              sizes=&quot;(max-width: 642px) 100vw, 642px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/e9726e745fa46b35185a2ef807239a66/ab158/Money.png 480w,
/static/e9726e745fa46b35185a2ef807239a66/571e3/Money.png 642w&quot;
            sizes=&quot;(max-width: 642px) 100vw, 642px&quot;
            type=&quot;image/png&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/e9726e745fa46b35185a2ef807239a66/571e3/Money.png&quot;
            alt=&quot;수익 천만원 이상 달성!&quot;
            title=&quot;&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
    &lt;/span&gt;
    &lt;figcaption class=&quot;gatsby-resp-image-figcaption&quot;&gt;&lt;p&gt;수익 천만원 이상 달성!&lt;/p&gt;&lt;/figcaption&gt;
  &lt;/figure&gt;
&lt;figure class=&quot;gatsby-resp-image-figure&quot; style=&quot;margin: 1.45rem 0;&quot;&gt;
    &lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 1215px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 147.91666666666669%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAeCAYAAAAsEj5rAAAACXBIWXMAAAsTAAALEwEAmpwYAAAFE0lEQVR42p1WbVcTRxTOf+6H1lbtOZYXsbWiSHiThCAEIwiRl6C29FMPa0/bcyIoBhVYgjEhr7s7u8luMrNP78xuQlPsh3bOec7svXPn2Tt37sydCACNAE5NCAEhOKpNS8oI5BA+INo2RKsK1+ug0+mg3W4ruK4rJIfgPBuRhGdnZ7Btm0ulH+LfmiTY2dmBrus4Pj7G6emp7IX2UoPbdANCxe6D+24TaNrBTN+/ROxLHXnrEan0sCP7wEsRmlwQqlW7LVjVCkzbAe9w/Id2mdDz2vwkX8DB4RHevH2Hd0c6rGar55lsTdNA5fANPubzqJyfQ//wAe8PDvDH7q7g5HEfoZ4v8ELxHB0ug91BzbBwcJzvc6PlOChSvEuFAsrFIo5yOXwgHLx6JTgtvY/wz9xbXqnVA/8poE6ziRx56wWGF6SkbxJxtVyG2WiAWRZardblJR/pZ/zk9EyRyVYslZF7d9yTu61SKqFMONzfVx7maafr5bIiLLXaF4SmafJi6VztbiBbqNcavR3vglNIeIdyjzxtu65Cp+0FeSj+5iEFnvv4f0307bLnasjn4O7tcm//JTqvX8Lb06QMd1+D1Lmkc6n3FLTeuEdov/4Njd0dgaPXIFezEWHVNZH6Eeb4Fd6YvIrcyBcw54bAHo7AnLwGNvENCg++xfn0dVg0bpJsxQfAlsepH1SyEf1K8NQdCKuWjXT0nOZvxcAWb3Pr0SiqC7fBHo/RhPtgJNupUTjUs6VRJSuk7oGtRKm/S/o7MBdvC0EcHf1tNsLWZzX8koKTmefORgzNzTk463FCDM5GHLUnMRhpqY8ruQc5npmHszUPe2te+D8twUo/CAi9XzdQySzy8vIEyitTPVSeTOF4fgL55KT67ulXH6C6MoNqJona9hLNTYrWz49hPY1lI1Z6Vvt9fATpG1/zreFr2BzqR4Z0n9OnB67SnCtyHpavfyl271Hc12PSw5gmXiyAbU5wi5ZxgXiI2CWYT2dRSJHnS1GcJqPQk+PCeBoHkx6ytRlNbCfA0lOcpWfA1qYDrE4F6MoKMyGmYSvMwF5VtoJn5mCtTdOS5wY1nrwFa3aAW7EBkByA0oZ2nvpboY5SJXEDyiYe2sm0WaDxhR9EdXUMjblBSTik+RnatUyC22tTgfEsTUwM098noXRzw0p2tiYJCdgrlIOx75Qdox+y9LTgGzMw45IwMazh+QKc54vc2aY0kOnxjORtwotHaD5fhDV/kzCiUsR5tkhjD0O7RTQ2Kf4vUpQ2SXkgukv+HmaMlhwfVN6wx/fIiyjsJxPqW+n7QKtI3CSb+zBSUVgrUcHXopKDNiU1qmF9CvbyGHfkCQmzX0GeFEKdSKvLY3Rq7gbjXTzqnR4h1iZgpe5mI5wZms8asIofOQFtowbfsSBsU8EnmEYdnmWob6mjOb1xCbdeEWgyCGbQ5SCEZtBNrR8dc50uSyqnfXXk0lVF+pZo99nQHGEzO7i+qKBrlmHIWsHP3p/AsVhgTAXf9wWBeiIIvoUs5mgxpyfLKu7YTMiLFh0nG6nUmaafV1H+9IkXTvOqXvRqsOx5C75bDS9sX70impKQSkPXQ4c89Fot+bSgXa4YWqNSxUdd5ydUFk0qOqpIUywF1Wm/Sx4W+eBHfp9ORSJ4sgQxlO6a9TovnZdRMIMlKzLOw4nigiD08h9yWFNCwioV7aPDQ36wtwdmmp/fFDmxUpTB7Y3TW6Zrp+qyfCz9BRxWXV6m36ZlAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/7cbcf4b93efc298d8f601e559c2e56ea/4558e/Person.avif 480w,
/static/7cbcf4b93efc298d8f601e559c2e56ea/57a30/Person.avif 768w,
/static/7cbcf4b93efc298d8f601e559c2e56ea/c509e/Person.avif 1024w,
/static/7cbcf4b93efc298d8f601e559c2e56ea/ca326/Person.avif 1215w&quot;
              sizes=&quot;(max-width: 1215px) 100vw, 1215px&quot;
              type=&quot;image/avif&quot;
            /&gt;&lt;source
              srcset=&quot;/static/7cbcf4b93efc298d8f601e559c2e56ea/42669/Person.webp 480w,
/static/7cbcf4b93efc298d8f601e559c2e56ea/050c0/Person.webp 768w,
/static/7cbcf4b93efc298d8f601e559c2e56ea/44907/Person.webp 1024w,
/static/7cbcf4b93efc298d8f601e559c2e56ea/d2260/Person.webp 1215w&quot;
              sizes=&quot;(max-width: 1215px) 100vw, 1215px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/7cbcf4b93efc298d8f601e559c2e56ea/ab158/Person.png 480w,
/static/7cbcf4b93efc298d8f601e559c2e56ea/2d1ba/Person.png 768w,
/static/7cbcf4b93efc298d8f601e559c2e56ea/f1720/Person.png 1024w,
/static/7cbcf4b93efc298d8f601e559c2e56ea/6a591/Person.png 1215w&quot;
            sizes=&quot;(max-width: 1215px) 100vw, 1215px&quot;
            type=&quot;image/png&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/7cbcf4b93efc298d8f601e559c2e56ea/6a591/Person.png&quot;
            alt=&quot;산업기능요원 마무리&quot;
            title=&quot;&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
    &lt;/span&gt;
    &lt;figcaption class=&quot;gatsby-resp-image-figcaption&quot;&gt;&lt;p&gt;산업기능요원 마무리&lt;/p&gt;&lt;/figcaption&gt;
  &lt;/figure&gt;
&lt;figure class=&quot;gatsby-resp-image-figure&quot; style=&quot;margin: 1.45rem 0;&quot;&gt;
    &lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 1280px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 133.33333333333331%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDAAMCAgMCAgMDAwMEAwMEBQgFBQQEBQoHBwYIDAoMDAsKCwsNDhIQDQ4RDgsLEBYQERMUFRUVDA8XGBYUGBIUFRT/2wBDAQMEBAUEBQkFBQkUDQsNFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBT/wgARCAAbABQDASIAAhEBAxEB/8QAGwAAAQQDAAAAAAAAAAAAAAAAAAEEBQYCAwf/xAAYAQACAwAAAAAAAAAAAAAAAAADBQACBv/aAAwDAQACEAMQAAABsUjFy7pXmNAlOL7X9XyjZSzAZ//EAB0QAAIDAAIDAAAAAAAAAAAAAAMEAAECBRMREhT/2gAIAQEAAQUCyl1wQ1rnovcFQTLYZABWneX1PqN45JkhLp5qo5isLGzQhrX2j//EABwRAAICAgMAAAAAAAAAAAAAAAABAhIEERQhUf/aAAgBAwEBPwGWJJaocSfqLN9Mof/EAB0RAAICAQUAAAAAAAAAAAAAAAECAFEUBRESEyH/2gAIAQIBAT8BGoodw/kzUox16eNzLNT/xAApEAACAQIDBQkAAAAAAAAAAAABAgADEQQSIQUTMTKBFCIjQlFhYpHR/9oACAEBAAY/Ag3H2IhzKc3xnI0VqmMqZuIdD3frjKLurYqobX3enWEpsmmU8vij9gOZyFGYW0tKfZ94tNVt1muJqKfS8FhaHLpyy7amf//EACEQAQEAAgEDBQEAAAAAAAAAAAERACFBMWFxUYGRobHx/9oACAEBAAE/IUlfJExxC6lifGsAii8z+44wRClBNRQX1uHxcaL8HplIi8tnejeWp20VZtDX5mpuOqu/3x94B3ZTOXI/jm0crte+NX2S+2f/2gAMAwEAAgADAAAAED/2Av/EABwRAQEBAAEFAAAAAAAAAAAAAAERACFRkaHB8P/aAAgBAwEBPxAlK3qJ2W0+mpz5TRq2+sHf/8QAHREAAwEAAQUAAAAAAAAAAAAAAREhADFhgZGh4f/aAAgBAgEBPxAiDAbBBjVARfZdciYASWr44xCUfb5v/8QAHRABAAIDAQEBAQAAAAAAAAAAAQARITFBYVGxwf/aAAgBAQABPxBgsDlGO6s/IoptmcDQtnrcfqTSZf6jwv1Z6GWwCle+RzTiEb1oaH3kXUErwtkH0USim6EhNKFGrIyqyGDZeLaIZHeJWLpkGnT86RoJuj0n9irYNF19WtuiH0FRasUeerP/2Q==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/7c2c7f641743b3f3976730685c410a77/4558e/LJKB.avif 480w,
/static/7c2c7f641743b3f3976730685c410a77/57a30/LJKB.avif 768w,
/static/7c2c7f641743b3f3976730685c410a77/c509e/LJKB.avif 1024w,
/static/7c2c7f641743b3f3976730685c410a77/35038/LJKB.avif 1280w,
/static/7c2c7f641743b3f3976730685c410a77/c68af/LJKB.avif 1536w&quot;
              sizes=&quot;(max-width: 1280px) 100vw, 1280px&quot;
              type=&quot;image/avif&quot;
            /&gt;&lt;source
              srcset=&quot;/static/7c2c7f641743b3f3976730685c410a77/42669/LJKB.webp 480w,
/static/7c2c7f641743b3f3976730685c410a77/050c0/LJKB.webp 768w,
/static/7c2c7f641743b3f3976730685c410a77/44907/LJKB.webp 1024w,
/static/7c2c7f641743b3f3976730685c410a77/e2782/LJKB.webp 1280w,
/static/7c2c7f641743b3f3976730685c410a77/a8642/LJKB.webp 1536w&quot;
              sizes=&quot;(max-width: 1280px) 100vw, 1280px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/7c2c7f641743b3f3976730685c410a77/55489/LJKB.jpg 480w,
/static/7c2c7f641743b3f3976730685c410a77/8ba6c/LJKB.jpg 768w,
/static/7c2c7f641743b3f3976730685c410a77/87945/LJKB.jpg 1024w,
/static/7c2c7f641743b3f3976730685c410a77/38ece/LJKB.jpg 1280w,
/static/7c2c7f641743b3f3976730685c410a77/6afe2/LJKB.jpg 1536w&quot;
            sizes=&quot;(max-width: 1280px) 100vw, 1280px&quot;
            type=&quot;image/jpeg&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/7c2c7f641743b3f3976730685c410a77/38ece/LJKB.jpg&quot;
            alt=&quot;입사 동기들과 여행 - 주디 커비 바트 레오&quot;
            title=&quot;&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
    &lt;/span&gt;
    &lt;figcaption class=&quot;gatsby-resp-image-figcaption&quot;&gt;&lt;p&gt;입사 동기들과 여행 - 주디 커비 바트 레오&lt;/p&gt;&lt;/figcaption&gt;
  &lt;/figure&gt;&lt;/p&gt;
&lt;h2 id=&quot;왜-이직을-결심했을까&quot; style=&quot;position:relative;&quot;&gt;왜 이직을 결심했을까?&lt;a href=&quot;#%EC%99%9C-%EC%9D%B4%EC%A7%81%EC%9D%84-%EA%B2%B0%EC%8B%AC%ED%96%88%EC%9D%84%EA%B9%8C&quot; aria-label=&quot;왜 이직을 결심했을까 permalink&quot; class=&quot;heading-anchor after&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;3년 동안 계약관리팀, API 연동팀, 플랫폼팀, Growth팀 등 다양한 도메인을 경험하며&lt;br&gt;
입사 당시 세웠던 목표를 어느 정도 이뤘다고 느꼈어요.&lt;/p&gt;
&lt;p&gt;하지만 시간이 지나면서 회사에도 여러 변화가 있었죠.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;입사 당시와 비교했을 때 FE 엔지니어 인원이 절반 가까이 줄어 코드 리뷰나 기술 논의의 제약이 존재했음&lt;/li&gt;
&lt;li&gt;작업 방식이나 회사 방향성의 변화로 인한 아쉬움이 있었음&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;이런 부분들이 누적되면서 자연스레 이직을 고민하게 되었어요.&lt;br&gt;
여러 개선 시도를 해봤지만 결과적으로는 잘 풀리지 않았고,&lt;br&gt;
새로운 환경에서 다시 도전해보기로 결심했어요.&lt;/p&gt;
&lt;p&gt;이번 이직에서는 아래와 같은 점들을 기대했어요.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;개인적으로 흥미를 느낄 수 있는 프로덕트를 서비스하는 조직&lt;/li&gt;
&lt;li&gt;모두싸인(약 100명)보다 규모가 크고 체계적인 조직&lt;/li&gt;
&lt;li&gt;구성원들이 밀도 있고 열정적으로 일하는 조직&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;이런 기준에 부합하는 회사를 찾아 지원하기 시작했습니다.&lt;/p&gt;
&lt;h2 id=&quot;결과적으로&quot; style=&quot;position:relative;&quot;&gt;결과적으로&lt;a href=&quot;#%EA%B2%B0%EA%B3%BC%EC%A0%81%EC%9C%BC%EB%A1%9C&quot; aria-label=&quot;결과적으로 permalink&quot; class=&quot;heading-anchor after&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;채용 시장이 얼어붙어 있던 시기였지만,&lt;br&gt;
&lt;strong&gt;노력하고 성장하는 사람에게는 결국 기회가 온다&lt;/strong&gt;고 믿었어요.&lt;br&gt;
가고 싶은 회사를 먼저 리스트업하고, JD에 맞춰 이력서를 조금씩 수정하며 지원했어요.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;gatsby-resp-image-figure&quot; style=&quot;margin: 1.45rem 0;&quot;&gt;
    &lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 1280px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 54.58333333333334%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAYAAAB/Ca1DAAAACXBIWXMAAAsTAAALEwEAmpwYAAACDklEQVR42l1SyY7TQBT0ZyDkxEt7T7y7bcdZJhnEcOY35sIdCYlfDGcONGfuMFJ6HvXaIRrmUCq7u12uqtdWFGfki4hcLyDPE1TXNXWyoyRNablckus4ZC8WtGDY9swA773As4Nz4F9WGKUQDCEojOBumui439Nus6EG4kWeU5IkFMcxZeAELIR4LfzMjPc/VpoVFIQZvXnrYsOjpiypKgpqIcbomsa4rrHeVhWV2MvgPo4iCsPwP6cQfLK2Y0OHXYfDERwE1FSzyNB11LetES3Wa+MsvTpkp/zseR5do9LN4efHgb5+2tCXx5w+PkQQ6WnsJUmIcdw1xEQQ3CK+7O/1mhFM0jUiJ7RY+rR0fBr6njYAx6sBZsmxwdwpg2OX+Fl9rSdfrSiYe50FedKO65vBSESdxpHGYcC05SwCMXaaZZnpj7sL4fofODrfBiNYlPiglTiUkO8HcChpiwlvIMg8gdl1C5fcbY8fch3M3KPv+7cejeAqLy913V6CIL5A8LIdRz0xhkGPUuq6KDQcagxHI5rGgAzgVkdhqEMhNBxrFy5t2/5tcdwoxiV2BO5XaO7g+9OJHo5H+gB+d3dH98AB63s4Pmy3s3PU0sFpiSq4zzROSPj+k5Vl+TlJV2fHFWfXFd/g8Mdpv1fHaVL3zLudQnxVVZVCVNVLqXAvVQdgYAoJFIajMKif6zT9/heJS0jA5U6BLAAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/79ae85ae53dbca8b9a1f6e42935a0db5/4558e/Interview-prepare.avif 480w,
/static/79ae85ae53dbca8b9a1f6e42935a0db5/57a30/Interview-prepare.avif 768w,
/static/79ae85ae53dbca8b9a1f6e42935a0db5/c509e/Interview-prepare.avif 1024w,
/static/79ae85ae53dbca8b9a1f6e42935a0db5/35038/Interview-prepare.avif 1280w,
/static/79ae85ae53dbca8b9a1f6e42935a0db5/68e17/Interview-prepare.avif 1492w&quot;
              sizes=&quot;(max-width: 1280px) 100vw, 1280px&quot;
              type=&quot;image/avif&quot;
            /&gt;&lt;source
              srcset=&quot;/static/79ae85ae53dbca8b9a1f6e42935a0db5/42669/Interview-prepare.webp 480w,
/static/79ae85ae53dbca8b9a1f6e42935a0db5/050c0/Interview-prepare.webp 768w,
/static/79ae85ae53dbca8b9a1f6e42935a0db5/44907/Interview-prepare.webp 1024w,
/static/79ae85ae53dbca8b9a1f6e42935a0db5/e2782/Interview-prepare.webp 1280w,
/static/79ae85ae53dbca8b9a1f6e42935a0db5/1a65e/Interview-prepare.webp 1492w&quot;
              sizes=&quot;(max-width: 1280px) 100vw, 1280px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/79ae85ae53dbca8b9a1f6e42935a0db5/ab158/Interview-prepare.png 480w,
/static/79ae85ae53dbca8b9a1f6e42935a0db5/2d1ba/Interview-prepare.png 768w,
/static/79ae85ae53dbca8b9a1f6e42935a0db5/f1720/Interview-prepare.png 1024w,
/static/79ae85ae53dbca8b9a1f6e42935a0db5/f3baa/Interview-prepare.png 1280w,
/static/79ae85ae53dbca8b9a1f6e42935a0db5/7a941/Interview-prepare.png 1492w&quot;
            sizes=&quot;(max-width: 1280px) 100vw, 1280px&quot;
            type=&quot;image/png&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/79ae85ae53dbca8b9a1f6e42935a0db5/f3baa/Interview-prepare.png&quot;
            alt=&quot;열심히 면접 준비했던 흔적&quot;
            title=&quot;&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
    &lt;/span&gt;
    &lt;figcaption class=&quot;gatsby-resp-image-figcaption&quot;&gt;&lt;p&gt;열심히 면접 준비했던 흔적&lt;/p&gt;&lt;/figcaption&gt;
  &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;가고 싶었던 회사는 아래와 같아요.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;오늘의집: 프로덕트에 대한 개인적 흥미&lt;/li&gt;
&lt;li&gt;강남언니: 프로덕트 &amp;#x26; 도메인 모두에 대한 관심&lt;/li&gt;
&lt;li&gt;토스: 기술적으로 유명하고, 지인들의 추천&lt;/li&gt;
&lt;li&gt;당근마켓: 자유로운 분위기와 자주 사용하는 서비스&lt;/li&gt;
&lt;li&gt;카카오: 대기업이면서 동시에 힙한(?) 문화&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;결국 &lt;strong&gt;강남언니(힐링페이퍼)&lt;/strong&gt; 에 최종 합격하여 조인하게 되었습니다! 🎉&lt;br&gt;
&lt;figure class=&quot;gatsby-resp-image-figure&quot; style=&quot;margin: 1.45rem 0;&quot;&gt;
    &lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 690px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 92.70833333333334%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAATCAYAAACQjC21AAAACXBIWXMAAAsTAAALEwEAmpwYAAAC+klEQVR42p2UWWyMURTHxxZUREJiX6L2EJHY3hQvgpbaQixFa4umaEsrISGCSCQexFpbPAgSxIMHTyK2PohIJ2nNtJ1pO0t1asx0GaZm5vt+zv3utB1CE77kn3vuvf/zP+fc+91jq611oVBTU0NVVRV2ux2nw0lbWxv/89k8Hi/Nzc00+Jqpdvv50tJBsC1GOJKg9btJyzeTWOIfBH1eD1+/BPF9DlHpcFNT14ivKUw8bggSFoyEKBo9wDS6BZVpClQSsSTi/P9nI9AAXgf4nClwYHq7wd/gqwbPJwgFknKmCB5bBusGw7ZRsGUkbB0NOeNgxwTITYe8SbBLkDtRr+WM1ZwtI8RHxjWD4M5RrSfl2ziyCLJ6w6ZhsHm4dsgT592TU5AU3SX2TiU6RnM3DoXlNigrTBEsXSxR0iT6eJ3NvhlQMBuK5sO1fLi0G+5KBmUHIH+W3ts7XWe8XSpZ1Q9uFKcIHl0C66XkvHRNVA7FC+DIQhEqgdtFcP+EjOJUOFcHyp8Je6boI1kz8A+CG4boiIVCviWbdw7DveMiWArPLsLDU/D8KlzZJ/sSoOygrqRL8HCKYElGd8kqw1OZcG49nN8EZ9fCxVy4sBWuF8Dp1XAmG04u1xUpH6vkot8yzB6QvN2xmqQOf89UKX+OlCjlH5onwaZpKCF1doqrbjmrL9xMydA8IOey1Ia5sjfmil6YiqACrE2zbtJU4iqIOha1lt1fi6yQ283sAxkyXt6fIljxAuPVQ4y3TzDePIbypyA2yn7zCN490aM1T651QvFePoDaj8n/Wn5se7WL95VOyu1VvP5QQWNLOzHD1AGF8DUSlbl+q53PtMenF2j089nnpdHnocHtwttQT/RbxHrwsY4oTbIf+xHtysBqBIn4rzBSmkN9fT1OpxOXS/XFWqsnqrmCsh0OB263m1AoRCAQoLW1tecM/X6/JVZXV4fH4+kSVoGUUDAYJBKJ0N7ebolFo9GeBRVZEZWDslWnDofD1pqy4/F/a2Y/AaOPASGwlC10AAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/b16f768b3e62ffb9c630e123bad30082/4558e/HealingPaper.avif 480w,
/static/b16f768b3e62ffb9c630e123bad30082/b399c/HealingPaper.avif 690w&quot;
              sizes=&quot;(max-width: 690px) 100vw, 690px&quot;
              type=&quot;image/avif&quot;
            /&gt;&lt;source
              srcset=&quot;/static/b16f768b3e62ffb9c630e123bad30082/42669/HealingPaper.webp 480w,
/static/b16f768b3e62ffb9c630e123bad30082/6bd32/HealingPaper.webp 690w&quot;
              sizes=&quot;(max-width: 690px) 100vw, 690px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/b16f768b3e62ffb9c630e123bad30082/ab158/HealingPaper.png 480w,
/static/b16f768b3e62ffb9c630e123bad30082/86e67/HealingPaper.png 690w&quot;
            sizes=&quot;(max-width: 690px) 100vw, 690px&quot;
            type=&quot;image/png&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/b16f768b3e62ffb9c630e123bad30082/86e67/HealingPaper.png&quot;
            alt=&quot;최종 합격 메일&quot;
            title=&quot;&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
    &lt;/span&gt;
    &lt;figcaption class=&quot;gatsby-resp-image-figcaption&quot;&gt;&lt;p&gt;최종 합격 메일&lt;/p&gt;&lt;/figcaption&gt;
  &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;강남언니는 제가 실사용했던 서비스이기도 하고, 이전부터 조직 문화와 방향성에 매력을 느꼈던 회사예요.&lt;br&gt;
게다가 처우 협의 결과도 만족스러워서 정말 좋은 기회라고 생각했어요.&lt;/p&gt;
&lt;h2 id=&quot;마치며&quot; style=&quot;position:relative;&quot;&gt;마치며&lt;a href=&quot;#%EB%A7%88%EC%B9%98%EB%A9%B0&quot; aria-label=&quot;마치며 permalink&quot; class=&quot;heading-anchor after&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;모두싸인에서의 3년 여정을 마치며 이렇게 짧은 회고록을 남깁니다.&lt;br&gt;
입사와 퇴사 당시의 슬랙 메시지를 함께 보니&lt;br&gt;
그 사이 있었던 수많은 추억이 새록새록 떠오르네요 ㅎㅎ&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;gatsby-resp-image-figure&quot; style=&quot;margin: 1.45rem 0;&quot;&gt;
    &lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 1280px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 23.125%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAFCAYAAABFA8wzAAAACXBIWXMAABYlAAAWJQFJUiTwAAAA7klEQVR42o2Q2W6DMBBF+ZKoIQk0GwZjvGAbAjjQTer/f83tOEhtpb704Ugje2aO5iat7WFsh34I6G4jPu9ndHIDL1PkeYanNEe6f/43iTIddBvx4ELjXCiU3KAoGCou6c2A1w04K7DZHkiQ/WG7+5Em4zhhCC8YphljWLC8fmBeZrwHhnCfEeY3VLWk5QJXVj9qVq51ScLI6VJidzhin52QWOdh/YDW3YgeynjoGIOfKIoeUjs0hKE/34/w3UrsbZSFkC1JNAk4LgVH4kwFrQSEcuswNTWqhXVx2TogpCGR+47leGYP4onx3N8nfwFfTp8Pt0T96QAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/86bfed665cf36cb9430476173fbfe017/4558e/First.avif 480w,
/static/86bfed665cf36cb9430476173fbfe017/57a30/First.avif 768w,
/static/86bfed665cf36cb9430476173fbfe017/c509e/First.avif 1024w,
/static/86bfed665cf36cb9430476173fbfe017/35038/First.avif 1280w,
/static/86bfed665cf36cb9430476173fbfe017/8424e/First.avif 1722w&quot;
              sizes=&quot;(max-width: 1280px) 100vw, 1280px&quot;
              type=&quot;image/avif&quot;
            /&gt;&lt;source
              srcset=&quot;/static/86bfed665cf36cb9430476173fbfe017/42669/First.webp 480w,
/static/86bfed665cf36cb9430476173fbfe017/050c0/First.webp 768w,
/static/86bfed665cf36cb9430476173fbfe017/44907/First.webp 1024w,
/static/86bfed665cf36cb9430476173fbfe017/e2782/First.webp 1280w,
/static/86bfed665cf36cb9430476173fbfe017/99aab/First.webp 1722w&quot;
              sizes=&quot;(max-width: 1280px) 100vw, 1280px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/86bfed665cf36cb9430476173fbfe017/ab158/First.png 480w,
/static/86bfed665cf36cb9430476173fbfe017/2d1ba/First.png 768w,
/static/86bfed665cf36cb9430476173fbfe017/f1720/First.png 1024w,
/static/86bfed665cf36cb9430476173fbfe017/f3baa/First.png 1280w,
/static/86bfed665cf36cb9430476173fbfe017/fb5f2/First.png 1722w&quot;
            sizes=&quot;(max-width: 1280px) 100vw, 1280px&quot;
            type=&quot;image/png&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/86bfed665cf36cb9430476173fbfe017/f3baa/First.png&quot;
            alt=&quot;입사 메시지&quot;
            title=&quot;&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
    &lt;/span&gt;
    &lt;figcaption class=&quot;gatsby-resp-image-figcaption&quot;&gt;&lt;p&gt;입사 메시지&lt;/p&gt;&lt;/figcaption&gt;
  &lt;/figure&gt;
&lt;figure class=&quot;gatsby-resp-image-figure&quot; style=&quot;margin: 1.45rem 0;&quot;&gt;
    &lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 1280px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 16.875%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAADCAYAAACTWi8uAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAhklEQVR42o3NTQrCMBAF4F7FttJqmv+kSYjBkoIK3v88zyRQF65cfLxh5sF0MW1I94y8P7DlF95Pj7hOiG4CITP68YLh/L+Ocg0XbkVqjEsgzGDhthSuOA1T04/z17H7VW+dth7KeEjtoG2AdQGUKyxMQqi1pEJ9WpMJ02YmipamdQ6ESnwAiGdcC2KBVvgAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/910806614f5cfc755a9cb96e431c1a4f/4558e/Last.avif 480w,
/static/910806614f5cfc755a9cb96e431c1a4f/57a30/Last.avif 768w,
/static/910806614f5cfc755a9cb96e431c1a4f/c509e/Last.avif 1024w,
/static/910806614f5cfc755a9cb96e431c1a4f/35038/Last.avif 1280w,
/static/910806614f5cfc755a9cb96e431c1a4f/b6ce9/Last.avif 1508w&quot;
              sizes=&quot;(max-width: 1280px) 100vw, 1280px&quot;
              type=&quot;image/avif&quot;
            /&gt;&lt;source
              srcset=&quot;/static/910806614f5cfc755a9cb96e431c1a4f/42669/Last.webp 480w,
/static/910806614f5cfc755a9cb96e431c1a4f/050c0/Last.webp 768w,
/static/910806614f5cfc755a9cb96e431c1a4f/44907/Last.webp 1024w,
/static/910806614f5cfc755a9cb96e431c1a4f/e2782/Last.webp 1280w,
/static/910806614f5cfc755a9cb96e431c1a4f/eed78/Last.webp 1508w&quot;
              sizes=&quot;(max-width: 1280px) 100vw, 1280px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/910806614f5cfc755a9cb96e431c1a4f/ab158/Last.png 480w,
/static/910806614f5cfc755a9cb96e431c1a4f/2d1ba/Last.png 768w,
/static/910806614f5cfc755a9cb96e431c1a4f/f1720/Last.png 1024w,
/static/910806614f5cfc755a9cb96e431c1a4f/f3baa/Last.png 1280w,
/static/910806614f5cfc755a9cb96e431c1a4f/93af6/Last.png 1508w&quot;
            sizes=&quot;(max-width: 1280px) 100vw, 1280px&quot;
            type=&quot;image/png&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/910806614f5cfc755a9cb96e431c1a4f/f3baa/Last.png&quot;
            alt=&quot;퇴사 메시지&quot;
            title=&quot;&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
    &lt;/span&gt;
    &lt;figcaption class=&quot;gatsby-resp-image-figcaption&quot;&gt;&lt;p&gt;퇴사 메시지&lt;/p&gt;&lt;/figcaption&gt;
  &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;첫 회사를 통해 단단해질 수 있었고, 이제는 새로운 무대에서 또 다른 도전을 시작하려 해요.&lt;br&gt;
여전히 배움의 길 위에 있고, 앞으로의 여정이 기대돼요!&lt;br&gt;
&lt;strong&gt;모두싸인에서의 지난 3년은 제 커리어의 든든한 시작점이자, 가장 따뜻한 기억으로 남을 것 같아요.&lt;/strong&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[하나의 코드로 멀티 테넌트 서비스 운영하기]]></title><description><![CDATA[해당 글에선 테넌트(Tenant)라는 용어와 환경(Environment)이라는 용어를 동일하게 사용합니다 🙇🏻‍♂️ 배경 모두싸인에서 근무하며 계약 관리, API 연동, 그로스팀 등 다양한 목적을 가진 팀을 경험했다. 그러던 중 온프레미스(on…]]></description><link>https://clzzi.dev/frontend-tenant-system/</link><guid isPermaLink="false">https://clzzi.dev/frontend-tenant-system/</guid><pubDate>Tue, 16 Sep 2025 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;해당 글에선 테넌트(&lt;code&gt;Tenant&lt;/code&gt;)라는 용어와 환경(&lt;code&gt;Environment&lt;/code&gt;)이라는 용어를 동일하게 사용합니다 🙇🏻‍♂️&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;배경&quot; style=&quot;position:relative;&quot;&gt;배경&lt;a href=&quot;#%EB%B0%B0%EA%B2%BD&quot; aria-label=&quot;배경 permalink&quot; class=&quot;heading-anchor after&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;모두싸인에서 근무하며 계약 관리, API 연동, 그로스팀 등 다양한 목적을 가진 팀을 경험했다.&lt;br&gt;
그러던 중 온프레미스(&lt;a href=&quot;https://ko.wikipedia.org/wiki/%EC%98%A8%ED%94%84%EB%A0%88%EB%AF%B8%EC%8A%A4_%EC%86%8C%ED%94%84%ED%8A%B8%EC%9B%A8%EC%96%B4&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;&lt;code&gt;on-premise&lt;/code&gt;&lt;/a&gt;) 형태로 서비스를 제공할 수 있는 구축형 서비스가 필요해졌고, 내가 &lt;code&gt;Frontend Engineer&lt;/code&gt;로 참여하게 되었다.&lt;/p&gt;
&lt;p&gt;여러 테넌트에서 모두싸인 서비스를 각 환경의 특성에 맞게 제공할 수 있어야 했고, 기능적인 부분은 주로 &lt;strong&gt;“A, B, C 기능 중 A와 B만 동작한다”&lt;/strong&gt; 와 같은 분기 처리가 필요했다.&lt;br&gt;
이러한 요구사항은 기존 기능 중 일부만 노출하거나, 기능 동작을 조금씩 수정해 제공하는 형태여야 했기 때문에 흔히 생각할 수 있는 &lt;code&gt;MicroFrontend&lt;/code&gt; 방식은 적합하지 않았다(인적·금전적 리소스 문제도 있었다).&lt;/p&gt;
&lt;p&gt;그 결과, 하나의 코드로 여러 테넌트 환경에 맞는 서비스를 제공하고 운영할 수 있는 구조를 설계하게 되었다.&lt;/p&gt;
&lt;h2 id=&quot;내용&quot; style=&quot;position:relative;&quot;&gt;내용&lt;a href=&quot;#%EB%82%B4%EC%9A%A9&quot; aria-label=&quot;내용 permalink&quot; class=&quot;heading-anchor after&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;개인 블로그에는 보안 정책으로 인해 구체적인 작업 내용을 작성하기 어려워, 사내 기술 블로그에 정리해 공유했다.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://team.modusign.co.kr/%ED%95%98%EB%82%98%EC%9D%98-%ED%94%84%EB%A1%A0%ED%8A%B8%EC%97%94%EB%93%9C-%EC%BD%94%EB%93%9C%EB%A1%9C-%EB%A9%80%ED%8B%B0-%ED%99%98%EA%B2%BD-%EC%9A%B4%EC%98%81%ED%95%98%EA%B8%B0-e732736b0b01&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;👉🏻 사내 기술 블로그 - 하나의 코드로 멀티 테넌트 서비스 운영하기 👈🏻&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;느낀점&quot; style=&quot;position:relative;&quot;&gt;느낀점&lt;a href=&quot;#%EB%8A%90%EB%82%80%EC%A0%90&quot; aria-label=&quot;느낀점 permalink&quot; class=&quot;heading-anchor after&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;테넌트 시스템을 설계하면서 다방면으로 챌린지가 있었다.&lt;/p&gt;
&lt;h3 id=&quot;1-문서화--설득&quot; style=&quot;position:relative;&quot;&gt;1. 문서화 &amp;#x26; 설득&lt;a href=&quot;#1-%EB%AC%B8%EC%84%9C%ED%99%94--%EC%84%A4%EB%93%9D&quot; aria-label=&quot;1 문서화  설득 permalink&quot; class=&quot;heading-anchor after&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;온프레미스 프로젝트는 Frontend Engineer가 나 혼자였지만, 변경 범위는 프론트엔드 챕터 전체에 영향을 주었기 때문에 변경 사항을 자주 공유하고, 팀원들의 의견을 반영하며, 불가능한 부분은 설득해야 했다.&lt;br&gt;
초반에는 어려웠지만 점차 적응하면서 점점 더 잘 해낼 수 있었다.&lt;br&gt;
중요했던 것은 &lt;strong&gt;왜 이런 선택을 하려는지, 다른 선택지와 비교했을 때 어떤 트레이드오프가 있는지를 명확히 하고, 설득할 수 있는 근거 자료를 충분히 모아 문서화&lt;/strong&gt;하는 일이었다고 생각한다.&lt;/p&gt;
&lt;h3 id=&quot;2-시스템-설계&quot; style=&quot;position:relative;&quot;&gt;2. 시스템 설계&lt;a href=&quot;#2-%EC%8B%9C%EC%8A%A4%ED%85%9C-%EC%84%A4%EA%B3%84&quot; aria-label=&quot;2 시스템 설계 permalink&quot; class=&quot;heading-anchor after&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;작은 프로젝트에서는 시스템을 쉽게 수정·개선할 수 있었지만, 이렇게 방대한 코드가 쌓여 있는 프로젝트에서 시스템을 개선하고 설계한 것은 처음이었다.&lt;br&gt;
다른 도메인 팀에서는 실시간으로 개발과 배포가 이루어지고 있었기 때문에 &lt;strong&gt;영향 범위 최소화, 하위 호환성 유지, 이슈 발생시 빠른 대응&lt;/strong&gt; 등 고려해야 할 요소가 많아 접근 자체가 쉽지 않았다. 다행히 경험이 많은 CTO님과 DevOps 엔지니어(전 Frontend Engineer) 한 분의 도움으로 이러한 요소들을 꼼꼼히 체크하며 설계할 수 있었다.&lt;br&gt;
앞으로 다시 비슷한 상황이 온다면, 이번 경험이 큰 자산이 될 것이라 생각한다.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Input 제일 뒤로 커서 보내기]]></title><description><![CDATA[배경 회사에서 진행 중인 프로젝트에서 UX 향상을 위해 키보드 사용성 개선 작업을 진행했어요.
Input 컴포넌트 하위에 검색 결과가 리스트 형태로 노출되고, 해당 리스트 아이템들을 키보드로 쉽게 탐색하고 선택할 수 있는 UX…]]></description><link>https://clzzi.dev/input-end-cursor/</link><guid isPermaLink="false">https://clzzi.dev/input-end-cursor/</guid><pubDate>Wed, 06 Nov 2024 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;배경&quot; style=&quot;position:relative;&quot;&gt;배경&lt;a href=&quot;#%EB%B0%B0%EA%B2%BD&quot; aria-label=&quot;배경 permalink&quot; class=&quot;heading-anchor after&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;회사에서 진행 중인 프로젝트에서 &lt;strong&gt;UX 향상&lt;/strong&gt;을 위해 &lt;strong&gt;키보드 사용성 개선 작업&lt;/strong&gt;을 진행했어요.
Input 컴포넌트 하위에 검색 결과가 리스트 형태로 노출되고, 해당 리스트 아이템들을 &lt;strong&gt;키보드로 쉽게 탐색하고 선택할 수 있는 UX&lt;/strong&gt;를 구현하는 것이 목적이었어요.&lt;/p&gt;
&lt;p&gt;기본적인 동작은 잘 작동했지만, 키보드 사용성을 강화하면서 &lt;strong&gt;새로운 UX적인 불편함&lt;/strong&gt;이 발생했어요.&lt;br&gt;
바로, 키보드로 포커싱한 리스트 아이템에서 다시 &lt;strong&gt;Input으로 포커스를 이동할 때&lt;/strong&gt;, Input에 값이 있음에도 불구하고 &lt;strong&gt;커서가 항상 맨 앞으로 고정된다는 점&lt;/strong&gt;이었어요.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/961ca314cb211f144ac902478fb310f8/input-to-start.gif&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;pain-point&quot; style=&quot;position:relative;&quot;&gt;Pain Point&lt;a href=&quot;#pain-point&quot; aria-label=&quot;pain point permalink&quot; class=&quot;heading-anchor after&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;이 이슈는 단순히 백로그 성격의 문제일 수 있지만, 개인적으로는 &lt;strong&gt;중요한 UX 결함&lt;/strong&gt;이라고 느꼈어요.&lt;/p&gt;
&lt;p&gt;사용자가 가장 불편하게 느낄 수 있는 지점은 다음과 같아요:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;“타이핑을 잘못해서 다시 수정하려고 커서를 옮겼는데, 예상과 다르게 커서가 맨 앞으로 이동한다면?”&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;이런 경험은 사용자가 기대하는 UX와 실제 동작이 다르다고 느끼게 만들고, 불필요한 인지적 스트레스를 유발해요 🫠&lt;/p&gt;
&lt;h2 id=&quot;해결방법&quot; style=&quot;position:relative;&quot;&gt;해결방법&lt;a href=&quot;#%ED%95%B4%EA%B2%B0%EB%B0%A9%EB%B2%95&quot; aria-label=&quot;해결방법 permalink&quot; class=&quot;heading-anchor after&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;이 문제를 해결하기 위해 리서치를 진행하던 중, 아래와 같은 사실을 알게 되었어요.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;input&lt;/code&gt; 요소에는 전체 선택을 위한 &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/HTMLInputElement/select&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;&lt;code&gt;select&lt;/code&gt;&lt;/a&gt; 메서드가 있어요.&lt;/li&gt;
&lt;li&gt;커서 위치를 특정 지점으로 이동하거나 범위를 지정해 선택할 수 있는 &lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/API/HTMLInputElement/setSelectionRange&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;&lt;code&gt;setSelectionRange&lt;/code&gt;&lt;/a&gt; 메서드도 존재해요.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;setSelectionRange&lt;/code&gt;는 &lt;a href=&quot;https://html.spec.whatwg.org/multipage/forms.html#concept-input-apply&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;WHATWG forms spec&lt;/a&gt;에 따라 &lt;code&gt;text&lt;/code&gt;, &lt;code&gt;search&lt;/code&gt;, &lt;code&gt;url&lt;/code&gt;, &lt;code&gt;tel&lt;/code&gt;, &lt;code&gt;password&lt;/code&gt; 타입에서만 사용할 수 있어요.&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;🔍 &lt;strong&gt;WHATWG란?&lt;/strong&gt;&lt;br&gt;
WHATWG는 &lt;code&gt;Web Hypertext Application Technology Working Group&lt;/code&gt;의 약자로, 웹 표준을 정의하는 그룹이에요.&lt;br&gt;
웹 표준은 브라우저 간 호환성을 보장하고, 웹 개발자들이 참고할 수 있는 명확한 지침을 제공해요.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;키보드 사용성을 챙길때 제작한 &lt;code&gt;React.Ref&lt;/code&gt;도 있었고, 기본적으로 Input 컴포넌트에서 &lt;code&gt;onFocus&lt;/code&gt; 메서드를 지원해주니 &lt;strong&gt;포커스 이벤트 발생 시, 커서를 Input 맨 뒤로 이동시키면 되겠다&lt;/strong&gt;고 판단했어요.&lt;/p&gt;
&lt;p&gt;하지만… 예상대로 동작하지 않았어요 🥲&lt;/p&gt;
&lt;h2 id=&quot;실패-원인-분석&quot; style=&quot;position:relative;&quot;&gt;실패 원인 분석&lt;a href=&quot;#%EC%8B%A4%ED%8C%A8-%EC%9B%90%EC%9D%B8-%EB%B6%84%EC%84%9D&quot; aria-label=&quot;실패 원인 분석 permalink&quot; class=&quot;heading-anchor after&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;생각을 조금 더 정리해보니, 실패 원인은 &lt;strong&gt;브라우저의 렌더링 타이밍&lt;/strong&gt;에 있었어요.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;focus&lt;/code&gt; 이벤트가 발생하고 &lt;code&gt;onFocus&lt;/code&gt; 핸들러가 호출되는 시점에는 &lt;strong&gt;브라우저가 아직 Input의 포커스 상태나 커서 위치 정보를 완전히 반영하지 않은 상태&lt;/strong&gt;일 수 있어요.
이로 인해 &lt;code&gt;setSelectionRange&lt;/code&gt;를 즉시 호출해도 &lt;strong&gt;커서 위치가 예상대로 설정되지 않는 문제&lt;/strong&gt;가 있었어요.&lt;/p&gt;
&lt;h2 id=&quot;해결방법-settimeout&quot; style=&quot;position:relative;&quot;&gt;해결방법: setTimeout&lt;a href=&quot;#%ED%95%B4%EA%B2%B0%EB%B0%A9%EB%B2%95-settimeout&quot; aria-label=&quot;해결방법 settimeout permalink&quot; class=&quot;heading-anchor after&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;저는 해당 문제를 해결하기 위해 &lt;code&gt;setTimeout을&lt;/code&gt; 사용했어요. setTimeout는 콜백함수의 실행시점을 &lt;strong&gt;현재 실행중인 코드블록 다음 순서&lt;/strong&gt;로 실행하기 때문이에요.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;상세 이유: setTimeout API는 MacroTaskQueue로 분류되어 MicroTaskQueue에 등록된 핸들러가 먼저 실행되어 렌더링 업데이트가 처리된 후 실행되기 때문이에요. 비슷한 원리의 해결방법으론 requestAnimationFrame가 있어요.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;deckgo-highlight-code language=&quot;ts&quot; terminal=&quot;carbon&quot; theme=&quot;dracula&quot;  &gt;
          &lt;code slot=&quot;code&quot;&gt;const DELAY_TIME = 0;
const INPUT_END_INDEX = inputRef.current?.value.length ?? 0;

const handleFocusToEnd = () =&amp;gt; {
    setTimeout(() =&amp;gt; {
        inputRef.current?.setSelectionRange(INPUT_END_INDEX, INPUT_END_INDEX);
    }, DELAY_TIME);
}&lt;/code&gt;
        &lt;/deckgo-highlight-code&gt;
&lt;p&gt;&lt;code&gt;setTimeout&lt;/code&gt;의 delay를 &lt;strong&gt;0초&lt;/strong&gt;로 두고 실행하게되면 Input에 포커스 되고 &lt;strong&gt;값이 반영되는 시점 이후의 이벤트 루프&lt;/strong&gt;에서 코드를 실행하게 되기때문에 커서 위치를 원하는 대로 이동시킬 수 있어요.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/a92e7ed1355b832d61ce65fb1838dfff/input-to-end.gif&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;마무리&quot; style=&quot;position:relative;&quot;&gt;마무리&lt;a href=&quot;#%EB%A7%88%EB%AC%B4%EB%A6%AC&quot; aria-label=&quot;마무리 permalink&quot; class=&quot;heading-anchor after&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;이번 버그를 해결하면서 단순한 커서 위치 조정 문제를 넘어, &lt;strong&gt;브라우저 렌더링 흐름, 이벤트 루프, WHATWG 명세&lt;/strong&gt;까지 사고를 확장할 수 있었어요.
마이너한 이슈일 수 있지만 생각보다 얻은 지식이 많아서 좋았어요.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[yalc를 통해 로컬 패키지를 테스트해보자]]></title><description><![CDATA[배경 회사에서 메인 작업을 진행하던중 기존 DesignSystem(DS)에 존재하던 컴포넌트의 결함 및 DS 컴포넌트를 신규로 제작하는 과업이 생겼어요. DS 컴포넌트가 메인 작업에서 필요했었기때문에 작업방향은 크게 2가지로 나뉠 수 있었어요.…]]></description><link>https://clzzi.dev/yalc/</link><guid isPermaLink="false">https://clzzi.dev/yalc/</guid><pubDate>Mon, 09 Sep 2024 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;배경&quot; style=&quot;position:relative;&quot;&gt;배경&lt;a href=&quot;#%EB%B0%B0%EA%B2%BD&quot; aria-label=&quot;배경 permalink&quot; class=&quot;heading-anchor after&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;회사에서 메인 작업을 진행하던중 기존 &lt;code&gt;DesignSystem(DS)&lt;/code&gt;에 존재하던 컴포넌트의 결함 및 DS 컴포넌트를 신규로 제작하는 과업이 생겼어요.&lt;br&gt;
DS 컴포넌트가 메인 작업에서 필요했었기때문에 작업방향은 크게 &lt;strong&gt;2가지&lt;/strong&gt;로 나뉠 수 있었어요.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;1️⃣ 메인작업에 쓰일 컴포넌트는 로컬 컴포넌트로 제작하고 추후에 DS에 작업해서 배포하기&lt;br&gt;
2️⃣ DS 컴포넌트를 우선적으로 제작하고 함께 배포하기&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;저는 로컬컴포넌트로 제작 후 추후 DS로 옮기는것은 비효율적이라고 판단했고, 코드리뷰에서 시간이 조금 걸리더라도 DS 작업을 병렬적으로 가져가는것이 좋다고 판단했어요.&lt;/p&gt;
&lt;h2 id=&quot;문제지점&quot; style=&quot;position:relative;&quot;&gt;문제지점&lt;a href=&quot;#%EB%AC%B8%EC%A0%9C%EC%A7%80%EC%A0%90&quot; aria-label=&quot;문제지점 permalink&quot; class=&quot;heading-anchor after&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;위와 같이 의사결정을 한 후, DS 작업을 통해 기존 컴포넌트의 결함 수정 및 새로운 컴포넌트 제작을 진행하였어요.&lt;br&gt;
그러나 작업한 내용을 테스트할 방법이 마땅치 않았어요.&lt;/p&gt;
&lt;p&gt;기존에 존재하던 테스트방법은 &lt;code&gt;storybook&lt;/code&gt;으로 확인하거나 npm 패키지 배포를 통해 확인하는 방법뿐이였어요.
하지만 발견된 결함은 제품에 결합되었을때 생기는 결함이였기때문에 storybook에서 완벽히 재현할 수 있음을 보장할 수 없었어요.&lt;br&gt;
그래서 &lt;strong&gt;로컬에서 테스트해볼 수 있는 방법이 없을까?&lt;/strong&gt; 하면서 질문을 했더니 &lt;code&gt;yalc&lt;/code&gt;라는 라이브러리를 알게되었어요.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 1280px; margin: 1.45rem 0;&quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 33.958333333333336%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAHCAYAAAAIy204AAAACXBIWXMAABYlAAAWJQFJUiTwAAABJ0lEQVR42l1RWXaDQAzjFn1pQhKys4RhHYYtQNPe/0iqrX6VDz+PNX6yZHtBcMLtkSB5ZriHCXb7Ez53R8bWD/7ldSi+Dm9eflDWDpXt0LQDTF7Duh5PU2B4LcjLBkXlpKeV3LC3GyYO/9j4JN5sDwwSRlGCKDGIRWEYp9L4FLW5YBnxR5Qyh7HhP92kBc7XEIfgisstYmit7rwmC+FEmarphpnZtSP6caFa1438f81v1E1HteP0xT+t2/5FZ9PyTVLvJtJ1strRhrywSE2JWlagSrRW2/04k8TkFQmskyHTm0S6Dh2cyJo8taJ7yUtL2xkJLExW0aa+FUuzkha3/onW9scL/MNZsL+sGC1rox6ksi0PoQpUSSqEsexRce1RlUqyvu66/gWEotSwPHiQEAAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/330932a558cb4928e72bf5c48d75fe01/4558e/yalc-question.avif 480w,
/static/330932a558cb4928e72bf5c48d75fe01/57a30/yalc-question.avif 768w,
/static/330932a558cb4928e72bf5c48d75fe01/c509e/yalc-question.avif 1024w,
/static/330932a558cb4928e72bf5c48d75fe01/35038/yalc-question.avif 1280w,
/static/330932a558cb4928e72bf5c48d75fe01/c45b5/yalc-question.avif 2894w&quot;
              sizes=&quot;(max-width: 1280px) 100vw, 1280px&quot;
              type=&quot;image/avif&quot;
            /&gt;&lt;source
              srcset=&quot;/static/330932a558cb4928e72bf5c48d75fe01/42669/yalc-question.webp 480w,
/static/330932a558cb4928e72bf5c48d75fe01/050c0/yalc-question.webp 768w,
/static/330932a558cb4928e72bf5c48d75fe01/44907/yalc-question.webp 1024w,
/static/330932a558cb4928e72bf5c48d75fe01/e2782/yalc-question.webp 1280w,
/static/330932a558cb4928e72bf5c48d75fe01/ee9b5/yalc-question.webp 2894w&quot;
              sizes=&quot;(max-width: 1280px) 100vw, 1280px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/330932a558cb4928e72bf5c48d75fe01/ab158/yalc-question.png 480w,
/static/330932a558cb4928e72bf5c48d75fe01/2d1ba/yalc-question.png 768w,
/static/330932a558cb4928e72bf5c48d75fe01/f1720/yalc-question.png 1024w,
/static/330932a558cb4928e72bf5c48d75fe01/f3baa/yalc-question.png 1280w,
/static/330932a558cb4928e72bf5c48d75fe01/451ac/yalc-question.png 2894w&quot;
            sizes=&quot;(max-width: 1280px) 100vw, 1280px&quot;
            type=&quot;image/png&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/330932a558cb4928e72bf5c48d75fe01/f3baa/yalc-question.png&quot;
            alt=&quot;yalc question&quot;
            title=&quot;&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;h2 id=&quot;yalc란&quot; style=&quot;position:relative;&quot;&gt;yalc란?&lt;a href=&quot;#yalc%EB%9E%80&quot; aria-label=&quot;yalc란 permalink&quot; class=&quot;heading-anchor after&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;yalc는 로컬에서 개발 중인 npm 패키지를 테스트할 때 사용하는 도구로, &lt;strong&gt;패키지를 실제로 npm에 배포하지 않고도&lt;/strong&gt; 다른 프로젝트에서 설치해서 확인할 수 있게 해줘요.&lt;/p&gt;
&lt;p&gt;보통 NPM 패키지를 개발할 때, 아래와 같은 과정을 거치는데요&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;1️⃣ 패키지 작성 (개발)&lt;br&gt;
2️⃣ NPM에 배포 (&lt;code&gt;npm publish&lt;/code&gt;)&lt;br&gt;
3️⃣ 다른 프로젝트에 설치 (&lt;code&gt;npm install&lt;/code&gt;)&lt;br&gt;
4️⃣ 테스트 후, 문제가 있으면 다시 수정 후 재배포&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;하지만, 이 방식은 배포 과정이 필수라서 &lt;strong&gt;수정사항이 생길 때마다 NPM에 업로드해야 하는 번거로움&lt;/strong&gt;이 있어요.&lt;/p&gt;
&lt;p&gt;yalc의 경우에는&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;1️⃣ 로컬 패키지 개발용이성&lt;br&gt;
2️⃣ 변경사항 즉시 적용&lt;br&gt;
3️⃣ NPM보다 간편한 워크플로우&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;와 같은 차이점이 있기때문에 더 선호되는것같아요.&lt;/p&gt;
&lt;p&gt;또한, 기존의 &lt;code&gt;npm link&lt;/code&gt;처럼 &lt;a href=&quot;https://medium.com/@su_bak/%E1%84%89%E1%85%B5%E1%86%B7%E1%84%87%E1%85%A9%E1%86%AF%E1%84%85%E1%85%B5%E1%86%A8-%E1%84%85%E1%85%B5%E1%86%BC%E1%84%8F%E1%85%B3-%E1%84%89%E1%85%B5%E1%86%B7%E1%84%85%E1%85%B5%E1%86%BC%E1%84%8F%E1%85%B3-%E1%84%85%E1%85%A1%E1%86%AB-f07e4a9dc4a1&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;심볼릭 링크&lt;/a&gt; 방식으로 동작하지 않고, &lt;code&gt;~/.yalc&lt;/code&gt; 폴더에 패키지를 패키징한 후 대상 레포지토리에 실제 파일 형태로 저장하기 때문에, &lt;code&gt;node_modules&lt;/code&gt;까지 심볼릭 링크를 생성하는 &lt;code&gt;npm link&lt;/code&gt;와는 달리 의존성 충돌이나 예기치 않은 문제를 일으키지 않아요.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;즉, yalc는 패키지를 일종의 로컬 레지스트리처럼 다루기 때문에 더 안정적이고 예측 가능하게 작동해요.&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/wclr/yalc&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;yalc github&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;적용방법&quot; style=&quot;position:relative;&quot;&gt;적용방법&lt;a href=&quot;#%EC%A0%81%EC%9A%A9%EB%B0%A9%EB%B2%95&quot; aria-label=&quot;적용방법 permalink&quot; class=&quot;heading-anchor after&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;yalc는 CLI 커맨드를 통해서 손쉽게 붙일 수 있어요.&lt;/p&gt;
&lt;h3 id=&quot;설치&quot; style=&quot;position:relative;&quot;&gt;설치&lt;a href=&quot;#%EC%84%A4%EC%B9%98&quot; aria-label=&quot;설치 permalink&quot; class=&quot;heading-anchor after&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;글로벌 또는 프로젝트 내부에 설치&lt;/p&gt;
&lt;deckgo-highlight-code language=&quot;bash&quot; terminal=&quot;carbon&quot; theme=&quot;dracula&quot;  &gt;
          &lt;code slot=&quot;code&quot;&gt;$ npm install -g yalc&lt;/code&gt;
        &lt;/deckgo-highlight-code&gt;
&lt;h3 id=&quot;패키지-버전-변경&quot; style=&quot;position:relative;&quot;&gt;패키지 버전 변경&lt;a href=&quot;#%ED%8C%A8%ED%82%A4%EC%A7%80-%EB%B2%84%EC%A0%84-%EB%B3%80%EA%B2%BD&quot; aria-label=&quot;패키지 버전 변경 permalink&quot; class=&quot;heading-anchor after&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;yalc가 패키징할 패키지의 버전을 &lt;strong&gt;테스트용 버전&lt;/strong&gt;으로 변경해주세요.&lt;br&gt;
변경된 버전은 &lt;strong&gt;추후 설치할 로컬 패키지의 버전&lt;/strong&gt;이 되어요.&lt;/p&gt;
&lt;deckgo-highlight-code language=&quot;json&quot; terminal=&quot;carbon&quot; theme=&quot;dracula&quot;  &gt;
          &lt;code slot=&quot;code&quot;&gt;// package.json
{
  &amp;quot;name&amp;quot;: &amp;quot;some-package&amp;quot;,
  &amp;quot;version&amp;quot;: &amp;quot;3.1.5-yalc-test&amp;quot;,
  ...
}&lt;/code&gt;
        &lt;/deckgo-highlight-code&gt;
&lt;h3 id=&quot;패키징&quot; style=&quot;position:relative;&quot;&gt;패키징&lt;a href=&quot;#%ED%8C%A8%ED%82%A4%EC%A7%95&quot; aria-label=&quot;패키징 permalink&quot; class=&quot;heading-anchor after&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;먼저 &lt;strong&gt;패키지를 빌드&lt;/strong&gt;하고 이후 yalc를 통해 패키징 해주세요.&lt;/p&gt;
&lt;deckgo-highlight-code language=&quot;bash&quot; terminal=&quot;carbon&quot; theme=&quot;dracula&quot;  &gt;
          &lt;code slot=&quot;code&quot;&gt;$ npm run build
$ yalc publish {패키지이름} 
# e.g. yalc publish @some-package@3.1.5-yalc-test&lt;/code&gt;
        &lt;/deckgo-highlight-code&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 572px; margin: 1.45rem 0;&quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 16.458333333333332%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAADCAYAAACTWi8uAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAyklEQVR42i2M30oCQRhH920iwVonMnBHZrbaXbFtcMbEzBAqw38hdelbCBIVXfgGvuJxHLw4HH7ngy+q1TXGjSjKAeXTDcoMUKsdyccvyeKHxmyD/Nwil/++/QU3Jmvk1zbsZPEd9qlQnFRiour1A3n5yG3L+qeOtn2mPVwifI+18+5SS53HW1li1UGkNnThe6wt57KkKhIqZ5dEdZnR7b+S3/UojKPVGeLGK4r+HG3HZL0pqbe2b6TuPXC45Uea5oXm/QiVGS6uFHsCNXRIDdE/xgAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/93aa959c31acfbe5a0b7083f88f9ff0d/4558e/yalc-publish.avif 480w,
/static/93aa959c31acfbe5a0b7083f88f9ff0d/4de6c/yalc-publish.avif 572w&quot;
              sizes=&quot;(max-width: 572px) 100vw, 572px&quot;
              type=&quot;image/avif&quot;
            /&gt;&lt;source
              srcset=&quot;/static/93aa959c31acfbe5a0b7083f88f9ff0d/42669/yalc-publish.webp 480w,
/static/93aa959c31acfbe5a0b7083f88f9ff0d/6bf14/yalc-publish.webp 572w&quot;
              sizes=&quot;(max-width: 572px) 100vw, 572px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/93aa959c31acfbe5a0b7083f88f9ff0d/ab158/yalc-publish.png 480w,
/static/93aa959c31acfbe5a0b7083f88f9ff0d/6cac4/yalc-publish.png 572w&quot;
            sizes=&quot;(max-width: 572px) 100vw, 572px&quot;
            type=&quot;image/png&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/93aa959c31acfbe5a0b7083f88f9ff0d/6cac4/yalc-publish.png&quot;
            alt=&quot;yalc publish&quot;
            title=&quot;&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;h3 id=&quot;패키지-설치&quot; style=&quot;position:relative;&quot;&gt;패키지 설치&lt;a href=&quot;#%ED%8C%A8%ED%82%A4%EC%A7%80-%EC%84%A4%EC%B9%98&quot; aria-label=&quot;패키지 설치 permalink&quot; class=&quot;heading-anchor after&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;테스트할 프로젝트에서 패키지를 추가해주세요&lt;/p&gt;
&lt;deckgo-highlight-code language=&quot;bash&quot; terminal=&quot;carbon&quot; theme=&quot;dracula&quot;  &gt;
          &lt;code slot=&quot;code&quot;&gt;$ yalc add {패키지이름}
# e.g. yalc add @some-package@3.1.5-yalc-test&lt;/code&gt;
        &lt;/deckgo-highlight-code&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 1280px; margin: 1.45rem 0;&quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 6.458333333333332%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAABCAYAAADeko4lAAAACXBIWXMAABYlAAAWJQFJUiTwAAAARElEQVR42mOwdvL/7+Ed/N85qui/S2LNf5eE6v8OMeX/HWIr/hvbePzXNTD/b2Bi818fiA1NbYFsWwjf2BrKR4iD1AAAwJ8jR3OMJLwAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/d5a9e7a9997a490a39192ad9640806ec/4558e/yalc-add.avif 480w,
/static/d5a9e7a9997a490a39192ad9640806ec/57a30/yalc-add.avif 768w,
/static/d5a9e7a9997a490a39192ad9640806ec/c509e/yalc-add.avif 1024w,
/static/d5a9e7a9997a490a39192ad9640806ec/35038/yalc-add.avif 1280w,
/static/d5a9e7a9997a490a39192ad9640806ec/14132/yalc-add.avif 1646w&quot;
              sizes=&quot;(max-width: 1280px) 100vw, 1280px&quot;
              type=&quot;image/avif&quot;
            /&gt;&lt;source
              srcset=&quot;/static/d5a9e7a9997a490a39192ad9640806ec/42669/yalc-add.webp 480w,
/static/d5a9e7a9997a490a39192ad9640806ec/050c0/yalc-add.webp 768w,
/static/d5a9e7a9997a490a39192ad9640806ec/44907/yalc-add.webp 1024w,
/static/d5a9e7a9997a490a39192ad9640806ec/e2782/yalc-add.webp 1280w,
/static/d5a9e7a9997a490a39192ad9640806ec/21c99/yalc-add.webp 1646w&quot;
              sizes=&quot;(max-width: 1280px) 100vw, 1280px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/d5a9e7a9997a490a39192ad9640806ec/ab158/yalc-add.png 480w,
/static/d5a9e7a9997a490a39192ad9640806ec/2d1ba/yalc-add.png 768w,
/static/d5a9e7a9997a490a39192ad9640806ec/f1720/yalc-add.png 1024w,
/static/d5a9e7a9997a490a39192ad9640806ec/f3baa/yalc-add.png 1280w,
/static/d5a9e7a9997a490a39192ad9640806ec/7f16d/yalc-add.png 1646w&quot;
            sizes=&quot;(max-width: 1280px) 100vw, 1280px&quot;
            type=&quot;image/png&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/d5a9e7a9997a490a39192ad9640806ec/f3baa/yalc-add.png&quot;
            alt=&quot;yalc add&quot;
            title=&quot;&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
    &lt;/span&gt;
&lt;figure class=&quot;gatsby-resp-image-figure&quot; style=&quot;margin: 1.45rem 0;&quot;&gt;
    &lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 624px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 41.25%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAICAYAAAD5nd/tAAAACXBIWXMAABYlAAAWJQFJUiTwAAABT0lEQVR42o2SWU+DQBSF+SMaC22hlB2mMOybdEFj00XbxLgkPvr/X4+XeeiT0T6cOXOH4ePkXiTLT1C0j0iKFUryrN5gMnMx1hwoqk1757IffHjmsgwsrhEmDbxFASdIwfMlLC+BZNISl2vU6704rLonMF6DZx1iqhlvEKX3SMoVwrSF4cZwWA4vLAlcwB2AVA8+hBPAkF5o+j2KpseSfPlwwPH8if3LO/rtCYfzB06vX9g9v4kUczv6VYbDIcnTOW7vNGhMgxX6YFFF6VpK1dCHGvhhjltZxc1oKnw00f+UpKgEHOuIVB2O6YIlNUEyIUU1hYaL8j+gC3BIKM/m4K4F1wqwyBrqR4qA5wQzoGjmVaALcKSY8FIPx+8NbD+lyVXkMQELxEVHdQ15atDl+VWSdJvDCjh4myKterQ07Wa9E79S1W3FNPWh6dTwa/QDOlP/EEmr8HoAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/3e200ef9a8f2ae525c7575dd97603ff0/4558e/yalc-add-success.avif 480w,
/static/3e200ef9a8f2ae525c7575dd97603ff0/48022/yalc-add-success.avif 624w&quot;
              sizes=&quot;(max-width: 624px) 100vw, 624px&quot;
              type=&quot;image/avif&quot;
            /&gt;&lt;source
              srcset=&quot;/static/3e200ef9a8f2ae525c7575dd97603ff0/42669/yalc-add-success.webp 480w,
/static/3e200ef9a8f2ae525c7575dd97603ff0/04631/yalc-add-success.webp 624w&quot;
              sizes=&quot;(max-width: 624px) 100vw, 624px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/3e200ef9a8f2ae525c7575dd97603ff0/ab158/yalc-add-success.png 480w,
/static/3e200ef9a8f2ae525c7575dd97603ff0/6ee7c/yalc-add-success.png 624w&quot;
            sizes=&quot;(max-width: 624px) 100vw, 624px&quot;
            type=&quot;image/png&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/3e200ef9a8f2ae525c7575dd97603ff0/6ee7c/yalc-add-success.png&quot;
            alt=&quot;잘 설치된 모습&quot;
            title=&quot;&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
    &lt;/span&gt;
    &lt;figcaption class=&quot;gatsby-resp-image-figcaption&quot;&gt;&lt;p&gt;잘 설치된 모습&lt;/p&gt;&lt;/figcaption&gt;
  &lt;/figure&gt;&lt;/p&gt;
&lt;h3 id=&quot;패키지-업데이트&quot; style=&quot;position:relative;&quot;&gt;패키지 업데이트&lt;a href=&quot;#%ED%8C%A8%ED%82%A4%EC%A7%80-%EC%97%85%EB%8D%B0%EC%9D%B4%ED%8A%B8&quot; aria-label=&quot;패키지 업데이트 permalink&quot; class=&quot;heading-anchor after&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;패키지를 수정하고 다시 배포하려면 아래처럼 해주시면 돼요&lt;br&gt;
&lt;code&gt;push&lt;/code&gt;를 활용하면 &lt;code&gt;yalc update&lt;/code&gt; 하고 &lt;code&gt;yalc publish&lt;/code&gt;를 한번에 트리거 할 수 있어요.&lt;/p&gt;
&lt;deckgo-highlight-code language=&quot;bash&quot; terminal=&quot;carbon&quot; theme=&quot;dracula&quot;  &gt;
          &lt;code slot=&quot;code&quot;&gt;$ yalc push {패키지이름}
# e.g. yalc push @some-package@3.1.5-yalc-test&lt;/code&gt;
        &lt;/deckgo-highlight-code&gt;
&lt;h3 id=&quot;패키지-제거&quot; style=&quot;position:relative;&quot;&gt;패키지 제거&lt;a href=&quot;#%ED%8C%A8%ED%82%A4%EC%A7%80-%EC%A0%9C%EA%B1%B0&quot; aria-label=&quot;패키지 제거 permalink&quot; class=&quot;heading-anchor after&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;테스트가 끝났다면 패키지를 제거해야 해요.&lt;br&gt;
제거하지 않으면 추후 실제 배포용 패키지와 충돌이 있을 수 있어요!&lt;/p&gt;
&lt;deckgo-highlight-code language=&quot;bash&quot; terminal=&quot;carbon&quot; theme=&quot;dracula&quot;  &gt;
          &lt;code slot=&quot;code&quot;&gt;$ yalc remove {패키지이름}
# e.g. yalc remove @some-package@3.1.5-yalc-test&lt;/code&gt;
        &lt;/deckgo-highlight-code&gt;
&lt;h2 id=&quot;마무리&quot; style=&quot;position:relative;&quot;&gt;마무리&lt;a href=&quot;#%EB%A7%88%EB%AC%B4%EB%A6%AC&quot; aria-label=&quot;마무리 permalink&quot; class=&quot;heading-anchor after&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;yalc&lt;/code&gt;를 활용해서 성공적으로 서비스에 테스트하고 적용할 수 있었어요 ☺️&lt;/p&gt;
&lt;p&gt;기존의 npm 패키지 테스트 방식이 비효율적이라고 느껴 더 나은 방법을 찾던 중 알게 된 도구인데, Design System뿐만 아니라 다양한 패키지에도 활용할 수 있어 공유 가치가 높다고 생각했어요. 이 도구를 통해 사내 Frontend 챕터에 공유할 수 있었고, DS 온보딩 문서에도 기여할 수 있어 의미 있는 경험이었어요.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;gatsby-resp-image-figure&quot; style=&quot;margin: 1.45rem 0;&quot;&gt;
    &lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 1280px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 17.916666666666668%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAECAYAAACOXx+WAAAACXBIWXMAABYlAAAWJQFJUiTwAAAA1UlEQVR42lWNS1PCMBhFu1eEPtOmSR8BpBCg0I6COi5c+m/8/5tjGnDh4sy5c2/mS7BcWnb9Cxt7xp5e6cd3Lh9fzm9Y1w+XT7aHkW4/0DlP3bQdhitH57JqEbkkySuqlSX4vv5Q1ivH2qPMHt126Maga4NqnsmVISkq0qImkw2ibO5uCVPJPBI8xQVRpgiq1rqHza0QmkUiCd3gSRWx+znKNLMw53Eh7mTeD/PU52mbhYJ5lruDmzN6PSJNT2FOROWWeELtbtnZZ9n9Z9qKllhof+yPXxdBbNJfC8MtAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/ffd66d0289219cf89458177fa197f467/4558e/yalc-to-ds-doc.avif 480w,
/static/ffd66d0289219cf89458177fa197f467/57a30/yalc-to-ds-doc.avif 768w,
/static/ffd66d0289219cf89458177fa197f467/c509e/yalc-to-ds-doc.avif 1024w,
/static/ffd66d0289219cf89458177fa197f467/35038/yalc-to-ds-doc.avif 1280w,
/static/ffd66d0289219cf89458177fa197f467/b3049/yalc-to-ds-doc.avif 2492w&quot;
              sizes=&quot;(max-width: 1280px) 100vw, 1280px&quot;
              type=&quot;image/avif&quot;
            /&gt;&lt;source
              srcset=&quot;/static/ffd66d0289219cf89458177fa197f467/42669/yalc-to-ds-doc.webp 480w,
/static/ffd66d0289219cf89458177fa197f467/050c0/yalc-to-ds-doc.webp 768w,
/static/ffd66d0289219cf89458177fa197f467/44907/yalc-to-ds-doc.webp 1024w,
/static/ffd66d0289219cf89458177fa197f467/e2782/yalc-to-ds-doc.webp 1280w,
/static/ffd66d0289219cf89458177fa197f467/fa5d2/yalc-to-ds-doc.webp 2492w&quot;
              sizes=&quot;(max-width: 1280px) 100vw, 1280px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/ffd66d0289219cf89458177fa197f467/ab158/yalc-to-ds-doc.png 480w,
/static/ffd66d0289219cf89458177fa197f467/2d1ba/yalc-to-ds-doc.png 768w,
/static/ffd66d0289219cf89458177fa197f467/f1720/yalc-to-ds-doc.png 1024w,
/static/ffd66d0289219cf89458177fa197f467/f3baa/yalc-to-ds-doc.png 1280w,
/static/ffd66d0289219cf89458177fa197f467/51519/yalc-to-ds-doc.png 2492w&quot;
            sizes=&quot;(max-width: 1280px) 100vw, 1280px&quot;
            type=&quot;image/png&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/ffd66d0289219cf89458177fa197f467/f3baa/yalc-to-ds-doc.png&quot;
            alt=&quot;온보딩 문서 기여 성공&quot;
            title=&quot;&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
    &lt;/span&gt;
    &lt;figcaption class=&quot;gatsby-resp-image-figcaption&quot;&gt;&lt;p&gt;온보딩 문서 기여 성공&lt;/p&gt;&lt;/figcaption&gt;
  &lt;/figure&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[구글 번역기 이슈 해결 해보기]]></title><description><![CDATA[배경 사내 오류 지원 채널을 통해 “구글 번역기를 사용하면 서비스 이용 중 화면이 하얗게 사라지는(화이트아웃) 현상” 이 발생한다는 제보를 받았어요.
문제가 발생한 상황은 Chrome…]]></description><link>https://clzzi.dev/google-translator-issue/</link><guid isPermaLink="false">https://clzzi.dev/google-translator-issue/</guid><pubDate>Thu, 18 Jan 2024 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;배경&quot; style=&quot;position:relative;&quot;&gt;배경&lt;a href=&quot;#%EB%B0%B0%EA%B2%BD&quot; aria-label=&quot;배경 permalink&quot; class=&quot;heading-anchor after&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;사내 오류 지원 채널을 통해 &lt;strong&gt;“구글 번역기를 사용하면 서비스 이용 중 화면이 하얗게 사라지는(화이트아웃) 현상”&lt;/strong&gt; 이 발생한다는 제보를 받았어요.
문제가 발생한 상황은 Chrome 브라우저에서 구글 번역기를만 사용하고 있는 유저가, 특정 조건에서 화면 전체가 화이트아웃 되는 현상이었어요.&lt;br&gt;
처음엔 아무 단서가 없어 당황스러웠지만, 관련 리서치를 통해 재현 조건과 원인을 파악할 수 있었어요.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/f615b8ec9d6241cb325fbb9dda0ee679/google-translator-issue.gif&quot; alt=&quot;보안상의 이유로 영상은 샘플로 대체&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;재현조건&quot; style=&quot;position:relative;&quot;&gt;재현조건&lt;a href=&quot;#%EC%9E%AC%ED%98%84%EC%A1%B0%EA%B1%B4&quot; aria-label=&quot;재현조건 permalink&quot; class=&quot;heading-anchor after&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;문제를 분석하며 발견한 재현 조건은 아래와 같아요:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;부모-자식 관계&lt;/strong&gt;의 컴포넌트 구조&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2개 이상의 자식 노드&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Hello World&lt;/code&gt;처럼 &lt;strong&gt;텍스트만 존재하는 노드가 조건에 따라 제거되는 경우&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;deckgo-highlight-code language=&quot;jsx&quot; terminal=&quot;carbon&quot; theme=&quot;dracula&quot;  &gt;
          &lt;code slot=&quot;code&quot;&gt;const [someCondition, setSomeCondition] = useState(true);
&amp;lt;div id=&amp;quot;parent&amp;quot;&amp;gt;
  {someCondition &amp;amp;&amp;amp; &amp;#39;Hello World&amp;#39;}
  &amp;lt;text onClick={() =&amp;gt; setSomeCondition(false)}&amp;gt;Hello&amp;lt;/text&amp;gt;
&amp;lt;/div&amp;gt;&lt;/code&gt;
        &lt;/deckgo-highlight-code&gt;
&lt;p&gt;위와 같은 상황에서 클릭을 통해 &lt;code&gt;someCondition&lt;/code&gt;이 &lt;code&gt;false&lt;/code&gt;가 바뀐다면 어떻게 될까요?&lt;br&gt;
아래 사진과 같이 에러(화이트아웃)가 나오게 돼요.
&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 1280px; margin: 1.45rem 0;&quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 44.583333333333336%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAJCAYAAAAywQxIAAAACXBIWXMAABYlAAAWJQFJUiTwAAABSUlEQVR42o2SWU/CQBRG+TlUXpR9q0gBoStLK9CWypqCEgSENx9c4u/2OELiK53ky828nHxn7sSIcI6HV8r5HPVahet0Aike50o6J5EQd0kiLyvIik4sCvDjeGCktljYDn3NwG4aOCLdWhOjWKSVy2HeVjHlu2jA9+2WlaFxDAKevTnr2Y6n8Quhv8QT4E4ui5VOYmXS0YCf+z3DikzQUvFaJiO9I6aFU21giXZ6OoUpoO1CIaLyfoer1AkMG1/r4qsd+kqDdjYjWqVOzc4zdQn4c1bebZk1mywdl/lgzny4YPYwwRVtrUzmHxZZ+etwwKsqjM3uqWWgmYx1C69Wwy4VMLPZk/pfIgG/xbd5Mg32rk/oiAynhIOJ2LovoA16xRK9Upnu5Tc8K79tNjze11n3+0wFZOqtmLghE6Hv1FU0sRQ1eYOaSvILtib/siPLj3QAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/234a1f00bd2eaf0a98630af9831bf458/4558e/white-out.avif 480w,
/static/234a1f00bd2eaf0a98630af9831bf458/57a30/white-out.avif 768w,
/static/234a1f00bd2eaf0a98630af9831bf458/c509e/white-out.avif 1024w,
/static/234a1f00bd2eaf0a98630af9831bf458/35038/white-out.avif 1280w,
/static/234a1f00bd2eaf0a98630af9831bf458/6fc41/white-out.avif 3204w&quot;
              sizes=&quot;(max-width: 1280px) 100vw, 1280px&quot;
              type=&quot;image/avif&quot;
            /&gt;&lt;source
              srcset=&quot;/static/234a1f00bd2eaf0a98630af9831bf458/42669/white-out.webp 480w,
/static/234a1f00bd2eaf0a98630af9831bf458/050c0/white-out.webp 768w,
/static/234a1f00bd2eaf0a98630af9831bf458/44907/white-out.webp 1024w,
/static/234a1f00bd2eaf0a98630af9831bf458/e2782/white-out.webp 1280w,
/static/234a1f00bd2eaf0a98630af9831bf458/de89e/white-out.webp 3204w&quot;
              sizes=&quot;(max-width: 1280px) 100vw, 1280px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/234a1f00bd2eaf0a98630af9831bf458/ab158/white-out.png 480w,
/static/234a1f00bd2eaf0a98630af9831bf458/2d1ba/white-out.png 768w,
/static/234a1f00bd2eaf0a98630af9831bf458/f1720/white-out.png 1024w,
/static/234a1f00bd2eaf0a98630af9831bf458/f3baa/white-out.png 1280w,
/static/234a1f00bd2eaf0a98630af9831bf458/9926a/white-out.png 3204w&quot;
            sizes=&quot;(max-width: 1280px) 100vw, 1280px&quot;
            type=&quot;image/png&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/234a1f00bd2eaf0a98630af9831bf458/f3baa/white-out.png&quot;
            alt=&quot;white out&quot;
            title=&quot;&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;h2 id=&quot;구글번역기-동작방식&quot; style=&quot;position:relative;&quot;&gt;구글번역기 동작방식&lt;a href=&quot;#%EA%B5%AC%EA%B8%80%EB%B2%88%EC%97%AD%EA%B8%B0-%EB%8F%99%EC%9E%91%EB%B0%A9%EC%8B%9D&quot; aria-label=&quot;구글번역기 동작방식 permalink&quot; class=&quot;heading-anchor after&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;저는 해당 현상이 리액트보단 구글 번역기의 번역 방식과 더 관련 있다고 판단했어요.&lt;/p&gt;
&lt;p&gt;구글 번역기는 페이지 내 텍스트를 감지하고 번역하는 과정에서 다음과 같은 방식을 사용해요:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;태그로 감싼 텍스트&lt;/strong&gt;는 해당 태그 내부의 &lt;strong&gt;텍스트만 치환&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;태그로 감싸지 않은 순수 텍스트&lt;/strong&gt;는 &lt;code&gt;&amp;#x3C;font&gt;&lt;/code&gt; 태그로 감싼 후 &lt;strong&gt;번역된 텍스트로 직접 치환&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;deckgo-highlight-code language=&quot;jsx&quot; terminal=&quot;carbon&quot; theme=&quot;dracula&quot;  &gt;
          &lt;code slot=&quot;code&quot;&gt;// AS IS
&amp;lt;div&amp;gt;
  &amp;#39;Welcome&amp;#39;
  &amp;lt;text&amp;gt;Something&amp;lt;/text&amp;gt;
&amp;lt;/div&amp;gt;

// TO BE
&amp;lt;div&amp;gt;
	&amp;lt;font&amp;gt;&amp;#39;안녕하세요&amp;#39;&amp;lt;/font&amp;gt;
  &amp;lt;text&amp;gt;무언가&amp;lt;/text&amp;gt;
&amp;lt;/div&amp;gt;&lt;/code&gt;
        &lt;/deckgo-highlight-code&gt;
&lt;p&gt;이때 실제 번역 과정에서는 &lt;code&gt;removeChild&lt;/code&gt;, &lt;code&gt;insertBefore와&lt;/code&gt; 같은 &lt;code&gt;DOM API&lt;/code&gt;를 활용하여 기존 텍스트를 제거하고 새 엘리먼트를 삽입하게 돼요.&lt;/p&gt;
&lt;deckgo-highlight-code language=&quot;javascript&quot; terminal=&quot;carbon&quot; theme=&quot;dracula&quot;  &gt;
          &lt;code slot=&quot;code&quot;&gt;const children = document.getElementById(&amp;quot;parent&amp;quot;).childNodes;
	for (const myEl of children) {
		if (myEl.nodeType === Node.TEXT_NODE) {
			const fontEl = document.createElement(&amp;quot;font&amp;quot;);
			fontEl.textContent = myEl.data;
            myEl.parentElement.insertBefore(fontEl, myEl);
            myEl.parentElement.removeChild(myEl);
		}
	}&lt;/code&gt;
        &lt;/deckgo-highlight-code&gt;
&lt;h3 id=&quot;원인&quot; style=&quot;position:relative;&quot;&gt;원인&lt;a href=&quot;#%EC%9B%90%EC%9D%B8&quot; aria-label=&quot;원인 permalink&quot; class=&quot;heading-anchor after&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;해당 이슈에 대해서 조금 더 리서치를 진행해보았고 한 &lt;a href=&quot;https://github.com/facebook/react/issues/11538&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Github Issue&lt;/a&gt;를 찾았어요.
알고보니 되게 오래된 이슈였고, 논의가 최근까지도 활발하게 진행되고 있었어요. 하나하나 코멘트들을 읽어보니 원인에 대해서 알겠더라구요.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;The problem is that Google Translate replaces text nodes with &lt;code&gt;&amp;#x3C;font&gt;&lt;/code&gt; tags containing translations while React keeps references to the text nodes that are no longer in the DOM tree.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;구글 번역기는 번역된 텍스트를 &lt;code&gt;&amp;#x3C;font&gt;&lt;/code&gt; 태그로 감싼 후 대체하지만, React에선 &lt;strong&gt;더 이상 DOM tree에 없는 텍스트노드에 대한 참조를 계속 유지&lt;/strong&gt;하고 있기때문이에요.&lt;br&gt;
조건에 의해서 텍스트노드가 갑자기 사라지게될때 이미 DOM tree에서 없어진 텍스트 노드를 리액트에선 계속 참조하고 있기 때문에, &lt;strong&gt;존재하지 않는 텍스트노드에 대해서 계속 메서드(removeChild)를 실행하려고 해서&lt;/strong&gt; 에러가 발생하게 되는것이에요.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;개인적인 생각으로는,
React에서 reconcile 과정 이후 변경사항 반영 &amp;#x26; 렌더링 해주는 과정에서, 외부요인에 의해 실제론 DOM이 바뀌었으나 리액트에서 참조하고있는 메모리상의 DOM(VDOM)에서는 바뀐것을 인지하지 못해서 에러가 나는것같다고 생각했어요.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&quot;근본원인-react-vs-chromium&quot; style=&quot;position:relative;&quot;&gt;근본원인: React vs Chromium&lt;a href=&quot;#%EA%B7%BC%EB%B3%B8%EC%9B%90%EC%9D%B8-react-vs-chromium&quot; aria-label=&quot;근본원인 react vs chromium permalink&quot; class=&quot;heading-anchor after&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;논의가 진행중이던 &lt;a href=&quot;https://github.com/facebook/react/issues/11538&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Github Issue&lt;/a&gt;를 조금 더 살펴보니, React 개발자들은 해당 이슈에 대해서 구글 번역기의 동작이 문제인것이라고 판단하고 &lt;code&gt;chromium&lt;/code&gt;측에 다시 이슈레이징을 한 상태였더라구요.&lt;/p&gt;
&lt;p&gt;그러나 &lt;code&gt;chromium&lt;/code&gt; 개발자들은 장문으로 반박하였어요.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 1280px; margin: 1.45rem 0;&quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 88.54166666666666%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAASCAYAAABb0P4QAAAACXBIWXMAABYlAAAWJQFJUiTwAAACE0lEQVR42m1UibKiQAzk/z9REVBuOeU+xLx0IOyUq1VtkiGEHD2xsqKiIs+pKIoTZVkKVIfMsoxy9gOezyfVdU1t29K2bfT5fIj/aH1vZOVlTXVVnS+aQVRW/Pz1etG6roJlWSTQ9++9fciK04zSNKEkSSiOY0EURXyWioQNHYH7vqeu6yQzALpCzrqeLPfuk/94kOO69GDpeZ7gfr+Ty2eO45zydrudNnx83z8QiJ08M7KSLJceoi/aH2SkUoEKAOhN00hWyNjMehjnPUPXdSQjfAVfD4KAwjA8M4CtElVANzPEGTJPkaEOpToGAznPszQecpomkeM4CmD/Bj9b1j1gWf6bJOQ3XVAiXkJA/civD8zLm6xHEFHE5aE/mCrKgkTJWnp4PFcmoI+QeiZgO8vLvYee5579wGCQJYhrkh3nyBbBVNcKdj2nfpzISjMu7yAvHBEIpWv5sFH+MAxCau2p9ljA+gq8mdhBtBM44pS1PCV4bJzBxyxZoRchZjRtR5YfxtwrpsRBE+0hdDhDqq19NX1AN5QsTHk1ZDX9SAOTEyX1h/yGkhcw/X7e5ZKjtm1z3k9QxLyrsNFPSL0h6Ct0BIafbBv+SQ/rhq/N8ZIZUANoQA1qrizFfxk27KzTNaesNoCJ62R1hek627HQOPFdth2PbrZN1+uVLpcL2azrVrGPcwADUR5icUDXhXIukyynP++RUiChVPHjAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/7a96a56b4a0f6f2e2313ecd8c96303fc/4558e/chromium-1.avif 480w,
/static/7a96a56b4a0f6f2e2313ecd8c96303fc/57a30/chromium-1.avif 768w,
/static/7a96a56b4a0f6f2e2313ecd8c96303fc/c509e/chromium-1.avif 1024w,
/static/7a96a56b4a0f6f2e2313ecd8c96303fc/35038/chromium-1.avif 1280w,
/static/7a96a56b4a0f6f2e2313ecd8c96303fc/d706a/chromium-1.avif 1964w&quot;
              sizes=&quot;(max-width: 1280px) 100vw, 1280px&quot;
              type=&quot;image/avif&quot;
            /&gt;&lt;source
              srcset=&quot;/static/7a96a56b4a0f6f2e2313ecd8c96303fc/42669/chromium-1.webp 480w,
/static/7a96a56b4a0f6f2e2313ecd8c96303fc/050c0/chromium-1.webp 768w,
/static/7a96a56b4a0f6f2e2313ecd8c96303fc/44907/chromium-1.webp 1024w,
/static/7a96a56b4a0f6f2e2313ecd8c96303fc/e2782/chromium-1.webp 1280w,
/static/7a96a56b4a0f6f2e2313ecd8c96303fc/20255/chromium-1.webp 1964w&quot;
              sizes=&quot;(max-width: 1280px) 100vw, 1280px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/7a96a56b4a0f6f2e2313ecd8c96303fc/ab158/chromium-1.png 480w,
/static/7a96a56b4a0f6f2e2313ecd8c96303fc/2d1ba/chromium-1.png 768w,
/static/7a96a56b4a0f6f2e2313ecd8c96303fc/f1720/chromium-1.png 1024w,
/static/7a96a56b4a0f6f2e2313ecd8c96303fc/f3baa/chromium-1.png 1280w,
/static/7a96a56b4a0f6f2e2313ecd8c96303fc/d9ada/chromium-1.png 1964w&quot;
            sizes=&quot;(max-width: 1280px) 100vw, 1280px&quot;
            type=&quot;image/png&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/7a96a56b4a0f6f2e2313ecd8c96303fc/f3baa/chromium-1.png&quot;
            alt=&quot;chromium 1&quot;
            title=&quot;&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
    &lt;/span&gt;
&lt;br/&gt;
&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 1280px; margin: 1.45rem 0;&quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 90.41666666666666%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAASCAYAAABb0P4QAAAACXBIWXMAABYlAAAWJQFJUiTwAAAB8ElEQVR42q1Ua5ObMAzk///E3pFAcDDvhwkBDsjWayJK0g/XdsrMjiwDsrRa2dNZgSTRyLIMaZradYKqqrAsy455nl/8d8zzAjwW6GaEF6oYYRjicrm4YIRSCtfrFVEU7ZbvuU9Ln6AviFWEH6qA5wcRzuez29Rau4C32w3jOOJ+vzs7DMML+r5/8e8W8zRCtxO8cV5h88Xj8cC6rs7+7SO/pGaGV9TGZtShbVuXGdF1m8/TeQg5fMeR343DFYn5gqd0akuNEcexK5mWvIlflqVDURT7Os9z5xPbukRTFYiKHt41yZA8uWOXpdMEg/KHpmlQ17WzBLOnpRq4X9v1zTQ4xTUD5sieQUQ6zILEH8unJbhnjHF7Yhn8bmk76QZeEFEWFwRB4EqlLKRkkYT4R8gek9DaJpNqfKhyK5kZ8gPJkBAJCa8CkZe8d5nbrKeh3zgMlYZ6ClXEy+ACBiEFR+6ET+FwGEbMX1aHjdVhkleo2D37kl3jR8Sxo454C9mXQAzKDBtKzrQIsw5eFKd7U97L4gFsjjRImiR2mian02XZhiNpnQ43DnmafMgsOHZ/OjUvk6KzEp+fH66Mf31+Gz3Kxpju/wSM08KNnpR7FO8vjraZ5frbgOzy6eRbnN29KHej7/v7ZcsD2BheZd8F/AncY2CD46aiwAAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/586ca471267221b884f91ed9b67ff565/4558e/chromium-2.avif 480w,
/static/586ca471267221b884f91ed9b67ff565/57a30/chromium-2.avif 768w,
/static/586ca471267221b884f91ed9b67ff565/c509e/chromium-2.avif 1024w,
/static/586ca471267221b884f91ed9b67ff565/35038/chromium-2.avif 1280w,
/static/586ca471267221b884f91ed9b67ff565/0361e/chromium-2.avif 1958w&quot;
              sizes=&quot;(max-width: 1280px) 100vw, 1280px&quot;
              type=&quot;image/avif&quot;
            /&gt;&lt;source
              srcset=&quot;/static/586ca471267221b884f91ed9b67ff565/42669/chromium-2.webp 480w,
/static/586ca471267221b884f91ed9b67ff565/050c0/chromium-2.webp 768w,
/static/586ca471267221b884f91ed9b67ff565/44907/chromium-2.webp 1024w,
/static/586ca471267221b884f91ed9b67ff565/e2782/chromium-2.webp 1280w,
/static/586ca471267221b884f91ed9b67ff565/d272d/chromium-2.webp 1958w&quot;
              sizes=&quot;(max-width: 1280px) 100vw, 1280px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/586ca471267221b884f91ed9b67ff565/ab158/chromium-2.png 480w,
/static/586ca471267221b884f91ed9b67ff565/2d1ba/chromium-2.png 768w,
/static/586ca471267221b884f91ed9b67ff565/f1720/chromium-2.png 1024w,
/static/586ca471267221b884f91ed9b67ff565/f3baa/chromium-2.png 1280w,
/static/586ca471267221b884f91ed9b67ff565/a42f1/chromium-2.png 1958w&quot;
            sizes=&quot;(max-width: 1280px) 100vw, 1280px&quot;
            type=&quot;image/png&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/586ca471267221b884f91ed9b67ff565/f3baa/chromium-2.png&quot;
            alt=&quot;chromium 2&quot;
            title=&quot;&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;요약&lt;/strong&gt;:&lt;br&gt;
React와 같은 Virtual DOM을 사용하는 라이브러리들은 DOM 노드 참조에 의존하기 때문에 구글번역기 같은 외부에서 DOM을 조작하는 라이브러리와 공존하게 되는경우 에러가 날 수 밖에 없다.&lt;br&gt;
대부분의 VDOM 라이브러리는 자기자신 이외에는 DOM을 수정하는 매개체가 없다는 가정 하에 작성되는 경우가 많다.
외부에서 트리거된 DOM변경작업 이후에도 DOM을 최신 상태로 유지하도록 사전에 모니터링하지 않으면 이 문제는 더욱 악화될것이다.&lt;br&gt;
문제는 자바스크립트 라이브러리가 DOM이 본질적으로 설계상 변경 가능하다는 사실을 고려하지 않고, VDOM 라이브러리들이 DOM에 대한 완전하고 독점적인 제어권을 가지고 있다고 가정할 때 발생한다.&lt;br&gt;
이것은 구글번역기만의 문제가 아닌 매우 일반적인 상황에서도 나타날 수 있으며, 구글 번역기는 한 브라우저의 DOM 수정 기능 중 하나일 뿐 근본적인 문제의 증상을 더욱 명확하게 만들고 있는꼴이다.&lt;/p&gt;
&lt;p&gt;chromium측에서는 위와같은 입장을 밝히면서 수정에 대해선 회의적인 입장이였어요. 저도 해당 글을 읽어보면서 공감이 잘 되었기때문에 근본적인 해결방법은 없겠다고 생각했어요.&lt;/p&gt;
&lt;h2 id=&quot;해결방법&quot; style=&quot;position:relative;&quot;&gt;해결방법&lt;a href=&quot;#%ED%95%B4%EA%B2%B0%EB%B0%A9%EB%B2%95&quot; aria-label=&quot;해결방법 permalink&quot; class=&quot;heading-anchor after&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;프로덕션 환경에서 실사용자에게 영향을 주는 문제이기에, 임시적이더라도 대응이 필요했어요.&lt;br&gt;
저는 아래 두 가지 방법을 생각했어요:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1. Eslint 커스텀 룰을 통한 사전 차단&lt;/strong&gt;
태그로 감싸지지 않은 순수 텍스트가 존재하지 않도록 강제하는 방법이에요.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;관련 오픈소스: &lt;a href=&quot;https://github.com/sayari-analytics/eslint-plugin-sayari/blob/main/lib/rules/no-unwrapped-jsx-text.js&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;eslint-plugin-sayari&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;효과적이고 앞으로 발생할 문제를 사전차단 가능하다고 생각했지만 적용 시 &lt;strong&gt;1300곳&lt;/strong&gt; 이상 수정이 필요해 현실적으로 어려웠어요 🥲&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 468px; margin: 1.45rem 0;&quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 23.076923076923077%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAFCAYAAABFA8wzAAAACXBIWXMAABYlAAAWJQFJUiTwAAAA8klEQVR42m1Q207CQBTsx4gI7bbF7W1bqFyq8gBeE2OIiAbj///BOLPFNx4m58ycOZOzG4yiDMbkiE2BsckQxwV5gfCkJ+Qhq7SIGPk+P2l9HRNX9AuBSx3eqwV+mg6bvMXeLfHb3OKpuMEDufptPsMz+SPRTmrWFh/0aU/zzk5xEdo+UM2GC4d6hTsOZFxnU7yVc7wwYMvQHbVdtcTBrTz/pld+Bb7Ss85m2JMfeVRwz5AvEg0UYpOSdeEXO9vgWHf4ZGCRVLiOS/8FKfFf9eyIUD8hAktTxhAJ6oc8O9Wi6ZdcWvkw/dOAr9H8khiegfQ/11WmT4jY5iYAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/a49a20e6c1497b973c6b2bc42c615718/c3384/eslint-error.avif 468w&quot;
              sizes=&quot;(max-width: 468px) 100vw, 468px&quot;
              type=&quot;image/avif&quot;
            /&gt;&lt;source
              srcset=&quot;/static/a49a20e6c1497b973c6b2bc42c615718/ac16e/eslint-error.webp 468w&quot;
              sizes=&quot;(max-width: 468px) 100vw, 468px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/a49a20e6c1497b973c6b2bc42c615718/cd23f/eslint-error.png 468w&quot;
            sizes=&quot;(max-width: 468px) 100vw, 468px&quot;
            type=&quot;image/png&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/a49a20e6c1497b973c6b2bc42c615718/cd23f/eslint-error.png&quot;
            alt=&quot;eslint error&quot;
            title=&quot;&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2. Monkey Patching을 통한 방어코드 적용&lt;/strong&gt;
문제가 발생하는 &lt;code&gt;removeChild&lt;/code&gt;, &lt;code&gt;insertBefore&lt;/code&gt; 메서드 자체를 &lt;code&gt;Monkey Patch&lt;/code&gt; 방식으로 오버라이드 해서, 안전하게 동작하도록 만드는 방법이에요.&lt;/p&gt;
&lt;deckgo-highlight-code language=&quot;javascript&quot; terminal=&quot;carbon&quot; theme=&quot;dracula&quot;  &gt;
          &lt;code slot=&quot;code&quot;&gt;export const monkeyPatchGoogleTranslatorMethods = () =&amp;gt; {
    if (typeof Node === &amp;#39;function&amp;#39; &amp;amp;&amp;amp; Node.prototype) {
      const { removeChild: originalRemoveChild } = Node.prototype;
      Node.prototype.removeChild = function (child) {
        if (child.parentNode !== this) {
          if (console) { logError(child, this) }
          return child;
        }
        return originalRemoveChild.apply(this, arguments);
      };

      const { insertBefore: originalInsertBefore } = Node.prototype;
      Node.prototype.insertBefore = function (newNode, referenceNode) {
        if (referenceNode &amp;amp;&amp;amp; referenceNode.parentNode !== this) {
          if (console) { logError(referenceNode, this) }
          return newNode;
        }
        return originalInsertBefore.apply(this, arguments);
      };
    }
  };&lt;/code&gt;
        &lt;/deckgo-highlight-code&gt;
&lt;p&gt;다만 Monkey Patching 특성상 서비스 환경에선 위험성이 존재했기 때문에 서비스 환경이 아닌 개발 환경에서만 활성화하여 점진적으로 문제를 개선할 수 있도록 했어요.&lt;/p&gt;
&lt;h2 id=&quot;마무리&quot; style=&quot;position:relative;&quot;&gt;마무리&lt;a href=&quot;#%EB%A7%88%EB%AC%B4%EB%A6%AC&quot; aria-label=&quot;마무리 permalink&quot; class=&quot;heading-anchor after&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;이번 이슈는 단순 버그 수정보다는 얻은게 많았어요.
정확한 재현 조건과 외부 라이브러리 간 충돌 구조를 분석하고, React와 Chromium 개발자들의 기술적 논의와 관점 차이를 직접 확인해보며 많은 것을 배울 수 있었어요.
근본적인 해결은 어려웠지만, 현실적인 대안을 마련하고 서비스 품질을 지킬 수 있었던 점에서 좋은 경험이였던것 같아요 ☺️&lt;/p&gt;
&lt;h2 id=&quot;참고&quot; style=&quot;position:relative;&quot;&gt;참고&lt;a href=&quot;#%EC%B0%B8%EA%B3%A0&quot; aria-label=&quot;참고 permalink&quot; class=&quot;heading-anchor after&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/facebook/react/issues/11538&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Github Issue&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://bugs.chromium.org/p/chromium/issues/detail?id=872770&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Chromium Issue&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/reactjs/react.dev/pull/1148/files#diff-fe6b5f1430d78777f1dcebf229294971ed452eb6f104e8d526df0f082fb7a684&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Monkey Patching&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[Axios Interceptor에서 CustomHook을 사용하는 방법]]></title><description><![CDATA[이번 포스트에서는 제가 프로젝트를 진행하면서 Axios Interceptor에서 React Hook 및 Custom Hook을 사용하기 위해 고민했던 과정을 소개합니다. Axios Interceptor…]]></description><link>https://clzzi.dev/axios-interceptor-custom-hook/</link><guid isPermaLink="false">https://clzzi.dev/axios-interceptor-custom-hook/</guid><pubDate>Thu, 26 May 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;이번 포스트에서는 제가 프로젝트를 진행하면서 Axios Interceptor에서 React Hook 및 Custom Hook을 사용하기 위해 고민했던 과정을 소개합니다.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Axios Interceptor에 대해 모르시는 분이 계신다면 아래 링크를 통해 공부해 보시길 권장 드려요&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://axios-http.com/kr/docs/interceptors&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;한글문서&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;h3 id=&quot;-개요&quot; style=&quot;position:relative;&quot;&gt;📌 개요&lt;a href=&quot;#-%EA%B0%9C%EC%9A%94&quot; aria-label=&quot; 개요 permalink&quot; class=&quot;heading-anchor after&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;저는 Axios Interceptor를 통해 &lt;strong&gt;AccessToken이 만료되었을 때 토큰을 재발급 받아오는 용도&lt;/strong&gt;로 사용하곤 했었습니다. 그러나 이번 프로젝트에서는 위와 같은 기능에 그치지 않고 Toast 팝업을 직접 만들어서 API 통신 성공/실패 시 자동으로 팝업을 띄워 유저가 확인할 수 있게 하고 싶었습니다.
아래와 같이 말이죠&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/ba2f9f2969affa4a6428fe45ba2f7ebd/example-gif-1.gif&quot; alt=&quot;&quot;&gt;
&lt;img src=&quot;/71b2c8ff22c757a347786a3ed7768c2a/example-gif-2.gif&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h3 id=&quot;-기존-코드의-문제점&quot; style=&quot;position:relative;&quot;&gt;🔥 기존 코드의 문제점&lt;a href=&quot;#-%EA%B8%B0%EC%A1%B4-%EC%BD%94%EB%93%9C%EC%9D%98-%EB%AC%B8%EC%A0%9C%EC%A0%90&quot; aria-label=&quot; 기존 코드의 문제점 permalink&quot; class=&quot;heading-anchor after&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;먼저 Toast 팝업을 만들기 위해 해당 &lt;a href=&quot;https://velog.io/@1106laura/custom-toast-hook-with-recoil&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;게시글&lt;/a&gt;을 참고해서 만들었습니다.
&lt;strong&gt;Recoil&lt;/strong&gt; 과 &lt;strong&gt;setTimeout&lt;/strong&gt;을 사용해 Custom Hook(useToast)으로 Toast 팝업을 사용할 수 있었는데요, 여기서 문제점이 생깁니다.&lt;/p&gt;
&lt;p&gt;기존 제 Axios Interceptor 코드는 &lt;code&gt;libs/axios&lt;/code&gt; 폴더에 &lt;code&gt;axios.ts&lt;/code&gt;에 위치해있어서
React의 바운더리 밖에있기때문에 custom hook을 사용할 수 없는 구조로 되어있었습니다.&lt;/p&gt;
&lt;deckgo-highlight-code language=&quot;javascript&quot; terminal=&quot;carbon&quot; theme=&quot;dracula&quot;  &gt;
          &lt;code slot=&quot;code&quot;&gt;// libs/axios/axios.ts

const requestHandler = async (config) =&amp;gt; {
	if(accessToken &amp;amp;&amp;amp; refreshToken) {
    	if(decodedToken.exp &amp;lt; currentDate) {
          try {
            const new_token = await getTokenReissuance({token: accessToken});
            localstorage.set(&amp;quot;accessToken&amp;quot;, new_token);
            accessToken = new_token;
          } catch(error) {
          	console.error(error);
          }
        }
      config.headers![&amp;quot;token&amp;quot;] = accessToken;
    }  
  return config;
}

const customAxios = axios.create({
	baseURL: &amp;quot;url&amp;quot;,
	headers: {
    	&amp;quot;token&amp;quot;: localstorage.get(&amp;quot;accessToken&amp;quot;),
    }
});

customAxios.interceptors.request.use(requestHandler);

export default customAxios;
&lt;/code&gt;
        &lt;/deckgo-highlight-code&gt;
&lt;p&gt;이런 구조에서 &lt;code&gt;useToast&lt;/code&gt; 를 선언해 Toast 팝업을 띄우려면 어떻게 해야 할까요?
저는 고민하다가 2가지 해결 방안을 생각했습니다.&lt;/p&gt;
&lt;blockquote&gt;
&lt;ol&gt;
&lt;li&gt;Axios Interceptor를 &lt;strong&gt;Custom Hook&lt;/strong&gt; 형태로 만들어서 사용해 보자&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Provider 컴포넌트&lt;/strong&gt;를 제작해서 Root에서 주입할 수 있도록 해보자&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;
&lt;p&gt;2가지 방법 중에서 &lt;strong&gt;1번&lt;/strong&gt;, &lt;strong&gt;Custom Hook 방식&lt;/strong&gt;을 선택해서 적용해 보았는데요.
1번 방식을 선택한 이유는 다음과 같습니다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;루트에 컴포넌트를 감싸는 형태는 조금 더러워 보였다.&lt;/li&gt;
&lt;li&gt;Custom Hook으로 만들어서 사용하는 것이 조금 더 React스럽다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;-적용&quot; style=&quot;position:relative;&quot;&gt;🐬 적용&lt;a href=&quot;#-%EC%A0%81%EC%9A%A9&quot; aria-label=&quot; 적용 permalink&quot; class=&quot;heading-anchor after&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;저는 &lt;code&gt;useAxiosInterceptor&lt;/code&gt;  라는 네이밍으로 Axios Interceptor를 선언하고 custom Hook을 사용했습니다.&lt;/p&gt;
&lt;deckgo-highlight-code language=&quot;javascript&quot; terminal=&quot;carbon&quot; theme=&quot;dracula&quot;  &gt;
          &lt;code slot=&quot;code&quot;&gt;// hooks/useAxiosInterceptor.ts
import { customAxios } from &amp;quot;libs/axios/axios.ts&amp;quot;;

export const useAxiosInterceptor = () =&amp;gt; {
  // requestHandler는 위와 같은 로직이기에 생략.
  const { fireToast } = useToast();

  const errorHandler = (error) =&amp;gt; {
    let msg = error.message;
    fireToast({ content: ` ${msg} 🔥 `, duration: 2000 });
  };

  const responseHandler = (response) =&amp;gt; {
    return response;
  };

  const responseInterceptor = customAxios.interceptors.response.use(
    (response) =&amp;gt; responseHandler(response),
    (error) =&amp;gt; errorHandler(error.response.data),
  );

  const requestInterceptor =
    customAxios.interceptors.request.use(requestHandler);

  useEffect(() =&amp;gt; {
    return () =&amp;gt; {
      customAxios.interceptors.request.eject(requestInterceptor);
      customAxios.interceptors.response.eject(responseInterceptor);
    };
  }, [responseInterceptor, requestInterceptor]);
  
};
&lt;/code&gt;
        &lt;/deckgo-highlight-code&gt;
&lt;p&gt;하지만 이렇게 만든 &lt;strong&gt;custom Hook&lt;/strong&gt;을 어디에서 선언해서 사용해야 할까요?&lt;br&gt;
저는 해당 Hook을 한 페이지에서만 사용하게 되면 다른 페이지에서 API를 호출할 시에는 적용되지 않게 되고, 여러 곳에 선언해서 사용하자니 코드 중복 및 토스트가 여러개뜰 수 있다고 생각했습니다.&lt;/p&gt;
&lt;p&gt;그래서 저는 &lt;code&gt;Layout&lt;/code&gt;과 같은 Global 한 컴포넌트에서 선언하면 괜찮지 않을까?라고 생각했고 적용해 보았더니 정상적으로 작동하는 것을 확인할 수 있었습니다.&lt;/p&gt;
&lt;deckgo-highlight-code language=&quot;javascript&quot; terminal=&quot;carbon&quot; theme=&quot;dracula&quot;  &gt;
          &lt;code slot=&quot;code&quot;&gt;// src/common/Layout/index.tsx
import { Header } from &amp;#39;Header&amp;#39;;
import { useAxiosInterceptor } from &amp;#39;hooks/useAxiosInterceptor.ts&amp;#39;;

export const Layout = ({ children }) =&amp;gt; {
  useAxiosInterceptor(); // AxiosInterceptor 선언

  return (
    &amp;lt;&amp;gt;
      &amp;lt;Header /&amp;gt;
      {children}
    &amp;lt;/&amp;gt;
  );
};&lt;/code&gt;
        &lt;/deckgo-highlight-code&gt;
&lt;h3 id=&quot;마치며&quot; style=&quot;position:relative;&quot;&gt;마치며&lt;a href=&quot;#%EB%A7%88%EC%B9%98%EB%A9%B0&quot; aria-label=&quot;마치며 permalink&quot; class=&quot;heading-anchor after&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Axios Interceptor에 Custom Hook 및 React Hook을 사용하기 위해 고민했던 과정들을 소개하며 &lt;code&gt;useAxiosInterceptor Hook&lt;/code&gt;을 만들어보았습니다.&lt;/p&gt;
&lt;p&gt;기존에는 Token Controll만 담당하던 Interceptor를 확장해서 생각해서 다른 사용성을 보여준 좋은 사례라고 생각합니다.
더 나은 구현방법이 있을것같은데 떠오르는 방법은 2가지였어서 작성해보았습니다.&lt;/p&gt;
&lt;p&gt;학교에서도 해당 내용을 주제로 발표했었는데 친구들에게 도움되어서 기분이 좋았습니다 ㅎㅎ&lt;/p&gt;
&lt;h3 id=&quot;reference&quot; style=&quot;position:relative;&quot;&gt;Reference&lt;a href=&quot;#reference&quot; aria-label=&quot;reference permalink&quot; class=&quot;heading-anchor after&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://velog.io/@1106laura/custom-toast-hook-with-recoil&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Toast팝업 구현 게시글&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://axios-http.com/kr/docs/interceptors&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Axios Interceptor 한글 문서&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[GroupBy 인턴십 프로그램 후기]]></title><description><![CDATA[현재는 나비효과라는 기업이 없어져서 홈페이지나 앱이 모두 없어졌습니다. 💡 그룹바이란? 그룹바이는 시리즈 A…]]></description><link>https://clzzi.dev/group-by-internship/</link><guid isPermaLink="false">https://clzzi.dev/group-by-internship/</guid><pubDate>Fri, 04 Mar 2022 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;현재는 나비효과라는 기업이 없어져서 홈페이지나 앱이 모두 없어졌습니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&quot;-그룹바이란&quot; style=&quot;position:relative;&quot;&gt;💡 그룹바이란?&lt;a href=&quot;#-%EA%B7%B8%EB%A3%B9%EB%B0%94%EC%9D%B4%EB%9E%80&quot; aria-label=&quot; 그룹바이란 permalink&quot; class=&quot;heading-anchor after&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://groupby.kr&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;그룹바이&lt;/a&gt;는 시리즈 A 이하의 초기 스타트업과 주니어 개발자가 함께 성장하는 과정을 만드는 스타트업을 위한 스타트업입니다.
저는 그룹바이의 인턴쉽 매칭 프로그램에 참여하여 스타트업 &lt;a href=&quot;http://www.thevomvom.com&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;나비효과&lt;/a&gt;에 인턴으로 합격하였습니다.
이 글에서 2달간의 인턴십 경험을 풀어보려고 합니다.&lt;/p&gt;
&lt;h3 id=&quot;-스타트업-나비효과&quot; style=&quot;position:relative;&quot;&gt;🦋 스타트업 나비효과&lt;a href=&quot;#-%EC%8A%A4%ED%83%80%ED%8A%B8%EC%97%85-%EB%82%98%EB%B9%84%ED%9A%A8%EA%B3%BC&quot; aria-label=&quot; 스타트업 나비효과 permalink&quot; class=&quot;heading-anchor after&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;제가 합격한 기업인 나비효과는 크리에이터 중심의 커머스로써, 현재의 &lt;strong&gt;정보 과잉 시대&lt;/strong&gt;에서 &lt;strong&gt;소비자들이 좋은 상품 및 스타일을 찾기 위해 쇼핑에 들이는 시간을 절약해 주고 더 가치 있는 일에 시간을 쓰게 하자&lt;/strong&gt;는 비전을 가지고 있는 기업입니다 🔥&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;이러한 비전을 가진 나비효과에서는 &lt;a href=&quot;https://play.google.com/store/apps/details?id=com.vome&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;봄봄&lt;/a&gt;이라는 앱을 서비스하고 있습니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&quot;1-그룹바이-공고-&quot; style=&quot;position:relative;&quot;&gt;1. 그룹바이 공고 📌&lt;a href=&quot;#1-%EA%B7%B8%EB%A3%B9%EB%B0%94%EC%9D%B4-%EA%B3%B5%EA%B3%A0-&quot; aria-label=&quot;1 그룹바이 공고  permalink&quot; class=&quot;heading-anchor after&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 1280px; margin: 1.45rem 0;&quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 134.16666666666669%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAbCAYAAAB836/YAAAACXBIWXMAAAsTAAALEwEAmpwYAAAESElEQVR42q1VWW9bVRC+/4Mlse+1E9uxr693+3qP9y1xEocmUFSEFEVCCLEjujwQUPpSqeKhSKihNMsDUssjIIEQqLzwWghJRRuo+AX+BR/fHNs0JK6EKh4+nTNzZr4zM+feGS0RNfHBaw1UsiaCoRhy+QIq1RqyuTxq9SaKpTJmCcPlHosZfwAu9xSCVgjRWBzam+sVAIe489MP2Ny8jLfefgfVWhPlSg3tuS7yhSKKs6XHEk5Ne6AbLhKbMIMWtEzch2tXN3Dl6jVc3tzExUuX4JsJIMBDMXp2YhKTDqeKYhxGxE7dUND8Zhh2Jo9QOIJ4woZ7yoOJSQccTl0Rye0jY5FFL3uxEXmkEzsh1hLJFFqdOYXV588yvTJSdpqpzirY6axak6k0S8FaV+uIxZNotedUWcqVKnIsS8AMDiIUwhUSNZptdFizZquD7sISer0zmO8uYnFpWTnXG230ls8oG5ErNRInkuohwpEYpj0+FaXmm/EjncmqgspLBUyLESSYfgpWKEyHBM8GLyhlkUjk3OV246mnn1E1lvQN1zBlIRy9kDj6A6ZyikTl5ihMtY+ph5IL5RJ/IEjyKC9NqjOTeiGUS7Qob5N0C6yd1ERSqjdaWGLKUq96o4mFxR4KxRJT7Si53ZlXpZFV6jo3vwDd5eXjMOVYyka7u4AKDRt06LB+rfmuksv1Bhp0kn2+VEK11cIsH0Hsm3PzqLXatKmjs7iETsuG35yGZnn9qOZpnOcfkc6jlCkgl0hzX0C7wlfNzSLGTysTs5GL2yhni2iW6kiF46gXq8jGU4gF49h4KYBanK+s716AY/t94jycO+eh71yA6GQveqUbyseh7IarsXcR+pXXYXz6LjTjwS5cR4I9GFyNo5E80Cn9g0c644StnDm51t9YQ2x3g4R3r+MkXCfwSL+lcMrnl+vw/Pgx3D9/QsL9z3ASzl+3/oGD0Id6h5JJPMZHv3cT+sGN04T6/hbMg20ED3YQ4Bo6ZIr7NxS5dbCL8OEeJseR8lxwilAieOHoa5z74xtk7n2BtT+/xerRV1h/+B3e++sOXn34PUq/38LEYyIdG6FEJxDZ89tNTO1/rmQv9xK1yb2TdsZ/IVQ1pPFxB32oG62S/ji/AeEw9/8LmnF/G8b9nX9Bp+5JoblvfwjXrQ24bw8g+6kvP3piaAk7gzw7TZZdWZDJFxFm77PYNINsUVZkgBDblOgGGMjjoLXaXaytv4IG21HvuVW8eO5ltqNFtqxlduwldLmurJ5Vui7bWG95hWO1wpEbHvTMEXiRQAuTVVq5GFihCCLs0AnOj1Q6w+GVG8o2QjQOMbJ40kaUM0Wm4nFIkxUOzanr8PhmVKuXG2UE6IZMOU4ytnSLbV86tZxJVx+NTI/Xp0aCQHyl66uZwhHY9/pm+kEr3CdZnyOh79RdCiTscyQonZxzDCid+JCQ9kF1Luu0x6v0fwMLvUo6v0xeYQAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/dbf5e75bce5d62aeb5f3b8fa0ca03434/4558e/facebook-groupby.avif 480w,
/static/dbf5e75bce5d62aeb5f3b8fa0ca03434/57a30/facebook-groupby.avif 768w,
/static/dbf5e75bce5d62aeb5f3b8fa0ca03434/c509e/facebook-groupby.avif 1024w,
/static/dbf5e75bce5d62aeb5f3b8fa0ca03434/35038/facebook-groupby.avif 1280w,
/static/dbf5e75bce5d62aeb5f3b8fa0ca03434/e5e0e/facebook-groupby.avif 1440w&quot;
              sizes=&quot;(max-width: 1280px) 100vw, 1280px&quot;
              type=&quot;image/avif&quot;
            /&gt;&lt;source
              srcset=&quot;/static/dbf5e75bce5d62aeb5f3b8fa0ca03434/42669/facebook-groupby.webp 480w,
/static/dbf5e75bce5d62aeb5f3b8fa0ca03434/050c0/facebook-groupby.webp 768w,
/static/dbf5e75bce5d62aeb5f3b8fa0ca03434/44907/facebook-groupby.webp 1024w,
/static/dbf5e75bce5d62aeb5f3b8fa0ca03434/e2782/facebook-groupby.webp 1280w,
/static/dbf5e75bce5d62aeb5f3b8fa0ca03434/fead5/facebook-groupby.webp 1440w&quot;
              sizes=&quot;(max-width: 1280px) 100vw, 1280px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/dbf5e75bce5d62aeb5f3b8fa0ca03434/ab158/facebook-groupby.png 480w,
/static/dbf5e75bce5d62aeb5f3b8fa0ca03434/2d1ba/facebook-groupby.png 768w,
/static/dbf5e75bce5d62aeb5f3b8fa0ca03434/f1720/facebook-groupby.png 1024w,
/static/dbf5e75bce5d62aeb5f3b8fa0ca03434/f3baa/facebook-groupby.png 1280w,
/static/dbf5e75bce5d62aeb5f3b8fa0ca03434/87339/facebook-groupby.png 1440w&quot;
            sizes=&quot;(max-width: 1280px) 100vw, 1280px&quot;
            type=&quot;image/png&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/dbf5e75bce5d62aeb5f3b8fa0ca03434/f3baa/facebook-groupby.png&quot;
            alt=&quot;facebook groupby&quot;
            title=&quot;&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;일과 후 페이스북을 보던 중 우연히 해당 포스트를 보게 되었습니다. 마침 겨울방학이 다가오고 있었기도 하고,
고등학생 개발자인 저한테 정말 좋은 기회라고 생각되어서 고민하다가 바로 지원하게되었습니다.
모두 다 뽑히는것은 아니고 서류 전형이 있어서 저는 노션으로 작성한 이력서를 제출했어요.&lt;/p&gt;
&lt;h3 id=&quot;2-매칭-데이-&quot; style=&quot;position:relative;&quot;&gt;2. 매칭 데이 👨‍💻&lt;a href=&quot;#2-%EB%A7%A4%EC%B9%AD-%EB%8D%B0%EC%9D%B4-&quot; aria-label=&quot;2 매칭 데이  permalink&quot; class=&quot;heading-anchor after&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;그룹바이 매칭 프로그램에서는 여러 스타트업들 중에서 자신에게 맞는 스타트업 15곳을 추천해 줍니다.
또한 각 기업별로 &lt;strong&gt;최소 30분씩&lt;/strong&gt;미팅을 할 수 있게 해줍니다.&lt;/p&gt;
&lt;p&gt;저는 여러 기업들 중 대략 10곳의 기업에 미팅을 신청하였습니다. 미팅은 줌으로 진행되며 저와 같은 프로그램 신청자들과 함께 미팅을 진행했습니다 🙋&lt;/p&gt;
&lt;p&gt;줌을 통해서 기업들은 간단하게 어떤 비전을 가지고 일하고 있는지, 지원자분들에게 기대하고 있는 점들은 어떤것이 있는지 알려주시고 지원자와 Q&amp;#x26;A 형식으로 시간을 보냈습니다.&lt;/p&gt;
&lt;h3 id=&quot;3-직무-면접-&quot; style=&quot;position:relative;&quot;&gt;3. 직무 면접 💻&lt;a href=&quot;#3-%EC%A7%81%EB%AC%B4-%EB%A9%B4%EC%A0%91-&quot; aria-label=&quot;3 직무 면접  permalink&quot; class=&quot;heading-anchor after&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;저는 신청한 10개의 기업들과 미팅을 거친 후, 최종적으로 4곳에 지원을 하였습니다.
최종적으로는 그중 한곳에 합격하게 되었습니다.
&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 1280px; margin: 1.45rem 0;&quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 100%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAAsTAAALEwEAmpwYAAACAklEQVR42q2VR7LaUBBFtTyYM6JM8K48gwlQwBK8Aa8ACpFEdBGUc7x+3XxhFeFnVV2eWg+dVge1pEqlgnK5zCqVSp8W3U8sqVqtotVqod1uo9vtotfrod/vP9VgMLjTcDhEp9MBsaRGo4Hj8QjDMBDHMWzbxkeOLMt49TwP9XodUrPZxGq1wnq9xm63w2azwX6/53MS7em6zje4rosoithxLrIJalnWf+B2u8Vue4ERhGyC0jqfz3k9n07QNI0B+ZOR0jRlm5xdgYvFAoqiYDqdYTKZYLlcsj2bzXiPRNAi7DbkK5B+dMNEkiRI4gBhGMEV4Vkil4ZpwRSyHQeaCJvWIAhF+D4834fjuGzTQblnYK1WExs2HOH8t+yD/Bni5tFoxE82Ho95lWUZ8nTKOZ2Ic0oF/UdRVsKRDTPP4Q8B9Fwbmpfh1x8HqQghDAKoqobz+cx5M0UHGLrB55R8KhJd01RVXFOhn2jfAnWMVBNUy7Ff8hFz6KHIlS+gQRiyTU7SvAgFJeklf/pfF+pBR/Nn49KHqvBCOQijmKvGeqlgUlC+V7xGDu+KQqEcDodrU+ct8R6lWXoPpKalI++pDwHTB0Aybvur2GffCnwL/GngM/BDYF4Metn5jXlFxcHwcDgUi/KeJ3xzfNFQpOFIQ/J2cL42VJ8O2PwT8JXxX/wE/ANp42BNSK23kQAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/85de6032a1933de5befe57204b182287/4558e/pass-vomvom.avif 480w,
/static/85de6032a1933de5befe57204b182287/57a30/pass-vomvom.avif 768w,
/static/85de6032a1933de5befe57204b182287/c509e/pass-vomvom.avif 1024w,
/static/85de6032a1933de5befe57204b182287/35038/pass-vomvom.avif 1280w,
/static/85de6032a1933de5befe57204b182287/e5e0e/pass-vomvom.avif 1440w&quot;
              sizes=&quot;(max-width: 1280px) 100vw, 1280px&quot;
              type=&quot;image/avif&quot;
            /&gt;&lt;source
              srcset=&quot;/static/85de6032a1933de5befe57204b182287/42669/pass-vomvom.webp 480w,
/static/85de6032a1933de5befe57204b182287/050c0/pass-vomvom.webp 768w,
/static/85de6032a1933de5befe57204b182287/44907/pass-vomvom.webp 1024w,
/static/85de6032a1933de5befe57204b182287/e2782/pass-vomvom.webp 1280w,
/static/85de6032a1933de5befe57204b182287/fead5/pass-vomvom.webp 1440w&quot;
              sizes=&quot;(max-width: 1280px) 100vw, 1280px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/85de6032a1933de5befe57204b182287/ab158/pass-vomvom.png 480w,
/static/85de6032a1933de5befe57204b182287/2d1ba/pass-vomvom.png 768w,
/static/85de6032a1933de5befe57204b182287/f1720/pass-vomvom.png 1024w,
/static/85de6032a1933de5befe57204b182287/f3baa/pass-vomvom.png 1280w,
/static/85de6032a1933de5befe57204b182287/87339/pass-vomvom.png 1440w&quot;
            sizes=&quot;(max-width: 1280px) 100vw, 1280px&quot;
            type=&quot;image/png&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/85de6032a1933de5befe57204b182287/f3baa/pass-vomvom.png&quot;
            alt=&quot;pass vomvom&quot;
            title=&quot;&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;합격하면 메일을 통해 면접 일정 조율이 이루어집니다(평균적으로 메일 수신 1~2주 내외)&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;그룹바이측에서 지원자와 기업 사이에서 빠르게 핑퐁이 이어질 수 있도록 많은 노력을 해주십니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;저는 대구에서 서울로 가야했었기때문에 1주일후에 면접일정을 잡았었고, 면접은 개발자분들 및 대표님과 3 대 1로  진행되었습니다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;면접에서는 대부분 제 이력서를 기반으로 해서 질문을 하셨습니다&lt;/li&gt;
&lt;li&gt;직무 부분에서는 React, Javascript 관련한 깊은 개념을 물어보셨고&lt;/li&gt;
&lt;li&gt;프로젝트에서 활용한 기술을 사용한 이유 및 어떻게 활용했는지 등을 구체적으로 물어보셨습니다.&lt;/li&gt;
&lt;li&gt;확실히 학교에서 &lt;a href=&quot;https://clzzi.dev/2021-clzzi-log&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;동아리&lt;/a&gt; 활동한 것, 해커톤 했던 경험, 기초 공부한 것 등이 많이 도움 된 것 같아요!&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;직무면접 후, 다음날에 대표님의 전화로 바로 합격 소식이 들려왔습니다! 🎉&lt;/p&gt;
&lt;h3 id=&quot;4-합격-이후-&quot; style=&quot;position:relative;&quot;&gt;4. 합격 이후 🙌&lt;a href=&quot;#4-%ED%95%A9%EA%B2%A9-%EC%9D%B4%ED%9B%84-&quot; aria-label=&quot;4 합격 이후  permalink&quot; class=&quot;heading-anchor after&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;인턴십에 합격해 학생이 아닌 &lt;strong&gt;프론트엔드 개발자&lt;/strong&gt;로써 일을 하게 되었습니다.&lt;br&gt;
회사에서 온보딩부터 시작해 스타트업에서 할 수 있는 여러 경험들을 팀원분들과 함께하며 성장하고 있습니다.&lt;/p&gt;
&lt;p&gt;또한, 일적인 요소 말고도 사회생활에 대한  &lt;strong&gt;해봐야만 알 수 있는 것&lt;/strong&gt;들에 대한 부분에서도 많은 도움이 되어서 정말 좋았습니다 :)&lt;br&gt;
서울, 자취, 사회생활 모든것이 처음인 저를 잘 적응할 수 있게 해주신 팀원분들에게 정말 고맙다고 생각해요&lt;/p&gt;
&lt;h3 id=&quot;5-마지막으로&quot; style=&quot;position:relative;&quot;&gt;5. 마지막으로&lt;a href=&quot;#5-%EB%A7%88%EC%A7%80%EB%A7%89%EC%9C%BC%EB%A1%9C&quot; aria-label=&quot;5 마지막으로 permalink&quot; class=&quot;heading-anchor after&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;그룹 바이 매칭 프로그램을 우연히 보았지만 많은 고민을 했습니다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;학생인데 잘할 수 있을지&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;기업에서는 나이가 어리다고 싫어하진 않을지&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;가서 잘할 수 있을지&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;이런 고민들이 있었지만,&lt;br&gt;
어차피 &lt;strong&gt;언젠가는 경험해야하고 일찍할수록 좋다&lt;/strong&gt;라는 생각이 들었고 저는 용기내서 지원했던것 같습니다.
자신감을 가지고 일단 시도해보면 뭐든 얻는게 있는것 같아요 :)&lt;/p&gt;
&lt;h3 id=&quot;6-여담-&quot; style=&quot;position:relative;&quot;&gt;6. 여담 🐳&lt;a href=&quot;#6-%EC%97%AC%EB%8B%B4-&quot; aria-label=&quot;6 여담  permalink&quot; class=&quot;heading-anchor after&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;저는 현재 2달간의 인턴십을 무사히 마치고 다시 학교에서 열심히 공부하고 있습니다.
더 잘하는 개발자가 되어서 재취업해보려고 합니다!&lt;/p&gt;</content:encoded></item><item><title><![CDATA[2021.Clzzi.log]]></title><description><![CDATA[2021년도 1주일밖에 남지 않았기 때문에 고등학교 2학년이자 프론트엔드 개발자로써의 올해를 회고하고 되돌아보는 시간을 가져봅니다. 열심히 달려왔던 2021년 2021년은 B1ND…]]></description><link>https://clzzi.dev/2021-clzzi-log/</link><guid isPermaLink="false">https://clzzi.dev/2021-clzzi-log/</guid><pubDate>Tue, 21 Dec 2021 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;2021년도 1주일밖에 남지 않았기 때문에 &lt;strong&gt;고등학교 2학년&lt;/strong&gt;이자 &lt;strong&gt;프론트엔드 개발자&lt;/strong&gt;로써의 올해를 회고하고 되돌아보는 시간을 가져봅니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;열심히-달려왔던-2021년&quot; style=&quot;position:relative;&quot;&gt;열심히 달려왔던 2021년&lt;a href=&quot;#%EC%97%B4%EC%8B%AC%ED%9E%88-%EB%8B%AC%EB%A0%A4%EC%99%94%EB%8D%98-2021%EB%85%84&quot; aria-label=&quot;열심히 달려왔던 2021년 permalink&quot; class=&quot;heading-anchor after&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;2021년은 &lt;strong&gt;B1ND 팀 활동, 해커톤, 공모전, 인턴 준비, 포트폴리오 준비 등&lt;/strong&gt; 목표를 설정하고 달성하기 위해서 쉴 틈 없이 꾸준히 무언가를 하려고 했던 해 같아요😁&lt;/p&gt;
&lt;h2 id=&quot;b1nd팀&quot; style=&quot;position:relative;&quot;&gt;B1ND팀&lt;a href=&quot;#b1nd%ED%8C%80&quot; aria-label=&quot;b1nd팀 permalink&quot; class=&quot;heading-anchor after&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 510px; margin: 1.45rem 0;&quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 100%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDAAMCAgMCAgMDAwMEAwMEBQgFBQQEBQoHBwYIDAoMDAsKCwsNDhIQDQ4RDgsLEBYQERMUFRUVDA8XGBYUGBIUFRT/2wBDAQMEBAUEBQkFBQkUDQsNFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBT/wgARCAAUABQDASIAAhEBAxEB/8QAGQABAAIDAAAAAAAAAAAAAAAAAAIEBgcI/8QAFQEBAQAAAAAAAAAAAAAAAAAAAAT/2gAMAwEAAhADEAAAAenZUcEsg2mI7wAP/8QAGhABAAIDAQAAAAAAAAAAAAAABAIFAAMGIP/aAAgBAQABBQJioBMZEF6MuCydV81XqPYeP//EABgRAAMBAQAAAAAAAAAAAAAAAAECAxEg/9oACAEDAQE/AaXed1QLoPH/xAAZEQEAAgMAAAAAAAAAAAAAAAACAQMRICH/2gAIAQIBAT8BFQdKeexp/8QAHxAAAgEEAgMAAAAAAAAAAAAAAQMCBBESMgAQEyBR/9oACAEBAAY/AmPZfBYyNuQdDSYuL9VSIbsWQL8zNOylX48W5neX0ev/xAAeEAACAQMFAAAAAAAAAAAAAAABESEAEFEgMWGB8P/aAAgBAQABPyGW9U2UOKOaSCoijmyY8RmorYEseIwAdeen/9oADAMBAAIAAwAAABBzyDz/xAAaEQEBAAIDAAAAAAAAAAAAAAABETFRICFh/9oACAEDAQE/EGmDyD03NkgbnmuH/8QAGhEAAgIDAAAAAAAAAAAAAAAAAREhMSCRwf/aAAgBAgEBPxA4FNUSFuS6fcP/xAAbEAEBAAIDAQAAAAAAAAAAAAABESFBABAxYf/aAAgBAQABPxBDz9pcmzzC6HwCkaY+dLCQdRPAuq4v3johMe5oAAeUI57Tr//Z&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/011f39e1e1de662686d774db6ee73d34/4558e/B1ND.avif 480w,
/static/011f39e1e1de662686d774db6ee73d34/17877/B1ND.avif 510w&quot;
              sizes=&quot;(max-width: 510px) 100vw, 510px&quot;
              type=&quot;image/avif&quot;
            /&gt;&lt;source
              srcset=&quot;/static/011f39e1e1de662686d774db6ee73d34/42669/B1ND.webp 480w,
/static/011f39e1e1de662686d774db6ee73d34/519c7/B1ND.webp 510w&quot;
              sizes=&quot;(max-width: 510px) 100vw, 510px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/011f39e1e1de662686d774db6ee73d34/55489/B1ND.jpg 480w,
/static/011f39e1e1de662686d774db6ee73d34/f711a/B1ND.jpg 510w&quot;
            sizes=&quot;(max-width: 510px) 100vw, 510px&quot;
            type=&quot;image/jpeg&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/011f39e1e1de662686d774db6ee73d34/f711a/B1ND.jpg&quot;
            alt=&quot;B1ND&quot;
            title=&quot;&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
    &lt;/span&gt;
2020년 말에 교내 동아리인 &lt;strong&gt;B1ND 팀&lt;/strong&gt;에 입사하게 되고, 그 후 겨울 및 봄 방학 동안 인수인계를 받게 되었습니다.&lt;br&gt;
교내에서 서비스되고 있는 프로젝트를 인수인계 받고 기능 개발에도 참여했습니다.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;B1ND팀은 학생 생활 관리 플랫폼인 &lt;strong&gt;도담도담&lt;/strong&gt;이라는 서비스를 비롯해 교내 프로젝트를 운영하는 팀 입니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;도담도담 서비스를 운영하면서 크고 작은 이슈들을 해결하였는데 그중에는 &lt;strong&gt;렌더링 최적화&lt;/strong&gt;한 작업이 가장 기억에 남는 거 같아요.&lt;/p&gt;
&lt;p&gt;추가로 나르샤 프로젝트로 &lt;strong&gt;모람모람&lt;/strong&gt;이라는 팀 빌딩 서비스를 기획하여 개발했습니다. 부족한 점이 많아 기획부터 엎고 다시 작업하기를 반복하며 거의 7개월간 개발을 했어요 ㅜㅜ&lt;br&gt;
개발 도중에 팀원의 이탈로 골머리를 앓았던 적도 있고, 커뮤니케이션이 원활하지 않아서 개발했던 것을 또 해야 하는 상황도 있었습니다😥&lt;/p&gt;
&lt;p&gt;결과적으로는 성공한 프로젝트라고 말할 수는 없지만.. 개발 실력이나 정신적으로 많이 성장해서 저는 만족해요!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;모람모람&lt;/strong&gt;과 &lt;strong&gt;도담도담&lt;/strong&gt;을 ICT 공모전에 출품하였고 3일간 전시하며 발표도 했습니다. 학교 사람들이 아닌 외부인에게 서비스를 소개하고 시연하는 것이 생각보다 어려웠지만 재미있었어요! 잊지 못할 추억이 될 것 같아요 ☺️&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 608px; margin: 1.45rem 0;&quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 99.58333333333333%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAA7DAAAOwwHHb6hkAAAFM0lEQVR42j2TeVDUZRyHf4tHmlbjWJnVaJdHVjrjRRrKIYeAgoIKCgIqXrDLIkqOafWPjsdKmgcKipopoQ4ekOLFFQirEAlCIKgcLseyLCwsC7uoPL0r2h/PfOc95pnv5z0k2doOZGGdyMK7sLEi70ZSmBm+xUxhtZkXFgsWcw9aQw+T9liQlD30i+5BJpAENpsEG80vkW3oQpKtt8pMQiRkii76K8Xk2m6iLpqh10KH0UKr4Rm95uckqM1CaGHgZiF5JbXZaOmTbex+LTT2CRV9woERYnJlF7/+9YzCEki60UthqQV1yTMS0+uRKZ/z0RYY/H0vUtTr7vpkskircJ0RKdyKGIi4NgoRObSL+QcNXErVciChhsQLFWSfvU/c/jSmy0v4Wl7HCHkD/TaYRGfm/2WyCJNV2MEAuZHBER0MijQySGlkoNLMqKC7uPsexMNbhce8nUQGxhC0ZBdeC2NwXRiL7dILDFE0I0UKoVIcW4RA3okkiUsZGtHGoAgdbyh0ourpH65ngKIVmzAdwyMbeD+immHyKkZG1TIsSqwrRSdKq0h0pTD2IVLKwkRSaU27EOqx3VWHvaoWB8H0HXU4qp5iu1NDVFIj20X06HNN+MfrcNjXydBIIRRnbxNufSGC9e3I1gnWtgvhqg5GbW6m9uk9yh7nUlx0leLSm9x9lE9+9T3yyrJ5UHyTyvJr7EguZeyPRsZsa2dgmBCsMbyiT2atkrTCwIebmsmpeEDuwyJyCrK4lnubywX5JN7JJTU/m8w76eQVZJBdUsWVPLG3TI/LvnbekusZHNaGtMqAzWohDjUIYYiOd+RN7Eur4vfsco7e+pcDf5awX3DoajH7U4uJTa8iNqOKny8+oUVfg7m7gdrmRso1GuSntUgB4lxX6bFZoRfC4E7eVrRRXFONXqvmyqUj3FMnk5FxhsuXYklJiSMr8w9adIVcLqpBZ6jn+fNmzOYmoJHdV0WHgWb6hYrntlIw3C2ecUsSKH1UhMlYikajpklbQH29tRbS2lZCdU0ORuMD0nJzaGmro6dHh8lkFeo5dD6Htx0PM9I9jhGuR5G+muLFTEcfKiuz6bZUYOosE5J/0Dbfo6FRja7lb/H9SjF1lZGecUFEfvSyQ5OpXghbOfHbaUZ/6cqEKQsYO8kL6YupAczyCKW8IhdjZwVthlLU+cmkXUvg4sVYMjMTxV9+gKFDCDNTqdZUotFp0LU+EcIWTp+7zOjJgUz4bjXjZ6xCGjDkY8ZPnCqi5okNNRg77pOdGU9qSgy3b8WhzjsjIpaLtSqyspJEx0/o6NSgb6sRc53EJ8QJybsMHf4Zbw77FGnSxE+YO3cGB07d5nRKMcnX1Rw7cx3V4XPsi0vmZNINrlwv4NSFQrbvOSyEVYLHaLUP6aWd8+eOM37cB0ybOoYpkz9HKik6S1b6Kb7xuYFHmJq9x4vYcaSYGFGj9xQSvVuIDqp579s0XANOwosmuru1WMTFQA/1T0tJv34QdU4C+bknkPbvjUK1U8l6ZQR+IevxCViDt38onotW4LZwBY6ey3H2DsZubiD+wcEcjt3O0TgV8cdUJCT8gkq1lehNIWz9IZSftq1G8nS3xWfBbAKXOhAUNIeQEBcWL7YT1RU//9kEi7G/v1gLdmaxnyNeC+yZ52XHfO9ZuHvOwGnONOwdpmA3axJOTlORvL0c8PV1wXeRK0v83Vga4MECH2cClnvit9SNkJULCQrxJjDYC/9l7iwL9GTRYld8BdZ9Hh72uLnZ4eRsi4vrTP4DRJw+UWKSsmMAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/dd0a73c5764ebcfd118b3155d6d1d49e/4558e/ICT.avif 480w,
/static/dd0a73c5764ebcfd118b3155d6d1d49e/8d995/ICT.avif 608w&quot;
              sizes=&quot;(max-width: 608px) 100vw, 608px&quot;
              type=&quot;image/avif&quot;
            /&gt;&lt;source
              srcset=&quot;/static/dd0a73c5764ebcfd118b3155d6d1d49e/42669/ICT.webp 480w,
/static/dd0a73c5764ebcfd118b3155d6d1d49e/e5bb8/ICT.webp 608w&quot;
              sizes=&quot;(max-width: 608px) 100vw, 608px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/dd0a73c5764ebcfd118b3155d6d1d49e/ab158/ICT.png 480w,
/static/dd0a73c5764ebcfd118b3155d6d1d49e/f7382/ICT.png 608w&quot;
            sizes=&quot;(max-width: 608px) 100vw, 608px&quot;
            type=&quot;image/png&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/dd0a73c5764ebcfd118b3155d6d1d49e/f7382/ICT.png&quot;
            alt=&quot;ICT&quot;
            title=&quot;&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;2학년 2학기가 되면서 후배들이 B1ND 팀에 입사를 하게 되었고, 1년 전에 제가 받았던 것처럼 인수인계를 해주려니 감회가 새로웠어요.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;3학년이 되면 팀 활동보다는 취업 준비를 해야 하기 때문에 인수인계만 하고 나가야 합니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;인턴준비&quot; style=&quot;position:relative;&quot;&gt;인턴준비&lt;a href=&quot;#%EC%9D%B8%ED%84%B4%EC%A4%80%EB%B9%84&quot; aria-label=&quot;인턴준비 permalink&quot; class=&quot;heading-anchor after&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;저희 학교에서는 2학년 2학기부터 인턴으로 일할 수 있게 되어있어요, 그래서 저도 프론트엔드 분야에 인턴으로 일할 곳을 찾고 있었고 운 좋게 &lt;strong&gt;그룹바이&lt;/strong&gt;라는 프로그램에 참여하게 되었어요!&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 1260px; margin: 1.45rem 0;&quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 85%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAARCAYAAADdRIy+AAAACXBIWXMAAA7DAAAOwwHHb6hkAAACS0lEQVR42qWS22rUUBSG8yBW7BHxDaQVRPDO99ArD30bqbaKoLRF8KpeCCqIokg9zrTTOTkzOe1kJzvTOSedye/aO0nr2GktuODjX7Pyr5W1J1vbCioo9H18FgY+OFX87HH86LpKP3l1RVb73mZ4z6r4yOvqt+Rry8Y7q4ztpontwIC2kFvDbG4V8/k1LOw8whzlh1BtLr+KmdxDhfRJj/RmnvmstkO1L/ehTefJLJsUf+bJSy6SWXJp57HSxD/uUzUaOPNtBdosFf5GbnUh9wBLxXVcLW7gWnETNyovcL30HNNy0wk9GdoUNZ7EeaUrOEdMTeR4j3Z57xkOKTzFYnkDS8RiaR1LlU3KN8c15Qox1puidUYRJO1hiB6GYE0BQ7hg+wI1ZkL3GGqOiQZPVPdsGJ5DuYVufICsP0NDGnEcK+WOA2aa2A+aMA0djk0DdB0W1aTalq08pmFgUhwNTLUV9tFoNcECAZdRs8fh+x48z4PwXcShi9Pi2IYiCFA3DehGQ21oWVayHW2k63Xa2EC/3//3wCzCMEQ4GCTIPMw0YTQaHb78TAP/N45/FPrfrL09VAq7KBDlcgm2bYFzF1EUZeazbzjodtFzGHzGYBNCCIRRiAEdfZAdOf2Ik45+NDB92Gm3wV0XgS8gOEdA7KvcQ+D56HU6GIYRhtEB4lF82rVJHsoLXeImqnSBy9zCL+GgQrmk6jMUHUPRaPloRYOTB47SgU94Hjdrr7DceIO7ktpr3N59SWzhDuX39LdYJm6RZ8PbHeuVA38DXrmbYTiQ4oMAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/e9279dfb0bef1101d59ca5f48acc4b7b/4558e/GroupBy.avif 480w,
/static/e9279dfb0bef1101d59ca5f48acc4b7b/57a30/GroupBy.avif 768w,
/static/e9279dfb0bef1101d59ca5f48acc4b7b/c509e/GroupBy.avif 1024w,
/static/e9279dfb0bef1101d59ca5f48acc4b7b/9eba6/GroupBy.avif 1260w&quot;
              sizes=&quot;(max-width: 1260px) 100vw, 1260px&quot;
              type=&quot;image/avif&quot;
            /&gt;&lt;source
              srcset=&quot;/static/e9279dfb0bef1101d59ca5f48acc4b7b/42669/GroupBy.webp 480w,
/static/e9279dfb0bef1101d59ca5f48acc4b7b/050c0/GroupBy.webp 768w,
/static/e9279dfb0bef1101d59ca5f48acc4b7b/44907/GroupBy.webp 1024w,
/static/e9279dfb0bef1101d59ca5f48acc4b7b/f27a3/GroupBy.webp 1260w&quot;
              sizes=&quot;(max-width: 1260px) 100vw, 1260px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/e9279dfb0bef1101d59ca5f48acc4b7b/ab158/GroupBy.png 480w,
/static/e9279dfb0bef1101d59ca5f48acc4b7b/2d1ba/GroupBy.png 768w,
/static/e9279dfb0bef1101d59ca5f48acc4b7b/f1720/GroupBy.png 1024w,
/static/e9279dfb0bef1101d59ca5f48acc4b7b/f46b1/GroupBy.png 1260w&quot;
            sizes=&quot;(max-width: 1260px) 100vw, 1260px&quot;
            type=&quot;image/png&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/e9279dfb0bef1101d59ca5f48acc4b7b/f46b1/GroupBy.png&quot;
            alt=&quot;GroupBy&quot;
            title=&quot;&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;노션으로 포트폴리오를 만들어 그룹바이에 지원해서 4개의 기업에 지원을 넣었습니다. 2곳에서는 탈락하였고, 최종적으로 1곳에 면접을 보러 가게 되었습니다.&lt;/p&gt;
&lt;p&gt;면접에서는 커피챗느낌으로 면접을 보았고 기술적인 부분 조금과 인성 면접을 위주로 진행했어요.&lt;br&gt;
서울도 처음 간 것이고 채용 면접도 처음이라서 엄청 떨렸지만 여유롭게 보자고 마인드 컨트롤 했어요 ㅎㅎ&lt;br&gt;
바로 다음날 대표님이 전화로 &lt;strong&gt;합격&lt;/strong&gt; 소식을 알려주셔서 정말 기뻤습니다 😎&lt;/p&gt;
&lt;p&gt;인턴으로 일하기 위해서 글을 쓰는 지금도 자취방을 알아보고 있어요! 이번 주 내로 계약하고 서울로 올라갈 예정이랍니다 ㅎㅎ
&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 872px; margin: 1.45rem 0;&quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 70.83333333333333%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAOCAYAAAAvxDzwAAAACXBIWXMAAA7DAAAOwwHHb6hkAAADIElEQVR42o2UWW/bVhBG9f9f+tIERVHAaNMGMYy4thG3qREvcSM5UiSLWrhv93IntXqT3ObhdOz8gRIgSNzL+82Zb2bYWtWaqshYrW54fHxksVizfdjC1w3rpaxtH1nf3vGw2fB/rtZiltFUKQ/3K+5u12SVg1oFJIuYeBFyczvj69LnfnPH/brmZtlw+/AvzdxifZ+x3d4zm+U0ArTZbmktlzWb2wV3Nyv+2TxQqS4/D1/ysvs9P/S/Y9fYIQk+kyiPMrgksk+wYpsPVy8Yj/co8pLe1QHHvWvyIhdC55BmOWfm/cWysFjoPtPojPbkV07sd1z6pwSxSTMbkzdTVOYQ65BSWRTT1+RZRmhfctDu0jQzWmXcJ/avaUqbeXjBytoj0ymNe0SVmxTpFO2dUqtLoXEo4inOuMNk6lC7h1TpkM70mLfnJzipolVHHWr/knpeEHsDiWiT6wvOPv9CONkncnsk3heqxMEz2yy8P9DWBbYXov0+uf2KD+N99s5+Y3f0pwg2tYjEVPUYXQwlvQmxdYoOrilEJBeianpIKs+6yVFKiqYVVakIopi5v8/fo32Or37ibHBCayYiUdwlzjxqZx/lTxiNTQzTFj/PWcZtITFQcSjiE5LYkAJJFpkQinDhn5NbrzgT8k/OrngYtqn8No0yKDPxS0hS7WC5fXQ0eKYscsViXoo1p6RqRBxNKDKXPJWs1ITG3JG1awx9TSsrNFnQp9Ejieg/b4ShgR8+HXSFUgjtDjpNKaVf08SWQg1ItImKTPIyF8r3FM6R7EnbJH6HyjyiTIQuHKLcDmFgipdTSc0XwqFMkkfkjyXdkRx6IrOpy0DW9Tf/c59y+iPK60nKukcsjaojiybukQcfCUIbyxQL5MPx8ADb/IjvTLEdoQpdnGCIlXQFwqfJLW7mEcZwB6P/jlalBzJ6Hrn0UqJc6llMXY2ee06JV1oK8EyWKSxrgukOMSafGBi72MP3EsCQHpa9sEvkvKHlf/ld0hlQFk8p2GQiokIJIj+NVHsi6sptSLFkUtJQ3scyCN88L0uXJImkpVyi1KFnveY/1y3noGDxzPUAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/dedfe5c58c7a84470f7dc71c7d92fae5/4558e/map.avif 480w,
/static/dedfe5c58c7a84470f7dc71c7d92fae5/57a30/map.avif 768w,
/static/dedfe5c58c7a84470f7dc71c7d92fae5/34b7f/map.avif 872w&quot;
              sizes=&quot;(max-width: 872px) 100vw, 872px&quot;
              type=&quot;image/avif&quot;
            /&gt;&lt;source
              srcset=&quot;/static/dedfe5c58c7a84470f7dc71c7d92fae5/42669/map.webp 480w,
/static/dedfe5c58c7a84470f7dc71c7d92fae5/050c0/map.webp 768w,
/static/dedfe5c58c7a84470f7dc71c7d92fae5/53c21/map.webp 872w&quot;
              sizes=&quot;(max-width: 872px) 100vw, 872px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/dedfe5c58c7a84470f7dc71c7d92fae5/ab158/map.png 480w,
/static/dedfe5c58c7a84470f7dc71c7d92fae5/2d1ba/map.png 768w,
/static/dedfe5c58c7a84470f7dc71c7d92fae5/31595/map.png 872w&quot;
            sizes=&quot;(max-width: 872px) 100vw, 872px&quot;
            type=&quot;image/png&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/dedfe5c58c7a84470f7dc71c7d92fae5/31595/map.png&quot;
            alt=&quot;map&quot;
            title=&quot;&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;h2 id=&quot;그-외&quot; style=&quot;position:relative;&quot;&gt;그 외&lt;a href=&quot;#%EA%B7%B8-%EC%99%B8&quot; aria-label=&quot;그 외 permalink&quot; class=&quot;heading-anchor after&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;인턴과 B1ND 팀 활동 외에도 &lt;strong&gt;해커톤&lt;/strong&gt;이나 &lt;strong&gt;공모전&lt;/strong&gt;, &lt;strong&gt;개인 프로젝트&lt;/strong&gt; 등 여러 가지 활동한 것이 많았어요!&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://velog.io/@jce1407/2021-DGSW-%ED%95%B4%EC%BB%A4%ED%86%A4-%ED%9A%8C%EA%B3%A0%EB%A1%9D&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;교내 여름 해커톤&lt;/a&gt;에서 금상도 타고, 연합해커톤에서 다른 마이스터고 학생들과 &lt;strong&gt;한글코딩 및 라이브쉐어 조합으로&lt;/strong&gt; 협업도 해보고, 개인 프로젝트로 실 서비스까지 진행해 보았어요!&lt;/p&gt;
&lt;h3 id=&quot;dgit&quot; style=&quot;position:relative;&quot;&gt;DGIT&lt;a href=&quot;#dgit&quot; aria-label=&quot;dgit permalink&quot; class=&quot;heading-anchor after&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;DGIT은 학생들의 경쟁심리를 자극해 &lt;strong&gt;더 나은 개발 문화&lt;/strong&gt; 및 &lt;strong&gt;동기부여&lt;/strong&gt;의 목적으로 개발한 프로젝트에요.&lt;br&gt;
프로젝트를 진행하면서 전에는 해보지 못한 테스팅과 반응형, CI/CD, 배포까지 진행하면서 더 애착이 가는 프로젝트랍니다😊&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;DGIT이 궁금하시다면 &lt;a href=&quot;https://github.com/Clzzi/DGIT_V2_Client&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;레포지토리&lt;/a&gt;를 방문해주세요!&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;마무리&quot; style=&quot;position:relative;&quot;&gt;마무리&lt;a href=&quot;#%EB%A7%88%EB%AC%B4%EB%A6%AC&quot; aria-label=&quot;마무리 permalink&quot; class=&quot;heading-anchor after&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;올해는 잊지 못할 많은 일들이 있었어요, 힘들기도 했지만 다 자양분이 된다고 생각하면서 노력했던것같아요.&lt;br&gt;
2021년도 알차게 보낸것같습니다!&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;올해의 흔적들&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/Clzzi/DGIT_V2_Client&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;DGIT&lt;/a&gt; / &lt;a href=&quot;https://github.com/TEAM-gimhanul/front-end&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;연합해커톤&lt;/a&gt; / &lt;a href=&quot;https://velog.io/@jce1407&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;공부한것들&lt;/a&gt; / &lt;a href=&quot;https://github.com/Clzzi&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;깃허브&lt;/a&gt; / &lt;a href=&quot;https://github.com/2021-summer-hackerthon/web&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;교내해커톤&lt;/a&gt; / ETC&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;</content:encoded></item></channel></rss>