<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:media="http://search.yahoo.com/mrss/"><channel><title><![CDATA[Keun's Story]]></title><description><![CDATA[Exploring tech, startups and development.]]></description><link>https://keun.me/</link><image><url>https://keun.me/favicon.png</url><title>Keun&apos;s Story</title><link>https://keun.me/</link></image><generator>Ghost 5.82</generator><lastBuildDate>Thu, 09 Apr 2026 20:12:11 GMT</lastBuildDate><atom:link href="https://keun.me/rss/" rel="self" type="application/rss+xml"/><ttl>60</ttl><item><title><![CDATA[AI 에이전트 프로덕션 배포기: 성능보다 중요한 건 '우아한 예외 처리'였다]]></title><description><![CDATA[<p>AI &#xC5D0;&#xC774;&#xC804;&#xD2B8;&#xB294; &#xC0DD;&#xAC01;&#xBCF4;&#xB2E4; &#xD6E8;&#xC52C; &#xC798;&#xD569;&#xB2C8;&#xB2E4;.</p><p>&#xC2E4;&#xC81C;&#xB85C; &#xB2E4;&#xC591;&#xD55C; &#xB3C4;&#xAD6C;&#xB97C; &#xC5F0;&#xACB0;&#xD574;&#xC8FC;&#xBA74;, &#xB2E8;&#xC21C; &#xC9C8;&#xC758;&#xC751;&#xB2F5;&#xC744; &#xB118;&#xC5B4;&#xC11C; &#xB370;&#xC774;&#xD130;&#xB97C; &#xBC14;&#xD0D5;&#xC73C;&#xB85C; &#xC0AC;&#xB78C;</p>]]></description><link>https://keun.me/ai-agent-error-handling/</link><guid isPermaLink="false">69c3687e422fb1000117bd1c</guid><dc:creator><![CDATA[Keun.R]]></dc:creator><pubDate>Sun, 29 Mar 2026 02:57:32 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1745674684468-b9fc392fda3f?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDU1fHxhaXxlbnwwfHx8fDE3NzQ3NTI0OTR8MA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=2000" medium="image"/><content:encoded><![CDATA[<img src="https://images.unsplash.com/photo-1745674684468-b9fc392fda3f?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDU1fHxhaXxlbnwwfHx8fDE3NzQ3NTI0OTR8MA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=2000" alt="AI &#xC5D0;&#xC774;&#xC804;&#xD2B8; &#xD504;&#xB85C;&#xB355;&#xC158; &#xBC30;&#xD3EC;&#xAE30;: &#xC131;&#xB2A5;&#xBCF4;&#xB2E4; &#xC911;&#xC694;&#xD55C; &#xAC74; &apos;&#xC6B0;&#xC544;&#xD55C; &#xC608;&#xC678; &#xCC98;&#xB9AC;&apos;&#xC600;&#xB2E4;"><p>AI &#xC5D0;&#xC774;&#xC804;&#xD2B8;&#xB294; &#xC0DD;&#xAC01;&#xBCF4;&#xB2E4; &#xD6E8;&#xC52C; &#xC798;&#xD569;&#xB2C8;&#xB2E4;.</p><p>&#xC2E4;&#xC81C;&#xB85C; &#xB2E4;&#xC591;&#xD55C; &#xB3C4;&#xAD6C;&#xB97C; &#xC5F0;&#xACB0;&#xD574;&#xC8FC;&#xBA74;, &#xB2E8;&#xC21C; &#xC9C8;&#xC758;&#xC751;&#xB2F5;&#xC744; &#xB118;&#xC5B4;&#xC11C; &#xB370;&#xC774;&#xD130;&#xB97C; &#xBC14;&#xD0D5;&#xC73C;&#xB85C; &#xC0AC;&#xB78C;&#xC774; &#xC778;&#xC9C0;&#xD558;&#xC9C0; &#xBABB;&#xD588;&#xB358; &#xC601;&#xC5ED;&#xAE4C;&#xC9C0; &#xBD84;&#xC11D;&#xD558;&#xACE0;, &#xAE09;&#xB4F1;/&#xAE09;&#xB77D; &#xAC10;&#xC9C0;, &#xC7AC;&#xAD6C;&#xB9E4; &#xCF54;&#xD638;&#xD2B8; &#xBD84;&#xC11D;, &#xD06C;&#xB85C;&#xC2A4;&#xC140; &#xACBD;&#xB85C; &#xC81C;&#xC548;&#xAE4C;&#xC9C0; &#x2014; &#xADF8;&#xB798;&#xD504;&#xB97C; &#xB9CC;&#xB4E4;&#xACE0;, KPI&#xB97C; &#xBE44;&#xAD50; &#xBD84;&#xC11D;&#xD558;&#xACE0;, &#xC608;&#xCE21;&#xC744; &#xC704;&#xD55C; &#xB3D9;&#xC801; UI&#xB97C; &#xAD6C;&#xC131;&#xD558;&#xACE0;, &#xB514;&#xD14C;&#xC77C;&#xD55C; &#xC778;&#xC0AC;&#xC774;&#xD2B8;&#xC640; &#xB2E4;&#xC74C; &#xC561;&#xC158;&#xAE4C;&#xC9C0; &#xC81C;&#xC548;&#xD560; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.</p><p>&#xC800;&#xD76C; &#xD300;&#xB3C4; &#xAE00;&#xB85C;&#xBC8C; K-&#xBDF0;&#xD2F0; &#xAE30;&#xC5C5;&#xC5D0; AI &#xC5D0;&#xC774;&#xC804;&#xD2B8; &#xC2A4;&#xD0AC;&#xD329;&#xC744; &#xBC30;&#xD3EC;&#xD558;&#xBA74;&#xC11C; &#xC774; &#xAC00;&#xB2A5;&#xC131;&#xC5D0; &#xC5EC;&#xB7EC; &#xBC88; &#xB180;&#xB790;&#xC2B5;&#xB2C8;&#xB2E4;. &#xB370;&#xC774;&#xD130;&#xB97C; &#xBC14;&#xD0D5;&#xC73C;&#xB85C; &#xC0AC;&#xB78C;&#xC774; &#xC778;&#xC9C0;&#xD558;&#xC9C0; &#xBABB;&#xD588;&#xB358; &#xC601;&#xC5ED;&#xAE4C;&#xC9C0; &#xBD84;&#xC11D;&#xD558;&#xACE0;, &#xC778;&#xC0AC;&#xC774;&#xD2B8;&#xB97C; &#xC81C;&#xACF5;&#xD558;&#xB294; &#xACBD;&#xD5D8;&#xC740; &#xB2E8;&#xC21C;&#xD788; &quot;&#xC790;&#xB3D9;&#xD654;&quot;&#xB77C;&#xB294; &#xB2E8;&#xC5B4;&#xB85C;&#xB294; &#xBD80;&#xC871;&#xD588;&#xC2B5;&#xB2C8;&#xB2E4;. &#xC2E4;&#xC81C;&#xB85C; &#xACE0;&#xAC1D;&#xC0AC; &#xC804;&#xBB34;&#xB2D8;&#xC774; &#xC5D0;&#xC774;&#xC804;&#xD2B8; &#xB3D9;&#xC791;&#xACFC; &#xBD84;&#xC11D; &#xACB0;&#xACFC;&#xB97C; &#xBCF4;&#xC2DC;&#xACE0; &quot;&#xB300;~&#xBC15;&quot;&#xC774;&#xB77C;&#xACE0; &#xD558;&#xC168;&#xB2E4;&#xB294; &#xC774;&#xC57C;&#xAE30;&#xB97C; &#xC804;&#xB2EC;&#xBC1B;&#xC744; &#xC815;&#xB3C4;&#xC600;&#xC2B5;&#xB2C8;&#xB2E4;.</p><p>&#xADF8;&#xB7F0;&#xB370; &#xD504;&#xB85C;&#xB355;&#xC158;&#xC5D0; &#xBD99;&#xC774;&#xAE30; &#xC804;, &#xB0B4;&#xBD80; &#xD14C;&#xC2A4;&#xD2B8; &#xACFC;&#xC815;&#xC5D0;&#xC11C; &#xC911;&#xC694;&#xD55C; &#xAC78; &#xAE68;&#xB2EC;&#xC558;&#xC2B5;&#xB2C8;&#xB2E4;. &#xB4DC;&#xBB3C;&#xAC8C; &#xC2E4;&#xD328;&#xAC00; &#xBC1C;&#xC0DD;&#xD588;&#xC744; &#xB54C;, &#xB300;&#xBE44;&#xAC00; &#xC5C6;&#xC73C;&#xBA74; &#xCE58;&#xBA85;&#xC801;&#xC774;&#xB77C;&#xB294; &#xC810;&#xC774;&#xC5C8;&#xC2B5;&#xB2C8;&#xB2E4;.</p><hr><h3 id="%EB%8F%84%EA%B5%AC%EB%A5%BC-%EC%93%B0%EB%8A%94-%EA%B8%B0%EB%B3%B8-%ED%9D%90%EB%A6%84">&#xB3C4;&#xAD6C;&#xB97C; &#xC4F0;&#xB294; &#xAE30;&#xBCF8; &#xD750;&#xB984;</h3><pre><code>AI &#x2192; &#xB3C4;&#xAD6C; &#xD638;&#xCD9C; &#x2192; &#xACB0;&#xACFC; &#xC218;&#xC2E0; &#x2192; &#xB2E4;&#xC74C; &#xD589;&#xB3D9; &#xACB0;&#xC815;</code></pre><p>&#xBB38;&#xC81C;&#xB294; &#xB3C4;&#xAD6C;&#xAC00; &#xC2E4;&#xD328;&#xD588;&#xC744; &#xB54C;&#xC785;&#xB2C8;&#xB2E4;. &#xB0B4;&#xBD80; &#xD14C;&#xC2A4;&#xD2B8; &#xACFC;&#xC815;&#xC5D0;&#xC11C; &#xBC1C;&#xACAC;&#xD558;&#xACE0; &#xC218;&#xC815;&#xD55C; &#xBB38;&#xC81C;&#xB294; &#xD06C;&#xAC8C; &#xB124; &#xAC00;&#xC9C0;&#xC600;&#xC2B5;&#xB2C8;&#xB2E4;.</p><hr><h3 id="1-%EA%B0%99%EC%9D%80-%EC%8B%A4%ED%8C%A8%EB%A5%BC-%EB%B0%98%EB%B3%B5%ED%96%88%EB%8B%A4">1. &#xAC19;&#xC740; &#xC2E4;&#xD328;&#xB97C; &#xBC18;&#xBCF5;&#xD588;&#xB2E4;</h3><p>&#xB3C4;&#xAD6C;&#xAC00; &#xC5D0;&#xB7EC;&#xB97C; &#xBC18;&#xD658;&#xD558;&#xBA74; AI&#xB294; &#xAC19;&#xC740; &#xD638;&#xCD9C;&#xC744; &#xBC18;&#xBCF5;&#xD588;&#xC2B5;&#xB2C8;&#xB2E4;. &#xC0AC;&#xC6A9;&#xC790;&#xB294; &#xC751;&#xB2F5;&#xC744; &#xAE30;&#xB2E4;&#xB9AC;&#xB294;&#xB370;, &#xB0B4;&#xBD80;&#xC5D0;&#xC11C;&#xB294; &#xAC19;&#xC740; API&#xAC00; &#xC5EC;&#xB7EC; &#xBC88; &#xD638;&#xCD9C;&#xB418;&#xBA70; &#xBE44;&#xC6A9;&#xACFC; &#xC9C0;&#xC5F0;&#xC774; &#xAC19;&#xC774; &#xCEE4;&#xC84C;&#xC2B5;&#xB2C8;&#xB2E4;.</p><p><strong>&#xD574;&#xACB0;: Circuit Breaker</strong></p><p>&#xC5F0;&#xC18D; &#xC2E4;&#xD328; &#xD69F;&#xC218;&#xAC00; &#xC77C;&#xC815; &#xAE30;&#xC900;&#xC744; &#xB118;&#xC73C;&#xBA74; &#xD574;&#xB2F9; &#xB3C4;&#xAD6C;&#xB97C; &#xC7A0;&#xC2DC; &#xBE44;&#xD65C;&#xC131;&#xD654;&#xD558;&#xACE0;, AI&#xC5D0;&#xAC8C;&#xB294; &#xB0B4;&#xBD80;&#xC801;&#xC73C;&#xB85C; &quot;&#xC774; &#xB3C4;&#xAD6C;&#xB294; &#xB354; &#xC4F0;&#xC9C0; &#xB9D0;&#xACE0; &#xB2E4;&#xB978; &#xBC29;&#xBC95;&#xC744; &#xCC3E;&#xC544;&#xB77C;&quot;&#xB294; &#xC2E0;&#xD638;&#xB97C; &#xC804;&#xB2EC;&#xD588;&#xC2B5;&#xB2C8;&#xB2E4;. &#xBD84;&#xC0B0; &#xC2DC;&#xC2A4;&#xD15C;&#xC5D0;&#xC11C; &#xD754;&#xD788; &#xC4F0;&#xC774;&#xB294; &#xD328;&#xD134;&#xC774;&#xC9C0;&#xB9CC;, AI &#xC5D0;&#xC774;&#xC804;&#xD2B8; &#xB9E5;&#xB77D;&#xC5D0;&#xC11C;&#xB294; &quot;AI&#xC758; &#xD589;&#xB3D9;&#xC744; &#xC81C;&#xC5B4;&#xD558;&#xB294; &#xC2E0;&#xD638;&quot;&#xB85C; &#xC791;&#xB3D9;&#xD55C;&#xB2E4;&#xB294; &#xC810;&#xC774; &#xD575;&#xC2EC;&#xC774;&#xC5C8;&#xC2B5;&#xB2C8;&#xB2E4;.</p><hr><h3 id="2-%EA%B0%99%EC%9D%80-%EB%8F%84%EA%B5%AC%EB%A5%BC-%EC%A4%91%EB%B3%B5-%ED%98%B8%EC%B6%9C%ED%96%88%EB%8B%A4">2. &#xAC19;&#xC740; &#xB3C4;&#xAD6C;&#xB97C; &#xC911;&#xBCF5; &#xD638;&#xCD9C;&#xD588;&#xB2E4;</h3><p>&#xAC19;&#xC740; &#xB3C4;&#xAD6C;, &#xAC19;&#xC740; &#xD30C;&#xB77C;&#xBBF8;&#xD130;&#xB97C; &#xB2E4;&#xC2DC; &#xD638;&#xCD9C;&#xD558;&#xB294; &#xACBD;&#xC6B0;&#xB3C4; &#xC788;&#xC5C8;&#xC2B5;&#xB2C8;&#xB2E4;. AI &#xC785;&#xC7A5;&#xC5D0;&#xC11C;&#xB294; &#xD655;&#xC778; &#xD589;&#xB3D9;&#xC77C; &#xC218; &#xC788;&#xC9C0;&#xB9CC;, &#xC2DC;&#xC2A4;&#xD15C; &#xC785;&#xC7A5;&#xC5D0;&#xC11C;&#xB294; &#xC911;&#xBCF5; &#xD2B8;&#xB798;&#xD53D;&#xC774;&#xC5C8;&#xC2B5;&#xB2C8;&#xB2E4;.</p><p><strong>&#xD574;&#xACB0;: Dedup Cache</strong></p><p>&#xAC19;&#xC740; tool + &#xAC19;&#xC740; parameter &#xC870;&#xD569;&#xC774;&#xBA74; &#xB450; &#xBC88;&#xC9F8; &#xD638;&#xCD9C;&#xC5D0;&#xB294; &#xCE90;&#xC2DC;&#xB41C; &#xACB0;&#xACFC;&#xB97C; &#xBC18;&#xD658;&#xD558;&#xB3C4;&#xB85D; &#xD588;&#xC2B5;&#xB2C8;&#xB2E4;. &#xCE90;&#xC2DC; TTL&#xC740; &#xB3C4;&#xAD6C; &#xD2B9;&#xC131;&#xC5D0; &#xB530;&#xB77C; &#xB2E4;&#xB974;&#xAC8C; &#xC124;&#xC815;&#xD588;&#xC2B5;&#xB2C8;&#xB2E4;. &#xC2E4;&#xC2DC;&#xAC04; &#xB370;&#xC774;&#xD130;&#xB97C; &#xB2E4;&#xB8E8;&#xB294; &#xB3C4;&#xAD6C;&#xB294; &#xC9E7;&#xAC8C;, &#xC815;&#xC801; &#xB370;&#xC774;&#xD130;&#xB97C; &#xB2E4;&#xB8E8;&#xB294; &#xB3C4;&#xAD6C;&#xB294; &#xAE38;&#xAC8C;.</p><hr><h3 id="3-%EB%8F%84%EA%B5%AC%EA%B0%80-%EB%A9%88%EC%B6%94%EB%A9%B4-%EC%A0%84%EC%B2%B4-%EB%A3%A8%ED%94%84%EA%B0%80-%EA%B0%99%EC%9D%B4-%EB%A9%88%EC%B7%84%EB%8B%A4">3. &#xB3C4;&#xAD6C;&#xAC00; &#xBA48;&#xCD94;&#xBA74; &#xC804;&#xCCB4; &#xB8E8;&#xD504;&#xAC00; &#xAC19;&#xC774; &#xBA48;&#xCDC4;&#xB2E4;</h3><p>&#xC678;&#xBD80; API&#xAC00; &#xC751;&#xB2F5; &#xC5C6;&#xC774; &#xBA48;&#xCD94;&#xBA74; AI &#xB8E8;&#xD504; &#xC804;&#xCCB4;&#xAC00; &#xBE14;&#xB85C;&#xD0B9;&#xB410;&#xC2B5;&#xB2C8;&#xB2E4;. &#xC0AC;&#xC6A9;&#xC790; &#xD654;&#xBA74;&#xC5D0;&#xB294; &#xADF8;&#xB0E5; &quot;&#xB85C;&#xB529; &#xC911;&#x2026;&quot;&#xB9CC; &#xACC4;&#xC18D; &#xB0A8;&#xB294; &#xC0C1;&#xD669;&#xC774; &#xB410;&#xC2B5;&#xB2C8;&#xB2E4;.</p><p><strong>&#xD574;&#xACB0;: Timeout &#xAC15;&#xC81C;</strong></p><p>30&#xCD08;&#xB97C; &#xB118;&#xAE30;&#xBA74; &#xC2DC;&#xAC04; &#xCD08;&#xACFC;&#xB85C; &#xCC98;&#xB9AC;&#xD558;&#xACE0;, AI&#xC5D0;&#xAC8C;&#xB294; &quot;&#xD30C;&#xB77C;&#xBBF8;&#xD130;&#xB97C; &#xB2E8;&#xC21C;&#xD654;&#xD574;&#xC11C; &#xD55C; &#xBC88;&#xB9CC; &#xC7AC;&#xC2DC;&#xB3C4;&#xD574;&#xBD10;&quot; &#xAC19;&#xC740; &#xC2DD;&#xC73C;&#xB85C; &#xC548;&#xB0B4;&#xD588;&#xC2B5;&#xB2C8;&#xB2E4;. &#xD0C0;&#xC784;&#xC544;&#xC6C3; &#xAC12;&#xC740; &#xB3C4;&#xAD6C;&#xBCC4;&#xB85C; &#xB2E4;&#xB974;&#xAC8C; &#xC124;&#xC815;&#xD588;&#xACE0;, &#xC678;&#xBD80; API&#xC758; &#xD3C9;&#xADE0; &#xC751;&#xB2F5; &#xC2DC;&#xAC04; &#xB370;&#xC774;&#xD130;&#xB97C; &#xAE30;&#xBC18;&#xC73C;&#xB85C; &#xC870;&#xC815;&#xD588;&#xC2B5;&#xB2C8;&#xB2E4;.</p><hr><h3 id="4-%EC%97%90%EB%9F%AC-%EB%A9%94%EC%8B%9C%EC%A7%80-%EC%84%A4%EA%B3%84%EA%B0%80-ai%EC%9D%98-%ED%96%89%EB%8F%99%EC%9D%84-%EB%B0%94%EA%BF%A8%EB%8B%A4-%E2%80%94-%ED%95%B5%EC%8B%AC-%EB%B0%9C%EA%B2%AC">4. &#xC5D0;&#xB7EC; &#xBA54;&#xC2DC;&#xC9C0; &#xC124;&#xACC4;&#xAC00; AI&#xC758; &#xD589;&#xB3D9;&#xC744; &#xBC14;&#xAFE8;&#xB2E4; &#x2014; &#xD575;&#xC2EC; &#xBC1C;&#xACAC;</h3><p>&#xC774; &#xBD80;&#xBD84;&#xC774; &#xAC00;&#xC7A5; &#xC911;&#xC694;&#xD55C; &#xBC1C;&#xACAC;&#xC774;&#xC5C8;&#xC2B5;&#xB2C8;&#xB2E4;.</p><p>&#xB2E8;&#xC21C;&#xD788; &quot;&#xC5D0;&#xB7EC; &#xBC1C;&#xC0DD;&quot;&#xC774;&#xB77C;&#xACE0;&#xB9CC; &#xC804;&#xB2EC;&#xD558;&#xBA74;, AI&#xB294; &#xAC19;&#xC740; &#xD589;&#xB3D9;&#xC744; &#xBC18;&#xBCF5;&#xD558;&#xB294; &#xACBD;&#xD5A5;&#xC774; &#xC788;&#xC5C8;&#xC2B5;&#xB2C8;&#xB2E4;. &#xBC18;&#xB300;&#xB85C; &#xC5D0;&#xB7EC;&#xB97C; &#xC885;&#xB958;&#xBCC4;&#xB85C; &#xAD6C;&#xBD84;&#xD574; &#xC804;&#xB2EC;&#xD558;&#xBA74; &#xD589;&#xB3D9;&#xC774; &#xB2EC;&#xB77C;&#xC84C;&#xC2B5;&#xB2C8;&#xB2E4;.</p>
<!--kg-card-begin: html-->
<table class="min-w-full border-collapse text-sm leading-[1.7] whitespace-normal"><thead class="text-left"><tr><th scope="col" class="text-text-100 border-b-0.5 border-border-300/60 py-2 pr-4 align-top font-bold">&#xC5D0;&#xB7EC; &#xC720;&#xD615;</th><th scope="col" class="text-text-100 border-b-0.5 border-border-300/60 py-2 pr-4 align-top font-bold">AI&#xC5D0;&#xAC8C; &#xC804;&#xB2EC;&#xD558;&#xB294; &#xC81C;&#xC5B4; &#xC2E0;&#xD638;</th><th scope="col" class="text-text-100 border-b-0.5 border-border-300/60 py-2 pr-4 align-top font-bold">AI&#xC758; &#xD589;&#xB3D9; &#xBCC0;&#xD654;</th></tr></thead><tbody><tr><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top">&#xB3C4;&#xAD6C;&#xAC00; &#xC874;&#xC7AC;&#xD558;&#xC9C0; &#xC54A;&#xC74C;</td><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top">&quot;&#xC774; &#xB3C4;&#xAD6C;&#xB294; &#xC0AC;&#xC6A9; &#xBD88;&#xAC00;, &#xB2E4;&#xB978; &#xC811;&#xADFC;&#xC744; &#xCC3E;&#xC544;&#xB77C;&quot;</td><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top">&#xC7AC;&#xC2DC;&#xB3C4; &#xAE08;&#xC9C0;, &#xB300;&#xC548; &#xD0D0;&#xC0C9;</td></tr><tr><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top">&#xAD8C;&#xD55C; &#xC5C6;&#xC74C;</td><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top">&quot;&#xAD8C;&#xD55C; &#xBD80;&#xC871;, &#xC0AC;&#xC6A9;&#xC790;&#xC5D0;&#xAC8C; &#xC54C;&#xB824;&#xB77C;&quot;</td><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top">&#xC7AC;&#xC2DC;&#xB3C4; &#xAE08;&#xC9C0;, &#xC0AC;&#xC6A9;&#xC790; &#xC548;&#xB0B4;</td></tr><tr><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top">&#xD0C0;&#xC784;&#xC544;&#xC6C3;</td><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top">&quot;&#xC2DC;&#xAC04; &#xCD08;&#xACFC;, &#xD30C;&#xB77C;&#xBBF8;&#xD130; &#xB2E8;&#xC21C;&#xD654; &#xD6C4; 1&#xD68C;&#xB9CC; &#xC7AC;&#xC2DC;&#xB3C4;&quot;</td><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top">&#xD30C;&#xB77C;&#xBBF8;&#xD130; &#xC218;&#xC815; &#xD6C4; 1&#xD68C; &#xC7AC;&#xC2DC;&#xB3C4;</td></tr><tr><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top">&#xC798;&#xBABB;&#xB41C; &#xC785;&#xB825;</td><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top">&quot;&#xC785;&#xB825;&#xAC12; &#xC624;&#xB958;, &#xD30C;&#xB77C;&#xBBF8;&#xD130;&#xB97C; &#xC218;&#xC815;&#xD574;&#xC11C; &#xC7AC;&#xC2DC;&#xB3C4;&quot;</td><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top">&#xD30C;&#xB77C;&#xBBF8;&#xD130; &#xC218;&#xC815; &#xD6C4; &#xC7AC;&#xC2DC;&#xB3C4;</td></tr></tbody></table>
<!--kg-card-end: html-->
<p>&#xC989;, &#xC5D0;&#xB7EC; &#xBA54;&#xC2DC;&#xC9C0;&#xB294; &#xB85C;&#xADF8;&#xAC00; &#xC544;&#xB2C8;&#xB77C;&#xA0;<strong>&#xC81C;&#xC5B4; &#xC2E0;&#xD638;</strong>&#xC5D0; &#xAC00;&#xAE4C;&#xC6E0;&#xC2B5;&#xB2C8;&#xB2E4;.</p><p>&#xC774; &#xD53C;&#xB4DC;&#xBC31; &#xB8E8;&#xD504;&#xAC00; &#xD575;&#xC2EC;&#xC774;&#xC5C8;&#xC2B5;&#xB2C8;&#xB2E4;. &#xC0AC;&#xB78C;&#xC774; &#xAC1C;&#xC785;&#xD558;&#xC9C0; &#xC54A;&#xC544;&#xB3C4;, AI&#xAC00; &#xC2E4;&#xD328;&#xB97C; &#xC778;&#xC2DD;&#xD558;&#xACE0; &#xC2A4;&#xC2A4;&#xB85C; &#xC804;&#xB7B5;&#xC744; &#xBC14;&#xAFD4;&#xC11C; &#xD574;&#xACB0;&#xD558;&#xB294; &#xAD6C;&#xC870;. &#xC5D0;&#xB7EC; &#xBA54;&#xC2DC;&#xC9C0;&#xB97C; &#xC798; &#xC124;&#xACC4;&#xD558;&#xB294; &#xAC83;&#xB9CC;&#xC73C;&#xB85C;, AI&#xC758; &#xBCF5;&#xAD6C; &#xB2A5;&#xB825;&#xC774; &#xADFC;&#xBCF8;&#xC801;&#xC73C;&#xB85C; &#xB2EC;&#xB77C;&#xC84C;&#xC2B5;&#xB2C8;&#xB2E4;.</p><p>&#xC774; &#xBAA8;&#xB4E0; &#xD53C;&#xB4DC;&#xBC31;&#xC740; &#xC0AC;&#xC6A9;&#xC790;&#xC5D0;&#xAC8C;&#xB294; &#xBCF4;&#xC774;&#xC9C0; &#xC54A;&#xB294; &#xB0B4;&#xBD80; &#xCC44;&#xB110;&#xB85C; &#xC804;&#xB2EC;&#xB429;&#xB2C8;&#xB2E4;.</p><hr><h3 id="%EC%9D%B4%EA%B2%8C-%EC%9A%B0%EB%A6%AC%EB%A7%8C%EC%9D%98-%EB%AC%B8%EC%A0%9C%EA%B0%80-%EC%95%84%EB%8B%88%EC%97%88%EB%8B%A4">&#xC774;&#xAC8C; &#xC6B0;&#xB9AC;&#xB9CC;&#xC758; &#xBB38;&#xC81C;&#xAC00; &#xC544;&#xB2C8;&#xC5C8;&#xB2E4;</h3><p>&#xCC3E;&#xC544;&#xBCF4;&#xB2C8; AI &#xC5C5;&#xACC4; &#xC804;&#xCCB4;&#xAC00; &#xAC19;&#xC740; &#xBB38;&#xC81C;&#xB97C; &#xACAA;&#xACE0; &#xC788;&#xC5C8;&#xC2B5;&#xB2C8;&#xB2E4;.</p><h4 id="langgraph-2025"><strong>LangGraph (2025)</strong></h4><p>LangGraph(LangChain&#xC758; &#xC5D0;&#xC774;&#xC804;&#xD2B8; &#xD504;&#xB808;&#xC784;&#xC6CC;&#xD06C;)&#xB294; langgraph-prebuilt v1.0.1&#xC5D0;&#xC11C; &#xB3C4;&#xAD6C; &#xC5D0;&#xB7EC; &#xCC98;&#xB9AC; &#xAE30;&#xBCF8;&#xAC12;&#xC744; &quot;&#xC790;&#xB3D9; &#xD65C;&#xC131;&#xD654;&quot;&#xC5D0;&#xC11C; &quot;&#xBE44;&#xD65C;&#xC131;&#xD654;&quot;&#xB85C; &#xBCC0;&#xACBD;&#xD588;&#xC2B5;&#xB2C8;&#xB2E4;. &#xAE30;&#xC874; &#xB3D9;&#xC791;&#xC5D0; &#xC758;&#xC874;&#xD558;&#xB358; &#xADF8;&#xB798;&#xD504;&#xB4E4;&#xC774; &#xC608;&#xACE0; &#xC5C6;&#xC774; &#xAE68;&#xC9C0;&#xBA74;&#xC11C; &#xC774;&#xC288;&#xB85C; &#xBCF4;&#xACE0;&#xB410;&#xC2B5;&#xB2C8;&#xB2E4;. &#xC774;&#xAC74; &#xB2E8;&#xC21C; &#xBC84;&#xADF8;&#xB77C;&#xAE30;&#xBCF4;&#xB2E4;, &quot;&#xC5D0;&#xB7EC; &#xCC98;&#xB9AC;&#xB97C; &#xD504;&#xB808;&#xC784;&#xC6CC;&#xD06C;&#xAC00; &#xC5B4;&#xB514;&#xAE4C;&#xC9C0; &#xAE30;&#xBCF8; &#xC81C;&#xACF5;&#xD574;&#xC57C; &#xD558;&#xB290;&#xB0D0;&quot;&#xB294; &#xC9C8;&#xBB38;&#xC744; &#xB4DC;&#xB7EC;&#xB0B8; &#xC0AC;&#xB840;&#xB85C; &#xBCF4;&#xC600;&#xC2B5;&#xB2C8;&#xB2E4;.</p><h4 id="openai-anthropic"><strong>OpenAI / Anthropic</strong></h4><p>OpenAI&#xC640; Anthropic&#xB3C4; &#xB3C4;&#xAD6C; &#xD638;&#xCD9C; &#xC790;&#xCCB4;&#xB294; &#xC9C0;&#xC6D0;&#xD569;&#xB2C8;&#xB2E4;. OpenAI &#xACF5;&#xC2DD; &#xBB38;&#xC11C;&#xB294; function calling&#xC744; &quot;&#xC560;&#xD50C;&#xB9AC;&#xCF00;&#xC774;&#xC158;&#xC774; &#xC678;&#xBD80; &#xC2DC;&#xC2A4;&#xD15C;&#xACFC; &#xC5F0;&#xACB0;&#xD574; &#xC2E4;&#xD589;&#xD558;&#xB294; &#xD750;&#xB984;&quot;&#xC73C;&#xB85C; &#xC124;&#xBA85;&#xD558;&#xACE0; &#xC788;&#xACE0;, Anthropic &#xACF5;&#xC2DD; &#xBB38;&#xC11C;&#xB3C4; Claude&#xAC00; tool_use&#xB97C; &#xB0B4;&#xBCF4;&#xB0B4;&#xBA74; &#xAC1C;&#xBC1C;&#xC790;&#xAC00; &#xB3C4;&#xAD6C;&#xB97C; &#xC2E4;&#xD589;&#xD55C; &#xB4A4; tool_result&#xB97C; &#xB2E4;&#xC2DC; &#xB3CC;&#xB824;&#xC8FC;&#xB294; &#xAD6C;&#xC870;&#xB97C; &#xC804;&#xC81C;&#xB85C; &#xD569;&#xB2C8;&#xB2E4;. Anthropic&#xC740; is_error &#xAC19;&#xC740; &#xAE30;&#xBCF8; &#xC5D0;&#xB7EC; &#xC2DC;&#xADF8;&#xB110;&#xB3C4; &#xC81C;&#xACF5;&#xD558;&#xC9C0;&#xB9CC;, &#xC7AC;&#xC2DC;&#xB3C4; &#xC815;&#xCC45;, &#xB3C4;&#xAD6C; &#xD3F4;&#xBC31;, &#xD0C0;&#xC784;&#xC544;&#xC6C3; &#xC81C;&#xC5B4;, &#xC0C1;&#xD0DC; &#xBCF5;&#xAD6C; &#xAC19;&#xC740; &#xC6CC;&#xD06C;&#xD50C;&#xB85C; &#xC218;&#xC900;&#xC758; &#xC548;&#xC804;&#xC7A5;&#xCE58;&#xAE4C;&#xC9C0; &#xC790;&#xB3D9;&#xC73C;&#xB85C; &#xD574;&#xACB0;&#xD574;&#xC8FC;&#xB294; &#xAC83;&#xC740; &#xC544;&#xB2D9;&#xB2C8;&#xB2E4;. &#xACB0;&#xAD6D; &#xC774; &#xBD80;&#xBD84;&#xC740; &#xC560;&#xD50C;&#xB9AC;&#xCF00;&#xC774;&#xC158;&#xC774;&#xB098; &#xC5D0;&#xC774;&#xC804;&#xD2B8; &#xD504;&#xB808;&#xC784;&#xC6CC;&#xD06C;&#xAC00; &#xC9C1;&#xC811; &#xC124;&#xACC4;&#xD574;&#xC57C; &#xD558;&#xB294; &#xC601;&#xC5ED;&#xC5D0; &#xAC00;&#xAE5D;&#xC2B5;&#xB2C8;&#xB2E4;.</p><h4 id="mcp-2026-%EB%A1%9C%EB%93%9C%EB%A7%B5"><strong>MCP 2026 &#xB85C;&#xB4DC;&#xB9F5;</strong></h4><p>MCP(Model Context Protocol) 2026 &#xACF5;&#xC2DD; &#xB85C;&#xB4DC;&#xB9F5;&#xC5D0;&#xC11C;&#xB294; Tasks primitive&#xB97C; &#xC2E4;&#xC81C; &#xD504;&#xB85C;&#xB355;&#xC158;&#xC5D0;&#xC11C; &#xC6B4;&#xC601;&#xD55C; &#xB4A4;, retry semantics&#xC640; expiry policies&#xB97C; &#xACF5;&#xC2DD;&#xC801;&#xC73C;&#xB85C; &#xC815;&#xB9AC;&#xD574;&#xC57C; &#xD560; &#xACFC;&#xC81C;&#xB85C; &#xC801;&#xACE0; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;. &#xD504;&#xB85C;&#xD1A0;&#xCF5C; &#xCC28;&#xC6D0;&#xC5D0;&#xC11C;&#xB3C4; &quot;&#xC2E4;&#xD328; &#xC2DC; &#xB204;&#xAC00; &#xC7AC;&#xC2DC;&#xB3C4;&#xD558;&#xB294;&#xAC00;&quot;&#xC640; &quot;&#xACB0;&#xACFC;&#xB97C; &#xC5BC;&#xB9C8;&#xB098; &#xBCF4;&#xC874;&#xD558;&#xB294;&#xAC00;&quot;&#xAC00; &#xC911;&#xC694;&#xD55C; &#xC6B4;&#xC601; &#xC774;&#xC288;&#xB85C; &#xC778;&#xC2DD;&#xB418;&#xACE0; &#xC788;&#xB2E4;&#xB294; &#xC2E0;&#xD638;&#xC785;&#xB2C8;&#xB2E4;.</p><h4 id="shielda-arxiv-250807935-2025"><strong>SHIELDA (arXiv 2508.07935, 2025)</strong></h4><p>SHIELDA&#xB294; LLM &#xC5D0;&#xC774;&#xC804;&#xD2B8; &#xC6CC;&#xD06C;&#xD50C;&#xB85C;&#xC6B0;&#xC758; &#xC608;&#xC678; &#xCC98;&#xB9AC;&#xB9CC;&#xC744; &#xBCC4;&#xB3C4; &#xC8FC;&#xC81C;&#xB85C; &#xB2E4;&#xB8E8;&#xBA70;, 12&#xAC1C; &#xC5D0;&#xC774;&#xC804;&#xD2B8; &#xC544;&#xD2F0;&#xD329;&#xD2B8;&#xC5D0; &#xAC78;&#xCE5C; 36&#xAC1C; &#xC608;&#xC678; &#xC720;&#xD615; taxonomy&#xB97C; &#xC81C;&#xC2DC;&#xD569;&#xB2C8;&#xB2E4;. &#xC911;&#xC694;&#xD55C; &#xC810;&#xC740;, &#xC2E4;&#xD589; &#xB2E8;&#xACC4;&#xC5D0;&#xC11C; &#xD130;&#xC9C4; &#xC608;&#xC678;&#xB97C; &#xADF8; &#xC774;&#xC804; &#xB2E8;&#xACC4;&#xC758; &#xC6D0;&#xC778;&#xACFC; &#xC5F0;&#xACB0;&#xD574; &#xBCF5;&#xAD6C;&#xD558;&#xB824;&#xB294; &#xAD00;&#xC810;&#xC744; &#xC804;&#xBA74;&#xC5D0; &#xB454;&#xB2E4;&#xB294; &#xAC83;&#xC785;&#xB2C8;&#xB2E4;. &quot;&#xC608;&#xC678; &#xCC98;&#xB9AC;&#xB97C; &#xC5D0;&#xC774;&#xC804;&#xD2B8; &#xC6B4;&#xC601;&#xC758; &#xC911;&#xC2EC; &#xBB38;&#xC81C;&#xB85C; &#xBCF8;&#xB2E4;&quot;&#xB294; &#xC810;&#xC774; &#xBD84;&#xBA85;&#xD569;&#xB2C8;&#xB2E4;.</p><p>&#xC800;&#xD76C;&#xAC00; &#xB0B4;&#xBD80; &#xD14C;&#xC2A4;&#xD2B8;&#xC5D0;&#xC11C; &#xBD80;&#xB52A;&#xD788;&#xBA70; &#xB9CC;&#xB4E0; &#xD574;&#xACB0;&#xCC45;&#xC774; &#xC5C5;&#xACC4;&#xAC00; &#xD5A5;&#xD558;&#xB294; &#xBC29;&#xD5A5;&#xACFC; &#xC815;&#xD655;&#xD788; &#xAC19;&#xC740; &#xB9E5;&#xB77D;&#xC774;&#xC5C8;&#xC2B5;&#xB2C8;&#xB2E4;.</p><hr><h3 id="%EC%96%BB%EC%9D%80-%EA%B5%90%ED%9B%88">&#xC5BB;&#xC740; &#xAD50;&#xD6C8;</h3><p>&#xACB0;&#xAD6D; &#xC800;&#xD76C;&#xAC00; &#xD504;&#xB85C;&#xB355;&#xC158;&#xC5D0; &#xC55E;&#xC11C; &#xBD99;&#xC778; &#xC7A5;&#xCE58;&#xB4E4;&#x2014;circuit breaker, dedup cache, timeout, error classification&#x2014;&#xC740; &#xACFC;&#xD55C; &#xC5D4;&#xC9C0;&#xB2C8;&#xC5B4;&#xB9C1;&#xC774; &#xC544;&#xB2C8;&#xC5C8;&#xC2B5;&#xB2C8;&#xB2E4;. &#xC624;&#xD788;&#xB824; &#xC9C0;&#xAE08;&#xC758; &#xC5D0;&#xC774;&#xC804;&#xD2B8; &#xC0DD;&#xD0DC;&#xACC4;&#xC5D0;&#xC11C;&#xB294; &#xC6D0;&#xB798; &#xC560;&#xD50C;&#xB9AC;&#xCF00;&#xC774;&#xC158;&#xC774; &#xCC45;&#xC784;&#xC838;&#xC57C; &#xD558;&#xB294; &#xAE30;&#xBCF8; &#xC6B4;&#xC601; &#xC7A5;&#xCE58;&#xC5D0; &#xAC00;&#xAE4C;&#xC6E0;&#xC2B5;&#xB2C8;&#xB2E4;.</p><p>&#xC774; &#xACBD;&#xD5D8;&#xC744; &#xD1B5;&#xD574; &#xC5BB;&#xC740; &#xAD50;&#xD6C8;&#xC740; &#xB2E8;&#xC21C;&#xD569;&#xB2C8;&#xB2E4;.</p><ul><li>&#xB3C4;&#xAD6C;&#xB294; &#xC2E4;&#xD328;&#xD569;&#xB2C8;&#xB2E4;</li><li>AI&#xB294; &#xAC19;&#xC740; &#xC2E4;&#xC218;&#xB97C; &#xBC18;&#xBCF5;&#xD569;&#xB2C8;&#xB2E4;</li><li>&#xC5D0;&#xB7EC;&#xB97C; &#xBD84;&#xB958;&#xD558;&#xACE0; &#xC81C;&#xC5B4; &#xC2E0;&#xD638;&#xB85C; &#xC804;&#xB2EC;&#xD558;&#xBA74;, AI&#xAC00; &#xC2A4;&#xC2A4;&#xB85C; &#xBCF5;&#xAD6C;&#xD569;&#xB2C8;&#xB2E4;</li><li>&#xADF8; &#xC2E4;&#xD328;&#xB97C; &#xC5B4;&#xB5BB;&#xAC8C; &#xCC98;&#xB9AC;&#xD558;&#xB290;&#xB0D0;&#xAC00; &#xC0AC;&#xC6A9;&#xC790; &#xACBD;&#xD5D8;&#xC744; &#xACB0;&#xC815;&#xD569;&#xB2C8;&#xB2E4;</li></ul><p>&#xD504;&#xB85C;&#xB355;&#xC158; &#xC5D0;&#xC774;&#xC804;&#xD2B8;&#xC758; &#xC9C4;&#xC9DC; &#xC2E4;&#xB825;&#xC740; &quot;&#xC5BC;&#xB9C8;&#xB098; &#xB611;&#xB611;&#xD55C;&#xAC00;&quot;&#xBCF4;&#xB2E4; &quot;&#xC2E4;&#xD328;&#xD588;&#xC744; &#xB54C; AI&#xAC00; &#xC2A4;&#xC2A4;&#xB85C; &#xC5BC;&#xB9C8;&#xB098; &#xC548;&#xC804;&#xD558;&#xAC8C; &#xBCF5;&#xAD6C;&#xD558;&#xB294;&#xAC00;&quot;&#xC5D0; &#xB354; &#xAC00;&#xAE5D;&#xB2E4;&#xACE0; &#xC0DD;&#xAC01;&#xD558;&#xAC8C; &#xB410;&#xC2B5;&#xB2C8;&#xB2E4;.</p><p>&#xC88B;&#xC740; &#xC5D0;&#xC774;&#xC804;&#xD2B8;&#xB294; &#xB2F5;&#xC744; &#xC798; &#xB0B4;&#xB294; &#xC5D0;&#xC774;&#xC804;&#xD2B8;&#xC774;&#xAE30;&#xB3C4; &#xD558;&#xC9C0;&#xB9CC;, &#xADF8;&#xBCF4;&#xB2E4; &#xBA3C;&#xC800; &#xC2E4;&#xD328;&#xB97C; &#xB4DC;&#xB7EC;&#xB0B4;&#xACE0;, &#xBD84;&#xB958;&#xD558;&#xACE0;, &#xC2A4;&#xC2A4;&#xB85C; &#xBCF5;&#xAD6C;&#xD560; &#xC218; &#xC788;&#xB294; &#xC5D0;&#xC774;&#xC804;&#xD2B8;&#xC5EC;&#xC57C; &#xD569;&#xB2C8;&#xB2E4;.</p>]]></content:encoded></item><item><title><![CDATA[AI 시대의 진짜 해자는 기술이 아닙니다]]></title><description><![CDATA[<p>&#xAE30;&#xC220;&#xB85C; &#xC774;&#xAE30;&#xB824; &#xD558;&#xC9C0; &#xB9C8;&#xC138;&#xC694;. &#xC9C0;&#xAE08;&#xC758; &#xAE30;&#xC220; &#xC6B0;&#xC704;&#xB294; &#xC0DD;&#xAC01;&#xBCF4;&#xB2E4; &#xBE60;&#xB974;&#xAC8C; &#xD3C9;&#xC900;&#xD654;&#xB429;&#xB2C8;&#xB2E4;.</p><p>&#xC9C0;&#xAE08;&#xC740; &#xAD6C;&#xAE00;, MS, OpenAI &#xAC19;&#xC740; &#xBE45;&#xD14C;&#xD06C;&#xAC00; &#xAE30;&#xB2A5; &#xD558;&#xB098;&#xB9CC;</p>]]></description><link>https://keun.me/ai-tech-moat/</link><guid isPermaLink="false">69b6691e422fb1000117bd05</guid><category><![CDATA[Review]]></category><dc:creator><![CDATA[Keun.R]]></dc:creator><pubDate>Sun, 15 Mar 2026 08:51:28 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1510519138101-570d1dca3d66?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDI0fHx0ZWNofGVufDB8fHx8MTc3MzU2NDYyNnww&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=2000" medium="image"/><content:encoded><![CDATA[<img src="https://images.unsplash.com/photo-1510519138101-570d1dca3d66?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDI0fHx0ZWNofGVufDB8fHx8MTc3MzU2NDYyNnww&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=2000" alt="AI &#xC2DC;&#xB300;&#xC758; &#xC9C4;&#xC9DC; &#xD574;&#xC790;&#xB294; &#xAE30;&#xC220;&#xC774; &#xC544;&#xB2D9;&#xB2C8;&#xB2E4;"><p>&#xAE30;&#xC220;&#xB85C; &#xC774;&#xAE30;&#xB824; &#xD558;&#xC9C0; &#xB9C8;&#xC138;&#xC694;. &#xC9C0;&#xAE08;&#xC758; &#xAE30;&#xC220; &#xC6B0;&#xC704;&#xB294; &#xC0DD;&#xAC01;&#xBCF4;&#xB2E4; &#xBE60;&#xB974;&#xAC8C; &#xD3C9;&#xC900;&#xD654;&#xB429;&#xB2C8;&#xB2E4;.</p><p>&#xC9C0;&#xAE08;&#xC740; &#xAD6C;&#xAE00;, MS, OpenAI &#xAC19;&#xC740; &#xBE45;&#xD14C;&#xD06C;&#xAC00; &#xAE30;&#xB2A5; &#xD558;&#xB098;&#xB9CC; &#xCD9C;&#xC2DC;&#xD574;&#xB3C4; &#xC2A4;&#xD0C0;&#xD2B8;&#xC5C5; &#xC218;&#xCC9C; &#xAC1C;&#xC758; &#xAC00;&#xCE58; &#xC81C;&#xC548;&#xC774; &#xD754;&#xB4E4;&#xB9AC;&#xB294; &#xC2DC;&#xB300;&#xC785;&#xB2C8;&#xB2E4;. &#xC18C;&#xC704; &#x2018;&#xBC14;&#xC774;&#xBE0C; &#xCF54;&#xB529;&#x2019;&#xC774;&#xB77C; &#xBD88;&#xB9AC;&#xB294; &#xD750;&#xB984; &#xC18D;&#xC5D0;&#xC11C;, &#xBE44;&#xAC1C;&#xBC1C;&#xC790;&#xB3C4; AI&#xB97C; &#xD65C;&#xC6A9;&#xD574; &#xC571;&#xC744; &#xBE60;&#xB974;&#xAC8C; &#xB9CC;&#xB4E4;&#xACE0; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;. &#xAE30;&#xC220;&#xC758; &#xC9C4;&#xC785;&#xC7A5;&#xBCBD;&#xC740; &#xC6B0;&#xB9AC;&#xAC00; &#xC0DD;&#xAC01;&#xD558;&#xB294; &#xAC83;&#xBCF4;&#xB2E4; &#xD6E8;&#xC52C; &#xBE60;&#xB974;&#xAC8C; &#xB0AE;&#xC544;&#xC9C0;&#xACE0; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.</p><p>&#xC774;&#xAC74; 2~3&#xB144; &#xB4A4;&#xC758; &#xBBF8;&#xB798;&#xAC00; &#xC544;&#xB2D9;&#xB2C8;&#xB2E4;. &#xC774;&#xBBF8; &#xBC8C;&#xC5B4;&#xC9C0;&#xACE0; &#xC788;&#xB294; &#xD604;&#xC2E4;&#xC785;&#xB2C8;&#xB2E4;.</p><p>&#xADF8;&#xB807;&#xB2E4;&#xBA74; &#xAE30;&#xC220;&#xC774; &#xC0C1;&#xD5A5; &#xD3C9;&#xC900;&#xD654;&#xB418;&#xB294; &#xC2DC;&#xB300;&#xC5D0;, &#xC9C4;&#xC9DC; &#xD574;&#xC790;&#xB294; &#xBB34;&#xC5C7;&#xC77C;&#xAE4C;&#xC694;?</p><p>&#xC800;&#xB294; &#xADF8; &#xB2F5;&#xC774; &#xACE0;&#xAC1D;&#xC758; &#xBB38;&#xC81C;&#xB97C; &#xC5BC;&#xB9C8;&#xB098; &#xAE4A;&#xAC8C; &#xC815;&#xC758;&#xD558;&#xB290;&#xB0D0;, &#xADF8;&#xB9AC;&#xACE0; &#xADF8; &#xBB38;&#xC81C; &#xC704;&#xC5D0; &#xCD95;&#xC801;&#xB41C; &#xB370;&#xC774;&#xD130;&#xC640; &#xC2E0;&#xB8B0;&#xC5D0; &#xC788;&#xB2E4;&#xACE0; &#xC0DD;&#xAC01;&#xD569;&#xB2C8;&#xB2E4;.</p><p>AI&#xAC00; &#xBC1C;&#xC804;&#xD560;&#xC218;&#xB85D; &#xCF54;&#xB4DC;&#xB97C; &#xC9DC;&#xACE0;, &#xBD84;&#xC11D;&#xD558;&#xACE0;, &#xB9AC;&#xD3EC;&#xD2B8;&#xB97C; &#xB9CC;&#xB4DC;&#xB294; &#xC2E4;&#xD589;&#xC758; &#xB9CE;&#xC740; &#xBD80;&#xBD84;&#xC740; AI&#xC758; &#xBAAB;&#xC774; &#xB429;&#xB2C8;&#xB2E4;. &#xC778;&#xAC04;&#xACFC; &#xAE30;&#xC5C5;&#xC758; &#xC5ED;&#xD560;&#xC740; &#xC810;&#xC810; &#xC624;&#xCF00;&#xC2A4;&#xD2B8;&#xB808;&#xC774;&#xD130;&#xC5D0; &#xAC00;&#xAE4C;&#xC6CC;&#xC9D1;&#xB2C8;&#xB2E4;.<br>&#xBB34;&#xC5C7;&#xC744; &#xD574;&#xACB0;&#xD574;&#xC57C; &#xD558;&#xB294;&#xC9C0; &#xC815;&#xC758;&#xD558;&#xACE0;, AI&#xAC00; &#xC62C;&#xBC14;&#xB978; &#xBC29;&#xD5A5;&#xC73C;&#xB85C; &#xC77C;&#xD558;&#xB3C4;&#xB85D; &#xC124;&#xACC4;&#xD558;&#xB294; &#xB2A5;&#xB825;&#xC774; &#xD575;&#xC2EC; &#xACBD;&#xC7C1;&#xB825;&#xC774; &#xB418;&#xB294; &#xAC83;&#xC785;&#xB2C8;&#xB2E4;.</p><p>&#xACB0;&#xAD6D; &#xC0B4;&#xC544;&#xB0A8;&#xB294; &#xAE30;&#xC5C5;&#xC740; &#xAC89;&#xC73C;&#xB85C; &#xD654;&#xB824;&#xD55C; &#xAE30;&#xC220;&#xC744; &#xBCF4;&#xC5EC;&#xC8FC;&#xB294; &#xAE30;&#xC5C5;&#xC774; &#xC544;&#xB2C8;&#xB77C;, &#xACE0;&#xAC1D;&#xC758; &#xD398;&#xC778; &#xD3EC;&#xC778;&#xD2B8;&#xB97C; &#xC9D1;&#xC694;&#xD558;&#xAC8C; &#xD30C;&#xACE0;&#xB4DC;&#xB294; &#xAE30;&#xC5C5;&#xC785;&#xB2C8;&#xB2E4;.</p><p>&#xBC14;&#xD2F0;CIS&#xAC00; &#xC8FC;&#xBAA9;&#xD558;&#xB294; &#xD574;&#xC790;&#xB3C4; &#xBD84;&#xBA85;&#xD569;&#xB2C8;&#xB2E4;.<br>&#x2022; COSRX&#xC758; 42&#xAC1C; &#xAE00;&#xB85C;&#xBC8C; &#xB9C8;&#xCF13;&#xD50C;&#xB808;&#xC774;&#xC2A4; &#xAC70;&#xB798; &#xB370;&#xC774;&#xD130;<br>&#x2022; &#xB9AC;&#xC96C;&#xB780;&#xC758; &#xAE00;&#xB85C;&#xBC8C; &#xCEE4;&#xBA38;&#xC2A4; &#xB370;&#xC774;&#xD130;</p><p>&#xC774;&#xB7F0; &#xB3C4;&#xBA54;&#xC778; &#xD2B9;&#xD654; &#xB370;&#xC774;&#xD130;&#xB294; &#xBC94;&#xC6A9; AI&#xB9CC;&#xC73C;&#xB85C;&#xB294; &#xD655;&#xBCF4;&#xD558;&#xAC70;&#xB098; &#xBCF5;&#xC81C;&#xD558;&#xAE30; &#xC5B4;&#xB824;&#xC6B4; &#xC790;&#xC0B0;&#xC785;&#xB2C8;&#xB2E4;. &#xB2E8;&#xC9C0; &#xBCF4;&#xC548;&#xC758; &#xBB38;&#xC81C;&#xAC00; &#xC544;&#xB2C8;&#xB77C;, &#xBE44;&#xC988;&#xB2C8;&#xC2A4; &#xAD6C;&#xC870; &#xC790;&#xCCB4;&#xAC00; &#xC27D;&#xAC8C; &#xD5C8;&#xC6A9;&#xD558;&#xC9C0; &#xC54A;&#xAE30; &#xB54C;&#xBB38;&#xC785;&#xB2C8;&#xB2E4;. &#xAE30;&#xC220;&#xC740; &#xACC4;&#xC18D; &#xBC14;&#xB00C;&#xC9C0;&#xB9CC;, &#xD2B9;&#xC815; &#xB3C4;&#xBA54;&#xC778;&#xC758; &#xAE4A;&#xC774;&#xC640; &#xADF8; &#xC704;&#xC5D0; &#xC313;&#xC778; &#xB370;&#xC774;&#xD130;&#xC640; &#xC2E0;&#xB8B0;&#xB294; &#xC2DC;&#xAC04;&#xC774; &#xAC08;&#xC218;&#xB85D; &#xB354; &#xAC15;&#xD55C; &#xD574;&#xC790;&#xAC00; &#xB429;&#xB2C8;&#xB2E4;.</p><p>&#xC9C0;&#xAE08;&#xC740; &#x2018;&#xAE30;&#xC220; &#xACBD;&#xC7C1;&#x2019;&#xC758; &#xC2DC;&#xAC04;&#xC774; &#xC544;&#xB2C8;&#xB77C;, &#x2018;&#xBB38;&#xC81C; &#xC815;&#xC758;&#x2019;&#xC758; &#xACE8;&#xB4E0;&#xD0C0;&#xC784;&#xC785;&#xB2C8;&#xB2E4;.<br>&#xC774; &#xAE30;&#xD68C;&#xC758; &#xCC3D;&#xC740; &#xAE38;&#xC5B4;&#xC57C; 1~2&#xB144;&#xC774;&#xB77C;&#xACE0; &#xC0DD;&#xAC01;&#xD569;&#xB2C8;&#xB2E4;.</p><p>&#xAE30;&#xC220;&#xC744; &#xC9C1;&#xC811; &#xAD6C;&#xD604;&#xD558;&#xB294; &#xB2A5;&#xB825;&#xBCF4;&#xB2E4;, &#xACE0;&#xAC1D;&#xC758; &#xBB38;&#xC81C;&#xB97C; &#xC815;&#xD655;&#xD788; &#xC815;&#xC758;&#xD558;&#xACE0; AI&#xB97C; &#xB3D9;&#xB8CC;&#xCC98;&#xB7FC; &#xD65C;&#xC6A9;&#xD574; &#xD574;&#xACB0;&#xCC45;&#xC744; &#xC124;&#xACC4;&#xD558;&#xB294; &#xD300;&#xC774; &#xACB0;&#xAD6D; &#xC774;&#xAE38; &#xAC83;&#xC785;&#xB2C8;&#xB2E4;.</p><p>&#xC5EC;&#xB7EC;&#xBD84;&#xC758; &#xD300;&#xC740; &#xC9C0;&#xAE08; &#xBB34;&#xC5C7;&#xC744; &#xD574;&#xC790;&#xB85C; &#xC313;&#xACE0; &#xC788;&#xB098;&#xC694;?</p>]]></content:encoded></item><item><title><![CDATA[AI 시대의 승자: 기술 자본주의 관점에서 본 B2B 플랫폼 전략]]></title><description><![CDATA[<h2 id="ai-%EC%8B%9C%EB%8C%80-%EC%9E%90%EB%B3%B8%EC%9D%98-%ED%9D%90%EB%A6%84-%EB%8F%88%EC%9D%80-%EC%96%B4%EB%94%94%EB%A1%9C-%EA%B0%80%EA%B3%A0-%EC%9E%88%EB%82%98">AI &#xC2DC;&#xB300; &#xC790;&#xBCF8;&#xC758; &#xD750;&#xB984;: &#xB3C8;&#xC740; &#xC5B4;&#xB514;&#xB85C; &#xAC00;&#xACE0; &#xC788;&#xB098;</h2><p>2024-2025&#xB144; &#xAE00;&#xB85C;&#xBC8C; &#xC790;&#xBCF8; &#xD750;&#xB984;&#xC740; AI&#xB85C; &#xADF9;&#xC801;&#xC73C;&#xB85C; &#xC7AC;&#xD3B8;&#xB418;&#xACE0; &#xC788;&#xB2E4;. AI &#xC2A4;&#xD0C0;&#xD2B8;&#xC5C5;&#xC740;&#xA0;<strong>2024&#xB144; &#xC804;&#xCCB4;</strong></p>]]></description><link>https://keun.me/ai-history/</link><guid isPermaLink="false">69469861422fb1000117bcd2</guid><category><![CDATA[AI]]></category><dc:creator><![CDATA[Keun.R]]></dc:creator><pubDate>Sat, 20 Dec 2025 12:38:18 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1674027444485-cec3da58eef4?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDJ8fGFpfGVufDB8fHx8MTc2NjIzNDI2OHww&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=2000" medium="image"/><content:encoded><![CDATA[<h2 id="ai-%EC%8B%9C%EB%8C%80-%EC%9E%90%EB%B3%B8%EC%9D%98-%ED%9D%90%EB%A6%84-%EB%8F%88%EC%9D%80-%EC%96%B4%EB%94%94%EB%A1%9C-%EA%B0%80%EA%B3%A0-%EC%9E%88%EB%82%98">AI &#xC2DC;&#xB300; &#xC790;&#xBCF8;&#xC758; &#xD750;&#xB984;: &#xB3C8;&#xC740; &#xC5B4;&#xB514;&#xB85C; &#xAC00;&#xACE0; &#xC788;&#xB098;</h2><img src="https://images.unsplash.com/photo-1674027444485-cec3da58eef4?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDJ8fGFpfGVufDB8fHx8MTc2NjIzNDI2OHww&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=2000" alt="AI &#xC2DC;&#xB300;&#xC758; &#xC2B9;&#xC790;: &#xAE30;&#xC220; &#xC790;&#xBCF8;&#xC8FC;&#xC758; &#xAD00;&#xC810;&#xC5D0;&#xC11C; &#xBCF8; B2B &#xD50C;&#xB7AB;&#xD3FC; &#xC804;&#xB7B5;"><p>2024-2025&#xB144; &#xAE00;&#xB85C;&#xBC8C; &#xC790;&#xBCF8; &#xD750;&#xB984;&#xC740; AI&#xB85C; &#xADF9;&#xC801;&#xC73C;&#xB85C; &#xC7AC;&#xD3B8;&#xB418;&#xACE0; &#xC788;&#xB2E4;. AI &#xC2A4;&#xD0C0;&#xD2B8;&#xC5C5;&#xC740;&#xA0;<strong>2024&#xB144; &#xC804;&#xCCB4; VC &#xD380;&#xB529;&#xC758; 37%</strong>(&#xC57D; $1,000&#xC5B5;)&#xB97C; &#xD761;&#xC218;&#xD588;&#xACE0;,&#xA0;<a href="https://www.cbinsights.com/research/report/ai-trends-2024/?ref=keun.me">cbinsights</a>&#xA0;2025&#xB144; &#xC0C1;&#xBC18;&#xAE30;&#xC5D0;&#xB9CC;&#xA0;<strong>$1,160&#xC5B5;</strong>&#xC744; &#xAE30;&#xB85D;&#xD574; &#xC774;&#xBBF8; 2024&#xB144; &#xC804;&#xCCB4;&#xB97C; &#xCD08;&#xACFC;&#xD588;&#xB2E4;. Gartner&#xB294; 2025&#xB144; &#xAE00;&#xB85C;&#xBC8C; AI &#xC9C0;&#xCD9C;&#xC744;&#xA0;<strong>$1.5&#xC870;</strong>, 2026&#xB144;&#xC5D0;&#xB294;&#xA0;<strong>$2&#xC870;</strong>&#xA0;&#xC774;&#xC0C1;&#xC73C;&#xB85C; &#xC608;&#xCE21;&#xD55C;&#xB2E4;.</p><p>&#xC790;&#xBCF8;&#xC740; &#xADF9;&#xB2E8;&#xC801;&#xC73C;&#xB85C; &#xC9D1;&#xC911;&#xB418;&#xC5B4; &#xC788;&#xB2E4;. 2024&#xB144; AI &#xD380;&#xB529;&#xC758; **69%&#xAC00; &#xBA54;&#xAC00;&#xB77C;&#xC6B4;&#xB4DC;($1&#xC5B5; &#xC774;&#xC0C1;)**&#xC5D0;&#xC11C; &#xBC1C;&#xC0DD;&#xD588;&#xACE0;, $10&#xC5B5; &#xC774;&#xC0C1; &#xB77C;&#xC6B4;&#xB4DC;&#xAC00; 13&#xAC74;&#xC5D0; &#xB2EC;&#xD588;&#xB2E4;.&#xA0;<a href="https://www.cbinsights.com/research/report/ai-trends-2024/?ref=keun.me">cbinsights</a>&#xA0;Databricks($100&#xC5B5;, $620&#xC5B5; &#xBC38;&#xB958;&#xC5D0;&#xC774;&#xC158;), OpenAI($66&#xC5B5;, $1,570&#xC5B5;), xAI($60&#xC5B5;+), Anthropic($40&#xC5B5;+)&#xC774; &#xC790;&#xBCF8;&#xC744; &#xB3C5;&#xC2DD;&#xD558;&#xACE0; &#xC788;&#xB2E4;. &#xBBF8;&#xAD6D;&#xC774; &#xD380;&#xB529;&#xC758;&#xA0;<strong>76%</strong>, &#xB51C; &#xC218;&#xC758; **49%**&#xB97C; &#xCC28;&#xC9C0;&#xD558;&#xBA70;,&#xA0;<a href="https://www.cbinsights.com/research/report/ai-trends-2024/?ref=keun.me">cbinsights</a>&#xA0;&#xC720;&#xB7FD;(13%)&#xACFC; &#xC544;&#xC2DC;&#xC544;(10% &#xBBF8;&#xB9CC;)&#xB294; &#xD06C;&#xAC8C; &#xB4A4;&#xCC98;&#xC9C4;&#xB2E4;.</p><h3 id="ai-%EC%8A%A4%ED%83%9D%EB%B3%84-%ED%88%AC%EC%9E%90-%ED%98%84%ED%99%A9%EC%9D%B4-%EB%A7%90%ED%95%B4%EC%A3%BC%EB%8A%94-%EA%B2%83">AI &#xC2A4;&#xD0DD;&#xBCC4; &#xD22C;&#xC790; &#xD604;&#xD669;&#xC774; &#xB9D0;&#xD574;&#xC8FC;&#xB294; &#xAC83;</h3><p>&#xC5D4;&#xD130;&#xD504;&#xB77C;&#xC774;&#xC988; GenAI &#xC9C0;&#xCD9C;&#xA0;<strong>$370&#xC5B5;(2025&#xB144;)</strong>&#xA0;<a href="https://menlovc.com/perspective/2025-the-state-of-generative-ai-in-the-enterprise/?ref=keun.me">Menlo Ventures</a>&#xA0;&#xC911; &#xAC01; &#xB808;&#xC774;&#xC5B4;&#xBCC4; &#xD750;&#xB984;&#xC774; &#xC911;&#xC694;&#xD558;&#xB2E4;:</p>
<!--kg-card-begin: html-->
<table class="min-w-full border-collapse text-sm leading-[1.7] whitespace-normal"><thead class="text-left"><tr><th class="text-text-100 border-b-0.5 border-border-300/60 py-2 pr-4 align-top font-bold">AI &#xC2A4;&#xD0DD; &#xB808;&#xC774;&#xC5B4;</th><th class="text-text-100 border-b-0.5 border-border-300/60 py-2 pr-4 align-top font-bold">2024&#xB144;</th><th class="text-text-100 border-b-0.5 border-border-300/60 py-2 pr-4 align-top font-bold">2025&#xB144;</th><th class="text-text-100 border-b-0.5 border-border-300/60 py-2 pr-4 align-top font-bold">&#xC131;&#xC7A5;&#xB960;</th></tr></thead><tbody><tr><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top">&#xC560;&#xD50C;&#xB9AC;&#xCF00;&#xC774;&#xC158;</td><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top">$70&#xC5B5;</td><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top">$190&#xC5B5;</td><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top"><strong>2.7&#xBC30;</strong></td></tr><tr><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top">&#xC778;&#xD504;&#xB77C;(&#xD074;&#xB77C;&#xC6B0;&#xB4DC;/&#xCE69;)</td><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top">$92&#xC5B5;</td><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top">$180&#xC5B5;</td><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top">2.0&#xBC30;</td></tr><tr><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top">&#xD30C;&#xC6B4;&#xB370;&#xC774;&#xC158; &#xBAA8;&#xB378; API</td><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top">$50&#xC5B5;</td><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top">$125&#xC5B5;</td><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top">2.5&#xBC30;</td></tr></tbody></table>
<!--kg-card-end: html-->
<p><strong>&#xAC00;&#xC7A5; &#xBE60;&#xB974;&#xAC8C; &#xC131;&#xC7A5;&#xD558;&#xB294; &#xC601;&#xC5ED;&#xC740; &#xC560;&#xD50C;&#xB9AC;&#xCF00;&#xC774;&#xC158; &#xB808;&#xC774;&#xC5B4;</strong>&#xB2E4;. &#xD2B9;&#xD788; &#xCF54;&#xB529;/&#xC5D4;&#xC9C0;&#xB2C8;&#xC5B4;&#xB9C1; &#xB3C4;&#xAD6C;&#xAC00; &#xBD80;&#xC11C;&#xBCC4; AI &#xC9C0;&#xCD9C;&#xC758; **55%($40&#xC5B5;)**&#xB97C; &#xCC28;&#xC9C0;&#xD558;&#xBA70; &#xC555;&#xB3C4;&#xC801; 1&#xC704;&#xB2E4;.&#xA0;<a href="https://menlovc.com/perspective/2025-the-state-of-generative-ai-in-the-enterprise/?ref=keun.me">Menlo Ventures</a>&#xA0;&#xC218;&#xC9C1; AI &#xC194;&#xB8E8;&#xC158;($35&#xC5B5;)&#xC5D0;&#xC11C;&#xB294; &#xD5EC;&#xC2A4;&#xCF00;&#xC5B4;&#xAC00; **43%**&#xB85C; &#xC120;&#xB450;&#xB2E4;.&#xA0;<a href="https://menlovc.com/perspective/2025-the-state-of-generative-ai-in-the-enterprise/?ref=keun.me">Menlo Ventures</a>&#xA0;&#xC774;&#xAC83;&#xC774; &#xC758;&#xBBF8;&#xD558;&#xB294; &#xBC14;&#xB294; &#xBA85;&#xD655;&#xD558;&#xB2E4;&#x2014;&#xC778;&#xD504;&#xB77C;&#xB294; &#xC774;&#xBBF8; &#xB300;&#xAE30;&#xC5C5;&#xC774; &#xC7A5;&#xC545;&#xD588;&#xACE0;, &#xC9C4;&#xC9DC; &#xAE30;&#xD68C;&#xB294; &#xD2B9;&#xC815; &#xC0B0;&#xC5C5;&#xACFC; &#xC6CC;&#xD06C;&#xD50C;&#xB85C;&#xB97C; &#xAE4A;&#xAC8C; &#xD30C;&#xACE0;&#xB4DC;&#xB294;&#xA0;<strong>&#xC218;&#xC9C1; &#xC560;&#xD50C;&#xB9AC;&#xCF00;&#xC774;&#xC158;</strong>&#xC5D0; &#xC788;&#xB2E4;.</p><h3 id="%EC%A0%95%EB%B6%80-%EC%9E%90%EA%B8%88-%EA%B7%9C%EC%A0%9C-%EC%9E%A5%EB%B2%BD%EC%9D%B4-%EA%B3%A7-%ED%95%B4%EC%9E%90%EA%B0%80-%EB%90%9C%EB%8B%A4">&#xC815;&#xBD80; &#xC790;&#xAE08;: &#xADDC;&#xC81C; &#xC7A5;&#xBCBD;&#xC774; &#xACE7; &#xD574;&#xC790;&#xAC00; &#xB41C;&#xB2E4;</h3><p>&#xC815;&#xBD80; AI &#xC815;&#xCC45; &#xC790;&#xAE08;&#xC740; &#xC804;&#xB840; &#xC5C6;&#xB294; &#xADDC;&#xBAA8;&#xB85C; &#xC9D1;&#xD589; &#xC911;&#xC774;&#xB2E4;:</p><ul><li><strong>&#xBBF8;&#xAD6D;</strong>: CHIPS Act&#xA0;<strong>$2,800&#xC5B5;</strong>&#xA0;(&#xBC18;&#xB3C4;&#xCCB4; $520&#xC5B5;, AI/R&amp;D $2,000&#xC5B5;+), Intel $78&#xC5B5;, TSMC $66&#xC5B5; &#xC218;&#xB839;</li><li><strong>EU</strong>: InvestAI&#xA0;<strong>&#x20AC;2,000&#xC5B5;</strong>&#xA0;&#xB3D9;&#xC6D0; &#xBAA9;&#xD45C;, AI &#xACF5;&#xC7A5;&#xA0;<strong>&#x20AC;100&#xC5B5;</strong>&#xA0;&#xACF5;&#xB3D9; &#xD22C;&#xC790;, 13&#xAC1C; AI &#xD329;&#xD1A0;&#xB9AC; &#xC124;&#xB9BD;</li><li><strong>&#xC911;&#xAD6D;</strong>: 2030&#xB144;&#xAE4C;&#xC9C0;&#xA0;<strong>$1,500&#xC5B5;</strong>&#xA0;AI &#xD380;&#xB529; &#xC57D;&#xC18D;, &#xAD6D;&#xAC00; AI &#xD380;&#xB4DC; $82&#xC5B5;</li><li><strong>&#xD55C;&#xAD6D;</strong>: &#xB514;&#xC9C0;&#xD138; &#xB274;&#xB51C;&#xA0;<strong>$535&#xC5B5;</strong>, &#xAE00;&#xB85C;&#xBC8C; AI &#xCE69; &#xACF5;&#xAE09;&#xC758;&#xA0;<strong>37%</strong>&#xA0;&#xC810;&#xC720;</li></ul><p><strong>&#xC804;&#xB7B5;&#xC801; &#xC2DC;&#xC0AC;&#xC810;</strong>: &#xC815;&#xBD80; &#xC870;&#xB2EC; &#xC2DC;&#xC7A5;&#xC740;&#xA0;<strong>FedRAMP 20x</strong>(2025&#xB144; &#xC2E0;&#xC124;)&#xB85C; &#xC9C4;&#xC785; &#xC7A5;&#xBCBD;&#xC774; &#xADF9;&#xC801;&#xC73C;&#xB85C; &#xB0AE;&#xC544;&#xC84C;&#xB2E4;.&#xA0;<a href="https://www.gsa.gov/about-us/newsroom/news-releases/gsa-fedramp-prioritize-20x-authorizations-for-ai-08252025?ref=keun.me">GSA</a>OpenAI&#xC640; Perplexity&#xAC00; &#xC774;&#xBBF8; &#xC6B0;&#xC120; &#xC778;&#xAC00;&#xB97C; &#xBC1B;&#xC558;&#xACE0;, GSA&#xAC00; Perplexity&#xC640; &#xC9C1;&#xC811; &#xACC4;&#xC57D;&#xC744; &#xCCB4;&#xACB0;&#xD588;&#xB2E4;.&#xA0;<a href="https://fedscoop.com/perplexity-fedramp-artificial-intellgence-government-fedramp-cloud-gsa-general-services-administration/?ref=keun.me">FedScoop</a>&#xA0;&#xC815;&#xBD80; &#xC2DC;&#xC7A5;&#xC740; &#xADDC;&#xBAA8;&#xBFD0; &#xC544;&#xB2C8;&#xB77C; &#xBCF4;&#xC548; &#xC778;&#xC99D;&#xC774;&#xA0;<strong>&#xACBD;&#xC7C1; &#xD574;&#xC790;</strong>&#xB85C; &#xC804;&#xD658;&#xB418;&#xB294; &#xC2DC;&#xC7A5;&#xC774;&#xB2E4;.</p><hr><h2 id="%EC%97%AD%EC%82%AC%EC%A0%81-%EA%B8%B0%EC%88%A0-%ED%98%81%EB%AA%85%EC%9D%B4-ai-%EC%8B%9C%EB%8C%80%EC%97%90-%EC%A3%BC%EB%8A%94-%EA%B5%90%ED%9B%88">&#xC5ED;&#xC0AC;&#xC801; &#xAE30;&#xC220; &#xD601;&#xBA85;&#xC774; AI &#xC2DC;&#xB300;&#xC5D0; &#xC8FC;&#xB294; &#xAD50;&#xD6C8;</h2><p>&quot;&#xAE30;&#xC220; &#xC790;&#xBCF8;&#xC8FC;&#xC758;&#xB294; &#xAE30;&#xC220;&#xC774; &#xC544;&#xB2C8;&#xB77C; &#xC790;&#xBCF8;&#xC8FC;&#xC758;&quot;&#xB77C;&#xB294; &#xBA85;&#xC81C;&#xB294; &#xC5ED;&#xC0AC;&#xAC00; &#xC99D;&#xBA85;&#xD55C;&#xB2E4;. &#xBAA8;&#xB4E0; &#xAE30;&#xC220; &#xD601;&#xBA85;&#xC5D0;&#xC11C;&#xA0;<strong>&#xBA85;&#xBC31;&#xD55C; &#xCD08;&#xAE30; &#xC2B9;&#xC790;</strong>&#xC640;&#xA0;<strong>&#xC2E4;&#xC81C; &#xCD5C;&#xC885; &#xC2B9;&#xC790;</strong>&#xB294; &#xB2EC;&#xB790;&#xB2E4;.</p><h3 id="%EA%B3%A8%EB%93%9C%EB%9F%AC%EC%8B%9C%EC%97%90%EC%84%9C-pc%EA%B9%8C%EC%A7%80-%EC%8A%B9%EC%9E%90-%ED%8C%A8%ED%84%B4%EC%9D%98-%EC%9D%BC%EA%B4%80%EC%84%B1">&#xACE8;&#xB4DC;&#xB7EC;&#xC2DC;&#xC5D0;&#xC11C; PC&#xAE4C;&#xC9C0;: &#xC2B9;&#xC790; &#xD328;&#xD134;&#xC758; &#xC77C;&#xAD00;&#xC131;</h3><p><strong>&#xACE8;&#xB4DC;&#xB7EC;&#xC2DC;(1848-1855)</strong>: &#xAD11;&#xBD80;&#xB4E4;&#xC740; &#xB300;&#xBD80;&#xBD84; &#xC2E4;&#xD328;&#xD588;&#xB2E4;. &#xB9AC;&#xBC14;&#xC774; &#xC2A4;&#xD2B8;&#xB77C;&#xC6B0;&#xC2A4;&#xB294; &#xAD11;&#xBD80;&#xC5D0;&#xAC8C; &#xCCAD;&#xBC14;&#xC9C0;&#xB97C; &#xD314;&#xC544; &#xC0AC;&#xB9DD; &#xC2DC;&#xA0;<strong>$3,000&#xB9CC;</strong>(&#xD604;&#xC7AC; &#xAC00;&#xCE58; $8.7&#xC5B5;)&#xC758; &#xC7AC;&#xC0B0;&#xC744; &#xB0A8;&#xACBC;&#xB2E4;. &#xC6F0;&#xC2A4;&#xD30C;&#xACE0;&#xB294; &#xAE08;&#xC735; &#xC11C;&#xBE44;&#xC2A4;&#xB85C; &#xC131;&#xACF5;&#xD588;&#xB2E4;.&#xA0;<strong>&#xD328;&#xD134;</strong>: &#xBCC0;&#xB3D9;&#xC131; &#xB192;&#xC740; &quot;&#xAE08;&quot; &#xC790;&#xCCB4;&#xBCF4;&#xB2E4; &#xBAA8;&#xB4E0; &#xCC38;&#xC5EC;&#xC790;&#xC5D0;&#xAC8C; &#xD544;&#xC694;&#xD55C; &#xB0B4;&#xAD6C;&#xC7AC;/&#xC11C;&#xBE44;&#xC2A4;&#xAC00; &#xC2B9;&#xB9AC;.</p><p><strong>&#xCCA0;&#xB3C4;&#xD601;&#xBA85;(1850s-1900s)</strong>: &#xCCA0;&#xB3C4; &#xD68C;&#xC0AC;&#xB4E4;&#xC740; &#xC790;&#xBCF8; &#xC9D1;&#xC57D;&#xC131;&#xACFC; &#xACBD;&#xC7C1;&#xC73C;&#xB85C; &#xB300;&#xBD80;&#xBD84; &#xD30C;&#xC0B0;&#xD588;&#xB2E4;. &#xC564;&#xB4DC;&#xB958; &#xCE74;&#xB124;&#xAE30;&#xB294; &#xCCA0;&#xB3C4;&#xC5D0;&#xA0;<strong>&#xCCA0;&#xAC15;&#xC744; &#xACF5;&#xAE09;</strong>&#xD574; $5&#xC5B5;(J.P. &#xBAA8;&#xAC74;&#xC5D0; &#xB9E4;&#xAC01;)&#xC744; &#xBC8C;&#xC5C8;&#xB2E4;. J.P. &#xBAA8;&#xAC74;&#xC740;&#xA0;<strong>&#xAE08;&#xC735;</strong>&#xC73C;&#xB85C; &#xCCA0;&#xB3C4;&#xB97C; &#xC9C0;&#xBC30;&#xD588;&#xB2E4;.&#xA0;<strong>&#xD328;&#xD134;</strong>: &#xC778;&#xD504;&#xB77C; &#xAC74;&#xC124;&#xC790;&#xBCF4;&#xB2E4; &#xD544;&#xC218; &#xAD6C;&#xC131;&#xC694;&#xC18C; &#xACF5;&#xAE09;&#xC790;&#xC640; &#xC790;&#xBCF8; &#xD1B5;&#xC81C;&#xC790;&#xAC00; &#xC2B9;&#xB9AC;.</p><p><strong>PC&#xD601;&#xBA85;(1981-2000)</strong>: IBM&#xC774; PC&#xB97C; &#xBC1C;&#xBA85;&#xD588;&#xC9C0;&#xB9CC;, &#xC2DC;&#xAC04; &#xC808;&#xC57D;&#xC744; &#xC704;&#xD574; &#xCE69;(Intel)&#xACFC; OS(Microsoft)&#xB97C; &#xC678;&#xBD80; &#xC870;&#xB2EC;&#xD588;&#xB2E4;. &#xACB0;&#xACFC;&#xC801;&#xC73C;&#xB85C; **&#xCD08;&#xD06C;&#xD3EC;&#xC778;&#xD2B8;(chokepoint)**&#xB97C; &#xC7A5;&#xC545;&#xD55C; MS&#xC640; Intel&#xC774; &#xC2B9;&#xB9AC;&#xD588;&#xB2E4;. IBM&#xC758; PC &#xC544;&#xD0A4;&#xD14D;&#xCC98;&#xAC00; &#xC624;&#xD508;&#xC18C;&#xC2A4;&#xD654;&#xB418;&#xBA74;&#xC11C; &#xD558;&#xB4DC;&#xC6E8;&#xC5B4;&#xB294; &#xC0C1;&#xD488;&#xD654;&#xB410;&#xB2E4;.&#xA0;<strong>&#xD328;&#xD134;</strong>: &#xC870;&#xB9BD;&#xC790;&#xBCF4;&#xB2E4;&#xA0;<strong>&#xBAA8;&#xB4E0; &#xC870;&#xB9BD;&#xC790;&#xC5D0;&#xAC8C; &#xB77C;&#xC774;&#xC120;&#xC2A4;&#xB418;&#xB294; &#xD45C;&#xC900; &#xAD6C;&#xC131;&#xC694;&#xC18C;</strong>&#xAC00; &#xC2B9;&#xB9AC;.</p><p><strong>&#xC778;&#xD130;&#xB137;&#xD601;&#xBA85;(1995-2010)</strong>: AOL, Yahoo &#xAC19;&#xC740; &#xD3EC;&#xD138;&#xC774; &#xCD08;&#xAE30; &#xC2B9;&#xC790;&#xB85C; &#xBCF4;&#xC600;&#xB2E4;. &#xADF8;&#xB7EC;&#xB098; &#xAD6C;&#xAE00;&#xC740; PageRank&#xB85C;&#xA0;<strong>10&#xBC30; &#xB6F0;&#xC5B4;&#xB09C; &#xAC80;&#xC0C9; &#xAE30;&#xC220;</strong>&#xC744; &#xAD6C;&#xD604;&#xD558;&#xACE0;, &#xBC30;&#xB108; &#xAD11;&#xACE0;(CPM) &#xB300;&#xC2E0; **&#xC758;&#xB3C4; &#xAE30;&#xBC18; &#xAD11;&#xACE0;(PPC)**&#xB77C;&#xB294; &#xB2E4;&#xB978; &#xBE44;&#xC988;&#xB2C8;&#xC2A4; &#xBAA8;&#xB378;&#xC744; &#xC120;&#xD0DD;&#xD588;&#xB2E4;. Yahoo&#xB294; 2000&#xB144;&#xC5D0; &#xAD6C;&#xAE00;&#xC758; &#xAC80;&#xC0C9; &#xACB0;&#xACFC;&#xB97C; &#xB77C;&#xC774;&#xC120;&#xC2A4; &#xBC1B;&#xC544;&#xC57C; &#xD588;&#xACE0;, &#xC774;&#xB294; &#xC0AC;&#xC6A9;&#xC790;&#xB4E4;&#xC5D0;&#xAC8C; &#xAD6C;&#xAE00;&#xC744; &#xD559;&#xC2B5;&#xC2DC;&#xD0A4;&#xB294; &#xACB0;&#xACFC;&#xB97C; &#xB0B3;&#xC558;&#xB2E4;.&#xA0;<strong>&#xD328;&#xD134;</strong>: &quot;&#xCDA9;&#xBD84;&#xD788; &#xC88B;&#xC740;&quot; &#xAE30;&#xC220;&#xC744; &#xCD94;&#xAD6C;&#xD55C; &#xAE30;&#xC5C5;&#xBCF4;&#xB2E4;&#xA0;<strong>&#xD575;&#xC2EC; &#xAE30;&#xC220;&#xC5D0; &#xC9D1;&#xC911; &#xD22C;&#xC790;</strong>&#xD558;&#xACE0;&#xA0;<strong>&#xC62C;&#xBC14;&#xB978; &#xBE44;&#xC988;&#xB2C8;&#xC2A4; &#xBAA8;&#xB378;</strong>&#xC744; &#xC120;&#xD0DD;&#xD55C; &#xAE30;&#xC5C5;&#xC774; &#xC2B9;&#xB9AC;.</p><h3 id="ai-%EC%8B%9C%EB%8C%80%EC%9D%98-%EB%A6%AC%EB%B0%94%EC%9D%B4%EC%8A%A4%EB%8A%94-%EB%88%84%EA%B5%AC%EC%9D%B8%EA%B0%80">AI &#xC2DC;&#xB300;&#xC758; &quot;&#xB9AC;&#xBC14;&#xC774;&#xC2A4;&quot;&#xB294; &#xB204;&#xAD6C;&#xC778;&#xAC00;</h3><p>&#xC5ED;&#xC0AC;&#xC801; &#xD328;&#xD134;&#xC744; AI&#xC5D0; &#xC801;&#xC6A9;&#xD558;&#xBA74;, &#xC2B9;&#xC790;&#xC758; &#xD2B9;&#xC131;&#xC774; &#xB4DC;&#xB7EC;&#xB09C;&#xB2E4;:</p><ol><li><strong>&#xBAA8;&#xB4E0; AI &#xCC38;&#xC5EC;&#xC790;&#xC5D0;&#xAC8C; &#xC11C;&#xBE44;&#xC2A4; &#xC81C;&#xACF5;</strong>&#xA0;(&#xD2B9;&#xC815; &#xBAA8;&#xB378;/&#xD68C;&#xC0AC;&#xC5D0; &#xC758;&#xC874;&#xD558;&#xC9C0; &#xC54A;&#xC74C;)</li><li><strong>&#xC77C;&#xD68C;&#xC131;&#xC774; &#xC544;&#xB2CC; &#xBC18;&#xBCF5;&#xC801; &#xD544;&#xC218; &#xAC00;&#xCE58;</strong>&#xA0;&#xC81C;&#xACF5;</li><li><strong>&#xBCF5;&#xC81C; &#xBD88;&#xAC00;&#xB2A5;&#xD55C; &#xD574;&#xC790;</strong>&#xA0;&#xBCF4;&#xC720;</li><li><strong>&#xACB0;&#xACFC;&#xC640; &#xAD00;&#xACC4;&#xC5C6;&#xC774; AI &#xBD90; &#xC790;&#xCCB4;&#xC5D0;&#xC11C; &#xC774;&#xC775;</strong></li></ol><p><strong>&#xAC00;&#xC7A5; &#xC720;&#xB9DD;&#xD55C; &quot;&#xB9AC;&#xBC14;&#xC774;&#xC2A4;&quot; &#xD6C4;&#xBCF4;&#xAD70;</strong>:</p><ul><li><strong>&#xB370;&#xC774;&#xD130; &#xB808;&#xC774;&#xC5B4;</strong>: Scale AI(Meta&#xAC00; $150&#xC5B5; &#xC9C0;&#xBD84; &#xD22C;&#xC790;), &#xB3C5;&#xC810; &#xD6C8;&#xB828; &#xB370;&#xC774;&#xD130;, &#xD569;&#xC131; &#xB370;&#xC774;&#xD130; &#xC0DD;&#xC131;&#xA0;<a href="https://www.amadeuscapital.com/ai-commoditisation-curve/?ref=keun.me">amadeuscapital</a></li><li><strong>&#xD3C9;&#xAC00;/&#xAC80;&#xC99D; &#xB808;&#xC774;&#xC5B4;</strong>: EU AI Act &#xB4F1; &#xADDC;&#xC81C; &#xC900;&#xC218; &#xAC80;&#xC99D; &#xB3C4;&#xAD6C; (&#xADDC;&#xC81C; &#xC21C;&#xD48D;)</li><li><strong>&#xB370;&#xC774;&#xD130; &#xD574;&#xC790;&#xB97C; &#xAC00;&#xC9C4; &#xC218;&#xC9C1; AI &#xC560;&#xD50C;&#xB9AC;&#xCF00;&#xC774;&#xC158;</strong>: &#xC0AC;&#xC6A9;&#xC744; &#xD1B5;&#xD574; &#xB3C5;&#xC810; &#xB370;&#xC774;&#xD130;&#xB97C; &#xC0DD;&#xC131;&#xD558;&#xB294; &#xC571;</li><li><strong>&#xC5D0;&#xC774;&#xC804;&#xD2B8; &#xC624;&#xCF00;&#xC2A4;&#xD2B8;&#xB808;&#xC774;&#xC158;</strong>: &#xC5EC;&#xB7EC; AI &#xC5D0;&#xC774;&#xC804;&#xD2B8;&#xB97C; &#xC870;&#xC728;&#xD558;&#xB294; &#xD50C;&#xB7AB;&#xD3FC;</li></ul><p><strong>&#xD53C;&#xD574;&#xC57C; &#xD560; &#xC601;&#xC5ED;</strong>: GPT &#xB798;&#xD37C;(&#xCC28;&#xBCC4;&#xD654; &#xC5C6;&#xB294; AI &#xC571;), &#xD30C;&#xC6B4;&#xB370;&#xC774;&#xC158; &#xBAA8;&#xB378; &#xACBD;&#xC7C1;(&#xC624;&#xD508;&#xC18C;&#xC2A4; 3&#xAC1C;&#xC6D4; &#xB0B4; &#xCD94;&#xACA9;), &#xC790;&#xBCF8; &#xC9D1;&#xC57D;&#xC801; &#xC778;&#xD504;&#xB77C;(&#xB9C8;&#xC9C4; &#xC555;&#xCD95; &#xBD88;&#xAC00;&#xD53C;).</p><hr><h2 id="ai-%EB%A0%88%EC%9D%B4%EC%96%B4%EB%B3%84-%EB%A7%88%EC%A7%84%EA%B3%BC-%EB%B0%A9%EC%96%B4%EB%A0%A5-%EC%83%81%ED%92%88%ED%99%94%EA%B0%80-%EC%A7%84%ED%96%89-%EC%A4%91%EC%9D%B4%EB%8B%A4">AI &#xB808;&#xC774;&#xC5B4;&#xBCC4; &#xB9C8;&#xC9C4;&#xACFC; &#xBC29;&#xC5B4;&#xB825;: &#xC0C1;&#xD488;&#xD654;&#xAC00; &#xC9C4;&#xD589; &#xC911;&#xC774;&#xB2E4;</h2><h3 id="%ED%98%84%EC%9E%AC-ai-%EC%8A%A4%ED%83%9D%EC%9D%98-%EC%88%98%EC%9D%B5%EC%84%B1%EA%B3%BC-%EC%9C%84%ED%97%98">&#xD604;&#xC7AC; AI &#xC2A4;&#xD0DD;&#xC758; &#xC218;&#xC775;&#xC131;&#xACFC; &#xC704;&#xD5D8;</h3>
<!--kg-card-begin: html-->
<table class="min-w-full border-collapse text-sm leading-[1.7] whitespace-normal"><thead class="text-left"><tr><th class="text-text-100 border-b-0.5 border-border-300/60 py-2 pr-4 align-top font-bold">&#xB808;&#xC774;&#xC5B4;</th><th class="text-text-100 border-b-0.5 border-border-300/60 py-2 pr-4 align-top font-bold">&#xCD1D;&#xC774;&#xC775;&#xB960;</th><th class="text-text-100 border-b-0.5 border-border-300/60 py-2 pr-4 align-top font-bold">&#xBC29;&#xC5B4;&#xB825;</th><th class="text-text-100 border-b-0.5 border-border-300/60 py-2 pr-4 align-top font-bold">&#xC0C1;&#xD488;&#xD654; &#xC704;&#xD5D8;</th><th class="text-text-100 border-b-0.5 border-border-300/60 py-2 pr-4 align-top font-bold">&#xD0C0;&#xC784;&#xB77C;&#xC778;</th></tr></thead><tbody><tr><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top"><strong>&#xC778;&#xD504;&#xB77C;(GPU/&#xD074;&#xB77C;&#xC6B0;&#xB4DC;)</strong></td><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top">60-75% (NVIDIA)</td><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top">&#xD604;&#xC7AC; &#xB192;&#xC74C; &#x2192; &#xD558;&#xB77D; &#xC911;</td><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top">&#xC911;&#xAC04;</td><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top">5-10&#xB144; &#xB0B4; &#xC555;&#xCD95;</td></tr><tr><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top"><strong>&#xD30C;&#xC6B4;&#xB370;&#xC774;&#xC158; &#xBAA8;&#xB378;</strong></td><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top">48-55%</td><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top">&#xC911;&#xAC04; &#x2192; &#xAE09;&#xB77D;</td><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top"><strong>&#xB9E4;&#xC6B0; &#xB192;&#xC74C;</strong></td><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top"><strong>2-3&#xB144; &#xB0B4; &#xC0C1;&#xD488;&#xD654;</strong></td></tr><tr><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top"><strong>&#xD50C;&#xB7AB;&#xD3FC;/&#xD234;&#xB9C1;</strong></td><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top">60-80%</td><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top">&#xC911;&#xAC04;</td><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top">&#xB192;&#xC74C;</td><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top">2026&#xB144;&#xAE4C;&#xC9C0; &#xD1B5;&#xD569;</td></tr><tr><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top"><strong>&#xC218;&#xC9C1; &#xC560;&#xD50C;&#xB9AC;&#xCF00;&#xC774;&#xC158;</strong></td><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top">25-60% (&#xAC00;&#xBCC0;)</td><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top"><strong>&#xC7A0;&#xC7AC;&#xC801;&#xC73C;&#xB85C; &#xB192;&#xC74C;</strong></td><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top">&#xB0AE;&#xC74C; (&#xB370;&#xC774;&#xD130; &#xD574;&#xC790; &#xC2DC;)</td><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top">&#xC7A5;&#xAE30; &#xBC29;&#xC5B4; &#xAC00;&#xB2A5;</td></tr></tbody></table>
<!--kg-card-end: html-->
<p><strong>&#xAC00;&#xC7A5; &#xBE60;&#xB974;&#xAC8C; &#xC0C1;&#xD488;&#xD654;&#xB418;&#xB294; &#xB808;&#xC774;&#xC5B4;&#xB294; &#xD30C;&#xC6B4;&#xB370;&#xC774;&#xC158; &#xBAA8;&#xB378;</strong>&#xC774;&#xB2E4;. &#xC624;&#xD508;&#xC18C;&#xC2A4; &#xBAA8;&#xB378;(Llama 3, DeepSeek)&#xC774; &#xB3C5;&#xC810; &#xBAA8;&#xB378;&#xACFC;&#xC758; &#xACA9;&#xCC28;&#xB97C;&#xA0;<strong>3&#xAC1C;&#xC6D4; &#xC774;&#xB0B4;</strong>&#xB85C; &#xC881;&#xD788;&#xACE0; &#xC788;&#xB2E4;. DeepSeek&#xC758; 2025&#xB144; 1&#xC6D4; &#xCD9C;&#xC2DC;&#xAC00; &#xBBF8;&#xAD6D; &#xC571;&#xC2A4;&#xD1A0;&#xC5B4; 1&#xC704;&#xB97C; &#xAE30;&#xB85D;&#xD55C; &#xAC83;&#xC740; &#xC0C1;&#xC9D5;&#xC801;&#xC774;&#xB2E4;.&#xA0;<a href="https://carnegieendowment.org/research/2025/07/chinas-ai-policy-in-the-deepseek-era?lang=en&amp;ref=keun.me">Carnegie Endowment for International Peace</a>&#xA0;&#xC911;&#xAD6D; &#xAE30;&#xC5C5;&#xB4E4;&#xC758; &quot;&#xC9C0;&#xB2A5; &#xC778;&#xBCFC;&#xB8E8;&#xC158;(intelligence involution)&quot;&#x2014;&#xAC00;&#xACA9;&#xC744; &#xBB34;&#xC790;&#xBE44;&#xD558;&#xAC8C; &#xB0AE;&#xCD94;&#xB294; &#xACBD;&#xC7C1;&#x2014;&#xC774; LLM&#xC744; &#xC0C1;&#xD488;&#xC73C;&#xB85C; &#xC804;&#xD658;&#xC2DC;&#xD0A4;&#xACE0; &#xC788;&#xB2E4;.</p><p><strong>&#xB9C8;&#xC9C4;&#xC774; &#xC9D1;&#xC911;&#xB420; &#xC601;&#xC5ED;(3-5&#xB144; &#xC804;&#xB9DD;)</strong>:</p><ol><li>&#xB3C5;&#xC810; &#xB370;&#xC774;&#xD130; &#xC790;&#xC0B0; (&#xBCF5;&#xC81C; &#xBD88;&#xAC00;&#xB2A5;&#xD55C; &#xD6C8;&#xB828; &#xB370;&#xC774;&#xD130;, &#xD53C;&#xB4DC;&#xBC31; &#xB8E8;&#xD504;)</li><li>&#xC6CC;&#xD06C;&#xD50C;&#xB85C;&#xC5D0; &#xB0B4;&#xC7A5;&#xB41C; AI &#xC5D0;&#xC774;&#xC804;&#xD2B8;</li><li>&#xD6A8;&#xC728;&#xC801; &#xD30C;&#xC778;&#xD29C;&#xB2DD;/&#xD6C8;&#xB828; &#xCD5C;&#xC801;&#xD654; &#xB3C4;&#xAD6C;</li><li>&#xD3C9;&#xAC00;/&#xAC80;&#xC99D; &#xB808;&#xC774;&#xC5B4; (&#xADDC;&#xC81C; &#xC900;&#xC218;)</li><li>&#xC5E3;&#xC9C0; &#xCD94;&#xB860; &#xC2E4;&#xB9AC;&#xCF58; (&#xC800;&#xC804;&#xB825; &#xC628;&#xB514;&#xBC14;&#xC774;&#xC2A4; AI)&#xA0;<a href="https://www.amadeuscapital.com/ai-commoditisation-curve/?ref=keun.me">amadeuscapital</a></li></ol><hr><h2 id="%EC%97%94%ED%84%B0%ED%94%84%EB%9D%BC%EC%9D%B4%EC%A6%88-saas%EC%9D%98-ai-%EC%A0%84%ED%99%98-%EB%84%A4-%EA%B0%80%EC%A7%80-%EB%AA%A8%EB%8D%B8">&#xC5D4;&#xD130;&#xD504;&#xB77C;&#xC774;&#xC988; SaaS&#xC758; AI &#xC804;&#xD658;: &#xB124; &#xAC00;&#xC9C0; &#xBAA8;&#xB378;</h2><h3 id="salesforce-%EC%97%90%EC%9D%B4%EC%A0%84%ED%8A%B8%ED%8F%AC%EC%8A%A4%EC%99%80-%ED%95%98%EC%9D%B4%EB%B8%8C%EB%A6%AC%EB%93%9C-%EC%88%98%EC%9D%B5%ED%99%94">Salesforce: &#xC5D0;&#xC774;&#xC804;&#xD2B8;&#xD3EC;&#xC2A4;&#xC640; &#xD558;&#xC774;&#xBE0C;&#xB9AC;&#xB4DC; &#xC218;&#xC775;&#xD654;</h3><p>Salesforce&#xB294; Einstein(2016) &#x2192; Einstein GPT(2023) &#x2192; **Agentforce(2024)**&#xB85C; &#xC9C4;&#xD654;&#xD588;&#xB2E4;. Agentforce&#xB294; &#xC790;&#xC728;&#xC801;&#xC73C;&#xB85C; &#xC5C5;&#xBB34;&#xB97C; &#xC218;&#xD589;&#xD558;&#xB294; AI &#xC5D0;&#xC774;&#xC804;&#xD2B8; &#xD50C;&#xB7AB;&#xD3FC;&#xC73C;&#xB85C;, Marc Benioff&#xB294; &quot;2025&#xB144; &#xB9D0;&#xAE4C;&#xC9C0;&#xA0;<strong>10&#xC5B5; &#xC5D0;&#xC774;&#xC804;&#xD2B8;</strong>&quot;&#xB97C; &#xBAA9;&#xD45C;&#xB85C; &#xD55C;&#xB2E4;.</p><p><strong>Data Cloud&#xAC00; &#xD575;&#xC2EC; &#xD574;&#xC790;</strong>&#xB2E4;. Data Cloud + AI ARR&#xC740;&#xA0;<strong>$14&#xC5B5;</strong>(YoY 114% &#xC131;&#xC7A5;)&#xC5D0; &#xB2EC;&#xD558;&#xBA70;, &#xC774;&#xAC83;&#xC774; AI&#xC758; &#xAE30;&#xBC18;&#xC774; &#xB418;&#xB294; &#xACE0;&#xAC1D; &#xB370;&#xC774;&#xD130; &#xD1B5;&#xD569; &#xD50C;&#xB7AB;&#xD3FC; &#xC5ED;&#xD560;&#xC744; &#xD55C;&#xB2E4;. Agentforce&#xB294; &#xCD9C;&#xC2DC; 7&#xAC1C;&#xC6D4; &#xB9CC;&#xC5D0;&#xA0;<strong>8,000+ &#xACE0;&#xAC1D;</strong>(&#xC720;&#xB8CC; 5,000&#xAC74;)&#xC744; &#xD655;&#xBCF4;&#xD588;&#xB2E4;.</p><p><strong>&#xC218;&#xC775;&#xD654; &#xC804;&#xB7B5;</strong>&#xC740; &#xD558;&#xC774;&#xBE0C;&#xB9AC;&#xB4DC;&#xB2E4;: &#xCD08;&#xAE30; $2/&#xB300;&#xD654; &#xBAA8;&#xB378;&#xC5D0;&#xC11C; &#xACE0;&#xAC1D; &#xBC18;&#xBC1C; &#xD6C4;&#xA0;<strong>Flex Credits</strong>($0.10/&#xC561;&#xC158;)&#xB85C; &#xC804;&#xD658;&#xD588;&#xB2E4;. &#xC2DC;&#xD2B8; &#xAE30;&#xBC18;($125-650/&#xC720;&#xC800;/&#xC6D4;)&#xACFC; &#xC0AC;&#xC6A9;&#xB7C9; &#xAE30;&#xBC18;&#xC744; &#xACB0;&#xD569;&#xD574; &#xC608;&#xCE21; &#xAC00;&#xB2A5;&#xC131;&#xACFC; &#xC131;&#xC7A5; &#xC7A0;&#xC7AC;&#xB825;&#xC744; &#xBAA8;&#xB450; &#xD655;&#xBCF4;&#xD588;&#xB2E4;.</p><h3 id="servicenow-ai-%EC%BB%A8%ED%8A%B8%EB%A1%A4-%ED%83%80%EC%9B%8C-%EC%A0%84%EB%9E%B5">ServiceNow: &quot;AI &#xCEE8;&#xD2B8;&#xB864; &#xD0C0;&#xC6CC;&quot; &#xC804;&#xB7B5;</h3><p>ServiceNow&#xB294; &#xC6CC;&#xD06C;&#xD50C;&#xB85C; &#xC790;&#xB3D9;&#xD654; &#xB9AC;&#xB354;&#xC5D0;&#xC11C; **&quot;&#xC5D4;&#xD130;&#xD504;&#xB77C;&#xC774;&#xC988; AI &#xC624;&#xCF00;&#xC2A4;&#xD2B8;&#xB808;&#xC774;&#xC158; &#xD50C;&#xB7AB;&#xD3FC;&quot;**&#xC73C;&#xB85C; &#xC804;&#xD658; &#xC911;&#xC774;&#xB2E4;. ITSM &#xC2DC;&#xC7A5;&#xA0;<strong>40% &#xC810;&#xC720;&#xC728;</strong>&#xC744; &#xAE30;&#xBC18;&#xC73C;&#xB85C;, Now Assist(&#xC0DD;&#xC131; AI)&#xC640; Agentic AI(&#xC790;&#xC728; &#xC5D0;&#xC774;&#xC804;&#xD2B8;)&#xB97C; 3&#xB2E8;&#xACC4;&#xB85C; &#xC81C;&#xACF5;&#xD55C;&#xB2E4;.</p><p>2024&#xB144; &#xB9E4;&#xCD9C;&#xA0;<strong>$109.8&#xC5B5;</strong>(YoY 22% &#xC131;&#xC7A5;),&#xA0;<a href="https://www.computerweekly.com/news/366618531/ServiceNow-vaunts-agentic-AI-announces-22-annual-revenue-growth?ref=keun.me">Computer Weekly</a>&#xA0;Now Assist &#xB51C;&#xA0;<strong>QoQ 150%+ &#xC131;&#xC7A5;</strong>, Pro Plus &#xB51C;&#xA0;<strong>YoY 4&#xBC30; &#xC99D;&#xAC00;</strong>. AI &#xC81C;&#xD488;&#xC5D0;&#xC11C;&#xA0;<strong>2025&#xB144; $100&#xC5B5; ACV</strong>&#xA0;&#xBAA9;&#xD45C;&#xB97C; &#xC124;&#xC815;&#xD588;&#xB2E4;.&#xA0;<a href="https://www.klover.ai/servicenow-ai-strategy-analysis-of-ai-dominance-in-enterprise-software/?ref=keun.me">Klover</a>&#xA0;&#xCC28;&#xBCC4;&#xD654; &#xC694;&#xC18C;&#xB294;&#xA0;<strong>Workflow Data Fabric</strong>(&#xB370;&#xC774;&#xD130; &#xC0AC;&#xC77C;&#xB85C; &#xD574;&#xACB0;)&#xACFC;&#xA0;<strong>AI Control Tower</strong>(&#xAC70;&#xBC84;&#xB10C;&#xC2A4;, &#xB9AC;&#xC2A4;&#xD06C; &#xAD00;&#xB9AC;)&#xB2E4;.&#xA0;<a href="https://www.klover.ai/servicenow-ai-strategy-analysis-of-ai-dominance-in-enterprise-software/?ref=keun.me">Klover</a></p><h3 id="palantir-%EC%A0%95%EB%B6%80-%EA%B8%B0%EC%97%85-%EA%B0%84-%EB%B8%8C%EB%A6%BF%EC%A7%80-%EB%AA%A8%EB%8D%B8%EC%9D%98-%EA%B5%90%EA%B3%BC%EC%84%9C">Palantir: &#xC815;&#xBD80;-&#xAE30;&#xC5C5; &#xAC04; &#xBE0C;&#xB9BF;&#xC9C0; &#xBAA8;&#xB378;&#xC758; &#xAD50;&#xACFC;&#xC11C;</h3><p>Palantir&#xAC00; &#xC131;&#xACF5;&#xD55C; &#xC774;&#xC720;&#xB294; AI &#xBAA8;&#xB378;&#xC774; &#xC544;&#xB2C8;&#xB77C; **&#xC628;&#xD1A8;&#xB85C;&#xC9C0;(Ontology)**&#xB2E4;. &#xC628;&#xD1A8;&#xB85C;&#xC9C0;&#xB294; &#xC6D0;&#xC2DC; &#xB370;&#xC774;&#xD130;&#xB97C; &#xC2E4;&#xD589; &#xAC00;&#xB2A5;&#xD55C; &#xC6B4;&#xC601; &#xC778;&#xD154;&#xB9AC;&#xC804;&#xC2A4;&#xB85C; &#xBCC0;&#xD658;&#xD558;&#xB294; &#xC2DC;&#xB9E8;&#xD2F1; &#xB808;&#xC774;&#xC5B4;&#xB85C;, &#xB514;&#xC9C0;&#xD138; &#xB370;&#xC774;&#xD130;&#xB97C; &#xC2E4;&#xC81C; &#xC790;&#xC0B0;&#xACFC; &#xC778;&#xACFC;&#xAD00;&#xACC4;&#xB85C; &#xB9E4;&#xD551;&#xD574; AI&#xAC00; &#xB9E5;&#xB77D;&#xC744; &#xC774;&#xD574;&#xD558;&#xAC8C; &#xD55C;&#xB2E4;.</p><p><strong>&#xC7AC;&#xBB34; &#xC2E4;&#xC801;</strong>&#xC774; &#xC555;&#xB3C4;&#xC801;&#xC774;&#xB2E4;: 2024&#xB144; &#xB9E4;&#xCD9C;&#xA0;<strong>$28.7&#xC5B5;</strong>(YoY 29% &#xC131;&#xC7A5;),&#xA0;<a href="https://finance.yahoo.com/news/palantir-revenue-rises-29-2024-174724830.html?ref=keun.me">Yahoo Finance</a>&#xA0;&#xBBF8;&#xAD6D; &#xC0C1;&#xC5C5; &#xBD80;&#xBB38;&#xA0;<strong>YoY 93% &#xC131;&#xC7A5;</strong>(Q2 2024),&#xA0;<a href="https://www.ig.com/en/news-and-trade-ideas/Palantir-Q32025-earnings-251029?ref=keun.me">IG</a>&#xA0;Rule of 40 &#xC810;&#xC218;&#xA0;<strong>83%</strong>, &#xC870;&#xC815; &#xC601;&#xC5C5;&#xC774;&#xC775;&#xB960;&#xA0;<strong>44%</strong>,&#xA0;<a href="https://www.klover.ai/palantir-ai-strategy-path-to-ai-dominance-from-defense-to-enterprise/?ref=keun.me">Klover</a>&#xA0;&#xD604;&#xAE08;&#xA0;<strong>$64&#xC5B5;</strong>(&#xBB34;&#xCC28;&#xC785;). &#xBBF8; &#xC721;&#xAD70;&#xA0;<strong>$100&#xC5B5; 10&#xB144; &#xACC4;&#xC57D;</strong>(2025&#xB144; 8&#xC6D4;)&#xC774; &#xC815;&#xBD80; &#xC2E0;&#xB8B0;&#xB3C4;&#xB97C; &#xC99D;&#xBA85;&#xD55C;&#xB2E4;.</p><p><strong>AIP(AI Platform) Bootcamp &#xBAA8;&#xB378;</strong>&#xC774; &#xAC8C;&#xC784; &#xCCB4;&#xC778;&#xC800;&#xB2E4;. 5&#xC77C;&#xAC04; &#xACE0;&#xAC1D; &#xB370;&#xC774;&#xD130;&#xB85C; &#xC2E4;&#xC81C; &#xD504;&#xB85C;&#xD1A0;&#xD0C0;&#xC785;&#xC744; &#xAD6C;&#xCD95;&#xD558;&#xB294; &#xC9D1;&#xC911; &#xC6CC;&#xD06C;&#xC20D;&#xC740; &quot;try-before-you-buy&quot; &#xC811;&#xADFC;&#xC73C;&#xB85C; &#xD68C;&#xC758;&#xB860;&#xC790;&#xB97C; &#xAD6C;&#xB9E4;&#xC790;&#xB85C; &#xC804;&#xD658;&#xD55C;&#xB2E4;. Q1 2025&#xC5D0;&#xB9CC;&#xA0;<strong>$100&#xB9CC;+ &#xB51C; 139&#xAC74;</strong>&#xC744; &#xCC3D;&#xCD9C;&#xD588;&#xB2E4;.</p><p><strong>B2B AI &#xD50C;&#xB7AB;&#xD3FC;&#xC744; &#xC704;&#xD55C; Palantir &#xAD50;&#xD6C8;</strong>:</p><ol><li>&quot;&#xB77C;&#xC2A4;&#xD2B8; &#xB9C8;&#xC77C;&quot; &#xBB38;&#xC81C; &#xD574;&#xACB0;&#x2014;&#xBAA8;&#xB378;&#xB9CC;&#xC73C;&#xB85C;&#xB294; &#xBD80;&#xC871;, &#xC6B4;&#xC601; &#xC6CC;&#xD06C;&#xD50C;&#xB85C;&#xC5D0; &#xD1B5;&#xD569; &#xD544;&#xC694;</li><li>&#xAC00;&#xC7A5; &#xC5B4;&#xB824;&#xC6B4; &#xBB38;&#xC81C;&#xBD80;&#xD130; &#xC2DC;&#xC791;&#x2014;&#xBCF5;&#xC7A1;&#xD560;&#xC218;&#xB85D; &#xACBD;&#xC7C1; &#xC7A5;&#xBCBD;&#xC774; &#xB192;&#xC544;&#xC9D0;</li><li>&#xBCF4;&#xC548;&#xC774; &#xCC28;&#xBCC4;&#xD654;&#x2014;&#xC815;&#xBD80;&#xAE09; &#xBCF4;&#xC548; &#xC778;&#xC99D;&#xC740; &#xAE30;&#xC5C5; &#xC2E0;&#xB8B0;&#xB85C; &#xC804;&#xD658;&#xB428;</li><li>&#xC778;&#xB0B4;&#xC2EC;&#x2014;Palantir&#xB294; 2003&#xB144; &#xC124;&#xB9BD;, 20&#xB144;&#xC758; &#xD574;&#xC790; &#xAD6C;&#xCD95; &#xAE30;&#xAC04;&#xC774; &#xC788;&#xC5C8;&#xC74C;</li></ol><hr><h2 id="ai-%EB%84%A4%EC%9D%B4%ED%8B%B0%EB%B8%8C-%ED%94%8C%EB%9E%AB%ED%8F%BC%EC%9D%98-%ED%98%84%EC%9E%AC-%EC%88%98%EC%A7%81-vs-%EC%88%98%ED%8F%89%EC%9D%98-%EC%8A%B9%EB%B6%80">AI &#xB124;&#xC774;&#xD2F0;&#xBE0C; &#xD50C;&#xB7AB;&#xD3FC;&#xC758; &#xD604;&#xC7AC;: &#xC218;&#xC9C1; vs &#xC218;&#xD3C9;&#xC758; &#xC2B9;&#xBD80;</h2><h3 id="glean-%EC%97%94%ED%84%B0%ED%94%84%EB%9D%BC%EC%9D%B4%EC%A6%88-ai%EC%9D%98-%EC%A0%95%EC%84%9D">Glean: &#xC5D4;&#xD130;&#xD504;&#xB77C;&#xC774;&#xC988; AI&#xC758; &#xC815;&#xC11D;</h3><p>Glean&#xC740;&#xA0;<strong>$72&#xC5B5; &#xBC38;&#xB958;&#xC5D0;&#xC774;&#xC158;</strong>(2025&#xB144; 6&#xC6D4;),&#xA0;<a href="https://www.glean.com/blog/glean-series-f-announcement?ref=keun.me">Glean</a>&#xA0;18&#xAC1C;&#xC6D4;&#xAC04;&#xA0;<strong>3.3&#xBC30; &#xBC38;&#xB958; &#xC131;&#xC7A5;</strong>,&#xA0;<a href="https://techcrunch.com/2025/06/10/enterprise-ai-startup-glean-lands-a-7-2b-valuation/?ref=keun.me">TechCrunch</a>&#xA0;&#xCD9C;&#xC2DC; 3&#xB144; &#xB0B4;&#xA0;<strong>$1&#xC5B5; ARR</strong>&#xA0;&#xB2EC;&#xC131;&#xC73C;&#xB85C; &quot;&#xCE74;&#xD14C;&#xACE0;&#xB9AC; &#xB9AC;&#xB354;&quot;&#xB85C; &#xC790;&#xB9AC;&#xC7A1;&#xC558;&#xB2E4;.&#xA0;<a href="https://www.glean.com/press/glean-raises-150m-series-f-at-7-2b-valuation-to-accelerate-enterprise-ai-agent-innovation-globally?ref=keun.me">Glean</a>&#xA0;100+ &#xC571; &#xCEE4;&#xB125;&#xD130;&#xB97C; &#xD1B5;&#xD55C; &#xC5D4;&#xD130;&#xD504;&#xB77C;&#xC774;&#xC988; &#xC9C0;&#xC2DD; &#xD1B5;&#xD569;&#xACFC;&#xA0;<strong>Glean Agents</strong>(&#xC5F0;&#xAC04; 1&#xC5B5;+ &#xC5D0;&#xC774;&#xC804;&#xD2B8; &#xC561;&#xC158;)&#xB85C; &#xC5D0;&#xC774;&#xC804;&#xD2F1; AI&#xC5D0; &#xC9C4;&#xC785;&#xD588;&#xB2E4;.&#xA0;<a href="https://techcrunch.com/2025/06/10/enterprise-ai-startup-glean-lands-a-7-2b-valuation/?ref=keun.me">TechCrunch</a>&#xA0;MAU&#xC758;&#xA0;<strong>40%&#xAC00; DAU</strong>&#xC778; &#xAC83;&#xC740; &#xC77C;&#xBC18; &#xC5D4;&#xD130;&#xD504;&#xB77C;&#xC774;&#xC988; &#xC18C;&#xD504;&#xD2B8;&#xC6E8;&#xC5B4;(15-20%)&#xC758; 2-3&#xBC30;&#xB2E4;.&#xA0;<a href="https://siliconangle.com/2024/09/10/enterprise-ai-search-platform-glean-raises-260m-4-6b-valuation/?ref=keun.me">SiliconANGLE</a></p><p>&#xC704;&#xD5D8; &#xC694;&#xC18C;&#xB294; Microsoft 365 Copilot, Amazon Q Business&#xC758; &#xD50C;&#xB7AB;&#xD3FC; &#xD655;&#xC7A5;&#xC774;&#xB2E4;. CEO Jain&#xB3C4; &quot;Google, Microsoft, OpenAI &#xBAA8;&#xB450; &#xC6B0;&#xB9AC;&#xAC00; &#xC2DC;&#xC791;&#xD55C; &#xC601;&#xC5ED;&#xC5D0; &#xB4E4;&#xC5B4;&#xC624;&#xACE0; &#xC2F6;&#xC5B4;&#xD55C;&#xB2E4;&quot;&#xACE0; &#xC778;&#xC815;&#xD55C;&#xB2E4;.&#xA0;<a href="https://www.cnbc.com/2025/06/10/glean-gen-ai-search-startup-raises-150-million-at-7-billion-value.html?ref=keun.me">CNBC</a></p><h3 id="harvey-ai-%EC%88%98%EC%A7%81-ai%EC%9D%98-%EC%8A%B9%EB%A6%AC-%EA%B3%B5%EC%8B%9D">Harvey AI: &#xC218;&#xC9C1; AI&#xC758; &#xC2B9;&#xB9AC; &#xACF5;&#xC2DD;</h3><p>Harvey&#xB294; &#xBC95;&#xB960; AI&#xB85C;&#xA0;<strong>$80&#xC5B5; &#xBC38;&#xB958;&#xC5D0;&#xC774;&#xC158;</strong>(2025&#xB144; 12&#xC6D4;)&#xC5D0; &#xB3C4;&#xB2EC;&#xD588;&#xB2E4;&#x2014;18&#xAC1C;&#xC6D4; &#xC804; $7.15&#xC5B5;&#xC5D0;&#xC11C;&#xA0;<strong>11&#xBC30; &#xC131;&#xC7A5;</strong>. $1&#xC5B5;+ ARR, 337&#xAC1C; &#xBC95;&#xB960; &#xACE0;&#xAC1D;, &#xBBF8;&#xAD6D; &#xC0C1;&#xC704; 10&#xB300; &#xB85C;&#xD38C; &#xB300;&#xB2E4;&#xC218; &#xD655;&#xBCF4;. &#xCC98;&#xC74C;&#xC5D0;&#xB294; &quot;GPT &#xB798;&#xD37C;&quot;&#xB85C; &#xBE44;&#xD310;&#xBC1B;&#xC558;&#xC9C0;&#xB9CC;,&#xA0;<strong>&#xAE4A;&#xC740; &#xB3C4;&#xBA54;&#xC778; &#xC804;&#xBB38;&#xC131;</strong>(&#xBCC0;&#xD638;&#xC0AC; &#xC9C1;&#xC6D0; &#xCC44;&#xC6A9;),&#xA0;<strong>&#xC6CC;&#xD06C;&#xD50C;&#xB85C; &#xD1B5;&#xD569;</strong>,&#xA0;<strong>&#xBBF8;&#xC158; &#xD06C;&#xB9AC;&#xD2F0;&#xCEEC; &#xC720;&#xC2A4;&#xCF00;&#xC774;&#xC2A4;</strong>&#xB85C; &#xD504;&#xB9AC;&#xBBF8;&#xC5C4; &#xBC38;&#xB958;&#xC5D0;&#xC774;&#xC158;&#xC744; &#xC815;&#xB2F9;&#xD654;&#xD588;&#xB2E4;.</p><h3 id="jasper-ai-gpt-%EB%9E%98%ED%8D%BC%EC%9D%98-%EA%B2%BD%EA%B3%A0">Jasper AI: GPT &#xB798;&#xD37C;&#xC758; &#xACBD;&#xACE0;</h3><p>Jasper&#xB294;&#xA0;<strong>&#xACBD;&#xACE0; &#xC0AC;&#xB840;</strong>&#xB2E4;. 2022&#xB144; 10&#xC6D4; $15&#xC5B5; &#xBC38;&#xB958;&#xC5D0;&#xC774;&#xC158; &#xC720;&#xB2C8;&#xCF58;, $8,000&#xB9CC; ARR, 12&#xB9CC;+ &#xC0AC;&#xC6A9;&#xC790;. &#xADF8;&#xB7EC;&#xB098; ChatGPT &#xCD9C;&#xC2DC;(2022&#xB144; 11&#xC6D4;)&#xAC00; &quot;&#xC0AC;&#xC2E4;&#xC0C1; &#xD558;&#xB8FB;&#xBC24; &#xC0AC;&#xC774;&#xC5D0; &#xAC15;&#xB825;&#xD55C; &#xC800;&#xBE44;&#xC6A9; &#xACBD;&#xC7C1;&#xC790;&quot;&#xB97C; &#xB9CC;&#xB4E4;&#xC5C8;&#xB2E4;.&#xA0;<a href="https://www.maginative.com/article/jasper-cuts-internal-valuation-as-ai-growth-slows/?ref=keun.me">Maginative</a>&#xA0;2023&#xB144; CEO &#xAD50;&#xCCB4;, &#xB0B4;&#xBD80; &#xBC38;&#xB958;&#xC5D0;&#xC774;&#xC158;&#xA0;<strong>20% &#xD558;&#xB77D;</strong>,&#xA0;<a href="https://www.fastcompany.com/91033469/jasper-most-innovative-companies-2024?ref=keun.me">Fast Company</a>&#xA0;ARR &#xC608;&#xCE21;&#xA0;<strong>30%+ &#xD558;&#xD5A5;</strong>.&#xA0;<a href="https://www.maginative.com/article/jasper-cuts-internal-valuation-as-ai-growth-slows/?ref=keun.me">Maginative</a>&#xA0;OpenAI &#xBAA8;&#xB378;&#xC5D0; &#xB300;&#xD55C; &#xACFC;&#xC758;&#xC874;&#xACFC; &#xCC28;&#xBCC4;&#xD654; &#xBD80;&#xC7AC;&#xAC00; &#xC6D0;&#xC778;&#xC774;&#xC5C8;&#xB2E4;.</p><p>&#xC774;&#xD6C4; &#xB9C8;&#xCF00;&#xD305; &#xD300; &#xC804;&#xC6A9;&#xC73C;&#xB85C; &#xD53C;&#xBC97;&#xD574; &#xC5D4;&#xD130;&#xD504;&#xB77C;&#xC774;&#xC988; ARR&#xA0;<strong>400% &#xC131;&#xC7A5;</strong>&#xC744; &#xAE30;&#xB85D;&#xD588;&#xC9C0;&#xB9CC;,&#xA0;<a href="https://www.fastcompany.com/91033469/jasper-most-innovative-companies-2024?ref=keun.me">Fast Company</a>&#xA0;&quot;first-mover advantage&#xB294; &#xC77C;&#xC2DC;&#xC801;&quot;&#xC774;&#xB77C;&#xB294; &#xAD50;&#xD6C8;&#xC744; &#xB0A8;&#xACBC;&#xB2E4;.</p><h3 id="ai-os-%EA%B0%9C%EB%85%90%EC%9D%98-%ED%98%84%EC%8B%A4">&quot;AI OS&quot; &#xAC1C;&#xB150;&#xC758; &#xD604;&#xC2E4;</h3><p>&quot;AI OS&quot;&#xB294; &#xB300;&#xBD80;&#xBD84; &#xB9C8;&#xCF00;&#xD305; &#xC6A9;&#xC5B4;&#xC5D0; &#xAC00;&#xAE5D;&#xB2E4;.&#xA0;<strong>&#xC2E4;&#xC81C;&#xB85C; &#xC2E4;&#xD589; &#xAC00;&#xB2A5;&#xD55C; &#xAC83;&#xC740; Microsoft Copilot &#xC0DD;&#xD0DC;&#xACC4;</strong>&#xB2E4;&#x2014;Windows, Office, Edge &#xC804;&#xBC18;&#xC5D0; &#xAC78;&#xCE5C; AI &#xB808;&#xC774;&#xC5B4;&#xC640; &quot;Windows&#xAC00; &#xC5D0;&#xC774;&#xC804;&#xD2F1; OS&#xB85C; &#xC9C4;&#xD654;&quot; &#xBE44;&#xC804;. Notion AI&#xB294; Notion &#xB370;&#xC774;&#xD130;&#xC5D0;&#xB9CC; &#xC81C;&#xD55C;&#xB418;&#xC5B4; &quot;&#xAE30;&#xB2A5;&quot;&#xC5D0; &#xBD88;&#xACFC;&#xD558;&#xACE0;, Rabbit R1/Humane&#xC740; &#xD558;&#xB4DC;&#xC6E8;&#xC5B4; &#xC6B0;&#xC120; &#xC811;&#xADFC;&#xC774; &#xCC44;&#xD0DD;&#xC5D0; &#xC2E4;&#xD328;&#xD588;&#xB2E4;.&#xA0;<a href="https://themediagen.org/ai-operating-systems-2025/?ref=keun.me">The Media Gen</a></p><p>&#xC2A4;&#xD0C0;&#xD2B8;&#xC5C5;&#xC774; &#xC9C4;&#xC815;&#xD55C; &quot;OS&quot;&#xAC00; &#xB418;&#xB294; &#xAC83;&#xC740; &#xBE44;&#xD604;&#xC2E4;&#xC801;&#xC774;&#xB2E4;. &#xB300;&#xC2E0; **&#xD2B9;&#xC815; &#xB3C4;&#xBA54;&#xC778;&#xC758; &quot;&#xC2DC;&#xC2A4;&#xD15C; &#xC624;&#xBE0C; &#xB808;&#xCF54;&#xB4DC;&quot;**&#xAC00; &#xB418;&#xB294; &#xAC83;&#xC774; &#xB2EC;&#xC131; &#xAC00;&#xB2A5;&#xD55C; &#xBAA9;&#xD45C;&#xB2E4;.</p><hr><h2 id="%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-%ED%9A%A8%EA%B3%BC%EC%99%80-lock-in-%EA%B5%AC%EC%B6%95-%EC%86%8C%EA%B7%9C%EB%AA%A8-%ED%8C%80%EC%9D%98-%EB%B0%A9%EC%96%B4%EB%A0%A5">&#xB124;&#xD2B8;&#xC6CC;&#xD06C; &#xD6A8;&#xACFC;&#xC640; Lock-in &#xAD6C;&#xCD95;: &#xC18C;&#xADDC;&#xBAA8; &#xD300;&#xC758; &#xBC29;&#xC5B4;&#xB825;</h2><h3 id="%EC%8B%A4%EC%A0%9C%EB%A1%9C-%EC%9E%91%EB%8F%99%ED%95%98%EB%8A%94-lock-in-%EB%A9%94%EC%BB%A4%EB%8B%88%EC%A6%98">&#xC2E4;&#xC81C;&#xB85C; &#xC791;&#xB3D9;&#xD558;&#xB294; Lock-in &#xBA54;&#xCEE4;&#xB2C8;&#xC998;</h3><p>AI &#xD50C;&#xB7AB;&#xD3FC;&#xC5D0;&#xC11C; &#xC791;&#xB3D9;&#xD558;&#xB294; &#xB124;&#xD2B8;&#xC6CC;&#xD06C; &#xD6A8;&#xACFC;&#xB294; &#xC81C;&#xD55C;&#xC801;&#xC774;&#xB2E4;. a16z&#xB294; &quot;&#xB370;&#xC774;&#xD130; &#xB124;&#xD2B8;&#xC6CC;&#xD06C; &#xD6A8;&#xACFC;&#xC5D0; &#xB300;&#xD55C; &#xB300;&#xBD80;&#xBD84;&#xC758; &#xB0B4;&#xB7EC;&#xD2F0;&#xBE0C;&#xB294; &#xC2E4;&#xC81C;&#xB85C;&#xB294; &#xB370;&#xC774;&#xD130; &#xC2A4;&#xCF00;&#xC77C; &#xD6A8;&#xACFC;&quot;&#xB77C;&#xACE0; &#xACBD;&#xACE0;&#xD55C;&#xB2E4;. &#xADF8;&#xB7EC;&#xB098; &#xB2E4;&#xC74C;&#xC740; &#xC2E4;&#xC81C;&#xB85C; &#xC791;&#xB3D9;&#xD55C;&#xB2E4;:</p><ol><li><strong>&#xD53C;&#xB4DC;&#xBC31; &#xB8E8;&#xD504; &#xD6A8;&#xACFC;</strong>: &#xC778;&#xAC04;&#xC758; &#xC2B9;&#xC778;/&#xAC70;&#xBD80;&#xAC00; AI &#xCD9C;&#xB825;&#xC744; &#xAC1C;&#xC120; (Harvey&#xC758; &#xBCC0;&#xD638;&#xC0AC; &#xAC80;&#xC99D;)</li><li><strong>&#xB204;&#xC801;&#xB41C; &#xB9E5;&#xB77D;</strong>: &#xC7AC;&#xC0DD;&#xC131; &#xBD88;&#xAC00;&#xB2A5;&#xD55C; &#xC870;&#xC9C1; &#xC9C0;&#xC2DD; &#xADF8;&#xB798;&#xD504;</li><li><strong>&#xB525; &#xC778;&#xD14C;&#xADF8;&#xB808;&#xC774;&#xC158;</strong>: &#xAC1C;&#xBC1C;&#xC790; 200+ &#xC2DC;&#xAC04;&#xC758; &#xC804;&#xD658; &#xBE44;&#xC6A9; &#xCC3D;&#xCD9C;</li><li><strong>&#xCEF4;&#xD50C;&#xB77C;&#xC774;&#xC5B8;&#xC2A4;/&#xBCF4;&#xC548; &#xD22C;&#xC790;</strong>: FedRAMP, SOC2, HIPAA &#xC778;&#xC99D;&#xC774; &#xC804;&#xD658; &#xB9C8;&#xCC30; &#xC0DD;&#xC131;</li><li><strong>&#xCEE4;&#xC2A4;&#xD140; &#xBAA8;&#xB378; &#xD6C8;&#xB828;</strong>: &#xAE30;&#xC5C5; &#xD2B9;&#xD654; &#xB370;&#xC774;&#xD130;&#xB85C; &#xD6C8;&#xB828;&#xB41C; &#xBAA8;&#xB378;</li></ol><p><strong>&#xD575;&#xC2EC; &#xC6D0;&#xCE59;</strong>: &quot;SaaS&#xC758; &#xC9C4;&#xC815;&#xD55C; &#xC131;&#xACF5;&#xC740; &#xB5A0;&#xB098;&#xAE30; &#xC5B4;&#xB824;&#xC6B4; &#xAC83;&#xC774; &#xC544;&#xB2C8;&#xB77C;,&#xA0;<strong>&#xB300;&#xCCB4;&#xD558;&#xAE30; &#xC5B4;&#xB824;&#xC6B4; &#xAC83;</strong>&#xC774;&#xB2E4;.&quot;&#xA0;<a href="https://medium.com/design-bootcamp/vendor-lock-in-in-saas-trap-or-strategy-fbac1369d201?ref=keun.me">Medium</a></p><h3 id="%EB%8D%B0%EC%9D%B4%ED%84%B0-%ED%95%B4%EC%9E%90-%EA%B5%AC%EC%B6%95-%EC%84%B1%EA%B3%B5%ED%95%98%EB%8A%94-%EC%A0%84%EB%9E%B5">&#xB370;&#xC774;&#xD130; &#xD574;&#xC790; &#xAD6C;&#xCD95;: &#xC131;&#xACF5;&#xD558;&#xB294; &#xC804;&#xB7B5;</h3><p><strong>&#xC131;&#xACF5;&#xD558;&#xB294; &#xC811;&#xADFC;</strong>:</p><ul><li>&#xC0AC;&#xC6A9;&#xC5D0; &#xB530;&#xB978;&#xA0;<strong>&#xB3C5;&#xC810; &#xB370;&#xC774;&#xD130; &#xC0DD;&#xC131;</strong>&#xA0;(&#xC13C;&#xC11C;, &#xD2B9;&#xC218; &#xC0B0;&#xC5C5; &#xB370;&#xC774;&#xD130; &#xCEA1;&#xCC98;)</li><li><strong>&#xD050;&#xB808;&#xC774;&#xC158;&#xB41C; &#xC0B0;&#xC5C5; &#xB370;&#xC774;&#xD130;&#xC14B;</strong>&#xA0;(&#xBC95;&#xB960;, &#xD5EC;&#xC2A4;&#xCF00;&#xC5B4;, &#xAE08;&#xC735; &#xD2B9;&#xD654;)</li><li><strong>&#xC6B4;&#xC601; &#xB370;&#xC774;&#xD130; &#xCD95;&#xC801;</strong>&#xA0;(&#xBAA8;&#xB4E0; &#xACE0;&#xAC1D; &#xC778;&#xD130;&#xB799;&#xC158;&#xC774; &#xBAA8;&#xB378; &#xAC1C;&#xC120;)</li><li><strong>&#xC2E0;&#xB8B0;&#xBC1B;&#xB294; &#xC218;&#xD0C1;&#xC790; &#xC9C0;&#xC704;</strong>&#xA0;(&#xB2E4;&#xB978; &#xAE30;&#xC5C5;&#xC774; &#xC811;&#xADFC;&#xD560; &#xC218; &#xC5C6;&#xB294; &#xBBFC;&#xAC10; &#xB370;&#xC774;&#xD130; &#xAD8C;&#xD55C; &#xD68D;&#xB4DD;)</li></ul><p><strong>&#xC2E4;&#xD328;&#xD558;&#xB294; &#xC811;&#xADFC;</strong>:</p><ul><li>&#xD53C;&#xB4DC;&#xBC31; &#xB8E8;&#xD504; &#xC5C6;&#xC774; &#xB370;&#xC774;&#xD130;=&#xD574;&#xC790;&#xB77C;&#xACE0; &#xAC00;&#xC815;</li><li>&#xC27D;&#xAC8C; &#xBCF5;&#xC81C;&#xB418;&#xB294; &#xC77C;&#xBC18; &#xB370;&#xC774;&#xD130;</li><li>&#xB354; &#xB098;&#xC740; &#xC81C;&#xD488;&#xC73C;&#xB85C; &#xBCF5;&#xB9AC;&#xD654;&#xB418;&#xC9C0; &#xC54A;&#xB294; &#xB370;&#xC774;&#xD130;</li></ul>]]></content:encoded></item><item><title><![CDATA[systemd로 Node.js 애플리케이션을 서비스화하기]]></title><description><![CDATA[<h1 id="systemd%EB%A1%9C-nodejs-%EC%95%A0%ED%94%8C%EB%A6%AC%EC%BC%80%EC%9D%B4%EC%85%98%EC%9D%84-%EC%84%9C%EB%B9%84%EC%8A%A4%ED%99%94%ED%95%98%EA%B8%B0">systemd&#xB85C; Node.js &#xC560;&#xD50C;&#xB9AC;&#xCF00;&#xC774;&#xC158;&#xC744; &#xC11C;&#xBE44;&#xC2A4;&#xD654;&#xD558;&#xAE30;</h1><p>&#xC11C;&#xBC84;&#xC5D0;&#xC11C; Node.js &#xC560;&#xD50C;&#xB9AC;&#xCF00;&#xC774;&#xC158;&#xC744; &#xC6B4;&#xC601;&#xD560; &#xB54C;, &#xB2E8;&#xC21C;&#xD788; <code>node app.js</code>&#xB85C; &#xC2E4;&#xD589;&#xD558;&#xBA74; &#xD130;&#xBBF8;&#xB110;&#xC774; &#xC885;</p>]]></description><link>https://keun.me/systemd/</link><guid isPermaLink="false">68ac02e30d908c000122dceb</guid><dc:creator><![CDATA[Keun.R]]></dc:creator><pubDate>Mon, 25 Aug 2025 06:30:35 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1725546519821-cd3f0f908fe5?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDR8fHN5c3RlbWR8ZW58MHx8fHwxNzU2MTAzNDAwfDA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=2000" medium="image"/><content:encoded><![CDATA[<h1 id="systemd%EB%A1%9C-nodejs-%EC%95%A0%ED%94%8C%EB%A6%AC%EC%BC%80%EC%9D%B4%EC%85%98%EC%9D%84-%EC%84%9C%EB%B9%84%EC%8A%A4%ED%99%94%ED%95%98%EA%B8%B0">systemd&#xB85C; Node.js &#xC560;&#xD50C;&#xB9AC;&#xCF00;&#xC774;&#xC158;&#xC744; &#xC11C;&#xBE44;&#xC2A4;&#xD654;&#xD558;&#xAE30;</h1><img src="https://images.unsplash.com/photo-1725546519821-cd3f0f908fe5?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDR8fHN5c3RlbWR8ZW58MHx8fHwxNzU2MTAzNDAwfDA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=2000" alt="systemd&#xB85C; Node.js &#xC560;&#xD50C;&#xB9AC;&#xCF00;&#xC774;&#xC158;&#xC744; &#xC11C;&#xBE44;&#xC2A4;&#xD654;&#xD558;&#xAE30;"><p>&#xC11C;&#xBC84;&#xC5D0;&#xC11C; Node.js &#xC560;&#xD50C;&#xB9AC;&#xCF00;&#xC774;&#xC158;&#xC744; &#xC6B4;&#xC601;&#xD560; &#xB54C;, &#xB2E8;&#xC21C;&#xD788; <code>node app.js</code>&#xB85C; &#xC2E4;&#xD589;&#xD558;&#xBA74; &#xD130;&#xBBF8;&#xB110;&#xC774; &#xC885;&#xB8CC;&#xB418;&#xAC70;&#xB098; &#xC560;&#xD50C;&#xB9AC;&#xCF00;&#xC774;&#xC158;&#xC774; &#xD06C;&#xB798;&#xC2DC;&#xB420; &#xB54C; &#xC11C;&#xBE44;&#xC2A4;&#xAC00; &#xC911;&#xB2E8;&#xB429;&#xB2C8;&#xB2E4;. &#xC774;&#xB7F0; &#xBB38;&#xC81C;&#xB97C; &#xD574;&#xACB0;&#xD558;&#xAE30; &#xC704;&#xD574; <strong>systemd</strong>&#xB97C; &#xD65C;&#xC6A9;&#xD574; Node.js &#xC560;&#xD50C;&#xB9AC;&#xCF00;&#xC774;&#xC158;&#xC744; &#xC2DC;&#xC2A4;&#xD15C; &#xC11C;&#xBE44;&#xC2A4;&#xB85C; &#xAD00;&#xB9AC;&#xD558;&#xB294; &#xBC29;&#xBC95;&#xC744; &#xC54C;&#xC544;&#xBCF4;&#xACA0;&#xC2B5;&#xB2C8;&#xB2E4;.</p><h2 id="systemd%EB%9E%80">systemd&#xB780;?</h2><p>systemd&#xB294; Linux &#xC2DC;&#xC2A4;&#xD15C;&#xC758; <strong>init &#xC2DC;&#xC2A4;&#xD15C;</strong>&#xC73C;&#xB85C;, &#xC2DC;&#xC2A4;&#xD15C; &#xBD80;&#xD305; &#xACFC;&#xC815;&#xACFC; &#xC11C;&#xBE44;&#xC2A4; &#xAD00;&#xB9AC;&#xB97C; &#xB2F4;&#xB2F9;&#xD569;&#xB2C8;&#xB2E4;. Ubuntu 16.04&#xBD80;&#xD130; &#xAE30;&#xBCF8; init &#xC2DC;&#xC2A4;&#xD15C;&#xC73C;&#xB85C; &#xCC44;&#xD0DD;&#xB418;&#xC5C8;&#xC73C;&#xBA70;, &#xAC15;&#xB825;&#xD55C; &#xC11C;&#xBE44;&#xC2A4; &#xAD00;&#xB9AC; &#xAE30;&#xB2A5;&#xC744; &#xC81C;&#xACF5;&#xD569;&#xB2C8;&#xB2E4;.</p><h2 id="%EA%B8%B0%EC%A1%B4-%EC%8B%A4%ED%96%89-%EB%B0%A9%EB%B2%95%EB%93%A4%EA%B3%BC%EC%9D%98-%EB%B9%84%EA%B5%90">&#xAE30;&#xC874; &#xC2E4;&#xD589; &#xBC29;&#xBC95;&#xB4E4;&#xACFC;&#xC758; &#xBE44;&#xAD50;</h2><h3 id="1-%EC%A7%81%EC%A0%91-%EC%8B%A4%ED%96%89-node-appjs">1. &#xC9C1;&#xC811; &#xC2E4;&#xD589; (<code>node app.js</code>)</h3><pre><code class="language-bash">node app.js
# &#xB610;&#xB294;
yarn start
</code></pre><p><strong>&#xB2E8;&#xC810;:</strong></p><ul><li>&#xD130;&#xBBF8;&#xB110; &#xC885;&#xB8CC; &#xC2DC; &#xD504;&#xB85C;&#xC138;&#xC2A4; &#xC885;&#xB8CC;</li><li>&#xD06C;&#xB798;&#xC2DC; &#xC2DC; &#xC790;&#xB3D9; &#xC7AC;&#xC2DC;&#xC791; &#xBD88;&#xAC00;</li><li>&#xC2DC;&#xC2A4;&#xD15C; &#xBD80;&#xD305; &#xC2DC; &#xC790;&#xB3D9; &#xC2DC;&#xC791; &#xBD88;&#xAC00;</li><li>&#xB85C;&#xADF8; &#xAD00;&#xB9AC; &#xC5B4;&#xB824;&#xC6C0;</li></ul><h3 id="2-nohup-%EC%82%AC%EC%9A%A9">2. nohup &#xC0AC;&#xC6A9;</h3><pre><code class="language-bash">nohup yarn start &gt; app.log 2&gt;&amp;1 &amp;
</code></pre><p><strong>&#xC7A5;&#xC810;:</strong></p><ul><li>&#xD130;&#xBBF8;&#xB110; &#xC885;&#xB8CC;&#xB418;&#xC5B4;&#xB3C4; &#xC2E4;&#xD589; &#xC9C0;&#xC18D;</li><li>&#xAC04;&#xB2E8;&#xD55C; &#xB85C;&#xADF8; &#xAD00;&#xB9AC;</li></ul><p><strong>&#xB2E8;&#xC810;:</strong></p><ul><li>&#xD06C;&#xB798;&#xC2DC; &#xC2DC; &#xC790;&#xB3D9; &#xC7AC;&#xC2DC;&#xC791; &#xBD88;&#xAC00;</li><li>&#xD504;&#xB85C;&#xC138;&#xC2A4; &#xAD00;&#xB9AC; &#xBC88;&#xAC70;&#xB85C;&#xC6C0;</li><li>&#xC2DC;&#xC2A4;&#xD15C; &#xBD80;&#xD305; &#xC2DC; &#xC790;&#xB3D9; &#xC2DC;&#xC791; &#xBD88;&#xAC00;</li></ul><h3 id="3-pm2-%EC%82%AC%EC%9A%A9">3. PM2 &#xC0AC;&#xC6A9;</h3><pre><code class="language-bash">pm2 start yarn --name &quot;app&quot; -- start
</code></pre><p><strong>&#xC7A5;&#xC810;:</strong></p><ul><li>&#xC790;&#xB3D9; &#xC7AC;&#xC2DC;&#xC791;</li><li>&#xB85C;&#xB4DC; &#xBC38;&#xB7F0;&#xC2F1;</li><li>&#xC2E4;&#xC2DC;&#xAC04; &#xBAA8;&#xB2C8;&#xD130;&#xB9C1;</li><li>&#xD074;&#xB7EC;&#xC2A4;&#xD130; &#xBAA8;&#xB4DC;</li></ul><p><strong>&#xB2E8;&#xC810;:</strong></p><ul><li>&#xCD94;&#xAC00; &#xD328;&#xD0A4;&#xC9C0; &#xC124;&#xCE58; &#xD544;&#xC694;</li><li>PM2 &#xC790;&#xCCB4; &#xAD00;&#xB9AC; &#xD544;&#xC694;</li><li>&#xBA54;&#xBAA8;&#xB9AC; &#xC624;&#xBC84;&#xD5E4;&#xB4DC;</li></ul><h3 id="4-systemd-%EC%82%AC%EC%9A%A9-%E2%AD%90">4. systemd &#xC0AC;&#xC6A9; &#x2B50;</h3><pre><code class="language-bash">sudo systemctl start my-app
</code></pre><p><strong>&#xC7A5;&#xC810;:</strong></p><ul><li>&#xC2DC;&#xC2A4;&#xD15C; &#xB808;&#xBCA8; &#xAD00;&#xB9AC;</li><li>&#xBD80;&#xD305; &#xC2DC; &#xC790;&#xB3D9; &#xC2DC;&#xC791;</li><li>&#xAC15;&#xB825;&#xD55C; &#xC7AC;&#xC2DC;&#xC791; &#xC815;&#xCC45;</li><li>&#xD45C;&#xC900;&#xD654;&#xB41C; &#xB85C;&#xADF8; &#xAD00;&#xB9AC;</li><li>&#xB9AC;&#xC18C;&#xC2A4; &#xC81C;&#xD55C; &#xAC00;&#xB2A5;</li><li>&#xC758;&#xC874;&#xC131; &#xAD00;&#xB9AC;</li></ul><h2 id="systemd-%EC%84%9C%EB%B9%84%EC%8A%A4-%EC%84%A4%EC%A0%95%ED%95%98%EA%B8%B0">systemd &#xC11C;&#xBE44;&#xC2A4; &#xC124;&#xC815;&#xD558;&#xAE30;</h2><h3 id="1-%EC%84%9C%EB%B9%84%EC%8A%A4-%ED%8C%8C%EC%9D%BC-%EC%83%9D%EC%84%B1">1. &#xC11C;&#xBE44;&#xC2A4; &#xD30C;&#xC77C; &#xC0DD;&#xC131;</h3><p><code>/etc/systemd/system/my-app.service</code> &#xD30C;&#xC77C;&#xC744; &#xC0DD;&#xC131;&#xD569;&#xB2C8;&#xB2E4;:</p><pre><code class="language-ini">[Unit]
Description=My Node.js Application
After=network.target

[Service]
Type=simple
User=ubuntu
WorkingDirectory=/home/ubuntu/my-app
Environment=NODE_ENV=production
Environment=PORT=3000
ExecStart=/usr/bin/yarn start
Restart=always
RestartSec=10
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=my-app

[Install]
WantedBy=multi-user.target
</code></pre><h3 id="2-%EC%A3%BC%EC%9A%94-%EC%84%A4%EC%A0%95-%EC%98%B5%EC%85%98-%EC%84%A4%EB%AA%85">2. &#xC8FC;&#xC694; &#xC124;&#xC815; &#xC635;&#xC158; &#xC124;&#xBA85;</h3><h4 id="unit-%EC%84%B9%EC%85%98">[Unit] &#xC139;&#xC158;</h4><ul><li><code>Description</code>: &#xC11C;&#xBE44;&#xC2A4; &#xC124;&#xBA85;</li><li><code>After</code>: &#xB124;&#xD2B8;&#xC6CC;&#xD06C;&#xAC00; &#xD65C;&#xC131;&#xD654;&#xB41C; &#xD6C4; &#xC2DC;&#xC791;</li></ul><h4 id="service-%EC%84%B9%EC%85%98">[Service] &#xC139;&#xC158;</h4><ul><li><code>Type=simple</code>: &#xB2E8;&#xC21C;&#xD55C; &#xD3EC;&#xADF8;&#xB77C;&#xC6B4;&#xB4DC; &#xD504;&#xB85C;&#xC138;&#xC2A4;</li><li><code>User</code>: &#xC2E4;&#xD589;&#xD560; &#xC0AC;&#xC6A9;&#xC790;</li><li><code>WorkingDirectory</code>: &#xC791;&#xC5C5; &#xB514;&#xB809;&#xD1A0;&#xB9AC;</li><li><code>Environment</code>: &#xD658;&#xACBD; &#xBCC0;&#xC218; &#xC124;&#xC815;</li><li><code>ExecStart</code>: &#xC2E4;&#xD589;&#xD560; &#xBA85;&#xB839;&#xC5B4;</li><li><code>Restart=always</code>: &#xD56D;&#xC0C1; &#xC7AC;&#xC2DC;&#xC791;</li><li><code>RestartSec=10</code>: &#xC7AC;&#xC2DC;&#xC791; &#xB300;&#xAE30; &#xC2DC;&#xAC04; (&#xCD08;)</li></ul><h4 id="install-%EC%84%B9%EC%85%98">[Install] &#xC139;&#xC158;</h4><ul><li><code>WantedBy=multi-user.target</code>: &#xBA40;&#xD2F0;&#xC720;&#xC800; &#xBAA8;&#xB4DC;&#xC5D0;&#xC11C; &#xC790;&#xB3D9; &#xC2DC;&#xC791;</li></ul><h3 id="3-%EC%84%9C%EB%B9%84%EC%8A%A4-%EB%93%B1%EB%A1%9D-%EB%B0%8F-%EC%8B%A4%ED%96%89">3. &#xC11C;&#xBE44;&#xC2A4; &#xB4F1;&#xB85D; &#xBC0F; &#xC2E4;&#xD589;</h3><pre><code class="language-bash"># &#xC11C;&#xBE44;&#xC2A4; &#xD30C;&#xC77C; &#xB2E4;&#xC2DC; &#xB85C;&#xB4DC;
sudo systemctl daemon-reload

# &#xC11C;&#xBE44;&#xC2A4; &#xD65C;&#xC131;&#xD654; (&#xBD80;&#xD305; &#xC2DC; &#xC790;&#xB3D9; &#xC2DC;&#xC791;)
sudo systemctl enable my-app

# &#xC11C;&#xBE44;&#xC2A4; &#xC2DC;&#xC791;
sudo systemctl start my-app

# &#xC11C;&#xBE44;&#xC2A4; &#xC0C1;&#xD0DC; &#xD655;&#xC778;
sudo systemctl status my-app
</code></pre><h2 id="%EA%B3%A0%EA%B8%89-%EC%84%A4%EC%A0%95-%EC%98%B5%EC%85%98">&#xACE0;&#xAE09; &#xC124;&#xC815; &#xC635;&#xC158;</h2><h3 id="%EC%9E%AC%EC%8B%9C%EC%9E%91-%EC%A0%95%EC%B1%85">&#xC7AC;&#xC2DC;&#xC791; &#xC815;&#xCC45;</h3><pre><code class="language-ini">[Service]
Restart=on-failure          # &#xC2E4;&#xD328; &#xC2DC;&#xC5D0;&#xB9CC; &#xC7AC;&#xC2DC;&#xC791;
RestartSec=5                # 5&#xCD08; &#xD6C4; &#xC7AC;&#xC2DC;&#xC791;
StartLimitInterval=60       # 60&#xCD08; &#xAC04;&#xACA9; &#xB0B4;&#xC5D0;&#xC11C;
StartLimitBurst=3           # &#xCD5C;&#xB300; 3&#xBC88;&#xAE4C;&#xC9C0; &#xC7AC;&#xC2DC;&#xC791; &#xC2DC;&#xB3C4;
</code></pre><h3 id="%EB%A6%AC%EC%86%8C%EC%8A%A4-%EC%A0%9C%ED%95%9C">&#xB9AC;&#xC18C;&#xC2A4; &#xC81C;&#xD55C;</h3><pre><code class="language-ini">[Service]
MemoryLimit=512M            # &#xBA54;&#xBAA8;&#xB9AC; &#xC81C;&#xD55C;
CPUQuota=50%               # CPU &#xC0AC;&#xC6A9;&#xB960; &#xC81C;&#xD55C;
TasksMax=20                # &#xCD5C;&#xB300; &#xD504;&#xB85C;&#xC138;&#xC2A4;/&#xC2A4;&#xB808;&#xB4DC; &#xC218;
</code></pre><h3 id="%EB%B3%B4%EC%95%88-%EC%84%A4%EC%A0%95">&#xBCF4;&#xC548; &#xC124;&#xC815;</h3><pre><code class="language-ini">[Service]
NoNewPrivileges=true        # &#xC0C8;&#xB85C;&#xC6B4; &#xAD8C;&#xD55C; &#xD68D;&#xB4DD; &#xBC29;&#xC9C0;
ProtectSystem=strict        # &#xC2DC;&#xC2A4;&#xD15C; &#xB514;&#xB809;&#xD1A0;&#xB9AC; &#xC4F0;&#xAE30; &#xBC29;&#xC9C0;
ProtectHome=true           # &#xD648; &#xB514;&#xB809;&#xD1A0;&#xB9AC; &#xC811;&#xADFC; &#xC81C;&#xD55C;
</code></pre><h2 id="%EC%84%9C%EB%B9%84%EC%8A%A4-%EA%B4%80%EB%A6%AC-%EB%AA%85%EB%A0%B9%EC%96%B4">&#xC11C;&#xBE44;&#xC2A4; &#xAD00;&#xB9AC; &#xBA85;&#xB839;&#xC5B4;</h2><h3 id="%EA%B8%B0%EB%B3%B8-%EB%AA%85%EB%A0%B9%EC%96%B4">&#xAE30;&#xBCF8; &#xBA85;&#xB839;&#xC5B4;</h3><pre><code class="language-bash"># &#xC11C;&#xBE44;&#xC2A4; &#xC2DC;&#xC791;/&#xC911;&#xC9C0;/&#xC7AC;&#xC2DC;&#xC791;
sudo systemctl start my-app
sudo systemctl stop my-app
sudo systemctl restart my-app

# &#xC11C;&#xBE44;&#xC2A4; &#xC0C1;&#xD0DC; &#xD655;&#xC778;
sudo systemctl status my-app

# &#xC11C;&#xBE44;&#xC2A4; &#xD65C;&#xC131;&#xD654;/&#xBE44;&#xD65C;&#xC131;&#xD654; (&#xBD80;&#xD305; &#xC2DC; &#xC790;&#xB3D9; &#xC2DC;&#xC791;)
sudo systemctl enable my-app
sudo systemctl disable my-app
</code></pre><h3 id="%EB%A1%9C%EA%B7%B8-%EA%B4%80%EB%A6%AC">&#xB85C;&#xADF8; &#xAD00;&#xB9AC;</h3><pre><code class="language-bash"># &#xC2E4;&#xC2DC;&#xAC04; &#xB85C;&#xADF8; &#xBCF4;&#xAE30;
sudo journalctl -u my-app -f

# &#xCD5C;&#xADFC; &#xB85C;&#xADF8; &#xD655;&#xC778;
sudo journalctl -u my-app -n 50

# &#xD2B9;&#xC815; &#xC2DC;&#xAC04; &#xBC94;&#xC704; &#xB85C;&#xADF8;
sudo journalctl -u my-app --since &quot;2024-01-01&quot; --until &quot;2024-01-02&quot;
</code></pre><h2 id="%EC%9E%90%EB%8F%99%ED%99%94-%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EC%98%88%EC%A0%9C">&#xC790;&#xB3D9;&#xD654; &#xC2A4;&#xD06C;&#xB9BD;&#xD2B8; &#xC608;&#xC81C;</h2><p>&#xC2E4;&#xC81C; &#xC6B4;&#xC601; &#xD658;&#xACBD;&#xC5D0;&#xC11C; &#xC0AC;&#xC6A9;&#xD560; &#xC218; &#xC788;&#xB294; &#xBC30;&#xD3EC; &#xC2A4;&#xD06C;&#xB9BD;&#xD2B8;:</p><h3 id="setup-servicesh">setup-service.sh</h3><pre><code class="language-bash">#!/bin/bash

SERVICE_NAME=&quot;my-app&quot;
WORK_DIR=&quot;/home/ubuntu/my-app&quot;
USER=&quot;ubuntu&quot;

# &#xC11C;&#xBE44;&#xC2A4; &#xD30C;&#xC77C; &#xC0DD;&#xC131;
sudo tee /etc/systemd/system/$SERVICE_NAME.service &gt; /dev/null &lt;&lt; EOL
[Unit]
Description=My Node.js Application
After=network.target

[Service]
Type=simple
User=$USER
WorkingDirectory=$WORK_DIR
Environment=NODE_ENV=production
Environment=PORT=3000
ExecStart=$WORK_DIR/start.sh
Restart=always
RestartSec=10
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=$SERVICE_NAME

[Install]
WantedBy=multi-user.target
EOL

# &#xC2E4;&#xD589; &#xC2A4;&#xD06C;&#xB9BD;&#xD2B8; &#xC0DD;&#xC131;
tee $WORK_DIR/start.sh &gt; /dev/null &lt;&lt; EOL
#!/bin/bash
cd $WORK_DIR
yarn start
EOL

chmod +x $WORK_DIR/start.sh

# systemd &#xB4F1;&#xB85D;
sudo systemctl daemon-reload
sudo systemctl enable $SERVICE_NAME

echo &quot;&#x2705; Service setup complete!&quot;
</code></pre><h3 id="deploysh">deploy.sh</h3><pre><code class="language-bash">#!/bin/bash

SERVICE_NAME=&quot;my-app&quot;

echo &quot;&#x1F504; Stopping service...&quot;
sudo systemctl stop $SERVICE_NAME

echo &quot;&#x1F4E6; Pulling latest code...&quot;
git pull origin main

echo &quot;&#x1F528; Building application...&quot;
yarn build

echo &quot;&#x1F680; Starting service...&quot;
sudo systemctl start $SERVICE_NAME

echo &quot;&#x2705; Deployment complete!&quot;
sudo systemctl status $SERVICE_NAME --no-pager
</code></pre><h2 id="systemd%EC%9D%98-%EC%9E%A5%EB%8B%A8%EC%A0%90">systemd&#xC758; &#xC7A5;&#xB2E8;&#xC810;</h2><h3 id="%EC%9E%A5%EC%A0%90-%E2%9C%85">&#xC7A5;&#xC810; &#x2705;</h3><ol><li><strong>&#xC2DC;&#xC2A4;&#xD15C; &#xD1B5;&#xD569;</strong>: Linux &#xC2DC;&#xC2A4;&#xD15C;&#xACFC; &#xC644;&#xBCBD;&#xD558;&#xAC8C; &#xD1B5;&#xD569;</li><li><strong>&#xC790;&#xB3D9; &#xC7AC;&#xC2DC;&#xC791;</strong>: &#xD06C;&#xB798;&#xC2DC; &#xC2DC; &#xC790;&#xB3D9;&#xC73C;&#xB85C; &#xC7AC;&#xC2DC;&#xC791;</li><li><strong>&#xBD80;&#xD305; &#xC2DC; &#xC790;&#xB3D9; &#xC2DC;&#xC791;</strong>: &#xC11C;&#xBC84; &#xC7AC;&#xBD80;&#xD305; &#xD6C4; &#xC790;&#xB3D9;&#xC73C;&#xB85C; &#xC11C;&#xBE44;&#xC2A4; &#xC2DC;&#xC791;</li><li><strong>&#xAC15;&#xB825;&#xD55C; &#xB85C;&#xADF8; &#xAD00;&#xB9AC;</strong>: journald&#xB97C; &#xD1B5;&#xD55C; &#xCCB4;&#xACC4;&#xC801;&#xC778; &#xB85C;&#xADF8; &#xAD00;&#xB9AC;</li><li><strong>&#xB9AC;&#xC18C;&#xC2A4; &#xC81C;&#xC5B4;</strong>: CPU, &#xBA54;&#xBAA8;&#xB9AC; &#xB4F1; &#xB9AC;&#xC18C;&#xC2A4; &#xC0AC;&#xC6A9;&#xB7C9; &#xC81C;&#xD55C; &#xAC00;&#xB2A5;</li><li><strong>&#xC758;&#xC874;&#xC131; &#xAD00;&#xB9AC;</strong>: &#xB2E4;&#xB978; &#xC11C;&#xBE44;&#xC2A4;&#xC640;&#xC758; &#xC2DC;&#xC791; &#xC21C;&#xC11C; &#xC81C;&#xC5B4;</li><li><strong>&#xBCF4;&#xC548;</strong>: &#xB2E4;&#xC591;&#xD55C; &#xBCF4;&#xC548; &#xC635;&#xC158; &#xC81C;&#xACF5;</li><li><strong>&#xD45C;&#xC900;&#xD654;</strong>: &#xB300;&#xBD80;&#xBD84;&#xC758; Linux &#xBC30;&#xD3EC;&#xD310;&#xC5D0;&#xC11C; &#xD45C;&#xC900;</li></ol><h3 id="%EB%8B%A8%EC%A0%90-%E2%9D%8C">&#xB2E8;&#xC810; &#x274C;</h3><ol><li><strong>Linux &#xC804;&#xC6A9;</strong>: Windows&#xB098; macOS&#xC5D0;&#xC11C; &#xC0AC;&#xC6A9; &#xBD88;&#xAC00;</li><li><strong>&#xD559;&#xC2B5; &#xACE1;&#xC120;</strong>: &#xCD08;&#xAE30; &#xC124;&#xC815;&#xACFC; &#xAC1C;&#xB150; &#xC774;&#xD574; &#xD544;&#xC694;</li><li><strong>&#xBCF5;&#xC7A1;&#xC131;</strong>: &#xAC04;&#xB2E8;&#xD55C; &#xC560;&#xD50C;&#xB9AC;&#xCF00;&#xC774;&#xC158;&#xC5D0;&#xB294; &#xACFC;&#xB3C4;&#xD560; &#xC218; &#xC788;&#xC74C;</li><li><strong>&#xB514;&#xBC84;&#xAE45;</strong>: &#xBB38;&#xC81C; &#xBC1C;&#xC0DD; &#xC2DC; systemd &#xC9C0;&#xC2DD; &#xD544;&#xC694;</li></ol><h2 id="%EB%AA%A8%EB%8B%88%ED%84%B0%EB%A7%81%EA%B3%BC-%EC%95%8C%EB%A6%BC">&#xBAA8;&#xB2C8;&#xD130;&#xB9C1;&#xACFC; &#xC54C;&#xB9BC;</h2><h3 id="%EC%84%9C%EB%B9%84%EC%8A%A4-%EC%83%81%ED%83%9C-%EB%AA%A8%EB%8B%88%ED%84%B0%EB%A7%81">&#xC11C;&#xBE44;&#xC2A4; &#xC0C1;&#xD0DC; &#xBAA8;&#xB2C8;&#xD130;&#xB9C1;</h3><pre><code class="language-bash"># &#xC11C;&#xBE44;&#xC2A4;&#xAC00; &#xC2E4;&#xD589; &#xC911;&#xC778;&#xC9C0; &#xD655;&#xC778;
systemctl is-active my-app

# &#xC11C;&#xBE44;&#xC2A4;&#xAC00; &#xD65C;&#xC131;&#xD654;&#xB418;&#xC5B4; &#xC788;&#xB294;&#xC9C0; &#xD655;&#xC778;
systemctl is-enabled my-app
</code></pre><h3 id="%EC%95%8C%EB%A6%BC-%EC%84%A4%EC%A0%95-onfailure">&#xC54C;&#xB9BC; &#xC124;&#xC815; (OnFailure)</h3><pre><code class="language-ini">[Unit]
OnFailure=failure-notification@%n.service
</code></pre><h2 id="%EA%B2%B0%EB%A1%A0">&#xACB0;&#xB860;</h2><p>systemd&#xB294; Node.js &#xC560;&#xD50C;&#xB9AC;&#xCF00;&#xC774;&#xC158;&#xC744; &#xD504;&#xB85C;&#xB355;&#xC158; &#xD658;&#xACBD;&#xC5D0;&#xC11C; &#xC548;&#xC815;&#xC801;&#xC73C;&#xB85C; &#xC6B4;&#xC601;&#xD558;&#xAE30; &#xC704;&#xD55C; &#xAC15;&#xB825;&#xD55C; &#xB3C4;&#xAD6C;&#xC785;&#xB2C8;&#xB2E4;. &#xCD08;&#xAE30; &#xC124;&#xC815;&#xC740; &#xB2E4;&#xC18C; &#xBCF5;&#xC7A1;&#xD560; &#xC218; &#xC788;&#xC9C0;&#xB9CC;, &#xD55C; &#xBC88; &#xC124;&#xC815;&#xD558;&#xBA74; &#xB2E4;&#xC74C;&#xACFC; &#xAC19;&#xC740; &#xC774;&#xC810;&#xC744; &#xC5BB;&#xC744; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;:</p><ul><li><strong>&#xB192;&#xC740; &#xC548;&#xC815;&#xC131;</strong>: &#xC790;&#xB3D9; &#xC7AC;&#xC2DC;&#xC791;&#xACFC; &#xC5D0;&#xB7EC; &#xBCF5;&#xAD6C;</li><li><strong>&#xC6B4;&#xC601; &#xD3B8;&#xC758;&#xC131;</strong>: &#xD45C;&#xC900;&#xD654;&#xB41C; &#xAD00;&#xB9AC; &#xBA85;&#xB839;&#xC5B4;</li><li><strong>&#xD655;&#xC7A5;&#xC131;</strong>: &#xC5EC;&#xB7EC; &#xC11C;&#xBE44;&#xC2A4; &#xB3D9;&#xC2DC; &#xAD00;&#xB9AC; &#xAC00;&#xB2A5;</li><li><strong>&#xBCF4;&#xC548;&#xC131;</strong>: &#xC2DC;&#xC2A4;&#xD15C; &#xB808;&#xBCA8; &#xBCF4;&#xC548; &#xAE30;&#xB2A5;</li></ul><p>&#xD2B9;&#xD788; &#xC11C;&#xBC84; &#xC6B4;&#xC601; &#xACBD;&#xD5D8;&#xC774; &#xC788;&#xAC70;&#xB098; &#xC548;&#xC815;&#xC801;&#xC778; &#xC11C;&#xBE44;&#xC2A4; &#xC6B4;&#xC601;&#xC774; &#xC911;&#xC694;&#xD55C; &#xACBD;&#xC6B0;&#xB77C;&#xBA74; systemd &#xB3C4;&#xC785;&#xC744; &#xAC15;&#xB825;&#xD788; &#xCD94;&#xCC9C;&#xD569;&#xB2C8;&#xB2E4;.</p><hr><p><em>&#xC774; &#xAE00;&#xC774; &#xB3C4;&#xC6C0;&#xC774; &#xB418;&#xC168;&#xB2E4;&#xBA74; &#xC2E4;&#xC81C; &#xD504;&#xB85C;&#xC81D;&#xD2B8;&#xC5D0; &#xC801;&#xC6A9;&#xD574;&#xBCF4;&#xC2DC;&#xACE0;, &#xAD81;&#xAE08;&#xD55C; &#xC810;&#xC774; &#xC788;&#xC73C;&#xC2DC;&#xBA74; &#xC5B8;&#xC81C;&#xB4E0; &#xBB38;&#xC758;&#xD574;&#xC8FC;&#xC138;&#xC694;! &#x1F680;</em></p>]]></content:encoded></item><item><title><![CDATA[[SQLite] 쉼표로 구분된 문자열을 행으로 분할]]></title><description><![CDATA[<blockquote>&#xD558;&#xB098;&#xC758; &#xCEEC;&#xB7FC;&#xC5D0;&#xA0;&quot;a,b,c&quot;&#xCC98;&#xB7FC; &#xC800;&#xC7A5;&#xB41C; &#xB370;&#xC774;&#xD130;&#xB97C; &#xC5EC;&#xB7EC; &#xD589;&#xC73C;&#xB85C; &#xBD84;&#xD560;&#xD558;&#xB294; &#xBC29;&#xBC95;</blockquote><h2 id="%F0%9F%8E%AF-%EB%AA%A9%ED%91%9C">&#x1F3AF; &#xBAA9;&#xD45C;</h2><p>SQLite&#xC5D0;&#xC11C; &#xB2E4;&#xC74C;&#xACFC; &#xAC19;&#xC740; &#xB370;&#xC774;&#xD130; &#xBCC0;&#xD658;&#xC744; &#xC218;</p>]]></description><link>https://keun.me/sqlite-cte/</link><guid isPermaLink="false">6879d7140d908c000122dcc6</guid><dc:creator><![CDATA[Keun.R]]></dc:creator><pubDate>Fri, 18 Jul 2025 05:14:07 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1658338933991-cf30e4d588a9?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDN8fHNxbGl0ZXxlbnwwfHx8fDE3NTI4MTU0MDd8MA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=2000" medium="image"/><content:encoded><![CDATA[<blockquote>&#xD558;&#xB098;&#xC758; &#xCEEC;&#xB7FC;&#xC5D0;&#xA0;&quot;a,b,c&quot;&#xCC98;&#xB7FC; &#xC800;&#xC7A5;&#xB41C; &#xB370;&#xC774;&#xD130;&#xB97C; &#xC5EC;&#xB7EC; &#xD589;&#xC73C;&#xB85C; &#xBD84;&#xD560;&#xD558;&#xB294; &#xBC29;&#xBC95;</blockquote><h2 id="%F0%9F%8E%AF-%EB%AA%A9%ED%91%9C">&#x1F3AF; &#xBAA9;&#xD45C;</h2><img src="https://images.unsplash.com/photo-1658338933991-cf30e4d588a9?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDN8fHNxbGl0ZXxlbnwwfHx8fDE3NTI4MTU0MDd8MA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=2000" alt="[SQLite] &#xC27C;&#xD45C;&#xB85C; &#xAD6C;&#xBD84;&#xB41C; &#xBB38;&#xC790;&#xC5F4;&#xC744; &#xD589;&#xC73C;&#xB85C; &#xBD84;&#xD560;"><p>SQLite&#xC5D0;&#xC11C; &#xB2E4;&#xC74C;&#xACFC; &#xAC19;&#xC740; &#xB370;&#xC774;&#xD130; &#xBCC0;&#xD658;&#xC744; &#xC218;&#xD589;&#xD558;&#xB294; &#xAC83;</p><p><strong>&#xBCC0;&#xD658; &#xC804;:</strong></p><pre><code>IDvalues_column1a,b,c2d,e3f,g,h,i
</code></pre><p><strong>&#xBCC0;&#xD658; &#xD6C4;:</strong></p><pre><code>IDvalue1a1b1c2d2e3f3g3h3i
</code></pre><h2 id="%F0%9F%9B%A0%EF%B8%8F-%ED%95%B4%EA%B2%B0-%EB%B0%A9%EB%B2%95%EB%93%A4">&#x1F6E0;&#xFE0F; &#xD574;&#xACB0; &#xBC29;&#xBC95;&#xB4E4;</h2><h3 id="%EB%B0%A9%EB%B2%95-1-json-%ED%95%A8%EC%88%98-%EC%82%AC%EC%9A%A9-sqlite-345">&#xBC29;&#xBC95; 1: JSON &#xD568;&#xC218; &#xC0AC;&#xC6A9; (SQLite 3.45+)</h3><pre><code class="language-sql">WITH split_data AS (
    SELECT 
        id,
        json_extract(value, &apos;$&apos;) as split_value
    FROM your_table,
    json_each(&apos;[&quot;&apos; || replace(values_column, &apos;,&apos;, &apos;&quot;,&quot;&apos;) || &apos;&quot;]&apos;)
)
SELECT id, trim(split_value) as value
FROM split_data
ORDER BY id;</code></pre><p><strong>&#xC7A5;&#xC810;:</strong>&#xA0;&#xAC04;&#xB2E8;&#xD558;&#xACE0; &#xD6A8;&#xC728;&#xC801;</p><p><strong>&#xB2E8;&#xC810;:</strong>&#xA0;&#xCD5C;&#xC2E0; SQLite &#xBC84;&#xC804; &#xD544;&#xC694;, &#xD2B9;&#xC218;&#xBB38;&#xC790; &#xCC98;&#xB9AC; &#xC8FC;&#xC758;</p><h3 id="%EB%B0%A9%EB%B2%95-2-%EC%9E%AC%EA%B7%80-cte-%EC%82%AC%EC%9A%A9-%EA%B6%8C%EC%9E%A5-%E2%AD%90">&#xBC29;&#xBC95; 2: &#xC7AC;&#xADC0; CTE &#xC0AC;&#xC6A9; (&#xAD8C;&#xC7A5; &#x2B50;)</h3><pre><code class="language-sql">WITH RECURSIVE split_string(id, remaining, extracted, pos) AS (
    -- &#xCD08;&#xAE30; &#xB2E8;&#xACC4;: &#xB05D;&#xC5D0; &#xC27C;&#xD45C;&#xB97C; &#xCD94;&#xAC00;&#xD558;&#xC5EC; &#xC77C;&#xAD00;&#xC131; &#xD655;&#xBCF4;
    SELECT 
        id,
        values_column || &apos;,&apos; as remaining,
        &apos;&apos; as extracted,
        1 as pos
    FROM your_table
    WHERE values_column IS NOT NULL AND values_column != &apos;&apos;
    
    UNION ALL
    
    -- &#xC7AC;&#xADC0; &#xB2E8;&#xACC4;: &#xCCAB; &#xBC88;&#xC9F8; &#xAC12;&#xC744; &#xCD94;&#xCD9C;&#xD558;&#xACE0; &#xB098;&#xBA38;&#xC9C0;&#xB97C; &#xB2E4;&#xC74C;&#xC73C;&#xB85C; &#xC804;&#xB2EC;
    SELECT 
        id,
        substr(remaining, instr(remaining, &apos;,&apos;) + 1) as remaining,
        trim(substr(remaining, 1, instr(remaining, &apos;,&apos;) - 1)) as extracted,
        pos + 1
    FROM split_string
    WHERE instr(remaining, &apos;,&apos;) &gt; 0 AND pos &lt; 100
)
SELECT id, extracted as value
FROM split_string
WHERE extracted != &apos;&apos; AND extracted IS NOT NULL
ORDER BY id, pos;</code></pre><p><strong>&#xC7A5;&#xC810;:</strong></p><ul><li>&#xBAA8;&#xB4E0; SQLite &#xBC84;&#xC804;&#xC5D0;&#xC11C; &#xC791;&#xB3D9;</li><li>&#xD2B9;&#xC218;&#xBB38;&#xC790; &#xBB38;&#xC81C; &#xC5C6;&#xC74C;</li><li>&#xCEEC;&#xB7FC; &#xAC1C;&#xC218; &#xBB34;&#xC81C;&#xD55C;</li></ul><p><strong>&#xB2E8;&#xC810;:</strong>&#xA0;&#xC0C1;&#xB300;&#xC801;&#xC73C;&#xB85C; &#xBCF5;&#xC7A1;</p><pre><code class="language-sql">-- &#xD14C;&#xC2A4;&#xD2B8; &#xB370;&#xC774;&#xD130; &#xC0DD;&#xC131;
CREATE TABLE test_data (
    id INTEGER PRIMARY KEY,
    values_column TEXT
);

INSERT INTO test_data (values_column) VALUES 
(&apos;a,b,c&apos;),
(&apos;d,e&apos;),
(&apos;f,g,h,i&apos;),
(&apos;j&apos;);

-- &#xBC29;&#xBC95; 1 &#xC0AC;&#xC6A9; (&#xAC00;&#xC7A5; &#xCD94;&#xCC9C;)
WITH split_data AS (
    SELECT 
        id,
        json_extract(value, &apos;$&apos;) as split_value
    FROM test_data,
    json_each(&apos;[&quot;&apos; || replace(values_column, &apos;,&apos;, &apos;&quot;,&quot;&apos;) || &apos;&quot;]&apos;)
)
SELECT id, trim(split_value) as value
FROM split_data
ORDER BY id;</code></pre><h2 id="%F0%9F%94%8D-%EC%9E%AC%EA%B7%80-cte-%EC%9E%91%EB%8F%99-%EC%9B%90%EB%A6%AC-%EB%B6%84%EC%84%9D">&#x1F50D; &#xC7AC;&#xADC0; CTE &#xC791;&#xB3D9; &#xC6D0;&#xB9AC; &#xBD84;&#xC11D;</h2><h3 id="%ED%95%B5%EC%8B%AC-%EC%95%84%EC%9D%B4%EB%94%94%EC%96%B4">&#xD575;&#xC2EC; &#xC544;&#xC774;&#xB514;&#xC5B4;</h3><ol><li><strong>&#xB05D;&#xC5D0; &#xC27C;&#xD45C; &#xCD94;&#xAC00;</strong>:&#xA0;<code>&quot;a,b,c&quot;</code>&#xA0;&#x2192;&#xA0;<code>&quot;a,b,c,&quot;</code>&#xA0;&#xB85C; &#xBCC0;&#xD658;&#xD558;&#xC5EC; &#xC77C;&#xAD00;&#xB41C; &#xCC98;&#xB9AC;</li><li><strong>&#xC810;&#xC9C4;&#xC801; &#xCD94;&#xCD9C;</strong>: &#xB9E4;&#xBC88; &#xCCAB; &#xBC88;&#xC9F8; &#xAC12;&#xB9CC; &#xCD94;&#xCD9C;&#xD558;&#xACE0; &#xB098;&#xBA38;&#xC9C0;&#xB294; &#xB2E4;&#xC74C; &#xB2E8;&#xACC4;&#xB85C;</li><li><strong>&#xC790;&#xB3D9; &#xC885;&#xB8CC;</strong>: &#xB354; &#xC774;&#xC0C1; &#xC27C;&#xD45C;&#xAC00; &#xC5C6;&#xC73C;&#xBA74; &#xC7AC;&#xADC0; &#xC911;&#xB2E8;</li></ol><h3 id="%EC%8B%A4%ED%96%89-%EA%B3%BC%EC%A0%95-%EC%8B%9C%EB%AE%AC%EB%A0%88%EC%9D%B4%EC%85%98">&#xC2E4;&#xD589; &#xACFC;&#xC815; &#xC2DC;&#xBBAC;&#xB808;&#xC774;&#xC158;</h3><p><strong>&#xC785;&#xB825;:</strong>&#xA0;<code>values_column = &quot;apple,banana,cherry&quot;</code></p><pre><code>&#xB2E8;&#xACC4;remainingextractedpos&#xCD08;&#xAE30;&quot;apple,banana,cherry,&quot;&quot;&quot;11&#xCC28;&quot;banana,cherry,&quot;&quot;apple&quot;22&#xCC28;&quot;cherry,&quot;&quot;banana&quot;33&#xCC28;&quot;&quot;&quot;cherry&quot;4&#xC885;&#xB8CC;(&#xC27C;&#xD45C; &#xC5C6;&#xC74C;)--
</code></pre><figure class="kg-card kg-image-card"><img src="https://cdn.keun.me/ghost/2025/07/image.png" class="kg-image" alt="[SQLite] &#xC27C;&#xD45C;&#xB85C; &#xAD6C;&#xBD84;&#xB41C; &#xBB38;&#xC790;&#xC5F4;&#xC744; &#xD589;&#xC73C;&#xB85C; &#xBD84;&#xD560;" loading="lazy" width="798" height="394"></figure><h3 id="%ED%95%B5%EC%8B%AC-%ED%95%A8%EC%88%98%EB%93%A4">&#xD575;&#xC2EC; &#xD568;&#xC218;&#xB4E4;</h3><pre><code class="language-sql">-- &#xCCAB; &#xBC88;&#xC9F8; &#xC27C;&#xD45C; &#xC704;&#xCE58; &#xCC3E;&#xAE30;
instr(remaining, &apos;,&apos;)

-- &#xCCAB; &#xBC88;&#xC9F8; &#xC27C;&#xD45C; &#xC774;&#xC804; &#xBD80;&#xBD84; (&#xD604;&#xC7AC; &#xAC12;)
substr(remaining, 1, instr(remaining, &apos;,&apos;) - 1)

-- &#xCCAB; &#xBC88;&#xC9F8; &#xC27C;&#xD45C; &#xC774;&#xD6C4; &#xBD80;&#xBD84; (&#xB0A8;&#xC740; &#xBB38;&#xC790;&#xC5F4;)
substr(remaining, instr(remaining, &apos;,&apos;) + 1)</code></pre><h2 id="%F0%9F%9A%A8-json-%EB%B0%A9%EB%B2%95%EC%9D%98-%ED%95%A8%EC%A0%95%EA%B3%BC-%ED%95%B4%EA%B2%B0%EC%B1%85">&#x1F6A8; JSON &#xBC29;&#xBC95;&#xC758; &#xD568;&#xC815;&#xACFC; &#xD574;&#xACB0;&#xCC45;</h2><p>JSON &#xD568;&#xC218;&#xB97C; &#xC0AC;&#xC6A9;&#xD560; &#xB54C; &#xB2E4;&#xC74C; &#xC624;&#xB958;&#xAC00; &#xBC1C;&#xC0DD;&#xD560; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;:</p><p><code>[SQLITE_ERROR] SQL error or missing database (malformed JSON)</code></p><h3 id="%EC%9B%90%EC%9D%B8">&#xC6D0;&#xC778;</h3><ul><li>&#xC30D;&#xB530;&#xC634;&#xD45C; (<code>&quot;</code>) &#xD3EC;&#xD568;</li><li>&#xBC31;&#xC2AC;&#xB798;&#xC2DC; (<code>\\</code>) &#xD3EC;&#xD568;</li><li>&#xAC1C;&#xD589;&#xBB38;&#xC790;, &#xD0ED; &#xBB38;&#xC790; &#xD3EC;&#xD568;</li></ul><h3 id="%ED%95%B4%EA%B2%B0%EC%B1%85">&#xD574;&#xACB0;&#xCC45;</h3><pre><code class="language-sql">-- &#xD2B9;&#xC218;&#xBB38;&#xC790; &#xC774;&#xC2A4;&#xCF00;&#xC774;&#xD551;
WITH safe_json AS (
    SELECT 
        id,
        &apos;[&quot;&apos; || replace(
            replace(
                replace(values_column, &apos;\&apos;, &apos;\\&apos;), 
                &apos;&quot;&apos;, &apos;\&quot;&apos;
            ), 
            &apos;,&apos;, &apos;&quot;,&quot;&apos;
        ) || &apos;&quot;]&apos; as json_array
    FROM your_table
    WHERE json_valid(&apos;[&quot;&apos; || replace(values_column, &apos;,&apos;, &apos;&quot;,&quot;&apos;) || &apos;&quot;]&apos;) = 1
)
-- ... &#xC774;&#xD6C4; &#xCC98;&#xB9AC;</code></pre><p></p><p>&#x1F4A1; &#xC2E4;&#xC804; &#xC751;&#xC6A9; &#xC0AC;&#xB840;</p><h3 id="%ED%95%99%EC%83%9D-%EC%88%98%EC%97%85-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%A8-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EB%B6%84%ED%95%A0">&#xD559;&#xC0DD; &#xC218;&#xC5C5; &#xD504;&#xB85C;&#xADF8;&#xB7A8; &#xB370;&#xC774;&#xD130; &#xBD84;&#xD560;</h3><p>&#xC2E4;&#xC81C; &#xC5C5;&#xBB34;&#xC5D0;&#xC11C; &#xC790;&#xC8FC; &#xB9C8;&#xC8FC;&#xCE58;&#xB294; &#xCF00;&#xC774;&#xC2A4;&#xC785;&#xB2C8;&#xB2E4;:</p><pre><code class="language-sql">WITH RECURSIVE 
-- &#xB370;&#xC774;&#xD130; &#xC815;&#xB9AC;
cleaned_data AS (
    SELECT
        `&#xB4F1;&#xB85D;&#xC77C;`,
        `&#xC774;&#xB984;`,
        `&#xD559;&#xC0DD;&#xC5F0;&#xB77D;&#xCC98;`,
        `pageID`,
        REPLACE(`&#xC218;&#xC5C5;&#xD504;&#xB85C;&#xADF8;&#xB7A8;`, &apos;&#xD398;&#xC774;&#xC9C0; &#xC544;&#xC774;&#xB514;: &apos;, &apos;&apos;) AS `cleaned_programs`
    FROM &#xC7AC;&#xC6D0;&#xD559;&#xC0DD;
    WHERE `&#xC218;&#xC5C5;&#xD504;&#xB85C;&#xADF8;&#xB7A8;` IS NOT NULL AND `&#xC218;&#xC5C5;&#xD504;&#xB85C;&#xADF8;&#xB7A8;` != &apos;&apos;
),
-- &#xC7AC;&#xADC0;&#xB85C; &#xD504;&#xB85C;&#xADF8;&#xB7A8; &#xBD84;&#xD560;
split_programs(&#xB4F1;&#xB85D;&#xC77C;, &#xC774;&#xB984;, &#xD559;&#xC0DD;&#xC5F0;&#xB77D;&#xCC98;, pageID, remaining, extracted, pos) AS (
    SELECT 
        `&#xB4F1;&#xB85D;&#xC77C;`, `&#xC774;&#xB984;`, `&#xD559;&#xC0DD;&#xC5F0;&#xB77D;&#xCC98;`, `pageID`,
        `cleaned_programs` || &apos;,&apos; as remaining,
        &apos;&apos; as extracted,
        1 as pos
    FROM cleaned_data
    
    UNION ALL
    
    SELECT 
        &#xB4F1;&#xB85D;&#xC77C;, &#xC774;&#xB984;, &#xD559;&#xC0DD;&#xC5F0;&#xB77D;&#xCC98;, pageID,
        substr(remaining, instr(remaining, &apos;,&apos;) + 1) as remaining,
        trim(substr(remaining, 1, instr(remaining, &apos;,&apos;) - 1)) as extracted,
        pos + 1
    FROM split_programs
    WHERE instr(remaining, &apos;,&apos;) &gt; 0 AND pos &lt; 100
)
SELECT
    ROW_NUMBER() OVER (ORDER BY `pageID`, extracted) AS `record_id`,
    `&#xB4F1;&#xB85D;&#xC77C;`, `&#xC774;&#xB984;`, `&#xD559;&#xC0DD;&#xC5F0;&#xB77D;&#xCC98;`,
    extracted AS `&#xC218;&#xC5C5;&#xD504;&#xB85C;&#xADF8;&#xB7A8;_ID`,
    `pageID`
FROM split_programs
WHERE extracted != &apos;&apos; AND extracted IS NOT NULL
ORDER BY `record_id`;</code></pre><h2 id="%E2%9A%A1-%EC%84%B1%EB%8A%A5-%EC%B5%9C%EC%A0%81%ED%99%94-%ED%8C%81">&#x26A1; &#xC131;&#xB2A5; &#xCD5C;&#xC801;&#xD654; &#xD301;</h2><h3 id="1-%EC%9D%B8%EB%8D%B1%EC%8A%A4-%ED%99%9C%EC%9A%A9">1. &#xC778;&#xB371;&#xC2A4; &#xD65C;&#xC6A9;</h3><pre><code class="language-sql">-- &#xBD84;&#xD560; &#xD6C4; &#xC784;&#xC2DC; &#xD14C;&#xC774;&#xBE14;&#xC5D0; &#xC778;&#xB371;&#xC2A4; &#xC0DD;&#xC131;
CREATE INDEX idx_split_result ON temp_split_table(original_id, split_value);</code></pre><h3 id="2-%EB%B0%B0%EC%B9%98-%EC%B2%98%EB%A6%AC">2. &#xBC30;&#xCE58; &#xCC98;&#xB9AC;</h3><p>&#xB300;&#xC6A9;&#xB7C9; &#xB370;&#xC774;&#xD130;&#xC758; &#xACBD;&#xC6B0;:</p><pre><code class="language-sql">-- ID &#xBC94;&#xC704;&#xBCC4;&#xB85C; &#xB098;&#xB204;&#xC5B4; &#xCC98;&#xB9AC;
WHERE id BETWEEN 1 AND 10000</code></pre><h3 id="3-%EC%9E%AC%EA%B7%80-%EA%B9%8A%EC%9D%B4-%EC%A0%9C%ED%95%9C-%EC%A1%B0%EC%A0%95">3. &#xC7AC;&#xADC0; &#xAE4A;&#xC774; &#xC81C;&#xD55C; &#xC870;&#xC815;</h3><pre><code class="language-sql">-- &#xB354; &#xB9CE;&#xC740; &#xBD84;&#xD560;&#xC774; &#xD544;&#xC694;&#xD55C; &#xACBD;&#xC6B0;
WHERE instr(remaining, &apos;,&apos;) &gt; 0 AND pos &lt; 1000</code></pre><h2 id="%F0%9F%94%84-%EB%8B%A4%EB%A5%B8-%EA%B5%AC%EB%B6%84%EC%9E%90-%EC%9D%91%EC%9A%A9">&#x1F504; &#xB2E4;&#xB978; &#xAD6C;&#xBD84;&#xC790; &#xC751;&#xC6A9;</h2><h3 id="%EC%84%B8%EB%AF%B8%EC%BD%9C%EB%A1%A0%EC%9C%BC%EB%A1%9C-%EB%B6%84%ED%95%A0">&#xC138;&#xBBF8;&#xCF5C;&#xB860;&#xC73C;&#xB85C; &#xBD84;&#xD560;</h3><pre><code class="language-sql">-- &#xC27C;&#xD45C; &#xB300;&#xC2E0; &#xC138;&#xBBF8;&#xCF5C;&#xB860;
values_column || &apos;;&apos; as remaining
substr(remaining, instr(remaining, &apos;;&apos;) + 1)</code></pre><p>&#xC5EC;&#xB7EC; &#xAD6C;&#xBD84;&#xC790; &#xB3D9;&#xC2DC; &#xCC98;&#xB9AC;</p><pre><code class="language-sql">-- &#xC27C;&#xD45C;, &#xC138;&#xBBF8;&#xCF5C;&#xB860;, &#xD30C;&#xC774;&#xD504; &#xBAA8;&#xB450; &#xC27C;&#xD45C;&#xB85C; &#xD1B5;&#xC77C;
replace(replace(replace(values_column, &apos;;&apos;, &apos;,&apos;), &apos;|&apos;, &apos;,&apos;), &apos;:&apos;, &apos;,&apos;) || &apos;,&apos;</code></pre><h2 id="%F0%9F%93%8B-%EB%B0%A9%EB%B2%95%EB%B3%84-%EB%B9%84%EA%B5%90%ED%91%9C">&#x1F4CB; &#xBC29;&#xBC95;&#xBCC4; &#xBE44;&#xAD50;&#xD45C;</h2><pre><code>&#xBC29;&#xBC95;&#xD638;&#xD658;&#xC131;&#xC131;&#xB2A5;&#xBCF5;&#xC7A1;&#xB3C4;&#xD2B9;&#xC218;&#xBB38;&#xC790; &#xCC98;&#xB9AC;JSON &#xD568;&#xC218;SQLite 3.45+&#x2B50;&#x2B50;&#x2B50;&#x2B50;&#x26A0;&#xFE0F; &#xC8FC;&#xC758; &#xD544;&#xC694;&#xC7AC;&#xADC0; CTE&#xBAA8;&#xB4E0; &#xBC84;&#xC804;&#x2B50;&#x2B50;&#x2B50;&#x2B50;&#x2705; &#xC548;&#xC804;&#xACE0;&#xC815; &#xBD84;&#xD560;&#xBAA8;&#xB4E0; &#xBC84;&#xC804;&#x2B50;&#x2B50;&#x2B50;&#x2B50;&#x2B50;&#x2B50;&#x2705; &#xC548;&#xC804;
</code></pre><figure class="kg-card kg-image-card"><img src="https://cdn.keun.me/ghost/2025/07/image-1.png" class="kg-image" alt="[SQLite] &#xC27C;&#xD45C;&#xB85C; &#xAD6C;&#xBD84;&#xB41C; &#xBB38;&#xC790;&#xC5F4;&#xC744; &#xD589;&#xC73C;&#xB85C; &#xBD84;&#xD560;" loading="lazy" width="796" height="382"></figure><h2 id="%F0%9F%8E%AF-%EA%B2%B0%EB%A1%A0-%EB%B0%8F-%EA%B6%8C%EC%9E%A5%EC%82%AC%ED%95%AD">&#x1F3AF; &#xACB0;&#xB860; &#xBC0F; &#xAD8C;&#xC7A5;&#xC0AC;&#xD56D;</h2><ol><li><strong>&#xC77C;&#xBC18;&#xC801;&#xC778; &#xACBD;&#xC6B0;</strong>: &#xC7AC;&#xADC0; CTE &#xBC29;&#xBC95; &#xC0AC;&#xC6A9; (&#xAC00;&#xC7A5; &#xC548;&#xC804;&#xD558;&#xACE0; &#xC720;&#xC5F0;)</li><li><strong>&#xCD5C;&#xC2E0; SQLite + &#xD2B9;&#xC218;&#xBB38;&#xC790; &#xC5C6;&#xC74C;</strong>: JSON &#xD568;&#xC218; &#xBC29;&#xBC95;</li><li><strong>&#xACE0;&#xC815;&#xB41C; &#xBD84;&#xD560; &#xAC1C;&#xC218;</strong>: &#xC9C1;&#xC811; &#xBD84;&#xD560; &#xBC29;&#xBC95;</li></ol><p>&#xC7AC;&#xADC0; CTE &#xBC29;&#xBC95;&#xC740; &#xC57D;&#xAC04; &#xBCF5;&#xC7A1;&#xD574; &#xBCF4;&#xC774;&#xC9C0;&#xB9CC;, &#xD55C; &#xBC88; &#xC774;&#xD574;&#xD558;&#xBA74;&#xA0;<strong>&#xC5B4;&#xB5A4; &#xC0C1;&#xD669;&#xC5D0;&#xC11C;&#xB4E0; &#xC548;&#xC815;&#xC801;&#xC73C;&#xB85C; &#xC791;&#xB3D9;</strong>&#xD558;&#xB294; &#xAC15;&#xB825;&#xD55C; &#xB3C4;&#xAD6C;&#xC785;&#xB2C8;&#xB2E4;!</p><h2 id="%F0%9F%94%97-%EC%B0%B8%EA%B3%A0-%EC%9E%90%EB%A3%8C">&#x1F517; &#xCC38;&#xACE0; &#xC790;&#xB8CC;</h2><ul><li><a href="https://sqlite.org/lang_with.html?ref=keun.me">SQLite &#xACF5;&#xC2DD; &#xBB38;&#xC11C; - Recursive CTE</a></li><li><a href="https://sqlite.org/json1.html?ref=keun.me">SQLite JSON &#xD568;&#xC218;</a></li><li><a href="https://sqlite.org/lang_corefunc.html?ref=keun.me">&#xBB38;&#xC790;&#xC5F4; &#xD568;&#xC218; &#xB808;&#xD37C;&#xB7F0;&#xC2A4;</a></li></ul>]]></content:encoded></item><item><title><![CDATA[Colima: macOS에서 Docker 환경 최적화하기]]></title><description><![CDATA[<p>Docker Desktop&#xC740; macOS&#xC5D0;&#xC11C; Docker &#xD658;&#xACBD;&#xC744; &#xC27D;&#xAC8C; &#xC2E4;&#xD589;&#xD560; &#xC218; &#xC788;&#xB294; GUI &#xAE30;&#xBC18; &#xB3C4;&#xAD6C;&#xB85C; &#xB110;&#xB9AC; &#xC0AC;&#xC6A9;&#xB429;&#xB2C8;&#xB2E4;. &#xADF8;&#xB7EC;&#xB098; &#xC0AC;&#xC6A9; &#xC911; &#xC790;&#xC8FC; <strong>&#xBB34;&#xAC70;&#xC6C0;</strong>&#xC744; &#xB290;&#xB07C;&#xAC70;&#xB098; <strong>&#xB9AC;&#xC18C;&#xC2A4;</strong></p>]]></description><link>https://keun.me/colima/</link><guid isPermaLink="false">678473130d908c000122dca6</guid><category><![CDATA[Linux]]></category><dc:creator><![CDATA[Keun.R]]></dc:creator><pubDate>Mon, 13 Jan 2025 02:00:15 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1728667797688-7fab9401d0f2?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDE4fHxkb2NrZXJ8ZW58MHx8fHwxNzM2NzMzNTU3fDA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" medium="image"/><content:encoded><![CDATA[<img src="https://images.unsplash.com/photo-1728667797688-7fab9401d0f2?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDE4fHxkb2NrZXJ8ZW58MHx8fHwxNzM2NzMzNTU3fDA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" alt="Colima: macOS&#xC5D0;&#xC11C; Docker &#xD658;&#xACBD; &#xCD5C;&#xC801;&#xD654;&#xD558;&#xAE30;"><p>Docker Desktop&#xC740; macOS&#xC5D0;&#xC11C; Docker &#xD658;&#xACBD;&#xC744; &#xC27D;&#xAC8C; &#xC2E4;&#xD589;&#xD560; &#xC218; &#xC788;&#xB294; GUI &#xAE30;&#xBC18; &#xB3C4;&#xAD6C;&#xB85C; &#xB110;&#xB9AC; &#xC0AC;&#xC6A9;&#xB429;&#xB2C8;&#xB2E4;. &#xADF8;&#xB7EC;&#xB098; &#xC0AC;&#xC6A9; &#xC911; &#xC790;&#xC8FC; <strong>&#xBB34;&#xAC70;&#xC6C0;</strong>&#xC744; &#xB290;&#xB07C;&#xAC70;&#xB098; <strong>&#xB9AC;&#xC18C;&#xC2A4; &#xACFC;&#xB2E4; &#xC18C;&#xBAA8;</strong>&#xB85C; &#xC778;&#xD574; &#xBC30;&#xD130;&#xB9AC;&#xAC00; &#xBE60;&#xB974;&#xAC8C; &#xC18C;&#xBAA8;&#xB418;&#xB294; &#xACBD;&#xC6B0;&#xAC00; &#xB9CE;&#xC2B5;&#xB2C8;&#xB2E4;. &#xD2B9;&#xD788;, &#xACE0;&#xC131;&#xB2A5; &#xC791;&#xC5C5; &#xC2DC; <strong>Docker Desktop&#xC774; &#xC790;&#xC8FC; &#xB290;&#xB824;&#xC9C0;&#xAC70;&#xB098; &#xAC11;&#xC791;&#xC2A4;&#xB7FD;&#xAC8C; &#xC885;&#xB8CC;</strong>&#xB418;&#xB294; &#xBB38;&#xC81C;&#xB97C; &#xACBD;&#xD5D8;&#xD560; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;. &#xC774;&#xB7EC;&#xD55C; &#xBB38;&#xC81C;&#xB97C; &#xD574;&#xACB0;&#xD558;&#xAE30; &#xC704;&#xD574; <strong>&#xACBD;&#xB7C9;&#xD654;&#xB41C; &#xB300;&#xC548;</strong>&#xC73C;&#xB85C; &#xB4F1;&#xC7A5;&#xD55C; &#xB3C4;&#xAD6C;&#xAC00; &#xBC14;&#xB85C; <strong>Colima</strong>&#xC785;&#xB2C8;&#xB2E4;.</p><p>Colima&#xB294; macOS&#xC5D0;&#xC11C; Docker &#xD658;&#xACBD;&#xC744; &#xC2E4;&#xD589;&#xD558;&#xB294; <strong>&#xC624;&#xD508;&#xC18C;&#xC2A4; &#xACBD;&#xB7C9;&#xD654; &#xB3C4;&#xAD6C;</strong>&#xB85C;, GUI&#xB97C; &#xC81C;&#xACF5;&#xD558;&#xC9C0; &#xC54A;&#xC9C0;&#xB9CC; Docker CLI&#xC640; &#xC644;&#xBCBD;&#xD788; &#xD638;&#xD658;&#xB418;&#xBA70;, &#xBC30;&#xD130;&#xB9AC; &#xC18C;&#xBAA8;&#xB97C; &#xC904;&#xC774;&#xACE0; &#xC131;&#xB2A5;&#xC744; &#xCD5C;&#xC801;&#xD654;&#xD558;&#xB294; &#xB370; &#xCD08;&#xC810;&#xC744; &#xB9DE;&#xCD98; &#xAC00;&#xC0C1; &#xBA38;&#xC2E0;(VM) &#xAE30;&#xBC18; &#xB3C4;&#xAD6C;&#xC785;&#xB2C8;&#xB2E4;. &#xB610;&#xD55C; Kubernetes&#xC640; &#xD30C;&#xC77C; &#xACF5;&#xC720; &#xAE30;&#xB2A5;&#xAE4C;&#xC9C0; &#xC9C0;&#xC6D0;&#xD558;&#xC5EC; &#xB2E4;&#xC591;&#xD55C; &#xAC1C;&#xBC1C; &#xD658;&#xACBD;&#xC5D0;&#xC11C; &#xC720;&#xC5F0;&#xD558;&#xAC8C; &#xD65C;&#xC6A9;&#xD560; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;. &#xC544;&#xB798;&#xC5D0;&#xC11C; Colima&#xB97C; &#xC124;&#xCE58;&#xD558;&#xACE0; &#xD65C;&#xC6A9;&#xD558;&#xB294; &#xBC29;&#xBC95;&#xC744; &#xC54C;&#xC544;&#xBCF4;&#xACA0;&#xC2B5;&#xB2C8;&#xB2E4;.</p><hr><h2 id="1-colima-%EC%84%A4%EC%B9%98-%EB%B0%8F-%EC%8B%9C%EC%9E%91">1. Colima &#xC124;&#xCE58; &#xBC0F; &#xC2DC;&#xC791;</h2><h3 id="11-colima-%EC%84%A4%EC%B9%98">1.1 Colima &#xC124;&#xCE58;</h3><p>Colima&#xC640; Docker CLI&#xB97C; &#xC124;&#xCE58;&#xD558;&#xB824;&#xBA74; Homebrew&#xB97C; &#xC0AC;&#xC6A9;&#xD569;&#xB2C8;&#xB2E4;.</p><pre><code class="language-bash">brew install colima docker docker-compose
</code></pre><h3 id="12-colima-%EC%8B%9C%EC%9E%91">1.2 Colima &#xC2DC;&#xC791;</h3><p>&#xC124;&#xCE58; &#xD6C4; Colima&#xB97C; &#xC2DC;&#xC791;&#xD558;&#xC5EC; Docker &#xD658;&#xACBD;&#xC744; &#xC900;&#xBE44;&#xD569;&#xB2C8;&#xB2E4;.</p><pre><code class="language-bash">colima start
</code></pre><ul><li>&#xAE30;&#xBCF8;&#xC801;&#xC73C;&#xB85C; Colima&#xB294; 2&#xAC1C;&#xC758; CPU, 2GB &#xBA54;&#xBAA8;&#xB9AC;, 60GB &#xB514;&#xC2A4;&#xD06C; &#xD06C;&#xAE30;&#xB97C; &#xD560;&#xB2F9;&#xD569;&#xB2C8;&#xB2E4;.</li></ul><p>&#xD544;&#xC694;&#xD558;&#xBA74; &#xB2E4;&#xC74C;&#xACFC; &#xAC19;&#xC774; &#xC124;&#xC815;&#xC744; &#xC870;&#xC815;&#xD560; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;:</p><pre><code class="language-bash">colima start --cpu 4 --memory 8 --disk 30
</code></pre><h3 id="13-%EC%84%A4%EC%B9%98-%ED%99%95%EC%9D%B8">1.3 &#xC124;&#xCE58; &#xD655;&#xC778;</h3><p>Docker CLI&#xC640; Colima&#xAC00; &#xC81C;&#xB300;&#xB85C; &#xC791;&#xB3D9;&#xD558;&#xB294;&#xC9C0; &#xD655;&#xC778;&#xD569;&#xB2C8;&#xB2E4;.</p><pre><code class="language-bash">docker run hello-world
</code></pre><ul><li>&#xC815;&#xC0C1;&#xC801;&#xC73C;&#xB85C; &quot;Hello from Docker!&quot; &#xBA54;&#xC2DC;&#xC9C0;&#xAC00; &#xCD9C;&#xB825;&#xB418;&#xBA74; &#xC124;&#xCE58;&#xAC00; &#xC644;&#xB8CC;&#xB41C; &#xAC83;&#xC785;&#xB2C8;&#xB2E4;.</li></ul><hr><h2 id="2-colima-%EB%A6%AC%EC%86%8C%EC%8A%A4-%EC%82%AC%EC%9A%A9%EB%9F%89-%ED%99%95%EC%9D%B8">2. Colima &#xB9AC;&#xC18C;&#xC2A4; &#xC0AC;&#xC6A9;&#xB7C9; &#xD655;&#xC778;</h2><h3 id="21-docker-%EC%BB%A8%ED%85%8C%EC%9D%B4%EB%84%88-%EB%A6%AC%EC%86%8C%EC%8A%A4-%ED%99%95%EC%9D%B8">2.1 Docker &#xCEE8;&#xD14C;&#xC774;&#xB108; &#xB9AC;&#xC18C;&#xC2A4; &#xD655;&#xC778;</h3><p>&#xD604;&#xC7AC; &#xC2E4;&#xD589; &#xC911;&#xC778; Docker &#xCEE8;&#xD14C;&#xC774;&#xB108;&#xC758; CPU, &#xBA54;&#xBAA8;&#xB9AC;, &#xB124;&#xD2B8;&#xC6CC;&#xD06C; &#xC0AC;&#xC6A9;&#xB7C9;&#xC744; &#xC2E4;&#xC2DC;&#xAC04;&#xC73C;&#xB85C; &#xD655;&#xC778;&#xD558;&#xB824;&#xBA74;:</p><pre><code class="language-bash">docker stats
</code></pre><p>&#xC608;&#xC2DC; &#xCD9C;&#xB825;:</p><pre><code>CONTAINER ID   NAME              CPU %     MEM USAGE / LIMIT     NET I/O
abc123456789   my-container      2.14%     512MiB / 2GiB         1.2MB / 1.5MB
</code></pre><h3 id="22-colima-%EC%83%81%ED%83%9C-%ED%99%95%EC%9D%B8">2.2 Colima &#xC0C1;&#xD0DC; &#xD655;&#xC778;</h3><p>Colima VM&#xC758; CPU, &#xBA54;&#xBAA8;&#xB9AC;, &#xB514;&#xC2A4;&#xD06C; &#xC124;&#xC815;&#xC744; &#xD655;&#xC778;&#xD558;&#xB824;&#xBA74;:</p><pre><code class="language-bash">colima status
</code></pre><p>&#xCD9C;&#xB825; &#xC608;:</p><pre><code>colima is running
  CPU: 2
  Memory: 4GiB
  Disk: 20GiB
</code></pre><h3 id="23-macos-activity-monitor-%EC%82%AC%EC%9A%A9">2.3 macOS Activity Monitor &#xC0AC;&#xC6A9;</h3><p>macOS&#xC758; <strong>Activity Monitor</strong>&#xC5D0;&#xC11C; <code>colima</code> &#xB610;&#xB294; <code>qemu-system-x86_64</code>&#xB97C; &#xAC80;&#xC0C9;&#xD558;&#xC5EC; CPU &#xBC0F; &#xBA54;&#xBAA8;&#xB9AC; &#xC0AC;&#xC6A9;&#xB7C9;&#xC744; &#xD655;&#xC778;&#xD560; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.</p><hr><h2 id="3-colima-%EA%B4%80%EB%A6%AC">3. Colima &#xAD00;&#xB9AC;</h2><h3 id="31-colima-%EC%A4%91%EC%A7%80">3.1 Colima &#xC911;&#xC9C0;</h3><p>&#xC791;&#xC5C5;&#xC774; &#xB05D;&#xB09C; &#xD6C4; Colima&#xB97C; &#xC911;&#xC9C0;&#xD558;&#xC5EC; &#xB9AC;&#xC18C;&#xC2A4;&#xC640; &#xBC30;&#xD130;&#xB9AC;&#xB97C; &#xC808;&#xC57D;&#xD569;&#xB2C8;&#xB2E4;.</p><pre><code class="language-bash">colima stop
</code></pre><h3 id="32-colima-%EC%9E%AC%EC%8B%9C%EC%9E%91">3.2 Colima &#xC7AC;&#xC2DC;&#xC791;</h3><p>Colima&#xB97C; &#xB2E4;&#xC2DC; &#xC2DC;&#xC791;&#xD558;&#xB824;&#xBA74;:</p><pre><code class="language-bash">colima start
</code></pre><ul><li>&#xC774;&#xC804; &#xC0C1;&#xD0DC;&#xC5D0;&#xC11C; VM&#xC744; &#xC7AC;&#xC2DC;&#xC791;&#xD569;&#xB2C8;&#xB2E4;.</li></ul><h3 id="33-colima-%EC%9E%90%EB%8F%99-%EC%8B%9C%EC%9E%91-%EC%84%A4%EC%A0%95">3.3 Colima &#xC790;&#xB3D9; &#xC2DC;&#xC791; &#xC124;&#xC815;</h3><p>Mac&#xC744; &#xBD80;&#xD305;&#xD560; &#xB54C; &#xC790;&#xB3D9;&#xC73C;&#xB85C; Colima&#xB97C; &#xC2E4;&#xD589;&#xD558;&#xB824;&#xBA74;:</p><pre><code class="language-bash">colima start --daemon
</code></pre><ul><li>Colima&#xAC00; &#xBC31;&#xADF8;&#xB77C;&#xC6B4;&#xB4DC;&#xC5D0;&#xC11C; &#xC790;&#xB3D9;&#xC73C;&#xB85C; &#xC2E4;&#xD589;&#xB429;&#xB2C8;&#xB2E4;.</li></ul><hr><h2 id="4-colima-%ED%99%9C%EC%9A%A9-%ED%8C%81">4. Colima &#xD65C;&#xC6A9; &#xD301;</h2><h3 id="41-%EC%BB%A8%ED%85%8C%EC%9D%B4%EB%84%88-%EC%A0%95%EB%A6%AC">4.1 &#xCEE8;&#xD14C;&#xC774;&#xB108; &#xC815;&#xB9AC;</h3><p>&#xC0AC;&#xC6A9;&#xD558;&#xC9C0; &#xC54A;&#xB294; &#xCEE8;&#xD14C;&#xC774;&#xB108;&#xB97C; &#xC815;&#xB9AC;&#xD558;&#xC5EC; &#xB9AC;&#xC18C;&#xC2A4;&#xB97C; &#xD655;&#xBCF4;&#xD569;&#xB2C8;&#xB2E4;:</p><pre><code class="language-bash">docker container prune
</code></pre><h3 id="42-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-%ED%99%95%EC%9D%B8">4.2 &#xB124;&#xD2B8;&#xC6CC;&#xD06C; &#xD655;&#xC778;</h3><p>Docker &#xB124;&#xD2B8;&#xC6CC;&#xD06C;&#xB97C; &#xD655;&#xC778;&#xD558;&#xACE0; &#xAD00;&#xB9AC;&#xD558;&#xB824;&#xBA74;:</p><pre><code class="language-bash">docker network ls
</code></pre><h3 id="43-%ED%8C%8C%EC%9D%BC-%EA%B3%B5%EC%9C%A0-%EC%B5%9C%EC%A0%81%ED%99%94">4.3 &#xD30C;&#xC77C; &#xACF5;&#xC720; &#xCD5C;&#xC801;&#xD654;</h3><p>Colima VM&#xACFC; macOS &#xAC04;&#xC758; &#xD30C;&#xC77C; &#xACF5;&#xC720;&#xB97C; &#xCD5C;&#xC801;&#xD654;&#xD558;&#xB824;&#xBA74; <strong>VirtioFS</strong>&#xB97C; &#xD65C;&#xC131;&#xD654;&#xD569;&#xB2C8;&#xB2E4;:</p><pre><code class="language-bash">colima start --filesystem virtiofs
</code></pre><h3 id="44-kubernetes-%EC%82%AC%EC%9A%A9">4.4 Kubernetes &#xC0AC;&#xC6A9;</h3><p>Kubernetes&#xAC00; &#xD544;&#xC694;&#xD55C; &#xACBD;&#xC6B0; Colima&#xC5D0;&#xC11C; &#xD65C;&#xC131;&#xD654; &#xAC00;&#xB2A5;&#xD569;&#xB2C8;&#xB2E4;:</p><pre><code class="language-bash">colima start --with-kubernetes
</code></pre><ul><li>Kubernetes&#xAC00; &#xD544;&#xC694; &#xC5C6;&#xB294; &#xACBD;&#xC6B0; &#xAE30;&#xBCF8; &#xC124;&#xC815;&#xC73C;&#xB85C; &#xC0AC;&#xC6A9;&#xD558;&#xC5EC; &#xBC30;&#xD130;&#xB9AC; &#xC18C;&#xBAA8;&#xB97C; &#xC904;&#xC785;&#xB2C8;&#xB2E4;.</li></ul><hr><h2 id="5-colima-%EA%B4%80%EB%A6%AC-%EC%A3%BC%EC%9A%94-%EB%AA%85%EB%A0%B9%EC%96%B4">5. Colima &#xAD00;&#xB9AC; &#xC8FC;&#xC694; &#xBA85;&#xB839;&#xC5B4;</h2>
<!--kg-card-begin: html-->
<table>
<thead>
<tr>
<th><strong>&#xBA85;&#xB839;&#xC5B4;</strong></th>
<th><strong>&#xC124;&#xBA85;</strong></th>
</tr>
</thead>
<tbody>
<tr>
<td><code>colima start</code></td>
<td>Colima VM &#xC2DC;&#xC791;</td>
</tr>
<tr>
<td><code>colima stop</code></td>
<td>Colima VM &#xC911;&#xC9C0;</td>
</tr>
<tr>
<td><code>colima status</code></td>
<td>Colima VM &#xC0C1;&#xD0DC; &#xD655;&#xC778; (CPU, &#xBA54;&#xBAA8;&#xB9AC;, &#xB514;&#xC2A4;&#xD06C;)</td>
</tr>
<tr>
<td><code>colima start --cpu 4</code></td>
<td>Colima&#xB97C; 4&#xAC1C;&#xC758; CPU&#xB85C; &#xC2DC;&#xC791;</td>
</tr>
<tr>
<td><code>docker stats</code></td>
<td>&#xC2E4;&#xD589; &#xC911;&#xC778; Docker &#xCEE8;&#xD14C;&#xC774;&#xB108;&#xC758; &#xB9AC;&#xC18C;&#xC2A4; &#xC0AC;&#xC6A9;&#xB7C9; &#xD655;&#xC778;</td>
</tr>
<tr>
<td><code>docker container prune</code></td>
<td>&#xC911;&#xC9C0;&#xB41C; &#xCEE8;&#xD14C;&#xC774;&#xB108; &#xC0AD;&#xC81C;</td>
</tr>
<tr>
<td><code>docker network ls</code></td>
<td>Docker &#xB124;&#xD2B8;&#xC6CC;&#xD06C; &#xBAA9;&#xB85D; &#xD655;&#xC778;</td>
</tr>
</tbody>
</table>
<!--kg-card-end: html-->
<hr><h2 id="6-colima%EC%9D%98-%EC%A3%BC%EC%9A%94-%EC%9D%B4%EC%A0%90">6. Colima&#xC758; &#xC8FC;&#xC694; &#xC774;&#xC810;</h2><ol><li><strong>&#xB0AE;&#xC740; &#xBC30;&#xD130;&#xB9AC; &#xC18C;&#xBAA8;</strong>:<ul><li>Docker Desktop &#xB300;&#xBE44; &#xB9AC;&#xC18C;&#xC2A4; &#xC0AC;&#xC6A9;&#xB7C9;&#xACFC; &#xBC30;&#xD130;&#xB9AC; &#xC18C;&#xBAA8;&#xAC00; &#xC801;&#xC2B5;&#xB2C8;&#xB2E4;.</li></ul></li><li><strong>&#xAC04;&#xB2E8;&#xD55C; &#xC124;&#xC815;</strong>:<ul><li>CLI &#xC911;&#xC2EC;&#xC758; &#xAC04;&#xB2E8;&#xD55C; &#xBA85;&#xB839;&#xC5B4;&#xB85C; VM&#xC744; &#xC720;&#xC5F0;&#xD558;&#xAC8C; &#xAD00;&#xB9AC;&#xD560; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.</li></ul></li><li><strong>Kubernetes &#xC9C0;&#xC6D0;</strong>:<ul><li>&#xD544;&#xC694; &#xC2DC; Kubernetes&#xB97C; &#xC190;&#xC27D;&#xAC8C; &#xD65C;&#xC131;&#xD654;&#xD560; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.</li></ul></li><li><strong>Docker Desktop &#xB300;&#xCCB4;</strong>:<ul><li>GUI &#xAE30;&#xBC18; Docker Desktop &#xC5C6;&#xC774;&#xB3C4; macOS&#xC5D0;&#xC11C; &#xD6A8;&#xC728;&#xC801;&#xC778; Docker &#xD658;&#xACBD;&#xC744; &#xC81C;&#xACF5;&#xD569;&#xB2C8;&#xB2E4;.</li></ul></li></ol><hr><h2 id="7-%EC%B6%94%EC%B2%9C-%EC%9A%B4%EC%98%81-%EB%B0%A9%EC%8B%9D">7. &#xCD94;&#xCC9C; &#xC6B4;&#xC601; &#xBC29;&#xC2DD;</h2><ol><li><strong>&#xC791;&#xC5C5; &#xC804; Colima &#xC2DC;&#xC791;</strong>:<ul><li>&#xC791;&#xC5C5; &#xC2DC;&#xC791; &#xC804;&#xC5D0; <code>colima start</code>&#xB85C; VM&#xC744; &#xC2DC;&#xC791;&#xD569;&#xB2C8;&#xB2E4;.</li><li>&#xD544;&#xC694;&#xD560; &#xACBD;&#xC6B0;, CPU &#xBC0F; &#xBA54;&#xBAA8;&#xB9AC; &#xC124;&#xC815;&#xC744; &#xC870;&#xC815;&#xD558;&#xC5EC; &#xC2DC;&#xC791;&#xD569;&#xB2C8;&#xB2E4;.</li></ul></li><li><strong>&#xC791;&#xC5C5; &#xD6C4; Colima &#xC911;&#xC9C0;</strong>:<ul><li>&#xC791;&#xC5C5;&#xC774; &#xB05D;&#xB09C; &#xD6C4; <code>colima stop</code>&#xC73C;&#xB85C; Colima&#xB97C; &#xC911;&#xC9C0;&#xD558;&#xC5EC; &#xBC30;&#xD130;&#xB9AC; &#xC18C;&#xBAA8;&#xB97C; &#xBC29;&#xC9C0;&#xD569;&#xB2C8;&#xB2E4;.</li></ul></li><li><strong>&#xB9AC;&#xC18C;&#xC2A4; &#xD655;&#xC778; &#xBC0F; &#xC815;&#xB9AC;</strong>:<ul><li><code>docker stats</code>&#xB85C; &#xCEE8;&#xD14C;&#xC774;&#xB108; &#xB9AC;&#xC18C;&#xC2A4; &#xC0AC;&#xC6A9;&#xB7C9;&#xC744; &#xBAA8;&#xB2C8;&#xD130;&#xB9C1;.</li><li>&#xD544;&#xC694;&#xD558;&#xC9C0; &#xC54A;&#xC740; &#xCEE8;&#xD14C;&#xC774;&#xB108; &#xBC0F; &#xB124;&#xD2B8;&#xC6CC;&#xD06C;&#xB97C; &#xC8FC;&#xAE30;&#xC801;&#xC73C;&#xB85C; &#xC815;&#xB9AC;.</li></ul></li><li><strong>&#xD30C;&#xC77C; &#xACF5;&#xC720; &#xCD5C;&#xC801;&#xD654;</strong>:<ul><li>VirtioFS&#xB97C; &#xC0AC;&#xC6A9;&#xD558;&#xC5EC; &#xD30C;&#xC77C; &#xC2DC;&#xC2A4;&#xD15C; &#xC18D;&#xB3C4;&#xB97C; &#xCD5C;&#xC801;&#xD654;&#xD569;&#xB2C8;&#xB2E4;.</li></ul></li></ol><hr><p>Colima&#xB294; macOS&#xC5D0;&#xC11C; Docker Desktop&#xC744; &#xB300;&#xCCB4;&#xD560; &#xC218; &#xC788;&#xB294; &#xD6CC;&#xB96D;&#xD55C; &#xB3C4;&#xAD6C;&#xC785;&#xB2C8;&#xB2E4;. &#xAC04;&#xB2E8;&#xD55C; &#xC124;&#xCE58;&#xC640; &#xD6A8;&#xC728;&#xC801;&#xC778; &#xAD00;&#xB9AC; &#xAE30;&#xB2A5;&#xC744; &#xD1B5;&#xD574; &#xBC30;&#xD130;&#xB9AC; &#xC0AC;&#xC6A9;&#xB7C9;&#xC744; &#xC904;&#xC774;&#xACE0;, &#xAC1C;&#xBC1C; &#xD658;&#xACBD;&#xC744; &#xCD5C;&#xC801;&#xD654;&#xD560; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;. </p>]]></content:encoded></item><item><title><![CDATA[CTE(Common Table Expression)와 비중(Portion) 활용한 할인 안분 계산]]></title><description><![CDATA[<p>&#xC624;&#xB79C;&#xB9CC;&#xC5D0; &#xB2E4;&#xC2DC; &#xBE14;&#xB85C;&#xADF8; &#xD3EC;&#xC2A4;&#xD305;&#xC744; &#xB0A8;&#xACA8;&#xBCF8;&#xB2E4;. &#xCD5C;&#xADFC; &#xC9C4;&#xD589;&#xD558;&#xB294; &#xD504;&#xB85C;&#xC81D;&#xD2B8; &#xC911; Postgres &#xB97C; &#xB9CE;&#xC774; &#xB2E4;&#xB8E8;&#xACE0; &#xC788;&#xB294;&#xB370; &#xC790;&#xC8FC;&#xC4F0;&#xB294;&#xAC8C; &#xC788;&#xC5B4;&#xC11C; &#xAE30;&#xB85D;&#xCC28;&#xC6D0;</p>]]></description><link>https://keun.me/postgres-cte/</link><guid isPermaLink="false">675d95860d908c000122dc79</guid><category><![CDATA[database]]></category><dc:creator><![CDATA[Keun.R]]></dc:creator><pubDate>Sat, 14 Dec 2024 14:29:49 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1601110007259-db29e802df19?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDc1fHxkYnxlbnwwfHx8fDE3MzQxODY0NDV8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" medium="image"/><content:encoded><![CDATA[<img src="https://images.unsplash.com/photo-1601110007259-db29e802df19?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDc1fHxkYnxlbnwwfHx8fDE3MzQxODY0NDV8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" alt="CTE(Common Table Expression)&#xC640; &#xBE44;&#xC911;(Portion) &#xD65C;&#xC6A9;&#xD55C; &#xD560;&#xC778; &#xC548;&#xBD84; &#xACC4;&#xC0B0;"><p>&#xC624;&#xB79C;&#xB9CC;&#xC5D0; &#xB2E4;&#xC2DC; &#xBE14;&#xB85C;&#xADF8; &#xD3EC;&#xC2A4;&#xD305;&#xC744; &#xB0A8;&#xACA8;&#xBCF8;&#xB2E4;. &#xCD5C;&#xADFC; &#xC9C4;&#xD589;&#xD558;&#xB294; &#xD504;&#xB85C;&#xC81D;&#xD2B8; &#xC911; Postgres &#xB97C; &#xB9CE;&#xC774; &#xB2E4;&#xB8E8;&#xACE0; &#xC788;&#xB294;&#xB370; &#xC790;&#xC8FC;&#xC4F0;&#xB294;&#xAC8C; &#xC788;&#xC5B4;&#xC11C; &#xAE30;&#xB85D;&#xCC28;&#xC6D0;&#xC5D0;&#xC11C; &#xB0A8;&#xACA8;&#xBD04;. CTE(Common Table Expression)&#xC5D0; &#xB300;&#xD55C; &#xAC1C;&#xB150;&#xACFC; &#xC2E4;&#xBB34;&#xC5D0;&#xC11C; &#xC790;&#xC8FC; &#xD65C;&#xC6A9;&#xD558;&#xB294; <strong>&#xBE44;&#xC911;(Portion) &#xAE30;&#xBC18;&#xC758; &#xD560;&#xC778; &#xC548;&#xBD84; &#xACC4;&#xC0B0;</strong> &#xBC29;&#xBC95;&#xC744; &#xB2E4;&#xB904;&#xBCF4;&#xB824;&#xACE0; &#xD568;. &#xC774; &#xB0B4;&#xC6A9;&#xC744; &#xC54C;&#xBA74;, <strong>&#xBCF5;&#xC7A1;&#xD55C; &#xD560;&#xC778; &#xACC4;&#xC0B0;&#xC744; &#xB2E8;&#xC21C;&#xD654;</strong>&#xD558;&#xACE0;, <strong>SQL &#xCFFC;&#xB9AC;&#xC758; &#xAC00;&#xB3C5;&#xC131;&#xACFC; &#xD6A8;&#xC728;&#xC131;</strong>&#xC744; &#xB192;&#xC77C; &#xC218; &#xC788;&#xC74C;. </p><hr><h2 id="1%EF%B8%8F%E2%83%A3-ctecommon-table-expression-%EA%B0%9C%EB%85%90%EA%B3%BC-%EC%9B%90%EB%A6%AC"><strong>1&#xFE0F;&#x20E3; CTE(Common Table Expression) &#xAC1C;&#xB150;&#xACFC; &#xC6D0;&#xB9AC;</strong></h2><h3 id="1-cte%EB%9E%80">1. CTE&#xB780;?</h3><ul><li>CTE (Common Table Expression)&#xB294; SQL&#xC758; <strong>WITH &#xC808;</strong>&#xC744; &#xC0AC;&#xC6A9;&#xD574; <strong>&#xC784;&#xC2DC; &#xD14C;&#xC774;&#xBE14;</strong>&#xC744; &#xB9CC;&#xB4DC;&#xB294; &#xBC29;&#xBC95;</li><li>&#xC11C;&#xBE0C;&#xCFFC;&#xB9AC;&#xC640; &#xBE44;&#xC2B7;&#xD558;&#xC9C0;&#xB9CC;, <strong>&#xD55C; &#xBC88;&#xB9CC; &#xC815;&#xC758;&#xD574; &#xC5EC;&#xB7EC; &#xBC88; &#xC7AC;&#xC0AC;&#xC6A9;</strong>&#xD560; &#xC218; &#xC788;&#xB2E4;&#xB294; &#xAC8C; &#xAC00;&#xC7A5; &#xD070; &#xC7A5;&#xC810;</li><li>SQL&#xC758; &#xAC00;&#xB3C5;&#xC131;&#xC744; &#xB192;&#xC774;&#xACE0;, <strong>&#xBCF5;&#xC7A1;&#xD55C; &#xCFFC;&#xB9AC;&#xB97C; &#xB2E8;&#xC21C;&#xD654;</strong>&#xD560; &#xB54C; &#xC544;&#xC8FC; &#xC720;&#xC6A9;&#xD568;</li><li><strong>&#xC11C;&#xBE0C;&#xCFFC;&#xB9AC;&#xC640;&#xC758; &#xCC28;&#xC774;&#xC810;</strong>: &#xC11C;&#xBE0C;&#xCFFC;&#xB9AC;&#xB294; &#xC911;&#xCCA9;&#xB41C; &#xD615;&#xD0DC;&#xB85C; &#xC791;&#xC131;&#xB418;&#xBA70; &#xB9E4;&#xBC88; &#xC0C8;&#xB85C; &#xACC4;&#xC0B0;&#xB418;&#xC9C0;&#xB9CC;, CTE&#xB294; &#xC774;&#xB984;&#xC744; &#xC9C0;&#xC815;&#xD574; &#xD55C; &#xBC88; &#xC815;&#xC758;&#xD55C; &#xB4A4; &#xC5EC;&#xB7EC; &#xBC88; &#xC7AC;&#xC0AC;&#xC6A9;&#xD560; &#xC218; &#xC788;&#xC74C;. &#xADF8;&#xB798;&#xC11C; <strong>&#xAC00;&#xB3C5;&#xC131;</strong>&#xACFC; <strong>&#xC131;&#xB2A5;</strong> &#xCE21;&#xBA74;&#xC5D0;&#xC11C; &#xB354; &#xC720;&#xB9AC;&#xD568;.</li></ul><h3 id="2-cte%EC%9D%98-%EB%AC%B8%EB%B2%95"><strong>2. CTE&#xC758; &#xBB38;&#xBC95;</strong></h3><pre><code class="language-sql">WITH cte_name AS (
    -- &#xD558;&#xC704; &#xCFFC;&#xB9AC; (&#xC784;&#xC2DC; &#xD14C;&#xC774;&#xBE14;)
    SELECT column1, column2
    FROM some_table
    WHERE some_condition
)
-- &#xBA54;&#xC778; &#xCFFC;&#xB9AC; (CTE&#xB97C; &#xCC38;&#xC870;)
SELECT * FROM cte_name;
</code></pre><h3 id="3-cte%EC%9D%98-%ED%99%9C%EC%9A%A9-%EC%82%AC%EB%A1%80"><strong>3. CTE&#xC758; &#xD65C;&#xC6A9; &#xC0AC;&#xB840;</strong></h3><ul><li><strong>&#xBCF5;&#xC7A1;&#xD55C; &#xC11C;&#xBE0C;&#xCFFC;&#xB9AC;&#xB97C; &#xB2E8;&#xC21C;&#xD654;</strong>&#xD558;&#xACE0;, &#xC911;&#xBCF5; &#xACC4;&#xC0B0;&#xC744; &#xD53C;&#xD560; &#xC218; &#xC788;&#xC74C;.</li><li><strong>&#xC7AC;&#xADC0; &#xCFFC;&#xB9AC;</strong>: &#xACC4;&#xCE35; &#xAD6C;&#xC870;(&#xC870;&#xC9C1;&#xB3C4;, &#xCE74;&#xD14C;&#xACE0;&#xB9AC;) &#xB370;&#xC774;&#xD130;&#xB97C; &#xB2E4;&#xB8F0; &#xB54C; &#xC790;&#xC8FC; &#xC368;.</li><li><strong>&#xC9D1;&#xACC4; &#xBC0F; &#xC784;&#xC2DC; &#xD14C;&#xC774;&#xBE14; &#xC0DD;&#xC131;</strong>: &#xC784;&#xC2DC;&#xB85C; &#xC9D1;&#xACC4;&#xD55C; &#xB370;&#xC774;&#xD130;&#xB97C; &#xBA54;&#xC778; &#xCFFC;&#xB9AC;&#xC5D0;&#xC11C; &#xC7AC;&#xC0AC;&#xC6A9;&#xD560; &#xB54C;&#xB3C4; &#xC88B;&#xC544;.</li><li><strong>&#xCFFC;&#xB9AC; &#xC7AC;&#xC0AC;&#xC6A9;</strong>: CTE&#xB294; &#xC5EC;&#xB7EC; &#xBA54;&#xC778; &#xCFFC;&#xB9AC;&#xC5D0;&#xC11C; &#xCC38;&#xC870;&#xD560; &#xC218; &#xC788;&#xAE30; &#xB54C;&#xBB38;&#xC5D0;, <strong>&#xBC18;&#xBCF5; &#xC791;&#xC5C5;&#xC744; &#xC904;&#xC77C; &#xC218; &#xC788;&#xC5B4;</strong>.</li></ul><hr><h2 id="2%EF%B8%8F%E2%83%A3-%EB%B9%84%EC%A4%91portion-%EA%B8%B0%EB%B0%98%EC%9D%98-%ED%95%A0%EC%9D%B8-%EC%95%88%EB%B6%84-%EA%B3%84%EC%82%B0"><strong>2&#xFE0F;&#x20E3; &#xBE44;&#xC911;(Portion) &#xAE30;&#xBC18;&#xC758; &#xD560;&#xC778; &#xC548;&#xBD84; &#xACC4;&#xC0B0;</strong></h2><h3 id="1-%EB%AC%B8%EC%A0%9C-%EC%A0%95%EC%9D%98"><strong>1. &#xBB38;&#xC81C; &#xC815;&#xC758;</strong></h3><p>&#xD310;&#xB9E4; &#xB0B4;&#xC5ED; &#xB370;&#xC774;&#xD130;&#xB97C; &#xAE30;&#xC900;&#xC73C;&#xB85C;, <strong>&#xC7A5;&#xBC14;&#xAD6C;&#xB2C8; &#xAE30;&#xC900; &#xD560;&#xC778;</strong>&#xACFC; <strong>&#xC0C1;&#xD488; &#xAE30;&#xC900; &#xD560;&#xC778;</strong>&#xC744; &#xB3D9;&#xC2DC;&#xC5D0; &#xACC4;&#xC0B0;&#xD574;&#xC57C; &#xD574;.</p><h3 id="%EB%AA%A9%ED%91%9C"><strong>&#xBAA9;&#xD45C;</strong></h3><p>&#xC774; &#xAE00;&#xC758; &#xBAA9;&#xD45C;&#xB294; <strong>&#xD560;&#xC778; &#xC548;&#xBD84; &#xACC4;&#xC0B0;&#xC758; &#xC2E4;&#xC804; &#xC801;&#xC6A9; &#xBC29;&#xBC95;&#xC744; &#xBA85;&#xD655;&#xD788; &#xC774;&#xD574;</strong>&#xD558;&#xACE0;, &#xC774;&#xB97C; &#xD65C;&#xC6A9;&#xD574; <strong>&#xD6A8;&#xC728;&#xC801;&#xC778; SQL &#xCFFC;&#xB9AC; &#xC791;&#xC131; &#xB2A5;&#xB825;&#xC744; &#xD0A4;&#xC6B0;&#xB294; &#xAC83;</strong>&#xC774;&#xC57C;. &#xAD6C;&#xCCB4;&#xC801;&#xC73C;&#xB85C;, &#xB2E4;&#xC74C; &#xB450; &#xAC00;&#xC9C0;&#xB97C; &#xB2E4;&#xB8F0; &#xAC70;&#xC57C;.</p><ol><li><strong>&#xC7A5;&#xBC14;&#xAD6C;&#xB2C8; &#xAE30;&#xC900; &#xD560;&#xC778;</strong>: &#xC7A5;&#xBC14;&#xAD6C;&#xB2C8;(cart_id)&#xBCC4; &#xCD1D; &#xD560;&#xC778; &#xAE08;&#xC561;&#xC744; &#xAC01; &#xC0C1;&#xD488;&#xC758; &#xAE08;&#xC561; &#xBE44;&#xC911;&#xC73C;&#xB85C; &#xB098;&#xB214;.</li><li><strong>&#xC0C1;&#xD488; &#xAE30;&#xC900; &#xD560;&#xC778;</strong>: &#xC0C1;&#xD488;(product_id)&#xBCC4; &#xCD1D; &#xD560;&#xC778; &#xAE08;&#xC561;&#xC744; &#xAC01; &#xC0C1;&#xD488;&#xC758; &#xC218;&#xB7C9; &#xBE44;&#xC911;&#xC73C;&#xB85C; &#xB098;&#xB214;.</li></ol><h3 id="%ED%95%A0%EC%9D%B8-%EA%B3%B5%EC%8B%9D"><strong>&#xD560;&#xC778; &#xACF5;&#xC2DD;</strong></h3><ul><li><strong>&#xC7A5;&#xBC14;&#xAD6C;&#xB2C8; &#xAE30;&#xC900; &#xC0C1;&#xD488;&#xBCC4; &#xD560;&#xC778;</strong> = (&#xC0C1;&#xD488; &#xAE08;&#xC561; / &#xC7A5;&#xBC14;&#xAD6C;&#xB2C8; &#xCD1D; &#xAE08;&#xC561;) &#xD7; &#xC7A5;&#xBC14;&#xAD6C;&#xB2C8; &#xD560;&#xC778; &#xAE08;&#xC561;</li><li><strong>&#xC0C1;&#xD488; &#xAE30;&#xC900; &#xC0C1;&#xD488;&#xBCC4; &#xD560;&#xC778;</strong> = (&#xC0C1;&#xD488; &#xC218;&#xB7C9; / &#xC0C1;&#xD488; &#xCD1D; &#xC218;&#xB7C9;) &#xD7; &#xC0C1;&#xD488;&#xBCC4; &#xD560;&#xC778; &#xAE08;&#xC561;</li></ul><hr><h2 id="3%EF%B8%8F%E2%83%A3-%EC%98%88%EC%A0%9C-%ED%85%8C%EC%9D%B4%EB%B8%94-%EB%B0%8F-%EB%8D%B0%EC%9D%B4%ED%84%B0"><strong>3&#xFE0F;&#x20E3; &#xC608;&#xC81C; &#xD14C;&#xC774;&#xBE14; &#xBC0F; &#xB370;&#xC774;&#xD130;</strong></h2><h3 id="1-%ED%85%8C%EC%9D%B4%EB%B8%94-%EC%83%9D%EC%84%B1"><strong>1. &#xD14C;&#xC774;&#xBE14; &#xC0DD;&#xC131;</strong></h3><pre><code class="language-sql">CREATE temp TABLE t_sales (
    order_id SERIAL PRIMARY KEY,       -- &#xC8FC;&#xBB38; ID
    cart_id INT NOT NULL,               -- &#xC7A5;&#xBC14;&#xAD6C;&#xB2C8; ID
    product_id INT NOT NULL,            -- &#xC0C1;&#xD488; ID
    product_name VARCHAR(100) NOT NULL, -- &#xC0C1;&#xD488; &#xC774;&#xB984;
    quantity INT NOT NULL,              -- &#xD310;&#xB9E4; &#xC218;&#xB7C9;
    price NUMERIC(10, 2) NOT NULL,      -- &#xB2E8;&#xAC00; (&#xAC1C;&#xB2F9; &#xAC00;&#xACA9;)
    cart_discount NUMERIC(10, 2),       -- &#xC7A5;&#xBC14;&#xAD6C;&#xB2C8; &#xAE30;&#xC900; &#xD560;&#xC778; &#xAE08;&#xC561;
    product_discount NUMERIC(10, 2)     -- &#xC0C1;&#xD488; &#xAE30;&#xC900; &#xD560;&#xC778; &#xAE08;&#xC561;
);
</code></pre><h3 id="2-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EC%82%BD%EC%9E%85"><strong>2. &#xB370;&#xC774;&#xD130; &#xC0BD;&#xC785;</strong></h3><pre><code class="language-sql">INSERT INTO t_sales (cart_id, product_id, product_name, quantity, price, cart_discount, product_discount) VALUES
(1, 101, &apos;&#xB178;&#xD2B8;&#xBD81;&apos;, 1, 1000.00, 100.00, 50.00), 
(1, 102, &apos;&#xB9C8;&#xC6B0;&#xC2A4;&apos;, 2, 25.00, 100.00, 10.00), 
(1, 103, &apos;&#xD0A4;&#xBCF4;&#xB4DC;&apos;, 1, 50.00, 100.00, 5.00), 
(2, 101, &apos;&#xB178;&#xD2B8;&#xBD81;&apos;, 2, 1000.00, 200.00, 80.00), 
(2, 104, &apos;&#xBAA8;&#xB2C8;&#xD130;&apos;, 1, 300.00, 200.00, 40.00), 
(3, 105, &apos;USB &#xBA54;&#xBAA8;&#xB9AC;&apos;, 3, 15.00, 50.00, 5.00), 
(3, 103, &apos;&#xD0A4;&#xBCF4;&#xB4DC;&apos;, 2, 50.00, 50.00, 10.00), 
(4, 102, &apos;&#xB9C8;&#xC6B0;&#xC2A4;&apos;, 5, 25.00, 30.00, 5.00), 
(4, 105, &apos;USB &#xBA54;&#xBAA8;&#xB9AC;&apos;, 1, 15.00, 30.00, 2.00), 
(5, 104, &apos;&#xBAA8;&#xB2C8;&#xD130;&apos;, 3, 300.00, 0.00, 60.00);
</code></pre><hr><h2 id="4%EF%B8%8F%E2%83%A3-%EC%B5%9C%EC%A0%81%ED%99%94%EB%90%9C-cte-%EC%BF%BC%EB%A6%AC"><strong>4&#xFE0F;&#x20E3; &#xCD5C;&#xC801;&#xD654;&#xB41C; CTE &#xCFFC;&#xB9AC;</strong></h2><h3 id="%EC%BF%BC%EB%A6%AC-%EC%9E%91%EC%84%B1"><strong>&#xCFFC;&#xB9AC; &#xC791;&#xC131;</strong></h3><p>&#xC774; &#xCFFC;&#xB9AC;&#xB294; <strong>&#xC7A5;&#xBC14;&#xAD6C;&#xB2C8;&#xC640; &#xC0C1;&#xD488; &#xAE30;&#xC900;&#xC73C;&#xB85C; &#xD560;&#xC778;&#xC744; &#xB3D9;&#xC2DC;&#xC5D0; &#xACC4;&#xC0B0;</strong>&#xD558;&#xB294; &#xC608;&#xC2DC;&#xC57C;. &#xC5EC;&#xAE30;&#xC11C;&#xC758; &#xBAA9;&#xD45C;&#xB294; <strong>&#xC911;&#xBCF5; &#xACC4;&#xC0B0;&#xC744; &#xD53C;&#xD558;&#xACE0;, &#xD6A8;&#xC728;&#xC131;&#xC744; &#xB192;&#xC774;&#xB294; CTE &#xD65C;&#xC6A9;&#xBC95;&#xC744; &#xBCF4;&#xC5EC;&#xC8FC;&#xB294; &#xAC83;</strong>&#xC774;&#xC57C;. CTE&#xC5D0;&#xC11C; &#xBBF8;&#xB9AC; &#xBE44;&#xC911;(Portion)&#xC744; &#xAD6C;&#xD574;&#xB450;&#xACE0;, &#xCD5C;&#xC885; &#xCFFC;&#xB9AC;&#xC5D0;&#xC11C; &#xAC04;&#xB2E8;&#xD788; &#xACB0;&#xACFC;&#xB97C; &#xCD9C;&#xB825;&#xD558;&#xB294; &#xBC29;&#xC2DD;&#xC73C;&#xB85C; &#xCFFC;&#xB9AC; &#xC131;&#xB2A5;&#xC744; &#xCD5C;&#xC801;&#xD654;&#xD588;&#xC5B4;.</p><pre><code class="language-sql">WITH cart_summary AS (
    -- &#xC7A5;&#xBC14;&#xAD6C;&#xB2C8;(cart_id)&#xBCC4; &#xCD1D; &#xAE08;&#xC561; &#xBC0F; &#xCD1D; &#xD560;&#xC778; &#xAE08;&#xC561;
    SELECT 
        cart_id,
        SUM(quantity * price) AS total_cart_price,
        SUM(cart_discount) AS total_cart_discount
    FROM t_sales
    GROUP BY cart_id
), 
product_summary AS (
    -- &#xC0C1;&#xD488;(product_id)&#xBCC4; &#xCD1D; &#xD310;&#xB9E4; &#xC218;&#xB7C9; &#xBC0F; &#xCD1D; &#xD560;&#xC778; &#xAE08;&#xC561;
    SELECT 
        product_id,
        product_name,
        SUM(quantity) AS total_quantity,
        SUM(quantity * price) AS total_product_sales,
        SUM(product_discount) AS total_product_discount
    FROM t_sales
    GROUP BY product_id, product_name
), 
portion_calculations AS (
    -- CTE &#xB808;&#xBCA8;&#xC5D0;&#xC11C; &#xC7A5;&#xBC14;&#xAD6C;&#xB2C8;&#xC640; &#xC0C1;&#xD488;&#xC758; &#xBE44;&#xC911;(Portion)&#xC744; &#xBBF8;&#xB9AC; &#xACC4;&#xC0B0;
    SELECT 
        ts.order_id,
        ts.cart_id,
        ts.product_id,
        ts.product_name,
        ts.quantity,
        ts.price,
        ts.quantity * ts.price AS product_price,
        -- &#xBE44;&#xC911; (&#xC0C1;&#xD488; &#xAE08;&#xC561; / &#xC7A5;&#xBC14;&#xAD6C;&#xB2C8; &#xCD1D; &#xAE08;&#xC561;)
        (ts.quantity * ts.price) / cs.total_cart_price AS cart_portion,
        -- &#xBE44;&#xC911; (&#xC0C1;&#xD488; &#xC218;&#xB7C9; / &#xC0C1;&#xD488; &#xCD1D; &#xC218;&#xB7C9;)
        ts.quantity / ps.total_quantity AS product_portion,
        -- &#xC7A5;&#xBC14;&#xAD6C;&#xB2C8; &#xAE30;&#xC900; &#xD560;&#xC778; (&#xBE44;&#xC911; * &#xC7A5;&#xBC14;&#xAD6C;&#xB2C8; &#xD560;&#xC778;)
        ((ts.quantity * ts.price) / cs.total_cart_price) * cs.total_cart_discount AS cart_discount_allocation,
        -- &#xC0C1;&#xD488; &#xAE30;&#xC900; &#xD560;&#xC778; (&#xBE44;&#xC911; * &#xC0C1;&#xD488; &#xD560;&#xC778;)
        (ts.quantity / ps.total_quantity) * ps.total_product_discount AS product_discount_allocation
    FROM t_sales ts
    JOIN cart_summary cs ON ts.cart_id = cs.cart_id
    JOIN product_summary ps ON ts.product_id = ps.product_id
)
-- &#xCD5C;&#xC885; &#xACB0;&#xACFC; &#xCD9C;&#xB825;
SELECT 
    order_id,
    cart_id,
    product_id,
    product_name,
    quantity,
    price,
    product_price,
    ROUND(cart_portion, 4) AS cart_portion,
    ROUND(product_portion, 4) AS product_portion,
    ROUND(cart_discount_allocation, 2) AS cart_discount_allocation,
    ROUND(product_discount_allocation, 2) AS product_discount_allocation,
    ROUND(cart_discount_allocation + product_discount_allocation, 2) AS total_discount
FROM portion_calculations;</code></pre><hr><h2 id="5%EF%B8%8F%E2%83%A3-%EC%B5%9C%EC%A2%85-%EC%A0%95%EB%A6%AC"><strong>5&#xFE0F;&#x20E3; &#xCD5C;&#xC885; &#xC815;&#xB9AC;</strong></h2><h3 id="%EC%99%9C-%EC%9D%B4%EB%A0%87%EA%B2%8C-%ED%95%98%EB%8A%94-%EA%B1%B8%EA%B9%8C"><strong>&#xC65C; &#xC774;&#xB807;&#xAC8C; &#xD558;&#xB294; &#xAC78;&#xAE4C;?</strong></h3><ol><li><strong>&#xD6A8;&#xC728;&#xC131;</strong>: &#xBE44;&#xC911;(Portion)&#xC744; &#xBBF8;&#xB9AC; &#xACC4;&#xC0B0;&#xD574;&#xB450;&#xBA74; &#xC911;&#xBCF5; &#xC5F0;&#xC0B0;&#xC744; &#xC904;&#xC77C; &#xC218; &#xC788;&#xC5B4;. &#xC608;&#xB97C; &#xB4E4;&#xC5B4;, &#xD55C; &#xBC88;&#xC758; &#xCFFC;&#xB9AC; &#xC2E4;&#xD589;&#xC73C;&#xB85C; &#xCD1D; &#xC2E4;&#xD589; &#xC2DC;&#xAC04;&#xC774; 5&#xCD08;&#xC5D0;&#xC11C; 3&#xCD08;&#xB85C; &#xC904;&#xC5B4;&#xB4E4; &#xC218; &#xC788;&#xC5B4;.</li><li><strong>&#xAC00;&#xB3C5;&#xC131;</strong>: &#xBA54;&#xC778; &#xCFFC;&#xB9AC;&#xAC00; &#xB354; &#xB2E8;&#xC21C;&#xD574;&#xC838;&#xC11C;, &#xC720;&#xC9C0;&#xBCF4;&#xC218;&#xAC00; &#xC26C;&#xC6CC;. &#xBD88;&#xD544;&#xC694;&#xD55C; &#xC911;&#xBCF5; &#xACC4;&#xC0B0;&#xC774; &#xC5C6;&#xC5B4;&#xC9C0;&#xB2C8;&#xAE4C; &#xCFFC;&#xB9AC;&#xC758; &#xD750;&#xB984;&#xC774; &#xBA85;&#xD655;&#xD574;&#xC838;.</li><li><strong>&#xC131;&#xB2A5; &#xCD5C;&#xC801;&#xD654;</strong>: CTE &#xB808;&#xBCA8;&#xC5D0;&#xC11C; &#xBBF8;&#xB9AC; &#xACC4;&#xC0B0;&#xC744; &#xB9C8;&#xCE58;&#xACE0; &#xBA54;&#xC778; &#xCFFC;&#xB9AC;&#xC5D0;&#xC11C;&#xB294; &#xAC04;&#xB2E8;&#xD788; &#xC870;&#xD569;&#xB9CC; &#xD558;&#xB2C8;&#xAE4C;, &#xC804;&#xCCB4; &#xC2E4;&#xD589; &#xC18D;&#xB3C4;&#xAC00; &#xB354; &#xBE68;&#xB77C;&#xC838;. &#xD2B9;&#xD788;, &#xB300;&#xC6A9;&#xB7C9; &#xB370;&#xC774;&#xD130;&#xC14B;&#xC5D0;&#xC11C;&#xB3C4; &#xD6A8;&#xC728;&#xC801;&#xC774;&#xC57C;.</li></ol><hr><h2 id="6%EF%B8%8F%E2%83%A3-%EB%A7%88%EB%AC%B4%EB%A6%AC"><strong>6&#xFE0F;&#x20E3; &#xB9C8;&#xBB34;&#xB9AC;</strong></h2><p>&#xC774;&#xBC88; &#xAE00;&#xC5D0;&#xC11C;&#xB294; CTE(Common Table Expression)&#xC640; <strong>&#xBE44;&#xC911;(Portion) &#xAE30;&#xBC18;&#xC758; &#xD560;&#xC778; &#xC548;&#xBD84; &#xACC4;&#xC0B0;</strong> &#xBC29;&#xBC95;&#xC744; &#xB2E4;&#xB918;&#xC5B4;. <strong>&#xC7A5;&#xBC14;&#xAD6C;&#xB2C8; &#xAE30;&#xC900; &#xD560;&#xC778;</strong>&#xACFC; <strong>&#xC0C1;&#xD488; &#xAE30;&#xC900; &#xD560;&#xC778;</strong>&#xC744; &#xB3D9;&#xC2DC;&#xC5D0; &#xACC4;&#xC0B0;&#xD558;&#xB294; &#xC2E4;&#xC804; &#xC608;&#xC2DC;&#xB3C4; &#xC18C;&#xAC1C;&#xD588;&#xC73C;&#xB2C8;&#xAE4C;, &#xC9C1;&#xC811; DBeaver&#xC5D0;&#xC11C; &#xC2E4;&#xD589;&#xD574;&#xBCF4;&#xBA74;&#xC11C; &#xC775;&#xD600;&#xBCF4;&#xAE38; &#xCD94;&#xCC9C;&#xD560;&#xAC8C;!</p><blockquote>&#x1F4A1; &#xC774; &#xAE00;&#xC774; &#xC720;&#xC775;&#xD588;&#xB2E4;&#xBA74; &#xB313;&#xAE00;&#xB85C; &#xD53C;&#xB4DC;&#xBC31; &#xBD80;&#xD0C1;&#xD574;!<br><br><strong>&#xAD81;&#xAE08;&#xD55C; &#xBD80;&#xBD84;&#xC774; &#xC788;&#xC73C;&#xBA74; &#xB313;&#xAE00;&#xB85C; &#xB0A8;&#xACA8;&#xC918;. &#xCD94;&#xAC00;&#xB85C; &#xC124;&#xBA85;&#xD560;&#xAC8C;!</strong></blockquote>]]></content:encoded></item><item><title><![CDATA[React Hooks: useState, useEffect, useCallback]]></title><description><![CDATA[<p>React 16.8&#xC5D0;&#xC11C; &#xC18C;&#xAC1C;&#xB41C; Hooks&#xB294; &#xD568;&#xC218;&#xD615; &#xCEF4;&#xD3EC;&#xB10C;&#xD2B8;&#xC5D0;&#xC11C; &#xC0C1;&#xD0DC; &#xAD00;&#xB9AC;&#xC640; &#xC0DD;&#xBA85;&#xC8FC;&#xAE30; &#xAE30;&#xB2A5;&#xC744; &#xC0AC;&#xC6A9;&#xD560; &#xC218; &#xC788;&#xAC8C; &#xD574;&#xC8FC;&#xB294; &#xAC15;&#xB825;&#xD55C; &#xB3C4;&#xAD6C;&#xC785;&#xB2C8;&#xB2E4;. &#xC774; &#xD3EC;</p>]]></description><link>https://keun.me/react-hooks/</link><guid isPermaLink="false">67016b730d908c000122dc47</guid><category><![CDATA[Dev]]></category><dc:creator><![CDATA[Keun.R]]></dc:creator><pubDate>Sun, 06 Oct 2024 00:00:06 GMT</pubDate><content:encoded><![CDATA[<p>React 16.8&#xC5D0;&#xC11C; &#xC18C;&#xAC1C;&#xB41C; Hooks&#xB294; &#xD568;&#xC218;&#xD615; &#xCEF4;&#xD3EC;&#xB10C;&#xD2B8;&#xC5D0;&#xC11C; &#xC0C1;&#xD0DC; &#xAD00;&#xB9AC;&#xC640; &#xC0DD;&#xBA85;&#xC8FC;&#xAE30; &#xAE30;&#xB2A5;&#xC744; &#xC0AC;&#xC6A9;&#xD560; &#xC218; &#xC788;&#xAC8C; &#xD574;&#xC8FC;&#xB294; &#xAC15;&#xB825;&#xD55C; &#xB3C4;&#xAD6C;&#xC785;&#xB2C8;&#xB2E4;. &#xC774; &#xD3EC;&#xC2A4;&#xD2B8;&#xC5D0;&#xC11C;&#xB294; &#xAC00;&#xC7A5; &#xC790;&#xC8FC; &#xC0AC;&#xC6A9;&#xB418;&#xB294; &#xC138; &#xAC00;&#xC9C0; Hook&#xC778; <code>useState</code>, <code>useEffect</code>, <code>useCallback</code>&#xC5D0; &#xB300;&#xD574; &#xC790;&#xC138;&#xD788; &#xC54C;&#xC544;&#xBCF4;&#xACA0;&#xC2B5;&#xB2C8;&#xB2E4;.</p><h2 id="%EB%AA%A9%EC%B0%A8">&#xBAA9;&#xCC28;</h2><ol><li><a href="notion://www.notion.so/batiai/11600cfebbfc8026b81add4761eb12bb?showMoveTo=true&amp;saveParent=true#usestate">useState</a></li><li><a href="notion://www.notion.so/batiai/11600cfebbfc8026b81add4761eb12bb?showMoveTo=true&amp;saveParent=true#useeffect">useEffect</a></li><li><a href="notion://www.notion.so/batiai/11600cfebbfc8026b81add4761eb12bb?showMoveTo=true&amp;saveParent=true#usecallback">useCallback</a></li><li><a href="notion://www.notion.so/batiai/11600cfebbfc8026b81add4761eb12bb?showMoveTo=true&amp;saveParent=true#%EC%A2%85%ED%95%A9-%EC%98%88%EC%A0%9C">&#xC885;&#xD569; &#xC608;&#xC81C;</a></li><li><a href="notion://www.notion.so/batiai/11600cfebbfc8026b81add4761eb12bb?showMoveTo=true&amp;saveParent=true#%EA%B2%B0%EB%A1%A0">&#xACB0;&#xB860;</a></li></ol><h2 id="usestate">useState</h2><p><code>useState</code>&#xB294; &#xD568;&#xC218;&#xD615; &#xCEF4;&#xD3EC;&#xB10C;&#xD2B8;&#xC5D0;&#xC11C; &#xC0C1;&#xD0DC;&#xB97C; &#xAD00;&#xB9AC;&#xD560; &#xC218; &#xC788;&#xAC8C; &#xD574;&#xC8FC;&#xB294; Hook&#xC785;&#xB2C8;&#xB2E4;.</p><h3 id="%EA%B8%B0%EB%B3%B8-%EA%B5%AC%EC%A1%B0">&#xAE30;&#xBCF8; &#xAD6C;&#xC870;</h3><pre><code class="language-jsx">const [state, setState] = useState(initialState);

</code></pre><h3 id="%ED%8A%B9%EC%A7%95">&#xD2B9;&#xC9D5;</h3><ul><li>&#xCEF4;&#xD3EC;&#xB10C;&#xD2B8;&#xC5D0; &#xC9C0;&#xC5ED; &#xC0C1;&#xD0DC;&#xB97C; &#xCD94;&#xAC00;&#xD560; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.</li><li>&#xD568;&#xC218;&#xD615; &#xC5C5;&#xB370;&#xC774;&#xD2B8;&#xB97C; &#xC9C0;&#xC6D0;&#xD569;&#xB2C8;&#xB2E4;: <code>setState(prevState =&gt; newState)</code></li><li>&#xCD08;&#xAE30; &#xC0C1;&#xD0DC;&#xB294; &#xD55C; &#xBC88;&#xB9CC; &#xC0AC;&#xC6A9;&#xB429;&#xB2C8;&#xB2E4;. &#xC774;&#xD6C4; &#xB80C;&#xB354;&#xB9C1;&#xC5D0;&#xC11C;&#xB294; &#xBB34;&#xC2DC;&#xB429;&#xB2C8;&#xB2E4;.</li></ul><h3 id="%EC%98%88%EC%A0%9C">&#xC608;&#xC81C;</h3><pre><code class="language-jsx">function Counter() {
  const [count, setCount] = useState(0);

  return (
    &lt;div&gt;
      &lt;p&gt;You clicked {count} times&lt;/p&gt;
      &lt;button onClick={() =&gt; setCount(count + 1)}&gt;
        Click me
      &lt;/button&gt;
    &lt;/div&gt;
  );
}

</code></pre><h3 id="%EC%9E%A5%EC%A0%90">&#xC7A5;&#xC810;</h3><ul><li>&#xAC04;&#xB2E8;&#xD558;&#xACE0; &#xC9C1;&#xAD00;&#xC801;&#xC778; API</li><li>&#xD074;&#xB798;&#xC2A4; &#xCEF4;&#xD3EC;&#xB10C;&#xD2B8;&#xC758; this &#xBC14;&#xC778;&#xB529; &#xBB38;&#xC81C; &#xD574;&#xACB0;</li><li>&#xC5EC;&#xB7EC; &#xC0C1;&#xD0DC;&#xB97C; &#xC27D;&#xAC8C; &#xAD00;&#xB9AC; &#xAC00;&#xB2A5;</li></ul><h3 id="%EB%8B%A8%EC%A0%90">&#xB2E8;&#xC810;</h3><ul><li>&#xBCF5;&#xC7A1;&#xD55C; &#xC0C1;&#xD0DC; &#xB85C;&#xC9C1;&#xC744; &#xAD00;&#xB9AC;&#xD558;&#xAE30; &#xC5B4;&#xB824;&#xC6B8; &#xC218; &#xC788;&#xC74C; (&#xC774; &#xACBD;&#xC6B0; useReducer &#xACE0;&#xB824;)</li></ul><h2 id="useeffect">useEffect</h2><p><code>useEffect</code>&#xB294; &#xD568;&#xC218;&#xD615; &#xCEF4;&#xD3EC;&#xB10C;&#xD2B8;&#xC5D0;&#xC11C; side effects&#xB97C; &#xC218;&#xD589;&#xD560; &#xC218; &#xC788;&#xAC8C; &#xD574;&#xC8FC;&#xB294; Hook&#xC785;&#xB2C8;&#xB2E4;.</p><h3 id="%EA%B8%B0%EB%B3%B8-%EA%B5%AC%EC%A1%B0-1">&#xAE30;&#xBCF8; &#xAD6C;&#xC870;</h3><pre><code class="language-jsx">useEffect(() =&gt; {
// side effect
  return () =&gt; {
// cleanup
  };
}, [dependencies]);

</code></pre><h3 id="%ED%8A%B9%EC%A7%95-1">&#xD2B9;&#xC9D5;</h3><ul><li>&#xCEF4;&#xD3EC;&#xB10C;&#xD2B8; &#xB80C;&#xB354;&#xB9C1; &#xC774;&#xD6C4;&#xC5D0; &#xC2E4;&#xD589;&#xB429;&#xB2C8;&#xB2E4;.</li><li>&#xC758;&#xC874;&#xC131; &#xBC30;&#xC5F4;&#xC744; &#xD1B5;&#xD574; effect&#xC758; &#xC2E4;&#xD589; &#xC870;&#xAC74;&#xC744; &#xC81C;&#xC5B4;&#xD560; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.</li><li>&#xD074;&#xB9B0;&#xC5C5; &#xD568;&#xC218;&#xB97C; &#xBC18;&#xD658;&#xD558;&#xC5EC; &#xAD6C;&#xB3C5; &#xD574;&#xC81C; &#xB4F1;&#xC758; &#xC815;&#xB9AC; &#xC791;&#xC5C5;&#xC744; &#xC218;&#xD589;&#xD560; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.</li></ul><h3 id="%EC%98%88%EC%A0%9C-1">&#xC608;&#xC81C;</h3><pre><code class="language-jsx">function FriendStatus(props) {
  const [isOnline, setIsOnline] = useState(null);

  useEffect(() =&gt; {
    function handleStatusChange(status) {
      setIsOnline(status.isOnline);
    }
    ChatAPI.subscribeToFriendStatus(props.friend.id, handleStatusChange);

    return () =&gt; {
      ChatAPI.unsubscribeFromFriendStatus(props.friend.id, handleStatusChange);
    };
  }, [props.friend.id]);

  if (isOnline === null) {
    return &apos;Loading...&apos;;
  }
  return isOnline ? &apos;Online&apos; : &apos;Offline&apos;;
}

</code></pre><h3 id="%EC%9E%A5%EC%A0%90-1">&#xC7A5;&#xC810;</h3><ul><li>&#xC0DD;&#xBA85;&#xC8FC;&#xAE30; &#xBA54;&#xC11C;&#xB4DC;&#xB97C; &#xB300;&#xCCB4;&#xD558;&#xC5EC; &#xAD00;&#xB828; &#xB85C;&#xC9C1;&#xC744; &#xD55C; &#xACF3;&#xC5D0;&#xC11C; &#xAD00;&#xB9AC;</li><li>&#xBD88;&#xD544;&#xC694;&#xD55C; effect &#xC2E4;&#xD589;&#xC744; &#xBC29;&#xC9C0;&#xD560; &#xC218; &#xC788;&#xC74C;</li></ul><h3 id="%EB%8B%A8%EC%A0%90-1">&#xB2E8;&#xC810;</h3><ul><li>&#xC758;&#xC874;&#xC131; &#xBC30;&#xC5F4; &#xAD00;&#xB9AC;&#xAC00; &#xBCF5;&#xC7A1;&#xD560; &#xC218; &#xC788;&#xC74C;</li><li>&#xACFC;&#xB3C4;&#xD55C; &#xC0AC;&#xC6A9; &#xC2DC; &#xC131;&#xB2A5; &#xC800;&#xD558; &#xAC00;&#xB2A5;&#xC131;</li></ul><h2 id="usecallback">useCallback</h2><p><code>useCallback</code>&#xC740; &#xBA54;&#xBAA8;&#xC774;&#xC81C;&#xC774;&#xC158;&#xB41C; &#xCF5C;&#xBC31;&#xC744; &#xBC18;&#xD658;&#xD558;&#xB294; Hook&#xC785;&#xB2C8;&#xB2E4;.</p><h3 id="%EA%B8%B0%EB%B3%B8-%EA%B5%AC%EC%A1%B0-2">&#xAE30;&#xBCF8; &#xAD6C;&#xC870;</h3><pre><code class="language-jsx">const memoizedCallback = useCallback(
  () =&gt; {
    doSomething(a, b);
  },
  [a, b],
);

</code></pre><h3 id="%ED%8A%B9%EC%A7%95-2">&#xD2B9;&#xC9D5;</h3><ul><li>&#xC758;&#xC874;&#xC131;&#xC774; &#xBCC0;&#xACBD;&#xB418;&#xC5C8;&#xC744; &#xB54C;&#xB9CC; &#xC0C8;&#xB85C;&#xC6B4; &#xD568;&#xC218;&#xB97C; &#xBC18;&#xD658;&#xD569;&#xB2C8;&#xB2E4;.</li><li>&#xBD88;&#xD544;&#xC694;&#xD55C; &#xB80C;&#xB354;&#xB9C1;&#xC744; &#xBC29;&#xC9C0;&#xD558;&#xB294; &#xB370; &#xB3C4;&#xC6C0;&#xC774; &#xB429;&#xB2C8;&#xB2E4;.</li></ul><h3 id="%EC%98%88%EC%A0%9C-2">&#xC608;&#xC81C;</h3><pre><code class="language-jsx">function ParentComponent() {
  const [count, setCount] = useState(0);

  const increment = useCallback(() =&gt; {
    setCount(c =&gt; c + 1);
  }, []);

  return (
    &lt;div&gt;
      &lt;ChildComponent onIncrement={increment} /&gt;
      &lt;p&gt;Count: {count}&lt;/p&gt;
    &lt;/div&gt;
  );
}

</code></pre><h3 id="%EC%9E%A5%EC%A0%90-2">&#xC7A5;&#xC810;</h3><ul><li>&#xBD88;&#xD544;&#xC694;&#xD55C; &#xB9AC;&#xB80C;&#xB354;&#xB9C1; &#xBC29;&#xC9C0;</li><li>&#xC131;&#xB2A5; &#xCD5C;&#xC801;&#xD654;&#xC5D0; &#xB3C4;&#xC6C0;</li><li>useEffect&#xC758; &#xC758;&#xC874;&#xC131; &#xCD5C;&#xC801;&#xD654;</li></ul><h3 id="%EB%8B%A8%EC%A0%90-2">&#xB2E8;&#xC810;</h3><ul><li>&#xACFC;&#xB3C4;&#xD55C; &#xC0AC;&#xC6A9; &#xC2DC; &#xCF54;&#xB4DC; &#xBCF5;&#xC7A1;&#xC131; &#xC99D;&#xAC00;</li><li>&#xAC04;&#xB2E8;&#xD55C; &#xD568;&#xC218;&#xC5D0; &#xC0AC;&#xC6A9; &#xC2DC; &#xC624;&#xD788;&#xB824; &#xC131;&#xB2A5; &#xC800;&#xD558; &#xAC00;&#xB2A5;&#xC131;</li></ul><h2 id="%EC%A2%85%ED%95%A9-%EC%98%88%EC%A0%9C">&#xC885;&#xD569; &#xC608;&#xC81C;</h2><p>&#xB2E4;&#xC74C;&#xC740; &#xC138; &#xAC00;&#xC9C0; Hook&#xC744; &#xBAA8;&#xB450; &#xC0AC;&#xC6A9;&#xD558;&#xB294; &#xC608;&#xC81C;&#xC785;&#xB2C8;&#xB2E4;:</p><pre><code class="language-jsx">import React, { useState, useEffect, useCallback } from &apos;react&apos;;

function DataFetcher({ url }) {
  const [data, setData] = useState(null);
  const [loading, setLoading] = useState(true);

  const fetchData = useCallback(async () =&gt; {
    setLoading(true);
    try {
      const response = await fetch(url);
      const result = await response.json();
      setData(result);
    } catch (error) {
      console.error(&quot;Failed to fetch data:&quot;, error);
    } finally {
      setLoading(false);
    }
  }, [url]);

  useEffect(() =&gt; {
    fetchData();
  }, [fetchData]);

  return (
    &lt;div&gt;
      {loading ? (
        &lt;p&gt;Loading...&lt;/p&gt;
      ) : (
        &lt;pre&gt;{JSON.stringify(data, null, 2)}&lt;/pre&gt;
      )}
      &lt;button onClick={fetchData}&gt;Refresh Data&lt;/button&gt;
    &lt;/div&gt;
  );
}

export default DataFetcher;

</code></pre><p>&#xC774; &#xC608;&#xC81C;&#xC5D0;&#xC11C;:</p><ul><li><code>useState</code>&#xB97C; &#xC0AC;&#xC6A9;&#xD558;&#xC5EC; &#xB370;&#xC774;&#xD130;&#xC640; &#xB85C;&#xB529; &#xC0C1;&#xD0DC;&#xB97C; &#xAD00;&#xB9AC;&#xD569;&#xB2C8;&#xB2E4;.</li><li><code>useCallback</code>&#xC744; &#xC0AC;&#xC6A9;&#xD558;&#xC5EC; <code>fetchData</code> &#xD568;&#xC218;&#xB97C; &#xBA54;&#xBAA8;&#xC774;&#xC81C;&#xC774;&#xC158;&#xD569;&#xB2C8;&#xB2E4;.</li><li><code>useEffect</code>&#xB97C; &#xC0AC;&#xC6A9;&#xD558;&#xC5EC; &#xCEF4;&#xD3EC;&#xB10C;&#xD2B8; &#xB9C8;&#xC6B4;&#xD2B8; &#xC2DC; &#xB370;&#xC774;&#xD130;&#xB97C; &#xAC00;&#xC838;&#xC635;&#xB2C8;&#xB2E4;.</li></ul><h2 id="%EA%B2%B0%EB%A1%A0">&#xACB0;&#xB860;</h2><p><code>useState</code>, <code>useEffect</code>, <code>useCallback</code>&#xC740; React &#xC560;&#xD50C;&#xB9AC;&#xCF00;&#xC774;&#xC158; &#xAC1C;&#xBC1C;&#xC5D0;&#xC11C; &#xD575;&#xC2EC;&#xC801;&#xC778; &#xC5ED;&#xD560;&#xC744; &#xD558;&#xB294; Hook&#xB4E4;&#xC785;&#xB2C8;&#xB2E4;. &#xC774;&#xB4E4;&#xC744; &#xC801;&#xC808;&#xD788; &#xC0AC;&#xC6A9;&#xD558;&#xBA74; &#xCEF4;&#xD3EC;&#xB10C;&#xD2B8;&#xC758; &#xC0C1;&#xD0DC; &#xAD00;&#xB9AC;, &#xBD80;&#xC218; &#xD6A8;&#xACFC; &#xCC98;&#xB9AC;, &#xC131;&#xB2A5; &#xCD5C;&#xC801;&#xD654;&#xB97C; &#xD6A8;&#xACFC;&#xC801;&#xC73C;&#xB85C; &#xC218;&#xD589;&#xD560; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;. &#xD558;&#xC9C0;&#xB9CC; &#xAC01; Hook&#xC758; &#xD2B9;&#xC131;&#xACFC; &#xC0AC;&#xC6A9; &#xC2DC; &#xC8FC;&#xC758;&#xC0AC;&#xD56D;&#xC744; &#xC798; &#xC774;&#xD574;&#xD558;&#xACE0; &#xC801;&#xC808;&#xD788; &#xD65C;&#xC6A9;&#xD558;&#xB294; &#xAC83;&#xC774; &#xC911;&#xC694;&#xD569;&#xB2C8;&#xB2E4;.</p><p>React Hooks&#xB294; &#xD568;&#xC218;&#xD615; &#xD504;&#xB85C;&#xADF8;&#xB798;&#xBC0D;&#xC758; &#xC7A5;&#xC810;&#xC744; &#xC0B4;&#xB9AC;&#xBA74;&#xC11C;&#xB3C4; &#xAC15;&#xB825;&#xD55C; &#xAE30;&#xB2A5;&#xC744; &#xC81C;&#xACF5;&#xD558;&#xC5EC; React &#xAC1C;&#xBC1C;&#xC744; &#xB354;&#xC6B1; &#xD6A8;&#xC728;&#xC801;&#xC774;&#xACE0; &#xC9C1;&#xAD00;&#xC801;&#xC73C;&#xB85C; &#xB9CC;&#xB4E4;&#xC5B4;&#xC90D;&#xB2C8;&#xB2E4;. &#xC9C0;&#xC18D;&#xC801;&#xC778; &#xD559;&#xC2B5;&#xACFC; &#xC2E4;&#x8DF5;&#xC744; &#xD1B5;&#xD574; &#xC774;&#xB7EC;&#xD55C; Hook&#xB4E4;&#xC744; &#xB9C8;&#xC2A4;&#xD130;&#xD55C;&#xB2E4;&#xBA74;, &#xB354; &#xB098;&#xC740; React &#xC560;&#xD50C;&#xB9AC;&#xCF00;&#xC774;&#xC158;&#xC744; &#xAC1C;&#xBC1C;&#xD560; &#xC218; &#xC788;&#xC744; &#xAC83;&#xC785;&#xB2C8;&#xB2E4;</p>]]></content:encoded></item><item><title><![CDATA[Next.js의 Pages Router vs App Router: 상세 비교 가이드]]></title><description><![CDATA[<p>Next.js&#xB294; React &#xAE30;&#xBC18;&#xC758; &#xAC15;&#xB825;&#xD55C; &#xC6F9; &#xD504;&#xB808;&#xC784;&#xC6CC;&#xD06C;&#xB85C;, &#xC11C;&#xBC84; &#xC0AC;&#xC774;&#xB4DC; &#xB80C;&#xB354;&#xB9C1;(SSR)&#xACFC; &#xC815;&#xC801; &#xC0AC;&#xC774;&#xD2B8; &#xC0DD;&#xC131;(SSG)&#xC744; &#xC27D;&#xAC8C; &#xAD6C;&#xD604;&#xD560; &#xC218; &#xC788;&#xAC8C; &#xD574;&#xC90D;&#xB2C8;&#xB2E4;. Next.js</p>]]></description><link>https://keun.me/next-js-router/</link><guid isPermaLink="false">6701431d0d908c000122dc2f</guid><category><![CDATA[javascript]]></category><dc:creator><![CDATA[Keun.R]]></dc:creator><pubDate>Sat, 05 Oct 2024 13:57:08 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1643116774075-acc00caa9a7b?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDF8fG5leHQuanN8ZW58MHx8fHwxNzI4MTM2MjY2fDA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" medium="image"/><content:encoded><![CDATA[<img src="https://images.unsplash.com/photo-1643116774075-acc00caa9a7b?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDF8fG5leHQuanN8ZW58MHx8fHwxNzI4MTM2MjY2fDA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" alt="Next.js&#xC758; Pages Router vs App Router: &#xC0C1;&#xC138; &#xBE44;&#xAD50; &#xAC00;&#xC774;&#xB4DC;"><p>Next.js&#xB294; React &#xAE30;&#xBC18;&#xC758; &#xAC15;&#xB825;&#xD55C; &#xC6F9; &#xD504;&#xB808;&#xC784;&#xC6CC;&#xD06C;&#xB85C;, &#xC11C;&#xBC84; &#xC0AC;&#xC774;&#xB4DC; &#xB80C;&#xB354;&#xB9C1;(SSR)&#xACFC; &#xC815;&#xC801; &#xC0AC;&#xC774;&#xD2B8; &#xC0DD;&#xC131;(SSG)&#xC744; &#xC27D;&#xAC8C; &#xAD6C;&#xD604;&#xD560; &#xC218; &#xC788;&#xAC8C; &#xD574;&#xC90D;&#xB2C8;&#xB2E4;. Next.js 13 &#xBC84;&#xC804;&#xBD80;&#xD130;&#xB294; &#xAE30;&#xC874;&#xC758; Pages Router&#xC640; &#xD568;&#xAED8; &#xC0C8;&#xB85C;&#xC6B4; App Router&#xAC00; &#xB3C4;&#xC785;&#xB418;&#xC5C8;&#xC2B5;&#xB2C8;&#xB2E4;. &#xC774; &#xD3EC;&#xC2A4;&#xD2B8;&#xC5D0;&#xC11C;&#xB294; &#xB450; &#xB77C;&#xC6B0;&#xD305; &#xC2DC;&#xC2A4;&#xD15C;&#xC758; &#xCC28;&#xC774;&#xC810;&#xC744; &#xC790;&#xC138;&#xD788; &#xC0B4;&#xD3B4;&#xBCF4;&#xACE0;, &#xAC01;&#xAC01;&#xC758; &#xC7A5;&#xB2E8;&#xC810;&#xC744; &#xBE44;&#xAD50;&#xD574;&#xBCF4;&#xACA0;&#xC2B5;&#xB2C8;&#xB2E4;.</p><h2 id="%EB%AA%A9%EC%B0%A8">&#xBAA9;&#xCC28;</h2><ol><li>Pages Router &#xC18C;&#xAC1C;</li><li>App Router &#xC18C;&#xAC1C;</li><li>&#xC8FC;&#xC694; &#xCC28;&#xC774;&#xC810;</li><li>Pages Router &#xC608;&#xC81C;</li><li>App Router &#xC608;&#xC81C;</li><li>&#xC5B8;&#xC81C; &#xC5B4;&#xB5A4; &#xB77C;&#xC6B0;&#xD130;&#xB97C; &#xC0AC;&#xC6A9;&#xD574;&#xC57C; &#xD560;&#xAE4C;?</li><li>&#xACB0;&#xB860;</li></ol><h2 id="pages-router-%EC%86%8C%EA%B0%9C">Pages Router &#xC18C;&#xAC1C;</h2><p>Pages Router&#xB294; Next.js&#xC758; &#xC804;&#xD1B5;&#xC801;&#xC778; &#xB77C;&#xC6B0;&#xD305; &#xC2DC;&#xC2A4;&#xD15C;&#xC785;&#xB2C8;&#xB2E4;. &#xC774; &#xC2DC;&#xC2A4;&#xD15C;&#xC740; &#xD30C;&#xC77C; &#xC2DC;&#xC2A4;&#xD15C; &#xAE30;&#xBC18; &#xB77C;&#xC6B0;&#xD305;&#xC744; &#xC0AC;&#xC6A9;&#xD558;&#xBA70;, <code>pages</code> &#xB514;&#xB809;&#xD1A0;&#xB9AC; &#xB0B4;&#xC758; &#xD30C;&#xC77C; &#xAD6C;&#xC870;&#xAC00; &#xACE7; &#xC560;&#xD50C;&#xB9AC;&#xCF00;&#xC774;&#xC158;&#xC758; &#xB77C;&#xC6B0;&#xD2B8; &#xAD6C;&#xC870;&#xAC00; &#xB429;&#xB2C8;&#xB2E4;.</p><h3 id="%EC%A3%BC%EC%9A%94-%ED%8A%B9%EC%A7%95">&#xC8FC;&#xC694; &#xD2B9;&#xC9D5;:</h3><ul><li><code>pages</code> &#xB514;&#xB809;&#xD1A0;&#xB9AC; &#xC0AC;&#xC6A9;</li><li>&#xD30C;&#xC77C; &#xC774;&#xB984; &#xAE30;&#xBC18;&#xC758; &#xB77C;&#xC6B0;&#xD305;</li><li><code>getStaticProps</code>, <code>getServerSideProps</code> &#xB4F1;&#xC744; &#xD1B5;&#xD55C; &#xB370;&#xC774;&#xD130; &#xD398;&#xCE6D;</li><li>&#xAC04;&#xB2E8;&#xD558;&#xACE0; &#xC9C1;&#xAD00;&#xC801;&#xC778; &#xAD6C;&#xC870;</li></ul><h2 id="app-router-%EC%86%8C%EA%B0%9C">App Router &#xC18C;&#xAC1C;</h2><p>App Router&#xB294; Next.js 13&#xC5D0;&#xC11C; &#xB3C4;&#xC785;&#xB41C; &#xC0C8;&#xB85C;&#xC6B4; &#xB77C;&#xC6B0;&#xD305; &#xC2DC;&#xC2A4;&#xD15C;&#xC785;&#xB2C8;&#xB2E4;. React 18&#xC758; &#xC0C8;&#xB85C;&#xC6B4; &#xAE30;&#xB2A5;&#xB4E4;&#xC744; &#xD65C;&#xC6A9;&#xD558;&#xBA70;, &#xD2B9;&#xD788; React Server Components&#xB97C; &#xAE30;&#xBCF8;&#xC801;&#xC73C;&#xB85C; &#xC9C0;&#xC6D0;&#xD569;&#xB2C8;&#xB2E4;.</p><h3 id="%EC%A3%BC%EC%9A%94-%ED%8A%B9%EC%A7%95-1">&#xC8FC;&#xC694; &#xD2B9;&#xC9D5;:</h3><ul><li><code>app</code> &#xB514;&#xB809;&#xD1A0;&#xB9AC; &#xC0AC;&#xC6A9;</li><li>&#xD3F4;&#xB354; &#xAD6C;&#xC870; &#xAE30;&#xBC18;&#xC758; &#xB77C;&#xC6B0;&#xD305;</li><li>&#xB808;&#xC774;&#xC544;&#xC6C3;, &#xB85C;&#xB529; &#xC0C1;&#xD0DC;, &#xC5D0;&#xB7EC; &#xCC98;&#xB9AC; &#xB4F1;&#xC744; &#xC704;&#xD55C; &#xD2B9;&#xC218; &#xD30C;&#xC77C;&#xB4E4;</li><li>&#xC11C;&#xBC84; &#xCEF4;&#xD3EC;&#xB10C;&#xD2B8; &#xAE30;&#xBCF8; &#xC9C0;&#xC6D0;</li><li>&#xD5A5;&#xC0C1;&#xB41C; &#xC131;&#xB2A5;&#xACFC; &#xC720;&#xC5F0;&#xC131;</li></ul><h2 id="%EC%A3%BC%EC%9A%94-%EC%B0%A8%EC%9D%B4%EC%A0%90">&#xC8FC;&#xC694; &#xCC28;&#xC774;&#xC810;</h2><ol><li><strong>&#xB514;&#xB809;&#xD1A0;&#xB9AC; &#xAD6C;&#xC870;</strong><ul><li>Pages Router: <code>pages</code> &#xB514;&#xB809;&#xD1A0;&#xB9AC;</li><li>App Router: <code>app</code> &#xB514;&#xB809;&#xD1A0;&#xB9AC;</li></ul></li><li><strong>&#xB77C;&#xC6B0;&#xD2B8; &#xC815;&#xC758;</strong><ul><li>Pages Router: &#xD30C;&#xC77C; &#xC774;&#xB984;&#xC73C;&#xB85C; &#xB77C;&#xC6B0;&#xD2B8; &#xC815;&#xC758;</li><li>App Router: &#xD3F4;&#xB354; &#xC774;&#xB984;&#xC73C;&#xB85C; &#xB77C;&#xC6B0;&#xD2B8; &#xC815;&#xC758;, <code>page.js</code> &#xD30C;&#xC77C;&#xC774; &#xD574;&#xB2F9; &#xB77C;&#xC6B0;&#xD2B8;&#xC758; UI&#xB97C; &#xB2F4;&#xB2F9;</li></ul></li><li><strong>&#xB808;&#xC774;&#xC544;&#xC6C3;</strong><ul><li>Pages Router: <code>_app.js</code>&#xC640; <code>_document.js</code>&#xB85C; &#xC804;&#xC5ED; &#xB808;&#xC774;&#xC544;&#xC6C3; &#xAD00;&#xB9AC;</li><li>App Router: &#xAC01; &#xD3F4;&#xB354;&#xC5D0; <code>layout.js</code> &#xD30C;&#xC77C;&#xC744; &#xB450;&#xC5B4; &#xC911;&#xCCA9; &#xB808;&#xC774;&#xC544;&#xC6C3; &#xC27D;&#xAC8C; &#xAD6C;&#xD604;</li></ul></li><li><strong>&#xB370;&#xC774;&#xD130; &#xD398;&#xCE6D;</strong><ul><li>Pages Router: <code>getStaticProps</code>, <code>getServerSideProps</code> &#xB4F1;&#xC758; &#xD2B9;&#xC218; &#xD568;&#xC218; &#xC0AC;&#xC6A9;</li><li>App Router: &#xCEF4;&#xD3EC;&#xB10C;&#xD2B8; &#xB0B4;&#xC5D0;&#xC11C; &#xC9C1;&#xC811; <code>async</code>/<code>await</code> &#xC0AC;&#xC6A9; &#xAC00;&#xB2A5;</li></ul></li><li><strong>&#xC11C;&#xBC84; &#xCEF4;&#xD3EC;&#xB10C;&#xD2B8;</strong><ul><li>Pages Router: &#xD074;&#xB77C;&#xC774;&#xC5B8;&#xD2B8; &#xCEF4;&#xD3EC;&#xB10C;&#xD2B8;&#xB9CC; &#xC0AC;&#xC6A9;</li><li>App Router: &#xC11C;&#xBC84; &#xCEF4;&#xD3EC;&#xB10C;&#xD2B8; &#xAE30;&#xBCF8; &#xC9C0;&#xC6D0;, <code>&apos;use client&apos;</code> &#xC9C0;&#xC2DC;&#xC5B4;&#xB85C; &#xD074;&#xB77C;&#xC774;&#xC5B8;&#xD2B8; &#xCEF4;&#xD3EC;&#xB10C;&#xD2B8; &#xC9C0;&#xC815;</li></ul></li><li><strong>&#xB3D9;&#xC801; &#xB77C;&#xC6B0;&#xD2B8;</strong><ul><li>Pages Router: <code>[param].js</code> &#xD30C;&#xC77C;&#xB85C; &#xB3D9;&#xC801; &#xB77C;&#xC6B0;&#xD2B8; &#xC0DD;&#xC131;</li><li>App Router: <code>[param]</code> &#xD3F4;&#xB354;&#xB85C; &#xB3D9;&#xC801; &#xB77C;&#xC6B0;&#xD2B8; &#xC0DD;&#xC131;</li></ul></li></ol><h2 id="pages-router-%EC%98%88%EC%A0%9C">Pages Router &#xC608;&#xC81C;</h2><p>&#xB2E4;&#xC74C;&#xC740; Pages Router&#xB97C; &#xC0AC;&#xC6A9;&#xD55C; &#xAC04;&#xB2E8;&#xD55C; &#xBE14;&#xB85C;&#xADF8; &#xC560;&#xD50C;&#xB9AC;&#xCF00;&#xC774;&#xC158;&#xC758; &#xC608;&#xC81C;&#xC785;&#xB2C8;&#xB2E4;:</p><pre><code>pages/
  index.js
  about.js
  posts/
    [id].js

</code></pre><h3 id="pagesindexjs">pages/index.js</h3><pre><code class="language-jsx">import Link from &apos;next/link&apos;

export default function Home() {
  return (
    &lt;div&gt;
      &lt;h1&gt;Welcome to my blog&lt;/h1&gt;
      &lt;Link href=&quot;/about&quot;&gt;About&lt;/Link&gt;
      &lt;Link href=&quot;/posts/1&quot;&gt;First Post&lt;/Link&gt;
    &lt;/div&gt;
  )
}

</code></pre><h3 id="pagesaboutjs">pages/about.js</h3><pre><code class="language-jsx">export default function About() {
  return &lt;h1&gt;About Us&lt;/h1&gt;
}

</code></pre><h3 id="pagespostsidjs">pages/posts/[id].js</h3><pre><code class="language-jsx">import { useRouter } from &apos;next/router&apos;

export default function Post() {
  const router = useRouter()
  const { id } = router.query

  return &lt;h1&gt;Post: {id}&lt;/h1&gt;
}

export async function getServerSideProps(context) {
// &#xC11C;&#xBC84; &#xC0AC;&#xC774;&#xB4DC;&#xC5D0;&#xC11C; &#xB370;&#xC774;&#xD130; &#xD398;&#xCE6D;
  return {
    props: {},// &#xCEF4;&#xD3EC;&#xB10C;&#xD2B8;&#xC5D0; &#xC804;&#xB2EC;&#xD560; props
  }
}

</code></pre><h2 id="app-router-%EC%98%88%EC%A0%9C">App Router &#xC608;&#xC81C;</h2><p>&#xAC19;&#xC740; &#xBE14;&#xB85C;&#xADF8; &#xC560;&#xD50C;&#xB9AC;&#xCF00;&#xC774;&#xC158;&#xC744; App Router&#xB85C; &#xAD6C;&#xD604;&#xD574;&#xBCF4;&#xACA0;&#xC2B5;&#xB2C8;&#xB2E4;:</p><pre><code>app/
  layout.js
  page.js
  about/
    page.js
  posts/
    [id]/
      page.js

</code></pre><h3 id="applayoutjs">app/layout.js</h3><pre><code class="language-jsx">export default function RootLayout({ children }) {
  return (
    &lt;html lang=&quot;en&quot;&gt;
      &lt;body&gt;{children}&lt;/body&gt;
    &lt;/html&gt;
  )
}

</code></pre><h3 id="apppagejs">app/page.js</h3><pre><code class="language-jsx">import Link from &apos;next/link&apos;

export default function Home() {
  return (
    &lt;div&gt;
      &lt;h1&gt;Welcome to my blog&lt;/h1&gt;
      &lt;Link href=&quot;/about&quot;&gt;About&lt;/Link&gt;
      &lt;Link href=&quot;/posts/1&quot;&gt;First Post&lt;/Link&gt;
    &lt;/div&gt;
  )
}

</code></pre><h3 id="appaboutpagejs">app/about/page.js</h3><pre><code class="language-jsx">export default function About() {
  return &lt;h1&gt;About Us&lt;/h1&gt;
}

</code></pre><h3 id="apppostsidpagejs">app/posts/[id]/page.js</h3><pre><code class="language-jsx">export default function Post({ params }) {
  return &lt;h1&gt;Post: {params.id}&lt;/h1&gt;
}

// &#xC11C;&#xBC84; &#xCEF4;&#xD3EC;&#xB10C;&#xD2B8;&#xC5D0;&#xC11C; &#xC9C1;&#xC811; &#xB370;&#xC774;&#xD130; &#xD398;&#xCE6D;
export async function generateMetadata({ params }) {
  const post = await fetchPost(params.id)
  return { title: post.title }
}

</code></pre><h2 id="%EC%96%B8%EC%A0%9C-%EC%96%B4%EB%96%A4-%EB%9D%BC%EC%9A%B0%ED%84%B0%EB%A5%BC-%EC%82%AC%EC%9A%A9%ED%95%B4%EC%95%BC-%ED%95%A0%EA%B9%8C">&#xC5B8;&#xC81C; &#xC5B4;&#xB5A4; &#xB77C;&#xC6B0;&#xD130;&#xB97C; &#xC0AC;&#xC6A9;&#xD574;&#xC57C; &#xD560;&#xAE4C;?</h2><ol><li><strong>Pages Router &#xC0AC;&#xC6A9;&#xC774; &#xC88B;&#xC740; &#xACBD;&#xC6B0;</strong>:<ul><li>&#xAE30;&#xC874; Next.js &#xD504;&#xB85C;&#xC81D;&#xD2B8;&#xB97C; &#xC720;&#xC9C0;&#xBCF4;&#xC218;&#xD558;&#xB294; &#xACBD;&#xC6B0;</li><li>&#xD300;&#xC774; &#xC0C8;&#xB85C;&#xC6B4; App Router&#xC5D0; &#xC775;&#xC219;&#xD558;&#xC9C0; &#xC54A;&#xC740; &#xACBD;&#xC6B0;</li><li>&#xAC04;&#xB2E8;&#xD55C; &#xC6F9;&#xC0AC;&#xC774;&#xD2B8;&#xB098; &#xC560;&#xD50C;&#xB9AC;&#xCF00;&#xC774;&#xC158;&#xC744; &#xBE60;&#xB974;&#xAC8C; &#xAC1C;&#xBC1C;&#xD574;&#xC57C; &#xD558;&#xB294; &#xACBD;&#xC6B0;</li></ul></li><li><strong>App Router &#xC0AC;&#xC6A9;&#xC774; &#xC88B;&#xC740; &#xACBD;&#xC6B0;</strong>:<ul><li>&#xC0C8;&#xB85C;&#xC6B4; &#xD504;&#xB85C;&#xC81D;&#xD2B8;&#xB97C; &#xC2DC;&#xC791;&#xD558;&#xB294; &#xACBD;&#xC6B0;</li><li>&#xC11C;&#xBC84; &#xCEF4;&#xD3EC;&#xB10C;&#xD2B8;&#xC758; &#xC774;&#xC810;&#xC744; &#xD65C;&#xC6A9;&#xD558;&#xACE0; &#xC2F6;&#xC740; &#xACBD;&#xC6B0;</li><li>&#xBCF5;&#xC7A1;&#xD55C; &#xB808;&#xC774;&#xC544;&#xC6C3; &#xAD6C;&#xC870;&#xAC00; &#xD544;&#xC694;&#xD55C; &#xACBD;&#xC6B0;</li><li>&#xCD5C;&#xC2E0; React &#xAE30;&#xB2A5;&#xC744; &#xCD5C;&#xB300;&#xD55C; &#xD65C;&#xC6A9;&#xD558;&#xACE0; &#xC2F6;&#xC740; &#xACBD;&#xC6B0;</li></ul></li></ol><h2 id="%EA%B2%B0%EB%A1%A0">&#xACB0;&#xB860;</h2><p>Pages Router&#xC640; App Router&#xB294; &#xAC01;&#xAC01;&#xC758; &#xC7A5;&#xB2E8;&#xC810;&#xC774; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;. Pages Router&#xB294; &#xAC04;&#xB2E8;&#xD558;&#xACE0; &#xC9C1;&#xAD00;&#xC801;&#xC774;&#xC9C0;&#xB9CC;, App Router&#xB294; &#xB354; &#xAC15;&#xB825;&#xD558;&#xACE0; &#xC720;&#xC5F0;&#xD55C; &#xAE30;&#xB2A5;&#xC744; &#xC81C;&#xACF5;&#xD569;&#xB2C8;&#xB2E4;. &#xD504;&#xB85C;&#xC81D;&#xD2B8;&#xC758; &#xC694;&#xAD6C;&#xC0AC;&#xD56D;&#xACFC; &#xD300;&#xC758; &#xC219;&#xB828;&#xB3C4;&#xB97C; &#xACE0;&#xB824;&#xD558;&#xC5EC; &#xC801;&#xC808;&#xD55C; &#xB77C;&#xC6B0;&#xD305; &#xC2DC;&#xC2A4;&#xD15C;&#xC744; &#xC120;&#xD0DD;&#xD558;&#xB294; &#xAC83;&#xC774; &#xC911;&#xC694;&#xD569;&#xB2C8;&#xB2E4;. Next.js&#xB294; &#xB450; &#xC2DC;&#xC2A4;&#xD15C;&#xC744; &#xB3D9;&#xC2DC;&#xC5D0; &#xC9C0;&#xC6D0;&#xD558;&#xBBC0;&#xB85C;, &#xD544;&#xC694;&#xC5D0; &#xB530;&#xB77C; &#xC810;&#xC9C4;&#xC801;&#xC73C;&#xB85C; App Router&#xB85C; &#xB9C8;&#xC774;&#xADF8;&#xB808;&#xC774;&#xC158;&#xD560; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.</p><p>Next.js&#xC758; &#xBC1C;&#xC804;&#xACFC; &#xD568;&#xAED8; App Router&#xAC00; &#xB354;&#xC6B1; &#xC911;&#xC694;&#xD574;&#xC9C8; &#xAC83;&#xC73C;&#xB85C; &#xC608;&#xC0C1;&#xB418;&#xBBC0;&#xB85C;, &#xC0C8;&#xB85C;&#xC6B4; &#xD504;&#xB85C;&#xC81D;&#xD2B8;&#xB97C; &#xC2DC;&#xC791;&#xD55C;&#xB2E4;&#xBA74; App Router&#xB97C; &#xACE0;&#xB824;&#xD574;&#xBCF4;&#xB294; &#xAC83;&#xC774; &#xC88B;&#xACA0;&#xC2B5;&#xB2C8;&#xB2E4;. &#xD558;&#xC9C0;&#xB9CC; &#xAD81;&#xADF9;&#xC801;&#xC73C;&#xB85C;&#xB294; &#xD504;&#xB85C;&#xC81D;&#xD2B8;&#xC758; &#xD2B9;&#xC131;&#xACFC; &#xD300;&#xC758; &#xC0C1;&#xD669;&#xC5D0; &#xAC00;&#xC7A5; &#xC801;&#xD569;&#xD55C; &#xC120;&#xD0DD;&#xC744; &#xD574;&#xC57C; &#xD569;&#xB2C8;&#xB2E4;.</p><p></p><p></p><h2 id="%EC%8B%A4%EC%A0%9C-%EC%B0%A8%EC%9D%B4-%EC%98%88%EC%8B%9C">&#xC2E4;&#xC81C; &#xCC28;&#xC774; &#xC608;&#xC2DC;</h2><h3 id="pagesrouter">PagesRouter</h3><pre><code>import type { NextApiRequest, NextApiResponse } from &apos;next&apos;

export default async function handler(req: NextApiRequest, res: NextApiResponse) {
  const { memberIdx, page = &apos;0&apos;, size = &apos;10&apos; } = req.query;

  try {
    const response = await fetch(`${process.env.API_BASE_URL}/short-url/list?memberIdx=${memberIdx}&amp;page=${page}&amp;size=${size}`, {
      headers: {
        // &#xD544;&#xC694;&#xD55C; &#xACBD;&#xC6B0; &#xC778;&#xC99D; &#xD5E4;&#xB354; &#xB4F1;&#xC744; &#xCD94;&#xAC00;
      },
    });

    if (!response.ok) {
      throw new Error(&apos;Failed to fetch short URLs&apos;);
    }

    const data = await response.json();
    res.status(200).json(data);
  } catch (error) {
    console.error(&apos;Error fetching short URLs:&apos;, error);
    res.status(500).json({ error: &apos;Failed to fetch short URLs&apos; });
  }
}
</code></pre><h3 id="approuter">AppRouter</h3><pre><code>import { NextResponse } from &apos;next/server&apos;;

export async function GET(request: Request) {
  const { searchParams } = new URL(request.url);
  const memberIdx = searchParams.get(&apos;memberIdx&apos;);
  const page = searchParams.get(&apos;page&apos;) || &apos;0&apos;;
  const size = searchParams.get(&apos;size&apos;) || &apos;10&apos;;

  try {
    const response = await fetch(`${process.env.API_BASE_URL}/short-url/list?memberIdx=${memberIdx}&amp;page=${page}&amp;size=${size}`, {
      headers: {
        // &#xD544;&#xC694;&#xD55C; &#xACBD;&#xC6B0; &#xC778;&#xC99D; &#xD5E4;&#xB354; &#xB4F1;&#xC744; &#xCD94;&#xAC00;
      },
    });

    console.log(response);

    if (!response.ok) {
      throw new Error(&apos;Failed to fetch short URLs&apos;);
    }

    const data = await response.json();
    return NextResponse.json(data);
  } catch (error) {
    console.error(&apos;Error fetching short URLs:&apos;, error);
    return NextResponse.json({ error: &apos;Failed to fetch short URLs&apos; }, { status: 500 });
  }
}</code></pre><p></p><h2 id="%EC%8B%A4%EC%A0%9C-%EC%82%AC%EC%9A%A9-%EA%B2%BD%ED%97%98%EA%B3%BC-%EC%B6%94%EC%84%B8">&#xC2E4;&#xC81C; &#xC0AC;&#xC6A9; &#xACBD;&#xD5D8;&#xACFC; &#xCD94;&#xC138;</h2><ol><li>Pages Router &#xC120;&#xD638; &#xC774;&#xC720;:<ul><li>&#xC775;&#xC219;&#xD568;: &#xB9CE;&#xC740; &#xAC1C;&#xBC1C;&#xC790;&#xB4E4;&#xC774; &#xC774;&#xBBF8; Pages Router&#xC5D0; &#xC775;&#xC219;&#xD569;&#xB2C8;&#xB2E4;.</li><li>&#xB2E8;&#xC21C;&#xC131;: &#xAC04;&#xB2E8;&#xD55C; &#xD504;&#xB85C;&#xC81D;&#xD2B8;&#xC5D0;&#xC11C;&#xB294; Pages Router&#xAC00; &#xB354; &#xC9C1;&#xAD00;&#xC801;&#xC77C; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.</li><li>&#xC548;&#xC815;&#xC131;: Pages Router&#xB294; &#xC624;&#xB79C; &#xAE30;&#xAC04; &#xC0AC;&#xC6A9;&#xB418;&#xC5B4; &#xC548;&#xC815;&#xC801;&#xC785;&#xB2C8;&#xB2E4;.</li><li>&#xD559;&#xC2B5; &#xACE1;&#xC120;: App Router&#xB294; &#xC0C8;&#xB85C;&#xC6B4; &#xAC1C;&#xB150; &#xD559;&#xC2B5;&#xC774; &#xD544;&#xC694;&#xD569;&#xB2C8;&#xB2E4;.</li></ul></li><li>App Router &#xBD88;&#xD3B8; &#xC0AC;&#xD56D;:<ul><li>&#xBCF5;&#xC7A1;&#xC131;: &#xC77C;&#xBD80; &#xAC1C;&#xBC1C;&#xC790;&#xB4E4;&#xC740; App Router&#xC758; &#xAD6C;&#xC870;&#xAC00; &#xB354; &#xBCF5;&#xC7A1;&#xD558;&#xB2E4;&#xACE0; &#xB290;&#xB08D;&#xB2C8;&#xB2E4;.</li><li>&#xD638;&#xD658;&#xC131; &#xBB38;&#xC81C;: &#xC77C;&#xBD80; &#xB77C;&#xC774;&#xBE0C;&#xB7EC;&#xB9AC;&#xAC00; App Router&#xC640; &#xC644;&#xBCBD;&#xD788; &#xD638;&#xD658;&#xB418;&#xC9C0; &#xC54A;&#xC744; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.</li><li>&#xBCC0;&#xD654; &#xC18D;&#xB3C4;: Next.js&#xC758; &#xBE60;&#xB978; &#xBCC0;&#xD654;&#xB85C; &#xC778;&#xD55C; &#xD559;&#xC2B5; &#xBD80;&#xB2F4;&#xC774; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.</li></ul></li><li>&#xC2E4;&#xC81C; &#xC0AC;&#xC6A9; &#xCD94;&#xC138;:<ul><li>&#xC810;&#xC9C4;&#xC801; &#xB3C4;&#xC785;: &#xB9CE;&#xC740; &#xD300;&#xB4E4;&#xC774; &#xC0C8; &#xD504;&#xB85C;&#xC81D;&#xD2B8;&#xC5D0;&#xC11C; App Router&#xB97C; &#xC2DC;&#xB3C4;&#xD558;&#xACE0; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.</li><li>&#xD63C;&#xD569; &#xC0AC;&#xC6A9;: &#xC77C;&#xBD80;&#xB294; &#xB450; &#xB77C;&#xC6B0;&#xD130;&#xB97C; &#xD63C;&#xD569;&#xD574;&#xC11C; &#xC0AC;&#xC6A9;&#xD558;&#xBA70; &#xC810;&#xC9C4;&#xC801;&#xC73C;&#xB85C; &#xC804;&#xD658;&#xD569;&#xB2C8;&#xB2E4;.</li><li>&#xAE30;&#xC5C5; &#xD658;&#xACBD;: &#xB300;&#xADDC;&#xBAA8; &#xAE30;&#xC5C5;&#xC5D0;&#xC11C;&#xB294; &#xC548;&#xC815;&#xC131; &#xB54C;&#xBB38;&#xC5D0; Pages Router&#xB97C; &#xC120;&#xD638;&#xD558;&#xB294; &#xACBD;&#xD5A5;&#xC774; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.</li></ul></li></ol>]]></content:encoded></item><item><title><![CDATA[npm vs Yarn: Node.js 패키지 매니저 비교]]></title><description><![CDATA[<h1 id></h1><p><strong>npm</strong>&#xACFC; <strong>Yarn</strong>&#xC740; &#xBAA8;&#xB450; <strong>Node.js</strong>&#xC5D0;&#xC11C; &#xC0AC;&#xC6A9;&#xD558;&#xB294; &#xD328;&#xD0A4;&#xC9C0; &#xB9E4;&#xB2C8;&#xC800;&#xB85C;, &#xD504;&#xB85C;&#xC81D;&#xD2B8;&#xC758; &#xC758;&#xC874;&#xC131;&#xC744; &#xC124;&#xCE58;&#xD558;&#xACE0; &#xAD00;&#xB9AC;&#xD558;&#xB294; &#xB370; &#xC0AC;&#xC6A9;&#xB429;&#xB2C8;&#xB2E4;. &#xB450; &#xD328;&#xD0A4;&#xC9C0; &#xB9E4;&#xB2C8;</p>]]></description><link>https://keun.me/npm-vs-yarn-node-js-paekiji-maenijeo-bigyo/</link><guid isPermaLink="false">66f356c40d908c000122dc23</guid><category><![CDATA[Linux]]></category><dc:creator><![CDATA[Keun.R]]></dc:creator><pubDate>Thu, 26 Sep 2024 00:00:23 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1595301390417-c66647b47e9f?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDJ8fHlhcm58ZW58MHx8fHwxNzI3MjIzNTAzfDA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" medium="image"/><content:encoded><![CDATA[<h1 id></h1><img src="https://images.unsplash.com/photo-1595301390417-c66647b47e9f?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDJ8fHlhcm58ZW58MHx8fHwxNzI3MjIzNTAzfDA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" alt="npm vs Yarn: Node.js &#xD328;&#xD0A4;&#xC9C0; &#xB9E4;&#xB2C8;&#xC800; &#xBE44;&#xAD50;"><p><strong>npm</strong>&#xACFC; <strong>Yarn</strong>&#xC740; &#xBAA8;&#xB450; <strong>Node.js</strong>&#xC5D0;&#xC11C; &#xC0AC;&#xC6A9;&#xD558;&#xB294; &#xD328;&#xD0A4;&#xC9C0; &#xB9E4;&#xB2C8;&#xC800;&#xB85C;, &#xD504;&#xB85C;&#xC81D;&#xD2B8;&#xC758; &#xC758;&#xC874;&#xC131;&#xC744; &#xC124;&#xCE58;&#xD558;&#xACE0; &#xAD00;&#xB9AC;&#xD558;&#xB294; &#xB370; &#xC0AC;&#xC6A9;&#xB429;&#xB2C8;&#xB2E4;. &#xB450; &#xD328;&#xD0A4;&#xC9C0; &#xB9E4;&#xB2C8;&#xC800;&#xB294; &#xC720;&#xC0AC;&#xD558;&#xC9C0;&#xB9CC; &#xC131;&#xB2A5;, &#xAE30;&#xB2A5;, &#xC0AC;&#xC6A9; &#xD3B8;&#xC758;&#xC131; &#xCE21;&#xBA74;&#xC5D0;&#xC11C; &#xCC28;&#xC774;&#xC810;&#xC774; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;. &#xC774; &#xD3EC;&#xC2A4;&#xD305;&#xC5D0;&#xC11C;&#xB294; <strong>npm</strong>&#xACFC; <strong>Yarn</strong>&#xC758; &#xD2B9;&#xC9D5;&#xACFC; &#xCC28;&#xC774;&#xC810;&#xC744; &#xBE44;&#xAD50;&#xD558;&#xACE0;, &#xAC01; &#xD328;&#xD0A4;&#xC9C0; &#xB9E4;&#xB2C8;&#xC800;&#xC758; &#xC7A5;&#xB2E8;&#xC810; &#xBC0F; &#xC8FC;&#xC694; &#xBA85;&#xB839;&#xC5B4;&#xB97C; &#xC18C;&#xAC1C;&#xD569;&#xB2C8;&#xB2E4;.</p><hr><h2 id="npm-%EC%86%8C%EA%B0%9C">npm &#xC18C;&#xAC1C;</h2><p><strong>npm</strong>(Node Package Manager)&#xC740; <strong>Node.js</strong>&#xC640; &#xD568;&#xAED8; &#xAE30;&#xBCF8;&#xC73C;&#xB85C; &#xC81C;&#xACF5;&#xB418;&#xB294; &#xD328;&#xD0A4;&#xC9C0; &#xB9E4;&#xB2C8;&#xC800;&#xB85C;, <strong>&#xC804; &#xC138;&#xACC4;&#xC801;&#xC73C;&#xB85C; &#xAC00;&#xC7A5; &#xB9CE;&#xC774; &#xC0AC;&#xC6A9;</strong>&#xB429;&#xB2C8;&#xB2E4;. <code>package.json</code> &#xD30C;&#xC77C;&#xC744; &#xD1B5;&#xD574; &#xD504;&#xB85C;&#xC81D;&#xD2B8;&#xC758; &#xC758;&#xC874;&#xC131;&#xC744; &#xC815;&#xC758;&#xD558;&#xACE0;, &#xD328;&#xD0A4;&#xC9C0;&#xB97C; &#xC124;&#xCE58;&#xD558;&#xAC70;&#xB098; &#xAD00;&#xB9AC;&#xD560; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.</p><ul><li><strong>&#xCD9C;&#xC2DC;</strong>: 2010&#xB144;, Node.js&#xC640; &#xD568;&#xAED8;</li><li><strong>&#xAE30;&#xBCF8; &#xC81C;&#xACF5;</strong>: Node.js&#xB97C; &#xC124;&#xCE58;&#xD558;&#xBA74; &#xC790;&#xB3D9;&#xC73C;&#xB85C; npm&#xB3C4; &#xC124;&#xCE58;&#xB429;&#xB2C8;&#xB2E4;.</li><li><strong>&#xC800;&#xC7A5;&#xC18C;</strong>: npm &#xB808;&#xC9C0;&#xC2A4;&#xD2B8;&#xB9AC;&#xC5D0;&#xB294; <strong>180&#xB9CC; &#xAC1C; &#xC774;&#xC0C1;&#xC758; &#xD328;&#xD0A4;&#xC9C0;</strong>&#xAC00; &#xB4F1;&#xB85D;&#xB418;&#xC5B4; &#xC788;&#xC73C;&#xBA70;, Node.js &#xC0DD;&#xD0DC;&#xACC4;&#xC5D0;&#xC11C; &#xC911;&#xC694;&#xD55C; &#xC5ED;&#xD560;&#xC744; &#xB2F4;&#xB2F9;&#xD558;&#xACE0; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.</li></ul><hr><h2 id="yarn-%EC%86%8C%EA%B0%9C">Yarn &#xC18C;&#xAC1C;</h2><p><strong>Yarn</strong>&#xC740; 2016&#xB144;&#xC5D0; <strong>Facebook</strong>&#xC5D0;&#xC11C; &#xAC1C;&#xBC1C;&#xD55C; &#xD328;&#xD0A4;&#xC9C0; &#xB9E4;&#xB2C8;&#xC800;&#xB85C;, <strong>npm&#xC758; &#xC18D;&#xB3C4;&#xC640; &#xC548;&#xC815;&#xC131;&#xC744; &#xAC1C;&#xC120;</strong>&#xD558;&#xAE30; &#xC704;&#xD574; &#xB9CC;&#xB4E4;&#xC5B4;&#xC84C;&#xC2B5;&#xB2C8;&#xB2E4;. <strong>&#xBCD1;&#xB82C; &#xC124;&#xCE58;</strong> &#xBC0F; <strong>&#xC624;&#xD504;&#xB77C;&#xC778; &#xCE90;&#xC2F1;</strong>&#xACFC; &#xAC19;&#xC740; &#xAE30;&#xB2A5;&#xC744; &#xD1B5;&#xD574; npm&#xBCF4;&#xB2E4; &#xB354; &#xBE60;&#xB978; &#xD328;&#xD0A4;&#xC9C0; &#xC124;&#xCE58; &#xACBD;&#xD5D8;&#xC744; &#xC81C;&#xACF5;&#xD569;&#xB2C8;&#xB2E4;.</p><ul><li><strong>&#xCD9C;&#xC2DC;</strong>: 2016&#xB144;</li><li><strong>&#xC8FC;&#xC694; &#xD2B9;&#xC9D5;</strong>: &#xB354; &#xBE60;&#xB978; &#xC124;&#xCE58; &#xC18D;&#xB3C4;, &#xCE90;&#xC2F1;, &#xC6CC;&#xD06C;&#xC2A4;&#xD398;&#xC774;&#xC2A4; &#xC9C0;&#xC6D0;</li></ul><hr><h2 id="npm-vs-yarn-%EC%A3%BC%EC%9A%94-%EC%B0%A8%EC%9D%B4%EC%A0%90">npm vs Yarn: &#xC8FC;&#xC694; &#xCC28;&#xC774;&#xC810;</h2>
<!--kg-card-begin: html-->
<table>
<thead>
<tr>
<th><strong>&#xD2B9;&#xC9D5;</strong></th>
<th><strong>npm</strong></th>
<th><strong>Yarn</strong></th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>&#xC18D;&#xB3C4;</strong></td>
<td>npm 5 &#xC774;&#xD6C4;&#xB85C; &#xC124;&#xCE58; &#xC18D;&#xB3C4; &#xAC1C;&#xC120;</td>
<td>&#xAE30;&#xBCF8;&#xC801;&#xC73C;&#xB85C; &#xB354; &#xBE60;&#xB978; &#xC124;&#xCE58; &#xC18D;&#xB3C4;</td>
</tr>
<tr>
<td><strong>&#xCE90;&#xC2F1;</strong></td>
<td>npm 5&#xBD80;&#xD130; &#xCE90;&#xC2F1; &#xC81C;&#xACF5;</td>
<td>&#xB354; &#xAC15;&#xB825;&#xD55C; &#xCE90;&#xC2F1; &#xC9C0;&#xC6D0;, &#xC774;&#xBBF8; &#xC124;&#xCE58;&#xB41C; &#xD328;&#xD0A4;&#xC9C0; &#xC7AC;&#xC0AC;&#xC6A9;</td>
</tr>
<tr>
<td><strong>&#xC6CC;&#xD06C;&#xC2A4;&#xD398;&#xC774;&#xC2A4; &#xC9C0;&#xC6D0;</strong></td>
<td>npm 7&#xBD80;&#xD130; &#xC9C0;&#xC6D0;</td>
<td>&#xCD08;&#xAE30;&#xBD80;&#xD130; Monorepo(&#xC6CC;&#xD06C;&#xC2A4;&#xD398;&#xC774;&#xC2A4;) &#xAD00;&#xB9AC; &#xAE30;&#xB2A5; &#xC81C;&#xACF5;</td>
</tr>
<tr>
<td><strong>&#xBCF4;&#xC548;</strong></td>
<td>&#xAE30;&#xBCF8; &#xBCF4;&#xC548; &#xAE30;&#xB2A5; (npm audit) &#xC81C;&#xACF5;</td>
<td>&#xBB34;&#xACB0;&#xC131; &#xAC80;&#xC0AC; &#xC81C;&#xACF5;, &#xD328;&#xD0A4;&#xC9C0; &#xCCB4;&#xD06C;&#xC12C; &#xD655;&#xC778;</td>
</tr>
<tr>
<td><strong>&#xC758;&#xC874;&#xC131; &#xAD00;&#xB9AC;</strong></td>
<td><code>package-lock.json</code> &#xD30C;&#xC77C;&#xB85C; &#xC758;&#xC874;&#xC131; &#xAD00;&#xB9AC;</td>
<td><code>yarn.lock</code> &#xD30C;&#xC77C;&#xB85C; &#xC758;&#xC874;&#xC131; &#xAD00;&#xB9AC;</td>
</tr>
<tr>
<td><strong>&#xBA85;&#xB839;&#xC5B4;</strong></td>
<td>&#xAE30;&#xBCF8; &#xBA85;&#xB839;&#xC5B4; <code>npm install</code>, <code>npm run</code></td>
<td>&#xBA85;&#xB839;&#xC5B4;&#xC5D0;&#xC11C; <code>run</code> &#xC0DD;&#xB7B5; &#xAC00;&#xB2A5; (<code>yarn start</code>)</td>
</tr>
<tr>
<td><strong>&#xBCD1;&#xB82C; &#xC124;&#xCE58;</strong></td>
<td>npm 5 &#xC774;&#xD6C4;&#xB85C; &#xAC1C;&#xC120;</td>
<td>&#xBCD1;&#xB82C; &#xC124;&#xCE58; &#xAE30;&#xB2A5;&#xC744; &#xAE30;&#xBCF8; &#xC81C;&#xACF5;</td>
</tr>
<tr>
<td><strong>&#xCD94;&#xAC00; &#xAE30;&#xB2A5;</strong></td>
<td>&#xC624;&#xD504;&#xB77C;&#xC778; &#xBAA8;&#xB4DC; &#xBC0F; &#xC77C;&#xBD80; &#xCD94;&#xAC00; &#xAE30;&#xB2A5; &#xC81C;&#xACF5;</td>
<td>&#xAE30;&#xBCF8;&#xC801;&#xC73C;&#xB85C; &#xC624;&#xD504;&#xB77C;&#xC778; &#xC124;&#xCE58; &#xAC00;&#xB2A5;</td>
</tr>
</tbody>
</table>
<!--kg-card-end: html-->
<hr><h2 id="npm%EC%9D%98-%EC%9E%A5%EC%A0%90%EA%B3%BC-%EB%8B%A8%EC%A0%90">npm&#xC758; &#xC7A5;&#xC810;&#xACFC; &#xB2E8;&#xC810;</h2><h3 id="%EC%9E%A5%EC%A0%90">&#xC7A5;&#xC810;</h3><ul><li><strong>Node.js &#xAE30;&#xBCF8; &#xD328;&#xD0A4;&#xC9C0; &#xB9E4;&#xB2C8;&#xC800;</strong>&#xB85C; &#xC124;&#xCE58;&#xC640; &#xC0AC;&#xC6A9;&#xC774; &#xAC04;&#xD3B8;&#xD569;&#xB2C8;&#xB2E4;.</li><li><strong>&#xC804; &#xC138;&#xACC4;&#xC801;&#xC73C;&#xB85C; &#xC0AC;&#xC6A9;</strong>&#xB418;&#xBA70;, &#xBC29;&#xB300;&#xD55C; &#xD328;&#xD0A4;&#xC9C0; &#xB808;&#xC9C0;&#xC2A4;&#xD2B8;&#xB9AC;&#xB97C; &#xD1B5;&#xD574; &#xB2E4;&#xC591;&#xD55C; &#xD328;&#xD0A4;&#xC9C0;&#xB97C; &#xC0AC;&#xC6A9;&#xD560; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.</li><li><strong>npm audit</strong>&#xC744; &#xD1B5;&#xD574; &#xBCF4;&#xC548; &#xCDE8;&#xC57D;&#xC810;&#xC744; &#xAC80;&#xC0AC;&#xD560; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.</li><li><strong>npm 5</strong> &#xC774;&#xD6C4; &#xC18D;&#xB3C4;&#xC640; &#xC131;&#xB2A5;&#xC774; &#xD06C;&#xAC8C; &#xAC1C;&#xC120;&#xB418;&#xC5C8;&#xC2B5;&#xB2C8;&#xB2E4;.</li></ul><h3 id="%EB%8B%A8%EC%A0%90">&#xB2E8;&#xC810;</h3><ul><li>&#xC774;&#xC804; &#xBC84;&#xC804;&#xC758; npm&#xC740; <strong>&#xC124;&#xCE58; &#xC18D;&#xB3C4;&#xAC00; &#xB290;&#xB9AC;&#xACE0;</strong>, &#xC758;&#xC874;&#xC131; &#xCDA9;&#xB3CC; &#xBB38;&#xC81C;&#xAC00; &#xBC1C;&#xC0DD;&#xD560; &#xC218; &#xC788;&#xC5C8;&#xC2B5;&#xB2C8;&#xB2E4;.</li><li><strong>&#xD328;&#xD0A4;&#xC9C0; &#xC7A0;&#xAE08; &#xD30C;&#xC77C;</strong>(<code>package-lock.json</code>)&#xACFC; &#xC124;&#xCE58;&#xB41C; &#xD328;&#xD0A4;&#xC9C0; &#xAC04;&#xC758; &#xC77C;&#xAD00;&#xC131;&#xC774; &#xBB38;&#xC81C;&#xAC00; &#xB418;&#xB294; &#xACBD;&#xC6B0;&#xAC00; &#xC788;&#xC5C8;&#xC2B5;&#xB2C8;&#xB2E4;.</li></ul><hr><h2 id="yarn%EC%9D%98-%EC%9E%A5%EC%A0%90%EA%B3%BC-%EB%8B%A8%EC%A0%90">Yarn&#xC758; &#xC7A5;&#xC810;&#xACFC; &#xB2E8;&#xC810;</h2><h3 id="%EC%9E%A5%EC%A0%90-1">&#xC7A5;&#xC810;</h3><ul><li><strong>&#xB354; &#xBE60;&#xB978; &#xD328;&#xD0A4;&#xC9C0; &#xC124;&#xCE58; &#xC18D;&#xB3C4;</strong>: Yarn&#xC740; &#xBCD1;&#xB82C; &#xC124;&#xCE58;&#xC640; &#xCE90;&#xC2DC;&#xB97C; &#xD1B5;&#xD574; npm&#xBCF4;&#xB2E4; &#xB354; &#xBE60;&#xB974;&#xAC8C; &#xD328;&#xD0A4;&#xC9C0;&#xB97C; &#xC124;&#xCE58;&#xD560; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.</li><li><strong>&#xC624;&#xD504;&#xB77C;&#xC778; &#xCE90;&#xC2F1;</strong>: &#xD55C; &#xBC88; &#xC124;&#xCE58;&#xB41C; &#xD328;&#xD0A4;&#xC9C0;&#xB97C; &#xCE90;&#xC2DC;&#xC5D0;&#xC11C; &#xB2E4;&#xC2DC; &#xBD88;&#xB7EC;&#xC624;&#xAE30; &#xB54C;&#xBB38;&#xC5D0;, &#xB124;&#xD2B8;&#xC6CC;&#xD06C; &#xC5C6;&#xC774;&#xB3C4; &#xC124;&#xCE58;&#xAC00; &#xAC00;&#xB2A5;&#xD569;&#xB2C8;&#xB2E4;.</li><li><strong>&#xC6CC;&#xD06C;&#xC2A4;&#xD398;&#xC774;&#xC2A4; &#xC9C0;&#xC6D0;</strong>: <strong>Monorepo</strong>(&#xC5EC;&#xB7EC; &#xD504;&#xB85C;&#xC81D;&#xD2B8;&#xB97C; &#xD558;&#xB098;&#xC758; &#xC800;&#xC7A5;&#xC18C;&#xC5D0;&#xC11C; &#xAD00;&#xB9AC;) &#xD658;&#xACBD;&#xC5D0;&#xC11C; &#xC758;&#xC874;&#xC131;&#xC744; &#xC27D;&#xAC8C; &#xAD00;&#xB9AC;&#xD560; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.</li><li><strong>&#xBB34;&#xACB0;&#xC131; &#xAC80;&#xC0AC;</strong>: &#xD328;&#xD0A4;&#xC9C0;&#xAC00; &#xBCC0;&#xC870;&#xB418;&#xC9C0; &#xC54A;&#xC558;&#xC74C;&#xC744; &#xD655;&#xC778;&#xD560; &#xC218; &#xC788;&#xB294; &#xBB34;&#xACB0;&#xC131; &#xAC80;&#xC0AC;&#xB97C; &#xC81C;&#xACF5;&#xD569;&#xB2C8;&#xB2E4;.</li></ul><h3 id="%EB%8B%A8%EC%A0%90-1">&#xB2E8;&#xC810;</h3><ul><li>Yarn&#xC740; npm&#xACFC; &#xD638;&#xD658;&#xB418;&#xC9C0;&#xB9CC;, &#xD2B9;&#xC815; &#xC0C1;&#xD669;&#xC5D0;&#xC11C;&#xB294; &#xB450; &#xD328;&#xD0A4;&#xC9C0; &#xB9E4;&#xB2C8;&#xC800; &#xAC04;&#xC758; <strong>&#xCDA9;&#xB3CC;</strong>&#xC774; &#xBC1C;&#xC0DD;&#xD560; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.</li><li>npm 5 &#xC774;&#xD6C4; <strong>&#xC18D;&#xB3C4; &#xCC28;&#xC774;</strong>&#xAC00; &#xD06C;&#xAC8C; &#xC904;&#xC5B4;&#xB4E4;&#xC5B4;, Yarn&#xB9CC;&#xC758; &#xD070; &#xC7A5;&#xC810;&#xC774; &#xAC10;&#xC18C;&#xD55C; &#xCE21;&#xBA74;&#xC774; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.</li></ul><hr><h2 id="%EC%A3%BC%EC%9A%94-%EB%AA%85%EB%A0%B9%EC%96%B4-%EB%B9%84%EA%B5%90">&#xC8FC;&#xC694; &#xBA85;&#xB839;&#xC5B4; &#xBE44;&#xAD50;</h2>
<!--kg-card-begin: html-->
<table>
<thead>
<tr>
<th><strong>&#xC791;&#xC5C5;</strong></th>
<th><strong>npm &#xBA85;&#xB839;&#xC5B4;</strong></th>
<th><strong>Yarn &#xBA85;&#xB839;&#xC5B4;</strong></th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>&#xD328;&#xD0A4;&#xC9C0; &#xC124;&#xCE58;</strong></td>
<td><code>npm install</code></td>
<td><code>yarn install</code></td>
</tr>
<tr>
<td><strong>&#xC758;&#xC874;&#xC131; &#xCD94;&#xAC00;</strong></td>
<td><code>npm install package-name</code></td>
<td><code>yarn add package-name</code></td>
</tr>
<tr>
<td><strong>&#xD328;&#xD0A4;&#xC9C0; &#xC81C;&#xAC70;</strong></td>
<td><code>npm uninstall package-name</code></td>
<td><code>yarn remove package-name</code></td>
</tr>
<tr>
<td><strong>&#xC2A4;&#xD06C;&#xB9BD;&#xD2B8; &#xC2E4;&#xD589;</strong></td>
<td><code>npm run script-name</code></td>
<td><code>yarn script-name</code></td>
</tr>
<tr>
<td><strong>&#xC758;&#xC874;&#xC131; &#xC5C5;&#xB370;&#xC774;&#xD2B8;</strong></td>
<td><code>npm update</code></td>
<td><code>yarn upgrade</code></td>
</tr>
<tr>
<td><strong>&#xC804;&#xC5ED; &#xD328;&#xD0A4;&#xC9C0; &#xC124;&#xCE58;</strong></td>
<td><code>npm install -g package-name</code></td>
<td><code>yarn global add package-name</code></td>
</tr>
<tr>
<td><strong>&#xC7A0;&#xAE08; &#xD30C;&#xC77C; &#xC7AC;&#xC0DD;&#xC131;</strong></td>
<td><code>npm ci</code></td>
<td><code>yarn install --frozen-lockfile</code></td>
</tr>
</tbody>
</table>
<!--kg-card-end: html-->
<hr><h2 id="%EA%B2%B0%EB%A1%A0">&#xACB0;&#xB860;</h2><p><strong>npm</strong>&#xACFC; <strong>Yarn</strong>&#xC740; &#xBAA8;&#xB450; &#xD6CC;&#xB96D;&#xD55C; &#xD328;&#xD0A4;&#xC9C0; &#xB9E4;&#xB2C8;&#xC800;&#xC785;&#xB2C8;&#xB2E4;. <strong>npm</strong>&#xC740; Node.js&#xC640; &#xD568;&#xAED8; &#xC81C;&#xACF5;&#xB418;&#xB294; &#xAE30;&#xBCF8; &#xD328;&#xD0A4;&#xC9C0; &#xB9E4;&#xB2C8;&#xC800;&#xB85C;, &#xCD5C;&#xADFC; &#xBC84;&#xC804;&#xC5D0;&#xC11C; &#xC131;&#xB2A5;&#xACFC; &#xAE30;&#xB2A5;&#xC774; &#xD06C;&#xAC8C; &#xAC1C;&#xC120;&#xB418;&#xC5C8;&#xC2B5;&#xB2C8;&#xB2E4;. &#xBC18;&#xBA74;, <strong>Yarn</strong>&#xC740; &#xBE60;&#xB978; &#xC124;&#xCE58; &#xC18D;&#xB3C4;&#xC640; &#xC624;&#xD504;&#xB77C;&#xC778; &#xCE90;&#xC2F1;, Monorepo &#xC9C0;&#xC6D0; &#xB4F1; &#xAC15;&#xB825;&#xD55C; &#xAE30;&#xB2A5;&#xC744; &#xC81C;&#xACF5;&#xD558;&#xBA70;, &#xD2B9;&#xD788; <strong>&#xB300;&#xADDC;&#xBAA8; &#xD504;&#xB85C;&#xC81D;&#xD2B8;</strong>&#xC5D0;&#xC11C; &#xC7A5;&#xC810;&#xC744; &#xBC1C;&#xD718;&#xD569;&#xB2C8;&#xB2E4;.</p><h3 id="%EC%96%B8%EC%A0%9C-npm%EC%9D%84-%EC%84%A0%ED%83%9D%ED%95%A0%EA%B9%8C">&#xC5B8;&#xC81C; npm&#xC744; &#xC120;&#xD0DD;&#xD560;&#xAE4C;?</h3><ul><li><strong>Node.js</strong>&#xC640;&#xC758; &#xAE30;&#xBCF8; &#xD1B5;&#xD569;&#xC774; &#xD544;&#xC694;&#xD55C; &#xACBD;&#xC6B0;</li><li>&#xB354; &#xB2E8;&#xC21C;&#xD55C; &#xD504;&#xB85C;&#xC81D;&#xD2B8; &#xAD6C;&#xC870;&#xB098; &#xC791;&#xC740; &#xD504;&#xB85C;&#xC81D;&#xD2B8;&#xC5D0;&#xC11C;</li></ul><h3 id="%EC%96%B8%EC%A0%9C-yarn%EC%9D%84-%EC%84%A0%ED%83%9D%ED%95%A0%EA%B9%8C">&#xC5B8;&#xC81C; Yarn&#xC744; &#xC120;&#xD0DD;&#xD560;&#xAE4C;?</h3><ul><li><strong>Monorepo</strong> &#xAD6C;&#xC870;&#xB97C; &#xC0AC;&#xC6A9;&#xD558;&#xB294; &#xD504;&#xB85C;&#xC81D;&#xD2B8;</li><li><strong>&#xD328;&#xD0A4;&#xC9C0; &#xC124;&#xCE58; &#xC18D;&#xB3C4;</strong>&#xC640; <strong>&#xC624;&#xD504;&#xB77C;&#xC778; &#xCE90;&#xC2F1;</strong>&#xC774; &#xC911;&#xC694;&#xD55C; &#xB300;&#xADDC;&#xBAA8; &#xD504;&#xB85C;&#xC81D;&#xD2B8;&#xC5D0;&#xC11C;</li></ul><p>&#xAC01; &#xD504;&#xB85C;&#xC81D;&#xD2B8;&#xC758; &#xC694;&#xAD6C; &#xC0AC;&#xD56D;&#xC5D0; &#xB9DE;&#xCDB0; npm &#xB610;&#xB294; Yarn&#xC744; &#xC120;&#xD0DD;&#xD558;&#xC5EC; &#xC0AC;&#xC6A9;&#xD560; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.</p>]]></content:encoded></item><item><title><![CDATA[PM2: Node.js 애플리케이션을 위한 프로세스 매니저]]></title><description><![CDATA[<p><strong>PM2</strong>&#xB294; Node.js &#xC560;&#xD50C;&#xB9AC;&#xCF00;&#xC774;&#xC158;&#xC744; &#xC704;&#xD55C; <strong>&#xD504;&#xB85C;&#xB355;&#xC158; &#xB808;&#xBCA8;&#xC758; &#xD504;&#xB85C;&#xC138;&#xC2A4; &#xAD00;&#xB9AC;&#xC790;</strong>&#xC785;&#xB2C8;&#xB2E4;. &#xC11C;&#xBC84; &#xC7AC;&#xBD80;&#xD305; &#xD6C4;&#xC5D0;&#xB3C4; &#xC560;&#xD50C;&#xB9AC;&#xCF00;&#xC774;&#xC158;&#xC744; &#xACC4;&#xC18D; &#xC2E4;&#xD589;&#xD560;</p>]]></description><link>https://keun.me/pm2-node-js-aepeulrikeisyeoneul-wihan-peuroseseu-maenijeo/</link><guid isPermaLink="false">66f356280d908c000122dc16</guid><category><![CDATA[Linux]]></category><dc:creator><![CDATA[Keun.R]]></dc:creator><pubDate>Wed, 25 Sep 2024 00:17:06 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1667372393086-9d4001d51cf1?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDJ8fGJhY2tlbmR8ZW58MHx8fHwxNzI3MjIzMzUyfDA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" medium="image"/><content:encoded><![CDATA[<img src="https://images.unsplash.com/photo-1667372393086-9d4001d51cf1?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDJ8fGJhY2tlbmR8ZW58MHx8fHwxNzI3MjIzMzUyfDA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" alt="PM2: Node.js &#xC560;&#xD50C;&#xB9AC;&#xCF00;&#xC774;&#xC158;&#xC744; &#xC704;&#xD55C; &#xD504;&#xB85C;&#xC138;&#xC2A4; &#xB9E4;&#xB2C8;&#xC800;"><p><strong>PM2</strong>&#xB294; Node.js &#xC560;&#xD50C;&#xB9AC;&#xCF00;&#xC774;&#xC158;&#xC744; &#xC704;&#xD55C; <strong>&#xD504;&#xB85C;&#xB355;&#xC158; &#xB808;&#xBCA8;&#xC758; &#xD504;&#xB85C;&#xC138;&#xC2A4; &#xAD00;&#xB9AC;&#xC790;</strong>&#xC785;&#xB2C8;&#xB2E4;. &#xC11C;&#xBC84; &#xC7AC;&#xBD80;&#xD305; &#xD6C4;&#xC5D0;&#xB3C4; &#xC560;&#xD50C;&#xB9AC;&#xCF00;&#xC774;&#xC158;&#xC744; &#xACC4;&#xC18D; &#xC2E4;&#xD589;&#xD560; &#xC218; &#xC788;&#xAC8C; &#xD558;&#xACE0;, &#xD504;&#xB85C;&#xC138;&#xC2A4; &#xBAA8;&#xB2C8;&#xD130;&#xB9C1;, &#xB85C;&#xAE45;, &#xD074;&#xB7EC;&#xC2A4;&#xD130;&#xB9C1; &#xB4F1; &#xB2E4;&#xC591;&#xD55C; &#xAE30;&#xB2A5;&#xC744; &#xC81C;&#xACF5;&#xD569;&#xB2C8;&#xB2E4;. &#xD2B9;&#xD788;, <strong>&#xC2E4;&#xC2DC;&#xAC04; &#xD504;&#xB85C;&#xC138;&#xC2A4; &#xAD00;&#xB9AC;</strong> &#xBC0F; <strong>&#xC790;&#xB3D9; &#xC7AC;&#xC2DC;&#xC791;</strong>&#xC744; &#xD1B5;&#xD574; &#xC548;&#xC815;&#xC801;&#xC778; &#xC11C;&#xBC84; &#xC6B4;&#xC601;&#xC744; &#xB3D5;&#xC2B5;&#xB2C8;&#xB2E4;.</p><hr><h2 id="%EC%A3%BC%EC%9A%94-%ED%8A%B9%EC%9E%A5%EC%A0%90">&#xC8FC;&#xC694; &#xD2B9;&#xC7A5;&#xC810;</h2><h3 id="1-%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4-%EA%B4%80%EB%A6%AC">1. <strong>&#xD504;&#xB85C;&#xC138;&#xC2A4; &#xAD00;&#xB9AC;</strong></h3><ul><li>PM2&#xB294; &#xC11C;&#xBC84;&#xC5D0;&#xC11C; &#xC2E4;&#xD589;&#xB418;&#xB294; <strong>Node.js &#xC560;&#xD50C;&#xB9AC;&#xCF00;&#xC774;&#xC158;</strong>&#xC744; <strong>&#xBC31;&#xADF8;&#xB77C;&#xC6B4;&#xB4DC;&#xC5D0;&#xC11C; &#xC2E4;&#xD589;</strong>&#xD558;&#xBA70;, &#xAC01; &#xD504;&#xB85C;&#xC138;&#xC2A4;&#xC758; &#xC0C1;&#xD0DC;&#xB97C; &#xC27D;&#xAC8C; &#xBAA8;&#xB2C8;&#xD130;&#xB9C1;&#xD560; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.</li><li><strong>&#xC790;&#xB3D9; &#xC7AC;&#xC2DC;&#xC791;</strong>: &#xC560;&#xD50C;&#xB9AC;&#xCF00;&#xC774;&#xC158;&#xC774; &#xD06C;&#xB798;&#xC2DC;&#xD558;&#xBA74; &#xC790;&#xB3D9;&#xC73C;&#xB85C; &#xC7AC;&#xC2DC;&#xC791;&#xD574;&#xC90D;&#xB2C8;&#xB2E4;.</li><li><strong>&#xC790;&#xB3D9; &#xC7AC;&#xBD80;&#xD305;</strong>: &#xC11C;&#xBC84;&#xAC00; &#xC7AC;&#xBD80;&#xD305;&#xB420; &#xB54C;, PM2&#xB294; &#xC560;&#xD50C;&#xB9AC;&#xCF00;&#xC774;&#xC158;&#xC744; &#xC790;&#xB3D9;&#xC73C;&#xB85C; &#xB2E4;&#xC2DC; &#xC2DC;&#xC791;&#xD569;&#xB2C8;&#xB2E4;.</li></ul><h3 id="2-%ED%81%B4%EB%9F%AC%EC%8A%A4%ED%84%B0-%EB%AA%A8%EB%93%9C">2. <strong>&#xD074;&#xB7EC;&#xC2A4;&#xD130; &#xBAA8;&#xB4DC;</strong></h3><ul><li>PM2&#xB294; <strong>&#xD074;&#xB7EC;&#xC2A4;&#xD130; &#xBAA8;&#xB4DC;</strong>&#xB97C; &#xC81C;&#xACF5;&#xD558;&#xC5EC; &#xC5EC;&#xB7EC; CPU &#xCF54;&#xC5B4;&#xC5D0;&#xC11C; <strong>&#xB85C;&#xB4DC; &#xBD84;&#xC0B0;</strong>&#xC744; &#xC790;&#xB3D9;&#xC73C;&#xB85C; &#xCC98;&#xB9AC;&#xD569;&#xB2C8;&#xB2E4;. &#xC774; &#xAE30;&#xB2A5;&#xC744; &#xD1B5;&#xD574; &#xC131;&#xB2A5;&#xC744; &#xCD5C;&#xB300;&#xD55C; &#xD65C;&#xC6A9;&#xD560; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.</li></ul><h3 id="3-%EC%8B%A4%EC%8B%9C%EA%B0%84-%EB%A1%9C%EA%B7%B8-%EB%B0%8F-%EB%AA%A8%EB%8B%88%ED%84%B0%EB%A7%81">3. <strong>&#xC2E4;&#xC2DC;&#xAC04; &#xB85C;&#xADF8; &#xBC0F; &#xBAA8;&#xB2C8;&#xD130;&#xB9C1;</strong></h3><ul><li>PM2&#xB294; <strong>&#xC2E4;&#xC2DC;&#xAC04; &#xB85C;&#xADF8;</strong>&#xB97C; &#xC81C;&#xACF5;&#xD558;&#xC5EC; &#xD604;&#xC7AC; &#xD504;&#xB85C;&#xC138;&#xC2A4;&#xC758; &#xC0C1;&#xD0DC;&#xC640; &#xB85C;&#xADF8;&#xB97C; &#xC989;&#xC2DC; &#xD655;&#xC778;&#xD560; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.</li><li><code>pm2 monit</code> &#xBA85;&#xB839;&#xC5B4;&#xB97C; &#xD1B5;&#xD574; &#xC2E4;&#xC2DC;&#xAC04;&#xC73C;&#xB85C; &#xBA54;&#xBAA8;&#xB9AC;, CPU, &#xD504;&#xB85C;&#xC138;&#xC2A4; &#xC0C1;&#xD0DC; &#xB4F1;&#xC744; &#xBAA8;&#xB2C8;&#xD130;&#xB9C1;&#xD560; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.</li></ul><h3 id="4-%EB%B0%B0%ED%8F%AC-%EA%B4%80%EB%A6%AC">4. <strong>&#xBC30;&#xD3EC; &#xAD00;&#xB9AC;</strong></h3><ul><li>PM2&#xB294; <strong>&#xBC30;&#xD3EC; &#xD658;&#xACBD;</strong>&#xC5D0;&#xC11C;&#xB3C4; &#xC0AC;&#xC6A9; &#xAC00;&#xB2A5;&#xD558;&#xBA70;, <strong>&#xC790;&#xB3D9;&#xD654;&#xB41C; &#xBC30;&#xD3EC;</strong>&#xC640; &#xB864;&#xBC31; &#xB4F1;&#xC758; &#xAE30;&#xB2A5;&#xC744; &#xC9C0;&#xC6D0;&#xD569;&#xB2C8;&#xB2E4;.</li></ul><h3 id="5-%EC%9C%A0%EC%97%B0%ED%95%9C-%EA%B5%AC%EC%84%B1-%EB%B0%8F-%ED%86%B5%ED%95%A9">5. <strong>&#xC720;&#xC5F0;&#xD55C; &#xAD6C;&#xC131; &#xBC0F; &#xD1B5;&#xD569;</strong></h3><ul><li><code>ecosystem.config.js</code> &#xD30C;&#xC77C;&#xC744; &#xD1B5;&#xD574; &#xB2E4;&#xC911; &#xC560;&#xD50C;&#xB9AC;&#xCF00;&#xC774;&#xC158;&#xC744; &#xAD00;&#xB9AC;&#xD558;&#xAC70;&#xB098;, &#xD2B9;&#xC815; &#xC2A4;&#xD06C;&#xB9BD;&#xD2B8;, &#xD3EC;&#xD2B8;, &#xD658;&#xACBD; &#xC124;&#xC815; &#xB4F1;&#xC744; &#xBBF8;&#xB9AC; &#xC815;&#xC758;&#xD560; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.</li></ul><hr><h2 id="pm2-%EC%84%A4%EC%B9%98">PM2 &#xC124;&#xCE58;</h2><pre><code class="language-bash">npm install pm2 -g
</code></pre><p>&#xC774; &#xBA85;&#xB839;&#xC5B4;&#xB85C; PM2&#xB97C; &#xC804;&#xC5ED;&#xC73C;&#xB85C; &#xC124;&#xCE58;&#xD55C; &#xD6C4;, &#xC560;&#xD50C;&#xB9AC;&#xCF00;&#xC774;&#xC158; &#xAD00;&#xB9AC;&#xB97C; &#xC2DC;&#xC791;&#xD560; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.</p><hr><h2 id="%EC%9E%90%EC%A3%BC-%EC%82%AC%EC%9A%A9%ED%95%98%EB%8A%94-%EB%AA%85%EB%A0%B9%EC%96%B4">&#xC790;&#xC8FC; &#xC0AC;&#xC6A9;&#xD558;&#xB294; &#xBA85;&#xB839;&#xC5B4;</h2><h3 id="1-%EC%95%A0%ED%94%8C%EB%A6%AC%EC%BC%80%EC%9D%B4%EC%85%98-%EC%8B%9C%EC%9E%91">1. <strong>&#xC560;&#xD50C;&#xB9AC;&#xCF00;&#xC774;&#xC158; &#xC2DC;&#xC791;</strong></h3><pre><code class="language-bash">pm2 start app.js

</code></pre><p>&#xC774; &#xBA85;&#xB839;&#xC5B4;&#xB294; <code>app.js</code> &#xD30C;&#xC77C;&#xC744; &#xBC31;&#xADF8;&#xB77C;&#xC6B4;&#xB4DC;&#xC5D0;&#xC11C; &#xC2E4;&#xD589;&#xD569;&#xB2C8;&#xB2E4;.</p><p><strong>npm/yarn &#xBA85;&#xB839;&#xC5B4; &#xC0AC;&#xC6A9;</strong>:</p><pre><code class="language-bash">pm2 start yarn --name &quot;app-name&quot; -- start

</code></pre><h3 id="2-%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4-%EB%AA%A9%EB%A1%9D-%EB%B3%B4%EA%B8%B0">2. <strong>&#xD504;&#xB85C;&#xC138;&#xC2A4; &#xBAA9;&#xB85D; &#xBCF4;&#xAE30;</strong></h3><pre><code class="language-bash">pm2 list

</code></pre><p>&#xD604;&#xC7AC; &#xC2E4;&#xD589; &#xC911;&#xC778; &#xBAA8;&#xB4E0; &#xD504;&#xB85C;&#xC138;&#xC2A4;&#xC758; &#xC0C1;&#xD0DC;&#xB97C; &#xD655;&#xC778;&#xD560; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.</p><h3 id="3-%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4-%EC%9E%AC%EC%8B%9C%EC%9E%91">3. <strong>&#xD504;&#xB85C;&#xC138;&#xC2A4; &#xC7AC;&#xC2DC;&#xC791;</strong></h3><pre><code class="language-bash">pm2 restart app-name

</code></pre><p>&#xD504;&#xB85C;&#xC138;&#xC2A4; &#xC774;&#xB984; &#xB610;&#xB294; ID&#xB85C; &#xC7AC;&#xC2DC;&#xC791;&#xD560; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.</p><h3 id="4-%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4-%EC%A2%85%EB%A3%8C">4. <strong>&#xD504;&#xB85C;&#xC138;&#xC2A4; &#xC885;&#xB8CC;</strong></h3><pre><code class="language-bash">pm2 stop app-name

</code></pre><p>&#xC560;&#xD50C;&#xB9AC;&#xCF00;&#xC774;&#xC158;&#xC744; &#xC885;&#xB8CC;&#xD569;&#xB2C8;&#xB2E4;.</p><h3 id="5-%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4-%EC%82%AD%EC%A0%9C">5. <strong>&#xD504;&#xB85C;&#xC138;&#xC2A4; &#xC0AD;&#xC81C;</strong></h3><pre><code class="language-bash">pm2 delete app-name

</code></pre><p>&#xD504;&#xB85C;&#xC138;&#xC2A4;&#xB97C; &#xC885;&#xB8CC;&#xD558;&#xACE0; PM2&#xC5D0;&#xC11C; &#xC81C;&#xAC70;&#xD569;&#xB2C8;&#xB2E4;.</p><h3 id="6-%EC%95%A0%ED%94%8C%EB%A6%AC%EC%BC%80%EC%9D%B4%EC%85%98-%EB%A1%9C%EA%B7%B8-%ED%99%95%EC%9D%B8">6. <strong>&#xC560;&#xD50C;&#xB9AC;&#xCF00;&#xC774;&#xC158; &#xB85C;&#xADF8; &#xD655;&#xC778;</strong></h3><pre><code class="language-bash">pm2 logs

</code></pre><p>&#xC560;&#xD50C;&#xB9AC;&#xCF00;&#xC774;&#xC158;&#xC758; &#xC2E4;&#xC2DC;&#xAC04; &#xB85C;&#xADF8;&#xB97C; &#xD655;&#xC778;&#xD560; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.</p><h3 id="7-%EC%95%A0%ED%94%8C%EB%A6%AC%EC%BC%80%EC%9D%B4%EC%85%98-%EC%83%81%ED%83%9C-%EB%AA%A8%EB%8B%88%ED%84%B0%EB%A7%81">7. <strong>&#xC560;&#xD50C;&#xB9AC;&#xCF00;&#xC774;&#xC158; &#xC0C1;&#xD0DC; &#xBAA8;&#xB2C8;&#xD130;&#xB9C1;</strong></h3><pre><code class="language-bash">pm2 monit

</code></pre><p>&#xBA54;&#xBAA8;&#xB9AC;, CPU &#xC0AC;&#xC6A9;&#xB7C9; &#xBC0F; &#xD504;&#xB85C;&#xC138;&#xC2A4; &#xC0C1;&#xD0DC;&#xB97C; &#xC2E4;&#xC2DC;&#xAC04;&#xC73C;&#xB85C; &#xBAA8;&#xB2C8;&#xD130;&#xB9C1;&#xD560; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.</p><h3 id="8-pm2-%EC%83%81%ED%83%9C-%EC%A0%80%EC%9E%A5-%EB%B0%8F-%EC%9E%90%EB%8F%99-%EC%9E%AC%EC%8B%9C%EC%9E%91-%EC%84%A4%EC%A0%95">8. <strong>PM2 &#xC0C1;&#xD0DC; &#xC800;&#xC7A5; &#xBC0F; &#xC790;&#xB3D9; &#xC7AC;&#xC2DC;&#xC791; &#xC124;&#xC815;</strong></h3><p><strong>&#xC11C;&#xBC84; &#xC7AC;&#xBD80;&#xD305; &#xD6C4; &#xC790;&#xB3D9; &#xC7AC;&#xC2DC;&#xC791; &#xC124;&#xC815;</strong>:</p><pre><code class="language-bash">pm2 startup

</code></pre><p><strong>&#xD604;&#xC7AC; &#xC0C1;&#xD0DC; &#xC800;&#xC7A5;</strong>:</p><pre><code class="language-bash">pm2 save

</code></pre><p>&#xC774; &#xBA85;&#xB839;&#xC740; &#xC11C;&#xBC84;&#xAC00; &#xC7AC;&#xC2DC;&#xC791;&#xB418;&#xBA74; PM2&#xAC00; &#xC790;&#xB3D9;&#xC73C;&#xB85C; &#xC2DC;&#xC791;&#xB418;&#xB3C4;&#xB85D; &#xC124;&#xC815;&#xD569;&#xB2C8;&#xB2E4;.</p><hr><h2 id="pm2%EC%9D%98-%EC%9E%A5%EB%8B%A8%EC%A0%90">PM2&#xC758; &#xC7A5;&#xB2E8;&#xC810;</h2><h3 id="%EC%9E%A5%EC%A0%90">&#xC7A5;&#xC810;</h3><ul><li><strong>&#xC790;&#xB3D9; &#xC7AC;&#xC2DC;&#xC791;</strong>: &#xC560;&#xD50C;&#xB9AC;&#xCF00;&#xC774;&#xC158;&#xC774; &#xC911;&#xB2E8;&#xB418;&#xC5C8;&#xC744; &#xB54C; &#xC790;&#xB3D9;&#xC73C;&#xB85C; &#xB2E4;&#xC2DC; &#xC2DC;&#xC791;&#xB418;&#xBBC0;&#xB85C; &#xC11C;&#xBE44;&#xC2A4; &#xC911;&#xB2E8;&#xC744; &#xBC29;&#xC9C0;&#xD569;&#xB2C8;&#xB2E4;.</li><li><strong>&#xD074;&#xB7EC;&#xC2A4;&#xD130; &#xBAA8;&#xB4DC;</strong>: &#xC5EC;&#xB7EC; CPU &#xCF54;&#xC5B4;&#xB97C; &#xD65C;&#xC6A9;&#xD558;&#xC5EC; &#xC560;&#xD50C;&#xB9AC;&#xCF00;&#xC774;&#xC158;&#xC758; &#xC131;&#xB2A5;&#xC744; &#xADF9;&#xB300;&#xD654;&#xD569;&#xB2C8;&#xB2E4;.</li><li><strong>&#xC26C;&#xC6B4; &#xBAA8;&#xB2C8;&#xD130;&#xB9C1;</strong>: &#xC2E4;&#xC2DC;&#xAC04;&#xC73C;&#xB85C; &#xD504;&#xB85C;&#xC138;&#xC2A4;&#xB97C; &#xAD00;&#xB9AC;&#xD558;&#xACE0; &#xB85C;&#xADF8;&#xB97C; &#xD655;&#xC778;&#xD560; &#xC218; &#xC788;&#xC5B4; &#xBB38;&#xC81C;&#xB97C; &#xBE60;&#xB974;&#xAC8C; &#xD574;&#xACB0;&#xD560; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.</li><li><strong>&#xAC04;&#xD3B8;&#xD55C; &#xBC30;&#xD3EC;</strong>: &#xC5EC;&#xB7EC; &#xC560;&#xD50C;&#xB9AC;&#xCF00;&#xC774;&#xC158;&#xC744; &#xB3D9;&#xC2DC;&#xC5D0; &#xAD00;&#xB9AC;&#xD560; &#xC218; &#xC788;&#xC73C;&#xBA70;, &#xC124;&#xC815; &#xD30C;&#xC77C;&#xC744; &#xD1B5;&#xD574; &#xC790;&#xB3D9;&#xD654;&#xB41C; &#xBC30;&#xD3EC; &#xD504;&#xB85C;&#xC138;&#xC2A4;&#xB97C; &#xC9C0;&#xC6D0;&#xD569;&#xB2C8;&#xB2E4;.</li></ul><h3 id="%EB%8B%A8%EC%A0%90">&#xB2E8;&#xC810;</h3><ul><li><strong>&#xB9AC;&#xC18C;&#xC2A4; &#xC18C;&#xBE44;</strong>: &#xBC31;&#xADF8;&#xB77C;&#xC6B4;&#xB4DC;&#xC5D0;&#xC11C; &#xC2E4;&#xD589;&#xB418;&#xBBC0;&#xB85C;, &#xB300;&#xADDC;&#xBAA8; &#xC560;&#xD50C;&#xB9AC;&#xCF00;&#xC774;&#xC158;&#xC5D0;&#xC11C;&#xB294; &#xB9AC;&#xC18C;&#xC2A4;&#xAC00; &#xCD94;&#xAC00;&#xB85C; &#xC18C;&#xBAA8;&#xB420; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.</li><li><strong>&#xCD08;&#xAE30; &#xC124;&#xC815;</strong>: &#xB2E4;&#xC911; &#xC560;&#xD50C;&#xB9AC;&#xCF00;&#xC774;&#xC158; &#xBC0F; &#xBCF5;&#xC7A1;&#xD55C; &#xC124;&#xC815;&#xC774; &#xD544;&#xC694;&#xD55C; &#xACBD;&#xC6B0;, &#xCC98;&#xC74C;&#xC5D0;&#xB294; &#xC124;&#xC815;&#xC774; &#xB2E4;&#xC18C; &#xBCF5;&#xC7A1;&#xD560; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.</li></ul><hr><h2 id="%EA%B2%B0%EB%A1%A0">&#xACB0;&#xB860;</h2><p><strong>PM2</strong>&#xB294; &#xC548;&#xC815;&#xC801;&#xC778; <strong>Node.js &#xC560;&#xD50C;&#xB9AC;&#xCF00;&#xC774;&#xC158; &#xAD00;&#xB9AC;</strong>&#xB97C; &#xC704;&#xD55C; &#xD6CC;&#xB96D;&#xD55C; &#xB3C4;&#xAD6C;&#xB85C;, &#xC790;&#xB3D9;&#xD654;, &#xBAA8;&#xB2C8;&#xD130;&#xB9C1;, &#xD074;&#xB7EC;&#xC2A4;&#xD130;&#xB9C1; &#xB4F1; &#xB2E4;&#xC591;&#xD55C; &#xAE30;&#xB2A5;&#xC744; &#xC81C;&#xACF5;&#xD558;&#xC5EC; <strong>&#xD504;&#xB85C;&#xB355;&#xC158; &#xD658;&#xACBD;</strong>&#xC5D0;&#xC11C;&#xB3C4; &#xC548;&#xC815;&#xC801;&#xC73C;&#xB85C; &#xC560;&#xD50C;&#xB9AC;&#xCF00;&#xC774;&#xC158;&#xC744; &#xC6B4;&#xC601;&#xD560; &#xC218; &#xC788;&#xB3C4;&#xB85D; &#xB3C4;&#xC640;&#xC90D;&#xB2C8;&#xB2E4;. <strong>&#xC27D;&#xACE0; &#xC720;&#xC5F0;&#xD55C; &#xC124;&#xC815;</strong>&#xC73C;&#xB85C; &#xC791;&#xC740; &#xD504;&#xB85C;&#xC81D;&#xD2B8;&#xBD80;&#xD130; &#xB300;&#xADDC;&#xBAA8; &#xC11C;&#xBE44;&#xC2A4;&#xAE4C;&#xC9C0; &#xC801;&#xC6A9; &#xAC00;&#xB2A5;&#xD558;&#xBA70;, &#xD2B9;&#xD788; &#xC7A5;&#xAE30;&#xC801;&#xC73C;&#xB85C; &#xC548;&#xC815;&#xC131;&#xACFC; &#xBAA8;&#xB2C8;&#xD130;&#xB9C1;&#xC774; &#xC911;&#xC694;&#xD55C; &#xD658;&#xACBD;&#xC5D0;&#xC11C; &#xD070; &#xC7A5;&#xC810;&#xC744; &#xBC1C;&#xD718;&#xD569;&#xB2C8;&#xB2E4;.</p>]]></content:encoded></item><item><title><![CDATA[실시간 스트리밍 응답 LLM Chat 서비스]]></title><description><![CDATA[<h3 id="%EA%B0%9C%EC%9A%94"><strong>&#xAC1C;&#xC694;</strong></h3><p>LLM(&#xB300;&#xD615; &#xC5B8;&#xC5B4; &#xBAA8;&#xB378;)&#xC744; &#xD65C;&#xC6A9;&#xD55C; Chat &#xC11C;&#xBE44;&#xC2A4;&#xB97C; &#xB9CC;&#xB4E4;&#xBA74;&#xC11C;, &#xAE30;&#xC874; &#xBC29;&#xC2DD;&#xC73C;&#xB85C;&#xB294; &#xAE34; &#xC751;&#xB2F5; &#xC2DC;&#xAC04;&#xC744; &#xAE30;&#xB2E4;&#xB9AC;&#xB294; &#xAC83;&#xC774; &#xC0AC;&#xC6A9;&#xC790; &#xACBD;&#xD5D8;&#xC5D0; &#xC88B;&#xC9C0; &#xC54A;</p>]]></description><link>https://keun.me/chat-stream/</link><guid isPermaLink="false">66efdb350d908c000122dc01</guid><category><![CDATA[Dev]]></category><dc:creator><![CDATA[Keun.R]]></dc:creator><pubDate>Sun, 22 Sep 2024 08:59:08 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1698729747139-354a8053281f?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDJ8fGxsbXxlbnwwfHx8fDE3MjY5OTU1NjZ8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" medium="image"/><content:encoded><![CDATA[<h3 id="%EA%B0%9C%EC%9A%94"><strong>&#xAC1C;&#xC694;</strong></h3><img src="https://images.unsplash.com/photo-1698729747139-354a8053281f?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDJ8fGxsbXxlbnwwfHx8fDE3MjY5OTU1NjZ8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" alt="&#xC2E4;&#xC2DC;&#xAC04; &#xC2A4;&#xD2B8;&#xB9AC;&#xBC0D; &#xC751;&#xB2F5; LLM Chat &#xC11C;&#xBE44;&#xC2A4;"><p>LLM(&#xB300;&#xD615; &#xC5B8;&#xC5B4; &#xBAA8;&#xB378;)&#xC744; &#xD65C;&#xC6A9;&#xD55C; Chat &#xC11C;&#xBE44;&#xC2A4;&#xB97C; &#xB9CC;&#xB4E4;&#xBA74;&#xC11C;, &#xAE30;&#xC874; &#xBC29;&#xC2DD;&#xC73C;&#xB85C;&#xB294; &#xAE34; &#xC751;&#xB2F5; &#xC2DC;&#xAC04;&#xC744; &#xAE30;&#xB2E4;&#xB9AC;&#xB294; &#xAC83;&#xC774; &#xC0AC;&#xC6A9;&#xC790; &#xACBD;&#xD5D8;&#xC5D0; &#xC88B;&#xC9C0; &#xC54A;&#xC740; &#xC601;&#xD5A5;&#xC744; &#xBBF8;&#xCE5C;&#xB2E4;&#xB294; &#xAC83;&#xC744; &#xAE68;&#xB2EC;&#xC558;&#xC2B5;&#xB2C8;&#xB2E4;. &#xC751;&#xB2F5;&#xC774; &#xC644;&#xC804;&#xD788; &#xCC98;&#xB9AC;&#xB420; &#xB54C;&#xAE4C;&#xC9C0; &#xAE30;&#xB2E4;&#xB824;&#xC57C; &#xD558;&#xB294; &#xAD6C;&#xC870;&#xB294; &#xC0AC;&#xC6A9;&#xC790;&#xC5D0;&#xAC8C; &#xB2F5;&#xBCC0;&#xC774; &#xC9C0;&#xC5F0;&#xB41C; &#xAC83;&#xCC98;&#xB7FC; &#xB290;&#xAEF4;&#xC9C0;&#xAC8C; &#xD588;&#xC2B5;&#xB2C8;&#xB2E4;. &#xC774;&#xB97C; &#xD574;&#xACB0;&#xD558;&#xAE30; &#xC704;&#xD574; <strong>SSE(Server-Sent Events)</strong>&#xB97C; &#xC774;&#xC6A9;&#xD574; &#xC2E4;&#xC2DC;&#xAC04; &#xC2A4;&#xD2B8;&#xB9AC;&#xBC0D; &#xC751;&#xB2F5; &#xBC29;&#xC2DD;&#xC744; &#xB3C4;&#xC785;&#xD558;&#xC5EC; &#xC0AC;&#xC6A9;&#xC790; &#xACBD;&#xD5D8;&#xC744; &#xD06C;&#xAC8C; &#xAC1C;&#xC120;&#xD588;&#xC2B5;&#xB2C8;&#xB2E4;.</p><p>&#xC774;&#xBC88; &#xAE00;&#xC5D0;&#xC11C;&#xB294; &#xC81C;&#xAC00; &#xC5B4;&#xB5BB;&#xAC8C; &#xAE30;&#xC874;&#xC758; Chat &#xC11C;&#xBE44;&#xC2A4;&#xB97C; <strong>&#xC2A4;&#xD2B8;&#xB9AC;&#xBC0D; &#xAE30;&#xBC18;</strong>&#xC73C;&#xB85C; &#xC804;&#xD658;&#xD588;&#xB294;&#xC9C0;, &#xADF8;&#xB9AC;&#xACE0; &#xADF8;&#xB85C; &#xC778;&#xD574; &#xC0AC;&#xC6A9;&#xC790; &#xC778;&#xD130;&#xD398;&#xC774;&#xC2A4;(UI)&#xC640; &#xACBD;&#xD5D8;&#xC774; &#xC5B4;&#xB5BB;&#xAC8C; &#xAC1C;&#xC120;&#xB418;&#xC5C8;&#xB294;&#xC9C0;&#xB97C; &#xACF5;&#xC720;&#xD558;&#xB824; &#xD569;&#xB2C8;&#xB2E4;.</p><hr><h3 id="%EB%AC%B8%EC%A0%9C%EC%A0%90"><strong>&#xBB38;&#xC81C;&#xC810;</strong></h3><p>&#xAE30;&#xC874;&#xC758; API &#xD1B5;&#xC2E0; &#xBC29;&#xC2DD;&#xC5D0;&#xC11C;&#xB294; <strong>axios</strong>&#xB97C; &#xC0AC;&#xC6A9;&#xD558;&#xC5EC; Chat GPT API&#xC5D0; &#xC694;&#xCCAD;&#xC744; &#xBCF4;&#xB0B4;&#xACE0;, &#xC11C;&#xBC84;&#xB85C;&#xBD80;&#xD130; &#xC751;&#xB2F5;&#xC774; &#xC804;&#xBD80; &#xB3C4;&#xCC29;&#xD55C; &#xD6C4;&#xC5D0;&#xC57C; &#xC0AC;&#xC6A9;&#xC790;&#xC5D0;&#xAC8C; &#xBA54;&#xC2DC;&#xC9C0;&#xB97C; &#xC804;&#xB2EC;&#xD588;&#xC2B5;&#xB2C8;&#xB2E4;. &#xC774; &#xBC29;&#xC2DD;&#xC740; &#xD070; &#xBAA8;&#xB378;&#xC758; &#xAE34; &#xC751;&#xB2F5; &#xC2DC;&#xAC04;&#xC774; &#xC788;&#xC744; &#xB54C; &#xC0AC;&#xC6A9;&#xC790;&#xAC00; &#xC544;&#xBB34;&#xB7F0; &#xD53C;&#xB4DC;&#xBC31; &#xC5C6;&#xC774; &#xAE30;&#xB2E4;&#xB9AC;&#xAC8C; &#xB418;&#xC5B4;, <strong>&#xB290;&#xB9AC;&#xB2E4;&#xB294; &#xC778;&#xC2DD;</strong>&#xC744; &#xC8FC;&#xAE30; &#xC27D;&#xC2B5;&#xB2C8;&#xB2E4;.</p><hr><h3 id="%ED%95%B4%EA%B2%B0-%EB%B0%A9%EB%B2%95-%EC%8A%A4%ED%8A%B8%EB%A6%AC%EB%B0%8D-%EA%B8%B0%EB%B0%98%EC%9D%98-%EC%B2%98%EB%A6%AC"><strong>&#xD574;&#xACB0; &#xBC29;&#xBC95;: &#xC2A4;&#xD2B8;&#xB9AC;&#xBC0D; &#xAE30;&#xBC18;&#xC758; &#xCC98;&#xB9AC;</strong></h3><p>&#xC774; &#xBB38;&#xC81C;&#xB97C; &#xD574;&#xACB0;&#xD558;&#xAE30; &#xC704;&#xD574; <strong>SSE</strong>(Server-Sent Events)&#xB97C; &#xD65C;&#xC6A9;&#xD558;&#xC5EC; &#xC11C;&#xBC84;&#xAC00; &#xC751;&#xB2F5;&#xC744; &#xC0DD;&#xC131;&#xD558;&#xB294; &#xB300;&#xB85C; &#xC2E4;&#xC2DC;&#xAC04;&#xC73C;&#xB85C; &#xB370;&#xC774;&#xD130;&#xB97C; &#xC804;&#xC1A1;&#xD558;&#xACE0;, &#xD074;&#xB77C;&#xC774;&#xC5B8;&#xD2B8;&#xC5D0;&#xC11C; &#xC774;&#xB97C; &#xC989;&#xC2DC; &#xB80C;&#xB354;&#xB9C1;&#xD558;&#xB294; &#xBC29;&#xC2DD;&#xC744; &#xB3C4;&#xC785;&#xD588;&#xC2B5;&#xB2C8;&#xB2E4;.</p><p>SSE&#xB294; &#xD55C; &#xBC88;&#xC758; HTTP &#xC5F0;&#xACB0;&#xB85C; &#xC11C;&#xBC84;&#xC5D0;&#xC11C; &#xBC1C;&#xC0DD;&#xD558;&#xB294; &#xC774;&#xBCA4;&#xD2B8;&#xB97C; &#xD074;&#xB77C;&#xC774;&#xC5B8;&#xD2B8;&#xC5D0; &#xC2E4;&#xC2DC;&#xAC04;&#xC73C;&#xB85C; &#xC804;&#xB2EC;&#xD560; &#xC218; &#xC788;&#xAC8C; &#xD574;&#xC8FC;&#xB294; &#xAE30;&#xC220;&#xC785;&#xB2C8;&#xB2E4;. &#xC774;&#xB97C; &#xD65C;&#xC6A9;&#xD558;&#xBA74; &#xC11C;&#xBC84;&#xC758; &#xC751;&#xB2F5;&#xC744; &#xC2A4;&#xD2B8;&#xB9AC;&#xBC0D; &#xD615;&#xD0DC;&#xB85C; &#xBC1B;&#xC544;&#xC11C; &#xC0AC;&#xC6A9;&#xC790;&#xC5D0;&#xAC8C; <strong>&#xC2E4;&#xC2DC;&#xAC04;&#xC73C;&#xB85C; &#xCD9C;&#xB825;</strong>&#xD560; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.</p><hr><h3 id="%EB%B3%80%EA%B2%BD%EB%90%9C-%EC%BD%94%EB%93%9C-%EB%B6%84%EC%84%9D"><strong>&#xBCC0;&#xACBD;&#xB41C; &#xCF54;&#xB4DC; &#xBD84;&#xC11D;</strong></h3><h3 id="1-indextsx-%EB%B3%80%EA%B2%BD%EC%82%AC%ED%95%AD"><strong>1. <code>index.tsx</code> &#xBCC0;&#xACBD;&#xC0AC;&#xD56D;</strong></h3><p><strong>&#xD074;&#xB77C;&#xC774;&#xC5B8;&#xD2B8; &#xCE21;&#xC5D0;&#xC11C; &#xC2A4;&#xD2B8;&#xB9AC;&#xBC0D; &#xCC98;&#xB9AC;</strong></p><p><code>index.tsx</code> &#xD30C;&#xC77C;&#xC5D0;&#xC11C;&#xB294; &#xAE30;&#xC874;&#xC5D0; <code>axios</code>&#xB85C; &#xC694;&#xCCAD;&#xC744; &#xBCF4;&#xB0B4;&#xACE0; &#xC804;&#xBD80; &#xC751;&#xB2F5;&#xC744; &#xBC1B;&#xC740; &#xD6C4; &#xCC98;&#xB9AC;&#xD558;&#xB358; &#xB85C;&#xC9C1;&#xC744; <code>fetch</code>&#xB85C; &#xB300;&#xCCB4;&#xD558;&#xC5EC; &#xC2A4;&#xD2B8;&#xB9AC;&#xBC0D; &#xB370;&#xC774;&#xD130;&#xB97C; &#xCC98;&#xB9AC;&#xD560; &#xC218; &#xC788;&#xB3C4;&#xB85D; &#xBCC0;&#xACBD;&#xD588;&#xC2B5;&#xB2C8;&#xB2E4;.</p><pre><code class="language-tsx">const handleSendMessage = async (message: string) =&gt; {
  // Fetch&#xB97C; &#xC0AC;&#xC6A9;&#xD558;&#xC5EC; &#xC11C;&#xBC84;&#xC5D0; &#xBA54;&#xC2DC;&#xC9C0; &#xC804;&#xC1A1;
  const response = await fetch(&apos;/api/chat&apos;, {
    method: &apos;POST&apos;,
    headers: {
      &apos;Content-Type&apos;: &apos;application/json&apos;,
    },
    body: JSON.stringify({ message }),
  })

  const reader = response.body?.getReader()
  if (!reader) throw new Error(&apos;No reader&apos;)

  // &#xBE44;&#xB3D9;&#xAE30;&#xB85C; &#xC11C;&#xBC84;&#xC5D0;&#xC11C; &#xC624;&#xB294; &#xB370;&#xC774;&#xD130;&#xB97C; &#xC2A4;&#xD2B8;&#xB9BC; &#xCC98;&#xB9AC;
  let assistantMessage: Message = { role: &apos;assistant&apos;, content: &apos;&apos; }
  setCurrentChat(prev =&gt; ({
    ...prev!,
    messages: [...prev!.messages, assistantMessage],
  }))

  while (true) {
    const { done, value } = await reader.read()
    if (done) break

    const chunk = new TextDecoder().decode(value)
    const lines = chunk.split(&apos;\\n&apos;).filter(line =&gt; line.trim() !== &apos;&apos;)

    for (const line of lines) {
      const message = line.replace(/^data: /, &apos;&apos;)
      if (message === &apos;[DONE]&apos;) {
        setIsLoading(false)
        return
      }
      try {
        const parsed = JSON.parse(message)
        assistantMessage.content += parsed.content
        setCurrentChat(prev =&gt; ({
          ...prev!,
          messages: [...prev!.messages.slice(0, -1), { ...assistantMessage }],
        }))
      } catch (error) {
        console.error(&apos;Error parsing SSE message:&apos;, error)
      }
    }
  }
}

</code></pre><h3 id="%EC%A3%BC%EC%9A%94-%EB%B3%80%EA%B2%BD-%EC%82%AC%ED%95%AD"><strong>&#xC8FC;&#xC694; &#xBCC0;&#xACBD; &#xC0AC;&#xD56D;:</strong></h3><ul><li><strong><code>axios</code> &#x2192; <code>fetch</code></strong>: <code>fetch</code>&#xB294; &#xC2A4;&#xD2B8;&#xB9AC;&#xBC0D; &#xC751;&#xB2F5;&#xC744; &#xC27D;&#xAC8C; &#xCC98;&#xB9AC;&#xD560; &#xC218; &#xC788;&#xAE30; &#xB54C;&#xBB38;&#xC5D0; &#xC0AC;&#xC6A9;&#xD588;&#xC2B5;&#xB2C8;&#xB2E4;.</li><li><strong><code>ReadableStream</code> &#xC0AC;&#xC6A9;</strong>: &#xC11C;&#xBC84;&#xC5D0;&#xC11C; &#xC624;&#xB294; &#xB370;&#xC774;&#xD130;&#xB97C; &#xC2A4;&#xD2B8;&#xB9AC;&#xBC0D; &#xBC29;&#xC2DD;&#xC73C;&#xB85C; &#xC77D;&#xAE30; &#xC704;&#xD574; <strong>ReadableStream</strong>&#xC744; &#xC0AC;&#xC6A9;&#xD588;&#xC2B5;&#xB2C8;&#xB2E4;.</li><li>&#xAC01; &#xC2A4;&#xD2B8;&#xB9AC;&#xBC0D; &#xCCAD;&#xD06C;&#xB97C; &#xC218;&#xC2E0;&#xD558;&#xACE0; &#xC989;&#xC2DC; &#xBA54;&#xC2DC;&#xC9C0;&#xB97C; &#xC5C5;&#xB370;&#xC774;&#xD2B8;&#xD558;&#xC5EC;, &#xC0AC;&#xC6A9;&#xC790;&#xAC00; &#xC2E4;&#xC2DC;&#xAC04;&#xC73C;&#xB85C; &#xC751;&#xB2F5;&#xC744; &#xBC1B;&#xC744; &#xC218; &#xC788;&#xB3C4;&#xB85D; &#xD588;&#xC2B5;&#xB2C8;&#xB2E4;.</li></ul><hr><h3 id="2-chatts-%EB%B3%80%EA%B2%BD%EC%82%AC%ED%95%AD"><strong>2. <code>chat.ts</code> &#xBCC0;&#xACBD;&#xC0AC;&#xD56D;</strong></h3><p><strong>&#xC11C;&#xBC84; &#xCE21;&#xC5D0;&#xC11C; &#xC2A4;&#xD2B8;&#xB9AC;&#xBC0D; &#xC751;&#xB2F5; &#xAD6C;&#xD604;</strong></p><p><code>chat.ts</code> &#xD30C;&#xC77C;&#xC5D0;&#xC11C;&#xB294; &#xC11C;&#xBC84;&#xAC00; &#xC2A4;&#xD2B8;&#xB9AC;&#xBC0D;&#xC73C;&#xB85C; &#xC751;&#xB2F5;&#xD560; &#xC218; &#xC788;&#xB3C4;&#xB85D; SSE &#xD5E4;&#xB354;&#xB97C; &#xC124;&#xC815;&#xD558;&#xACE0;, OpenAI API&#xB85C;&#xBD80;&#xD130; &#xBC1B;&#xC740; &#xC2A4;&#xD2B8;&#xB9AC;&#xBC0D; &#xB370;&#xC774;&#xD130;&#xB97C; &#xD074;&#xB77C;&#xC774;&#xC5B8;&#xD2B8;&#xC5D0; &#xC804;&#xC1A1;&#xD558;&#xB294; &#xB85C;&#xC9C1;&#xC744; &#xCD94;&#xAC00;&#xD588;&#xC2B5;&#xB2C8;&#xB2E4;.</p><pre><code class="language-tsx">export default async function handler(
  req: NextApiRequest,
  res: NextApiResponse
) {
  res.writeHead(200, {
    &apos;Content-Type&apos;: &apos;text/event-stream&apos;,
    &apos;Cache-Control&apos;: &apos;no-cache, no-transform&apos;,
    &apos;Connection&apos;: &apos;keep-alive&apos;,
  })

  try {
    const response = await axios.post(
      &apos;&lt;https://api.openai.com/v1/chat/completions&gt;&apos;,
      {
        // OpenAI API&#xC5D0; &#xC2A4;&#xD2B8;&#xB9AC;&#xBC0D; &#xC635;&#xC158; &#xCD94;&#xAC00;
        stream: true,
      },
      {
        headers: {
          &apos;Authorization&apos;: `Bearer ${process.env.OPENAI_API_KEY}`,
        },
        responseType: &apos;stream&apos;,
      }
    )

    response.data.on(&apos;data&apos;, (chunk: Buffer) =&gt; {
      const lines = chunk.toString().split(&apos;\\n&apos;).filter(line =&gt; line.trim() !== &apos;&apos;)
      for (const line of lines) {
        const message = line.replace(/^data: /, &apos;&apos;)
        if (message === &apos;[DONE]&apos;) {
          res.write(`data: [DONE]\\n\\n`)
          res.end()
          return
        }
        try {
          const parsed = JSON.parse(message)
          const content = parsed.choices[0].delta.content
          if (content) {
            res.write(`data: ${JSON.stringify({ content })}\\n\\n`)
          }
        } catch (error) {
          console.error(&apos;Error parsing SSE message:&apos;, error)
        }
      }
    })
  } catch (error) {
    res.write(`data: ${JSON.stringify({ error: &apos;Error processing your request&apos; })}\\n\\n`)
    res.end()
  }
}

</code></pre><h3 id="%EC%A3%BC%EC%9A%94-%EB%B3%80%EA%B2%BD-%EC%82%AC%ED%95%AD-1"><strong>&#xC8FC;&#xC694; &#xBCC0;&#xACBD; &#xC0AC;&#xD56D;:</strong></h3><ul><li><strong>SSE &#xD5E4;&#xB354; &#xC124;&#xC815;</strong>: <code>Content-Type</code>&#xC744; <code>&apos;text/event-stream&apos;</code>&#xC73C;&#xB85C; &#xC124;&#xC815;&#xD558;&#xACE0;, &#xCE90;&#xC2DC;&#xB97C; &#xBE44;&#xD65C;&#xC131;&#xD654;&#xD558;&#xB294; &#xB4F1;&#xC758; &#xC635;&#xC158;&#xC744; &#xCD94;&#xAC00;&#xD588;&#xC2B5;&#xB2C8;&#xB2E4;.</li><li><strong>OpenAI API&#xC758; &#xC2A4;&#xD2B8;&#xB9AC;&#xBC0D; &#xCC98;&#xB9AC;</strong>: OpenAI API &#xC694;&#xCCAD; &#xC2DC; <code>stream: true</code> &#xC635;&#xC158;&#xC744; &#xD65C;&#xC131;&#xD654;&#xD558;&#xACE0;, &#xC2A4;&#xD2B8;&#xB9AC;&#xBC0D; &#xC751;&#xB2F5;&#xC744; &#xBC1B;&#xC544;&#xC11C; &#xD074;&#xB77C;&#xC774;&#xC5B8;&#xD2B8;&#xB85C; &#xC804;&#xC1A1;&#xD569;&#xB2C8;&#xB2E4;.</li><li>&#xAC01; &#xCCAD;&#xD06C;&#xAC00; &#xC218;&#xC2E0;&#xB420; &#xB54C;&#xB9C8;&#xB2E4; &#xC2E4;&#xC2DC;&#xAC04;&#xC73C;&#xB85C; &#xB370;&#xC774;&#xD130;&#xB97C; &#xD30C;&#xC2F1;&#xD558;&#xC5EC; &#xD074;&#xB77C;&#xC774;&#xC5B8;&#xD2B8;&#xC5D0; &#xC804;&#xC1A1;&#xD569;&#xB2C8;&#xB2E4;.</li></ul><hr><h3 id="%EC%8A%A4%ED%8A%B8%EB%A6%AC%EB%B0%8D-%EB%B0%A9%EC%8B%9D%EC%9D%98-%EC%9E%A5%EC%A0%90"><strong>&#xC2A4;&#xD2B8;&#xB9AC;&#xBC0D; &#xBC29;&#xC2DD;&#xC758; &#xC7A5;&#xC810;</strong></h3><p>&#xC774;&#xB807;&#xAC8C; &#xC2A4;&#xD2B8;&#xB9AC;&#xBC0D; &#xBC29;&#xC2DD;&#xC744; &#xC801;&#xC6A9;&#xD55C; &#xD6C4;, &#xC0AC;&#xC6A9;&#xC790; &#xACBD;&#xD5D8;&#xC740; &#xD06C;&#xAC8C; &#xAC1C;&#xC120;&#xB418;&#xC5C8;&#xC2B5;&#xB2C8;&#xB2E4;.</p><ul><li><strong>&#xBE60;&#xB978; &#xD53C;&#xB4DC;&#xBC31;</strong>: AI&#xAC00; &#xB2F5;&#xBCC0;&#xC744; &#xC0DD;&#xC131;&#xD558;&#xB294; &#xC989;&#xC2DC; &#xC0AC;&#xC6A9;&#xC790;&#xC5D0;&#xAC8C; &#xC804;&#xB2EC;&#xB418;&#xBBC0;&#xB85C;, &#xC0AC;&#xC6A9;&#xC790;&#xB294; &#xC751;&#xB2F5;&#xC774; &#xC2E4;&#xC2DC;&#xAC04;&#xC73C;&#xB85C; &#xC0DD;&#xC131;&#xB418;&#xB294; &#xACFC;&#xC815;&#xC744; &#xBCFC; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.</li><li><strong>&#xC751;&#xB2F5; &#xC2DC;&#xAC04; &#xB2E8;&#xCD95; &#xCCB4;&#xAC10;</strong>: &#xC2E4;&#xC81C;&#xB85C; &#xCC98;&#xB9AC;&#xB418;&#xB294; &#xCD1D; &#xC751;&#xB2F5; &#xC2DC;&#xAC04;&#xC740; &#xB3D9;&#xC77C;&#xD560; &#xC218; &#xC788;&#xC9C0;&#xB9CC;, &#xC0AC;&#xC6A9;&#xC790;&#xAC00; &#xC2E4;&#xC2DC;&#xAC04;&#xC73C;&#xB85C; &#xB2F5;&#xBCC0;&#xC744; &#xD655;&#xC778;&#xD560; &#xC218; &#xC788;&#xAE30; &#xB54C;&#xBB38;&#xC5D0; &#xAE30;&#xB2E4;&#xB9AC;&#xB294; &#xC2DC;&#xAC04;&#xC774; &#xC9E7;&#xAC8C; &#xB290;&#xAEF4;&#xC9D1;&#xB2C8;&#xB2E4;.</li><li><strong>UX &#xD5A5;&#xC0C1;</strong>: &#xC0AC;&#xC6A9;&#xC790;&#xB294; &#xB354; &#xC774;&#xC0C1; &#xC544;&#xBB34;&#xB7F0; &#xD53C;&#xB4DC;&#xBC31; &#xC5C6;&#xC774; &#xAE30;&#xB2E4;&#xB9AC;&#xC9C0; &#xC54A;&#xC544;&#xB3C4; &#xB418;&#xBA70;, &#xC989;&#xC2DC; &#xACB0;&#xACFC;&#xB97C; &#xD655;&#xC778;&#xD560; &#xC218; &#xC788;&#xC5B4; &#xB354;&#xC6B1; &#xC9C1;&#xAD00;&#xC801;&#xC774;&#xACE0; &#xB9CC;&#xC871;&#xC2A4;&#xB7EC;&#xC6B4; &#xACBD;&#xD5D8;&#xC744; &#xC81C;&#xACF5;&#xD569;&#xB2C8;&#xB2E4;.</li></ul><hr><h3 id="%EA%B2%B0%EB%A1%A0"><strong>&#xACB0;&#xB860;</strong></h3><p>&#xC774;&#xBC88; &#xC2A4;&#xD2B8;&#xB9AC;&#xBC0D; &#xAE30;&#xBC18;&#xC758; LLM Chat &#xC11C;&#xBE44;&#xC2A4; &#xAC1C;&#xC120; &#xC791;&#xC5C5;&#xC744; &#xD1B5;&#xD574; &#xC2E4;&#xC2DC;&#xAC04; &#xD53C;&#xB4DC;&#xBC31;&#xC758; &#xC911;&#xC694;&#xC131;&#xC744; &#xAE68;&#xB2EC;&#xC558;&#xC2B5;&#xB2C8;&#xB2E4;. &#xC0AC;&#xC6A9;&#xC790;&#xAC00; &#xAE30;&#xB2E4;&#xB9AC;&#xB294; &#xB3D9;&#xC548; &#xACC4;&#xC18D;&#xD574;&#xC11C; &#xD53C;&#xB4DC;&#xBC31;&#xC744; &#xC81C;&#xACF5;&#xD558;&#xB294; &#xBC29;&#xC2DD;&#xC740; &#xB2E8;&#xC21C;&#xD55C; &#xC131;&#xB2A5; &#xAC1C;&#xC120; &#xC774;&#xC0C1;&#xC758; <strong>&#xC0AC;&#xC6A9;&#xC790; &#xACBD;&#xD5D8;(UX) &#xD5A5;&#xC0C1;</strong>&#xC73C;&#xB85C; &#xC774;&#xC5B4;&#xC9C8; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.</p><p>SSE&#xB97C; &#xD65C;&#xC6A9;&#xD55C; &#xC2E4;&#xC2DC;&#xAC04; &#xC2A4;&#xD2B8;&#xB9AC;&#xBC0D; &#xC751;&#xB2F5;&#xC740; &#xD2B9;&#xD788; <strong>&#xB300;&#xD654;&#xD615; AI &#xC11C;&#xBE44;&#xC2A4;</strong>&#xC640; &#xAC19;&#xC774; &#xC751;&#xB2F5; &#xC2DC;&#xAC04;&#xC774; &#xC911;&#xC694;&#xD55C; &#xC11C;&#xBE44;&#xC2A4;&#xC5D0; &#xAC15;&#xB825;&#xD55C; &#xB3C4;&#xAD6C;&#xAC00; &#xB420; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;. &#xC55E;&#xC73C;&#xB85C; &#xB354; &#xB9CE;&#xC740; &#xAE30;&#xB2A5;&#xC744; &#xAC1C;&#xC120;&#xD558;&#xACE0; &#xCD5C;&#xC801;&#xD654;&#xD558;&#xBA70; &#xB354; &#xB098;&#xC740; &#xC0AC;&#xC6A9;&#xC790; &#xACBD;&#xD5D8;&#xC744; &#xC81C;&#xACF5;&#xD560; &#xC218; &#xC788;&#xB3C4;&#xB85D; &#xB178;&#xB825;&#xD560; &#xACC4;&#xD68D;&#xC785;&#xB2C8;&#xB2E4;.</p>]]></content:encoded></item><item><title><![CDATA[Vision and Mission Statement]]></title><description><![CDATA[<p></p><h3 id="%EB%AF%B8%EC%85%98">&#xBBF8;&#xC158;</h3><p>&quot;&#xAC1C;&#xC778;&#xACFC; &#xAE30;&#xC5C5;&#xC774; &#xC0DD;&#xC0B0;&#xC131;, &#xD6A8;&#xC728;&#xC131;, &#xADF8;&#xB9AC;&#xACE0; &#xC131;&#xC7A5;&#xC744; &#xD1B5;&#xD574; &#xB354; &#xD070; &#xAC00;&#xCE58;&#xB97C; &#xCC3D;&#xCD9C;&#xD558;&#xACE0;, &#xC138;&#xC0C1;&#xC5D0; &#xAE0D;&#xC815;&#xC801;&#xC778; &#xC601;&#xD5A5;&#xB825;&#xC744; &#xBBF8;&#xCE60; &#xC218; &#xC788;&#xB3C4;&#xB85D; &#xC9C0;</p>]]></description><link>https://keun.me/vision-and-mission/</link><guid isPermaLink="false">66ec3c0d0d908c000122dbd2</guid><category><![CDATA[Review]]></category><dc:creator><![CDATA[Keun.R]]></dc:creator><pubDate>Thu, 19 Sep 2024 15:07:02 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1521316730702-829a8e30dfd0?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDF8fG1pc3Npb24lMjBzdGF0ZW1lbnR8ZW58MHx8fHwxNzI2NzU3OTcwfDA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" medium="image"/><content:encoded><![CDATA[<img src="https://images.unsplash.com/photo-1521316730702-829a8e30dfd0?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDF8fG1pc3Npb24lMjBzdGF0ZW1lbnR8ZW58MHx8fHwxNzI2NzU3OTcwfDA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" alt="Vision and Mission Statement"><p></p><h3 id="%EB%AF%B8%EC%85%98">&#xBBF8;&#xC158;</h3><p>&quot;&#xAC1C;&#xC778;&#xACFC; &#xAE30;&#xC5C5;&#xC774; &#xC0DD;&#xC0B0;&#xC131;, &#xD6A8;&#xC728;&#xC131;, &#xADF8;&#xB9AC;&#xACE0; &#xC131;&#xC7A5;&#xC744; &#xD1B5;&#xD574; &#xB354; &#xD070; &#xAC00;&#xCE58;&#xB97C; &#xCC3D;&#xCD9C;&#xD558;&#xACE0;, &#xC138;&#xC0C1;&#xC5D0; &#xAE0D;&#xC815;&#xC801;&#xC778; &#xC601;&#xD5A5;&#xB825;&#xC744; &#xBBF8;&#xCE60; &#xC218; &#xC788;&#xB3C4;&#xB85D; &#xC9C0;&#xC6D0;&#xD569;&#xB2C8;&#xB2E4;.&quot;</p><p>&quot;&#xAC1C;&#xC778;&#xACFC; &#xAE30;&#xC5C5;&#xC774; &#xC5C5;&#xBB34; &#xD6A8;&#xC728;&#xC131;&#xACFC; &#xC0DD;&#xC0B0;&#xC131;&#xC744; &#xADF9;&#xB300;&#xD654;&#xD558;&#xC5EC; &#xB354; &#xD070; &#xAC00;&#xCE58;&#xB97C; &#xCC3D;&#xCD9C;&#xD558;&#xB3C4;&#xB85D; &#xC9C0;&#xC6D0;&#xD569;&#xB2C8;&#xB2E4;. &#xC774;&#xB97C; &#xD1B5;&#xD574; &#xBAA8;&#xB450;&#xC5D0;&#xAC8C; &#xC720;&#xC775;&#xC744; &#xC8FC;&#xB294; &#xC138;&#xC0C1;&#xC744; &#xB9CC;&#xB4E4;&#xC5B4;&#xAC11;&#xB2C8;&#xB2E4;.&quot;</p><h3 id="%EB%B9%84%EC%A0%84">&#xBE44;&#xC804;</h3><p>&quot;&#xBAA8;&#xB450;&#xAC00; &#xC790;&#xC2E0;&#xC758; &#xC7A0;&#xC7AC;&#xB825;&#xC744; &#xCD5C;&#xB300;&#xD55C; &#xBC1C;&#xD718;&#xD558;&#xC5EC; &#xC138;&#xC0C1;&#xC744; &#xB354; &#xB098;&#xC740; &#xACF3;&#xC73C;&#xB85C; &#xBCC0;&#xD654;&#xC2DC;&#xD0A4;&#xB294; &#xBBF8;&#xB798;&#xB97C; &#xD568;&#xAED8; &#xB9CC;&#xB4E4;&#xC5B4; &#xB098;&#xAC00;&#xACA0;&#xC2B5;&#xB2C8;&#xB2E4;.&quot;</p><p>&quot;&#xBAA8;&#xB450;&#xAC00; &#xC790;&#xC2E0;&#xC758; &#xC7A0;&#xC7AC;&#xB825;&#xC744; &#xCD5C;&#xB300;&#xD55C; &#xBC1C;&#xD718;&#xD558;&#xACE0;, &#xC138;&#xC0C1;&#xC5D0; &#xAE0D;&#xC815;&#xC801;&#xC778; &#xBCC0;&#xD654;&#xB97C; &#xD568;&#xAED8; &#xB9CC;&#xB4E4;&#xC5B4;&#xAC00;&#xACA0;&#xC2B5;&#xB2C8;&#xB2E4;.&quot;</p><p></p><hr><h2 id="%EC%B0%B8%EA%B3%A0-%EB%B9%85%ED%85%8C%ED%81%AC-%EA%B8%B0%EC%97%85%EC%9D%98-%EB%B9%84%EC%A0%84%EA%B3%BC-%EB%AF%B8%EC%85%98">(&#xCC38;&#xACE0;) &#xBE45;&#xD14C;&#xD06C; &#xAE30;&#xC5C5;&#xC758; &#xBE44;&#xC804;&#xACFC; &#xBBF8;&#xC158;</h2><ol><li><strong>&#xC560;&#xD50C; (Apple)</strong> - &#xC2A4;&#xD2F0;&#xBE0C; &#xC7A1;&#xC2A4;, &#xC2A4;&#xD2F0;&#xBE0C; &#xC6CC;&#xC988;&#xB2C8;&#xC545;<br>- &#xCD08;&#xAE30; &#xBE44;&#xC804;: &#xAC1C;&#xC778;&#xC6A9; &#xCEF4;&#xD4E8;&#xD130;&#xB97C; &#xBAA8;&#xB4E0; &#xC0AC;&#xB78C;&#xC758; &#xC190;&#xC5D0; &#xC950;&#xC5B4;&#xC8FC;&#xC790;.<br>- &#xBBF8;&#xC158;: &#xAE30;&#xC220;&#xC744; &#xB2E8;&#xC21C;&#xD558;&#xACE0; &#xC9C1;&#xAD00;&#xC801;&#xC73C;&#xB85C; &#xB9CC;&#xB4E4;&#xC5B4; &#xC77C;&#xBC18; &#xB300;&#xC911;&#xC774; &#xC27D;&#xAC8C; &#xC811;&#xADFC;&#xD560; &#xC218; &#xC788;&#xB3C4;&#xB85D; &#xD558;&#xC5EC; &#xAC1C;&#xC778;&#xC758; &#xCC3D;&#xC758;&#xC131;&#xACFC; &#xC0DD;&#xC0B0;&#xC131;&#xC744; &#xD5A5;&#xC0C1;&#xC2DC;&#xD0A4;&#xB294; &#xAC83;.<br><strong>- &#xD604;&#xC7AC; &#xBE44;&#xC804;</strong>: &quot;&#xC138;&#xC0C1;&#xC5D0;&#xC11C; &#xAC00;&#xC7A5; &#xD6CC;&#xB96D;&#xD55C; &#xC81C;&#xD488;&#xC744; &#xB9CC;&#xB4E4;&#xC5B4; &#xC0AC;&#xB78C;&#xB4E4;&#xC758; &#xC0B6;&#xC744; &#xD5A5;&#xC0C1;&#xC2DC;&#xD0A4;&#xB294; &#xAC83;&quot;</li><li><strong>&#xB9C8;&#xC774;&#xD06C;&#xB85C;&#xC18C;&#xD504;&#xD2B8; (Microsoft) </strong>- &#xBE4C; &#xAC8C;&#xC774;&#xCE20;, &#xD3F4; &#xC568;&#xB7F0;<br>- &#xCD08;&#xAE30; &#xBE44;&#xC804;: &quot;&#xBAA8;&#xB4E0; &#xCC45;&#xC0C1;&#xACFC; &#xAC00;&#xC815;&#xC5D0; &#xCEF4;&#xD4E8;&#xD130;&#xB97C; &#xD55C; &#xB300;&#xC529; &#xB193;&#xC790;.&quot;<br>- &#xBBF8;&#xC158;: &#xC18C;&#xD504;&#xD2B8;&#xC6E8;&#xC5B4;&#xB97C; &#xD1B5;&#xD574; &#xAC1C;&#xC778;&#xACFC; &#xAE30;&#xC5C5;&#xC758; &#xC0DD;&#xC0B0;&#xC131;&#xC744; &#xB192;&#xC774;&#xACE0; &#xAE30;&#xC220;&#xC758; &#xBBFC;&#xC8FC;&#xD654;&#xB97C; &#xC2E4;&#xD604;&#xD558;&#xB294; &#xAC83;.<br>- <strong>&#xD604;&#xC7AC; &#xBE44;&#xC804;</strong>: &quot;&#xC9C0;&#xAD6C;&#xC0C1;&#xC758; &#xBAA8;&#xB4E0; &#xAC1C;&#xC778;&#xACFC; &#xC870;&#xC9C1;&#xC774; &#xB354; &#xB9CE;&#xC740; &#xC131;&#xACFC;&#xB97C; &#xC774;&#xB8E8;&#xB3C4;&#xB85D; &#xB3D5;&#xB294; &#xAC83;&quot;</li><li><strong>&#xAD6C;&#xAE00; (Google)</strong> - &#xB798;&#xB9AC; &#xD398;&#xC774;&#xC9C0;, &#xC138;&#xB974;&#xAC8C;&#xC774; &#xBE0C;&#xB9B0;<br>- &#xCD08;&#xAE30; &#xBE44;&#xC804;: &quot;&#xC804; &#xC138;&#xACC4;&#xC758; &#xC815;&#xBCF4;&#xB97C; &#xCCB4;&#xACC4;&#xD654;&#xD558;&#xC5EC; &#xBAA8;&#xB450;&#xAC00; &#xC811;&#xADFC; &#xAC00;&#xB2A5;&#xD558;&#xACE0; &#xC720;&#xC6A9;&#xD558;&#xAC8C; &#xB9CC;&#xB4E4;&#xC790;.&quot;<br>- &#xBBF8;&#xC158;: &#xBC29;&#xB300;&#xD55C; &#xC778;&#xD130;&#xB137; &#xC815;&#xBCF4;&#xB97C; &#xD6A8;&#xC728;&#xC801;&#xC73C;&#xB85C; &#xAC80;&#xC0C9;&#xD558;&#xACE0; &#xC81C;&#xACF5;&#xD558;&#xC5EC; &#xC9C0;&#xC2DD;&#xC758; &#xC811;&#xADFC;&#xC131;&#xC744; &#xB192;&#xC774;&#xB294; &#xAC83;.<br><strong>- &#xD604;&#xC7AC; &#xBE44;&#xC804;</strong>: &quot;&#xC0AC;&#xC6A9;&#xC790;&#xAC00; &#xD544;&#xC694;&#xD55C; &#xC815;&#xBCF4;&#xB97C; &#xC989;&#xC2DC; &#xC5BB;&#xC744; &#xC218; &#xC788;&#xB3C4;&#xB85D; &#xB3C4;&#xC640;&#xC8FC;&#xACE0;, &#xC804; &#xC138;&#xACC4;&#xC758; &#xC815;&#xBCF4;&#xB97C; &#xC870;&#xC9C1;&#xD654;&#xD558;&#xC5EC; &#xBAA8;&#xB450;&#xC5D0;&#xAC8C; &#xC720;&#xC6A9;&#xD558;&#xAC8C; &#xC81C;&#xACF5;&quot;</li><li><strong>&#xC544;&#xB9C8;&#xC874; (Amazon)</strong> - &#xC81C;&#xD504; &#xBCA0;&#xC870;&#xC2A4;<br>- &#xCD08;&#xAE30; &#xBE44;&#xC804;: &quot;&#xC138;&#xACC4;&#xC5D0;&#xC11C; &#xAC00;&#xC7A5; &#xACE0;&#xAC1D; &#xC911;&#xC2EC;&#xC801;&#xC778; &#xD68C;&#xC0AC;&#xAC00; &#xB418;&#xC790;.<br>- &#xBBF8;&#xC158;: &#xACE0;&#xAC1D;&#xB4E4;&#xC774; &#xC628;&#xB77C;&#xC778;&#xC5D0;&#xC11C; &#xBB34;&#xC5C7;&#xC774;&#xB4E0; &#xCC3E;&#xC544;&#xC11C; &#xAD6C;&#xB9E4;&#xD560; &#xC218; &#xC788;&#xB294; &#xD50C;&#xB7AB;&#xD3FC;&#xC744; &#xC81C;&#xACF5;&#xD558;&#xC5EC; &#xC1FC;&#xD551; &#xACBD;&#xD5D8;&#xC744; &#xD601;&#xC2E0;&#xD558;&#xB294; &#xAC83;.<br><strong>- &#xD604;&#xC7AC; &#xBE44;&#xC804;</strong>: &quot;&#xACE0;&#xAC1D; &#xC911;&#xC2EC;&#xC801;&#xC778; &#xD68C;&#xC0AC;&#xB85C;, &#xC0AC;&#xB78C;&#xB4E4;&#xC774; &#xC628;&#xB77C;&#xC778;&#xC5D0;&#xC11C; &#xBB34;&#xC5C7;&#xC774;&#xB4E0; &#xCC3E;&#xACE0;, &#xBC1C;&#xACAC;&#xD558;&#xACE0;, &#xAD6C;&#xB9E4;&#xD560; &#xC218; &#xC788;&#xB3C4;&#xB85D; &#xB3D5;&#xB294; &#xAC83;&quot;</li><li><strong>&#xD398;&#xC774;&#xC2A4;&#xBD81;</strong> (Facebook, &#xD604;&#xC7AC; Meta Platforms) - &#xB9C8;&#xD06C; &#xC800;&#xCEE4;&#xBC84;&#xADF8;<br>- &#xCD08;&#xAE30; &#xBE44;&#xC804;: &quot;&#xC0AC;&#xB78C;&#xB4E4;&#xC744; &#xC5F0;&#xACB0;&#xD558;&#xC5EC; &#xB354; &#xAC1C;&#xBC29;&#xC801;&#xC774;&#xACE0; &#xC5F0;&#xACB0;&#xB41C; &#xC138;&#xC0C1;&#xC744; &#xB9CC;&#xB4E4;&#xC790;.<br>- &#xBBF8;&#xC158;: &#xC804; &#xC138;&#xACC4; &#xC0AC;&#xB78C;&#xB4E4;&#xC774; &#xC27D;&#xAC8C; &#xC18C;&#xD1B5;&#xD558;&#xACE0; &#xC815;&#xBCF4;&#xB97C; &#xACF5;&#xC720;&#xD560; &#xC218; &#xC788;&#xB294; &#xD50C;&#xB7AB;&#xD3FC;&#xC744; &#xC81C;&#xACF5;&#xD558;&#xB294; &#xAC83;.<br>- <strong>&#xD604;&#xC7AC; &#xBE44;&#xC804;</strong>: &quot;&#xCEE4;&#xBBA4;&#xB2C8;&#xD2F0;&#xB97C; &#xB9CC;&#xB4E4;&#xACE0; &#xC138;&#xC0C1;&#xC744; &#xB354; &#xAC00;&#xAE5D;&#xAC8C; &#xB9CC;&#xB4DC;&#xB294; &#xAC83;&quot;</li><li><strong>&#xD14C;&#xC2AC;&#xB77C; (Tesla)</strong> - &#xC5D8;&#xB860; &#xBA38;&#xC2A4;&#xD06C;<br>- &#xCD08;&#xAE30; &#xBE44;&#xC804;: &quot;&#xC9C0;&#xC18D; &#xAC00;&#xB2A5;&#xD55C; &#xC5D0;&#xB108;&#xC9C0;&#xB85C;&#xC758; &#xC804;&#xD658;&#xC744; &#xAC00;&#xC18D;&#xD654;&#xD558;&#xC790;.&quot;<br>- &#xBBF8;&#xC158;: &#xC804;&#xAE30; &#xC790;&#xB3D9;&#xCC28;&#xC640; &#xC7AC;&#xC0DD; &#xC5D0;&#xB108;&#xC9C0; &#xC194;&#xB8E8;&#xC158;&#xC744; &#xD1B5;&#xD574; &#xD658;&#xACBD;&#xC5D0; &#xAE0D;&#xC815;&#xC801;&#xC778; &#xC601;&#xD5A5;&#xC744; &#xBBF8;&#xCE58;&#xB294; &#xAC83;.</li><li><strong>&#xB137;&#xD50C;&#xB9AD;&#xC2A4; (Netflix)</strong> - &#xB9AC;&#xB4DC; &#xD5E4;&#xC774;&#xC2A4;&#xD305;&#xC2A4;, &#xB9C8;&#xD06C; &#xB79C;&#xB3CC;&#xD504;<br>- &#xCD08;&#xAE30; &#xBE44;&#xC804;: &quot;&#xC778;&#xD130;&#xB137;&#xC744; &#xD1B5;&#xD574; &#xC601;&#xD654;&#xB97C; &#xB300;&#xC5EC;&#xD558;&#xACE0; &#xAC10;&#xC0C1;&#xD560; &#xC218; &#xC788;&#xAC8C; &#xD558;&#xC790;.&quot;<br>- &#xBBF8;&#xC158;: &#xC5D4;&#xD130;&#xD14C;&#xC778;&#xBA3C;&#xD2B8; &#xCF58;&#xD150;&#xCE20;&#xC758; &#xC811;&#xADFC;&#xC131;&#xC744; &#xB192;&#xC774;&#xACE0; &#xC0AC;&#xC6A9;&#xC790;&#xC5D0;&#xAC8C; &#xAC1C;&#xC778;&#xD654;&#xB41C; &#xACBD;&#xD5D8;&#xC744; &#xC81C;&#xACF5;&#xD558;&#xB294; &#xAC83;.</li></ol><h3 id="%EA%B3%B5%ED%86%B5%EB%90%9C-%ED%8A%B9%EC%A7%95%EA%B3%BC-%EC%8B%9C%EC%82%AC%EC%A0%90">&#xACF5;&#xD1B5;&#xB41C; &#xD2B9;&#xC9D5;&#xACFC; &#xC2DC;&#xC0AC;&#xC810; </h3><ul><li><strong>&#xC811;&#xADFC;&#xC131; &#xD655;&#xB300;</strong>: &#xAE30;&#xC220;&#xC774;&#xB098; &#xC11C;&#xBE44;&#xC2A4;&#xB97C; &#xD1B5;&#xD574; &#xB354; &#xB9CE;&#xC740; &#xC0AC;&#xB78C;&#xB4E4;&#xC774; &#xD61C;&#xD0DD;&#xC744; &#xBC1B;&#xC744; &#xC218; &#xC788;&#xB3C4;&#xB85D; &#xD568;.</li><li><strong>&#xBB38;&#xC81C; &#xD574;&#xACB0;</strong>: &#xAE30;&#xC874;&#xC758; &#xBD88;&#xD3B8;&#xD568;&#xC774;&#xB098; &#xBE44;&#xD6A8;&#xC728;&#xC131;&#xC744; &#xAC1C;&#xC120;&#xD558;&#xC5EC; &#xC0AC;&#xC6A9;&#xC790; &#xACBD;&#xD5D8;&#xC744; &#xD601;&#xC2E0;.</li><li><strong>&#xC0DD;&#xC0B0;&#xC131; &#xD5A5;&#xC0C1;</strong>: &#xAC1C;&#xC778;&#xACFC; &#xAE30;&#xC5C5;&#xC774; &#xB354; &#xB098;&#xC740; &#xC131;&#xACFC;&#xB97C; &#xB0BC; &#xC218; &#xC788;&#xB3C4;&#xB85D; &#xB3C4;&#xC640;&#xC90C;.</li><li><strong>&#xAE0D;&#xC815;&#xC801; &#xC601;&#xD5A5;&#xB825;</strong>: &#xC138;&#xC0C1;&#xC5D0; &#xC120;&#xD55C; &#xC601;&#xD5A5;&#xB825;&#xC744; &#xBBF8;&#xCE58;&#xACE0;&#xC790; &#xD558;&#xB294; &#xBAA9;&#xD45C;.</li></ul><p>&#x2192; &quot;&#xBB38;&#xC81C; &#xD574;&#xACB0;&quot;&#xACFC; &quot;&#xC811;&#xADFC;&#xC131; &#xD655;&#xB300;&quot;</p>]]></content:encoded></item><item><title><![CDATA[[리뷰] 말하기 습관]]></title><description><![CDATA[<p>&#xCD5C;&#xADFC; &#xB9D0;&#xD558;&#xAE30;&#xC5D0; &#xB300;&#xD55C; &#xBD80;&#xC871;&#xD568;&#xC744; &#xB9CE;&#xC774; &#xB290;&#xB080;&#xB2E4;. </p><p>&#xB9C8;&#xCE58; &#xB4A4;&#xC5D0; &#xB204;&#xAD70;&#xAC00; &#xCAD3;&#xC544;&#xC624;&#xACE0; &#xC788;&#xB294;&#xAC83;&#xCC98;&#xB7FC; &#xAE09;&#xD558;&#xB2E4;. &#xB9C8;&#xC74C;&#xC758; &#xC5EC;&#xC720;&#xAC00; &#xC5C6;&#xB294; &#xD0D3;&#xC77C;&#xAE4C;? &#xC544;&#xB2C8;&#xBA74;</p>]]></description><link>https://keun.me/tell-habit/</link><guid isPermaLink="false">66e45a7c0d908c000122db54</guid><category><![CDATA[Review]]></category><dc:creator><![CDATA[Keun.R]]></dc:creator><pubDate>Fri, 13 Sep 2024 15:59:22 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1617575521317-d2974f3b56d2?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDJ8fHRlbGx8ZW58MHx8fHwxNzI2MjQyMzIxfDA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" medium="image"/><content:encoded><![CDATA[<img src="https://images.unsplash.com/photo-1617575521317-d2974f3b56d2?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDJ8fHRlbGx8ZW58MHx8fHwxNzI2MjQyMzIxfDA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" alt="[&#xB9AC;&#xBDF0;] &#xB9D0;&#xD558;&#xAE30; &#xC2B5;&#xAD00;"><p>&#xCD5C;&#xADFC; &#xB9D0;&#xD558;&#xAE30;&#xC5D0; &#xB300;&#xD55C; &#xBD80;&#xC871;&#xD568;&#xC744; &#xB9CE;&#xC774; &#xB290;&#xB080;&#xB2E4;. </p><p>&#xB9C8;&#xCE58; &#xB4A4;&#xC5D0; &#xB204;&#xAD70;&#xAC00; &#xCAD3;&#xC544;&#xC624;&#xACE0; &#xC788;&#xB294;&#xAC83;&#xCC98;&#xB7FC; &#xAE09;&#xD558;&#xB2E4;. &#xB9C8;&#xC74C;&#xC758; &#xC5EC;&#xC720;&#xAC00; &#xC5C6;&#xB294; &#xD0D3;&#xC77C;&#xAE4C;? &#xC544;&#xB2C8;&#xBA74; &#xC624;&#xB7AB;&#xB3D9;&#xC548; &#xADF8;&#xB807;&#xAC8C; &#xC9C0;&#xB0B4;&#xC628; &#xD0D3;&#xC5D0; &#xB9C8;&#xCE58; &#xBAB8;&#xC5D0; &#xC2A4;&#xBA70;&#xB4E0; &#xC2B5;&#xAD00;&#xAC19;&#xC740;&#xAC78;&#xAE4C;?</p><p>&#xC624;&#xB298; &#xC7A0;&#xC7AC; &#xACE0;&#xAC1D;&#xACFC; &#xC90C;&#xBBF8;&#xD305;&#xC744; &#xD558;&#xB294; &#xACFC;&#xC815;&#xC5D0;&#xC11C; &#xC774;&#xC491; &#xD300;&#xC7A5;&#xB2D8;&#xC774; &#xD575;&#xC2EC;&#xC744; &#xCC0C;&#xB974;&#xB294; &#xB9E4;&#xC6B0; &#xAC1D;&#xAD00;&#xC801;&#xC778; &#xD53C;&#xB4DC;&#xBC31;&#xC744; &#xC8FC;&#xC5C8;&#xB2E4;. &#xC5ED;&#xC2DC; &#xC778;&#xC0AC;&#xC774;&#xD2B8;&#xAC00; &#xC788;&#xB2E4;. <s>&#xACE0;&#xB9C8;&#xC6CC; &#xB098;&#xC758; &#xB3D9;&#xBC18;&#xC790;</s> &#xC544;&#xB798; &#xD575;&#xC2EC; 5&#xAC00;&#xC9C0;&#xB9CC; &#xACE0;&#xCCD0;&#xB3C4; &#xB9CE;&#xC774; &#xC88B;&#xC544;&#xC9C8;&#xAC70;&#xB780; &#xD76C;&#xB9DD;&#xC801; &#xBA54;&#xC138;&#xC9C0;&#xC640; &#xD568;&#xAED8;. </p><p>&#xC55E;&#xC73C;&#xB85C; &#xC77C;&#xC744; &#xD574;&#xB098;&#xAC00;&#xB294;&#xB370; &#xB098;&#xC5D0;&#xAC8C; &#xC788;&#xC5B4; &#xB9D0;&#xD558;&#xAE30;&#xB780; &#xD56D;&#xC0C1; &#xB530;&#xB77C;&#xB2E4;&#xB2D0;&#xC218; &#xBC16;&#xC5D0; &#xC5C6;&#xB294; &#xC874;&#xC7AC;&#xB2E4;. &#xD53C;&#xD574;&#xB2E4;&#xB2D0; &#xAC83;&#xC778;&#xAC00;, &#xAD00;&#xC131;&#xC5D0; &#xC816;&#xC5B4; &#xC778;&#xC9C0;&#xBABB;&#xD558;&#xACE0; &#xB9E4;&#xBC88; &#xADF8;&#xC800;&#xADF8;&#xB807;&#xAC8C; &#xC9C0;&#xB098;&#xAC08; &#xAC83;&#xC778;&#xAC00;, &#xBCC0;&#xD654;&#xB97C; &#xC8FC;&#xACE0; &#xB178;&#xB825;&#xC744; &#xD1B5;&#xD574; &#xADF9;&#xBCF5;&#xD558;&#xACE0; &#xAC1C;&#xC120;&#xD574;&#xB098;&#xAC08; &#xAC83;&#xC778;&#xAC00;.</p><p>&#xC55E;&#xC73C;&#xB85C;&#xB294; &#xC880;&#xB354; &#xAC1C;&#xC120;&#xD574;&#xB098;&#xAC00;&#xC57C;&#xC9C0;~&#xB77C;&#xACE0; &#xC0DD;&#xAC01;&#xC740; &#xD558;&#xC9C0;&#xB9CC; &#xC131;&#xD5A5;&#xC0C1; &#xB0B4;&#xC77C;&#xC774; &#xB418;&#xACE0; &#xBAA8;&#xB808;&#xAC00; &#xB418;&#xBA74; &#xB610;&#xB2E4;&#xC2DC; &#xC78A;&#xAC8C;&#xB420; &#xAC83;&#xC774;&#xB2E4;. &#xC774;&#xB97C; &#xC870;&#xAE08;&#xC774;&#xB77C;&#xB3C4; &#xB354; &#xADF9;&#xBCF5;&#xD574;&#xBCF4;&#xACE0;&#xC790; &#xC624;&#xB298; &#xC774;&#xB807;&#xAC8C; &#xD3EC;&#xC2A4;&#xD305;&#xC744; &#xD1B5;&#xD574; &#xAE00;&#xC744; &#xB0A8;&#xAE34;&#xB2E4;. </p><hr><p></p><ol><li>&#xAE09;&#xD558;&#xB2E4;. &#xBA38;&#xB9AC;&#xC18D;&#xC5D0;&#xC11C; &#xD558;&#xB294; &#xC0DD;&#xAC01;&#xB4E4;&#xC744; &#xB9D0;&#xC774; &#xB530;&#xB77C;&#xAC00;&#xC9C8; &#xBABB;&#xD55C;&#xB2E4;. &#xB450;&#xC11C;&#xAC00; &#xC5C6;&#xC774; &#xC815;&#xB9AC;&#xAC00; &#xC548;&#xB41C; &#xB2E8;&#xC5B4;&#xB4E4;&#xC774; &#xC9C8;&#xC11C;&#xC5C6;&#xC774; &#xB358;&#xC838;&#xC9C4;&#xB2E4;. &#xBB34;&#xC870;&#xAC74; &#xB9D0;&#xD558;&#xAE30; &#xC18D;&#xB3C4;&#xB97C; &#xAE30;&#xC874;&#xC758; 0.5&#xBC30;&#xC18D;&#xC73C;&#xB85C; &#xB9D0;&#xD55C;&#xB2E4;.</li><li>&#xC0C1;&#xB300;&#xBC29;&#xC758; &#xB9D0;&#xC744; &#xB04A;&#xB294;&#xB2E4;. &#xB9D0;&#xC774; &#xB05D;&#xB098;&#xC9C0; &#xC54A;&#xC558;&#xC74C;&#xC5D0;&#xB3C4; &#xAC00;&#xB85C;&#xCC44;&#xACE0; &#xC815;&#xB9AC;&#xB418;&#xC9C0; &#xC54A;&#xC740; &#xB9D0;&#xC744; &#xB0B4;&#xBC49;&#xB294;&#xB2E4;. &#xCD5C;&#xC545;&#xC774;&#xB2E4;. &#xC2DC;&#xAE09;&#xD55C; &#xAC1C;&#xC120;&#xC774; &#xD544;&#xC694;&#xD558;&#xB2E4;. &#xC0C1;&#xB300;&#xBC29;&#xC758; &#xB9D0;&#xC774; &#xB05D;&#xB098;&#xACE0; &#xCD5C;&#xC18C; 1&#xCD08;&#xC758; &#xC27C;&#xC744; &#xAC16;&#xACE0;&#xB09C; &#xB2E4;&#xC74C;&#xC774; &#xB0B4; &#xCC28;&#xB840;&#xB2E4;. </li><li>&#xD655;&#xC2E4;&#xD558;&#xC9C0; &#xC54A;&#xC73C;&#xBA74; &#xC2B9;&#xBD80;&#xB97C; &#xAC78;&#xC9C0;&#xB9C8;&#xB77C;. &#xC815;&#xD655;&#xD788; &#xAE30;&#xC5B5;&#xB098;&#xC9C0; &#xC54A;&#xAC70;&#xB098; &#xC758;&#xC0AC;&#xACB0;&#xC815;&#xD558;&#xC9C0;&#xBABB;&#xD55C; &#xC0AC;&#xD56D;&#xC5D0; &#xB300;&#xD574; &#xC648;&#xAC00;&#xC648;&#xBD80;&#xD558;&#xC9C0; &#xC54A;&#xB294;&#xB2E4;. &#xC0C1;&#xB300;&#xBC29;&#xC740; &#xD63C;&#xB780;&#xC2A4;&#xB7EC;&#xC6B8;&#xBFD0;&#xC774;&#xB2E4;. &#xD574;&#xB2F9; &#xC0AC;&#xD56D;&#xC740; &#xC81C;&#xAC00; &#xBBF8;&#xD305;&#xB05D;&#xB098;&#xACE0; &#xCCB4;&#xD06C;&#xD55C; &#xD6C4; &#xC815;&#xB9AC;&#xD574;&#xC11C; &#xB9D0;&#xC500;&#xB4DC;&#xB9AC;&#xACA0;&#xC2B5;&#xB2C8;&#xB2E4;. &#xC5BC;&#xB9C8;&#xB098; &#xAE54;&#xB054;&#xD55C;&#xAC00;. </li><li>&#xB300;&#xD654;&#xB97C; &#xD558;&#xB2E4;&#xBCF4;&#xBA74; &#xC5B8;&#xC81C;&#xB098; &#xC0DD;&#xAC01;&#xD558;&#xACE0;, &#xACE0;&#xBBFC;&#xD574;&#xBD10;&#xC57C;&#xD560;&#xB54C;&#xAC00; &#xC788;&#xB2E4;. &#xD639;&#xC740; &#xAE30;&#xC5B5;&#xC744; &#xB5A0;&#xC62C;&#xB9AC;&#xAE30;&#xC704;&#xD574; &#xB178;&#xB825;&#xD574;&#xC57C;&#xD558;&#xB294; &#xC21C;&#xAC04;&#xB4E4;. &#xADF8;&#xB7F4;&#xB54C; &#xCC9C;&#xC815;&#xC744; &#xBCF4;&#xBA70; &#xB208;&#xC744; &#xD76C;&#xBC88;&#xB355;&#xAC70;&#xB9AC;&#xC9C0; &#xC54A;&#xB294;&#xB2E4;. &#xCC28;&#xB77C;&#xB9AC; &#xC704;&#xAC00; &#xC544;&#xB2CC; &#xC544;&#xB798;&#xCABD;&#xC744; &#xBC14;&#xB77C;&#xBD10;&#xB77C;. </li><li>&#xB300;&#xD654;&#xC5D0;&#xC11C; IF&#xBB38;&#xC744; &#xC0AC;&#xC6A9;&#xD558;&#xC9C0; &#xC54A;&#xB294;&#xB2E4;. &#xD2B9;&#xD788; &#xB05D;&#xB9FA;&#xC74C;&#xC774; &#xC5C6;&#xB294; ~&#xD558;&#xB2C8;&#xAE4C; &#xCCB4;&#xB294; &#xC801;&#xADF9; &#xC9C0;&#xC591;&#xD55C;&#xB2E4;. &#xC815;&#xB9AC;&#xB41C; ~&#xB2E4; &#xCCB4;&#xAC00; &#xD544;&#xC694;&#xD558;&#xB2E4;. &#xC815;&#xBCF4;&#xB97C; &#xC804;&#xB2EC;&#xD560;&#xB54C;&#xB294; &#xC0AC;&#xC2E4;&#xC740; ~&#xC785;&#xB2C8;&#xB2E4;. &#xD55C;&#xBB38;&#xC7A5;&#xC73C;&#xB85C; &#xB9D0;&#xD55C;&#xB2E4;. &#xADF8;&#xB9AC;&#xACE4; &#xC694;&#xCCAD;&#xC0AC;&#xD56D;&#xB9CC; &#xB9D0;&#xD55C;&#xB2E4;. </li></ol><p></p><hr><p></p><p>&#xBD80;&#xB044;&#xB7FD;&#xC9C0;&#xB9CC; &#xC7A5;&#xAE30;&#xAE30;&#xC5B5;&#xC744; &#xAC15;&#xD654;&#xD558;&#xACE0; &#xD655;&#xC2E4;&#xD55C; &#xAC1C;&#xC120;&#xC744; &#xC704;&#xD574; &#xC798;&#xBABB; &#xC598;&#xAE30;&#xD55C; &#xC608;&#xC2DC;&#xB4E4;&#xB3C4; &#xD568;&#xAED8; &#xAE30;&#xB85D;&#xD55C;&#xB2E4;. <s>&#xC544;&#xB9C8; &#xC870;&#xB9CC;&#xAC04; &#xC0AD;&#xC81C;&#xD560;&#xAC70; &#xAC19;&#xB2E4;</s> &#xC774;&#xC81C; &#xC2AC;&#xB809;&#xC744; &#xCF20;&#xB2E4;. </p><p>[&#xD56D;&#xC0C1; 0.5&#xBC30;&#xC18D;&#xC73C;&#xB85C; &#xB9D0;&#xD55C;&#xB2E4;&#xACE0; &#xC0DD;&#xAC01;&#xD558;&#xACE0; &#xB9D0;&#xD558;&#xAE30;]<br>&#xC81C;&#xBC1C; &#xC5EC;&#xC720;&#xB97C; &#xAC00;&#xC9C0;&#xACE0; &#xCC9C;&#xCC9C;&#xD788;&#xD558;&#xC790;</p><p>[&#xD655;&#xC2E4;&#xD55C; &#xC815;&#xBCF4;&#xB9CC; &#xB9D0;&#xD558;&#xAE30;]<br>&#xBB38;&#xC790; &#xC6D0;&#xAC00; &#xB4F1; &#xD655;&#xC2E4;&#xCE58; &#xC54A;&#xC740; &#xC815;&#xBCF4;&#xB294; &#xB9D0;&#xD558;&#xC9C0; &#xC54A;&#xB294;&#xB2E4;. <br>&#xC544; &#xC81C;&#xAC00; &#xB2E4;&#xC2DC; &#xD655;&#xC778;&#xD574;&#xBCF4;&#xACE0; &#xB9D0;&#xC500;&#xB4DC;&#xB9AC;&#xACA0;&#xC2B5;&#xB2C8;&#xB2E4;. &gt;&gt; &#xBB38;&#xC790;&#xAC00; &#xBA87;&#xC2ED;&#xC6D0;&#xC778;&#xB370; &#xB2E4;&#xD574;&#xB4DC;&#xB9AC;&#xACA0;&#xC501;&#xB2C8;&#xB2E4;!</p><p>[~&#xD558;&#xB2C8;&#xAE4C; &#xC870;&#xAC74;&#xBB38; &#xB9D0;&#xD22C; &#xAE08;&#xC9C0;]<br>&#xC800;&#xD76C;&#xAC00; &#xC694;&#xAE08;&#xC774; &#xC0AC;&#xC6A9;&#xB7C9; &#xBCA0;&#xC774;&#xC2A4;&#xB85C; &#xCC44;&#xC815;&#xB429;&#xB2C8;&#xB2E4;. &#xADF8;&#xB798;&#xC11C; &#xC6D4; &#xBA87;&#xAC74; &#xBC1C;&#xC1A1;&#xD558;&#xC2DC;&#xB294;&#xC9C0; &#xC54C; &#xC218; &#xC788;&#xC744;&#xAE4C;&#xC694;?  &gt;&gt; ~&#xC0AC;&#xC6A9;&#xB7C9; &#xBCA0;&#xC774;&#xC2A4;&#xB85C; &#xCC45;&#xC815;&#xB418;&#xB2C8;&#xAE4C;, &#xC5BC;&#xB9C8; &#xC4F0;&#xB294;&#xC9C0; &#xC54C;&#xC544;&#xC57C;&#xB418;&#xC694;<br>~&#xC8FC;&#xC2DC;&#xBA74; &#xD558;&#xACA0;&#xC2B5;&#xB2C8;&#xB2E4; &gt;&gt; ~&#xC774;&#xB2C8;&#xAE4C;, &#xC81C;&#xAC00; ~&#xD574;&#xC11C; &#xB4DC;&#xB824;&#xC57C;&#xD558;&#xB2C8;&#xAE4C;</p>]]></content:encoded></item><item><title><![CDATA[SSH 키 인증 설정 가이드]]></title><description><![CDATA[<h2 id="1-ssh-%EC%84%A4%EC%B9%98">1. SSH &#xC124;&#xCE58;</h2><h3 id="windows">Windows</h3><p>Windows 10 &#xBC84;&#xC804; 1803 &#xC774;&#xD6C4;&#xBD80;&#xD130;&#xB294; OpenSSH&#xAC00; &#xAE30;&#xBCF8;&#xC73C;&#xB85C; &#xD3EC;&#xD568;&#xB418;&#xC5B4; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;. &#xD65C;&#xC131;&#xD654;&#xD558;&#xB824;&#xBA74;:</p><ol><li>&#xC124;&#xC815; &gt; &#xC571; &gt; &#xC571; &#xBC0F; &#xAE30;&#xB2A5; &gt; &#xC120;&#xD0DD;&#xC801; &#xAE30;&#xB2A5;</li></ol>]]></description><link>https://keun.me/ssh/</link><guid isPermaLink="false">66e3aff50d908c000122db38</guid><dc:creator><![CDATA[Keun.R]]></dc:creator><pubDate>Fri, 13 Sep 2024 03:24:03 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1617240016072-d92174e44171?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDI1fHxzZXJ2ZXJ8ZW58MHx8fHwxNzI2MTk3Nzg0fDA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" medium="image"/><content:encoded><![CDATA[<h2 id="1-ssh-%EC%84%A4%EC%B9%98">1. SSH &#xC124;&#xCE58;</h2><h3 id="windows">Windows</h3><img src="https://images.unsplash.com/photo-1617240016072-d92174e44171?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDI1fHxzZXJ2ZXJ8ZW58MHx8fHwxNzI2MTk3Nzg0fDA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" alt="SSH &#xD0A4; &#xC778;&#xC99D; &#xC124;&#xC815; &#xAC00;&#xC774;&#xB4DC;"><p>Windows 10 &#xBC84;&#xC804; 1803 &#xC774;&#xD6C4;&#xBD80;&#xD130;&#xB294; OpenSSH&#xAC00; &#xAE30;&#xBCF8;&#xC73C;&#xB85C; &#xD3EC;&#xD568;&#xB418;&#xC5B4; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;. &#xD65C;&#xC131;&#xD654;&#xD558;&#xB824;&#xBA74;:</p><ol><li>&#xC124;&#xC815; &gt; &#xC571; &gt; &#xC571; &#xBC0F; &#xAE30;&#xB2A5; &gt; &#xC120;&#xD0DD;&#xC801; &#xAE30;&#xB2A5; &#xAD00;&#xB9AC;&#xB85C; &#xC774;&#xB3D9;</li><li>&quot;OpenSSH &#xD074;&#xB77C;&#xC774;&#xC5B8;&#xD2B8;&quot; &#xC124;&#xCE58;</li></ol><h3 id="ubuntudebian">Ubuntu/Debian</h3><p>&#xB300;&#xBD80;&#xBD84; &#xAE30;&#xBCF8; &#xC124;&#xCE58;&#xB418;&#xC5B4; &#xC788;&#xC9C0;&#xB9CC;, &#xC5C6;&#xB2E4;&#xBA74;:</p><pre><code class="language-bash">sudo apt update
sudo apt install openssh-client openssh-server

</code></pre><h3 id="macos">macOS</h3><p>SSH &#xD074;&#xB77C;&#xC774;&#xC5B8;&#xD2B8;&#xAC00; &#xAE30;&#xBCF8;&#xC73C;&#xB85C; &#xC124;&#xCE58;&#xB418;&#xC5B4; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.</p><h2 id="2-ssh-%ED%82%A4-%EC%83%9D%EC%84%B1">2. SSH &#xD0A4; &#xC0DD;&#xC131;</h2><p>&#xBAA8;&#xB4E0; &#xD50C;&#xB7AB;&#xD3FC;&#xC5D0;&#xC11C; &#xB2E4;&#xC74C; &#xBA85;&#xB839;&#xC5B4;&#xB85C; &#xD0A4;&#xB97C; &#xC0DD;&#xC131;&#xD560; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;:</p><pre><code class="language-bash">ssh-keygen -t rsa -b 4096 -f ~/.ssh/myserver_key

</code></pre><ul><li><code>t rsa</code>: RSA &#xC554;&#xD638;&#xD654; &#xC0AC;&#xC6A9;</li><li><code>b 4096</code>: 4096&#xBE44;&#xD2B8; &#xD0A4; &#xAE38;&#xC774; (&#xAC15;&#xB825;&#xD55C; &#xBCF4;&#xC548;)</li><li><code>f ~/.ssh/myserver_key</code>: &#xD0A4; &#xD30C;&#xC77C; &#xC800;&#xC7A5; &#xC704;&#xCE58; &#xBC0F; &#xC774;&#xB984;</li></ul><p>&#xBE44;&#xBC00;&#xBB38;&#xAD6C;(passphrase) &#xC124;&#xC815;&#xC740; &#xC120;&#xD0DD;&#xC0AC;&#xD56D;&#xC785;&#xB2C8;&#xB2E4;.</p><h2 id="3-%EA%B3%B5%EA%B0%9C%ED%82%A4%EB%A5%BC-%EC%84%9C%EB%B2%84%EC%97%90-%EB%B3%B5%EC%82%AC">3. &#xACF5;&#xAC1C;&#xD0A4;&#xB97C; &#xC11C;&#xBC84;&#xC5D0; &#xBCF5;&#xC0AC;</h2><h3 id="linuxmacos-%EC%82%AC%EC%9A%A9%EC%9E%90">Linux/macOS &#xC0AC;&#xC6A9;&#xC790;</h3><p><code>ssh-copy-id</code> &#xBA85;&#xB839;&#xC5B4; &#xC0AC;&#xC6A9;:</p><pre><code class="language-bash">ssh-copy-id -i ~/.ssh/myserver_key.pub user@server_ip -p port_number

</code></pre><h3 id="windows-%EC%82%AC%EC%9A%A9%EC%9E%90">Windows &#xC0AC;&#xC6A9;&#xC790;</h3><p>Windows&#xC5D0;&#xB294; <code>ssh-copy-id</code>&#xAC00; &#xC5C6;&#xC73C;&#xBBC0;&#xB85C; &#xC218;&#xB3D9;&#xC73C;&#xB85C; &#xBCF5;&#xC0AC;&#xD574;&#xC57C; &#xD569;&#xB2C8;&#xB2E4;:</p><ol><li>&#xBCF5;&#xC0AC;&#xD55C; &#xACF5;&#xAC1C;&#xD0A4; &#xB0B4;&#xC6A9;&#xC744; &#xBD99;&#xC5EC;&#xB123;&#xACE0; &#xC800;&#xC7A5; (Ctrl+X, Y, Enter)</li></ol><p>&#xAD8C;&#xD55C; &#xC124;&#xC815;:</p><pre><code class="language-bash">chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys

</code></pre><p>&#xC11C;&#xBC84;&#xC5D0;&#xC11C; authorized_keys &#xD30C;&#xC77C; &#xD3B8;&#xC9D1;:</p><pre><code class="language-bash">mkdir -p ~/.ssh
nano ~/.ssh/authorized_keys

</code></pre><p>&#xC11C;&#xBC84;&#xC5D0; SSH &#xC811;&#xC18D;:</p><pre><code>ssh -p port_number user@server_ip

</code></pre><p>&#xACF5;&#xAC1C;&#xD0A4; &#xB0B4;&#xC6A9; &#xD655;&#xC778;:</p><pre><code>type %USERPROFILE%\\.ssh\\myserver_key.pub

</code></pre><h2 id="4-ssh-%EC%A0%91%EC%86%8D-%ED%85%8C%EC%8A%A4%ED%8A%B8">4. SSH &#xC811;&#xC18D; &#xD14C;&#xC2A4;&#xD2B8;</h2><pre><code class="language-bash">ssh -i ~/.ssh/myserver_key -p port_number user@server_ip

</code></pre><p>Windows&#xC5D0;&#xC11C;&#xB294; &#xC804;&#xCCB4; &#xACBD;&#xB85C;&#xB97C; &#xC0AC;&#xC6A9;&#xD574;&#xC57C; &#xD560; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;:</p><pre><code>ssh -i C:\\Users\\YourUsername\\.ssh\\myserver_key -p port_number user@server_ip

</code></pre><h2 id="5-%EC%B6%94%EA%B0%80-%EC%84%A4%EC%A0%95-%EB%B0%8F-%ED%8C%81">5. &#xCD94;&#xAC00; &#xC124;&#xC815; &#xBC0F; &#xD301;</h2><h3 id="ssh-%EC%84%A4%EC%A0%95-%ED%8C%8C%EC%9D%BC-%EC%82%AC%EC%9A%A9">SSH &#xC124;&#xC815; &#xD30C;&#xC77C; &#xC0AC;&#xC6A9;</h3><p><code>~/.ssh/config</code> &#xD30C;&#xC77C;&#xC744; &#xC0DD;&#xC131;&#xD558;&#xACE0; &#xB2E4;&#xC74C;&#xACFC; &#xAC19;&#xC774; &#xC124;&#xC815;:</p><pre><code>Host myserver
    HostName server_ip
    User username
    Port port_number
    IdentityFile ~/.ssh/myserver_key

</code></pre><p>&#xC774;&#xC81C; <code>ssh myserver</code>&#xB85C; &#xAC04;&#xB2E8;&#xD788; &#xC811;&#xC18D; &#xAC00;&#xB2A5;&#xD569;&#xB2C8;&#xB2E4;.</p><h3 id="%EC%84%9C%EB%B2%84-%EC%B8%A1-%EB%B3%B4%EC%95%88-%EA%B0%95%ED%99%94">&#xC11C;&#xBC84; &#xCE21; &#xBCF4;&#xC548; &#xAC15;&#xD654;</h3><p>&#xC11C;&#xBC84;&#xC758; <code>/etc/ssh/sshd_config</code> &#xD30C;&#xC77C;&#xC5D0;&#xC11C;:</p><pre><code>PasswordAuthentication no
PermitRootLogin no

</code></pre><p>&#xBCC0;&#xACBD; &#xD6C4; SSH &#xC11C;&#xBE44;&#xC2A4; &#xC7AC;&#xC2DC;&#xC791;:</p><pre><code class="language-bash">sudo systemctl restart sshd

</code></pre><h3 id="%ED%82%A4-%EA%B4%80%EB%A6%AC-%ED%8C%81">&#xD0A4; &#xAD00;&#xB9AC; &#xD301;</h3><ul><li>&#xC5EC;&#xB7EC; &#xC11C;&#xBC84;&#xC5D0; &#xB300;&#xD574; &#xB2E4;&#xB978; &#xD0A4; &#xC0AC;&#xC6A9;</li><li>&#xC815;&#xAE30;&#xC801;&#xC73C;&#xB85C; &#xD0A4; &#xAD50;&#xCCB4;</li><li>&#xD0A4; &#xC554;&#xD638;(passphrase) &#xC0AC;&#xC6A9; &#xACE0;&#xB824;</li></ul><p>&#xC774; &#xAC00;&#xC774;&#xB4DC;&#xB97C; &#xB530;&#xB77C;&#xD558;&#xBA74; &#xBE44;&#xBC00;&#xBC88;&#xD638; &#xC5C6;&#xC774; &#xC548;&#xC804;&#xD558;&#xAC8C; SSH &#xD0A4; &#xC778;&#xC99D;&#xC73C;&#xB85C; &#xC11C;&#xBC84;&#xC5D0; &#xC811;&#xC18D;&#xD560; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;. &#xBCF4;&#xC548;&#xACFC; &#xD3B8;&#xC758;&#xC131;&#xC744; &#xBAA8;&#xB450; &#xB192;&#xC77C; &#xC218; &#xC788;&#xB294; &#xD6CC;&#xB96D;&#xD55C; &#xBC29;&#xBC95;&#xC785;&#xB2C8;&#xB2E4;.</p><p></p><hr><h2 id="%EB%B3%B4%EC%95%88%EC%98%B5%EC%85%98">&#xBCF4;&#xC548;&#xC635;&#xC158;</h2><p>SSH &#xC11C;&#xBC84;&#xC758; &#xBCF4;&#xC548;&#xC744; &#xAC15;&#xD654;&#xD558;&#xB294; &#xC911;&#xC694;&#xD55C; &#xC635;&#xC158;&#xB4E4;&#xC785;&#xB2C8;&#xB2E4;. &#xAC01;&#xAC01;&#xC758; &#xAE30;&#xB2A5;&#xACFC; fail2ban&#xC5D0; &#xB300;&#xD574; &#xC790;&#xC138;&#xD788; &#xC124;&#xBA85;&#xD574; &#xB4DC;&#xB9AC;&#xACA0;&#xC2B5;&#xB2C8;&#xB2E4;.</p><ol><li><code>PasswordAuthentication no</code><ul><li>&#xAE30;&#xB2A5;: &#xBE44;&#xBC00;&#xBC88;&#xD638;&#xB97C; &#xC0AC;&#xC6A9;&#xD55C; SSH &#xB85C;&#xADF8;&#xC778;&#xC744; &#xBE44;&#xD65C;&#xC131;&#xD654;&#xD569;&#xB2C8;&#xB2E4;.</li><li>&#xD6A8;&#xACFC;: &#xBB34;&#xCC28;&#xBCC4; &#xB300;&#xC785; &#xACF5;&#xACA9;(brute-force attack)&#xC744; &#xBC29;&#xC9C0;&#xD569;&#xB2C8;&#xB2E4;. &#xC624;&#xC9C1; SSH &#xD0A4;&#xB97C; &#xD1B5;&#xD55C; &#xC778;&#xC99D;&#xB9CC; &#xD5C8;&#xC6A9;&#xB429;&#xB2C8;&#xB2E4;.</li></ul></li><li><code>PermitRootLogin no</code><ul><li>&#xAE30;&#xB2A5;: root &#xACC4;&#xC815;&#xC73C;&#xB85C;&#xC758; &#xC9C1;&#xC811;&#xC801;&#xC778; SSH &#xB85C;&#xADF8;&#xC778;&#xC744; &#xAE08;&#xC9C0;&#xD569;&#xB2C8;&#xB2E4;.</li><li>&#xD6A8;&#xACFC;: &#xC2DC;&#xC2A4;&#xD15C;&#xC758; &#xAC00;&#xC7A5; &#xAC15;&#xB825;&#xD55C; &#xACC4;&#xC815;&#xC778; root&#xC5D0; &#xB300;&#xD55C; &#xBB34;&#xB2E8; &#xC811;&#xADFC;&#xC744; &#xBC29;&#xC9C0;&#xD569;&#xB2C8;&#xB2E4;. &#xB300;&#xC2E0; &#xC77C;&#xBC18; &#xC0AC;&#xC6A9;&#xC790;&#xB85C; &#xB85C;&#xADF8;&#xC778; &#xD6C4; &#xD544;&#xC694; &#xC2DC; <code>sudo</code>&#xB97C; &#xC0AC;&#xC6A9;&#xD558;&#xC5EC; root &#xAD8C;&#xD55C;&#xC744; &#xC5BB;&#xB3C4;&#xB85D; &#xD569;&#xB2C8;&#xB2E4;.</li></ul></li><li><code>PubkeyAuthentication yes</code><ul><li>&#xAE30;&#xB2A5;: &#xACF5;&#xAC1C;&#xD0A4; &#xC778;&#xC99D; &#xBC29;&#xC2DD;&#xC744; &#xD65C;&#xC131;&#xD654;&#xD569;&#xB2C8;&#xB2E4;.</li><li>&#xD6A8;&#xACFC;: SSH &#xD0A4; &#xC30D;&#xC744; &#xC0AC;&#xC6A9;&#xD55C; &#xC778;&#xC99D;&#xC744; &#xD5C8;&#xC6A9;&#xD569;&#xB2C8;&#xB2E4;. &#xC774;&#xB294; &#xBE44;&#xBC00;&#xBC88;&#xD638; &#xC778;&#xC99D;&#xBCF4;&#xB2E4; &#xB354; &#xC548;&#xC804;&#xD55C; &#xBC29;&#xBC95;&#xC785;&#xB2C8;&#xB2E4;.</li></ul></li><li><code>fail2ban</code><ul><li>&#xAE30;&#xB2A5;: &#xC9C0;&#xC18D;&#xC801;&#xC778; &#xB85C;&#xADF8;&#xC778; &#xC2E4;&#xD328; &#xC2DC;&#xB3C4;&#xB97C; &#xBAA8;&#xB2C8;&#xD130;&#xB9C1;&#xD558;&#xACE0; &#xCC28;&#xB2E8;&#xD558;&#xB294; &#xB3C4;&#xAD6C;&#xC785;&#xB2C8;&#xB2E4;.</li><li>&#xC124;&#xCE58;: <code>sudo apt install fail2ban</code></li><li>&#xD6A8;&#xACFC;:<ul><li>&#xD2B9;&#xC815; IP &#xC8FC;&#xC18C;&#xC5D0;&#xC11C; &#xBC18;&#xBCF5;&#xC801;&#xC73C;&#xB85C; &#xB85C;&#xADF8;&#xC778; &#xC2E4;&#xD328;&#xAC00; &#xBC1C;&#xC0DD;&#xD558;&#xBA74; &#xD574;&#xB2F9; IP&#xB97C; &#xC77C;&#xC815; &#xC2DC;&#xAC04; &#xB3D9;&#xC548; &#xCC28;&#xB2E8;&#xD569;&#xB2C8;&#xB2E4;.</li><li>SSH&#xBFD0;&#xB9CC; &#xC544;&#xB2C8;&#xB77C; &#xB2E4;&#xC591;&#xD55C; &#xC11C;&#xBE44;&#xC2A4;(&#xC608;: &#xC6F9; &#xC11C;&#xBC84;)&#xC5D0; &#xB300;&#xD55C; &#xACF5;&#xACA9;&#xC744; &#xBC29;&#xC5B4;&#xD560; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.</li><li>&#xBB34;&#xCC28;&#xBCC4; &#xB300;&#xC785; &#xACF5;&#xACA9;&#xC744; &#xD6A8;&#xACFC;&#xC801;&#xC73C;&#xB85C; &#xB9C9;&#xC744; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.</li></ul></li></ul></li></ol><p>&#xC774;&#xB7EC;&#xD55C; &#xC124;&#xC815;&#xB4E4;&#xC744; &#xC870;&#xD569;&#xD558;&#xBA74; SSH &#xC11C;&#xBC84;&#xC758; &#xBCF4;&#xC548;&#xC744; &#xD06C;&#xAC8C; &#xD5A5;&#xC0C1;&#xC2DC;&#xD0AC; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;:</p><ol><li><code>PubkeyAuthentication yes</code>&#xC640; <code>PasswordAuthentication no</code>&#xB97C; &#xD568;&#xAED8; &#xC0AC;&#xC6A9;&#xD558;&#xBA74;, &#xC624;&#xC9C1; SSH &#xD0A4;&#xB97C; &#xD1B5;&#xD55C; &#xC778;&#xC99D;&#xB9CC; &#xD5C8;&#xC6A9;&#xB418;&#xC5B4; &#xBCF4;&#xC548;&#xC774; &#xAC15;&#xD654;&#xB429;&#xB2C8;&#xB2E4;.</li><li><code>PermitRootLogin no</code>&#xB97C; &#xC124;&#xC815;&#xD558;&#xC5EC; root &#xACC4;&#xC815;&#xC758; &#xC9C1;&#xC811;&#xC801;&#xC778; &#xC811;&#xADFC;&#xC744; &#xCC28;&#xB2E8;&#xD569;&#xB2C8;&#xB2E4;.</li><li><code>fail2ban</code>&#xC744; &#xCD94;&#xAC00;&#xB85C; &#xC124;&#xCE58;&#xD558;&#xC5EC; &#xC790;&#xB3D9;&#xD654;&#xB41C; &#xACF5;&#xACA9; &#xC2DC;&#xB3C4;&#xB97C; &#xD0D0;&#xC9C0;&#xD558;&#xACE0; &#xCC28;&#xB2E8;&#xD569;&#xB2C8;&#xB2E4;.</li></ol><p>&#xC774;&#xB7EC;&#xD55C; &#xC124;&#xC815;&#xC744; &#xC801;&#xC6A9;&#xD55C; &#xD6C4;&#xC5D0;&#xB294; &#xBC18;&#xB4DC;&#xC2DC; SSH &#xC11C;&#xBE44;&#xC2A4;&#xB97C; &#xC7AC;&#xC2DC;&#xC791;&#xD574;&#xC57C; &#xD569;&#xB2C8;&#xB2E4;:</p><p>bashCopy<code>sudo systemctl restart sshd</code></p><p>&#xC8FC;&#xC758;: &#xC774;&#xB7EC;&#xD55C; &#xC124;&#xC815;&#xC744; &#xC801;&#xC6A9;&#xD558;&#xAE30; &#xC804;&#xC5D0; &#xBC18;&#xB4DC;&#xC2DC; SSH &#xD0A4; &#xC778;&#xC99D;&#xC774; &#xC81C;&#xB300;&#xB85C; &#xC791;&#xB3D9;&#xD558;&#xB294;&#xC9C0; &#xD655;&#xC778;&#xD558;&#xC138;&#xC694;. &#xADF8;&#xB807;&#xC9C0; &#xC54A;&#xC73C;&#xBA74; &#xC11C;&#xBC84;&#xC5D0; &#xC811;&#xADFC;&#xD560; &#xC218; &#xC5C6;&#xAC8C; &#xB420; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.</p><p></p><hr><ol><li><code>sudo apt install fail2ban</code><ul><li>&#xC124;&#xCE58;&#xB9CC;&#xC73C;&#xB85C;&#xB294; &#xAE30;&#xBCF8; &#xC124;&#xC815;&#xC73C;&#xB85C; &#xB3D9;&#xC791;&#xD558;&#xC9C0;&#xB9CC;, &#xC644;&#xC804;&#xD55C; &#xCEE4;&#xC2A4;&#xD130;&#xB9C8;&#xC774;&#xC9D5;&#xC744; &#xC704;&#xD574;&#xC11C;&#xB294; &#xCD94;&#xAC00; &#xC124;&#xC815;&#xC774; &#xD544;&#xC694;&#xD569;&#xB2C8;&#xB2E4;.</li><li>&#xAE30;&#xBCF8; &#xC124;&#xC815;&#xC73C;&#xB85C;&#xB3C4; SSH&#xC5D0; &#xB300;&#xD55C; &#xAE30;&#xBCF8;&#xC801;&#xC778; &#xBCF4;&#xD638;&#xAC00; &#xC801;&#xC6A9;&#xB429;&#xB2C8;&#xB2E4;.</li></ul></li><li>SSH &#xC635;&#xC158; &#xC124;&#xC815; &#xBC29;&#xBC95;: &#xC774; &#xC635;&#xC158;&#xB4E4;&#xC740; SSH &#xC11C;&#xBC84; &#xC124;&#xC815; &#xD30C;&#xC77C;&#xC5D0;&#xC11C; &#xBCC0;&#xACBD;&#xD569;&#xB2C8;&#xB2E4;.</li></ol><p>&#xC124;&#xC815; &#xD6C4; &#xC11C;&#xBE44;&#xC2A4; &#xC2DC;&#xC791;:</p><pre><code class="language-bash">sudo systemctl start fail2ban
sudo systemctl enable fail2ban

</code></pre><p>&#xCD94;&#xAC00; &#xC124;&#xC815; &#xBC29;&#xBC95;:</p><pre><code class="language-bash">sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
sudo nano /etc/fail2ban/jail.local

</code></pre><p>&#xC774; &#xD30C;&#xC77C;&#xC5D0;&#xC11C; &#xD574;&#xB2F9; &#xC635;&#xC158;&#xB4E4;&#xC744; &#xCC3E;&#xC544; &#xC218;&#xC815;&#xD558;&#xAC70;&#xB098; &#xCD94;&#xAC00;&#xD569;&#xB2C8;&#xB2E4;:</p><p>&#xBCC0;&#xACBD; &#xD6C4; SSH &#xC11C;&#xBE44;&#xC2A4; &#xC7AC;&#xC2DC;&#xC791;:</p><pre><code class="language-bash">
sudo nano /etc/ssh/sshd_config

PubkeyAuthentication yes
PasswordAuthentication no
PermitRootLogin no

sudo systemctl restart sshd
</code></pre><ol start="3"><li><code>PubkeyAuthentication yes</code><ul><li>&#xB300;&#xBD80;&#xBD84;&#xC758; &#xD604;&#xB300; SSH &#xC11C;&#xBC84; &#xC124;&#xC815;&#xC5D0;&#xC11C;&#xB294; &#xAE30;&#xBCF8;&#xC801;&#xC73C;&#xB85C; &#xD65C;&#xC131;&#xD654;&#xB418;&#xC5B4; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.</li><li>&#xD558;&#xC9C0;&#xB9CC; &#xBA85;&#xC2DC;&#xC801;&#xC73C;&#xB85C; &#xC124;&#xC815;&#xD558;&#xB294; &#xAC83;&#xC774; &#xC88B;&#xC740; &#xC2B5;&#xAD00;&#xC785;&#xB2C8;&#xB2E4;:<ul><li>&#xC124;&#xC815;&#xC758; &#xBA85;&#xD655;&#xC131;&#xC744; &#xC704;&#xD574;</li><li>&#xD5A5;&#xD6C4; &#xC5C5;&#xB370;&#xC774;&#xD2B8;&#xB098; &#xBCC0;&#xACBD;&#xC5D0; &#xB300;&#xBE44;&#xD558;&#xC5EC;</li><li>&#xC77C;&#xBD80; &#xC624;&#xB798;&#xB41C; &#xC2DC;&#xC2A4;&#xD15C;&#xC774;&#xB098; &#xD2B9;&#xC218;&#xD55C; &#xC124;&#xC815;&#xC5D0;&#xC11C;&#xB294; &#xAE30;&#xBCF8;&#xAC12;&#xC774; &#xB2E4;&#xB97C; &#xC218; &#xC788;&#xAE30; &#xB54C;&#xBB38;</li></ul></li></ul></li></ol><p>&#xC8FC;&#xC758;&#xC0AC;&#xD56D;:</p><ul><li>&#xC774;&#xB7EC;&#xD55C; &#xBCC0;&#xACBD;&#xC744; &#xC801;&#xC6A9;&#xD558;&#xAE30; &#xC804;&#xC5D0; &#xBC18;&#xB4DC;&#xC2DC; SSH &#xD0A4; &#xC778;&#xC99D;&#xC774; &#xC81C;&#xB300;&#xB85C; &#xC791;&#xB3D9;&#xD558;&#xB294;&#xC9C0; &#xD655;&#xC778;&#xD558;&#xC138;&#xC694;.</li><li><code>PasswordAuthentication no</code>&#xB97C; &#xC124;&#xC815;&#xD558;&#xBA74; &#xD0A4; &#xC778;&#xC99D;&#xB9CC; &#xAC00;&#xB2A5;&#xD558;&#xAC8C; &#xB418;&#xBBC0;&#xB85C;, &#xD0A4; &#xC124;&#xC815;&#xC774; &#xC644;&#xB8CC;&#xB41C; &#xD6C4;&#xC5D0; &#xC801;&#xC6A9;&#xD558;&#xC138;&#xC694;.</li><li>&#xBCC0;&#xACBD; &#xC0AC;&#xD56D;&#xC744; &#xC801;&#xC6A9;&#xD55C; &#xD6C4;&#xC5D0;&#xB294; &#xC0C8;&#xB85C;&#xC6B4; SSH &#xC138;&#xC158;&#xC5D0;&#xC11C; &#xB85C;&#xADF8;&#xC778;&#xC774; &#xAC00;&#xB2A5;&#xD55C;&#xC9C0; &#xBC18;&#xB4DC;&#xC2DC; &#xD14C;&#xC2A4;&#xD2B8;&#xD558;&#xC138;&#xC694;.</li></ul><p>&#xC774;&#xB7EC;&#xD55C; &#xC124;&#xC815;&#xB4E4;&#xC744; &#xD1B5;&#xD574; SSH &#xC11C;&#xBC84;&#xC758; &#xBCF4;&#xC548;&#xC744; &#xD06C;&#xAC8C; &#xD5A5;&#xC0C1;&#xC2DC;&#xD0AC; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;. fail2ban&#xC740; &#xCD94;&#xAC00;&#xC801;&#xC778; &#xBCF4;&#xC548; &#xACC4;&#xCE35;&#xC744; &#xC81C;&#xACF5;&#xD558;&#xBA70;, SSH &#xC124;&#xC815;&#xC740; &#xAE30;&#xBCF8;&#xC801;&#xC778; &#xC811;&#xADFC; &#xBC29;&#xC2DD;&#xC744; &#xC81C;&#xC5B4;&#xD569;&#xB2C8;&#xB2E4;.</p>]]></content:encoded></item></channel></rss>