<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>재영님의 생활기록부</title>
    <link>https://chojy010.tistory.com/</link>
    <description>실무 경험을 통해 얻은 노하우와 최신 프론트엔드 기술 동향을 공유</description>
    <language>ko</language>
    <pubDate>Sat, 4 Apr 2026 10:34:02 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>chojy010</managingEditor>
    <image>
      <title>재영님의 생활기록부</title>
      <url>https://tistory1.daumcdn.net/tistory/7119733/attach/b91678a7dbdc46c0878a8eeb5c4d4a14</url>
      <link>https://chojy010.tistory.com</link>
    </image>
    <item>
      <title>마이크로 프론트엔드 도입 실패 사례와 필요성</title>
      <link>https://chojy010.tistory.com/9</link>
      <description>&lt;h1 data-pm-slice=&quot;0 0 []&quot;&gt;&lt;b&gt;⚫ 배경&lt;/b&gt;&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프론트엔드에서 &lt;b&gt;마이크로 프론트엔드 아키텍처&lt;/b&gt;를 도입하려고 했습니다. 기존의 모놀리식 프론트엔드는 프로젝트가 커지면서 배포 주기가 길어지고, 팀 간 협업이 어려워지며, 기능 추가나 수정 시 전체 애플리케이션에 영향을 미치는 문제가 자주 발생했습니다. 특히 하나의 작은 변경 사항을 배포하기 위해서도 전체 애플리케이션을 다시 빌드하고 배포해야 하는 부담이 커졌습니다. 이를 해결하기 위해 마이크로 프론트엔드를 도입하여 팀별로 독립적인 배포와 관리를 할 수 있도록 설계 하려했습니다.&lt;/p&gt;
