<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>오물오물 개발일기</title>
    <link>https://baegofda.tistory.com/</link>
    <description>항상 배고픈자의 개발공부</description>
    <language>ko</language>
    <pubDate>Wed, 13 May 2026 01:23:32 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>baegofda_</managingEditor>
    <image>
      <title>오물오물 개발일기</title>
      <url>https://tistory1.daumcdn.net/tistory/4026391/attach/375b9272f38e48f89991485c08bf48ae</url>
      <link>https://baegofda.tistory.com</link>
    </image>
    <item>
      <title>2025~2026 1분기 회고</title>
      <link>https://baegofda.tistory.com/264</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span&gt; &amp;zwj;♂️&lt;/span&gt; &lt;b&gt;빠르다 빨라&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image.png&quot; data-origin-width=&quot;736&quot; data-origin-height=&quot;589&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/WpOrW/dJMb99MPWre/ovSg63fnklzjZuw8B5OIxk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/WpOrW/dJMb99MPWre/ovSg63fnklzjZuw8B5OIxk/img.png&quot; data-alt=&quot;무한도전&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/WpOrW/dJMb99MPWre/ovSg63fnklzjZuw8B5OIxk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FWpOrW%2FdJMb99MPWre%2FovSg63fnklzjZuw8B5OIxk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;400&quot; data-filename=&quot;image.png&quot; data-origin-width=&quot;736&quot; data-origin-height=&quot;589&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;무한도전&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;세월이 참 빠르다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기억은 휘발되기 마련이니&lt;br /&gt;어느 때보다도 급변하는 지금&lt;br /&gt;더 늦기 전에 지금을 기록한다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span&gt; &lt;/span&gt; &lt;b&gt;안녕..&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;입사 초기 때부터 같이 했던 백엔드 팀원들이 퇴사했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;바쁜 시기를 함께했고&lt;br /&gt;괴로운 소리를 내고 있는 서비스를 고쳐가며&lt;br /&gt;같이 빛을 볼 그날을 고대했는데&lt;br /&gt;나에게는 욕심이었던 것 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내 노력으로 지키지 못한 부분들이 또 생겨나는 순간들이었다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span&gt; &lt;/span&gt; &lt;b&gt;안녕?&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;빈자리가 익숙해지기 전에 다시 좋은 팀원들을 만날 수 있었다.&lt;br /&gt;새로운 활력은 좋은 동력이 되어 다시 앞으로 나아가기만 하면 될 것 같았다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;❓&lt;/span&gt; &lt;b&gt;갑자기요..&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (1).png&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;338&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bDshkZ/dJMcag6iHxp/RSv4nzR4VG3XYiHFgYsP0k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bDshkZ/dJMcag6iHxp/RSv4nzR4VG3XYiHFgYsP0k/img.png&quot; data-alt=&quot;무한도전&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bDshkZ/dJMcag6iHxp/RSv4nzR4VG3XYiHFgYsP0k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbDshkZ%2FdJMcag6iHxp%2FRSv4nzR4VG3XYiHFgYsP0k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;338&quot; data-filename=&quot;image (1).png&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;338&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;무한도전&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;좋은 동력의 열기와&lt;br /&gt;아직 무더운 여름도 못 보냈던 8월&lt;br /&gt;나에게는 싸늘해지는 소식이 전해졌다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;저 퇴사해요&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;갑작스러운 팀 리드님의 퇴사 통보였다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  &lt;b&gt;데자뷰?&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (3).png&quot; data-origin-width=&quot;400&quot; data-origin-height=&quot;492&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kxWFT/dJMcaf7m0P0/b3t228IE04ckkK0i7ys8Kk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kxWFT/dJMcaf7m0P0/b3t228IE04ckkK0i7ys8Kk/img.png&quot; data-alt=&quot;무한도전&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kxWFT/dJMcaf7m0P0/b3t228IE04ckkK0i7ys8Kk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkxWFT%2FdJMcaf7m0P0%2Fb3t228IE04ckkK0i7ys8Kk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;492&quot; data-filename=&quot;image (3).png&quot; data-origin-width=&quot;400&quot; data-origin-height=&quot;492&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;무한도전&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;뭔가.. 겪어봤던..&lt;br /&gt;그런 느낌이 들었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;한순간 많은 생각과 감정이 스쳐 지나갔으나,&lt;br /&gt;상황을 정리해 봤다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우리 팀은 개발 파트와 기획/디자인 파트 두 파트가 나눠진 상태로&lt;br /&gt;기획/디자인 파트는 파트 리드 없이 개발자인 팀 리드님과 내가 팀을 운영하고 있었다.&lt;br /&gt;신규 팀원들은 아직 서비스에 대한 이해도가 많이 부족한 상황에&lt;br /&gt;나는 개발된 서비스의 신규 기능 개발과 유지 보수를 주로 진행했고&lt;br /&gt;개발 중인 서비스는 팀 리드님의 의존도가 큰 상황이었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러한 상황에 갑작스러운 퇴사는&lt;br /&gt;조직적으로 상당히 뼈아픈 상황이었다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지금 돌이켜보면 &lt;br /&gt;구조상, 상황상 발생할 수 있는 일이었다.&lt;br /&gt;&lt;br /&gt;이미 발생했던 이탈을 고려한다면,&lt;br /&gt;&quot;팀 리드님이 나가면 팀이 어떻게 될까&quot;라는 질문을 한 번이라도 진지하게 했어야 했다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;  1보 후퇴&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가장 먼저 마음먹은 일은 팀 재정비계획이었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;상황상 어쩔 수 없이 팀 내 도메인 지식 편증이 심했고,&lt;br /&gt;이 상황에 기존 인력 이탈이 연달아 발생하며 이슈 대응에도 많은 리소스와 리스크를 감내해야 했다.&lt;br /&gt;(*체감상 당시 안정성&amp;middot;생산성은 0.25~0.4 수준이라고 느꼈었다.)&lt;br /&gt;때문에, 신규 개발보다는 서비스 전반적인 안정성과 생산성 회복이 우선이라고 생각헀다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;  2보 전진&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;재정비 계획의 목표는 안정성&amp;middot;생산성을 0.9~1 수준으로 복구하는 것을 목표로 하였으며&lt;br /&gt;팀 내 &lt;b&gt;버스 팩터(Bus Factor)&lt;/b&gt;지수를 상승시키는 걸 목표로 했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;목표 달성을 위해 안정성, 리스크 감소 , 효율성/생산성 , 지속 가능성 4가지 키워드를 선정했다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;안정성
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;정산&amp;middot;CMS&amp;middot;정기결제&amp;middot;이슈 대응 및 &lt;b&gt;운영 핵심 영역&lt;/b&gt;에 대한 &lt;b&gt;문서화/시각화&lt;/b&gt;하여 &lt;b&gt;운영 안정성&lt;/b&gt;을 &lt;b&gt;향상&lt;/b&gt; 시킨다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;전체적인 맥락 파악&lt;/b&gt; &lt;b&gt;및 도메인 지식 습득&lt;/b&gt;을 통해 &lt;b&gt;안정적인 서비스 설계&lt;/b&gt;를 할 수 있도록 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;리스크 감소
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;신규 서비스 개발 전략 수정을 통해 &lt;b&gt;지연 리스크&lt;/b&gt;와 &lt;b&gt;기획&amp;middot;개발&amp;harr;실무 사이의 갭&lt;/b&gt;에서 발생하는 위험을 줄인다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;효율성/생산성
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;도메인 지식 편중 해소를 기반으로 업무 방식 전환&lt;/li&gt;
&lt;li&gt;리소스 전환이 수월하고 서비스 배포 리듬을 높여 상태로 만들어 &lt;b&gt;효율성/생산성을 향상&lt;/b&gt;한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;지속 가능성
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;HR 변동에 대한 공백 최소화 &amp;amp; 단기간 온보딩&lt;/b&gt;이 가능하도록 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;부족한 문서와 가이드화, 신규 서비스 개발의 점진적 배포 전략 수립 등 각 직군 별 의견을 모았고&lt;br /&gt;팀 리드 위주로 돌아가던 업무 방식을 각 직군별로 일을 위임하여 오너십을 강화하는 방향으로 계획했다.&lt;br /&gt;팀원들의 적극적인 참여로 빠르게 준비할 수 있었고 전사에 공유하여 재정비 계획을 진행할 수 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이로인해 2보 전진을 위한 기틀을 마련할 수 있었다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span&gt; &lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (2).png&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;338&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bFIDLz/dJMcaibZYO7/9zOIt715iBkiHfKHULpbY0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bFIDLz/dJMcaibZYO7/9zOIt715iBkiHfKHULpbY0/img.png&quot; data-alt=&quot;무한도전&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bFIDLz/dJMcaibZYO7/9zOIt715iBkiHfKHULpbY0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbFIDLz%2FdJMcaibZYO7%2F9zOIt715iBkiHfKHULpbY0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;338&quot; data-filename=&quot;image (2).png&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;338&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;무한도전&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어느새 겨울이었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;날씨만큼이나 추운 스타트업 시장으로 인해&lt;br /&gt;계획했던 신규 서비스 개발보다는 생존을 위한 개발을 우선적으로 진행했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러나 야속하게도 다른 곳에서 비즈니스에 큰 영향을 주는 이슈가 발생하며&lt;br /&gt;많은 복잡한 감정들을 느끼는 시기를 보냈다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아직 우리의 입춘은 오지 않은 것 같다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span data-token-index=&quot;0&quot;&gt;&lt;span&gt; &lt;/span&gt; &lt;b&gt;앞으로의 나&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;22d2d6.jpg&quot; data-origin-width=&quot;512&quot; data-origin-height=&quot;371&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c1DO67/dJMcabDVjrt/V3eL5QzkkShn0c9UcOIviK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c1DO67/dJMcabDVjrt/V3eL5QzkkShn0c9UcOIviK/img.jpg&quot; data-alt=&quot;무한도전&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c1DO67/dJMcabDVjrt/V3eL5QzkkShn0c9UcOIviK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc1DO67%2FdJMcabDVjrt%2FV3eL5QzkkShn0c9UcOIviK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;512&quot; height=&quot;371&quot; data-filename=&quot;22d2d6.jpg&quot; data-origin-width=&quot;512&quot; data-origin-height=&quot;371&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;무한도전&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최근에는 AI가 많은 부분을 바꾸고 있다.&lt;br /&gt;과거에는 불가능했던, 생각하기 어려웠던 일들을 가능하게 만들고 있고 더 많은 걸 할 수 있게 되었다.&lt;br /&gt;지금 이 순간에도 세상의 속도는 파멸적일 만큼 빠르게 변하고 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그런데 돌아보면 나는 그 속도를 따라가려는 마음에 쫓기고 있었던 것 같다.&lt;br /&gt;이탈을 쫓고, 안정성을 쫓고, 시장을 쫓았다.&lt;br /&gt;그러다 보니 정작 제때 던졌어야 할 질문들을 자꾸 미뤄두고 있었다.&lt;br /&gt;&amp;ldquo;팀 리드님이 나가면 팀은 어떻게 될까&amp;rdquo;, &amp;ldquo;지금 가장 취약한 의존성은 어디인가&amp;rdquo;, &amp;ldquo;내가 없어도 굴러가는 구조인가&amp;rdquo; 같은 질문들이다.&lt;br /&gt;바쁘다는 이유로, 아직은 내 몫이 아니라는 이유로, 중요한 질문들을 뒤로 미뤄왔던 것 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 흐름을 어떻게 지나가야 할지 고민하던 와중에, 문득 유퀴즈에서 봤던 한 문장이 떠올랐다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;세상의 속도에 맞추지 않고 방향에 맞추는 어른이 되고 싶어요&amp;rdquo; - &lt;a href=&quot;https://youtu.be/n8iz6hnChCQ?si=g_UCVIozZLWCZ94Z&amp;amp;t=1026&quot;&gt;유퀴즈&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결국 중요한 건 방향이라는 생각이 들었다.&lt;br /&gt;속도는 내가 온전히 통제할 수 없지만,&lt;br /&gt;어떤 방향으로 갈지는 스스로 정할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앞으로는 해왔던 일을 더 잘해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;팀 안의 의존성을 읽고, 필요한 질문을 먼저 던지고, 문제가 되기 전에 말할 수 있는 사람이 되어야 한다고 생각한다.&lt;br /&gt;돌아보면 내가 놓친 건 기술 자체라기보다 그런 감각에 더 가까웠다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 안 했던 일들도 해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오래 미뤄두었던 백엔드와 앱 영역까지 조금씩 시야를 넓혀가려 한다. &lt;br /&gt;프론트에만 머물러 있던 동안 보지 못했던 의존성들이 있었고, &lt;br /&gt;그 보이지 않음이 결국 적지 않은 비용이 된다는 것을 배웠다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;쫓기지 않고, 내 방향으로 나아가자&lt;/p&gt;</description>
      <category>회고록</category>
      <category>개발자회고</category>
      <author>baegofda_</author>
      <guid isPermaLink="true">https://baegofda.tistory.com/264</guid>
      <comments>https://baegofda.tistory.com/264#entry264comment</comments>
      <pubDate>Tue, 21 Apr 2026 04:17:07 +0900</pubDate>
    </item>
    <item>
      <title>  2023~2024 개발자 회고</title>
      <link>https://baegofda.tistory.com/263</link>
      <description>&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt; &amp;zwj;  늦었다&amp;nbsp;&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;박명수어록.jpg&quot; data-origin-width=&quot;420&quot; data-origin-height=&quot;313&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bIDt3I/btsLLMVnesk/QZ3umKkz1sIcGsjEqGM5m1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bIDt3I/btsLLMVnesk/QZ3umKkz1sIcGsjEqGM5m1/img.jpg&quot; data-alt=&quot;무한도전&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bIDt3I/btsLLMVnesk/QZ3umKkz1sIcGsjEqGM5m1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbIDt3I%2FbtsLLMVnesk%2FQZ3umKkz1sIcGsjEqGM5m1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;420&quot; height=&quot;313&quot; data-filename=&quot;박명수어록.jpg&quot; data-origin-width=&quot;420&quot; data-origin-height=&quot;313&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;무한도전&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;무한도전 박명수 어록 중 하나인 이 장면은 바로 다음 아래의 문장이 이어진다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&quot;늦었다고 생각할 땐 너무 늦은거다. 그러니 지금 당장 시작해라&quot;&lt;br /&gt;&lt;br /&gt;- 거성 박명수&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;바쁘다는 핑계로 지난 2년간 돌아볼 시간이 없었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러니 지금이라도 2년간의 회고를 해보려 한다.&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;  춥다&lt;/b&gt;&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;물이 빠지면 누가 발가벗고 수영을 하고 있었는지 알 수 있다.&lt;br /&gt;&lt;/span&gt;- 워렌 버핏&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2023년도 초 겨울이었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;계절과 함께 스타트업 시장이 얼어붙었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;미국 금리 인상으로 인한 여파, 스타트업 투자 심리 위축 등등 많은 원인들이 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이미 벌어진 일이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;징조는 있었지만 대비하지 못한 스타트업들에게는 치명적이었고 (대비를 위한 시간이 부족했을지도 모른다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;후속 투자를 받지 못한 많은 스타트업들이 무너졌다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;그렇다. 수영장에 물이 빠지고 있었다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;곳곳에서 희망퇴직, 권고사직 등 안 좋은 소식이 들려왔고 스타트업을 다루는 드라마 속 줄거리를 듣는 것 같아 현실성이 없었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 내가 그 드라마 속의 등장인물이 될 줄은 몰랐다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;많은 변화와 미래를 구상하던 시기는 당장에 생존을 위한 시기가 되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만남이 중요하듯 헤어짐도 중요하다. 하지만 이 시기의 헤어짐은 옳지 못했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;답답하고 아쉬운 마음에 작성해서 발송했던 메일은 다른 구성원의 제보로 인하여&amp;nbsp;&lt;a href=&quot;https://www.news1.kr/it-science/game-review/4954365&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;기사&lt;/a&gt;로도 다뤄졌다.&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt; &amp;zwj;  이직 그리고 또 이직&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;두 번의 이직을 했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;처음 이직한 팀의 규모는 작지만 괜찮은 비즈니스라고 생각했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오랜만의 이직이었고 새로운 업무 환경에서 내 경험을 살려서 일할 수 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #444447; text-align: start;&quot;&gt;하지만 시간이 지날수록&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;비즈니스&lt;span style=&quot;background-color: #ffffff; color: #444447; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;방향성에 대한&lt;span style=&quot;background-color: #ffffff; color: #444447; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;공감성이 많이 떨어졌다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결국, 약 9개월이라는 짧은 기간을 보낸 후 또다시 이직을 했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(이직 이후 이 팀도 결국 후속 투자 유치에 실패했다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나는 도전적이고, 더 성장하며 지속 가능할 만한 규모 있는 팀을 원했다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;제로투원(0 to 1)을 실현해야하고 (&lt;b&gt;도전적이고&lt;/b&gt;)&lt;br /&gt;팀원들도 있고 이끌어줄 팀 리드님도 있으며 (&lt;b&gt;더 성장하며&lt;/b&gt;)&lt;br /&gt;시리즈 B단계의 500억 이상 투자를 받은, 업계 1위의 지속 가능성 있는 (&lt;b&gt;지속 가능할 만한 규모 있는&lt;/b&gt;)&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;빌딩중인 팀을 찾았고 이직을 했다.&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;  쉽지 않네...&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;업력 약 6년, 비즈니스의 규모는 성장했는데 시스템은 성장하지 못했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;엑셀이 import 기능이 있는지도 script를 사용할 수 있다는 걸 이때 처음 알았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오랜 기간 모든 비즈니스는 엑셀로 이루어졌고 수많은 엑셀은 서비스 시스템이자 DB였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(온보딩 당시 엑셀의 구조는 흡사 ERD를 보는 듯 헀다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 성능 좋은 엑셀은 데이터 한 번을 확인하기 위해 자칫 몇 분이 걸리기도 했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;팀의 목표는 엑셀을 개발 기반의 시스템으로 변경하는 DT(&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;Digital Transformation&lt;/span&gt;)과정이 목표였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;합류 당시엔 벌써 프로젝트가 진행되고 있었고 오픈이 얼마 안 남은 시점이었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만, 합류 직후 진행 상황을 확인했을 때 프로젝트 진행률은 처참했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(처음엔 내가 업무 파악을 잘못하여 오픈 시점을 오해한 줄 알았다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;짧은 기간 적은 인원으로 다수의 프로젝트를 진행, 오픈해야 하는 상황이었고 팀에는 디자이너, 기획 직군도 없었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;외주로 이 부분을 해소하려 했으나 외주 인원도 이탈했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정립된 시스템이 아니라 사람과 사람으로 운영해온 서비스는 많은 예외사항들이 존재했으나 이 부분이 정리되지 않았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시간은 너무 없고 개발자는 부족했다. 절망할 시간도 없었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로젝트 기한을 맞추기 위한 생산성을 향상을 위해&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;외주 인원 이탈 전 와이어프레임 기반으로 내부 UI 라이브러리를 구축했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(디자인시스템 구축의 경험이 너무 감사했다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기획/정책 수립은 개발과 함께 맞물려 진행되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하루에 14~18시간은 일했다. 주말, 공휴일도 없었다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;이직 전 가벼운 마음으로 처음 봤던 선녀신점, 타로들이 떠올랐다.&lt;br /&gt;(공통적으로 &quot;어딜가도 힘들꺼다. 그냥 있어라&quot;라는 말을 했다.)&lt;br /&gt;&lt;br /&gt;구인/구직 플랫폼으로 오는 연락들도 계속 아른거렸다.&lt;br /&gt;하지만 버텼다. 과도한 업무량은 버틸 수 있었다. 이전에도 해봤다.&lt;br /&gt;또, 이 힘든 시기는 짧은 기간 동안 팀원들과 빠르게 친해질 수 있었고 좋았다.&lt;/blockquote&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;2개월~3개월이 된 시점 서비스는 오픈을 곧 앞두고 있었다.&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;  &lt;b&gt;네...????&lt;/b&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;나는&amp;nbsp;&lt;a href=&quot;https://jojoldu.tistory.com/675&quot;&gt;신뢰 자본&lt;/a&gt;이라는 용어를 좋아한다.&lt;br /&gt;새 조직에서의&amp;nbsp;&lt;b&gt;신뢰 자본&lt;/b&gt;은&amp;nbsp;&lt;b&gt;0&lt;/b&gt;이다.&lt;br /&gt;새로운 리더, 새로운 팀원은 &lt;b&gt;신뢰 대출&lt;/b&gt;로 시작한다.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;행복할 줄 알았던 서비스 오픈은 더 지옥 같았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;부실했던 기획, 일정, 인력은 당연하게도 서비스의 이슈로 돌아왔고 하루하루 수많은 이슈가 인입되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오픈 이후에도 이슈 처리/안정화를 위해 과도한 업무량은 지속됐다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우리 팀을 빌딩 하는 과정에는 회사에 먼저 합류하신 새로운 개발 리드님, 기존 회사 구성원이셨던 분 2분이 계셨다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서비스가 오픈 되었지만 많은 이슈는 팀에 대한 불신으로 다가왔다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우리 팀은 신뢰 대출의 부채는 계속 쌓여만 갔다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래도 이렇게 버티고 나면 밝은 미래가 올 줄 알았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;언제였을까? 바쁘게 보내던 와중에 소식을 들었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;팀 빌딩의 주축이 되었던 두 분이 각자의 사정으로 휴직하신다고&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;네...????&lt;/b&gt;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;  제가요...?&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;팀 그리고 개발 파트를 이끌 사람들이 필요했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;감사하게도 좋게 봐주신 덕분에 부족한 내가 그 중 다음 후임자로 추천되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;제가요...?&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;처음엔 거절했다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;팀의 신뢰 대출 부채는 엄청났고 업무는 긴 터널과 같이 끝이 보이질 않았다.&lt;br /&gt;준다고 하던 보상은 너무나도 부족했다. 팀의 사기는 바닥이었다.&lt;br /&gt;처음인데, 내가 할 수 있을지 의문이었다.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;독이 든 성배와 같았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 누군가는 해야 하는 일이고 감당해야 하는 무게였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #444447; text-align: start;&quot;&gt;또, &lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;앞으로 &lt;/span&gt;내 개발 커리어에서 감당해야 할 책임은 계속 커질 것이고&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #444447; text-align: start;&quot;&gt;어떤 리더로&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;성장할지&lt;span style=&quot;background-color: #ffffff; color: #444447; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;고민해 볼&lt;span style=&quot;background-color: #ffffff; color: #444447; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;수 있는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;기회이기도 했다.&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;  &lt;b&gt;이번 생은 처음이니까&lt;/b&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&quot;얼마나 잘 되려고 이럴까?&quot;&lt;br /&gt;&lt;/span&gt;&quot;내 인생이 점점 버라이어티해지는군, 재밌겠어.&quot;&lt;br /&gt;&quot;에피소드 하나 더 생긴다고 생각하지, 뭐&quot;&lt;br /&gt;- 천우희, 유퀴즈온더블럭&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #444447; text-align: start;&quot;&gt;단순히 개발팀원이 아닌 파트 리드로서의 기간은 &lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #444447; text-align: start;&quot;&gt;부족한 점을 알게 되고 자기 객관화에 대해 생각해보고 변화하는 계기가 되었다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; color: #444447; text-align: start;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #444447; text-align: start;&quot;&gt;과거보다는 돌발 상황에 대해 관점이 바뀌었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #444447; text-align: start;&quot;&gt;MBTI도 ISTJ에서 ENTJ로&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;바뀌게 되었고&lt;span style=&quot;background-color: #ffffff; color: #444447; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;내가 좋아하는 일이 뭔지 좀 더&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;고민해 보게&lt;span style=&quot;background-color: #ffffff; color: #444447; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;되었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #444447; text-align: start;&quot;&gt;(인생을 좀 더 열심히 살게 된 기분이다.)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #444447; text-align: start;&quot;&gt;이번 생은 처음이니까 미숙하고 모르는게 많다.&lt;/span&gt;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;  앞으로의 나&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정말 많은 일이 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;비즈니스적으로도 위기가 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지금도 진행 중인 문제들이 있고 결과를 기다리고 있는 문제, 해결해야 하는 문제가 많다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개발 관점에서의 성장은 많이 이루지 못했지만 다른 부분으로 성장할 수 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어떤 리더로 성장할지, 팀원들이 많이 지쳤고 힘든데 내가 팀원들에게 어떤 도움이 되고 있는지 정확히는 알 지 못한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이전의 동기부여는 나 자신의 관점이 컸다면 지금은 내 주변 사람들이 동기부여가 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지키고 싶은 것들은 계속 늘어나고 욕심도 생긴다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만, 내 노력으로 지키지 못하는 부분들이 더 많다는 걸 계속 깨닫고 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내가 좋아하는 영화 &amp;lt;리틀 포레스트&amp;gt;에 '아주심기'라는 용어가 나온다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어쩌면, 나도 '아주심기'를 준비하고 있는지도 모른다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;옮겨심으며 혹독한 겨울을 견딘 양파가 훨씬 달고 단단하듯이 좌절과 방황을 겪고 나면 더 단단해질 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러면 뿌리내릴 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스터디를 꾸준히 해보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;배우고 싶은걸 배워보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;더욱 단단해지기 위해 매 순간 열심히 하자.&lt;/p&gt;</description>
      <category>회고록</category>
      <category>개발자회고</category>
      <category>프론트엔드</category>
      <category>프론트엔드개발자</category>
      <author>baegofda_</author>
      <guid isPermaLink="true">https://baegofda.tistory.com/263</guid>
      <comments>https://baegofda.tistory.com/263#entry263comment</comments>
      <pubDate>Mon, 13 Jan 2025 05:23:52 +0900</pubDate>
    </item>
    <item>
      <title>  bundling &amp;amp; webpack</title>
      <link>https://baegofda.tistory.com/238</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt; &lt;b&gt; 급변하는 프론트엔드 환경&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;웹 개발에 있어서 프론트엔드의 급변하는 환경을 대부분은 &lt;b&gt;모던 Javascript&lt;/b&gt;(&lt;b&gt;ECMA2015&lt;/b&gt;)이후 부터 시작되었다고 대부분은 알고있지만&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정확히는 &lt;b&gt;ECMA2015&lt;/b&gt;부터가 아닌 그 이전부터 있었습니다. 바로 &lt;b&gt;Node.js&lt;/b&gt;, &lt;b&gt;npm&lt;/b&gt;을 통해 이루어지는 환경에서 시작되었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;웹앱의 규모가 굉장히 커져감에 따라 더욱더 급변하고 복잡해집니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;소프트웨어 하나를 만든다는 가정을 하면 규모가 어느정도일까요? 규모가 큰 웹앱은 수백만 수천만 라인의 코드가 될 수도 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이코드들이 또 하나의 파일로는 작업할 수 없기때문에 수십, 수백개 이상의 파일이 하나의 어플리케이션을 위한 규모입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 이것들이 왜 프로젝트 구성을 복잡하게하는 원인이 되었을까요?&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt; &lt;b&gt; 스펙의 필요성&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Javascript&lt;/b&gt;는 초기엔 &lt;b&gt;HTML&lt;/b&gt;을 조작하기위해 간단히 만들어진 언어입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;언어의 초기 컨셉 자체가 그러다보니 수만개의 소스코드를 가지고 하나의 애플리케이션을 만들기위한 기능들이 준비가 되어있지 않았습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대부분의 언어에서 지원하던 &lt;b&gt;module&lt;/b&gt;스펙이 없었기 때문에 많은 파일로 하나의 애플리케이션을 만든다고 하였을때 문제가 되었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Javascript&lt;/b&gt;는 이러한 &lt;b&gt;module&lt;/b&gt;을 &lt;b&gt;ECMA2015&lt;/b&gt;부터 지원하였었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;module&lt;/b&gt;스펙은 파일과 파일간에 특정기능을 사용하기 위함입니다. 자바스크립트는 &lt;code&gt;export&lt;/code&gt;와 &lt;code&gt;import&lt;/code&gt;의 형태로 지원을합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그런데 왜 이 스펙이 개발 환경을 복잡하게 만드는 원인이 되었을까요?&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;❗&lt;b&gt; 원인&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;HTML&lt;/b&gt;에서 JS파일을 사용하기 위해서는 &lt;code&gt;script&lt;/code&gt;태그를 이용하여 파일을 로딩하였었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그럼 10개의 파일이있다면 &lt;code&gt;script&lt;/code&gt;태그가 10개, 100개라면 &lt;code&gt;script&lt;/code&gt;태그를 100개 작성해야 할까요?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실제로도 그럴 수 밖에 없었기때문에 병목현상은 물론이거니와 &lt;code&gt;export&lt;/code&gt;, &lt;code&gt;import&lt;/code&gt;가 생겼지만 문제가 있었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;바로 &lt;b&gt;브라우저 호환성 이슈&lt;/b&gt;입니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt; &lt;b&gt; 호환성과 생산성 사이&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;웹 프론트엔드 개발자가 새로운 스펙을 사용할때 제일 먼저 떠오르는것은 &lt;b&gt;브라우저 호환성&lt;/b&gt;입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;웹은 누구에게나 공평하고 서비스를 하는 입장에서는 사용자가 어떤 환경에서 사용할지 강제하는것은 굉장히 어렵습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;때문에 웹 개발자들은 &lt;b&gt;브라우저 호환성&lt;/b&gt;을 최대한 넓게 가져가는것이 중요합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 &lt;b&gt;Javascript&lt;/b&gt;는 매년 새로운 버전과 문법이 나오고있으며 이미 현업에서 없어서는 안되는 스펙들도 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러한 스펙은 &lt;b&gt;생산성&lt;/b&gt;또한 높아지기 때문에 개발자들은 사용하고 싶으나 지원을 하지않는 브라우저들 때문에 사용할 수 없는 경우도 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이때 여러 엔지니어링 시도가 이루어집니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt; &lt;b&gt; 번들러의 등장&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Node.js&lt;/b&gt;는 브라우저 외의 환경에서 &lt;b&gt;Javascript&lt;/b&gt;를 동작하게 해주며 &lt;b&gt;Javascript&lt;/b&gt;개발자들은 여러 툴을 만들고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;npm&lt;/b&gt;을 통해 배포를 하기가 쉬워집니다. 이러한 상황에서 &lt;b&gt;번들러&lt;/b&gt;라는 소프트웨어가 나옵니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;번들러는&lt;/b&gt; 브라우저가 &lt;code&gt;script&lt;/code&gt;를 부르기전에 미리 하나의 파일로 만들어둡니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그럼 &lt;b&gt;HTML&lt;/b&gt;은 하나의 JS파일만 부르면 됩니다. 물론 &lt;b&gt;번들링&lt;/b&gt;이라는 행위에서 문제가 없지는 않습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 &lt;b&gt;번들링&lt;/b&gt;을 사용하며 &lt;b&gt;module&lt;/b&gt;이라는 스펙을 사용할 수 없는 환경에서도 사용할 수 있게 되었습니다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  번들러 종류&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 사용되는 번들러들은 webpack, parcel, rollup 등이 있습니다.&lt;br /&gt;이중 가장 많이 사용되는 번들러는 webpack 입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://sambalim.tistory.com/137&quot;&gt;webpack vs parcel vs rollup 번들러 비교하기&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt; &lt;b&gt; 번들러의 역할&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://miro.medium.com/max/1634/0*MztcXroPHZ5nkHOS.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실제 &lt;b&gt;번들러&lt;/b&gt;는 여러 JS파일을 하나로 합치는것 뿐만아니라 .jpg, .png, .sass 등등 여러 유형의 파일들을 하나로 합쳐줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;번들러&lt;/b&gt;의 기본 개념은 위에서 말한것과 같지만 &lt;b&gt;번들링&lt;/b&gt;이라는 처음의 작업을 해보니 이상의 무언가를 해보자 했을때 여러 유형의 작업을 하게되었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러한 측면으로 보자면&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;합치는 중에 필요없는 소스코드를 제거하면 어떨까?&quot;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;이미지도 최적화 시켜보고 소스코드를 난독화 하기위한 작업들도 해보면 어떨까?&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여러 아이디어들로 현재의 &lt;b&gt;번들러&lt;/b&gt;가 나오게 된것입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한 가장중요한 작업은 &lt;b&gt;트랜스파일러&lt;/b&gt; 작업입니다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;번들링중에 모던 Javascript를 ES5로 변환하는 트랜스파일러작업을 하면 어떨까?&quot;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;그러면 구형 브라우저에서도 최신의 스펙들을 사용할 수 있을텐데..&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같은 아이디어를 통해 &lt;b&gt;번들러&lt;/b&gt;들은 &lt;b&gt;트랜스파일러&lt;/b&gt; 작업 또한 &lt;b&gt;babel&lt;/b&gt;과 연동하여 &lt;b&gt;ECMA2015&lt;/b&gt;, &lt;b&gt;TS&lt;/b&gt;, &lt;b&gt;React&lt;/b&gt; 등을 지원하게됩니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt; &lt;b&gt; 웹팩과 바벨&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제부터 간단하게 바벨과 웹팩을 셋팅하는 법을 알아보겠습니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt; &lt;b&gt; babel 설치하기&lt;/b&gt;&lt;/h3&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 바벨의 기본 모듈들을 설치합니다.&lt;/p&gt;
&lt;pre class=&quot;llvm&quot;&gt;&lt;code&gt;yarn add @babel/core @babel/cli @babel/preset-env --dev&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모듈들의 역할은 아래와 같습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;@babel/core : 바벨의 핵심 기능들을 포함&lt;/li&gt;
&lt;li&gt;@babel/cli : 터미널에서 바벨 명령어를 사용할 수 있게 도와줌&lt;/li&gt;
&lt;li&gt;@babel/preset-env : 코드 구문 변환 설정을 도와줌 (지원 브라우저 점유율, 호환성 설정 등)&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;@babel/preset-env은 함께 사용되어야하는 플러그인을 모아둔것이며.&lt;br /&gt;공식 Babel 프리셋은 아래와 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;@babel/preset-env&lt;br /&gt;@babel/preset-flow&lt;br /&gt;@babel/preset-react&lt;br /&gt;@babel/preset-typescript&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;원하는 다른 플러그인이 있다면 babel 공식 홈페이지에서 확인이 가능합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://babeljs.io/docs/en/&quot;&gt;https://babeljs.io/docs/en/&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모듈을 설치하였다면 .babelrc파일을 생성 후 &lt;code&gt;presets&lt;/code&gt;를 작성합니다.&lt;/p&gt;
&lt;pre class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot;&gt;&lt;code&gt;{
  &quot;presets&quot;: [&quot;@babel/preset-env&quot;]
}&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt; &lt;b&gt; 웹팩 설치하기&lt;/b&gt;&lt;/h3&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;웹팩 또한 모듈들을 설치합니다.&lt;/p&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;yarn add webpack webpack-cli webpack-dev-server --dev
yarn add babel-loader style-loader css-loader --dev
yarn add html-webpack-plugin --dev
yarn add sass sass-loader --dev&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모듈들의 역할은 아래와 같습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;webpack: 웹팩 모듈&lt;/li&gt;
&lt;li&gt;webpack-cli: 터미널에서 웹팩 명령어를 사용할 수 있게 도와줌&lt;/li&gt;
&lt;li&gt;webpack-dev-server: nodemon과 같이 웹팩 환경에서 개발서버를 생성&lt;/li&gt;
&lt;li&gt;babel-loader: 웹팩과 바벨을 연동&lt;/li&gt;
&lt;li&gt;css-loader: 웹팩이 css파일을 읽을 수 있도록 도와줌&lt;/li&gt;
&lt;li&gt;html-webpack-plugin: 번들링된 html파일에 css와 js파일들을 추가해줌&lt;/li&gt;
&lt;li&gt;sass-loader: 웹팩이 sass파일을 읽을 수 있도록 도와줌&lt;/li&gt;
&lt;li&gt;모듈을 설치하였다면 webpack.config.js파일을 생성합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot;&gt;&lt;code&gt;//webpack.config.js
const HtmlWebpackPlugin = require(&quot;html-webpack-plugin&quot;);

module.exports = {
  mode: &quot;development&quot;,
  entry: &quot;./src/index.js&quot;,
  output: {
    filename: &quot;bundle.js&quot;,
  },
  module: {
    rules: [
      {
        test: /\.(js|jsx)$/,
        exclude: /node_modules/,
        use: {
          loader: &quot;babel-loader&quot;,
        },
      },
      {
        test: /\.s?css$/,
        use: [&quot;style-loader&quot;, &quot;css-loader&quot;, &quot;sass-loader&quot;],
      },
      {
        test: /\.html$/,
        use: [
          {
            loader: &quot;html-loader&quot;,
            options: {
              minimize: true,
            },
          },
        ],
      },
    ],
  },

  devServer: {
    host: &quot;localhost&quot;,
    port: 3000,
    open: true,
  },

  plugins: [
    new HtmlWebpackPlugin({
      template: &quot;./index.html&quot;,
    }),
  ],
};&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각각의 옵션에대한 설명은 아래와 같습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;mode: &lt;code&gt;production&lt;/code&gt;, &lt;code&gt;development&lt;/code&gt;, &lt;code&gt;none&lt;/code&gt; 세가지 옵션을 사용할 수 있는데 사용한 옵션에 따라 웹팩에서 내부적으로 최적화를 해준다.&lt;/li&gt;
&lt;li&gt;entry: 번들링을 시작할 파일을 결정할 수 있다. 멀티 페이지 번들링시 여러 파일을 설정할 수 있다.&lt;/li&gt;
&lt;li&gt;module: 다양한 모듈들을 처리하는 방법들을 결정한다. js파일, ts파일을 포함한 이미지파일, 스타일 파일 등 웹팩을 통해 번들링 되는 모든 파일들의 처리 방법을 설정하며 좀전에 설정한 바벨 또한 이 곳에서 설정한다. module을 설정할 때 중요한 부분은 loader를 읽을때 오른쪽에서 왼쪽으로 loader가 실행되기 때문에 sass-loader의 경우 css-loader보다 오른쪽에 위치시켜야 한다. (typescript의 경우에는 babel-loader 오른쪽에 ts-loader를 위치시켜야 한다.)&lt;/li&gt;
&lt;li&gt;devServer: 개발 서버에 대한 설정을 할 수 있다. 에러처리, 포트 설정, 기본 path 등 여러 옵션을 설정할 수 있다.&lt;/li&gt;
&lt;li&gt;output: 웹팩을 통해 최종적으로 번들링 된 파일을 저장할 위치를 설정한다.&lt;/li&gt;
&lt;li&gt;plugins: 웹팩에 적용할 플러그인들을 설정한다.&lt;/li&gt;
&lt;li&gt;추가적으로 &lt;code&gt;package.json&lt;/code&gt;에 &lt;code&gt;scripts&lt;/code&gt;를 작성합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;json&quot;&gt;&lt;code&gt;// package.json
{
  &quot;name&quot;: &quot;webpack&quot;,
  &quot;version&quot;: &quot;1.0.0&quot;,
  &quot;main&quot;: &quot;index.js&quot;,
  &quot;license&quot;: &quot;MIT&quot;,
  &quot;scripts&quot;: {
    &quot;build&quot;: &quot;webpack&quot;,
    &quot;start&quot;: &quot;webpack serve --mode development&quot;
  },
  &quot;devDependencies&quot;: {
    &quot;@babel/cli&quot;: &quot;^7.14.5&quot;,
    &quot;@babel/core&quot;: &quot;^7.14.5&quot;,
    &quot;@babel/preset-env&quot;: &quot;^7.14.5&quot;,
    &quot;babel-loader&quot;: &quot;^8.2.2&quot;,
    &quot;css-loader&quot;: &quot;^5.2.6&quot;,
    &quot;html-loader&quot;: &quot;^2.1.2&quot;,
    &quot;html-webpack-plugin&quot;: &quot;^5.3.1&quot;,
    &quot;sass&quot;: &quot;^1.34.1&quot;,
    &quot;sass-loader&quot;: &quot;^12.1.0&quot;,
    &quot;style-loader&quot;: &quot;^2.0.0&quot;,
    &quot;webpack&quot;: &quot;^5.38.1&quot;,
    &quot;webpack-cli&quot;: &quot;^4.7.2&quot;,
    &quot;webpack-dev-server&quot;: &quot;^3.11.2&quot;
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음 테스트를 위한 코드를 작성합니다.&lt;/p&gt;
&lt;pre class=&quot;html xml&quot; data-ke-language=&quot;html&quot;&gt;&lt;code&gt;&amp;lt;!-- index.html --&amp;gt;
&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang=&quot;en&quot;&amp;gt;
  &amp;lt;head&amp;gt;
    &amp;lt;meta charset=&quot;UTF-8&quot; /&amp;gt;
    &amp;lt;meta http-equiv=&quot;X-UA-Compatible&quot; content=&quot;IE=edge&quot; /&amp;gt;
    &amp;lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot; /&amp;gt;
    &amp;lt;title&amp;gt;bundling&amp;lt;/title&amp;gt;
  &amp;lt;/head&amp;gt;
  &amp;lt;body&amp;gt;
    &amp;lt;h1 class=&quot;card-title&quot;&amp;gt;Card Title&amp;lt;/h1&amp;gt;
    &amp;lt;button class=&quot;btn-change&quot;&amp;gt;버튼 변경&amp;lt;/button&amp;gt;
  &amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot;&gt;&lt;code&gt;//src/btn.js
const btnChange = document.querySelector(&quot;.btn-change&quot;);
export { btnChange };&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot;&gt;&lt;code&gt;//src/color.js
const cardTitle = document.querySelector(&quot;.card-title&quot;);
const changeColor = function (color) {
  cardTitle.style.backgroundColor = color;
};
export { changeColor };&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot;&gt;&lt;code&gt;//src/index.js
import &quot;../style.scss&quot;;
import { btnChange } from &quot;./btn&quot;;
import { changeColor } from &quot;./color&quot;;
btnChange.addEventListener(&quot;click&quot;, function () {
  changeColor(&quot;pink&quot;);
});
console.log(&quot;Hello World&quot;);&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;css&quot; data-ke-language=&quot;css&quot;&gt;&lt;code&gt;//style.scss
body {
  background-color: #369fff;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이후 &lt;code&gt;build&lt;/code&gt;와 &lt;code&gt;start&lt;/code&gt;를 실행해보면 정상적으로 작동됨을 확인할 수 있습니다.&lt;/p&gt;</description>
      <category>지식</category>
      <category>Bundling</category>
      <category>webpack</category>
      <category>번들</category>
      <category>번들러</category>
      <category>번들링</category>
      <category>오물오물</category>
      <category>웹팩</category>
      <category>자바스크립트</category>
      <category>프론트엔드</category>
      <category>프론트엔드면접</category>
      <author>baegofda_</author>
      <guid isPermaLink="true">https://baegofda.tistory.com/238</guid>
      <comments>https://baegofda.tistory.com/238#entry238comment</comments>
      <pubDate>Thu, 5 Oct 2023 04:15:33 +0900</pubDate>
    </item>
    <item>
      <title>  2022 회고 - 2년차 프론트엔드 개발자 회고</title>
      <link>https://baegofda.tistory.com/261</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt; &amp;nbsp;벌써 끝이라고?&lt;br /&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;490&quot; data-origin-height=&quot;368&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ucEXw/btrURpLKL8M/uoccx0xbwUzuKqAJrK3HV1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ucEXw/btrURpLKL8M/uoccx0xbwUzuKqAJrK3HV1/img.png&quot; data-alt=&quot;심슨&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ucEXw/btrURpLKL8M/uoccx0xbwUzuKqAJrK3HV1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FucEXw%2FbtrURpLKL8M%2Fuoccx0xbwUzuKqAJrK3HV1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;아아아앍!!&quot; loading=&quot;lazy&quot; width=&quot;320&quot; height=&quot;240&quot; data-origin-width=&quot;490&quot; data-origin-height=&quot;368&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;심슨&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;이맘때쯤 &lt;a href=&quot;https://baegofda.tistory.com/247&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;1년 차 회고&lt;/a&gt;를 작성했었는데 벌써 1년이라는 시간이 더 흘렀다.&lt;br /&gt;많은 작업을 했고 많은 일들이 있었고 많은 고민들이 있었으며 많은 인연들이 있었다.&lt;br /&gt;아직 정리되지 않은 이 기분으로 한 해를 마무리해야 한다니..&lt;br /&gt;아쉽기도 하지만 더 나은 미래를 위해 어김없이 2022년 회고를 작성한다.  &lt;br /&gt;&lt;a href=&quot;https://skyline.github.com/baegofda/2022&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;열심히 했다!!&lt;/a&gt;&lt;/blockquote&gt;
&lt;figure id=&quot;og_1672651056641&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;@baegofda's 2022 GitHub Skyline&quot; data-og-description=&quot;Please rotate your device Visit in desktop for the best experience.&quot; data-og-host=&quot;skyline.github.com&quot; data-og-source-url=&quot;https://skyline.github.com/baegofda/2022&quot; data-og-url=&quot;https://skyline.github.com/baegofda/2022&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/Ksvua/hyQ8UGsCsx/lEbqRzANNbejWzKmZBR9P0/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/bcEBcA/hyQ6YDIHP0/mQnC0ZaeqTkZDakdBFv1o1/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://skyline.github.com/baegofda/2022&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://skyline.github.com/baegofda/2022&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/Ksvua/hyQ8UGsCsx/lEbqRzANNbejWzKmZBR9P0/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/bcEBcA/hyQ6YDIHP0/mQnC0ZaeqTkZDakdBFv1o1/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;@baegofda's 2022 GitHub Skyline&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Please rotate your device Visit in desktop for the best experience.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;skyline.github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  &lt;b&gt;변화의 시작&lt;br /&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;1440&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bo3936/btrUQaBl3Az/PmBvuWibqGERkJdzXzvkpk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bo3936/btrUQaBl3Az/PmBvuWibqGERkJdzXzvkpk/img.png&quot; data-alt=&quot;새로운 월세방..&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bo3936/btrUQaBl3Az/PmBvuWibqGERkJdzXzvkpk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbo3936%2FbtrUQaBl3Az%2FPmBvuWibqGERkJdzXzvkpk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;320&quot; height=&quot;427&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;1440&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;새로운 월세방..&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;올해는 이사로 시작하였다. 하지만 이사를 진행해야 하는 주에 다리에 화상을 입어서 힘들었던 기억이 난다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;&lt;s&gt;(한동안 정말 지옥 같았다.)&lt;/s&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이사와 함께 모회사의 개발 조직과 서서히 합쳐지며 새로운 조직으로 탈바꿈 되고 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;초기에는 기존 성수동 사무실에 몇 분만 합류하여 프로젝트를 진행했고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5월 즈음 시청역 인근의 사무실의 준비가 완료되며 드디어 개발 조직의 모든 인원이 한곳에 모일 수 있었다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;1440&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qlyht/btrUV4Neyf7/DMoWWMRUamFTuPKd4dsWbk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qlyht/btrUV4Neyf7/DMoWWMRUamFTuPKd4dsWbk/img.png&quot; data-alt=&quot;시청 사무실의 라운지&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qlyht/btrUV4Neyf7/DMoWWMRUamFTuPKd4dsWbk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fqlyht%2FbtrUV4Neyf7%2FDMoWWMRUamFTuPKd4dsWbk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;320&quot; height=&quot;427&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;1440&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;시청 사무실의 라운지&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우리들의 빅픽처는 이제 시작이였다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt; &amp;nbsp;험난한 여정의 출발&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;397&quot; data-origin-height=&quot;318&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bGiU4t/btrURoTGurd/l8KA10BtknKpuDuKNQWzPK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bGiU4t/btrURoTGurd/l8KA10BtknKpuDuKNQWzPK/img.jpg&quot; data-alt=&quot;무한도전&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bGiU4t/btrURoTGurd/l8KA10BtknKpuDuKNQWzPK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbGiU4t%2FbtrURoTGurd%2Fl8KA10BtknKpuDuKNQWzPK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;험난한 여정의 출바알!&quot; loading=&quot;lazy&quot; width=&quot;320&quot; height=&quot;256&quot; data-origin-width=&quot;397&quot; data-origin-height=&quot;318&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;무한도전&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;조직이 출발선에서 점점 멀어지는 동안에 많은 일들이 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;팀이 개편되고 새로운 서비스를 준비하고 엎어지고 다시 팀이 개편되고 또 개편되고.. 엄청난 혼돈의 시기였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;작지 않은 조직 간의 통합이다 보니 어찌 보면 당연한 일이었을 것이다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;735&quot; data-origin-height=&quot;540&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/87pKV/btrURpykhiO/nFHihUs0kk1vefESJ8rx50/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/87pKV/btrURpykhiO/nFHihUs0kk1vefESJ8rx50/img.png&quot; data-alt=&quot;심슨&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/87pKV/btrURpykhiO/nFHihUs0kk1vefESJ8rx50/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F87pKV%2FbtrURpykhiO%2FnFHihUs0kk1vefESJ8rx50%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;아&amp;amp;#44; 모든 사람은 실수를 해&quot; loading=&quot;lazy&quot; width=&quot;320&quot; height=&quot;235&quot; data-origin-width=&quot;735&quot; data-origin-height=&quot;540&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;심슨&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;이 혼돈 속에서 나는 전적 검색팀 소속으로 Laravel 기반으로 되어있는 프로젝트를 하나씩 포팅 하는 작업을 진행하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;한 개의 서비스에 약 1~2달가량의 일정.. 초기 프로젝트들은 Nuxt.js로 진행하였다가 이후 Next.js로 기술 스택을 전환하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;뿐만 아니라 새로운 스택들을 하나씩 추가하며 거의 다 다른 스택들로 진행되었으며 새로운 개발자들과 팀으로 프로젝트를 진행하기도 하고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;혼자 진행하기도 하고.. &lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;출발 신호를 듣자마자 바쁘게 달려오니&lt;/span&gt; 4개의 서비스에 대한 작업을 진행하였고 한 해의 끝을 달리고 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 시기 동안 기술들을 바꾸고 적용해나아가며 각각의 프레임워크, 라이브러리들의 특징들을 파악하며 사용할 수 있었고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;많은 이슈들을 해결하며 빠르게 성장하게 된 발판이 되었다. 내부 팀에서 사용할 공통 모듈을 만들어 배포도 해보고 필요에 따라&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;직접 만들며 좀 더 깊숙이 언어에 대한 이해도를 높여갈 수 있었다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아쉬운 점도 상당히 많다. 좀 더 여유가 있었더라면 더 잘 만들었을 것 같은 부분도 있고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로젝트 진행 후 정리를 할 시간도 없이 바로 다음 프로젝트를 진행하다 보니 자체 서비스 개발보다는 사내 외주 팀이 된 느낌이었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;&lt;s&gt;(이러려고 자체 서비스 회사에 들어왔나 자괴감이 들어..)&lt;/s&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어느 순간부터 이러한 아쉬움들과 고민들은 점점 커져만 갔다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;  금융 치료&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;168&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mtnM9/btrUYPploBl/Y8wbqbIa2sfhYB6Ra3UkAK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mtnM9/btrUYPploBl/Y8wbqbIa2sfhYB6Ra3UkAK/img.jpg&quot; data-alt=&quot;놀면 뭐하니?&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mtnM9/btrUYPploBl/Y8wbqbIa2sfhYB6Ra3UkAK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmtnM9%2FbtrUYPploBl%2FY8wbqbIa2sfhYB6Ra3UkAK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;얼마나 주실 수 있는데요?&quot; loading=&quot;lazy&quot; width=&quot;320&quot; height=&quot;179&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;168&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;놀면 뭐하니?&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;9월 즈음 첫 연봉 협상을 진행했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현 직장은 연봉 협상 시기가 오면 본인의 성과, RNR 등등  본인의 가치를 증명할 문서를 작성해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;처음 작성해 보는 거라 막막했지만 틈틈이 정리해두었던 이력서를 보며 질문지를 작성해나아갔다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;걱정과 달리 만족스러운 결과로 협상을 마무리할 수 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;잠시나마 치료가 되는듯하였으나 연봉이 높아진 만큼 부담감과 걱정, 고민은 점점 커져만 갔다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt; ️ &lt;b&gt; &amp;zwj; &lt;/b&gt; 떠나자, 워케이션!!&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1440&quot; data-origin-height=&quot;1080&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cqPJVi/btrU2JPYuP5/cw6Mong6lWhYpqT0gWJEI1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cqPJVi/btrU2JPYuP5/cw6Mong6lWhYpqT0gWJEI1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cqPJVi/btrU2JPYuP5/cw6Mong6lWhYpqT0gWJEI1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcqPJVi%2FbtrU2JPYuP5%2Fcw6Mong6lWhYpqT0gWJEI1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;320&quot; height=&quot;240&quot; data-origin-width=&quot;1440&quot; data-origin-height=&quot;1080&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;생각도 정리하고 새로운 자극을 위해 속초로 첫 워케이션을 떠났다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;한 주 동안 속초에서 원격으로 근무를 진행하고 바다를 보며 기분 전환을 하며 보냈다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 시기에 많은 생각들을 정리할 수 있었고 새로운 환경에서 오히려 업무 집중도가 높아지며 상당히 만족스러운 워케이션을 보낼 수 있었다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1440&quot; data-origin-height=&quot;1080&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Oega9/btrU0vEMpoG/sqWkLpacgkKIDR6cstkm00/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Oega9/btrU0vEMpoG/sqWkLpacgkKIDR6cstkm00/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Oega9/btrU0vEMpoG/sqWkLpacgkKIDR6cstkm00/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FOega9%2FbtrU0vEMpoG%2FsqWkLpacgkKIDR6cstkm00%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;320&quot; height=&quot;240&quot; data-origin-width=&quot;1440&quot; data-origin-height=&quot;1080&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;속초에서 돌아온 후 새로운 환경의 중요성을 깨달은 나는 집의 가구 구조도 바꾸고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;요즘은 원격 근무날에 &lt;a href=&quot;https://www.jibmusil.com/sites/wangsimni&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;집무실&lt;/a&gt;이라는 공유 오피스에서 업무를 보며 나의 환경을 계속 바꿔주고있다.&lt;/p&gt;
&lt;figure id=&quot;og_1672481043134&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;집무실, 집 근처 사무실&quot; data-og-description=&quot;분산 오피스 1등, 근사한 업무 공간&quot; data-og-host=&quot;www.jibmusil.com&quot; data-og-source-url=&quot;https://www.jibmusil.com/sites/wangsimni&quot; data-og-url=&quot;https://www.jibmusil.com/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/dKlnG4/hyQ5GcaNyB/B0EdLfyd5oaqwsTnK4fZlk/img.jpg?width=1200&amp;amp;height=628&amp;amp;face=0_0_1200_628,https://scrap.kakaocdn.net/dn/bYcoYl/hyQ60fK9zH/aw07QOE47PbiexMt8XZvX1/img.jpg?width=1920&amp;amp;height=560&amp;amp;face=0_0_1920_560,https://scrap.kakaocdn.net/dn/5lkSC/hyQ5DT2ArC/TA0E7WhglKXdRDJAodkyk1/img.jpg?width=500&amp;amp;height=660&amp;amp;face=0_0_500_660&quot;&gt;&lt;a href=&quot;https://www.jibmusil.com/sites/wangsimni&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.jibmusil.com/sites/wangsimni&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/dKlnG4/hyQ5GcaNyB/B0EdLfyd5oaqwsTnK4fZlk/img.jpg?width=1200&amp;amp;height=628&amp;amp;face=0_0_1200_628,https://scrap.kakaocdn.net/dn/bYcoYl/hyQ60fK9zH/aw07QOE47PbiexMt8XZvX1/img.jpg?width=1920&amp;amp;height=560&amp;amp;face=0_0_1920_560,https://scrap.kakaocdn.net/dn/5lkSC/hyQ5DT2ArC/TA0E7WhglKXdRDJAodkyk1/img.jpg?width=500&amp;amp;height=660&amp;amp;face=0_0_500_660');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;집무실, 집 근처 사무실&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;분산 오피스 1등, 근사한 업무 공간&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.jibmusil.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;  &lt;a href=&quot;https://youtu.be/Bjj-8r8Ih0Y&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;만남은 쉽고 이별은 어려워...&lt;/a&gt;  &lt;br /&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;743&quot; data-origin-height=&quot;408&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/k2Z2c/btrU43HjSWM/TsrS1HNWT1RqO36FcmDpx0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/k2Z2c/btrU43HjSWM/TsrS1HNWT1RqO36FcmDpx0/img.jpg&quot; data-alt=&quot;무한도전&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/k2Z2c/btrU43HjSWM/TsrS1HNWT1RqO36FcmDpx0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fk2Z2c%2FbtrU43HjSWM%2FTsrS1HNWT1RqO36FcmDpx0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;320&quot; height=&quot;176&quot; data-origin-width=&quot;743&quot; data-origin-height=&quot;408&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;무한도전&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;당연하게도 많은 일들이 지나가는 동안 많은 인연들을 만나고 떠나보내야 했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;불안정한 환경은 이탈자를 만들었고 각자의 이해관계로 인해 원하는 길을 찾아 떠났다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;더 나은 미래의 기대감으로 출발했지만 아쉽게도 떠나는 구성원들을 보며 '과연 맞는 길인가?'에 대한 생각이 들었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;떠나간 빈자리들은 새롭게 채워졌다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그중 인턴분을 처음 맞이하게 됐었는데 너무 잘해주셔서 놀랐고 오히려 내가 많이 배운 시간이 되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;비록 인턴 기간 이후 같이 하지 못하게 되었지만 어쩌면 안일해질 뻔한 나에게는 좋은 자극이 되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음에는 더 좋은 곳에서 만날 수 있으면 좋겠다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;  이끌거나, 따르거나, 참거나&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;개인의 성장뿐만아니라 외적인 환경에도 많이 스트레스를 받았던 한 해였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히 바뀌는 업무 방식과 형식에 대해서 많은 답답함을 느끼고 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;업무 방식이란건 정답이 있는 게 아니라 업무를 처리함에 있어서 팀마다의 효율적인 방식을 찾는 게 업무 방식이라고 생각되는데&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;본인들이 정한 방식을 다른 구성원들에게까지 강요하길 바라는지 아직도 이해가 되지는 않는다. 하지만 참아보기로 했다.&lt;/span&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;그래도 안되면 떠나자. 훈련을 해봐도 도저히 납득이 되지 않거나 내가 또 다른 여행을 떠날 준비가 되었다면 떠나자. 하지만 그 전에 최소 10번은 참는 훈련을 해보자. 참다보면 인내심도 길러진다. 홧병이 나는 거 아닌가싶지만 회사는 회사일 뿐이고, 일은 일일 뿐이다. 일에 대한 감정을 나의 세계관으로 가지고 와서 스트레스를 받지 말자는 것이다. 조금 더 차분하게 기다리고 지켜보면 사실 별 것도 아니다. 그냥 지나가는 일일수도 있고, 아니면 무시하면 된다. 그러니 떠나기 전에 참아보자.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; color: #9d9d9d;&quot;&gt;&lt;a style=&quot;color: #9d9d9d;&quot; href=&quot;https://careerly.co.kr/comments/43424&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;span style=&quot;color: #9feec3;&quot;&gt;이끌거나, 따르거나, 참거나&lt;/span&gt;&lt;/a&gt; 에서...&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내가 원하는 업무 방식이나 스타일에 대해 좀 더 명확하게 알 수 있었던 성찰의 기회가 되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 와서는 결국 우리 서비스가 뭘 목표로 나아가겠다는 건지 모르겠지만 현재는 '내년엔 뭐라도 되겠지'라는 심정이다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;  내년엔...&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;블로그 해동이 첫번째 목표이다. 올해 22년 6월 이후로 포스팅이 중지 되었는데&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사실 블로그를 이전할지 말지 고민만 하다가 한 해가 지나갔다. 아직 정하지는 못했으나 포스팅은 다시 시작할 예정이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;두번째로는 알고리즘 공부를 해야겠다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다른 이유보다는 코테의 목적이고 스타트업 시장이 굳었고 결국 좀 더 나은 환경을 찾아가기 위해서는 코테가 기본으로 더 필요하게 되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;당장에 일을 내기 위해서라기보다는 기회가 왔을 때 놓치지 않겠다는 생각으로 미리 준비를 해둘 예정이다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;내년에 어디에서 어디 소속으로 또 이 글을 작성하고 있을지 모르겠다. 힘내자  &lt;/p&gt;</description>
      <category>회고록</category>
      <category>2022년개발자회고</category>
      <category>2022년프론트엔드회고</category>
      <category>2022년회고</category>
      <category>개발자회고</category>
      <category>오물오물</category>
      <category>오물오물개발자</category>
      <category>프론트엔드</category>
      <category>프론트엔드개발자</category>
      <category>프론트엔드회고</category>
      <author>baegofda_</author>
      <guid isPermaLink="true">https://baegofda.tistory.com/261</guid>
      <comments>https://baegofda.tistory.com/261#entry261comment</comments>
      <pubDate>Sat, 31 Dec 2022 19:56:17 +0900</pubDate>
    </item>
    <item>
      <title>  점수로 보는 개발팀들의 순위</title>
      <link>https://baegofda.tistory.com/260</link>
      <description>&lt;div&gt;국내 여러 개발팀들의 문화를 점수로 따져본다면 순위가 어떻게 될까요!?&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;ol style=&quot;list-style-type: disc;&quot; data-stringify-type=&quot;ordered-list&quot; data-indent=&quot;0&quot; data-border=&quot;0&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-stringify-indent=&quot;0&quot; data-stringify-border=&quot;0&quot;&gt;코딩 테스트 인터뷰&lt;/li&gt;
&lt;li data-stringify-indent=&quot;0&quot; data-stringify-border=&quot;0&quot;&gt;자율적 개인 개발 장비 선택&lt;/li&gt;
&lt;li data-stringify-indent=&quot;0&quot; data-stringify-border=&quot;0&quot;&gt;자율적 팀 개발 환경 선택&lt;/li&gt;
&lt;li data-stringify-indent=&quot;0&quot; data-stringify-border=&quot;0&quot;&gt;소스 코드 리뷰 및 테스트&lt;/li&gt;
&lt;li data-stringify-indent=&quot;0&quot; data-stringify-border=&quot;0&quot;&gt;개발자 기여 로드맵/백로그&lt;/li&gt;
&lt;li data-stringify-indent=&quot;0&quot; data-stringify-border=&quot;0&quot;&gt;지속적 통합 및 배포 (CI/CD)&lt;/li&gt;
&lt;li data-stringify-indent=&quot;0&quot; data-stringify-border=&quot;0&quot;&gt;내부 소스 레포지터리 공유&lt;/li&gt;
&lt;li data-stringify-indent=&quot;0&quot; data-stringify-border=&quot;0&quot;&gt;API를 기반한 연동 및 소통&lt;/li&gt;
&lt;li data-stringify-indent=&quot;0&quot; data-stringify-border=&quot;0&quot;&gt;기술을 이해하는 팀장/매니저&lt;/li&gt;
&lt;li data-stringify-indent=&quot;0&quot; data-stringify-border=&quot;0&quot;&gt;개발자 레벨 혹은 경력 관리&lt;/li&gt;
&lt;li data-stringify-indent=&quot;0&quot; data-stringify-border=&quot;0&quot;&gt;참여형 지식 공유 플랫폼&lt;/li&gt;
&lt;li data-stringify-indent=&quot;0&quot; data-stringify-border=&quot;0&quot;&gt;개발자 관계(DevRel) 활동&lt;/li&gt;
&lt;li data-stringify-indent=&quot;0&quot; data-stringify-border=&quot;0&quot;&gt;위의 모든 사항이 해당 안된다. - (13일의 금요일..)&lt;/li&gt;
&lt;/ol&gt;
&lt;div&gt;등의 총 13가지 질문을 가지고 설문 조사를 실시하였고 총 415명의 개발자가 참여하였습니다.&lt;br /&gt;이에 따라 해당 하는 항목에 1점씩 점수를 매겨서 통계를 냈다고 하네요.&lt;br /&gt;설문조사 결과 상위권으로는&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-stringify-type=&quot;unordered-list&quot; data-indent=&quot;0&quot; data-border=&quot;0&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-stringify-indent=&quot;0&quot; data-stringify-border=&quot;0&quot;&gt;12점 &amp;ndash; 카카오, 라인플러스, 우아한형제들, 컴투스, 업스테이지 등&lt;/li&gt;
&lt;li data-stringify-indent=&quot;0&quot; data-stringify-border=&quot;0&quot;&gt;11점 &amp;ndash; 네이버, 엔에이치엔, 하이퍼커넥트, 데브시스터즈, 크몽, 에이비일팔공 등&lt;/li&gt;
&lt;li data-stringify-indent=&quot;0&quot; data-stringify-border=&quot;0&quot;&gt;10점 &amp;ndash; 카카오뱅크, 크래프톤, 안랩, 당근마켓, 드림어스컴퍼니, 마이리얼트립, 원티드랩 등&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;이 있습니다.&lt;br /&gt;&lt;br /&gt;재미로 한번 보시면 좋을 듯 합니다.&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;http://channy.creation.net/blog/1600?fbclid=IwAR3owU8wL6sPzqxf2-xGJ2yZT0QIfbhDL5cIsx4u7S0vJCvVYpCY3oKaKZ4&amp;amp;fs=e&amp;amp;s=cl&quot;&gt;http://channy.creation.net/blog/1600?fbclid=IwAR3owU8wL6sPzqxf2-xGJ2yZT0QIfbhDL5cIsx4u7S0vJCvVYpCY3oKaKZ4&amp;amp;fs=e&amp;amp;s=cl&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1656477461576&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;국내 최고의 개발 문화를 가진 회사는? &amp;ndash; 설문 조사 결과 :: Channy's Blog&quot; data-og-description=&quot;예전에 &amp;quot;훌륭한 개발 문화의 이면&amp;quot;이라는 시리즈를 연재한 적이 있습니다. 최근 IT 기업 사이에서 개발자 연봉이나 복지&quot; data-og-host=&quot;channy.creation.net&quot; data-og-source-url=&quot;http://channy.creation.net/blog/1600?fbclid=IwAR3owU8wL6sPzqxf2-xGJ2yZT0QIfbhDL5cIsx4u7S0vJCvVYpCY3oKaKZ4&amp;amp;fs=e&amp;amp;s=cl&quot; data-og-url=&quot;http://channy.creation.net/blog/1600&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/iMwhk/hyOV1ullSS/kbrUj1CMvnht4f9qscbWUK/img.png?width=1294&amp;amp;height=636&amp;amp;face=0_0_1294_636,https://scrap.kakaocdn.net/dn/bkSMlC/hyOUTSddZA/8KH9nQrVlH5veQ9KxjjoVK/img.png?width=1294&amp;amp;height=636&amp;amp;face=0_0_1294_636,https://scrap.kakaocdn.net/dn/xLRsC/hyOUVP1Tls/nOKbiokgsbJayVIPW2Rw7K/img.png?width=940&amp;amp;height=649&amp;amp;face=0_0_940_649&quot;&gt;&lt;a href=&quot;http://channy.creation.net/blog/1600?fbclid=IwAR3owU8wL6sPzqxf2-xGJ2yZT0QIfbhDL5cIsx4u7S0vJCvVYpCY3oKaKZ4&amp;amp;fs=e&amp;amp;s=cl&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;http://channy.creation.net/blog/1600?fbclid=IwAR3owU8wL6sPzqxf2-xGJ2yZT0QIfbhDL5cIsx4u7S0vJCvVYpCY3oKaKZ4&amp;amp;fs=e&amp;amp;s=cl&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/iMwhk/hyOV1ullSS/kbrUj1CMvnht4f9qscbWUK/img.png?width=1294&amp;amp;height=636&amp;amp;face=0_0_1294_636,https://scrap.kakaocdn.net/dn/bkSMlC/hyOUTSddZA/8KH9nQrVlH5veQ9KxjjoVK/img.png?width=1294&amp;amp;height=636&amp;amp;face=0_0_1294_636,https://scrap.kakaocdn.net/dn/xLRsC/hyOUVP1Tls/nOKbiokgsbJayVIPW2Rw7K/img.png?width=940&amp;amp;height=649&amp;amp;face=0_0_940_649');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;국내 최고의 개발 문화를 가진 회사는? &amp;ndash; 설문 조사 결과 :: Channy's Blog&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;예전에 &quot;훌륭한 개발 문화의 이면&quot;이라는 시리즈를 연재한 적이 있습니다. 최근 IT 기업 사이에서 개발자 연봉이나 복지&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;channy.creation.net&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>기타</category>
      <category>baegofda</category>
      <category>개발문화</category>
      <category>개발자</category>
      <category>개발자문화</category>
      <category>개발팀문화</category>
      <category>배고프다</category>
      <category>오물오물</category>
      <author>baegofda_</author>
      <guid isPermaLink="true">https://baegofda.tistory.com/260</guid>
      <comments>https://baegofda.tistory.com/260#entry260comment</comments>
      <pubDate>Wed, 29 Jun 2022 13:39:49 +0900</pubDate>
    </item>
    <item>
      <title>  Stack Overflow Survey 2022 개발자 설문조사</title>
      <link>https://baegofda.tistory.com/259</link>
      <description>&lt;div&gt;스택오버플로우에서 2022 개발자 설문조사 통계가 나왔습니다.&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-stringify-type=&quot;unordered-list&quot; data-indent=&quot;0&quot; data-border=&quot;0&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-stringify-indent=&quot;0&quot; data-stringify-border=&quot;0&quot;&gt;전문 개발자와 개발을 배우는 사람들이 가장 많이 사용하는 Web Framework는 Node.js, React.js가 공통으로 압도적입니다.&lt;/li&gt;
&lt;li data-stringify-indent=&quot;0&quot; data-stringify-border=&quot;0&quot;&gt;ASP.NET&lt;span&gt;&amp;nbsp;&lt;/span&gt;Core과&lt;span&gt;&amp;nbsp;&lt;/span&gt;ASP.NET은 전문 개발자는 높으나 개발을 배우는 사람들 쪽에서는 순위가 낮아지네요.  &lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;li data-stringify-indent=&quot;0&quot; data-stringify-border=&quot;0&quot;&gt;언어 중 Loved &amp;amp; Dreaded 순위 중 1위는 Rust이며 약 87%의 개발자들이 계속 사용하고 싶다고 합니다. (최근&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://news.hada.io/topic?id=6830&amp;amp;utm_source=slack&amp;amp;utm_medium=bot&amp;amp;utm_campaign=T052V0Z28&quot; data-stringify-link=&quot;https://news.hada.io/topic?id=6830&amp;amp;utm_source=slack&amp;amp;utm_medium=bot&amp;amp;utm_campaign=T052V0Z28&quot; data-sk=&quot;tooltip_parent&quot; data-remove-tab-index=&quot;true&quot;&gt;리눅스 커널에도 머지가 될 예정&lt;/a&gt;이라고 하는..)&lt;/li&gt;
&lt;li data-stringify-indent=&quot;0&quot; data-stringify-border=&quot;0&quot;&gt;배우고 싶은 언어에서는 Rust가 1위 그 밑으로 파이썬과 타입스크립트가 근소한 차이로 2위 3위를 하고 있습니다.&amp;nbsp;&lt;/li&gt;
&lt;li data-stringify-indent=&quot;0&quot; data-stringify-border=&quot;0&quot;&gt;IDE 의 Loved &amp;amp; Dreaded IDE 순위 중 1위는 NeoVim 2위는 VSCode 입니다.&lt;/li&gt;
&lt;li data-stringify-indent=&quot;0&quot; data-stringify-border=&quot;0&quot;&gt;돈을 가장 많이 받는 언어는 Clojure네요 ! Dart는 구글에서 열심히 밀고 있는데 최하위권에 머무르고 있습니다. (아마 아직까지는 수요가 낮아서 그런거일지도)&lt;/li&gt;
&lt;li data-stringify-indent=&quot;0&quot; data-stringify-border=&quot;0&quot;&gt;협업 툴에서는 1위로 노션이 가장 많이 사용되고 있고 계속 사용 할 예정이라는 답변이 66.82% 입니다. 하지만 사용하고 싶은 툴에서는 Jira Work Management, Trello 가 1위 2위를 차지했습니다.&lt;/li&gt;
&lt;li data-stringify-indent=&quot;0&quot; data-stringify-border=&quot;0&quot;&gt;메시징 툴에서는 역시나 많이 사용되기도 원하기도 하는 툴로는 Slack이 압도적입니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;이외에 정말 많은 통계가 있습니다. 한번씩 보시는 것도 재밌을 것 같아요 !&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;a href=&quot;https://survey.stackoverflow.co/2022/#overview&quot;&gt;https://survey.stackoverflow.co/2022/#overview&lt;/a&gt;
&lt;figure id=&quot;og_1656123725386&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;Stack Overflow Developer Survey 2022&quot; data-og-description=&quot;In May 2022 over 70,000 developers told us how they learn and level up, which tools they&amp;rsquo;re using, and what they want.&quot; data-og-host=&quot;survey.stackoverflow.co&quot; data-og-source-url=&quot;https://survey.stackoverflow.co/2022/#overview&quot; data-og-url=&quot;https://survey.stackoverflow.co/2022/?utm_source=social-share&amp;amp;utm_medium=social&amp;amp;utm_campaign=dev-survey-2022&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/qmhm3/hyORDonY2Q/K71kkKrheaOvM9GuoOCJqK/img.png?width=2400&amp;amp;height=1260&amp;amp;face=0_0_2400_1260&quot;&gt;&lt;a href=&quot;https://survey.stackoverflow.co/2022/#overview&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://survey.stackoverflow.co/2022/#overview&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/qmhm3/hyORDonY2Q/K71kkKrheaOvM9GuoOCJqK/img.png?width=2400&amp;amp;height=1260&amp;amp;face=0_0_2400_1260');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Stack Overflow Developer Survey 2022&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;In May 2022 over 70,000 developers told us how they learn and level up, which tools they&amp;rsquo;re using, and what they want.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;survey.stackoverflow.co&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;/div&gt;</description>
      <category>기타</category>
      <category>개발소식</category>
      <category>개발자 설문조사</category>
      <category>개발자소식</category>
      <category>스택오버플로우</category>
      <category>오물오물</category>
      <author>baegofda_</author>
      <guid isPermaLink="true">https://baegofda.tistory.com/259</guid>
      <comments>https://baegofda.tistory.com/259#entry259comment</comments>
      <pubDate>Sat, 25 Jun 2022 11:21:07 +0900</pubDate>
    </item>
    <item>
      <title>  TypeScript 창시자 마이크로소프트(MS) JavaScript 타입구문 제안</title>
      <link>https://baegofda.tistory.com/258</link>
      <description>&lt;div&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;원문: &lt;a href=&quot;https://devblogs.microsoft.com/typescript/a-proposal-for-type-syntax-in-javascript/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&amp;nbsp;A Proposal For Type Syntax in JavaScript&lt;/a&gt;&lt;/blockquote&gt;
&lt;figure id=&quot;og_1647609861602&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;A Proposal For Type Syntax in JavaScript&quot; data-og-description=&quot;Today we&amp;rsquo;re excited to announce our support and collaboration on a new Stage 0 proposal to bring optional and erasable type syntax to JavaScript. Because this new syntax wouldn&amp;rsquo;t change how surrounding code runs, it would effectively act as comments. W&quot; data-og-host=&quot;devblogs.microsoft.com&quot; data-og-source-url=&quot;https://devblogs.microsoft.com/typescript/a-proposal-for-type-syntax-in-javascript/&quot; data-og-url=&quot;https://devblogs.microsoft.com/typescript/a-proposal-for-type-syntax-in-javascript/&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://devblogs.microsoft.com/typescript/a-proposal-for-type-syntax-in-javascript/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://devblogs.microsoft.com/typescript/a-proposal-for-type-syntax-in-javascript/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;A Proposal For Type Syntax in JavaScript&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Today we&amp;rsquo;re excited to announce our support and collaboration on a new Stage 0 proposal to bring optional and erasable type syntax to JavaScript. Because this new syntax wouldn&amp;rsquo;t change how surrounding code runs, it would effectively act as comments. W&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;devblogs.microsoft.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;br /&gt;&amp;nbsp;TypeScript를 만든 MS가 타입 구문을 JavaScript에 도입하는 Proposal(Stage 0) 제안을 발표하였습니다.&lt;br /&gt;&lt;br /&gt;곧 있을 3월의 TC39 전체 회의에서 Stage 1 제안을 제출할 계획이라고 합니다.&lt;br /&gt;&lt;br /&gt;ECMAScript 표준이 되기위해선 Proposal이 Stage 4 까지 가야 하는데 어떻게 될지 기대가 됩니다.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;TL;DR&lt;/b&gt;&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-stringify-type=&quot;unordered-list&quot; data-indent=&quot;0&quot; data-border=&quot;0&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-stringify-indent=&quot;0&quot; data-stringify-border=&quot;0&quot;&gt;빠르고 간단하게 만들고 싶은 JS 생태계에서 안전한 개발을 위한 TS, JSDoc 를 이용한 개발은 코드가 조금 많아진다.&lt;/li&gt;
&lt;li data-stringify-indent=&quot;0&quot; data-stringify-border=&quot;0&quot;&gt;이를 위해 TS 인듯 TS가 아닌 TS같은 타입 구문을 사용하는 JS 문법을 제안&lt;/li&gt;
&lt;li data-stringify-indent=&quot;0&quot; data-stringify-border=&quot;0&quot;&gt;엔진에서는 무시하나 TS, Flow 등과 같은 도구가 사용 할 수 있는 타입 구문&lt;/li&gt;
&lt;li data-stringify-indent=&quot;0&quot; data-stringify-border=&quot;0&quot;&gt;모든 브라우저, JS 런타임 환경에 TS 타입 검사를 제안하는건 아님&lt;/li&gt;
&lt;li data-stringify-indent=&quot;0&quot; data-stringify-border=&quot;0&quot;&gt;TS 호환을 함으로써 정적 타이핑에 대한 동기부여를 해주기 위함&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>기타</category>
      <category>ECMAScript</category>
      <category>JavaScript</category>
      <category>JS</category>
      <category>TS</category>
      <category>TypeScript</category>
      <author>baegofda_</author>
      <guid isPermaLink="true">https://baegofda.tistory.com/258</guid>
      <comments>https://baegofda.tistory.com/258#entry258comment</comments>
      <pubDate>Fri, 18 Mar 2022 22:27:40 +0900</pubDate>
    </item>
    <item>
      <title>  왜 CSS Framework를 도입하였는가? (feat. Tailwind CSS &amp;amp; Windi CSS)</title>
      <link>https://baegofda.tistory.com/255</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt; &lt;b&gt;&amp;nbsp;CSS Never...&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;732&quot; data-origin-height=&quot;661&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cbMF53/btrs5yoT8rk/UJMCX7QxyXMMscpzuDOB5K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cbMF53/btrs5yoT8rk/UJMCX7QxyXMMscpzuDOB5K/img.png&quot; data-alt=&quot;대다수가 공감 할만한 개발자의 고민.. 이름 짓기&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cbMF53/btrs5yoT8rk/UJMCX7QxyXMMscpzuDOB5K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcbMF53%2Fbtrs5yoT8rk%2FUJMCX7QxyXMMscpzuDOB5K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;560&quot; height=&quot;506&quot; data-origin-width=&quot;732&quot; data-origin-height=&quot;661&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;대다수가 공감 할만한 개발자의 고민.. 이름 짓기&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;개발자들의 고민은 가지각색이겠지만 대부분의 고민은 이름 짓기가 가장 고민이 크다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;변수, 함수명, 클래스명 등등.. 프론트엔드 입장에선 CSS를 작업해야 하는 경우 CSS 클래스명에 대한 고민도 크다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CSS&amp;nbsp;클래스명을 소홀히 하게되면 하나의 엘레멘트를 수정하게 되었을 때 사이드 이펙트로 다른 엘레멘트도 의도치 않게 수정하게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;때문에 대안으로 나왔던 방법들이 &lt;span style=&quot;background-color: #ffffff; color: #333333;&quot;&gt;BEM, OOCSS, SMACSS 같은 CSS 방법론들이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333;&quot;&gt;하지만 이러한 방법론들을 쓰더라도 클래스명을 짓는 데에 대한 시간적 고민은 해소되지는 않는다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333;&quot;&gt;&amp;nbsp;최근 작업하면서도 팀 내엔 프론트엔드는 2명밖에 없는데 작업량은 너무 많았다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333;&quot;&gt;시간적 여유가 없는 입장에서 손꼽은 건 기능 개발과 별개로 CSS작업을 하는 시간이 아쉬운 부분이 있었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333;&quot;&gt;처음에는 쉽다고 느끼지만 데이터가 많거나 복잡한 페이지를 만들게 되면 이만큼 난해하고 노가다성인 것도 없을 것이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333;&quot;&gt;그만큼 클래스명에 대한 고민도 많아지고 깊어진다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333;&quot;&gt;우리 팀도 마찬가지였고 이에 대한 비용을 해소하고자 고민하고 있던 와중이었다.&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt; &lt;b&gt;&amp;nbsp;깨우치다&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;연말이 되면 시기적으로 빅테크 기업들이 하나둘씩 컨퍼런스를 진행한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;때문에 오전에 시간을 내어 팀원과 같이 컨퍼런스를 시청하는 시간을 가지고 있었는데 만났다..&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://if.kakao.com/session/89&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;b&gt;functional css와 figma를 이용한 디자이너와의 웹프론트 협업 이야기 (feat. AdorableCSS)&lt;/b&gt;&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1644634694571&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;if(kakao)2021&quot; data-og-description=&quot;함께 나아가는 더 나은 세상&quot; data-og-host=&quot;if.kakao.com&quot; data-og-source-url=&quot;https://if.kakao.com/session/89&quot; data-og-url=&quot;https://if.kakao.com/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/0To68/hyNnR8WHvs/YSUtILdFhT6wQHsZfxoV41/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/JavMD/hyNn3O5PXO/cEmwMxxKFBibCMKDs7KSA1/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://if.kakao.com/session/89&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://if.kakao.com/session/89&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/0To68/hyNnR8WHvs/YSUtILdFhT6wQHsZfxoV41/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/JavMD/hyNn3O5PXO/cEmwMxxKFBibCMKDs7KSA1/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;if(kakao)2021&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;함께 나아가는 더 나은 세상&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;if.kakao.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;카카오의 컨퍼런스인 if(kakao) 2021에서 유용태 님의 세션을 듣게 되었고 많은 내용 중 우리를 일깨워 주었던 부분은&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- CSS 클래스명은 의미기반이 아닌 시각적 기능에 기반한 이름을 지은 변하지 않는 단일클래스를 작성하자&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 변하지 않는 CSS를 먼저 만들어두고 HTML에서 스타일을 조립해서 작성하자&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 의미가 없는데 의미를 부여하여 이름을 짓는 건 너무 힘들다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 위와 같은 의미 있게 지은 이름들은 다른 곳에서 재사용하기 힘들다. (다른 곳에서는 그곳에 맞는 의미를 부여했기 때문)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이후에도 많은 부분을 언급해 주셨고 이러한 패러다임은 우리의 마음을 뺏어가기에 충분했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;또한 재사용되는 엘레멘트의 클래스를 지어서 사용한다는 건 SPA에서는 해당 엘레멘트는 컴포넌트 화가 될 수 있고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;컴포넌트를 생성 시 의미 있는 컴포넌트명을 짓기 때문에 CSS 클래스 명의 의미부여 또한 해소될 수 있다고 생각했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;굳이 CSS 클래스명 + 컴포넌트명 두 번의 의미론적인 이름을 지을 필요는 없다.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt; &lt;b&gt;&amp;nbsp;프로젝트 시작과 CSS framework 도입&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;최근 다른 서비스 마이그레이션 프로젝트를 새로 시작하게 되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이전 마이그레이션 프로젝트와 다르게 새로 도입할 부분들을 고민하던 중 &lt;a href=&quot;https://tailwindcss.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Tailwind CSS&lt;/a&gt;를 도입을 고민하고 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;vue-styled-components, css modules도 고려하였지만 기존의 결정대로 Tailwind CSS를 도입하기로 결정하고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://nuxtjs.org/docs/get-started/installation&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Nuxt.js 문서&lt;/a&gt;와 &lt;a href=&quot;https://tailwindcss.com/docs/installation&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Tailwind CSS 문서&lt;/a&gt;를 보던 도중 두 사이트의 디자인이 유사하다는 걸 느끼고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Nuxtjs.org의 Tailwind 세팅이 궁금하여 &lt;a href=&quot;https://github.com/nuxt/nuxtjs.org&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Nuxtjs.org Github&lt;/a&gt;에 들어가 보았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;근데 당연히 있을 것 같았던 tailwind.config.js는 없었고 windi.config.js가 있었다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;918&quot; data-origin-height=&quot;800&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bQq1cr/btrs7riAnft/Z870KfRY9xScomhCOXcDj1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bQq1cr/btrs7riAnft/Z870KfRY9xScomhCOXcDj1/img.png&quot; data-alt=&quot;음...?&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bQq1cr/btrs7riAnft/Z870KfRY9xScomhCOXcDj1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbQq1cr%2Fbtrs7riAnft%2FZ870KfRY9xScomhCOXcDj1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;477&quot; height=&quot;415&quot; data-origin-width=&quot;918&quot; data-origin-height=&quot;800&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;음...?&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt; &lt;b&gt;&amp;nbsp;Windi CSS.. 누구냐 넌!&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1260&quot; data-origin-height=&quot;638&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/WAUVX/btrs64gP6AN/iJKsW3J9MC84KNg433CdMK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/WAUVX/btrs64gP6AN/iJKsW3J9MC84KNg433CdMK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/WAUVX/btrs64gP6AN/iJKsW3J9MC84KNg433CdMK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FWAUVX%2Fbtrs64gP6AN%2FiJKsW3J9MC84KNg433CdMK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1260&quot; height=&quot;638&quot; data-origin-width=&quot;1260&quot; data-origin-height=&quot;638&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;a href=&quot;https://windicss.org/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Windi CSS&lt;/a&gt;는 2020년 릴리즈 된 신생 CSS Framework이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Tailwind CSS와 같은 utility-first CSS Framework이며 양쪽 모두 Nuxt.js에서 초기 프로젝트 빌드시&amp;nbsp;템플릿 지원이 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특이점은 태생부터 Tailwind CSS의 대체제로 나왔으며&amp;nbsp; Tailwind CSS 2.0을 계승하여 만들어졌다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(Tailwind CSS의 최신 버전은 2021년 11월 버전 3.0 릴리즈)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그런 만큼 문법적으로 상당히 비슷하며 문서 또한 둘 다 잘 되어있다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://windicss.org/guide/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Windi CSS 문서&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1644636575143&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Windi CSS&quot; data-og-description=&quot;Next generation utility-first CSS framework.&quot; data-og-host=&quot;windicss.org&quot; data-og-source-url=&quot;https://windicss.org/guide/&quot; data-og-url=&quot;https://windicss.org/guide/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/TFYp2/hyNn05UJOc/8plmkslbF7PE2hqWemmkR1/img.png?width=2000&amp;amp;height=1000&amp;amp;face=0_0_2000_1000,https://scrap.kakaocdn.net/dn/n5sFZ/hyNnTeEPj9/GMlDnUPK7gqDATpyPZ3ooK/img.png?width=2000&amp;amp;height=1000&amp;amp;face=0_0_2000_1000&quot;&gt;&lt;a href=&quot;https://windicss.org/guide/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://windicss.org/guide/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/TFYp2/hyNn05UJOc/8plmkslbF7PE2hqWemmkR1/img.png?width=2000&amp;amp;height=1000&amp;amp;face=0_0_2000_1000,https://scrap.kakaocdn.net/dn/n5sFZ/hyNnTeEPj9/GMlDnUPK7gqDATpyPZ3ooK/img.png?width=2000&amp;amp;height=1000&amp;amp;face=0_0_2000_1000');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Windi CSS&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Next generation utility-first CSS framework.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;windicss.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt; &lt;b&gt;&amp;nbsp;왜 Windi CSS인가?&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;그렇다면 대체제라고 자처하는 만큼 더 나은 점이 무엇인가 찾아보면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Class Grouping&lt;/p&gt;
&lt;pre id=&quot;code_1644636730283&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!-- Windi CSS --&amp;gt;
&amp;lt;div class=&quot;bg-white dark:hover:(bg-gray-800 font-medium text-white)&quot;/&amp;gt;
&amp;lt;!-- Tailwind CSS --&amp;gt;
&amp;lt;div class=&quot;bg-white dark:hover:bg-gray-800 dark:hover:font-medium dark:hover:text-white&quot;/&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Shortcut (공통 클래스 선언)&lt;/p&gt;
&lt;pre id=&quot;code_1644636750516&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// windi.config.js
export default {
  theme: {
    /* ... */
  },
  shortcuts: {
    'btn': 'py-2 px-4 font-semibold rounded-lg shadow-md',
    'btn-green': 'text-white bg-green-500 hover:bg-green-700',
  },
}&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;  이외 차이점은 아래의 링크에 있으며 Tailwind CSS 3.0전의 비교 부분이라 클래스 + 수동 값 &lt;br /&gt;항목은 Tailwind CSS 3.0에도 추가되었습니다.&lt;br /&gt;&lt;a href=&quot;https://dev.to/composite/windicss-tailwindcss-4gi6&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;차이점 정리&lt;/a&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Tailwind CSS 사용하던 개발자가 속도측면에 대한 이슈를 해결하고자 만든 만큼 성능적인 측면도 우위가 있다. (참고: &lt;a href=&quot;https://windicss.org/posts/story.html&quot; data-token-index=&quot;1&quot; data-reactroot=&quot;&quot;&gt;&lt;span&gt;Windi CSS 태생에 대하여)&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; - 실제 간단 수정을 했을 경우 빌드 타임 차이가 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; - Nuxt.js &amp;amp; Tailwind CSS 템플릿으로 CSS 수정을 하려니 빌드 타임이 너무 오래 걸림&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; - 해당 이슈에 대해서도 인지를 했는지 &lt;a href=&quot;https://v2.tailwindcss.com/docs/just-in-time-mode&quot; data-token-index=&quot;1&quot; data-reactroot=&quot;&quot;&gt;JIT&lt;/a&gt;라는것을 이용해서 이슈를 해결하고자 하는 듯함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; - JIT mode를 사용하면 확실히 빌드 타임이 줄어듦 &amp;rarr; 근데 왜 기본 템플릿에는 안 넣었는지는 의문&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt; &lt;b&gt;&amp;nbsp;결론&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Nuxt.js 공식에서도 사용하고 스페셜 스폰서로 있는 만큼 좀 더 특화될 느낌이 있어서 쓰는 것이 좋아 보인다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 상대적으로 작은 Vue 커뮤니티의 서드파티 라이브러리 중 괜찮은 스타수를 받고 있어서 안정적으로 사용이 가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 차별화된 기능들이 있기 때문에 Tailwind CSS보다 좀 더 유리한 측면들이 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 로고가 더 이쁨(?)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 프로젝트를 시작하며 사용하는 중이며 개발경험은 상당히 만족스럽고 익숙해진다면 생산성 또한 높아질 것으로 예상되어 꾸준히 사용할 생각이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;아래는 카카오 웹툰에서도 왜 utility-first CSS Framework 도입했는지에 대한 글입니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://fe-developers.kakaoent.com/2022/220210-css-in-kakaowebtoon/?fbclid=IwAR2cODFA_bsj-D95ztU3akOsVWjbxC-Pu-uCLtEQznJVKHYv6_earYgkC90&quot; data-qa=&quot;message_attachment_title_link&quot;&gt;&lt;span&gt;카카오웹툰은 CSS를 어떻게 작성하고 있을까?&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1644723411482&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;카카오웹툰은 CSS를 어떻게 작성하고 있을까?&quot; data-og-description=&quot;카카오엔터테인먼트 FE 기술블로그&quot; data-og-host=&quot;fe-developers.kakaoent.com&quot; data-og-source-url=&quot;https://fe-developers.kakaoent.com/2022/220210-css-in-kakaowebtoon/?fbclid=IwAR2cODFA_bsj-D95ztU3akOsVWjbxC-Pu-uCLtEQznJVKHYv6_earYgkC90&quot; data-og-url=&quot;https://fe-developers.kakaoent.com/2022/220210-css-in-kakaowebtoon/?fbclid=IwAR2cODFA_bsj-D95ztU3akOsVWjbxC-Pu-uCLtEQznJVKHYv6_earYgkC90&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bQadJD/hyNpal6KIS/quZVsoL2pbbmig6KiTimvK/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://fe-developers.kakaoent.com/2022/220210-css-in-kakaowebtoon/?fbclid=IwAR2cODFA_bsj-D95ztU3akOsVWjbxC-Pu-uCLtEQznJVKHYv6_earYgkC90&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://fe-developers.kakaoent.com/2022/220210-css-in-kakaowebtoon/?fbclid=IwAR2cODFA_bsj-D95ztU3akOsVWjbxC-Pu-uCLtEQznJVKHYv6_earYgkC90&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bQadJD/hyNpal6KIS/quZVsoL2pbbmig6KiTimvK/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;카카오웹툰은 CSS를 어떻게 작성하고 있을까?&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;카카오엔터테인먼트 FE 기술블로그&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;fe-developers.kakaoent.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Vue</category>
      <category>CSS Framework</category>
      <category>cssframework</category>
      <category>css프레임워크</category>
      <category>nuxtJS</category>
      <category>tailwind css</category>
      <category>tailwindcss</category>
      <category>vue</category>
      <category>windi css</category>
      <category>windicss</category>
      <category>오물오물</category>
      <author>baegofda_</author>
      <guid isPermaLink="true">https://baegofda.tistory.com/255</guid>
      <comments>https://baegofda.tistory.com/255#entry255comment</comments>
      <pubDate>Sat, 12 Feb 2022 12:48:59 +0900</pubDate>
    </item>
    <item>
      <title>  Vue Custom Snippets 만들기</title>
      <link>https://baegofda.tistory.com/253</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt; &lt;b&gt;&amp;nbsp;불편해!&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;작업 시 새로운 .vue 파일을 만들 때 init snippets이 항상 불만이었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Vetur에서 제공되는 기본 snippet의 경우 아래와 같은 기본 템플릿밖에 없었습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1644072899834&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;template&amp;gt;
  
&amp;lt;/template&amp;gt;

&amp;lt;script&amp;gt;
export default {

}
&amp;lt;/script&amp;gt;

&amp;lt;style&amp;gt;

&amp;lt;/style&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 저는 scss를 이용하여 scoped 옵션을 사용하였기 때문에 직접 추가해줘야 했는데 이게 너무 귀찮았습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 만들어 보았다! Custom Snippets ~   &lt;span style=&quot;color: #dddddd;&quot;&gt;(만드는 게 재밌잖아요?)&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt; &lt;b&gt; Snippets 작성하기&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Custom Snippets 작성은 너무나도 쉽습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;캡처_2022_02_06_00_02_44_882.png&quot; data-origin-width=&quot;876&quot; data-origin-height=&quot;752&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/M5im4/btrszk4LZlL/NFG3HBgkFkKMrce8bxxYn1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/M5im4/btrszk4LZlL/NFG3HBgkFkKMrce8bxxYn1/img.png&quot; data-alt=&quot;상단의 메뉴에서 User Snippets를 찾습니다. Ctrl + Shift + P -&amp;amp;amp;amp;amp;amp;gt; user snippets로 찾으셔도됩니다. (Mac은 cmd + Shift + P)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/M5im4/btrszk4LZlL/NFG3HBgkFkKMrce8bxxYn1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FM5im4%2Fbtrszk4LZlL%2FNFG3HBgkFkKMrce8bxxYn1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;876&quot; height=&quot;752&quot; data-filename=&quot;캡처_2022_02_06_00_02_44_882.png&quot; data-origin-width=&quot;876&quot; data-origin-height=&quot;752&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;상단의 메뉴에서 User Snippets를 찾습니다. Ctrl + Shift + P -&amp;amp;amp;amp;amp;gt; user snippets로 찾으셔도됩니다. (Mac은 cmd + Shift + P)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;671&quot; data-origin-height=&quot;184&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/UkiYq/btrsC9hmQJi/Ww6AKapGg8rhkLWtGEsroK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/UkiYq/btrsC9hmQJi/Ww6AKapGg8rhkLWtGEsroK/img.png&quot; data-alt=&quot;가운데에 나오는 검색창에서 vue를 검색한 후 vue.json을 들어갑니다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/UkiYq/btrsC9hmQJi/Ww6AKapGg8rhkLWtGEsroK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FUkiYq%2FbtrsC9hmQJi%2FWw6AKapGg8rhkLWtGEsroK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;671&quot; height=&quot;184&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;671&quot; data-origin-height=&quot;184&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;가운데에 나오는 검색창에서 vue를 검색한 후 vue.json을 들어갑니다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;vue.json에 들어오셨다면 이제 원하는 snippets을 작성합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1644074927787&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{
  &quot;snippets 이름&quot;: {
    &quot;prefix&quot;: &quot;snippets 실행 트리거&quot;,
    &quot;body&quot;: [
      // snippets 실행시 원하는 template 작성
    ],
    &quot;description&quot;: &quot;snippets에대한 설명을 작성합니다.&quot;
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;작성 형식은 위의 형식을 사용합니다. 아래는 형식에 따라 제가 작성한 snippets입니다.&lt;/p&gt;
&lt;pre id=&quot;code_1644075030885&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{
  &quot;baegofda snippets  &quot;: {
    &quot;prefix&quot;: &quot;baegofda  &quot;,
    &quot;body&quot;: [
      &quot;&amp;lt;template&amp;gt;&amp;lt;/template&amp;gt;&quot;,
      &quot;&quot;,
      &quot;&amp;lt;script&amp;gt;&quot;,
      &quot;export default {&quot;,
      &quot;\tname: '${TM_FILENAME/(.*)\\..+$/$1/}$1',&quot;,
      &quot;\tcomponents: {},&quot;,
      &quot;\tprops: {},&quot;,
      &quot;\tdata() {\n\t\treturn {}\n\t},&quot;,
      &quot;\tmethods: {},&quot;,
      &quot;}&quot;,
      &quot;&amp;lt;/script&amp;gt;&quot;,
      &quot;&quot;,
      &quot;&amp;lt;style lang='scss' scoped&amp;gt;&amp;lt;/style&amp;gt;&quot;
    ],
    &quot;description&quot;: &quot;Vue snippet with scss and scoped&quot;
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저는 snippets 사용 시 최대한 추가적인 텍스트를 작성하지 않기 위해 원하는 옵션들을 많이 추가하였습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;(자동으로 name 옵션에 파일 이름 넣어주기.. 커서 위치.. 줄 바꿈.. 띄어쓰기..)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;자세한 옵션과 변수들은 &lt;a href=&quot;https://code.visualstudio.com/docs/editor/userdefinedsnippets&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;공식문서&lt;/a&gt;를 참고하시면 좋습니다.&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Inked캡처_2022_02_06_00_35_43_500_LI.jpg&quot; data-origin-width=&quot;867&quot; data-origin-height=&quot;482&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/drq8LO/btrswUTwRbO/G4k3ykwRkQWFdbsVUoY821/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/drq8LO/btrswUTwRbO/G4k3ykwRkQWFdbsVUoY821/img.jpg&quot; data-alt=&quot;prefix 옵션에 작성한 단어의 앞글자만 작성하면 자동 완성으로 해당 snippets가 나옵니다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/drq8LO/btrswUTwRbO/G4k3ykwRkQWFdbsVUoY821/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdrq8LO%2FbtrswUTwRbO%2FG4k3ykwRkQWFdbsVUoY821%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;867&quot; height=&quot;482&quot; data-filename=&quot;Inked캡처_2022_02_06_00_35_43_500_LI.jpg&quot; data-origin-width=&quot;867&quot; data-origin-height=&quot;482&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;prefix 옵션에 작성한 단어의 앞글자만 작성하면 자동 완성으로 해당 snippets가 나옵니다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;캡처_2022_02_06_00_40_19_832.png&quot; data-origin-width=&quot;867&quot; data-origin-height=&quot;483&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/TzuEC/btrsqB1rKDa/JuJAUp7b0SRk9DmdMlYxb1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/TzuEC/btrsqB1rKDa/JuJAUp7b0SRk9DmdMlYxb1/img.png&quot; data-alt=&quot;실행시 작성한 snippets에 맞게 나오게됩니다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/TzuEC/btrsqB1rKDa/JuJAUp7b0SRk9DmdMlYxb1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTzuEC%2FbtrsqB1rKDa%2FJuJAUp7b0SRk9DmdMlYxb1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;867&quot; height=&quot;483&quot; data-filename=&quot;캡처_2022_02_06_00_40_19_832.png&quot; data-origin-width=&quot;867&quot; data-origin-height=&quot;483&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;실행시 작성한 snippets에 맞게 나오게됩니다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;360&quot; data-origin-height=&quot;284&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/WyrdU/btrswWpUuN2/3YItifrRiBRzNIQ1VYpKfK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/WyrdU/btrswWpUuN2/3YItifrRiBRzNIQ1VYpKfK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/WyrdU/btrswWpUuN2/3YItifrRiBRzNIQ1VYpKfK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FWyrdU%2FbtrswWpUuN2%2F3YItifrRiBRzNIQ1VYpKfK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;360&quot; height=&quot;284&quot; data-origin-width=&quot;360&quot; data-origin-height=&quot;284&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이상 작업하다 귀차니즘으로 인해 뻘짓을 한 개발자였습니다.&lt;/p&gt;</description>
      <category>Vue</category>
      <category>custom snippets</category>
      <category>snippet</category>
      <category>snippets</category>
      <category>user snippets</category>
      <category>vscode snippets</category>
      <category>vue snippet</category>
      <category>vue 스니펫</category>
      <category>스니펫</category>
      <category>오물오물</category>
      <author>baegofda_</author>
      <guid isPermaLink="true">https://baegofda.tistory.com/253</guid>
      <comments>https://baegofda.tistory.com/253#entry253comment</comments>
      <pubDate>Sun, 6 Feb 2022 00:49:37 +0900</pubDate>
    </item>
    <item>
      <title>  TODO ! - 컴포넌트 분리하기 (feat. 상태관리(state), function)</title>
      <link>https://baegofda.tistory.com/252</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt; &amp;nbsp;&lt;b&gt;컴포넌트 분리하기&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;컴포넌트 분리하기에 앞서 Vue는 Vue의 Template문법 + HTML, React는 JSX 문법으로 UI를 작성하게 됩니다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;해당 예제는&lt;br /&gt;Vue :&amp;nbsp;&lt;a href=&quot;https://github.com/baegofda/blog-vue&quot;&gt;https://github.com/baegofda/blog-vue&lt;/a&gt;&lt;br /&gt;React:&amp;nbsp;&lt;a href=&quot;https://github.com/baegofda/blog-react&quot;&gt;https://github.com/baegofda/blog-react&lt;/a&gt;&amp;nbsp;&lt;br /&gt;위의 주소에서 데모와 함께 소스코드 확인이 가능합니다!&lt;/blockquote&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1. 상태 관리(state)&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;상태 관리를 위한 state를 선언하겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;React에서는 React Hooks에서 제공하는 useRef, useState를 이용하여 state들을 관리합니다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;React&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인풋의 값을 참조하기 위해 useRef()를 이용하여 Input에 ref={inputRef}를 선언합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또 인풋 값을 바인딩하기 위한 inputText와 투두 리스트들을 담기 위한 items를 useState를 선언합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1643692326018&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import React, { useRef, useState } from &quot;react&quot;;
import styled from &quot;styled-components&quot;;
import Button from &quot;../components/Button&quot;;
import ToDoItem from &quot;../components/ToDoItem&quot;;

const ToDos = () =&amp;gt; {
  const inputRef = useRef();
  const [inputText, setInputText] = useState(&quot;&quot;);
  const [items, setItems] = useState([]);
  
  //functions
  
  return (
    &amp;lt;Wrapper&amp;gt;
      &amp;lt;Title&amp;gt;TODO&amp;lt;/Title&amp;gt;
      &amp;lt;Form&amp;gt;
        &amp;lt;Input
          ref={inputRef}
          value={inputText}
          type=&quot;text&quot;
          onChange={onChange}
          placeholder=&quot;추가할 리스트를 입력하여 주세요 !&quot;
        /&amp;gt;
        &amp;lt;Button type=&quot;submit&quot; name=&quot;추가하기&quot; onClick={onClick} /&amp;gt;
      &amp;lt;/Form&amp;gt;
      &amp;lt;ul&amp;gt;
        {items.map((item) =&amp;gt; (
          &amp;lt;ToDoItem
            key={item.id}
            item={item}
            onComplete={onComplete}
            onDelete={onDelete}
          /&amp;gt;
        ))}
      &amp;lt;/ul&amp;gt;
    &amp;lt;/Wrapper&amp;gt;
  );
};

  // stlyes

export default ToDos;&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Vue&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;Vue에서는 data() 내에 사용할 state들의 초기값들을 선언합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Vue의 ref는 선언해줄 필요 없이 $refs로 바로 접근이 가능하기 때문에 Input에 ref=&quot;todoInput&quot;으로만 선언합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1643692723721&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;template&amp;gt;
  &amp;lt;main class=&quot;wrapper&quot;&amp;gt;
    &amp;lt;h1 class=&quot;title&quot;&amp;gt;TODO&amp;lt;/h1&amp;gt;
    &amp;lt;form class=&quot;form&quot;&amp;gt;
      &amp;lt;input
        ref=&quot;todoInput&quot;
        type=&quot;text&quot;
        class=&quot;form__input&quot;
        placeholder=&quot;추가할 리스트를 입력하여 주세요 !&quot;
        v-model=&quot;inputText&quot;
      /&amp;gt;
      &amp;lt;Button type=&quot;submit&quot; name=&quot;추가하기&quot; @click=&quot;onClick&quot; /&amp;gt;
    &amp;lt;/form&amp;gt;
    &amp;lt;ul&amp;gt;
      &amp;lt;ToDoItem
        v-for=&quot;todo in todos&quot;
        :key=&quot;todo.id&quot;
        :todo=&quot;todo&quot;
        @onComplete=&quot;onComplete&quot;
        @onDelete=&quot;onDelete&quot;
      /&amp;gt;
    &amp;lt;/ul&amp;gt;
  &amp;lt;/main&amp;gt;
&amp;lt;/template&amp;gt;
&amp;lt;script&amp;gt;
import Button from &quot;../components/Button.vue&quot;;
import ToDoItem from &quot;../components/ToDoItem.vue&quot;;

export default {
  name: &quot;Todos&quot;,
  data() {
    return {
      inputText: &quot;&quot;,
      todos: [],
    };
  },
  methods: {
    //methods
  },
  components: {
    //components
  },
};
&amp;lt;/script&amp;gt;

&amp;lt;style scoped&amp;gt;
  //styles
&amp;lt;/style&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2. 함수 선언&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;React와 Vue 모두 Javascript 기반이기 때문에 함수 내에서 사용하는 문법은 큰 틀에서는 Javascript 문법으로 동일합니다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;React&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;React에서는 선언한 state에 값을 업데이트하기 위해서는 setState을 이용합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1643694320508&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import React, { useRef, useState } from &quot;react&quot;;
import styled from &quot;styled-components&quot;;
import Button from &quot;../components/Button&quot;;
import ToDoItem from &quot;../components/ToDoItem&quot;;

const ToDos = () =&amp;gt; {
  const inputRef = useRef();
  const [inputText, setInputText] = useState(&quot;&quot;);
  const [items, setItems] = useState([]);

  const onChange = (e) =&amp;gt; {
    setInputText(e.target.value);
  };

  const onClick = (e) =&amp;gt; {
    e.preventDefault();
    setItems((items) =&amp;gt; {
      const item = {
        id: Date.now(),
        content: inputRef.current.value,
        isCompleted: false,
      };
      const newItems = [...items, item];
      return newItems;
    });
    setInputText(&quot;&quot;);
    inputRef.current.focus();
  };

  const onComplete = (id) =&amp;gt; {
    setItems((items) =&amp;gt;
      items.map((item) =&amp;gt; {
        if (item.id === id) {
          return { ...item, isCompleted: !item.isCompleted };
        }
        return item;
      })
    );
  };

  const onDelete = (id) =&amp;gt; {
    setItems((items) =&amp;gt; items.filter((item) =&amp;gt; item.id !== id));
  };

  return (
    &amp;lt;Wrapper&amp;gt;
      &amp;lt;Title&amp;gt;TODO&amp;lt;/Title&amp;gt;
      &amp;lt;Form&amp;gt;
        &amp;lt;Input
          ref={inputRef}
          value={inputText}
          type=&quot;text&quot;
          onChange={onChange}
          placeholder=&quot;추가할 리스트를 입력하여 주세요 !&quot;
        /&amp;gt;
        &amp;lt;Button type=&quot;submit&quot; name=&quot;추가하기&quot; onClick={onClick} /&amp;gt;
      &amp;lt;/Form&amp;gt;
      &amp;lt;ul&amp;gt;
        {items.map((item) =&amp;gt; (
          &amp;lt;ToDoItem
            key={item.id}
            item={item}
            onComplete={onComplete}
            onDelete={onDelete}
          /&amp;gt;
        ))}
      &amp;lt;/ul&amp;gt;
    &amp;lt;/Wrapper&amp;gt;
  );
};

//styles

export default ToDos;&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Vue&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;Vue에서는 사용할 function은 methods에 작성하며 this로 내부 state, function, ref 등에 접근하여 값을 업데이트합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또 React에서는 onChange를 이용하여 inputText를 업데이트하고 value로 바인딩을 하여 사용하지만&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;vue에서는&amp;nbsp; v-model을 이용하여 inputText를 사용하게되면 업데이트와 함께 데이터 바인딩이 가능합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1643694492727&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;template&amp;gt;
  &amp;lt;main class=&quot;wrapper&quot;&amp;gt;
    &amp;lt;h1 class=&quot;title&quot;&amp;gt;TODO&amp;lt;/h1&amp;gt;
    &amp;lt;form class=&quot;form&quot;&amp;gt;
      &amp;lt;input
        ref=&quot;todoInput&quot;
        type=&quot;text&quot;
        class=&quot;form__input&quot;
        placeholder=&quot;추가할 리스트를 입력하여 주세요 !&quot;
        v-model=&quot;inputText&quot;
      /&amp;gt;
      &amp;lt;Button type=&quot;submit&quot; name=&quot;추가하기&quot; @click=&quot;onClick&quot; /&amp;gt;
    &amp;lt;/form&amp;gt;
    &amp;lt;ul&amp;gt;
      &amp;lt;ToDoItem
        v-for=&quot;todo in todos&quot;
        :key=&quot;todo.id&quot;
        :todo=&quot;todo&quot;
        @onComplete=&quot;onComplete&quot;
        @onDelete=&quot;onDelete&quot;
      /&amp;gt;
    &amp;lt;/ul&amp;gt;
  &amp;lt;/main&amp;gt;
&amp;lt;/template&amp;gt;
&amp;lt;script&amp;gt;
import Button from &quot;../components/Button.vue&quot;;
import ToDoItem from &quot;../components/ToDoItem.vue&quot;;

export default {
  name: &quot;Todos&quot;,
  data() {
    return {
      inputText: &quot;&quot;,
      todos: [],
    };
  },
  methods: {
    onClick(e) {
      e.preventDefault();
      const todo = {
        id: Date.now(),
        content: this.inputText,
        isCompleted: false,
      };
      this.todos = [...this.todos, todo];
      this.inputText = &quot;&quot;;
      this.$refs.todoInput.focus();
    },
    onComplete(id) {
      this.todos = this.todos.map((todo) =&amp;gt; {
        if (todo.id === id) {
          return { ...todo, isCompleted: !todo.isCompleted };
        }
        return todo;
      });
    },
    onDelete(id) {
      this.todos = this.todos.filter((todo) =&amp;gt; todo.id !== id);
    },
  },
  components: {
    //components
  },
};
&amp;lt;/script&amp;gt;

&amp;lt;style scoped&amp;gt;
  //style
&amp;lt;/style&amp;gt;&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Vue</category>
      <category>data</category>
      <category>function</category>
      <category>Methods</category>
      <category>react</category>
      <category>useState</category>
      <category>vue</category>
      <category>vue입문</category>
      <category>배고프다</category>
      <category>오물오물</category>
      <author>baegofda_</author>
      <guid isPermaLink="true">https://baegofda.tistory.com/252</guid>
      <comments>https://baegofda.tistory.com/252#entry252comment</comments>
      <pubDate>Tue, 1 Feb 2022 14:49:03 +0900</pubDate>
    </item>
    <item>
      <title>  2021 회고 - 1년차 프론트엔드 개발자 회고</title>
      <link>https://baegofda.tistory.com/247</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;  &lt;b&gt;2021년의 끝이 다가오고 있다!&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;KakaoTalk_20211227_222104207.png&quot; data-origin-width=&quot;454&quot; data-origin-height=&quot;660&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/8lLtu/btrpffMYm7P/UkYQfuCIIpS6AuXweX83CK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/8lLtu/btrpffMYm7P/UkYQfuCIIpS6AuXweX83CK/img.png&quot; data-alt=&quot;심슨&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/8lLtu/btrpffMYm7P/UkYQfuCIIpS6AuXweX83CK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F8lLtu%2FbtrpffMYm7P%2FUkYQfuCIIpS6AuXweX83CK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;214&quot; height=&quot;312&quot; data-filename=&quot;KakaoTalk_20211227_222104207.png&quot; data-origin-width=&quot;454&quot; data-origin-height=&quot;660&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;심슨&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;2021년은 나에게 뜻깊은 해가 되었다.&lt;br /&gt;개발자로서의 길을 걷기 시작한 해인만큼&amp;nbsp;&lt;br /&gt;지금까지의 일들을 돌이켜 생각해보고&lt;br /&gt;개발자를 시작한 지 얼마 안 된 지금 시점에서의 감정과 생각들&lt;br /&gt;미래엔 어떤 모습으로 성장했을지 알기 위해 회고를 작성한다.  &lt;/blockquote&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt; &lt;b&gt; 나는 어떻게 개발자가 되었을까?&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;477&quot; data-origin-height=&quot;409&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b52rwB/btrpiHXafpt/PP8HrKxC77yPWC0VGnTeFk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b52rwB/btrpiHXafpt/PP8HrKxC77yPWC0VGnTeFk/img.jpg&quot; data-alt=&quot;학원앨리스&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b52rwB/btrpiHXafpt/PP8HrKxC77yPWC0VGnTeFk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb52rwB%2FbtrpiHXafpt%2FPP8HrKxC77yPWC0VGnTeFk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;349&quot; height=&quot;300&quot; data-origin-width=&quot;477&quot; data-origin-height=&quot;409&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;학원앨리스&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;작년 초 개발자와는 다른 인생을 살아오던 나에게 인생의 전환점을 맞이하고 있는 시기가 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서울의 생활을 접고 다시 고향으로 내려가서 살아야 하나 하는 고민을 하던 찰나에&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지인에게 &quot;너 개발자 해볼래?&quot;라는 추천을 받았었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;당시엔 지금처럼 개발자 붐이 일어나고 있는 시기가 아니긴 했지만&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단순하게 HTML, CSS를 체험해보니 너무 재밌었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3D 프린터에서 만졌던 코딩, 아두이노나 전기과 전공 시간에 잠깐 해봤던 거에 비하면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;너무 흥미로웠고 바로 국비를 등록했었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 국비를 진행하면서는 그렇게 기쁘지는 못했다. 프로젝트를 진행하며 팀원들 간의 문제도 있었고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;강사에 대한 불만도 있었다. 또 진행하며 백엔드가 아닌 프론트엔드를 하고 싶다는 마음이 컸었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 수료 2달을 앞둔 시점에 과감히 중도 포기를 하고 온라인 강의로 독학을 시작했다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt; &lt;b&gt;&amp;nbsp;자신과의 싸움 '독학'&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;387&quot; data-origin-height=&quot;356&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cpLz6O/btrplg5rEFC/ckv2MSw2h5iUGVuAqHIAB0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cpLz6O/btrplg5rEFC/ckv2MSw2h5iUGVuAqHIAB0/img.jpg&quot; data-alt=&quot;슬램덩크 패러디&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cpLz6O/btrplg5rEFC/ckv2MSw2h5iUGVuAqHIAB0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcpLz6O%2Fbtrplg5rEFC%2Fckv2MSw2h5iUGVuAqHIAB0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;387&quot; height=&quot;356&quot; data-origin-width=&quot;387&quot; data-origin-height=&quot;356&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;슬램덩크 패러디&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;독학하는 기간 동안 좀 더 열심히 했다면 &quot;내 개발자로서의 커리어가 조금 달라지지 않았을까?&quot;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;라는 생각을 하고 있다. 확실히 누군가 지켜봐 주는 이 없이 자율적으로 혼자 한다는 건&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;수많은 유혹을 이겨내며 해야 하니 많이 힘들었었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또 지금 배우고 있는, 직접 작성하고 있는 코드가 좋은지 어떤지를 확인할 길이 없으니 너무 답답하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;(코드숨, NEXTSTEP, 카우치코딩 등등 좋은 플랫폼들을 일찍 만났었더라면 ..)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 우리에겐 유튜브(개발바닥, 드림코딩엘리, 노마드코더 등등)나 인프런 같은 플랫폼들이 있고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 플랫폼들에서 많은 동기 부여와 지식을 습득하며 배워 나갈 수 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또 이력서를 돌리기 전 만났던 스터디의 인연들 덕분에 더 큰 동기부여가 되었었다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  &lt;b&gt;구직과 면접&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;270&quot; data-origin-height=&quot;186&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/FOqv6/btrpiIBPokT/R9KWtLT6NO9XbZA3OXdCn1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/FOqv6/btrpiIBPokT/R9KWtLT6NO9XbZA3OXdCn1/img.jpg&quot; data-alt=&quot;포켓몬스터&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/FOqv6/btrpiIBPokT/R9KWtLT6NO9XbZA3OXdCn1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFOqv6%2FbtrpiIBPokT%2FR9KWtLT6NO9XbZA3OXdCn1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;368&quot; height=&quot;253&quot; data-origin-width=&quot;270&quot; data-origin-height=&quot;186&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;포켓몬스터&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;프론트엔드 공부를 시작한 지도 어언 6달.. 3월이 되었을 때였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나는 공고가 올라오는 이 시기를 놓치기 싫어서 부랴부랴 &lt;a href=&quot;https://project-goc.netlify.app/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;프로젝트&lt;/a&gt;와 &lt;a href=&quot;https://baegofda.github.io/Portfolio/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;포트폴리오&lt;/a&gt;, 이력서를 준비하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여러 구직 팀을 찾아가며 15~20곳가량의 개발 팀에 문을 두드렸고 운이 좋았는지 3분의 2 가량의 팀에서&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;면접을 보고 싶다는 반응이 왔었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;면접을 보면서도 참 많은 걸 배우고 성장했던 것 같다. 채용 프로세스도 다 다르고 질문도 다르다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사전과제, 라이브코딩, 자바스크립트에 대한 질문, React에 대한 질문, 프로젝트에 질문 등등&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;질문의 초점들은 다 달랐고 나는 이리저리 치이며 서울을 누볐었다.  &lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt; &lt;b&gt; 내가 원하는건..&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;img.jpg&quot; data-origin-width=&quot;448&quot; data-origin-height=&quot;528&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/p5Osd/btrpcMYRc1S/RCXL9jFORfbkNTF75QQbRK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/p5Osd/btrpcMYRc1S/RCXL9jFORfbkNTF75QQbRK/img.jpg&quot; data-alt=&quot;원본: 원피스 - 정상전쟁 중 흰수염의 회고&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/p5Osd/btrpcMYRc1S/RCXL9jFORfbkNTF75QQbRK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fp5Osd%2FbtrpcMYRc1S%2FRCXL9jFORfbkNTF75QQbRK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;405&quot; height=&quot;477&quot; data-filename=&quot;img.jpg&quot; data-origin-width=&quot;448&quot; data-origin-height=&quot;528&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;원본: 원피스 - 정상전쟁 중 흰수염의 회고&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;열심히 노력했던 덕일까 많은 팀에서 함께하고 싶다는 반응을 보내주셨고 행복한 고민(?)을 하게 되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사람마다 본인이 생각하는 직업에 대한 가치관, 기준 '&lt;b&gt;키워드&lt;/b&gt;'들이 다 다를 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;누군가는 '&lt;b&gt;연봉&lt;/b&gt;'을, 누군가는 '&lt;b&gt;워라밸&lt;/b&gt;'을, 다른 누군가는 '&lt;b&gt;성장&lt;/b&gt;'을 생각하며 직업과 회사를 고른다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;u&gt;지금 당장에는&lt;/u&gt; '&lt;b&gt;성장&lt;/b&gt;'에 집중하도록 했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내가 성장을 꾸준히 한다면 연봉, 워라밸 등등 같은 기준들은 따라올 것이라 생각하기 때문이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;물론 이 기준은 미래엔 달라질 수 있다. 때문에 '지금 당장에는'이라는 수식이 붙는다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt; &lt;b&gt;&amp;nbsp;개발자로의 첫걸음&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;회고짤_동료.jpg&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;720&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/BiXdo/btrpkuXnBYG/oiC1OjUcJUhGlldHAoUoj0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/BiXdo/btrpkuXnBYG/oiC1OjUcJUhGlldHAoUoj0/img.jpg&quot; data-alt=&quot;원피스&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/BiXdo/btrpkuXnBYG/oiC1OjUcJUhGlldHAoUoj0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBiXdo%2FbtrpkuXnBYG%2FoiC1OjUcJUhGlldHAoUoj0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;474&quot; height=&quot;266&quot; data-filename=&quot;회고짤_동료.jpg&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;720&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;원피스&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;결국 나는 한 팀에 합류하기로 마음먹었고 첫 개발자로의 길을 걷게 되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;팀에는 AI팀을 제외하고도 개발팀으로 CTO님, 팀장님, 시니어 급분들 3분을 포함한 5명이 있는 팀이었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;투자도 받으며 시작한 2년 차 스타트업이었고 팀원을 보자면 이곳에서는 성장을 할 수 있을 것 같았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기술 스택도 맞았으며 React-Native를 통한 앱 개발을 해볼 수 있는 곳이었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또 처음 써보는 공유 오피스, 맥북 등 새로운 환경이 나를 감싸 안아주었다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;i15165470964.jpg&quot; data-origin-width=&quot;700&quot; data-origin-height=&quot;377&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bDHhcx/btrplihYTDA/pXWgPCK1R8B0CSpqD0xHq1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bDHhcx/btrplihYTDA/pXWgPCK1R8B0CSpqD0xHq1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bDHhcx/btrplihYTDA/pXWgPCK1R8B0CSpqD0xHq1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbDHhcx%2FbtrplihYTDA%2FpXWgPCK1R8B0CSpqD0xHq1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;484&quot; height=&quot;261&quot; data-filename=&quot;i15165470964.jpg&quot; data-origin-width=&quot;700&quot; data-origin-height=&quot;377&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;합류하며 괜히 걱정되었던 부분들은 &quot;신입인 내가 시니어분들 사이에서 잘 적응할 수 있을까?&quot;라는&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;걱정이 있었다. 하지만 내 걱정과는 달리 다들 너무 친절하시고 잘 따라올 수 있도록 길을 알려주셨다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또 인원이 몇 없지만 CTO님이 직접 세미나를 준비해서 발표를 해주시고 코드 리뷰도 해주셨다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;정말 취직 하나는 잘했다&quot;라는 생각을 하며 5개월가량을 팀에 있었다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  &lt;b&gt;퇴사 그리고 이직&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;594&quot; data-origin-height=&quot;311&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c8JbYk/btrpeJ2g7H8/RHmDqdkqQLDveugrQEqNq0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c8JbYk/btrpeJ2g7H8/RHmDqdkqQLDveugrQEqNq0/img.jpg&quot; data-alt=&quot;타짜&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c8JbYk/btrpeJ2g7H8/RHmDqdkqQLDveugrQEqNq0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc8JbYk%2FbtrpeJ2g7H8%2FRHmDqdkqQLDveugrQEqNq0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;474&quot; height=&quot;248&quot; data-origin-width=&quot;594&quot; data-origin-height=&quot;311&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;타짜&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;하지만 결과론적으로 이 팀은 해체되었다. 여러 이유가 있지만 '어른의 사정'이라고 칭하겠다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;팀장님이 나가고 CTO님이 나가고 &lt;span style=&quot;color: #9d9d9d;&quot;&gt;(정확히는 그냥 연락이 두절되었다.) &lt;span style=&quot;color: #333333;&quot;&gt;다른 분도 나가셨다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나는 침몰하는 배에서 이력서와 포트폴리오를 정비하며 다시 구직시장에 띄어 들어야 했었고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다행히도 직접 지원한 팀뿐만 아니라 로켓펀치로 먼저 연락을 주시는 등&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반응이 빠르게 오며 여러 팀에서 좋게 봐주신 덕분에 첫 구직보다 더 고민을 하며 이직을 하게 되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;좋았던 팀이기 때문에 많이 아쉬웠지만 배운 것도 많았다. 처음 개발업무를 했기 때문에 업무의 흐름이나&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;경험하지 못한 협업의 경험과 좋은 코드에 대한 고민 등등 값진 시간들이었고 나의 초석이 되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이때의 팀원분들과는 종종 연락하며 지내고 있고 소중한 인연으로 남았다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt; &lt;b&gt; 그리고 지금..&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;494&quot; data-origin-height=&quot;514&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xHn72/btrpeII6pEm/fHBxV54lgwzKkkwc0FrInk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xHn72/btrpeII6pEm/fHBxV54lgwzKkkwc0FrInk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xHn72/btrpeII6pEm/fHBxV54lgwzKkkwc0FrInk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxHn72%2FbtrpeII6pEm%2FfHBxV54lgwzKkkwc0FrInk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;357&quot; height=&quot;372&quot; data-origin-width=&quot;494&quot; data-origin-height=&quot;514&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;결과적으로 나는 현재 게이머들을 위한 전적 통계 사이트를 서비스하는 팀에 합류하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;원래부터 게임에 관심이 많고 즐겨했던 나로서는 공고가 올라온 것을 보고 참을 수 없었기도 했고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;호기심에 면접을 봤던 것도 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;면접을 보면서도 &quot;게임을 정말 좋아하시는 분들이 만드신 거구나&quot;라는 생각이 들면서&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;진행될수록 이곳에서 한다면 많은 것들을 할 수 있을 것 같았고 즐기며 할 수 있을것 같았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또 고등학교 시절 프로게이머 지망생이었던 내가&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지금은 게이머로써, 개발자로서 게이머들을 위한 서비스를&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만들 수 있다는 점에 합류하고 싶다는 생각이 들었고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;생각이 통하였는지 같이 해보자는 연락을 주셔서 합류하게 되었다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;회고짤_말대꾸.jpeg&quot; data-origin-width=&quot;422&quot; data-origin-height=&quot;626&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bVa4Na/btrppAicdiK/f9dwgyNHFWx97x6k8CCZak/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bVa4Na/btrppAicdiK/f9dwgyNHFWx97x6k8CCZak/img.jpg&quot; data-alt=&quot;쇼미더럭키짱 패러디&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bVa4Na/btrppAicdiK/f9dwgyNHFWx97x6k8CCZak/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbVa4Na%2FbtrppAicdiK%2Ff9dwgyNHFWx97x6k8CCZak%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;346&quot; height=&quot;513&quot; data-filename=&quot;회고짤_말대꾸.jpeg&quot; data-origin-width=&quot;422&quot; data-origin-height=&quot;626&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;쇼미더럭키짱 패러디&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;팀을 합류하고 나서는 너무나도 자율적인 분위기에 어질어질함을 느꼈고 너무 좋았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개발팀 내부로도 성장을 위해 서비스들의 기술에 대한 변화들을 고민하는 시기이고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내부 컨벤션 등 같이 헤쳐 나아갈 이슈들이 많다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러한 과정에서 나의 생각을 적극적으로 수용해주시고 같이 고민해주시는 게 너무 좋다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  &lt;b&gt;큰 거 온다!! 오나..?&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;325&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b5qldf/btrpmhwNt4X/uP21RgtReGGQ9F5QNbkKeK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b5qldf/btrpmhwNt4X/uP21RgtReGGQ9F5QNbkKeK/img.jpg&quot; data-alt=&quot;무한도전 - 배고픈특집&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b5qldf/btrpmhwNt4X/uP21RgtReGGQ9F5QNbkKeK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb5qldf%2FbtrpmhwNt4X%2FuP21RgtReGGQ9F5QNbkKeK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;325&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;325&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;무한도전 - 배고픈특집&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;연말의 종무식과 회고 등을 통하여 내년에 많은 변화들을 맞이 할 준비를 하고 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모회사가 생기면서 내년부터는 많은 새로운 서비스 개발과 팀적인 변화들이 생겨날 예정이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;급작스럽게 새로운 팀원들과 협업을 진행하게 될 것이고 많은 시행착오들이 있을 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;하지만 많은 시행착오들을 견뎌낸다면 회사는 큰 성장을 할 수 있을 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;때문에 나는 열심히 달려 나아갈 생각이고 함께 성장해 볼 생각이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;물론 이 생각 또한 언제까지 지속될지는 모른다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내게 큰 영감이 되었던 글이 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;유튜브 채널 '&lt;a href=&quot;https://www.youtube.com/channel/UCSEOUzkGNCT_29EU_vnBYjg&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;개발바닥&lt;/a&gt;'을 같이 운영하시며 (전) 우아한 형제들 (현) 인프런 CTO이신 향로님이&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우아한형제들을 퇴사하시면서 남기신 우아한형제들 부검글에 이러한 글귀가 있다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p id=&quot;2-2-회사와-개인의-성장속도는-비례하지-않는다&quot; data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;&lt;b&gt;2-2. 회사와 개인의 성장속도는 비례하지 않는다&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;이 부분이 우아한형제들에서 가장 크게 배운 점인데요.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;&quot;회사의 성장에 비례하는 건 회사의 가치이지, 개인의 성장은 아니다.&quot;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;보통 많은 스타트업 종사자분들이 회사가 폭발적으로 성장하는 만큼 본인 역시 폭발적으로 성장한다고&amp;nbsp;&lt;b&gt;오해&lt;/b&gt;하시는데요.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;저는 절대로 그렇지 않다는 것을 배웠습니다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;회사가 10배, 100배 성장했다고 해서&amp;nbsp;&lt;b&gt;개인이 같은 시간 동안 그만큼 성장하는 경우는 거의 없었습니다&lt;/b&gt;.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;a style=&quot;color: #006dd7;&quot; href=&quot;https://jojoldu.tistory.com/562?category=689637&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;1. 우아한형제들 부검 - 왜 떠나는지&lt;/a&gt; &lt;span style=&quot;color: #9d9d9d;&quot;&gt;에서..&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내가 이곳에서 얼마나 농도가 짙게 성장을 할 수 있을지는 아무도 모른다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  &lt;b&gt;올해의 나는&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;올해의 나는 많은 지식들을 습득하기 위해 이곳저곳에서 노력을 많이 해봤다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;덕분에 단기간에 많은 지식들이 들어왔다. 하지만 &quot;과연 심도가 있었는가?&quot;를 생각하면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;많이 부족하다고 느낀다. 때문에 이 부분에 대해서는 고쳐 나아가야 할 점이다.&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  &lt;b&gt;내년의 나는&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;480&quot; data-origin-height=&quot;296&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b4q7KU/btrpjvWys5p/istJjTqr2aExol0ImXCuEk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b4q7KU/btrpjvWys5p/istJjTqr2aExol0ImXCuEk/img.jpg&quot; data-alt=&quot;무한도전 - 식스맨특집&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b4q7KU/btrpjvWys5p/istJjTqr2aExol0ImXCuEk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb4q7KU%2FbtrpjvWys5p%2FistJjTqr2aExol0ImXCuEk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;456&quot; height=&quot;281&quot; data-origin-width=&quot;480&quot; data-origin-height=&quot;296&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;무한도전 - 식스맨특집&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;나의 성장을 위해 내년에 하고 싶은 것들이 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;첫 번째는 Flutter이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;잠깐이지만 React-Native를 통한 개발을 해봤는데 같이 언급되는 것이 Flutter이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;때문에 공부를 하여 경험을 하고 싶다. 이러한 경험은 혹시나 앱 개발을 하게 되었을 때&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기술 스택적 고민에 기여할 수 있을 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;두 번째는 Next.js이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재는 Nuxt.js를 사용하고 있지만 커뮤니티, 레퍼런스 등의 여러 문제점과&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 프레임워크의 업데이트 방향성을 보았을 때 Next.js도 알아둬야 할 것 같다는 생각이 들었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;세 번째는 Nest.js이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프론트엔드 개발자이지만 백엔드 개발자와 필연적으로 커뮤니케이션을 해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;때문에 백엔드에 대한 부분들도 지식을 습득해야 좀 더 원활한 커뮤니케이션이 될 것이라 생각한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;궁극적으로는 프론트엔드 개발자 뿐만 아닌 개발자로서의 생각을 하고 싶기 때문이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;네 번째는 CI/CD, 테스트 코드 그리고 Pinia이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;종류가 많지만 CI/CD 툴에 관해 적용하고 싶고 테스트 코드가 없다면 테스트 자동화 되지 않기때문에&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CI/CD라 할 수 없다. 때문에 테스트 코드에 대해 공부하고 싶다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또 Vue3 기준으로 기대되는 상태관리라이브러리&amp;nbsp;&lt;a href=&quot;https://pinia.vuejs.org/introduction.html#comparison-with-vuex&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Pinia&lt;/a&gt;를 공부하여 적용해보고 싶다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;이외에도 많이 사둔 온라인강의 보기, 주간 회고하기, 피그마, UI/UX 지식 습득하기 등이 있다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;강의 좀 그만 사.. 지금도 10개가 넘어 !!&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt; &amp;nbsp;&lt;b&gt;끝으로&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;주저리.. 주저리.. 적어보니 많은 일들이 스쳐 지나간다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;많은 상황 속에 많은 인연들을 만났고 나에게는 소중한 인연들이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그분들께 항상 감사한 마음뿐이고 자만하지 말고 성장을 갈구하여&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그분들과 팀원들에게 도움을 줄 수 있는 좋은 영향력을 지닌 개발자가 되고 싶다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;노력하자  &lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;+ 당장에 다음 주부터 이사를 위한 집을 알아봐야 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;이 집에 이사 오고 개발자를 시작했는데 벌써 다른 집을 알아볼 시기가 왔다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;내가 개발자로서 성장하는 것처럼 내가 사는 집도 꾸준히 성장할 수 있으면 좋겠다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;그리고 곧 맥북 신형을 받는다 !!&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;감사합니다.  &lt;/p&gt;</description>
      <category>회고록</category>
      <category>2021개발자회고</category>
      <category>2021프론트엔드개발자회고</category>
      <category>2021회고</category>
      <category>개발자회고</category>
      <category>오물오물</category>
      <category>프론트엔드개발자회고</category>
      <category>프론트엔드회고</category>
      <author>baegofda_</author>
      <guid isPermaLink="true">https://baegofda.tistory.com/247</guid>
      <comments>https://baegofda.tistory.com/247#entry247comment</comments>
      <pubDate>Thu, 30 Dec 2021 21:03:56 +0900</pubDate>
    </item>
    <item>
      <title> ️ TODO ! - 컴포넌트 분리하기 (feat. component, props)</title>
      <link>https://baegofda.tistory.com/246</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt; &amp;nbsp;&lt;b&gt;컴포넌트 분리하기&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;컴포넌트 분리하기에 앞서 Vue는 Vue의 Template문법 + HTML, React는 JSX 문법으로 UI를 작성하게 됩니다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;해당 예제는&lt;br /&gt;Vue :&amp;nbsp;&lt;a href=&quot;https://github.com/baegofda/blog-vue&quot;&gt;https://github.com/baegofda/blog-vue&lt;/a&gt;&lt;br /&gt;React:&amp;nbsp;&lt;a href=&quot;https://github.com/baegofda/blog-react&quot;&gt;https://github.com/baegofda/blog-react&lt;/a&gt;&amp;nbsp;&lt;br /&gt;위의 주소에서 데모와 함께 소스코드 확인이 가능합니다!&lt;/blockquote&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1.&lt;/b&gt; &lt;b&gt;컴포넌트 분리하기 (Button)&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;가장 기본적이면서도 중요한 컴포넌트를 먼저 분리해보도록 하겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 버튼(Button) 컴포넌트를 분리합니다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;React&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1640613654573&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// Button.jsx
import React from &quot;react&quot;;
import styled from &quot;styled-components&quot;;

const Button = ({ type, name, onClick }) =&amp;gt; {
  return (
    &amp;lt;Btn type={type} onClick={onClick}&amp;gt;
      {name}
    &amp;lt;/Btn&amp;gt;
  );
}

const Btn = styled.button`
  background-color: transparent;
  border: 1px solid rgba(0, 0, 0, 0.6);
  border-radius: 3px;

  &amp;amp;:hover {
    cursor: pointer;
  }
`;

export default Button;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;Button 컴포넌트는 props로 type과 onClick 이벤트, name을 받을 수 있도록 하고 css는 styled-components를 아래에 선언하여 css를 작성합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이때 onClick 이벤트는 부모 컴포넌트에서 함수를 props로 받은걸 사용하여 값을 반환합니다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Vue&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1640614590692&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!--Button.vue--&amp;gt;
&amp;lt;template&amp;gt;
  &amp;lt;button class=&quot;btn&quot; :type=&quot;type&quot;&amp;gt;{{ name }}&amp;lt;/button&amp;gt;
&amp;lt;/template&amp;gt;

&amp;lt;script&amp;gt;
export default {
  name: &quot;Button&quot;,
  props: {
    type: String,
    name: String,
  },
};
&amp;lt;/script&amp;gt;

&amp;lt;style scoped&amp;gt;
.btn {
  background-color: transparent;
  border: 1px solid rgba(0, 0, 0, 0.6);
  border-radius: 3px;
}
.btn:hover {
  cursor: pointer;
}
&amp;lt;/style&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;Vue도 비슷하게 type와 name은 props로 받으나 click 이벤트 경우엔 Vue의 &lt;a href=&quot;https://joshua1988.github.io/vue-camp/vue/event-emit.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;emit&lt;/a&gt;을 이용하여 부모의 컴포넌트에 값을 보내줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;css는 하단의 style 태그 내부에 작성을 하며, 해당 css들이 현재 컴포넌트 내부에만 적용되도록 &lt;a href=&quot;https://jeongwooahn.medium.com/vue-js-scoped-css-1b77c9a1b8bb&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;scoped&lt;/a&gt;를 사용합니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2.&lt;/b&gt; &lt;b&gt;컴포넌트 분리하기 (TodoItem)&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;투두리스트 작성 시 나오는 리스트(TodoItem) 컴포넌트를 분리합니다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;React&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1640615636600&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// ToDoItem.jsx
import React from &quot;react&quot;;
import styled from &quot;styled-components&quot;;
import Button from &quot;./Button&quot;;

const ToDoItem = ({ item, onComplete, onDelete }) =&amp;gt; {
  return (
    &amp;lt;Item&amp;gt;
      &amp;lt;CheckBox
        type=&quot;checkbox&quot;
        defaultChecked={item.isCompleted}
        onChange={() =&amp;gt; onComplete(item.id)}
      /&amp;gt;
      &amp;lt;Content isCompleted={item.isCompleted}&amp;gt;{item.content}&amp;lt;/Content&amp;gt;
      &amp;lt;Button type=&quot;button&quot; name=&quot;삭제하기&quot; onClick={() =&amp;gt; onDelete(item.id)} /&amp;gt;
    &amp;lt;/Item&amp;gt;
  );
};

const Item = styled.li`
  display: flex;
  width: 100%;
  height: 40px;
  margin-bottom: 10px;

  &amp;amp;:last-child {
    margin-bottom: 0;
  }
`;

const CheckBox = styled.input`
  width: 20px;
  height: 100%;
  margin-right: 5px;
`;

const Content = styled.p`
  margin-right: 5px;
  line-height: 40px;
  border-bottom: 1px solid rgba(0, 0, 0, 0.11);
  flex: 1;

  ${({ isCompleted }) =&amp;gt;
    isCompleted &amp;amp;&amp;amp;
    `
  color: rgba(0, 0, 0, 0.3);
  text-decoration: line-through;
  `}
`;

export default ToDoItem;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;TodoItem의 props로는 리스트의 데이터인 item과 item의 체크 여부를 위한 onComplete 이벤트를 받고 삭제를 위한 onDelete를 부모 컴포넌트에서 props로 받습니다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Vue&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1640616128735&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!--ToDoItem.vue--&amp;gt;
&amp;lt;template&amp;gt;
  &amp;lt;li class=&quot;item&quot;&amp;gt;
    &amp;lt;input
      type=&quot;checkbox&quot;
      class=&quot;item__checkbox&quot;
      @change=&quot;$emit('onComplete', todo.id)&quot;
    /&amp;gt;
    &amp;lt;p
      class=&quot;item__content&quot;
      :class=&quot;{ 'item__content--completed': todo.isCompleted }&quot;
    &amp;gt;
      {{ todo.content }}
    &amp;lt;/p&amp;gt;
    &amp;lt;Button type=&quot;button&quot; name=&quot;삭제하기&quot; @click=&quot;$emit('onDelete', todo.id)&quot; /&amp;gt;
  &amp;lt;/li&amp;gt;
&amp;lt;/template&amp;gt;

&amp;lt;script&amp;gt;
import Button from &quot;./Button.vue&quot;;

export default {
  components: {
    Button,
  },
  props: {
    todo: Object,
  },
};
&amp;lt;/script&amp;gt;

&amp;lt;style scoped&amp;gt;
.item {
  display: flex;
  width: 100%;
  height: 40px;
  margin-bottom: 10px;
}
.item:last-child {
  margin-bottom: 0;
}
.item__checkbox {
  width: 20px;
  height: 100%;
  margin-right: 5px;
}
.item__content {
  margin-right: 5px;
  line-height: 40px;
  border-bottom: 1px solid rgba(0, 0, 0, 0.11);
  flex: 1;
}
.item__content--completed {
  color: rgba(0, 0, 0, 0.3);
  text-decoration: line-through;
}
&amp;lt;/style&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;Vue 또한 props로는 리스트의 데이터인 todo를 부모 컴포넌트에서 props로 받지만 체크 여부를 위한 onComplete와 onDelete는 emit을 이용하여 부모 컴포넌트로 데이터를 전달합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://baegofda.tistory.com/252&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;2022.02.01 - [Vue] -   TODO ! - 컴포넌트 분리하기 (feat. 상태관리(state), function)&lt;/a&gt;&lt;/p&gt;</description>
      <category>Vue</category>
      <category>baegofda</category>
      <category>Emit</category>
      <category>react</category>
      <category>react props</category>
      <category>TODOLIST</category>
      <category>vue</category>
      <category>vue props</category>
      <category>vue입문</category>
      <category>오물오물</category>
      <author>baegofda_</author>
      <guid isPermaLink="true">https://baegofda.tistory.com/246</guid>
      <comments>https://baegofda.tistory.com/246#entry246comment</comments>
      <pubDate>Mon, 27 Dec 2021 23:44:35 +0900</pubDate>
    </item>
    <item>
      <title>  TODO ! - 컴포넌트 import, state 선언</title>
      <link>https://baegofda.tistory.com/245</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;  &lt;b&gt;컴포넌트 사용하기 !&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;먼저 import와 state선언을 알아보겠습니다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;해당 예제는&lt;br /&gt;Vue : &lt;a href=&quot;https://github.com/baegofda/blog-vue&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://github.com/baegofda/blog-vue&lt;/a&gt;&lt;br /&gt;React: &lt;a href=&quot;https://github.com/baegofda/blog-react&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://github.com/baegofda/blog-react&lt;/a&gt;&amp;nbsp;&lt;br /&gt;위의 주소에서 데모와 함께 소스코드 확인이 가능합니다 !&lt;/blockquote&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1.&lt;/b&gt; &lt;b&gt;import&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;먼저 전체 컨테이너가 될 Todos라는 페이지 컴포넌트를 임포트하는 방법입니다.&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;React&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;React 프로젝트의 App.js에 import는 아래와 같이 파일 상단에 import를 합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1640181320829&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// App.js
import Todos from &quot;./pages/Todos&quot;;

function App() {
  return &amp;lt;Todos /&amp;gt;;
}

export default App;&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Vue&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;Vue 프로젝트의 App.vue에 import를 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Vue에서는 컴포넌트를 import 할시 script 태그내에 import를 한 후 export default {}; 의 내부에 components라는 속성에 등록을 해주어야 합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1640182054504&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!--App.vue--&amp;gt;
&amp;lt;template&amp;gt;
  &amp;lt;Todos /&amp;gt;
&amp;lt;/template&amp;gt;

&amp;lt;script&amp;gt;
import Todos from &quot;./pages/Todos.vue&quot;;

export default {
  name: &quot;App&quot;,
  components: {
    Todos,
  },
};
&amp;lt;/script&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;&lt;b&gt;2.&lt;/b&gt; &lt;b&gt;state&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;컴포넌트에서 사용할 state의 선언에대해서 알아보겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span&gt;React&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;span&gt;React에서의 state는 컴포넌트 선언부 아래에 useRef(), useSate()를 이용하여 state를 선언하고 관리합니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1640189001640&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// ToDos.jsx
const ToDos = () =&amp;gt; {
  const inputRef = useRef();
  const [inputText, setInputText] = useState(&quot;&quot;);
  const [items, setItems] = useState([]);

   // function

  return (
   // UI
  );
};&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Vue&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;Vue는 script 태그 export default {}; 의 내부에 data()에서 관리를 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Vue에서는 컴포넌트를 import 할시 script 태그내에 import를 한 후&lt;span&gt;&amp;nbsp;&lt;/span&gt;export default {}; 의 내부에 components라는 속성에 등록을 해주어야 합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1640189138320&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;template&amp;gt;
  &amp;lt;!--UI--&amp;gt;
&amp;lt;/template&amp;gt;
&amp;lt;script&amp;gt;
import Button from &quot;../components/Button.vue&quot;;
import ToDoItem from &quot;../components/ToDoItem.vue&quot;;

export default {
  name: &quot;Todos&quot;,
  data() {
    return {
      inputText: &quot;&quot;,
      todos: [],
    };
  },
  methods: {
    // function
  },
  components: {
    // component
  },
};
&amp;lt;/script&amp;gt;

&amp;lt;style scoped&amp;gt;
// css
&amp;lt;/style&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://baegofda.tistory.com/246&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;2021.12.27 - [Vue] -  ️ TODO ! - 컴포넌트 분리하기 (feat. component, props)&lt;/a&gt;&lt;/p&gt;</description>
      <category>Vue</category>
      <category>vue</category>
      <category>vue state</category>
      <category>vue예제</category>
      <category>vu입문</category>
      <category>오물오물</category>
      <category>프론트엔드</category>
      <author>baegofda_</author>
      <guid isPermaLink="true">https://baegofda.tistory.com/245</guid>
      <comments>https://baegofda.tistory.com/245#entry245comment</comments>
      <pubDate>Thu, 23 Dec 2021 01:25:32 +0900</pubDate>
    </item>
    <item>
      <title>  TODO ! - 형태 알아가기</title>
      <link>https://baegofda.tistory.com/244</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt; &lt;b&gt; TODO 예제 시작 !&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;이번 포스팅부터는 아래의 간단한 TODO의 코드를보며 Vue에 대해 알아가볼 예정입니다. &lt;span style=&quot;color: #ee2323;&quot;&gt;#간단주의&lt;/span&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;해당 예제는&lt;br /&gt;Vue :&amp;nbsp;&lt;a href=&quot;https://github.com/baegofda/blog-vue&quot;&gt;https://github.com/baegofda/blog-vue&lt;/a&gt;&lt;br /&gt;React:&amp;nbsp;&lt;a href=&quot;https://github.com/baegofda/blog-react&quot;&gt;https://github.com/baegofda/blog-react&lt;/a&gt;&amp;nbsp;&lt;br /&gt;위의 주소에서 데모와 함께 소스코드 확인이 가능합니다 !&lt;/blockquote&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1918&quot; data-origin-height=&quot;977&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dhHSbb/btror2gaOm0/I5iW4ogECwcKa8KQeXrG5K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dhHSbb/btror2gaOm0/I5iW4ogECwcKa8KQeXrG5K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dhHSbb/btror2gaOm0/I5iW4ogECwcKa8KQeXrG5K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdhHSbb%2Fbtror2gaOm0%2FI5iW4ogECwcKa8KQeXrG5K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1918&quot; height=&quot;977&quot; data-origin-width=&quot;1918&quot; data-origin-height=&quot;977&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt; &lt;b&gt; 특징&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;먼저 React와 Vue 코드의 차이점들을 간단하게 코드의 형태로 알아보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;React의 통상적인 형태는 아래와 같습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1640007559621&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import React, { useRef, useState } from &quot;react&quot;;
import styled from &quot;styled-components&quot;;
import Button from &quot;../components/Button&quot;;
import ToDoItem from &quot;../components/ToDoItem&quot;;

const ToDos = () =&amp;gt; {
  // JS Code, React Hooks, etc..

  return (
    // JSX 문법
  );
};

const Wrapper = styled.main`
  padding-top: 150px;
`;
const Title = styled.h1`
  margin-bottom: 50px;
  font-size: 30px;
  font-weight: 700;
  text-align: center;
`;
const InputContainer = styled.form`
  display: flex;
  width: 400px;
  height: 40px;
  margin-bottom: 20px;
`;
const Input = styled.input`
  margin-right: 5px;
  background-color: transparent;
  border: 0;
  outline: 0;
  border-bottom: 1px solid rgba(0, 0, 0, 0.7);
  flex: 1;
`;

export default ToDos;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;React는 상단에 사용할 컴포넌트, 파일, Hooks 등을 import를 합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1640007702673&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import React, { useRef, useState } from &quot;react&quot;;
import styled from &quot;styled-components&quot;;
import Button from &quot;../components/Button&quot;;
import ToDoItem from &quot;../components/ToDoItem&quot;;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;아래엔 component에대한 코드를 작성하며 state, js, Hooks 등을 작성하고 return 이후 JSX문법을 이용하여 UI 코드를 작성합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1640007823596&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const ToDos = () =&amp;gt; {
  // state, JS Code, React Hooks, function, etc..

  return (
    // JSX 문법
  );
};&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;스타일링을 위한 css는 외부에서 import를 하거나 styled-components, emotion 사용 시 component 코드 전후로 작성을 합니다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1640008033637&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const Wrapper = styled.main`
  padding-top: 150px;
`;
const Title = styled.h1`
  margin-bottom: 50px;
  font-size: 30px;
  font-weight: 700;
  text-align: center;
`;
const InputContainer = styled.form`
  display: flex;
  width: 400px;
  height: 40px;
  margin-bottom: 20px;
`;
const Input = styled.input`
  margin-right: 5px;
  background-color: transparent;
  border: 0;
  outline: 0;
  border-bottom: 1px solid rgba(0, 0, 0, 0.7);
  flex: 1;
`;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;이번엔 Vue의 코드입니다.&lt;/p&gt;
&lt;pre id=&quot;code_1640008425383&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;template&amp;gt;
  &amp;lt;main class=&quot;wrapper&quot;&amp;gt;
    &amp;lt;h1 class=&quot;title&quot;&amp;gt;TODO&amp;lt;/h1&amp;gt;
    &amp;lt;form class=&quot;form&quot;&amp;gt;
      &amp;lt;input
        ref=&quot;todoInput&quot;
        type=&quot;text&quot;
        class=&quot;form__input&quot;
        placeholder=&quot;추가할 리스트를 입력하여 주세요 !&quot;
        v-model=&quot;inputText&quot;
      /&amp;gt;
      &amp;lt;Button type=&quot;submit&quot; name=&quot;추가하기&quot; @click=&quot;onClick&quot; /&amp;gt;
    &amp;lt;/form&amp;gt;
    &amp;lt;ul&amp;gt;
      &amp;lt;ToDoItem
        v-for=&quot;todo in todos&quot;
        :key=&quot;todo.id&quot;
        :todo=&quot;todo&quot;
        @onComplete=&quot;onComplete($event)&quot;
        @onDelete=&quot;onDelete($event)&quot;
      /&amp;gt;
    &amp;lt;/ul&amp;gt;
  &amp;lt;/main&amp;gt;
&amp;lt;/template&amp;gt;
&amp;lt;script&amp;gt;
import Button from &quot;../components/Button.vue&quot;;
import ToDoItem from &quot;../components/ToDoItem.vue&quot;;

export default {
  name: &quot;Todos&quot;,
  components: {
    // import 된 component 등록
  },
  data() {
    return {
      // state
    };
  },
  methods: {
    // function
  },
};
&amp;lt;/script&amp;gt;

&amp;lt;style scoped&amp;gt;
.wrapper {
  padding-top: 150px;
}
.title {
  margin-bottom: 50px;
  font-size: 30px;
  font-weight: 700;
  text-align: center;
}
.form {
  display: flex;
  width: 400px;
  height: 40px;
  margin-bottom: 20px;
}
.form__input {
  margin-right: 5px;
  background-color: transparent;
  border: 0;
  outline: 0;
  border-bottom: 1px solid rgba(0, 0, 0, 0.7);
  flex: 1;
}
&amp;lt;/style&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;React와 달리 상단에 template가 먼저 등장하며 html과 Vue 문법을 이용한 UI 코드를 작성합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1640008610248&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;template&amp;gt;
  &amp;lt;!-- Vue template 문법 --&amp;gt;
  &amp;lt;main class=&quot;wrapper&quot;&amp;gt;
    &amp;lt;h1 class=&quot;title&quot;&amp;gt;TODO&amp;lt;/h1&amp;gt;
    &amp;lt;form class=&quot;form&quot;&amp;gt;
      &amp;lt;input
        ref=&quot;todoInput&quot;
        type=&quot;text&quot;
        class=&quot;form__input&quot;
        placeholder=&quot;추가할 리스트를 입력하여 주세요 !&quot;
        v-model=&quot;inputText&quot;
      /&amp;gt;
      &amp;lt;Button type=&quot;submit&quot; name=&quot;추가하기&quot; @click=&quot;onClick&quot; /&amp;gt;
    &amp;lt;/form&amp;gt;
    &amp;lt;ul&amp;gt;
      &amp;lt;ToDoItem
        v-for=&quot;todo in todos&quot;
        :key=&quot;todo.id&quot;
        :todo=&quot;todo&quot;
        @onComplete=&quot;onComplete($event)&quot;
        @onDelete=&quot;onDelete($event)&quot;
      /&amp;gt;
    &amp;lt;/ul&amp;gt;
  &amp;lt;/main&amp;gt;
&amp;lt;/template&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;이후 script태그가 등장하며 내부에 사용할 component의 import, state, function 등을 작성합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1640008768916&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;script&amp;gt;
import Button from &quot;../components/Button.vue&quot;;
import ToDoItem from &quot;../components/ToDoItem.vue&quot;;

export default {
  name: &quot;Todos&quot;,
  components: {
    // import 된 component 등록
  },
  data() {
    return {
      // state
    };
  },
  methods: {
    // function
  },
};
&amp;lt;/script&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;마지막으로 css에 관한 style태그가 있으며 마찬가지로 외부에서 import 해서 사용할 수 있지만 내부에서 작성을 합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1640008960031&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;style scoped&amp;gt;
.wrapper {
  padding-top: 150px;
}
.title {
  margin-bottom: 50px;
  font-size: 30px;
  font-weight: 700;
  text-align: center;
}
.form {
  display: flex;
  width: 400px;
  height: 40px;
  margin-bottom: 20px;
}
.form__input {
  margin-right: 5px;
  background-color: transparent;
  border: 0;
  outline: 0;
  border-bottom: 1px solid rgba(0, 0, 0, 0.7);
  flex: 1;
}
&amp;lt;/style&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;이렇게 비슷한 듯 다른 구조를 가지고 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;* 코드 구조의 형태는 프로젝트마다 다를 수 있으나 통상적으로 사용되는 형태로 비교하였습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://baegofda.tistory.com/245&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;2021.12.23 - [Vue] -   TODO ! - 컴포넌트 import, state 선언&lt;/a&gt;&lt;/p&gt;</description>
      <category>Vue</category>
      <category>baegofda</category>
      <category>react</category>
      <category>TODO</category>
      <category>vue</category>
      <category>vue시작하기</category>
      <category>vue예제</category>
      <category>vue입문</category>
      <category>오물오물</category>
      <author>baegofda_</author>
      <guid isPermaLink="true">https://baegofda.tistory.com/244</guid>
      <comments>https://baegofda.tistory.com/244#entry244comment</comments>
      <pubDate>Mon, 20 Dec 2021 23:08:55 +0900</pubDate>
    </item>
    <item>
      <title>  Vue 시작하기 !</title>
      <link>https://baegofda.tistory.com/243</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;✨&lt;b&gt; 시작하기 앞서 !&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;오랫동안 멈춰있던 포스팅을 시작하기 위해 Vue 입문을 위한 간단한 포스팅을 시작할 예정입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;작성된 Vue 입문의 글들은 React와 비교하며 작성될 예정입니다 !&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한 Node.js, npm과 yarn이 설치되어있다는 전제로 진행합니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  &lt;b&gt;설치 및 프로젝트 생성하기&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;React와 Vue 모두 CLI 기반의 설치를 지원합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;React의 경우 손쉽게 시작할 수 있게 해주는 React의 CRA를 설치합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1639900885922&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;npm install -g creat-react-app
# OR
yarn global add creat-react-app

# 제대로 설치되어있는지 확인
create-react-app --version&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;408&quot; data-origin-height=&quot;64&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/UCNPg/btrocTydk60/twYeYTwFZCPtTkOh6L7YR1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/UCNPg/btrocTydk60/twYeYTwFZCPtTkOh6L7YR1/img.png&quot; data-alt=&quot;제대로 설치가 되었다면 버전이 뜨게됩니다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/UCNPg/btrocTydk60/twYeYTwFZCPtTkOh6L7YR1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FUCNPg%2FbtrocTydk60%2FtwYeYTwFZCPtTkOh6L7YR1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;408&quot; height=&quot;64&quot; data-origin-width=&quot;408&quot; data-origin-height=&quot;64&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;제대로 설치가 되었다면 버전이 뜨게됩니다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이후 프로젝트 생성을 위한 CRA 명령어를 실행합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1639900984877&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;yarn create react-app 프로젝트명&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Vue 또한 프로젝트 빌드를 위한 CLI를 우선 설치합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1639901299420&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;npm install -g @vue/cli
# OR
yarn global add @vue/cli

# 제대로 설치되어있는지 확인
vue --version&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;364&quot; data-origin-height=&quot;56&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/FXHx6/btrob0EiUfI/hkzkbngKKTTb4rvSqdarKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/FXHx6/btrob0EiUfI/hkzkbngKKTTb4rvSqdarKK/img.png&quot; data-alt=&quot;제대로 설치가 되었다면 버전이 뜨게됩니다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/FXHx6/btrob0EiUfI/hkzkbngKKTTb4rvSqdarKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFXHx6%2Fbtrob0EiUfI%2FhkzkbngKKTTb4rvSqdarKK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;364&quot; height=&quot;56&quot; data-origin-width=&quot;364&quot; data-origin-height=&quot;56&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;제대로 설치가 되었다면 버전이 뜨게됩니다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이후 프로젝트 생성을 위한 CLI 명령어를 실행합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1639901383930&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;vue create 프로젝트명&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Vue는 아래와 같이 방향키로 버전을 고르게 됩니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;581&quot; data-origin-height=&quot;223&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/7PFKS/btrohTRh9tI/ma6Ay4pphU6w0ohO1kkkDK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/7PFKS/btrohTRh9tI/ma6Ay4pphU6w0ohO1kkkDK/img.png&quot; data-alt=&quot;현재 예제는 Vue3로 생성하였습니다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/7PFKS/btrohTRh9tI/ma6Ay4pphU6w0ohO1kkkDK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F7PFKS%2FbtrohTRh9tI%2Fma6Ay4pphU6w0ohO1kkkDK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;581&quot; height=&quot;223&quot; data-origin-width=&quot;581&quot; data-origin-height=&quot;223&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;현재 예제는 Vue3로 생성하였습니다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 위의 화면에서 방향키로 움직이지 않는다면 아래의 명령어로 실행해야 합니다.&lt;/p&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;winpty vue.cmd create 프로젝트명&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt; &amp;nbsp;&lt;b&gt;프로젝트 실행하기&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;React의 프로젝트를 열어보면 아래와 같이 기본으로 구성되어 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;251&quot; data-origin-height=&quot;248&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mZ3fM/btrogwB4TlG/u2azKuBwdDwwmSg9cvTTZ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mZ3fM/btrogwB4TlG/u2azKuBwdDwwmSg9cvTTZ1/img.png&quot; data-alt=&quot;React CRA의 기본 구조&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mZ3fM/btrogwB4TlG/u2azKuBwdDwwmSg9cvTTZ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmZ3fM%2FbtrogwB4TlG%2Fu2azKuBwdDwwmSg9cvTTZ1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;251&quot; height=&quot;248&quot; data-origin-width=&quot;251&quot; data-origin-height=&quot;248&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;React CRA의 기본 구조&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;확인을 위한 프로젝트 실행 명령어를 입력합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1639902856530&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;yarn start&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정상적으로 실행된다면 명령어 이후 자동적으로 아래와 같은 웹페이지가 열리게 됩니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1918&quot; data-origin-height=&quot;977&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/MqYF4/btrolTwgmfW/2V5NNdVe8yUElz881w69C1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/MqYF4/btrolTwgmfW/2V5NNdVe8yUElz881w69C1/img.png&quot; data-alt=&quot;사진과 같은 페이지가 뜬다면 성공 !&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/MqYF4/btrolTwgmfW/2V5NNdVe8yUElz881w69C1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMqYF4%2FbtrolTwgmfW%2F2V5NNdVe8yUElz881w69C1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1918&quot; height=&quot;977&quot; data-origin-width=&quot;1918&quot; data-origin-height=&quot;977&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;사진과 같은 페이지가 뜬다면 성공 !&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번엔 Vue의 프로젝트를 열어보겠습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;253&quot; data-origin-height=&quot;245&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nMXbW/btrolTpu8QI/0D5wQ4I3h9R1wdIPOKGH7K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nMXbW/btrolTpu8QI/0D5wQ4I3h9R1wdIPOKGH7K/img.png&quot; data-alt=&quot;구성은 React와 비슷합니다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nMXbW/btrolTpu8QI/0D5wQ4I3h9R1wdIPOKGH7K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnMXbW%2FbtrolTpu8QI%2F0D5wQ4I3h9R1wdIPOKGH7K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;253&quot; height=&quot;245&quot; data-origin-width=&quot;253&quot; data-origin-height=&quot;245&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;구성은 React와 비슷합니다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Vue의 프로젝트 실행 명령어는 아래와 같습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1639903158642&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;yarn serve&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Vue는 React처럼 웹페이지가 자동적으로 열리지는 않고 결과를 확인하여 해당 localhost로 접속하여야 합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;697&quot; data-origin-height=&quot;174&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cMnOQn/btrocrosvgh/5YgKXut4JY2vM3ERkJLrmK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cMnOQn/btrocrosvgh/5YgKXut4JY2vM3ERkJLrmK/img.png&quot; data-alt=&quot;Ctrl + click으로 바로 접속 가능합니다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cMnOQn/btrocrosvgh/5YgKXut4JY2vM3ERkJLrmK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcMnOQn%2Fbtrocrosvgh%2F5YgKXut4JY2vM3ERkJLrmK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;697&quot; height=&quot;174&quot; data-origin-width=&quot;697&quot; data-origin-height=&quot;174&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Ctrl + click으로 바로 접속 가능합니다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1918&quot; data-origin-height=&quot;977&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GtihM/btroeAkoABo/LN6Ovv5VYMTrUi2QrH6DDk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GtihM/btroeAkoABo/LN6Ovv5VYMTrUi2QrH6DDk/img.png&quot; data-alt=&quot;위와 같은 Vue의 초기 실행화면이 보인다면 성공 !&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GtihM/btroeAkoABo/LN6Ovv5VYMTrUi2QrH6DDk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGtihM%2FbtroeAkoABo%2FLN6Ovv5VYMTrUi2QrH6DDk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1918&quot; height=&quot;977&quot; data-origin-width=&quot;1918&quot; data-origin-height=&quot;977&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;위와 같은 Vue의 초기 실행화면이 보인다면 성공 !&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로젝트 구조의 내부는 큰 차이는 없습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Untitled-1.jpg&quot; data-origin-width=&quot;484&quot; data-origin-height=&quot;370&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bfZs8N/btroedbm8Pl/h04bbRn55m2Hlw1BmIXwd0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bfZs8N/btroedbm8Pl/h04bbRn55m2Hlw1BmIXwd0/img.jpg&quot; data-alt=&quot;React에 비해 Vue는 assets, components파일이 추가되어있습니다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bfZs8N/btroedbm8Pl/h04bbRn55m2Hlw1BmIXwd0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbfZs8N%2Fbtroedbm8Pl%2Fh04bbRn55m2Hlw1BmIXwd0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;484&quot; height=&quot;370&quot; data-filename=&quot;Untitled-1.jpg&quot; data-origin-width=&quot;484&quot; data-origin-height=&quot;370&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;React에 비해 Vue는 assets, components파일이 추가되어있습니다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 Vue, React 모두 손쉽게 프로젝트 빌드를 위해 CLI의 형태로 제공되고 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이후 간단한 TODO 예제로 이어가겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://baegofda.tistory.com/244&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;2021.12.20 - [Vue] -   TODO ! - 형태 알아가기&lt;/a&gt;&lt;/p&gt;</description>
      <category>Vue</category>
      <category>baegofda</category>
      <category>react</category>
      <category>vue</category>
      <category>Vue2</category>
      <category>vue3</category>
      <category>vue시작</category>
      <category>vue입문</category>
      <category>뷰</category>
      <category>뷰입문</category>
      <category>오물오물</category>
      <author>baegofda_</author>
      <guid isPermaLink="true">https://baegofda.tistory.com/243</guid>
      <comments>https://baegofda.tistory.com/243#entry243comment</comments>
      <pubDate>Sun, 19 Dec 2021 17:57:25 +0900</pubDate>
    </item>
    <item>
      <title>  React 주니어의 Vue 전환기 Coming soon..</title>
      <link>https://baegofda.tistory.com/242</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt; &amp;zwj;♂️&lt;b&gt; 어쩌다 만난 그대.. Vue&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;이번에 이직을 하게되며 React.js가 아닌 Vue.js기반을 사용하게 되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;더 나아가 검색최적화(SEO)를 위해 Nuxt.js를 도입할 예정이다 !&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;때문에 알아보는 간단 React와 Vue 차이점을 알아봅시다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt; &lt;b&gt; React는 &lt;span style=&quot;color: #006dd7;&quot;&gt;라이브러리&lt;/span&gt;이고 Vue는&amp;nbsp;&lt;span style=&quot;color: #ee2323;&quot;&gt;프레임워크&lt;/span&gt;이다.&lt;/b&gt;&lt;b&gt;&lt;b&gt;&lt;span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://baegofda.tistory.com/184&quot;&gt;라이브러리와 프레임워크 차이를 모르신다면?&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 네, 가장큰 차이점은 React는 &lt;span style=&quot;color: #006dd7;&quot;&gt;라이브러리&lt;/span&gt;이고 Vue는 &lt;span style=&quot;color: #ee2323;&quot;&gt;프레임워크&lt;/span&gt;입니다. 여기서 뜻하는 바는 React는 라이브러리인 만큼 자율성이 높아 구현하는 개발자들 특성에 따라서 구현, 구조의 차이가 있습니다. React는 JSX라는 문법으로 구현하지만 문법 내부에서 JS를 통하여 구현하는 자율도가 높은 반면 Vue는 Template형식으로 정해져있는 문법으로만 구현이 가능합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래는 간단한 예시입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;만약 로딩상태에 보여주고싶은 Loading이라는 컴포넌트가 있다면 React에서는 아래와 같은 방법 또는 이외의 방법이 더 있습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1633161406350&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// &amp;amp;&amp;amp; 연산자
&amp;lt;div&amp;gt;
	{isLoading &amp;amp;&amp;amp; &amp;lt;Loading/&amp;gt;}
&amp;lt;/div&amp;gt;

// 삼항 연산자
&amp;lt;div&amp;gt;
	{isVisible ? &amp;lt;Loading/&amp;gt; : null}
&amp;lt;/div&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;Vue에서는 v-if라는 문법으로 아래와 같이 가능합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1633161520517&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;div&amp;gt;
	&amp;lt;Loading v-if=&quot;isLoading&quot;/&amp;gt;
&amp;lt;/div&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;또 리스트를 보여주고 todos가있을경우 React는 아래처럼 사용합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1633162118896&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;ul&amp;gt;
	{
            todos.map(todo =&amp;gt; (
            	&amp;lt;li key={todo.id}&amp;gt;{todo.content}&amp;lt;/li&amp;gt;
            ))
	}
&amp;lt;/ul&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;이외에도 for, forEach등을 이용하여 구현이 가능합니다. 하지만 Vue에서는 v-for 문법으로 가능합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1633162337870&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;ul&amp;gt;
	&amp;lt;li v-for=&quot;todo in todos&quot; :key=&quot;todo.id&quot;&amp;gt;{{todo.content}}&amp;lt;/li&amp;gt;
&amp;lt;/ul&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;위와 같은 차이점만을 가지고서라도 구현이나 접근성덕에 낮은 러닝커브를 이점으로 빠르게 배워서 SPA구현이 필요한 개발자들에게 더더욱 추천 해줄 프레임워크입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;이외에 속도측면이나 타입스크립트 지원 부분에대한 차이점 등등 여럿 존재하나 링크로 남기고 이후 React와 Vue의 자세한 문법들을 알아보도록 하겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://joshua1988.github.io/web_dev/vue-or-react/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;React인가 Vue인가 ? - 캡틴판교&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1633163321868&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;React 인가 Vue 인가?&quot; data-og-description=&quot;(번역) 프론트엔드 프레임워크 왕 React 와 신흥강자 Vue 를 프레임워크 특성에서 비교한 글&quot; data-og-host=&quot;joshua1988.github.io&quot; data-og-source-url=&quot;https://joshua1988.github.io/web_dev/vue-or-react/&quot; data-og-url=&quot;https://joshua1988.github.io/web_dev/vue-or-react/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/chucm5/hyLPkwCFqp/4Kgf4KikZ3nORYx7v4XzR0/img.png?width=600&amp;amp;height=321&amp;amp;face=0_0_600_321,https://scrap.kakaocdn.net/dn/RjB9F/hyLPl3mUSS/r30KJQ4zss0XomKQEhwwk0/img.png?width=461&amp;amp;height=460&amp;amp;face=0_0_461_460&quot;&gt;&lt;a href=&quot;https://joshua1988.github.io/web_dev/vue-or-react/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://joshua1988.github.io/web_dev/vue-or-react/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/chucm5/hyLPkwCFqp/4Kgf4KikZ3nORYx7v4XzR0/img.png?width=600&amp;amp;height=321&amp;amp;face=0_0_600_321,https://scrap.kakaocdn.net/dn/RjB9F/hyLPl3mUSS/r30KJQ4zss0XomKQEhwwk0/img.png?width=461&amp;amp;height=460&amp;amp;face=0_0_461_460');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;React 인가 Vue 인가?&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;(번역) 프론트엔드 프레임워크 왕 React 와 신흥강자 Vue 를 프레임워크 특성에서 비교한 글&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;joshua1988.github.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://d2.naver.com/helloworld/6951656&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;2020년과 이후 JavaScript의 동향 - 라이브러리와 프레임워크 2 - 네이버 D2&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://baegofda.tistory.com/243&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;2021.12.19 - [Vue] -   Vue 시작하기 !&lt;/a&gt;&lt;/p&gt;</description>
      <category>Vue</category>
      <category>nuxt</category>
      <category>nuxt.js</category>
      <category>react</category>
      <category>react.js</category>
      <category>react와 vue</category>
      <category>react탈출</category>
      <category>vue</category>
      <category>Vue.js</category>
      <category>vue3</category>
      <category>프론트엔드</category>
      <author>baegofda_</author>
      <guid isPermaLink="true">https://baegofda.tistory.com/242</guid>
      <comments>https://baegofda.tistory.com/242#entry242comment</comments>
      <pubDate>Sat, 2 Oct 2021 15:18:16 +0900</pubDate>
    </item>
    <item>
      <title>  내가 자주쓰는 git 명령어 !</title>
      <link>https://baegofda.tistory.com/223</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;로컬로 원격에있는 브랜치 가져오기&lt;/p&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt; $ git remote update  

 $ git branch -r  

 $ git checkout -t origin/원하는 브랜치&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;브랜드 이름변경&lt;/p&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt; $ git branch -m 이전이름 변경될이름&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;브랜치 삭제하기 (로컬)&lt;/p&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt; $ git branch -d &amp;lt;branchname&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;브랜치 삭제하기 (원격)&lt;/p&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt; $ git push origin --delete &amp;lt;branchname&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;브랜치 생성&lt;/p&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt; $ git branch branch-name

// 또는

 $ git branch child-name parents-name

// 또는 따올 브랜치에서

 $ git branch 생성할브랜치이름&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;브랜치 생성후 바로 체크아웃&lt;/p&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt; $ git checkout -b branch-name&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;생성한 브랜치 원격 저장소에 저장하기&lt;/p&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt; $ git push -u origin branch-name&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;머지하기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;머지당할 브랜치로 이동후&lt;/p&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt; $ git merge 병합할브랜치&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특정 브랜치에서 땡겨오기&lt;/p&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt; $ git pull origin 브랜치이름&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;로컬 변경사항 저장하기&lt;/p&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt; $ git stash&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최근 stash 목록에서 삭제 및 로컬 적용하기&lt;/p&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt; $ git stash pop&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;git push 인증하기&lt;/p&gt;
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;personal acces&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://firstquarter.tistory.com/entry/Git-%ED%86%A0%ED%81%B0-%EC%9D%B8%EC%A6%9D-%EB%A1%9C%EA%B7%B8%EC%9D%B8-remote-Support-for-password-authentication-was-removed-on-August-13-2021-Please-use-a-personal-access-token-instead&quot;&gt;personal access 인증하는법&lt;/a&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: disc;&quot; start=&quot;2&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ssh key 등록 및 인증하기&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://goddaehee.tistory.com/254&quot;&gt;ssh key 인증하여 자동으로 인증하기&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;git merge 취소하기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://velog.io/@henotony/git-%EB%AA%85%EB%A0%B9-%EC%B7%A8%EC%86%8C%EB%90%98%EB%8F%8C%EB%A6%AC%EA%B8%B0&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://velog.io/@henotony/git-%EB%AA%85%EB%A0%B9-%EC%B7%A8%EC%86%8C%EB%90%98%EB%8F%8C%EB%A6%AC%EA%B8%B0&lt;/a&gt;&lt;/p&gt;</description>
      <category>기타</category>
      <category>GIT</category>
      <category>git push</category>
      <category>Git stash</category>
      <category>Git 명령어</category>
      <category>git 인증하기</category>
      <category>personal acces</category>
      <category>ssh key</category>
      <category>나만보기위한 메모</category>
      <category>오물오물</category>
      <category>자주쓰는 git</category>
      <author>baegofda_</author>
      <guid isPermaLink="true">https://baegofda.tistory.com/223</guid>
      <comments>https://baegofda.tistory.com/223#entry223comment</comments>
      <pubDate>Sun, 22 Aug 2021 15:06:09 +0900</pubDate>
    </item>
    <item>
      <title>  Flux 패턴 ?</title>
      <link>https://baegofda.tistory.com/237</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt; &amp;zwj;♀️ Flux 란?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Flux는 MVC 모델의 단점을 보안하기 위해 만든 페이스북에서 발표한 패턴(pattern)입니다.&lt;br /&gt;React, Redux의 디자인 패턴이기도 합니다. 이러한 Flux 패턴에 영감을 받아 Vue에서는 Vuex를 만들어서 사용합니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  MVC 패턴 ?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; MVC(Model View Controller) 패턴은 &quot;무엇을 할지&quot;(Model) 내부 비지니스 로직을 처리하고, &quot;무엇을 보여줄지&quot;(View) 유저에게 화면을 보여주기 위함을 처리하고, &quot;어떻게 처리할지&quot;(Controller) 사용자의 요청을 받아서 어떻게 처리하고 보여줄지 Model과 View를 요청합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://velopert.com/wp-content/uploads/2016/04/MVC.png&quot; /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/2311AC46521AF3E80A&quot; /&gt;&lt;/p&gt;
&lt;p align=&quot;center&quot; data-ke-size=&quot;size16&quot;&gt;*Java MVC2&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  MVC 한계&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; MVC(Model View Controller) 패턴에는 Model과 View가 양방향 패턴에서 나오는 의존성을 가진다는 특성이 있습니다. 이는 복잡한 어플리케이션을 서비스하게 된다면 새로운 기능이 추가 될 떄마다 시스템의 복잡도를 기하급수적으로 증가 시키고, 예측 불가능한 코드를 만들게 되며, 예측 못할 버그들이 쏟아지게 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FALrHe%2FbtqBTMSuHfN%2FZlW9i9ET34e90APgCRChk1%2Fimg.png&quot; /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;페이스북이 가졌던 문제점 중 한가지는 바로 알림(notification)버그 입니다. 페이스북에 로그인 했을 때 메시지 아이콘에 알림이 떠 있지만, 그 메시지 아이콘을 클릭하면 아무런 메시지가 없는등의 버그가 생긴겁니다. 또 알림은 사라지겠지만, 몇 분 뒤 알림이 다시 나타나고 다시 아무런 메시지는 나타나지 않습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAeyYk%2FbtqBO7RutbO%2FjF8wxI6kwsXxKk2Qg6D5dk%2Fimg.png&quot; /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fekb6k6%2Fbtq2trClwna%2FZjKvGYAwkIpIravAIGwBd0%2Fimg.png&quot; /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;이러한 악순환은 페이스북 개발자들이 문제를 해결하더라도 다시 문제가 생기는 사이클이 계속 반복되었습니다.&lt;br /&gt;때문에 이를 해결하기 위한 Flux라는 흐름을 도입하게 되었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  Flux !&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 위의 MVC패턴을 벗어나고자 고안해낸것이 다른 종류의 아키텍처 Flux입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlmfPW%2FbtqBQnTPgIs%2FZ1jmHHdNcOTNiu93kQ9gMk%2Fimg.png&quot; /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbr7Ob3%2Fbtq2ryaSMx3%2FPKrNxFuaeHSgRxusCmCur1%2Fimg.png&quot; /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;Flux의 가장 큰 특징은 단방향 데이터 흐름입니다. 흐름은 항상 Dispatcher에서 Store로 Store에서 View로, View는 Action을 통해 다시 Dispatcher로 데이터가 흐릅니다. 이러한 단방향 데이터 흐름을 이용하면 데이터의 변화를 예측 하기 쉽게 만들게 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  자세히 알아보기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. Dispatcher&lt;/h3&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;Dispatcher는 데이터의 흐름을 관리하는 허브 역할입니다. Action이 발생되면 Dispatcher로 전달되며 Dispatcher는 전달된 Action을 보고, 등록된 콜백을 실행하여 Stroe에 데이터를 전달하게 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. Action&lt;/h3&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;Dispatcher에서 콜백함수가 실행되면 Store가 업데이트 되는데 이때 데이터가 담겨있는 객체를 인수로 전달합니다. 이때 전달 되는 객체를 Action이라고 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3. Store&lt;/h3&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;Store는 애플리케이션의 모든 상태와 관련 로직을 가지고 있습니다. Store의 state 변경이 완료가 되면 View에 상태가 변경 했다는 것을 알려주게 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4. View&lt;/h3&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; Flux의 View는 화면에 나타내는 것 뿐만아니라, 자식의 View로 데이터를 흘려 보내는 View Controller 역할도 같이합니다. 애플리케이션 내부에 대해서는 아는 것이 없지만, 받은 데이터를 처리하여 사람들에게 보여주기 위한 일을 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;http://bestalign.github.io/2015/10/06/cartoon-guide-to-flux/&quot;&gt;Flux 카툰 안내서&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://beomy.tistory.com/44&quot;&gt;Flux와 MVC&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt; &lt;/p&gt;</description>
      <category>React</category>
      <category>flux</category>
      <category>react</category>
      <category>단방향바인딩</category>
      <category>리액트</category>
      <category>오물오물</category>
      <category>플럭스패턴</category>
      <author>baegofda_</author>
      <guid isPermaLink="true">https://baegofda.tistory.com/237</guid>
      <comments>https://baegofda.tistory.com/237#entry237comment</comments>
      <pubDate>Fri, 20 Aug 2021 09:00:20 +0900</pubDate>
    </item>
    <item>
      <title>  React-Router</title>
      <link>https://baegofda.tistory.com/236</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt; &amp;zwj;♀️ Routing(라우팅) 이란?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;라우팅은 프로세스인데 우리가 네트워크에서 있는 traffice의 path를 선택하는 프로세스이다.&lt;br /&gt;즉, 네트워크에서 url를 이용했을때 어떤 데이터를 받아올지 결정해주는것&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;홈페이지에 들어왔을때 -&amp;gt; &lt;a href=&quot;http://www.baegofda.com/&quot;&gt;www.baegofda.com/&lt;/a&gt;&lt;br /&gt;회원가입을 눌렀을때 -&amp;gt; &lt;a href=&quot;http://www.baegofda.com/&quot;&gt;www.baegofda.com/&lt;/a&gt;&lt;b&gt;register&lt;/b&gt;&lt;br /&gt;로그인 페이지로 들어갔을때 -&amp;gt; &lt;a href=&quot;http://www.baegofda.com/&quot;&gt;www.baegofda.com/&lt;/a&gt;&lt;b&gt;login&lt;/b&gt;&lt;br /&gt;프로필 페이지로 들어갔을때 -&amp;gt; &lt;a href=&quot;http://www.baegofda.com/&quot;&gt;www.baegofda.com/&lt;/a&gt;&lt;b&gt;profile&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;와 같이 어떤 페이지를 보여줄것인지 결정하고 도와주는것&lt;br /&gt;&lt;code&gt;React-Router&lt;/code&gt; 말고도 &lt;code&gt;Reach-Router&lt;/code&gt;, &lt;code&gt;Next.js&lt;/code&gt;등의 대안이 있습니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  Why ?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;code&gt;React&lt;/code&gt; 뿐만아닌 &lt;code&gt;Vue&lt;/code&gt;, &lt;code&gt;Angular&lt;/code&gt;, &lt;code&gt;Svelte&lt;/code&gt;등은 &lt;b&gt;SPA&lt;/b&gt;(Single Page Application)를 구현하기 위함입니다.&lt;br /&gt;SSR 방식의 HTML 페이지가 바뀌는거와 달리 하나의 HTML 에서 CSR 방식으로 리로드 되지않고 동적으로 가져와서 보여줍니다.&lt;br /&gt;때문에 북마크, 페이지 뒤로가기 앞으로가기가 불가능합니다. 위와같은 문제를 해결하기위해 Routing 이라는 개념이 중요합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://d2.naver.com/helloworld/7804182&quot;&gt;(관련 참고) SSR이란? - NaverD2&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://velog.io/@ru_bryunak/SPA-%EC%82%AC%EC%9A%A9%EC%97%90%EC%84%9C%EC%9D%98-SSR%EA%B3%BC-CSR&quot;&gt;(관련 참고) SPA 그리고 SSR, CSR&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  코드로 알아보기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;  Key Point&lt;/b&gt;&lt;br /&gt;React-Router에는 다양한 컴포넌트들이 있습니다.&lt;br /&gt;그 중 저희는 &lt;code&gt;BrowserRouter&lt;/code&gt;, &lt;code&gt;Switch&lt;/code&gt;, &lt;code&gt;Route&lt;/code&gt;, &lt;code&gt;Link&lt;/code&gt;, &lt;code&gt;NavLink&lt;/code&gt; 대해 알아볼 것 입니다.&lt;br /&gt;위의 컴포넌트들의 위치와 사용을 중점적으로 봐주시길 바랍니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;전체의 파일 구조는 아래와 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fz8d4u%2Fbtq2lrBB1W8%2F2xnQBVaLpbjmO4bRcsX4E1%2Fimg.png&quot; /&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  셋팅하기&lt;/h3&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;먼저 react-router-dom를 설치합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;dockerfile&quot;&gt;&lt;code&gt;# npm
npm install react-router-dom
# yarn
yarn add react-router-dom&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  src&amp;gt;index.js&lt;/h3&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;먼저 index.js의 코드는 아래와 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;javascript&quot;&gt;&lt;code&gt;import React from &quot;react&quot;;
import ReactDOM from &quot;react-dom&quot;;
import App from &quot;./App&quot;;
import { BrowserRouter as Router } from &quot;react-router-dom&quot;;

ReactDOM.render(
  &amp;lt;Router&amp;gt;
    &amp;lt;App /&amp;gt;
  &amp;lt;/Router&amp;gt;,
  document.getElementById(&quot;root&quot;)
);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;Routing을 위해 &lt;code&gt;BrowserRouter&lt;/code&gt; 컴포넌트를 사용하며 편의상 alias로 &quot;Router&quot;를 명시하여 App.js을 감싸줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  src&amp;gt;App.js&lt;/h3&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;App.js의 코드는 아래와 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;xml&quot;&gt;&lt;code&gt;import { Switch, Route } from &quot;react-router-dom&quot;;

const App = () =&amp;gt; {
  return (
    &amp;lt;&amp;gt;
      &amp;lt;Header /&amp;gt;
      &amp;lt;main className=&quot;main&quot;&amp;gt;
        &amp;lt;Switch&amp;gt;
          &amp;lt;Route exact path={&quot;/&quot;} component={Home} /&amp;gt;
          &amp;lt;Route path={&quot;/Board1&quot;} component={Board1} /&amp;gt;
          &amp;lt;Route path={&quot;/Board2&quot;} component={Board2} /&amp;gt;
          &amp;lt;Route path={&quot;/Login&quot;} component={Login} /&amp;gt;
          &amp;lt;Route path={&quot;/Register&quot;} component={Register} /&amp;gt;
        &amp;lt;/Switch&amp;gt;
      &amp;lt;/main&amp;gt;
    &amp;lt;/&amp;gt;
  );
};

export default App;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;먼저 &lt;code&gt;&amp;lt;Route exact path={&quot;/&quot;} component={Home} /&amp;gt;&lt;/code&gt; 내부의 &lt;code&gt;exact&lt;/code&gt;가 없다면 모든 path의 내부엔 &quot;/&quot;가 포함되어있기 때문에 Routing시 Home 컴포넌트가 함께 렌더링됩니다.&lt;br /&gt;때문에 구분을 명확해주기 위해 &lt;code&gt;exact&lt;/code&gt; 사용하며 &lt;code&gt;Switch&lt;/code&gt;는 Routing 시 해당하는 path가 있다면 해당 패스의 컴포넌트를 보여주고 끝나게 됩니다. 또 404 Page를 제공할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  src&amp;gt;components&amp;gt;Header.jsx&lt;/h3&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 아래는 Header 컴포넌트의 코드입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;javascript&quot;&gt;&lt;code&gt;import React from &quot;react&quot;;
import &quot;./Header.scss&quot;;
import { Link } from &quot;react-router-dom&quot;;

const Header = () =&amp;gt; {
  return (
    &amp;lt;nav className=&quot;nav&quot;&amp;gt;
      &amp;lt;h1&amp;gt;React-Router-DOM&amp;lt;/h1&amp;gt;
      &amp;lt;ul className=&quot;items&quot;&amp;gt;
        &amp;lt;li className=&quot;item&quot;&amp;gt;
          &amp;lt;Link className=&quot;link&quot; to=&quot;/&quot; exact&amp;gt;
            Home
          &amp;lt;/Link&amp;gt;
        &amp;lt;/li&amp;gt;
        &amp;lt;li className=&quot;item&quot;&amp;gt;
          &amp;lt;Link className=&quot;link&quot; to=&quot;/Board1&quot;&amp;gt;
            Board1
          &amp;lt;/Link&amp;gt;
        &amp;lt;/li&amp;gt;
        &amp;lt;li className=&quot;item&quot;&amp;gt;
          &amp;lt;Link className=&quot;link&quot; to=&quot;/Board2&quot;&amp;gt;
            Board2
          &amp;lt;/Link&amp;gt;
        &amp;lt;/li&amp;gt;
      &amp;lt;/ul&amp;gt;
    &amp;lt;/nav&amp;gt;
  );
};

export default Header;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; Routing 즉, 링크를 클릭하여 페이지를 이동하기 위해서는 &lt;code&gt;anchor&lt;/code&gt; 태그를 사용했었습니다. 하지만 &lt;code&gt;anchor&lt;/code&gt; 태그는 클릭시 리로드가 되기때문에 React-Router에서는 &lt;code&gt;Link&lt;/code&gt;혹은&lt;code&gt;NavLink&lt;/code&gt;를 사용하며 이동할 url의 주소는 &lt;code&gt;href&lt;/code&gt;라는 attribute 아닌 &lt;code&gt;to&lt;/code&gt;라는 props를 사용하여 명시하여줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fblshbd%2Fbtq2qyfPM8r%2F0VkbR5ed9pIvdgNIhIk4D0%2Fimg.gif&quot; /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 하지만 서비스를 제공하는 입장에서는 현재의 서비스가 어디에 위치하고있는지 알려줘야하며 이용자는 이를 알 권리가 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;javascript&quot;&gt;&lt;code&gt;import React from &quot;react&quot;;
import &quot;./Header.scss&quot;;
import { NavLink } from &quot;react-router-dom&quot;;

const Header = () =&amp;gt; {
  return (
    &amp;lt;nav className=&quot;nav&quot;&amp;gt;
      &amp;lt;h1&amp;gt;React-Router-DOM&amp;lt;/h1&amp;gt;
      &amp;lt;ul className=&quot;items&quot;&amp;gt;
        &amp;lt;li className=&quot;item&quot;&amp;gt;
          &amp;lt;NavLink className=&quot;link&quot; to=&quot;/&quot; exact&amp;gt;
            Home
          &amp;lt;/NavLink&amp;gt;
        &amp;lt;/li&amp;gt;
        &amp;lt;li className=&quot;item&quot;&amp;gt;
          &amp;lt;NavLink className=&quot;link&quot; to=&quot;/Board1&quot;&amp;gt;
            Board1
          &amp;lt;/NavLink&amp;gt;
        &amp;lt;/li&amp;gt;
        &amp;lt;li className=&quot;item&quot;&amp;gt;
          &amp;lt;NavLink className=&quot;link&quot; to=&quot;/Board2&quot;&amp;gt;
            Board2
          &amp;lt;/NavLink&amp;gt;
        &amp;lt;/li&amp;gt;
      &amp;lt;/ul&amp;gt;
    &amp;lt;/nav&amp;gt;
  );
};

export default Header;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 이전에는 class를 추가하는 식으로 기능을 제공하였으나 위와같이 &lt;code&gt;NavLink&lt;/code&gt; 컴포넌트를 사용하면 쉽게 구현이 가능합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Feg10Pi%2Fbtq2iWhYm42%2F7MMQCKAeYtB717XrTv8uik%2Fimg.gif&quot; /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcl23cY%2Fbtq2qxgVrVG%2FXenTGxidHsGkkUI4OLPDQ1%2Fimg.gif&quot; /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 위와 같이 자동적으로 &lt;code&gt;active&lt;/code&gt; 라는 class가 추가적으로 생기기때문에 쉽게 사용이 가능합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;javascript&quot;&gt;&lt;code&gt;import React from &quot;react&quot;;
import &quot;./Header.scss&quot;;
import { NavLink } from &quot;react-router-dom&quot;;

const Header = () =&amp;gt; {
  return (
    &amp;lt;nav className=&quot;nav&quot;&amp;gt;
      &amp;lt;h1&amp;gt;React-Router-DOM&amp;lt;/h1&amp;gt;
      &amp;lt;ul className=&quot;items&quot;&amp;gt;
        &amp;lt;li className=&quot;item&quot;&amp;gt;
          &amp;lt;NavLink className=&quot;link&quot; to=&quot;/&quot; activeClassName=&quot;toggle&quot; exact&amp;gt;
            Home
          &amp;lt;/NavLink&amp;gt;
        &amp;lt;/li&amp;gt;
        &amp;lt;li className=&quot;item&quot;&amp;gt;
          &amp;lt;NavLink className=&quot;link&quot; to=&quot;/Board1&quot; activeClassName=&quot;toggle&quot;&amp;gt;
            Board1
          &amp;lt;/NavLink&amp;gt;
        &amp;lt;/li&amp;gt;
        &amp;lt;li className=&quot;item&quot;&amp;gt;
          &amp;lt;NavLink className=&quot;link&quot; to=&quot;/Board2&quot; activeClassName=&quot;toggle&quot;&amp;gt;
            Board2
          &amp;lt;/NavLink&amp;gt;
        &amp;lt;/li&amp;gt;
      &amp;lt;/ul&amp;gt;
    &amp;lt;/nav&amp;gt;
  );
};

export default Header;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 위의 기능을 제공할 시 className을 &lt;code&gt;active&lt;/code&gt; 가아닌 다른 className으로 변경하고 싶다면 위와같이 &lt;code&gt;activeClassName&lt;/code&gt; 이라는 props를 사용하여 변경이 가능합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyedZZ%2Fbtq2noEGWwD%2FeX9LFMsIZhiUKcHjlKZzK1%2Fimg.gif&quot; /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://reactrouter.com/&quot;&gt;리액트 라우터 공식 사이트&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://mingcoder.me/2019/12/04/Programming/React/react-router-component-vs-render/&quot;&gt;라우터내의 컴포넌트에 props를 넘기려면?&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt; &lt;/p&gt;</description>
      <category>React</category>
      <category>react</category>
      <category>react-router-dom</category>
      <category>리액트</category>
      <category>리액트라우터</category>
      <author>baegofda_</author>
      <guid isPermaLink="true">https://baegofda.tistory.com/236</guid>
      <comments>https://baegofda.tistory.com/236#entry236comment</comments>
      <pubDate>Thu, 19 Aug 2021 08:57:47 +0900</pubDate>
    </item>
    <item>
      <title>  Sass(SCSS)</title>
      <link>https://baegofda.tistory.com/235</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;  Sass(&lt;b&gt;Syntactically Awesome&lt;/b&gt; Style Sheets)?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Sass는 CSS pre-processor로서, 복잡한 작업을 쉽게 할 수 있게 해주고, 코드의 재활용성과 가독성을 높여줍니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  CSS pre-processor(CSS 전처리기) ?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CSS를 확장하는 스크립팅 언어로서, 컴파일러를 통하여 브라우저에서 사용 할 수 있는 일반 CSS 문법 형태로 변환합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Sass, Less, PostCSS, Stylus etc...&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1.   셋팅하기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; Sass를 사용하기위해 node-sass를 설치합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;crmsh&quot;&gt;&lt;code&gt;yarn add node-sass&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 이후 Sass를 사용하기위해 css파일의 확장자명을 .scss를 사용하여 생성합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Ft4zLY%2Fbtq1JANybVD%2FprnbSgGPNPaMstmksO3DX0%2Fimg.png&quot; /&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  .sass 와 .scss&lt;br /&gt;Sass가 처음 릴리즈 되었을때는 .sass확장자로 CSS와 문법이 많이 달랐습니다.&lt;br /&gt;때문에 Sass버전 3이상부터는 주 문법으로 .scss로 변경되었습니다.&lt;br /&gt;.scss는 .css의 상위 집합으로 css와 동일한 문법에서 Sass의 특별한 기능이 추가되었습니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2.   살펴보기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2-1. Comment (주석)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; .scss내부에서 주석을 할 경우 한줄 주석은 &lt;code&gt;//&lt;/code&gt;로 표기합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;pgsql&quot;&gt;&lt;code&gt;/*This is comment*/

// This is comment

/*
This
is
comment
*/&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;xquery&quot;&gt;&lt;code&gt;/*This is comment*/

/*
This
is
comment
*/&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2-2. Variable (변수)&lt;/h3&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; Sass에서 변수의 개념을 사용할 수 있습니다. 원하는 변수명의 앞에 &lt;code&gt;$&lt;/code&gt;문자를 사용합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;scss&quot;&gt;&lt;code&gt;/* Sass */
$personal: #369fff;

.btn {
  padding: 5px 20px;
  color: #fff;
  background-color: $personal;
  border-radius: 3px;
  border: 0;
  outline: 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;css&quot;&gt;&lt;code&gt;/* css */
.btn {
  padding: 5px 20px;
  color: #fff;
  background-color: #369fff;
  border-radius: 3px;
  border: 0;
  outline: 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb2uqd5%2Fbtq1JWJzWjF%2FBEBOzTPpNkJczUOxKgi7bk%2Fimg.png&quot; /&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2-2-1. Variable Scope (변수 범위)&lt;/h4&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; Sass의 변수는 javascript와 마찬가지로 Block Scope를 사용합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;scss&quot;&gt;&lt;code&gt;/* Sass */
$personal: #369fff;

.btn {
  $personal: #000;
  padding: 5px 20px;
  color: #fff;
  background-color: $personal;
  border-radius: 3px;
  border: 0;
  outline: 0;
}

.p {
  color: $personal;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;css&quot;&gt;&lt;code&gt;/* css */
.btn {
  padding: 5px 20px;
  color: #fff;
  background-color: #000;
  border-radius: 3px;
  border: 0;
  outline: 0;
}

.p {
  color: #369fff;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2-2-2. Variable Scope (!global)&lt;/h4&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; Block Scope내에서 변수를 선언하더라도 &lt;code&gt;!global&lt;/code&gt; 플래그를 사용하면 전역에서 사용이 가능합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;scss&quot;&gt;&lt;code&gt;/* Sass */
$personal: #369fff;

.btn {
  $personal: #000 !global;
  padding: 5px 20px;
  color: #fff;
  background-color: $personal;
  border-radius: 3px;
  border: 0;
  outline: 0;
}

.p {
  color: $personal;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;css&quot;&gt;&lt;code&gt;/* css */
.btn {
  padding: 5px 20px;
  color: #fff;
  background-color: #000;
  border-radius: 3px;
  border: 0;
  outline: 0;
}

.p {
  color: #000;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2-2-3. Variable Scope (!default)&lt;/h4&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 추가적인, &lt;code&gt;!default&lt;/code&gt; 플래그를 사용하면 해당 변수가 설정되지 않았거나 값이 null때 해당 값을 사용합니다. (* 대부분 mixin을 작성 할 때 사용)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;scss&quot;&gt;&lt;code&gt;/* Sass */
$personal: #369fff;

$personal: #000 !default;

.btn {
  padding: 5px 20px;
  color: #fff;
  background-color: $personal;
  border-radius: 3px;
  border: 0;
  outline: 0;
}

.p {
  color: $personal;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;css&quot;&gt;&lt;code&gt;/* css */
.btn {
  padding: 5px 20px;
  color: #fff;
  background-color: #369fff;
  border-radius: 3px;
  border: 0;
  outline: 0;
}

.p {
  color: #369fff;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2-3. Built-in Functions (내장함수)&lt;/h3&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; Sass에서는 여러 내장함수를 제공합니다.(&lt;code&gt;darken&lt;/code&gt;, &lt;code&gt;lighten&lt;/code&gt;, &lt;code&gt;saturate&lt;/code&gt; etc...)&lt;br /&gt;예를들어 &lt;code&gt;darken&lt;/code&gt;은 색과 인수값을 던져주면 얼마나 어둡게할지, &lt;code&gt;lighten&lt;/code&gt;은 얼마나 밝게할지 계산하여줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;scss&quot;&gt;&lt;code&gt;/* Sass */
$personal: #369fff;

.btn {
  padding: 5px 20px;
  color: #fff;
  background-color: $personal;
  border-radius: 3px;
  border: 0;
  outline: 0;

  &amp;amp;:hover {
    background-color: darken($personal, 10%);
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;css&quot;&gt;&lt;code&gt;/* css */
.btn {
  padding: 5px 20px;
  color: #fff;
  background-color: #369fff;
  border-radius: 3px;
  border: 0;
  outline: 0;
}

.btn:hover {
  color: #0387ff;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://poiemaweb.com/sass-built-in-function&quot;&gt;Sass 내장함수 알아보기&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2-4. Nesting (중첩)&lt;/h3&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; Sass에서는 선언의 중첩이 가능합니다. 기본 CSS에서는 아래와 같이 작성합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;css&quot;&gt;&lt;code&gt;/* css */
.wrap {
  width: 100%;
}

.wrap .wrap-title {
  color: #000;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; Sass에서는 아래와 같이 작성합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;dts&quot;&gt;&lt;code&gt;/* Sass */
.wrap {
  width: 100%;

  .wrap-title {
    color: #000;
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 또 버튼의 hover 경우를 작성하자면 CSS에서는 아래와 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;css&quot;&gt;&lt;code&gt;/* css */
.btn {
  padding: 5px 20px;
  color: #fff;
  background-color: #369fff;
  border-radius: 3px;
  border: 0;
  outline: 0;
}

.btn:hover {
  color: #0387ff;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; Sass에서는 부모선택자를 참고할때 &lt;code&gt;&amp;amp;&lt;/code&gt;문자를 사용하여 간편하게 표현가능합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;scss&quot;&gt;&lt;code&gt;//  Sass
.btn {
  padding: 5px 20px;
  color: #fff;
  background-color: #369fff;
  border-radius: 3px;
  border: 0;
  outline: 0;

  &amp;amp;:hover {
    background-color: darken($personal, 10%);
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &lt;code&gt;@at-root&lt;/code&gt;를 사용하게되면 선택자 내부에 &lt;code&gt;@at-root 선택자&lt;/code&gt;의 선택자를 포함한 경우 css를 적용시킵니다. &lt;code&gt;.wrap&lt;/code&gt; 내부에 &lt;code&gt;@at-root .root&lt;/code&gt;에 대한 css를 지정 하고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;scss&quot;&gt;&lt;code&gt;// Sass
.wrap {
  display: flex;
  align-items: center;
  justify-content: center;
  min-height: 100vh;

  @at-root .root {
    color: red;
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 아래와 같이 .wrap 내부에 .root를 포함한 요소가 존재한다면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;javascript&quot;&gt;&lt;code&gt;/* Page.jsx */
import React from &quot;react&quot;;
import Button from &quot;../components/Button&quot;;
import &quot;./Page.scss&quot;;

const Page = () =&amp;gt; {
  return (
    &amp;lt;div className=&quot;wrap&quot;&amp;gt;
      &amp;lt;Button /&amp;gt;
      &amp;lt;div className=&quot;container root&quot;&amp;gt;
        container
        &amp;lt;div className=&quot;box&quot;&amp;gt;box&amp;lt;/div&amp;gt;
      &amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;
  );
};

export default Page;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fuiz7p%2Fbtq1OMe0LLG%2FSOD98aww7liECZ5mD9RJmk%2Fimg.png&quot; /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 위와 같이 적용을 받게 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2-5 Import&lt;/h3&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &lt;code&gt;import&lt;/code&gt; 기능을 이용하여 나눠져있는 스타일 파일들을 불러와서 사용 할 수 있습니다. 아래와 같은 구조로 있을 경우&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmpZ37%2Fbtq1K3IvwLS%2Fvfkvr53AM3yPnEK2Hxh4K0%2Fimg.png&quot; /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; _colors.scss 파일에 작업에 사용할 color를 변수 선언을 하고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;scss&quot;&gt;&lt;code&gt;$personal: #369fff;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 작업할 파일에서 &lt;code&gt;@import &quot;path&quot;;&lt;/code&gt; 의 형식으로 선언을 하면 아래와 같이 사용이 가능합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;scss&quot;&gt;&lt;code&gt;@import &quot;../_common/colors&quot;;

.btn {
  padding: 5px 20px;
  color: #fff;
  background-color: $personal;
  border-radius: 3px;
  border: 0;
  outline: 0;

  &amp;amp;:hover {
    background-color: darken($personal, 10%);
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  Partial 기능&lt;br /&gt;만약 .sass 파일이나 .scss 파일의 이름을 &lt;code&gt;_&lt;/code&gt;로 시작 할 경우 css 파일로 따로 컴파일 되지 않습니다.&lt;br /&gt;해당 css 파일을 불러올 일이 없고 import 만 되는경우 이 기능을 사용하시면 됩니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2-6 Extend&lt;/h3&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 특정 선택자를 상속 할 때 &lt;code&gt;@extend&lt;/code&gt;를 사용합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;scss&quot;&gt;&lt;code&gt;/* Sass */
.box {
  border: 1px solid gray;
  padding: 10px;
  display: inline-block;
}

.success-box {
  @extend .box;
  border: 1px solid green;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;css&quot;&gt;&lt;code&gt;/* css */
.box,
.success-box {
  border: 1px solid gray;
  padding: 10px;
  display: inline-block;
}

.success-box {
  border: 1px solid green;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &lt;code&gt;%&lt;/code&gt;를 사용하면 상속은 할 수 있지만 해당 선택자는 컴파일되지 않습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;scss&quot;&gt;&lt;code&gt;/* Sass */
%box {
  padding: 0.5em;
}

.success-box {
  @extend %box;
  color: green;
}

.error-box {
  @extend %box;
  color: red;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;css&quot;&gt;&lt;code&gt;/* css */
.success-box,
.error-box {
  padding: 0.5em;
}

.success-box {
  color: green;
}

.error-box {
  color: red;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2-7 Function&lt;/h3&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 위의 Built-in Function과는 달리 사용자 지정 함수입니다. 파라미터 값을 계산하여 값을 반환하며 &lt;code&gt;@function&lt;/code&gt;을 사용하여 선언합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;mel&quot;&gt;&lt;code&gt;// Sass
@function calc-percent($target, $container) {
  @return ($target / $container) * 100%;
}

.my-module {
  width: calc-percent(650px, 1000px);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;css&quot;&gt;&lt;code&gt;/* css */
.my-module {
  width: 65%;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2-8 Mixin&lt;/h3&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; Sass에서는 가장 유용한 기능인 Mixin입니다. &lt;code&gt;@mixin&lt;/code&gt;을 사용하여 선언을하고 &lt;code&gt;@include&lt;/code&gt;를 이용하여 내부에서 사용을합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;// Sass
@mixin title {
  font-size: 1.25rem;
  font-weight: 500;
}
@mixin title-sub {
  font-size: 0.875rem;
  font-weight: 400;
}

.title {
  @include title;
}

.title-sub {
  @include title-sub;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;css&quot;&gt;&lt;code&gt;/* CSS */
.title {
  font-size: 1.25rem;
  font-weight: 500;
}

.title-sub {
  font-size: 0.875rem;
  font-weight: 400;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;✨ 3. 활용하기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 파일 구조는 아래와 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdH7RB2%2Fbtq1KcGiDdG%2FJCUBW1SfoVbNVGpOXwxf00%2Fimg.png&quot; /&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3-1. className 활용&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; className에 전달받은 &lt;code&gt;size&lt;/code&gt; 따라서 element의 크기를 변경할 수 있습니다. &quot;small&quot;과 &quot;large&quot;일 경우의 css를 작성 한 뒤&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;scss&quot;&gt;&lt;code&gt;// Sass
@import &quot;../_common/colors&quot;;

.btn {
  color: #fff;
  background-color: $personal;
  border-radius: 3px;
  border: 0;
  outline: 0;

  &amp;amp;.small {
    padding: 5px 20px;
  }

  &amp;amp;.large {
    padding: 10px 40px;
  }

  &amp;amp;:hover {
    background-color: darken($personal, 10%);
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;css&quot;&gt;&lt;code&gt;/* css */
.btn {
  color: #fff;
  background-color: $personal;
  border-radius: 3px;
  border: 0;
  outline: 0;
}
.btn.small {
  padding: 5px 20px;
}
.btn.large {
  padding: 10px 40px;
}
.btn:hover {
  background-color: #0387ff;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &lt;code&gt;Button&lt;/code&gt; 컴포넌트의 props에 &lt;code&gt;size&lt;/code&gt;를 넘겨줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;javascript&quot;&gt;&lt;code&gt;// Page.jsx
import React from &quot;react&quot;;
import Button from &quot;../components/Button&quot;;
import &quot;./Page.scss&quot;;

const Page = () =&amp;gt; {
  return (
    &amp;lt;div className=&quot;wrap &quot;&amp;gt;
      &amp;lt;Button /&amp;gt;
      &amp;lt;Button size=&quot;large&quot; /&amp;gt;
    &amp;lt;/div&amp;gt;
  );
};

export default Page;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;javascript&quot;&gt;&lt;code&gt;// Button.jsx
import React from &quot;react&quot;;
import &quot;./Button.scss&quot;;

const Button = ({ size }) =&amp;gt; {
  return &amp;lt;button className={`btn ${size}`}&amp;gt;Button&amp;lt;/button&amp;gt;;
};

Button.defaultProps = {
  size: &quot;small&quot;,
};

export default Button;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 이때, &lt;code&gt;size&lt;/code&gt;를 넘겨주지 않을경우 &lt;code&gt;Button.defaultProps&lt;/code&gt;에 의해 &lt;code&gt;size&lt;/code&gt;는 &quot;small&quot;이 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/byEaGQ/btq1Nu0aHgu/XIkCBbbm6SJgpSeRH1aF4K/img.png&quot; /&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3-2. font-style 활용&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &lt;code&gt;mixin()&lt;/code&gt;을 사용하여 디자인 가이드에 맞는 폰트 스타일을 관리하여 사용 할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;// _font-style.scss
@mixin font-style-24 {
  font-size: 1.5rem;
  font-weight: 500;
  letter-spacing: -0.005em;
}

@mixin font-style-20 {
  font-size: 1.25rem;
  font-weight: 500;
  letter-spacing: -0.05em;
}

@mixin font-style-14 {
  font-size: 0.875rem;
  font-weight: 500;
  letter-spacing: -0.05em;
}

@mixin font($size, $color: false) {
  @if ($size == 24) {
    @include font-style-24;
  }
  @if ($size == 20) {
    @include font-style-20;
  }
  @if ($size == 14) {
    @include font-style-14;
  }

  @if (type-of($color) == color) {
    color: $color;
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;javascript&quot;&gt;&lt;code&gt;// Content.jsx
import React from &quot;react&quot;;
import &quot;./Content.scss&quot;;

const Content = () =&amp;gt; {
  return (
    &amp;lt;div&amp;gt;
      &amp;lt;h1 className=&quot;title&quot;&amp;gt;이것은 font-style-24 입니다.&amp;lt;/h1&amp;gt;
      &amp;lt;p className=&quot;sub&quot;&amp;gt;이것은 font-style-20 입니다.&amp;lt;/p&amp;gt;
      &amp;lt;p className=&quot;content&quot;&amp;gt;이것은 font-style-14 입니다.&amp;lt;/p&amp;gt;
    &amp;lt;/div&amp;gt;
  );
};

export default Content;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;perl&quot;&gt;&lt;code&gt;@import &quot;../_common/font-style&quot;;

.title {
  @include font(24, red);
}

.sub {
  @include font(20, blue);
}

.content {
  @include font(14);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/F2BmJ/btq1NtAidFJ/bTpDKT7KD3ZxY62aF57Wpk/img.png&quot; /&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3-3. reponsive 활용&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &lt;code&gt;mixin()&lt;/code&gt;을 사용하여 Mobile, Tablet, Desktop등의 기기에 대응이 가능합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;less&quot;&gt;&lt;code&gt;// _media.scss
@mixin media($screen) {
  @if ($screen == T) {
    @media all and (min-width: 768px) and (max-width: 1023px) {
      @content;
    }
  }
  @if ($screen == D) {
    @media all and (min-width: 1024px) {
      @content;
    }
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 이때 해당 element의 안에서 &lt;code&gt;mixin()&lt;/code&gt;의 내용을 정의하기 위해서는 &lt;code&gt;@content&lt;/code&gt;를 사용해야 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;less&quot;&gt;&lt;code&gt;@import &quot;../_common/font-style&quot;;
@import &quot;../_common/media&quot;;

.title {
  @include font(24, red);
  @include media(T) {
    color: #fff;
    background-color: #000;
  }
  @include media(D) {
    color: #000;
    background-color: #fff;
  }
}

.sub {
  @include font(20, blue);
}

.content {
  @include font(14);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 이외에도 필요에 따라 많은 용도로 활용이 될 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt; &lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://webclub.tistory.com/category/StyleSheet/SASS%E3%86%8DSCSS&quot;&gt;더 알아보기&lt;/a&gt;&lt;/p&gt;</description>
      <category>CSS</category>
      <category>CSS</category>
      <category>css전처리기</category>
      <category>Sass</category>
      <category>Scss</category>
      <category>프론트엔드</category>
      <author>baegofda_</author>
      <guid isPermaLink="true">https://baegofda.tistory.com/235</guid>
      <comments>https://baegofda.tistory.com/235#entry235comment</comments>
      <pubDate>Wed, 18 Aug 2021 09:00:10 +0900</pubDate>
    </item>
  </channel>
</rss>