&lt;h1&gt;&amp;nbsp;&lt;/h1&gt;
&lt;h1&gt;&lt;b&gt;&lt;b&gt;⚫&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;실패 사례: 기존 모놀리식 시스템의 문제점&lt;/b&gt;&lt;/h1&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;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1. 확장성 문제&lt;/b&gt;&lt;/h2&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;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;br /&gt;작은 업데이트에도 전체 애플리케이션을 빌드하고 배포해야 하므로 배포 시간이 김&lt;/li&gt;
&lt;li&gt;&lt;b&gt;실패 사례&lt;/b&gt;&lt;br /&gt;회사의 배포 과정 중 예상보다 긴 &lt;b&gt;빌드 및 배포 시간&lt;/b&gt;으로 인해 서비스가 일시적으로 &lt;b&gt;중단&lt;/b&gt;되었고, 이로 인해 사용자가 중요한 기능을 이용하지 못하는 상황이 발생했습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2. 유지보수 비용 증가&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;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;br /&gt;코드 충돌이 자주 발생하고, 이를 해결하기 위한 추가 리소스와 시간이 필요&lt;/li&gt;
&lt;li&gt;&lt;b&gt;실패 사례&lt;/b&gt;&lt;br /&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;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;3. 배포 주기 지연&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;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;br /&gt;전체 시스템을 다시 테스트하고 빌드하는 데 많은 시간이 소요&lt;/li&gt;
&lt;li&gt;&lt;b&gt;실패 사례&lt;/b&gt;&lt;br /&gt;새로운 기능을 추가한 후, 전체 애플리케이션을 테스트하고 빌드하는 과정에서 예상보다 시간이 오래 걸렸습니다. 결과적으로 배포 일정이 &lt;b&gt;2주 이상 지연&lt;/b&gt;되었고, 경쟁사는 같은 기능을 더 빨리 출시하여 시장에서 &lt;b&gt;주도권을 잃게&lt;/b&gt; 되었습니다. 이로 인해 매출 감소와 브랜드 신뢰도 하락이 발생했습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;4. 기술적 부채 증가&lt;/b&gt;&lt;/h2&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;Vue.js&lt;/b&gt;의 오래된 버전을 사용하면서, 최신 버전으로 업그레이드하려 했지만, &lt;b&gt;의존성 문제&lt;/b&gt;로 인해 업그레이드가 어려웠습니다. 기술 업그레이드를 시도하더라도 전체 시스템에 큰 영향을 미쳐 &lt;b&gt;많은 리소스와 시간이 소요&lt;/b&gt;되었습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;주요 문제&lt;/b&gt;&lt;br /&gt;기술 업그레이드나 변경이 어렵고, 새로운 기능 추가 시 코드 복잡도가 증가&lt;/li&gt;
&lt;li&gt;&lt;b&gt;실패 사례&lt;/b&gt;&lt;br /&gt;오래된 Vue.js 프레임워크를 최신 버전으로 업그레이드하려고 했으나, &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;b&gt;수개월 동안 지연&lt;/b&gt;되었습니다. 기술적 부채를 해결하기 위해 &lt;b&gt;추가적인 자원이 투입&lt;/b&gt;되었지만, 의존성 문제로 인해 지속적으로 어려움을 겪었습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;5. 장애 발생 시 전체 시스템에 영향&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;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;br /&gt;한 모듈의 오류가 전체 애플리케이션에 영향을 미침&lt;/li&gt;
&lt;li&gt;&lt;b&gt;실패 사례&lt;/b&gt;&lt;br /&gt;회사의 &lt;b&gt;주문 처리 모듈&lt;/b&gt;에서 작은 오류가 발생했는데, 이 오류가 결제 전체 시스템에 영향을 미쳐 &lt;b&gt;주문이 정상적으로 처리되지 않는 상황&lt;/b&gt;이 발생했습니다. 그 결과 &lt;b&gt;사용자들이 결제를 진행할 수 없게 되었고&lt;/b&gt;, 서비스가 &lt;b&gt;1시간 이상 중단&lt;/b&gt;되었습니다. 이로 인해 &lt;b&gt;&lt;span data-text-custom-color=&quot;#ff5630&quot;&gt;시간당 100만 원 이상의 매출 손실&lt;/span&gt;&lt;/b&gt;이 발생하여 고객들은 결제를 완료하지 못해 불만이 커졌습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;&amp;nbsp;&lt;/h1&gt;
&lt;h1&gt;&lt;b&gt;&lt;b&gt;⚫&lt;span&gt; &lt;/span&gt;&lt;/b&gt;MSA 및 마이크로 프론트엔드 도입의 필요성&lt;/b&gt;&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존 모놀리식 아키텍처에서는 확장성 문제, 유지보수 비용 증가, 배포 지연, 기술적 부채, 그리고 장애 발생 시 전체 시스템에 영향을 미치는 문제 등 다양한 한계가 존재했습니다. 이러한 문제들은 시간이 지남에 따라 비즈니스 성과와 서비스 품질에 큰 영향을 미쳤으며, 이를 해결하기 위해서는 &lt;b&gt;마이크로서비스 아키텍처(MSA)&lt;/b&gt; 및 &lt;b&gt;마이크로 프론트엔드&lt;/b&gt;의 도입이 필수적입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1. 확장성 문제 해결&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모놀리식 구조에서는 모든 기능이 하나의 코드베이스에 결합되어 있어 작은 기능 업데이트에도 전체 시스템을 빌드하고 배포해야 했습니다. MSA 및 마이크로 프론트엔드는 &lt;b&gt;각 기능을 독립된 서비스로 분리&lt;/b&gt;하여 각 서비스가 독립적으로 빌드 및 배포될 수 있습니다. 이를 통해 &lt;b&gt;배포 시간을 단축&lt;/b&gt;하고, 특정 서비스의 기능 추가나 수정이 전체 시스템에 영향을 미치지 않도록 할 수 있습니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;- 도입 이유 - &lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;독립적 배포:&lt;/b&gt; 각 기능별로 독립적으로 배포 가능하여, 서비스 가용성을 유지&lt;/li&gt;
&lt;li&gt;&lt;b&gt;빠른 확장:&lt;/b&gt; 필요한 부분만 빠르게 확장 가능, 전체 시스템에 영향을 주지 않음&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2. 유지보수 비용 감소&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모놀리식 시스템에서는 여러 팀이 동일한 코드베이스에서 작업함으로 인해 코드 충돌이 자주 발생하고, 이를 해결하는 데 많은 리소스와 시간이 소요되었습니다. 반면 MSA 및 마이크로 프론트엔드를 도입하면 &lt;b&gt;각 팀이 독립적으로 관리하는 서비스나 모듈을 별도로 유지&lt;/b&gt;할 수 있어 코드 충돌이 줄어들고, &lt;b&gt;유지보수의 복잡성을 대폭 줄일&lt;/b&gt; 수 있습니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;- 도입 이유 - &lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;팀 간 독립성:&lt;/b&gt; 각 팀은 자신들의 영역에서 독립적으로 작업 가능&lt;/li&gt;
&lt;li&gt;&lt;b&gt;유지보수 효율성:&lt;/b&gt; 코드 충돌 감소, 유지보수 비용 절감&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;3. 배포 주기 단축&lt;/b&gt;&lt;/h2&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;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;- 도입 이유 - &lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;빠른 배포:&lt;/b&gt; 각 기능별로 빠르게 배포하여 배포 주기 단축&lt;/li&gt;
&lt;li&gt;&lt;b&gt;시장 대응력 강화:&lt;/b&gt; 경쟁사보다 빠르게 새로운 기능을 출시할 수 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;4. 기술적 부채 해결&lt;/b&gt;&lt;/h2&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;b&gt;Vue.js&lt;/b&gt;, 다른 서비스는 &lt;b&gt;React&lt;/b&gt;나 &lt;b&gt;Next.js&lt;/b&gt;를 사용하는 등 &lt;b&gt;다양한 기술을 병행&lt;/b&gt;하며 필요한 부분만 유연하게 업그레이드할 수 있습니다. 이를 통해 개발팀은 최적의 기술을 선택하고, 기술 부채를 효과적으로 관리할 수 있습니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;- 도입 이유 - &lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;부분적 기술 업그레이드:&lt;/b&gt; Vue.js나 React, Next.js 등 다양한 프레임워크를 개별 서비스에 적용하고, 특정 모듈만 유연하게 업그레이드 가능&lt;/li&gt;
&lt;li&gt;&lt;b&gt;유연한 기술 도입:&lt;/b&gt; 전체 시스템에 영향을 미치지 않고 각 마이크로 프론트엔드 서비스에 적합한 기술을 독립적으로 도입하고 운영할 수 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;5. 장애 발생 시 전체 시스템에 영향 방지&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MSA와 마이크로 프론트엔드는 &lt;b&gt;서비스를 개별적으로 운영&lt;/b&gt;하기 때문에, 특정 모듈에서 문제가 발생하더라도 &lt;b&gt;전체 시스템에 영향을 주지 않도록&lt;/b&gt; 고립할 수 있습니다. 이를 통해 장애 발생 시에도 &lt;b&gt;부분적인 서비스 중단&lt;/b&gt;만 발생하고, 주요 서비스는 정상적으로 유지됩니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;- 도입 이유 - &lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;장애 고립:&lt;/b&gt; 특정 서비스에서 발생한 문제를 전체 시스템에 전파하지 않음&lt;/li&gt;
&lt;li&gt;&lt;b&gt;안정성 강화:&lt;/b&gt; 서비스 전체 중단을 방지&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1 style=&quot;color: #000000; text-align: start;&quot; data-pm-slice=&quot;0 0 []&quot;&gt;&lt;b&gt;⚫&lt;span&gt;&amp;nbsp;차이점&lt;/span&gt;&lt;/b&gt;&lt;/h1&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100.349%; height: 398px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 15.3101%; text-align: center; height: 20px;&quot;&gt;&lt;b&gt;항목&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 41.5891%; text-align: center; height: 20px;&quot;&gt;&lt;b&gt;모놀리식 아키텍처 (AS-IS)&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 43.4495%; text-align: center; height: 20px;&quot;&gt;&lt;b&gt;마이크로 프론트엔드 아키텍처 (TO-BE)&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 15.3101%; height: 20px;&quot;&gt;&lt;b&gt;배포 구조&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 41.5891%; height: 20px;&quot;&gt;하나의 단일 번들 파일로 모든 기능을 포함&lt;/td&gt;
&lt;td style=&quot;width: 43.4495%; height: 20px;&quot;&gt;여러 개의 독립 번들로 기능이 나누어져 있음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 15.3101%; height: 20px;&quot;&gt;&lt;b&gt;개발 프로세스&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 41.5891%; height: 20px;&quot;&gt;모든 기능이 단일 레포지토리에서 관리, &lt;br /&gt;각 팀이 동일한 코드베이스 사용&lt;/td&gt;
&lt;td style=&quot;width: 43.4495%; height: 20px;&quot;&gt;각 기능/모듈이 개별 레포지토리에서 관리,&lt;br /&gt;팀마다 독립적인 코드베이스 사용 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 15.3101%; height: 20px;&quot;&gt;&lt;b&gt;빌드 시간&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 41.5891%; height: 20px;&quot;&gt;전체 애플리케이션을 빌드해야 하므로 시간이 오래 걸림&lt;/td&gt;
&lt;td style=&quot;width: 43.4495%; height: 20px;&quot;&gt;각 모듈만 빌드하면 되므로 빌드 시간이 짧음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 15.3101%; height: 20px;&quot;&gt;&lt;b&gt;배포 주기&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 41.5891%; height: 20px;&quot;&gt;&lt;span&gt;전체&lt;span&gt; &lt;/span&gt;애플리케이션을&lt;span&gt; &lt;/span&gt;한&lt;span&gt; &lt;/span&gt;번에&lt;span&gt; &lt;/span&gt;배포&lt;span&gt;, &lt;/span&gt;배포&lt;span&gt; &lt;/span&gt;주기가&lt;span&gt; &lt;/span&gt;길어질&lt;span&gt; &lt;/span&gt;수&lt;span&gt; &lt;/span&gt;있음&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 43.4495%; height: 20px;&quot;&gt;&lt;span&gt;각&lt;span&gt; &lt;/span&gt;모듈&lt;span&gt; &lt;/span&gt;별로&lt;span&gt; &lt;/span&gt;독립적으로&lt;span&gt; &lt;/span&gt;배포&lt;span&gt;, &lt;/span&gt;배포&lt;span&gt; &lt;/span&gt;주기가&lt;span&gt; &lt;/span&gt;짧음&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 15.3101%; height: 20px;&quot;&gt;&lt;b&gt;코드 복잡도&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 41.5891%; height: 20px;&quot;&gt;&lt;span&gt;하나의&lt;span&gt; &lt;/span&gt;코드베이스에&lt;span&gt; &lt;/span&gt;모든&lt;span&gt; &lt;/span&gt;코드가&lt;span&gt; &lt;/span&gt;몰려&lt;span&gt; &lt;/span&gt;있어&lt;span&gt; &lt;/span&gt;복잡도가&lt;span&gt; &lt;/span&gt;높아짐&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 43.4495%; height: 20px;&quot;&gt;&lt;span&gt;각&lt;span&gt; &lt;/span&gt;모듈별로&lt;span&gt; &lt;/span&gt;코드를&lt;span&gt; &lt;/span&gt;분리하여&lt;span&gt; &lt;/span&gt;복잡도가&lt;span&gt; &lt;/span&gt;낮아짐&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 15.3101%; height: 20px;&quot;&gt;&lt;b&gt;팀 간 협업&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 41.5891%; height: 20px;&quot;&gt;&lt;span&gt;팀&lt;span&gt; &lt;/span&gt;간의&lt;span&gt; &lt;/span&gt;협업이&lt;span&gt; &lt;/span&gt;어려움&lt;span&gt;, &lt;/span&gt;코드&lt;span&gt; &lt;/span&gt;충돌&lt;span&gt; &lt;/span&gt;및&lt;span&gt; &lt;/span&gt;의존성&lt;span&gt; &lt;/span&gt;문제가&lt;span&gt; &lt;/span&gt;빈&lt;/span&gt;&lt;span&gt;번하게발생&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 43.4495%; height: 20px;&quot;&gt;&lt;span&gt;각&lt;span&gt; &lt;/span&gt;팀이&lt;span&gt; &lt;/span&gt;독립적인&lt;span&gt; &lt;/span&gt;모듈을&lt;span&gt; &lt;/span&gt;관리하므로&lt;span&gt; &lt;/span&gt;협업이&lt;span&gt; &lt;/span&gt;용이&lt;span&gt;, &lt;/span&gt;의존성&lt;span&gt; &lt;/span&gt;문제&lt;span&gt; &lt;/span&gt;감소&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 15.3101%; height: 20px;&quot;&gt;&lt;b&gt;서비스 성능&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 41.5891%; height: 20px;&quot;&gt;&lt;span&gt;전체&lt;span&gt; &lt;/span&gt;번들을&lt;span&gt; &lt;/span&gt;로드하기&lt;span&gt; &lt;/span&gt;때문에&lt;span&gt; &lt;/span&gt;초기&lt;span&gt; &lt;/span&gt;로딩&lt;span&gt; &lt;/span&gt;속도가&lt;span&gt; &lt;/span&gt;느려질&lt;span&gt; &lt;/span&gt;수&lt;/span&gt;&lt;span&gt;있음&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 43.4495%; height: 20px;&quot;&gt;&lt;span&gt;필요한&lt;span&gt; &lt;/span&gt;모듈만&lt;span&gt; &lt;/span&gt;로드하여&lt;span&gt; &lt;/span&gt;초기&lt;span&gt; &lt;/span&gt;로딩&lt;span&gt; &lt;/span&gt;속도가&lt;span&gt; &lt;/span&gt;빨라짐&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 15.3101%; height: 20px;&quot;&gt;&lt;b&gt;페이지 로드&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 41.5891%; height: 20px;&quot;&gt;&lt;span&gt;모든&lt;span&gt; &lt;/span&gt;기능을&lt;span&gt; &lt;/span&gt;한&lt;span&gt; &lt;/span&gt;번에&lt;span&gt; &lt;/span&gt;로드해야&lt;span&gt; &lt;/span&gt;하므로&lt;span&gt; &lt;/span&gt;페이지&lt;span&gt; &lt;/span&gt;로드&lt;span&gt; &lt;/span&gt;시&lt;span&gt; &lt;/span&gt;성능&lt;span&gt; &lt;/span&gt;저하&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 43.4495%; height: 20px;&quot;&gt;&lt;span&gt;필요할 &lt;/span&gt;&lt;span&gt;때 모듈을 동적으로 로드하여 사용자경험을 향상 시킴&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 15.3101%; height: 20px;&quot;&gt;&lt;b&gt;기능 격리&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 41.5891%; height: 20px;&quot;&gt;&lt;span&gt;모든 기능이 단일 애플리케이션내에 포함되어있어 &lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;문제 발생시 전체 서비스에 영향&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 43.4495%; height: 20px;&quot;&gt;&lt;span&gt;각&lt;span&gt; &lt;/span&gt;기능이&lt;span&gt; &lt;/span&gt;독립적으로&lt;span&gt; &lt;/span&gt;관리되어&lt;span&gt; &lt;/span&gt;문제가&lt;span&gt; &lt;/span&gt;발생해도&lt;span&gt; &lt;/span&gt;다른&lt;span&gt; &lt;/span&gt;기능에&lt;span&gt; &lt;/span&gt;영향&lt;span&gt; &lt;/span&gt;없음&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 15.3101%; height: 18px;&quot;&gt;&lt;b&gt;테스트&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 41.5891%; height: 18px;&quot;&gt;&lt;span&gt;전체&lt;span&gt; &lt;/span&gt;애플리케이션을&lt;span&gt; &lt;/span&gt;테스트해야&lt;span&gt; &lt;/span&gt;함&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 43.4495%; height: 18px;&quot;&gt;&lt;span&gt;개별&lt;span&gt; &lt;/span&gt;모듈&lt;span&gt; &lt;/span&gt;단위로&lt;span&gt; &lt;/span&gt;테스트&lt;span&gt; &lt;/span&gt;가능&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 15.3101%; height: 18px;&quot;&gt;&lt;b&gt;디버깅&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 41.5891%; height: 18px;&quot;&gt;&lt;span&gt;단일&lt;span&gt; &lt;/span&gt;코드베이스에서&lt;span&gt; &lt;/span&gt;디버깅이&lt;span&gt; &lt;/span&gt;복잡함&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 43.4495%; height: 18px;&quot;&gt;&lt;span&gt;각&lt;span&gt; &lt;/span&gt;모듈별로&lt;span&gt; &lt;/span&gt;디버깅&lt;span&gt; &lt;/span&gt;가능&lt;span&gt;, &lt;/span&gt;문제를&lt;span&gt; &lt;/span&gt;쉽게&lt;span&gt; &lt;/span&gt;격리&lt;span&gt; &lt;/span&gt;가능&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 15.3101%; height: 18px;&quot;&gt;&lt;b&gt;데브옵스 전략&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 41.5891%; height: 18px;&quot;&gt;&lt;span&gt;단일&lt;span&gt; CI/CD &lt;/span&gt;파이프라인에서&lt;span&gt; &lt;/span&gt;모든&lt;span&gt; &lt;/span&gt;기능을&lt;span&gt; &lt;/span&gt;관리해야&lt;span&gt; &lt;/span&gt;함&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 43.4495%; height: 18px;&quot;&gt;&lt;span&gt;각&lt;span&gt; &lt;/span&gt;모듈별로&lt;span&gt; CI/CD &lt;/span&gt;파이프라인을&lt;span&gt; &lt;/span&gt;독립적으로&lt;span&gt; &lt;/span&gt;설정&lt;span&gt; &lt;/span&gt;가능&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 15.3101%; height: 18px;&quot;&gt;&lt;b&gt;기능 출시 속도&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 41.5891%; height: 18px;&quot;&gt;&lt;span&gt;기능&lt;span&gt; &lt;/span&gt;출시가&lt;span&gt; &lt;/span&gt;느리며&lt;span&gt; &lt;/span&gt;전체&lt;span&gt; &lt;/span&gt;배포&lt;span&gt; &lt;/span&gt;주기에&lt;span&gt; &lt;/span&gt;의존&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 43.4495%; height: 18px;&quot;&gt;&lt;span&gt;각&lt;span&gt; &lt;/span&gt;모듈&lt;span&gt; &lt;/span&gt;별로&lt;span&gt; &lt;/span&gt;빠르게&lt;span&gt; &lt;/span&gt;기능을&lt;span&gt; &lt;/span&gt;출시&lt;span&gt; &lt;/span&gt;가능&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 15.3101%; height: 18px;&quot;&gt;&lt;b&gt;오류 및 장애 처리&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 41.5891%; height: 18px;&quot;&gt;&lt;span&gt;단일&lt;span&gt; &lt;/span&gt;장애&lt;span&gt; &lt;/span&gt;발생&lt;span&gt; &lt;/span&gt;시&lt;span&gt; &lt;/span&gt;전체&lt;span&gt; &lt;/span&gt;시스템에&lt;span&gt; &lt;/span&gt;영향&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 43.4495%; height: 18px;&quot;&gt;&lt;span&gt;오류가&lt;span&gt; &lt;/span&gt;발생해도&lt;span&gt; &lt;/span&gt;해당&lt;span&gt; &lt;/span&gt;모듈에만&lt;span&gt; &lt;/span&gt;한정&lt;span&gt;, &lt;/span&gt;전체&lt;span&gt; &lt;/span&gt;서비스는&lt;span&gt; &lt;/span&gt;정상&lt;span&gt; &lt;/span&gt;작동&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 15.3101%; height: 18px;&quot;&gt;&lt;b&gt;의존성&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 41.5891%; height: 18px;&quot;&gt;&lt;span&gt;모든&lt;span&gt; &lt;/span&gt;의존성이&lt;span&gt; &lt;/span&gt;하나의&lt;span&gt; &lt;/span&gt;프로젝트에&lt;span&gt; &lt;/span&gt;포함되며&lt;span&gt;, &lt;/span&gt;의존성&lt;span&gt; &lt;/span&gt;충돌&lt;span&gt; &lt;/span&gt;가능성&lt;span&gt; &lt;/span&gt;높음&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 43.4495%; height: 18px;&quot;&gt;&lt;span&gt;각&lt;span&gt; &lt;/span&gt;모듈이&lt;span&gt; &lt;/span&gt;독립적이므로&lt;span&gt; &lt;/span&gt;의존성&lt;span&gt; &lt;/span&gt;충돌&lt;span&gt; &lt;/span&gt;문제&lt;span&gt; &lt;/span&gt;최소화&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 15.3101%; height: 18px;&quot;&gt;&lt;b&gt;재사용성&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 41.5891%; height: 18px;&quot;&gt;&lt;span&gt;코드&lt;span&gt; &lt;/span&gt;재사용이&lt;span&gt; &lt;/span&gt;제한적&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 43.4495%; height: 18px;&quot;&gt;&lt;span&gt;각&lt;span&gt; &lt;/span&gt;모듈을&lt;span&gt; &lt;/span&gt;독립적으로&lt;span&gt; &lt;/span&gt;재사용&lt;span&gt; &lt;/span&gt;가능&lt;span&gt;, &lt;/span&gt;다른&lt;span&gt; &lt;/span&gt;프로젝트에&lt;span&gt; &lt;/span&gt;쉽게&lt;span&gt; &lt;/span&gt;적용&lt;span&gt; &lt;/span&gt;가능&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 15.3101%; height: 18px;&quot;&gt;&lt;b&gt;기술 스택&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 41.5891%; height: 18px;&quot;&gt;&lt;span&gt;단일&lt;span&gt; &lt;/span&gt;기술&lt;span&gt; &lt;/span&gt;스택으로&lt;span&gt; &lt;/span&gt;제한&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 43.4495%; height: 18px;&quot;&gt;&lt;span&gt;각&lt;span&gt; &lt;/span&gt;모듈별로&lt;span&gt; &lt;/span&gt;다른&lt;span&gt; &lt;/span&gt;기술&lt;span&gt; &lt;/span&gt;스택을&lt;span&gt; &lt;/span&gt;사용할&lt;span&gt; &lt;/span&gt;수&lt;span&gt; &lt;/span&gt;있음&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 15.3101%; height: 18px;&quot;&gt;&lt;b&gt;보안 및 인증&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 41.5891%; height: 18px;&quot;&gt;&lt;span&gt;전체&lt;span&gt; &lt;/span&gt;시스템에&lt;span&gt; &lt;/span&gt;대한&lt;span&gt; &lt;/span&gt;단일&lt;span&gt; &lt;/span&gt;인증&lt;span&gt;/&lt;/span&gt;보안&lt;span&gt; &lt;/span&gt;체계&lt;span&gt; &lt;/span&gt;필요&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 43.4495%; height: 18px;&quot;&gt;&lt;span&gt;각&lt;span&gt; &lt;/span&gt;모듈별로&lt;span&gt; &lt;/span&gt;독립적인&lt;span&gt; &lt;/span&gt;인증&lt;span&gt; &lt;/span&gt;및&lt;span&gt; &lt;/span&gt;보안&lt;span&gt; &lt;/span&gt;체계&lt;span&gt; &lt;/span&gt;설정&lt;span&gt; &lt;/span&gt;가능&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 15.3101%; height: 18px;&quot;&gt;&lt;b&gt;코드 분리&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 41.5891%; height: 18px;&quot;&gt;&lt;span&gt;단일&lt;span&gt; &lt;/span&gt;코드베이스로&lt;span&gt; &lt;/span&gt;코드&lt;span&gt; &lt;/span&gt;분리가&lt;span&gt; &lt;/span&gt;어려움&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 43.4495%; height: 18px;&quot;&gt;&lt;span&gt;각&lt;span&gt; &lt;/span&gt;모듈별로&lt;span&gt; &lt;/span&gt;코드&lt;span&gt; &lt;/span&gt;분리가&lt;span&gt; &lt;/span&gt;되어&lt;span&gt; &lt;/span&gt;유지보수가&lt;span&gt; &lt;/span&gt;용이&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;884&quot; data-origin-height=&quot;551&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Yx7Ba/btsJPcW4htX/Gsg9yA3ydG9PkfCO6Tmabk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Yx7Ba/btsJPcW4htX/Gsg9yA3ydG9PkfCO6Tmabk/img.png&quot; data-alt=&quot;Monolithic Architecture&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Yx7Ba/btsJPcW4htX/Gsg9yA3ydG9PkfCO6Tmabk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FYx7Ba%2FbtsJPcW4htX%2FGsg9yA3ydG9PkfCO6Tmabk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;861&quot; height=&quot;537&quot; data-origin-width=&quot;884&quot; data-origin-height=&quot;551&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Monolithic Architecture&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;단일 번들에서 모든 기능이 통합되어 관리되므로, 배포 주기가 길고 유지보수에 어려움이 따릅니다.&lt;/li&gt;
&lt;li&gt;팀 간 협업에서 의존성 문제가 발생하기 쉽고, 전체 애플리케이션을 다시 빌드하고 배포해야 하므로 시간이 오래 걸립니다.&lt;/li&gt;
&lt;li&gt;성능 저하와 장애 시 전체 시스템에 영향을 미칩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;981&quot; data-origin-height=&quot;584&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bG9Nvi/btsJQyYz4Kz/6cLBfHt2KcZ9gEi8PfoDO0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bG9Nvi/btsJQyYz4Kz/6cLBfHt2KcZ9gEi8PfoDO0/img.png&quot; data-alt=&quot;Micro Frontend Architecture&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bG9Nvi/btsJQyYz4Kz/6cLBfHt2KcZ9gEi8PfoDO0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbG9Nvi%2FbtsJQyYz4Kz%2F6cLBfHt2KcZ9gEi8PfoDO0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;838&quot; height=&quot;499&quot; data-origin-width=&quot;981&quot; data-origin-height=&quot;584&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Micro Frontend Architecture&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;기능을&amp;nbsp;독립적인&amp;nbsp;모듈로&amp;nbsp;나누어&amp;nbsp;관리하므로,&amp;nbsp;개발&amp;nbsp;속도와&amp;nbsp;배포&amp;nbsp;속도가&amp;nbsp;빠르며,&amp;nbsp;팀&amp;nbsp;간&amp;nbsp;협업이&amp;nbsp;원활합니다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;성능 최적화가 용이하며, 장애 발생 시에도 해당 모듈에만 영향을 미쳐 전체 시스템 안정성을 보장할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>Project and Case Studies</category>
      <author>chojy010</author>
      <guid isPermaLink="true">https://chojy010.tistory.com/9</guid>
      <comments>https://chojy010.tistory.com/9#entry9comment</comments>
      <pubDate>Fri, 27 Sep 2024 18:38:27 +0900</pubDate>
    </item>
    <item>
      <title>JavaScript에서의 Early Return: 코드 가독성과 효율성 향상하기</title>
      <link>https://chojy010.tistory.com/8</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;react.png&quot; data-origin-width=&quot;250&quot; data-origin-height=&quot;250&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/6rAsE/btsI9HhAoaA/5tfEdQLwl5jJKbv4xbqq00/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/6rAsE/btsI9HhAoaA/5tfEdQLwl5jJKbv4xbqq00/img.png&quot; data-alt=&quot;React.js&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/6rAsE/btsI9HhAoaA/5tfEdQLwl5jJKbv4xbqq00/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F6rAsE%2FbtsI9HhAoaA%2F5tfEdQLwl5jJKbv4xbqq00%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;137&quot; height=&quot;137&quot; data-filename=&quot;react.png&quot; data-origin-width=&quot;250&quot; data-origin-height=&quot;250&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;React.js&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Early Return이란 무엇인가요?&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특정 조건이 충족되면 즉시 함수에서 반환(return)하는 것을 말합니다. 이렇게 하면 if-else 블록 내에 전체 함수 로직을 감싸는 대신, 코드를 단순화하고 중첩 블록의 수를 줄여 가독성을 높일 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;Early Return의 장점&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;1.&lt;span&gt;&lt;span&gt; &amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;코드를 더 간단하게 만들어 복잡한 중첩 구조를 피할 수 있습니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;2.&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;코드를 이해하기 쉽기 때문에 유지보수가 용이합니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;3.&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;불필요한 코드를 실행하지 않으므로 효율성을 높일 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #333333; font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;전통적인 접근 방식&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선 early return을 사용하지 않은 전통적인 접근 방식을 살펴보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용자가 성인인지 확인하고, 성인일 경우 일부 작업을 수행하는 함수를 고려해 보겠습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1723428604800&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;function checkIfAdult(age) {
    if (age &amp;gt;= 18) {
        console.log(&quot;당신은 성인입니다.&quot;);
        // 성인을 위한 추가 로직
    } else {
        console.log(&quot;당신은 성인이 아닙니다.&quot;);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;= 이 코드는 간단해 보이지만, 조건과 로직이 추가될수록 복잡해질 수 있습니다. 중첩이 깊어질수록 코드의 흐름을 따라가기가 어려워집니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #333333; font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;Early Return을 사용한 접근 방식&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 early return을 사용하여 동일한 문제를 해결해 보겠습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1723429003135&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;function checkIfAdult(age) {
    if (age &amp;lt; 18) {
        console.log(&quot;당신은 성인이 아닙니다.&quot;);
        return;
    }

    console.log(&quot;당신은 성인입니다.&quot;);
    // 성인을 위한 추가 로직
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;= 조건이 충족되지 않는 경우 함수를 즉시 종료할 수 있습니다. 이렇게 하면 코드가 더 간결해지고 가독성이 높아집니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;Early Return의 실제 예제&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;입력 값이 유효한지 확인하고, 유효하지 않으면 함수를 종료합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1723429308389&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;function processInput(input) {
    if (!input) {
        console.error(&quot;입력이 없습니다.&quot;);
        return;
    }

    if (typeof input !== 'string') {
        console.error(&quot;입력이 문자열이 아닙니다.&quot;);
        return;
    }

    console.log(`입력된 문자열: ${input}`);
    // 입력이 유효할 경우 추가 로직
}

processInput(); // 입력이 없습니다.
processInput(123); // 입력이 문자열이 아닙니다.
processInput(&quot;안녕하세요&quot;); // 입력된 문자열: 안녕하세요&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;= 입력 값이 없거나 문자열이 아닌 경우 함수를 즉시 종료함으로써 불필요한 추가 로직 실행을 방지하고 코드를 더 간결하게 만들었습니다.&lt;/p&gt;</description>
      <category>Front-End Development/JavaScript</category>
      <category>Early</category>
      <category>early return</category>
      <category>Return</category>
      <author>chojy010</author>
      <guid isPermaLink="true">https://chojy010.tistory.com/8</guid>
      <comments>https://chojy010.tistory.com/8#entry8comment</comments>
      <pubDate>Mon, 12 Aug 2024 11:24:39 +0900</pubDate>
    </item>
    <item>
      <title>Cloc (Count Lines of Code) : 코드 라인 수 세기</title>
      <link>https://chojy010.tistory.com/7</link>
      <description>&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;설치&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1723012889985&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;brew install cloc&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;프로젝트의 코드 라인 수 파악하기&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1723012917428&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 분석하고자 하는 디렉토리 이동
CD [디렉토리]

// 현재 디렉토리 내 전체 코드 라인 계산
cloc ./*&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;결과&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-------------------------------------------------------------------------------&lt;br /&gt;Language&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;files&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;blank&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;comment&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;code&lt;br /&gt;-------------------------------------------------------------------------------&lt;br /&gt;JavaScript&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;10&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;200&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;150&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;1200&lt;br /&gt;HTML&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;5&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;50&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;20&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;500&lt;br /&gt;CSS&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;3&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;30&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;10&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;300&lt;br /&gt;-------------------------------------------------------------------------------&lt;br /&gt;SUM:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;18&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;280&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;180&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;2000&lt;br /&gt;-------------------------------------------------------------------------------&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 언어별로 &lt;b&gt;파일 수, 빈 줄 수, 주석 줄 수, 실제 코드&lt;/b&gt; 줄 수를 보여줍니다.&lt;/p&gt;</description>
      <category>Additional Topics</category>
      <category>cloc</category>
      <category>count lines of code</category>
      <category>코드 라인</category>
      <category>코드 수</category>
      <author>chojy010</author>
      <guid isPermaLink="true">https://chojy010.tistory.com/7</guid>
      <comments>https://chojy010.tistory.com/7#entry7comment</comments>
      <pubDate>Wed, 7 Aug 2024 15:43:28 +0900</pubDate>
    </item>
    <item>
      <title>SWR vs TanStack: 실시간 데이터와 서버 상태 관리를 위한 모듈 비교</title>
      <link>https://chojy010.tistory.com/6</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;최신 데이터를 신속하게 가져오고, 상태 관리를 효율적으로 하는 것은 매우 중요합니다. SWR과 TanStack은 이러한 요구를 충족시키기 위해 많이 사용되는 두 가지 주요 &lt;b&gt;라이브러리&lt;/b&gt;입니다. 이 두 라이브러리는 모두 유사한 목적을 가지고 있지만, 각자의 철학과 기능에 있어 차이점이 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;SWR : &lt;/b&gt;&lt;b&gt;무한 스크롤을 위한 데이터 페칭&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SWR (Stale-While-Revalidate)은 &lt;a href=&quot;https://vercel.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;b&gt;Vercel&lt;/b&gt;&lt;/a&gt;에서 개발한 React 훅 라이브러리로, 데이터 페칭을 단순화하고 최신 데이터를 유지하는 데 중점을 둡니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;[주요 특징]&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;1.&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;b&gt;자동 재검증:&lt;/b&gt; 데이터를 불러올 때 캐시된 데이터를 먼저 보여주고, 백그라운드에서 최신 데이터를 가져와 자동으로 업데이트합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;2.&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;b&gt;간단한 API:&lt;/b&gt; 매우 직관적인 API를 제공하여 초기 설정이 쉽습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;3.&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;b&gt;최소한의 설정:&lt;/b&gt; 추가적인 설정 없이도 기본 기능을 충분히 활용할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;4.&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;b&gt;캐싱과 데이터 동기화:&lt;/b&gt; SWR은 HTTP 캐싱과 유사한 방식으로 작동하여 데이터를 효율적으로 동기화합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;5.&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;b&gt;Revalidation:&lt;/b&gt; 백그라운드에서 데이터를 다시 가져와 UI를 최신 상태로 유지합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;6.&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;b&gt;폴링(Polling) 기능:&lt;/b&gt; 주기적으로 데이터를 갱신할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;예시&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1722840804928&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import useSWR from 'swr';

const fetcher = url =&amp;gt; fetch(url).then(res =&amp;gt; res.json());

function Profile() {
  const { data, error } = useSWR('/api/user', fetcher);

  if (error) return &amp;lt;div&amp;gt;Failed to load&amp;lt;/div&amp;gt;;
  if (!data) return &amp;lt;div&amp;gt;Loading...&amp;lt;/div&amp;gt;;

  return &amp;lt;div&amp;gt;Hello, {data.name}!&amp;lt;/div&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;SWR :&lt;span&gt;&amp;nbsp;강력한 캐시와 유연한 설정&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;TanStack (React Query)은 서버 상태를 관리하고, 캐시와 동기화하는 것을 주요 목표로 하는 라이브러리입니다. 다소 복잡한 설정을 요구하지만, 그만큼 강력한 기능을 제공합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;[주요 특징]&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;1.&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;b&gt;고급 캐시 제어:&lt;/b&gt; 캐시 만료, 리페치 등 고급 캐시 전략을 세밀하게 조정할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;2.&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;b&gt;광범위한 설정 옵션:&lt;/b&gt; 다양한 훅과 설정 옵션을 통해 원하는 기능을 구현할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;3.&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;b&gt;서버 상태 관리:&lt;/b&gt; 서버 상태와 클라이언트 상태를 분리하여 관리할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;4.&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;b&gt;데이터 무효화:&lt;/b&gt; 특정 이벤트 후 데이터를 무효화하고 다시 가져올 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;5.&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;b&gt;배치 업데이트:&lt;/b&gt; 여러 쿼리를 동시에 업데이트하고 관리할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;6.&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;b&gt;DevTools:&lt;/b&gt; 개발 중 쿼리 상태를 시각적으로 확인할 수 있는 DevTools를 제공합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;예시&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1722840896368&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import { useQuery } from '@tanstack/react-query';

const fetchUser = async () =&amp;gt; {
  const res = await fetch('/api/user');
  return res.json();
};

function Profile() {
  const { data, error, isLoading } = useQuery(['user'], fetchUser);

  if (isLoading) return &amp;lt;div&amp;gt;Loading...&amp;lt;/div&amp;gt;;
  if (error) return &amp;lt;div&amp;gt;Failed to load&amp;lt;/div&amp;gt;;

  return &amp;lt;div&amp;gt;Hello, {data.name}!&amp;lt;/div&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;&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;&lt;b&gt;[차이점 요약]&lt;/b&gt;&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 198px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style15&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;&lt;b&gt;특징&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;&lt;b&gt;SWR&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;&lt;b&gt;TanStack (React Query)&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;&lt;b&gt;자동 재검증&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;백그라운드에서 자동 재검증&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;고급 설정으로 데이터 무효화 및 재검증 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;&lt;b&gt;API 사용성&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;매우 직관적, 설정이 간단&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;다양한 설정 옵션과 복잡한 기능 제공&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;&lt;b&gt;캐시 관리&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;간단한 캐시 관리&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;고급 캐시 전략 제공&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;&lt;b&gt;폴링(Polling)&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;기본 제공&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;커스텀 설정 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;&lt;b&gt;데이터 무효화&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;없음&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;특정 이벤트 후 데이터 무효화 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;&lt;b&gt;DevTools&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;없음&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;DevTools를 통해 쿼리 상태 시각화&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;&lt;b&gt;커뮤니티와 지원&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;Vercel 지원, Next.js와 통합&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;광범위한 커뮤니티 지원, 다양한 플러그인 제공&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;&lt;b&gt;설정 난이도&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;낮음&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;중간에서 높음&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;[결론]&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SWR과 TanStack은 각기 다른 상황에서 빛을 발할 수 있는 훌륭한 도구입니다. 프로젝트의 요구사항과 팀의 숙련도에 따라 적합한 도구를 선택하는 것이 중요합니다.&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;개인적으로는 간단한 데이터 페칭과 자동 재검증이 필요한 경우 SWR,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;복잡한 캐시 전략과 서버 상태 관리를 원하는 경우 TanStack을 추천합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Front-End Development/React.js</category>
      <category>react-query</category>
      <category>swr</category>
      <category>tanstack query</category>
      <author>chojy010</author>
      <guid isPermaLink="true">https://chojy010.tistory.com/6</guid>
      <comments>https://chojy010.tistory.com/6#entry6comment</comments>
      <pubDate>Mon, 5 Aug 2024 15:59:02 +0900</pubDate>
    </item>
    <item>
      <title>Storybook을 사용하여 React 컴포넌트 문서화 및 테스트하기</title>
      <link>https://chojy010.tistory.com/5</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Storybook이란?&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;UI 컴포넌트를 위한 개발 환경입니다. Storybook을 사용하면 애플리케이션과 독립적으로 컴포넌트를 개발하고, 각각의 컴포넌트를 다양한 상태에서 시각화할 수 있습니다. 또한, 팀 내에서 컴포넌트를 공유하고, 문서화하며, UI 개발 속도를 높이는 데 큰 도움을 줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Storybook의 주요 기능&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;1.&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;b&gt;독립적인 컴포넌트 개발&lt;/b&gt;: 애플리케이션과 분리된 환경에서 개별 컴포넌트를 개발할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;2.&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;b&gt;인터랙티브한 문서화&lt;/b&gt;: 컴포넌트의 다양한 상태를 스토리로 작성하여 시각적으로 문서화할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;3.&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;b&gt;애드온을 통한 확장성&lt;/b&gt;: 다양한 애드온을 사용하여 Storybook의 기능을 확장할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;4.&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;b&gt;자동화된 테스트&lt;/b&gt;: 컴포넌트의 UI 변화를 시각적으로 테스트하고 확인할 수 있습니다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;1. Storybook 설치 및 초기화&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저, Storybook을 설치하고 초기화해보겠습니다. 아래 명령어를 실행하여 Storybook을 프로젝트에 추가합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1722455504735&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;npx sb init&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;2. Storybook 설정 파일 수정&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;storybook/main.js&lt;/span&gt; 파일을 열어 아래와 같이 수정합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1722455532117&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// storybook/main.js

module.exports = {
  stories: ['../src/**/*.stories.@(js|jsx|ts|tsx)'],
  addons: [
    '@storybook/addon-links',
    '@storybook/addon-essentials',
    '@storybook/preset-create-react-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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;3. TypeScript와 Storybook 설정&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;TypeScript를 사용하려면 &lt;span&gt;tsconfig.json&lt;/span&gt; 파일에 Storybook 관련 타입 정의를 추가해야 합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1722455597062&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// tsconfig.json

{
  &quot;compilerOptions&quot;: {
    &quot;types&quot;: [&quot;@storybook/react&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;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;4. 예제 컴포넌트와 스토리 파일 생성&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;src/components&lt;/span&gt; 폴더에 &lt;span&gt;Button.tsx&lt;/span&gt; 파일을 생성하고, 간단한 버튼 컴포넌트를 작성합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1722455664733&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// src/components/Button.tsx

import React from 'react';

interface ButtonProps {
  label: string;
}

const Button: React.FC&amp;lt;ButtonProps&amp;gt; = ({ label }) =&amp;gt; {
  return &amp;lt;button&amp;gt;{label}&amp;lt;/button&amp;gt;;
};

export default Button;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1722455699261&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// Button.stories.tsx

import React from 'react';
import { ComponentStory, ComponentMeta } from '@storybook/react';

import Button from './Button';

export default {
  title: 'Example/Button',
  component: Button,
} as ComponentMeta&amp;lt;typeof Button&amp;gt;;

const Template: ComponentStory&amp;lt;typeof Button&amp;gt; = (args) =&amp;gt; &amp;lt;Button {...args} /&amp;gt;;

export const Primary = Template.bind({});
Primary.args = {
  label: '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;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;5. Storybook 실행&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;밑에 명령어를 실행하면 로컬 서버가 시작되고, 브라우저에서 &lt;span&gt;http://localhost:6006&lt;/span&gt;을 열어 Storybook 인터페이스를 확인할 수 있습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1722455726670&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;npm run storybook&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Front-End Development/React.js</category>
      <category>react</category>
      <category>storybook</category>
      <category>스토리북</category>
      <author>chojy010</author>
      <guid isPermaLink="true">https://chojy010.tistory.com/5</guid>
      <comments>https://chojy010.tistory.com/5#entry5comment</comments>
      <pubDate>Thu, 1 Aug 2024 05:00:46 +0900</pubDate>
    </item>
    <item>
      <title>React와 TypeScript로 프로젝트 시작하기</title>
      <link>https://chojy010.tistory.com/4</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;1. 새로운 React 프로젝트 생성&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저, &lt;span&gt;create-react-app&lt;/span&gt;을 사용하여 새로운 프로젝트를 생성합니다. 이때 TypeScript 템플릿을 사용하여 프로젝트를 초기화합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1722446043887&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;npx create-react-app my-typescript-app --template typescript
cd my-typescript-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;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;2. TypeScript 설정 파일 확인&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로젝트 루트 디렉토리에 있는 &lt;span&gt;tsconfig.json&lt;/span&gt; 파일을 열어 TypeScript 설정을 확인합니다. 기본 설정으로 충분하지만, 필요에 따라 설정을 수정할 수 있습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1722446133243&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{
  &quot;compilerOptions&quot;: {
    &quot;target&quot;: &quot;es5&quot;,
    &quot;lib&quot;: [&quot;dom&quot;, &quot;dom.iterable&quot;, &quot;esnext&quot;],
    &quot;allowJs&quot;: true,
    &quot;skipLibCheck&quot;: true,
    &quot;esModuleInterop&quot;: true,
    &quot;allowSyntheticDefaultImports&quot;: true,
    &quot;strict&quot;: true,
    &quot;forceConsistentCasingInFileNames&quot;: true,
    &quot;noFallthroughCasesInSwitch&quot;: true,
    &quot;module&quot;: &quot;esnext&quot;,
    &quot;moduleResolution&quot;: &quot;node&quot;,
    &quot;resolveJsonModule&quot;: true,
    &quot;isolatedModules&quot;: true,
    &quot;noEmit&quot;: true,
    &quot;jsx&quot;: &quot;react-jsx&quot;
  },
  &quot;include&quot;: [&quot;src&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;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span&gt;3. &lt;/span&gt;첫 번째 TypeScript 컴포넌트 만들기&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;src/components&lt;/span&gt; 폴더를 만들고, 그 안에 &lt;span&gt;Button.tsx&lt;/span&gt; 파일을 생성합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1722446178520&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import React from 'react';

interface ButtonProps {
  label: string;
}

const Button: React.FC&amp;lt;ButtonProps&amp;gt; = ({ label }) =&amp;gt; {
  return &amp;lt;button&amp;gt;{label}&amp;lt;/button&amp;gt;;
};

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;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;4. 프로젝트 실행&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;밑에 명령어를 실행하면 로컬 서버가 시작되고, 브라우저에서 &lt;b&gt;&lt;span&gt;http://localhost:3000&lt;/span&gt;&lt;/b&gt;을 열어 React 애플리케이션을 확인할 수 있습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1722446290580&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;npm run start&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Front-End Development/React.js</category>
      <category>react</category>
      <category>react18</category>
      <category>typescript</category>
      <author>chojy010</author>
      <guid isPermaLink="true">https://chojy010.tistory.com/4</guid>
      <comments>https://chojy010.tistory.com/4#entry4comment</comments>
      <pubDate>Thu, 1 Aug 2024 02:19:03 +0900</pubDate>
    </item>
    <item>
      <title>React 기초: 주요 개념과 기능 이해하기</title>
      <link>https://chojy010.tistory.com/3</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;JavaScript 라이브러리로서 사용자 인터페이스를 구축하기 위해 널리 사용됩니다.&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&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;컴포넌트 (Components)&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;React의 기본 빌딩 블록은 컴포넌트입니다. 각 컴포넌트는 독립적으로 작동하며, 재사용 가능하고 계층적으로 조합하여 복잡한 UI를 구성할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;클래스형 컴포넌트&lt;/b&gt;: 상태 관리와 라이프사이클 기능을 사용할 수 있습니다&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1717937758538&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import React, { Component } from 'react';

class Welcome extends Component {
  render() {
    return &amp;lt;h1&amp;gt;Hello, {this.props.name}&amp;lt;/h1&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;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;함수형 컴포넌트&lt;/b&gt;: 간단하고 효율적인 컴포넌트 생성이 가능하며, 훅을 사용하여 상태와 라이프사이클을 관리합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1717937810349&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import React from 'react';

function Welcome(props) {
  return &amp;lt;h1&amp;gt;Hello, {props.name}&amp;lt;/h1&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;&amp;nbsp;&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;JSX (JavaScript XML)&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;JSX는 HTML과 유사하게 생겼지만 JavaScript를 확장한 문법입니다. JSX를 사용하면 React 엘리먼트를 쉽게 작성하고, 읽기 쉬운 코드로 UI를 정의할 수 있습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1717937857528&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const element = &amp;lt;h1 className=&quot;greeting&quot;&amp;gt;Hello, world!&amp;lt;/h1&amp;gt;;&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;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;▣&amp;nbsp;Props (Properties)&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Props는 부모 컴포넌트에서 자식 컴포넌트로 데이터를 전달하는 방법입니다. 이를 통해 컴포넌트 간에 정보를 공유하고, 동적인 컴포넌트를 만들 수 있습니다. Props는 읽기 전용이며, 컴포넌트 내부에서 변경할 수 없습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1717937878279&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;function Welcome(props) {
  return &amp;lt;h1&amp;gt;Hello, {props.name}!&amp;lt;/h1&amp;gt;;
}

function App() {
  return &amp;lt;Welcome name=&quot;Sarah&quot; /&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;&amp;nbsp;&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;State (상태)&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;State는 컴포넌트의 상태를 관리하는 데이터입니다. 사용자와의 상호작용에 따라 동적으로 변화하는 UI를 만들기 위해 필수적입니다. useState 훅을 통해 함수형 컴포넌트에서도 상태를 쉽게 관리할 수 있습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1717937911545&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import React, { useState } from 'react';

function Counter() {
  const [count, setCount] = useState(0);

  return (
    &amp;lt;div&amp;gt;
      &amp;lt;p&amp;gt;You clicked {count} times&amp;lt;/p&amp;gt;
      &amp;lt;button onClick={() =&amp;gt; setCount(count + 1)}&amp;gt;
        Click me
      &amp;lt;/button&amp;gt;
    &amp;lt;/div&amp;gt;
  );
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&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;이벤트 처리 (Event Handling)&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;React에서 이벤트를 처리하는 방법은 매우 간단합니다. onClick, onChange와 같은 JSX 속성을 사용하여 이벤트 핸들러를 정의하고, 사용자의 액션에 따라 특정 로직을 실행할 수 있습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1717937924125&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import React, { useState } from 'react';

function TextInput() {
  const [value, setValue] = useState('');

  function handleChange(event) {
    setValue(event.target.value);
  }

  return (
    &amp;lt;input type=&quot;text&quot; value={value} onChange={handleChange} /&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;&amp;nbsp;&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;조건부 렌더링 (Conditional Rendering)&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;조건에 따라 다른 컴포넌트를 렌더링하거나 보이지 않게 할 수 있습니다. React에서는 JavaScript의 조건문이나 삼항 연산자를 사용하여 이를 구현합니다. 이는 복잡한 사용자 인터페이스의 다양한 부분을 효율적으로 관리할 수 있게 해줍니다.&lt;/p&gt;
&lt;pre id=&quot;code_1717937965532&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;function Welcome(props) {
  return &amp;lt;div&amp;gt;{props.isLoggedIn ? &amp;lt;h1&amp;gt;Welcome back!&amp;lt;/h1&amp;gt; : &amp;lt;h1&amp;gt;Please sign up.&amp;lt;/h1&amp;gt;}&amp;lt;/div&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&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;리스트와 키 (Lists and Keys)&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;리스트 렌더링은 반복되는 데이터를 효율적으로 표시하는 방법입니다. 각 리스트 아이템에 고유 key를 제공하여, React가 어떤 아이템이 변경, 추가, 또는 삭제되었는지 식별할 수 있게 합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1717937981807&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;function NumberList(props) {
  const numbers = props.numbers;
  const listItems = numbers.map((number) =&amp;gt;
    &amp;lt;li key={number.toString()}&amp;gt;
      {number}
    &amp;lt;/li&amp;gt;
  );
  return (
    &amp;lt;ul&amp;gt;{listItems}&amp;lt;/ul&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;&amp;nbsp;&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;라이프사이클과 훅 (Lifecycle and Hooks)&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;React 클래스 컴포넌트는 라이프사이클 메서드를 통해 컴포넌트의 생성부터 소멸까지 관리합니다. 함수형 컴포넌트에서는 useEffect, useState, useContext와 같은 훅을 사용하여 비슷한 작업을 수행할 수 있습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1717937993578&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import React, { useState, useEffect } from 'react';

function Timer() {
  const [seconds, setSeconds] = useState(0);

  useEffect(() =&amp;gt; {
    const interval = setInterval(() =&amp;gt; {
      setSeconds(seconds =&amp;gt; seconds + 1);
    }, 1000);
    return () =&amp;gt; clearInterval(interval);
  }, []);

  return &amp;lt;div&amp;gt;Seconds: {seconds}&amp;lt;/div&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;&amp;nbsp;&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;포털 (Portals)&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;포털은 부모 컴포넌트의 DOM 계층 구조를 벗어나 필요한 곳에 UI를 렌더링할 수 있게 해줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ex). &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;모달, 팝업, 툴팁 등&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1717938149552&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import React from 'react';
import ReactDOM from 'react-dom';

function Modal({ children }) {
  return ReactDOM.createPortal(
    children,
    document.getElementById('modal-root')
  );
}

function App() {
  return &amp;lt;Modal&amp;gt;&amp;lt;div&amp;gt;This is a modal!&amp;lt;/div&amp;gt;&amp;lt;/Modal&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;&amp;nbsp;&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;Context API&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Context API는 React 애플리케이션 전역에서 데이터를 공유할 수 있는 방법을 제공합니다. 이를 통해 props 드릴링 없이 여러 컴포넌트 간에 상태를 공유할 수 있습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1717938179318&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import React, { useContext, createContext, useState } from 'react';

const ThemeContext = createContext();

function ThemeProvider({ children }) {
  const [theme, setTheme] = useState('dark');
  return (
    &amp;lt;ThemeContext.Provider value={{ theme, setTheme }}&amp;gt;
      {children}
    &amp;lt;/ThemeContext.Provider&amp;gt;
  );
}

function ThemeButton() {
  const { theme, setTheme } = useContext(ThemeContext);
  return (
    &amp;lt;button onClick={() =&amp;gt; setTheme(theme === 'dark' ? 'light' : 'dark')}&amp;gt;
      Switch Theme
    &amp;lt;/button&amp;gt;
  );
}

function App() {
  return (
    &amp;lt;ThemeProvider&amp;gt;
      &amp;lt;ThemeButton /&amp;gt;
    &amp;lt;/ThemeProvider&amp;gt;
  );
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Front-End Development/React.js</category>
      <category>javascript</category>
      <category>react</category>
      <category>리액트</category>
      <author>chojy010</author>
      <guid isPermaLink="true">https://chojy010.tistory.com/3</guid>
      <comments>https://chojy010.tistory.com/3#entry3comment</comments>
      <pubDate>Sun, 9 Jun 2024 22:05:52 +0900</pubDate>
    </item>
    <item>
      <title>웹 성능 향상을 위한 필수 기술: 자바스크립트 경량화(Minify)의 이해와 적용</title>
      <link>https://chojy010.tistory.com/1</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;웹 페이지의 로딩 속도는 사용자 경험과 검색 엔진 순위에 결정적인 영향을 미칩니다. 이를 개선하는 강력한 방법 중 하나가 바로 &lt;b&gt;'경량화(minify)'&lt;/b&gt;입니다. 이 글에서는 경량화가 무엇인지, 왜 중요한지, 그리고 어떻게 적용할 수 있는지에 대해 알아보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;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;공백, 줄바꿈, 주석을 제거&lt;/b&gt;하여 파일 크기를 줄이는 과정입니다. 이 작업은 페이지 로딩 시간을 단축시키고, 네트워크 비용을 절감하여 모바일 사용자에게도 큰 이점을 제공합니다. 또한, 더 빠른 로딩 시간은 검색 엔진 최적화(SEO)에도 긍정적인 영향을 미칩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;경량화 기술&lt;/b&gt;&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;공백 제거&lt;/b&gt;: 코드 내의 모든 불필요한 공백을 제거합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;줄바꿈 삭제&lt;/b&gt;: 코드의 줄바꿈을 제거하여 파일의 라인 수를 최소화합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;주석 삭제&lt;/b&gt;: 코드 설명을 위한 주석을 제거합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;변수 및 함수 이름 단축&lt;/b&gt;: 가능한 한 짧은 이름으로 변경하여 추가 공간을 절약합니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&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;style3&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;경량화 전&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;pre id=&quot;code_1717936240068&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;function addNumbers(a, b) {
    return a + b;
}&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;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;경량화 후&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;pre id=&quot;code_1717936286479&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;function addNumbers(a,b){return a+b;}&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;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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;UglifyJS&lt;/b&gt;: 자바스크립트 코드를 압축하고 난독화하는 데 사용됩니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Terser&lt;/b&gt;: ES6+ 코드를 지원하는 UglifyJS의 포크입니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;CSSNano&lt;/b&gt;: CSS 파일을 최적화하고 경량화하는 도구입니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;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;경량화(Minify)는 웹 성능을 최적화하고 사용자 경험을 향상시키는 필수적인 과정입니다. 이 기술을 웹 개발 프로젝트에 적용함으로써, 더 빠른 로딩 시간과 향상된 SEO 이점을 누릴 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Front-End Development/JavaScript</category>
      <category>javascript</category>
      <category>Minify</category>
      <category>경량화</category>
      <category>자바스크립트</category>
      <author>chojy010</author>
      <guid isPermaLink="true">https://chojy010.tistory.com/1</guid>
      <comments>https://chojy010.tistory.com/1#entry1comment</comments>
      <pubDate>Sun, 9 Jun 2024 21:44:42 +0900</pubDate>
    </item>
    <item>
      <title>코드 보호 : 자바스크립트 난독화의 중요성</title>
      <link>https://chojy010.tistory.com/2</link>
      <description>&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; 난독화&lt;/b&gt;는 소프트웨어 개발에서 중요한 보안 조치 중 하나입니다. 이 글에서는 난독화가 무엇인지, 왜 중요한지, 그리고 자바스크립트 코드에 어떻게 적용할 수 있는지에 대해 살펴보겠습니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; 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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;보안 강화&lt;/b&gt;: 공개적으로 접근 가능한 클라이언트 사이드 코드를 보호하여, 해킹 및 무단 복제를 방지합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;지적 재산 보호&lt;/b&gt;: 소스 코드 내에 포함된 로직이나 알고리즘을 보호하여, 개발자의 지적 재산권을 유지합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;리버스 엔지니어링 방지&lt;/b&gt;: 코드의 이해와 분석을 어렵게 만들어, 경쟁사나 악의적 사용자에 의한 역공학을 어렵게 합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;난독화 기법&lt;/b&gt;&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;변수 및 함수 이름 변경&lt;/b&gt;: 의미 있는 이름을 갖는 변수나 함수의 이름을 짧고 무의미한 문자로 변경합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;코드 구조 변경&lt;/b&gt;: 코드의 실행 순서를 변경하거나 로직을 복잡하게 재구성하여, 원래의 코드 흐름을 알아보기 어렵게 합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;문자열 인코딩&lt;/b&gt;: 코드 내의 문자열 리터럴을 인코딩하고, 실행 시점에 디코딩하여 사용합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;더미 코드 추가&lt;/b&gt;: 기능적으로는 무의미하거나 실행되지 않는 코드를 추가하여, 분석을 더 어렵게 만듭니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;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 style=&quot;background-color: #fcfcfc; color: #666666; text-align: left;&quot; data-ke-style=&quot;style3&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;경량화 전&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;pre id=&quot;code_1717936895182&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;function calculateArea(width, height) {
    return width * height;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote style=&quot;background-color: #fcfcfc; color: #666666; text-align: left;&quot; data-ke-style=&quot;style3&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;경량화 후&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;pre id=&quot;code_1717936907409&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;var a='calculateArea', b=function(c,d){return c*d}; window[a]=b;&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;UglifyJS&lt;/b&gt;: 이 도구는 자바스크립트 코드를 난독화하고 압축하는 기능을 제공합니다. 변수 및 함수 이름을 변경하고, 코드를 최소화합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;JavaScript Obfuscator Tool&lt;/b&gt;: 웹 기반 도구로, 코드 구조를 변경하고, 문자열을 인코딩하는 등 다양한 난독화 옵션을 제공합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;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 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;난독화는 코드 보안을 강화하는 중요한 단계입니다. 특히, 웹 애플리케이션 개발에서는 클라이언트 사이드 스크립트가 외부에 노출되어 있기 때문에 난독화를 통해 추가적인 보호층을 제공할 수 있습니다.&lt;/p&gt;</description>
      <category>Front-End Development/JavaScript</category>
      <category>javascript</category>
      <category>obfuscation</category>
      <category>난독화</category>
      <category>자바스크립트</category>
      <author>chojy010</author>
      <guid isPermaLink="true">https://chojy010.tistory.com/2</guid>
      <comments>https://chojy010.tistory.com/2#entry2comment</comments>
      <pubDate>Sun, 9 Jun 2024 21:43:36 +0900</pubDate>
    </item>
  </channel>
</rss>