<?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[Photogrammer]]></title><description><![CDATA[Programming and Photography]]></description><link>https://life.photogrammer.me/</link><image><url>https://life.photogrammer.me/favicon.png</url><title>Photogrammer</title><link>https://life.photogrammer.me/</link></image><generator>Ghost 5.78</generator><lastBuildDate>Thu, 09 Apr 2026 11:03:21 GMT</lastBuildDate><atom:link href="https://life.photogrammer.me/rss/" rel="self" type="application/rss+xml"/><ttl>60</ttl><item><title><![CDATA[내가 환생한다면?]]></title><description><![CDATA[<figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://life.photogrammer.me/content/files/2025/06/test2.html"><div class="kg-bookmark-content"><div class="kg-bookmark-title">&#xB0B4;&#xAC00; &#xD658;&#xC0DD;&#xD55C;&#xB2E4;&#xBA74;? (&#xC9C0;&#xB3C4; &#xC218;&#xC815;)</div><div class="kg-bookmark-description"></div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://life.photogrammer.me/favicon.ico" alt></div></div></a></figure>]]></description><link>https://life.photogrammer.me/if-i-were-reincarnated/</link><guid isPermaLink="false">68419e0f2c72af0001ab0244</guid><dc:creator><![CDATA[Sungjun Park]]></dc:creator><pubDate>Thu, 05 Jun 2025 13:40:13 GMT</pubDate><content:encoded><![CDATA[<figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://life.photogrammer.me/content/files/2025/06/test2.html"><div class="kg-bookmark-content"><div class="kg-bookmark-title">&#xB0B4;&#xAC00; &#xD658;&#xC0DD;&#xD55C;&#xB2E4;&#xBA74;? (&#xC9C0;&#xB3C4; &#xC218;&#xC815;)</div><div class="kg-bookmark-description"></div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://life.photogrammer.me/favicon.ico" alt></div></div></a></figure>]]></content:encoded></item><item><title><![CDATA[ChatGPT 는 왜 다른 사람의 채팅을 보여준걸까?]]></title><description><![CDATA[<p>&#xC624;&#xB298; 42 &#xB3D9;&#xB8CC;&#xB4E4;&#xACFC; &#xC774;&#xC57C;&#xAE30;&#xB97C; &#xD558;&#xB358; &#xC911; &#xC7AC;&#xBBF8;&#xC788;&#xB294; &#xC8FC;&#xC81C;&#xAC00; &#xB098;&#xC654;&#xB2E4;.  &quot;&#xC9C0;&#xADF8;&#xC7AC;&#xADF8;&quot;&#xB77C;&#xB294; &#xD50C;&#xB7AB;&#xD3FC;&#xC5D0;&#xC11C; &#xD68C;&#xC6D0; &#xC815;&#xBCF4; &#xD0ED;&#xC5D0;&#xC11C; &#xB0B4; &#xC815;&#xBCF4;&#xAC00; &#xC544;&#xB2CC;</p>]]></description><link>https://life.photogrammer.me/why-did-chatgpt-show-another-users-conversation/</link><guid isPermaLink="false">6803be26e6b92a0001374fad</guid><category><![CDATA[Computer Science]]></category><dc:creator><![CDATA[Sungjun Park]]></dc:creator><pubDate>Sat, 19 Apr 2025 17:36:45 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1676299081847-824916de030a?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDMzfHxjaGF0Z3B0fGVufDB8fHx8MTc0NTA4Mzc2Mnww&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" medium="image"/><content:encoded><![CDATA[<img src="https://images.unsplash.com/photo-1676299081847-824916de030a?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDMzfHxjaGF0Z3B0fGVufDB8fHx8MTc0NTA4Mzc2Mnww&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" alt="ChatGPT &#xB294; &#xC65C; &#xB2E4;&#xB978; &#xC0AC;&#xB78C;&#xC758; &#xCC44;&#xD305;&#xC744; &#xBCF4;&#xC5EC;&#xC900;&#xAC78;&#xAE4C;?"><p>&#xC624;&#xB298; 42 &#xB3D9;&#xB8CC;&#xB4E4;&#xACFC; &#xC774;&#xC57C;&#xAE30;&#xB97C; &#xD558;&#xB358; &#xC911; &#xC7AC;&#xBBF8;&#xC788;&#xB294; &#xC8FC;&#xC81C;&#xAC00; &#xB098;&#xC654;&#xB2E4;.  &quot;&#xC9C0;&#xADF8;&#xC7AC;&#xADF8;&quot;&#xB77C;&#xB294; &#xD50C;&#xB7AB;&#xD3FC;&#xC5D0;&#xC11C; &#xD68C;&#xC6D0; &#xC815;&#xBCF4; &#xD0ED;&#xC5D0;&#xC11C; &#xB0B4; &#xC815;&#xBCF4;&#xAC00; &#xC544;&#xB2CC; &#xD0C0;&#xC778;&#xC758; &#xC815;&#xBCF4;&#xAC00; &#xBCF4;&#xC778; &#xC801;&#xC774; &#xC788;&#xB2E4;&#xB294; &#xAC83;.  &#xBE44;&#xC2B7;&#xD55C; &#xC0AC;&#xB840;&#xB97C; &#xC0B4;&#xD3B4;&#xBCF4;&#xB2C8;, 2023 &#xB144; ChatGPT &#xC5D0;&#xC11C;&#xB3C4; &#xBC1C;&#xC0DD;&#xD55C; &#xC801;&#xC774; &#xC788;&#xC5C8;&#xB2E4;. &#xC774; &#xB450; &#xC0AC;&#xB840;&#xC5D0;&#xC11C;&#xB294; &#xB300;&#xCCB4; &#xC5B4;&#xCA4C;&#xB2E4;&#xAC00; &#xB0B4; &#xB85C;&#xADF8;&#xC778; &#xC815;&#xBCF4;&#xB85C; &#xB2E4;&#xB978; &#xC0AC;&#xB78C;&#xC758; &#xC815;&#xBCF4;&#xB97C; &#xBCFC; &#xC218; &#xC788;&#xAC8C; &#xB41C; &#xAC83;&#xC77C;&#xAE4C;?</p><p>&#xC784;&#xBCA0;&#xB514;&#xB4DC;&#xB85C; &#xC628;&#xC9C0; &#xAF64; &#xB418;&#xC5C8;&#xC9C0;&#xB9CC; &#xBC31;&#xC5D4;&#xB4DC;&#xB97C; &#xD574;&#xBCF8; &#xC785;&#xC7A5;&#xC5D0;&#xC11C; &#xC0C1;&#xB2F9;&#xD788; &#xC774;&#xD574;&#xAC00; &#xB418;&#xC9C0; &#xC54A;&#xB294; &#xBB38;&#xC81C;&#xB77C;&#xC11C; &#xC774;&#xB9AC;&#xC800;&#xB9AC; &#xD568;&#xAED8; &#xACE0;&#xBBFC;&#xC744; &#xD574;&#xBCF4;&#xC558;&#xB2E4;. (&#xC6C3;&#xAE34;&#xAC74; &#xADF8; &#xC790;&#xB9AC;&#xC5D0; &#xBC31;&#xC5D4;&#xB4DC;&#xB294; &#xD55C; &#xBA85; &#xBC16;&#xC5D0; &#xC5C6;&#xC5C8;&#xB2E4;. &#x314B;&#x314B;) &#xBA3C;&#xC800; &#xBB38;&#xC81C;&#xB97C; &#xB2E4;&#xB8E8;&#xB294; &#xAE30;&#xC0AC;&#xB294; &#xB2E4;&#xC74C;&#xACFC; &#xAC19;&#xB2E4;.</p><h2 id="%EB%AC%B8%EC%A0%9C-%EC%A0%95%EB%A6%AC">&#xBB38;&#xC81C; &#xC815;&#xB9AC;</h2><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://www.ajunews.com/view/20231121143925512"><div class="kg-bookmark-content"><div class="kg-bookmark-title">&#xC9C0;&#xADF8;&#xC7AC;&#xADF8;, &#xAC1C;&#xC778;&#xC815;&#xBCF4; &#xC720;&#xCD9C; &#xB17C;&#xB780;&#xC5D0; &#xC774;&#xC6A9;&#xB960; &#xC808;&#xBC18; &#x2018;&#xB69D;&#x2019; | &#xC544;&#xC8FC;&#xACBD;&#xC81C;</div><div class="kg-bookmark-description">&#xCE74;&#xCE74;&#xC624; &#xD488;&#xC5D0; &#xC548;&#xACA8; &#xC2B9;&#xC2B9;&#xC7A5;&#xAD6C;&#xD558;&#xB358; &#xD328;&#xC158; &#xCEE4;&#xBA38;&#xC2A4; &#xD50C;&#xB7AB;&#xD3FC; &#x2018;&#xC9C0;&#xADF8;&#xC7AC;&#xADF8;&#x2019;&#xAC00; &#xD718;&#xCCAD;&#xC774;&#xACE0; &#xC788;&#xB2E4;. &#xCD5C;&#xADFC; &#xAC1C;&#xC778;&#xC815;&#xBCF4; &#xC720;&#xCD9C; &#xB17C;&#xB780; &#xC774;&#xD6C4; &#xC560;&#xD50C;&#xB9AC;&#xCF00;&#xC774;&#xC158;(&#xC571;) &#xC774;&#xC6A9;&#xC790; &#xC218;&#xAC00;&#x2026;</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://image.ajunews.com/images/site/img/ajunews/apple_touch_icon_512_512.png" alt="ChatGPT &#xB294; &#xC65C; &#xB2E4;&#xB978; &#xC0AC;&#xB78C;&#xC758; &#xCC44;&#xD305;&#xC744; &#xBCF4;&#xC5EC;&#xC900;&#xAC78;&#xAE4C;?"><span class="kg-bookmark-author">&#xC544;&#xC8FC;&#xACBD;&#xC81C;</span><span class="kg-bookmark-publisher">&#xC774;&#xB098;&#xACBD;</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://image.ajunews.com/content/image/2023/11/21/20231121144700795193.jpg" alt="ChatGPT &#xB294; &#xC65C; &#xB2E4;&#xB978; &#xC0AC;&#xB78C;&#xC758; &#xCC44;&#xD305;&#xC744; &#xBCF4;&#xC5EC;&#xC900;&#xAC78;&#xAE4C;?"></div></a></figure><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://www.yna.co.kr/view/AKR20230323064100009"><div class="kg-bookmark-content"><div class="kg-bookmark-title">&#xCC57;GPT, &#xD0C0;&#xC778; &#xB300;&#xD654;&#xAE30;&#xB85D; &#xB178;&#xCD9C; &#xC624;&#xB958;&#x2026;&#xC218;&#xC815; &#xB9C8;&#xCCD0; | &#xC5F0;&#xD569;&#xB274;&#xC2A4;</div><div class="kg-bookmark-description">(&#xC11C;&#xC6B8;=&#xC5F0;&#xD569;&#xB274;&#xC2A4;) &#xAE40;&#xACC4;&#xD658; &#xAE30;&#xC790; = &#xB300;&#xD654;&#xD615; &#xC778;&#xACF5;&#xC9C0;&#xB2A5;(AI) &#x2018;&#xCC57;GPT&#x2019; &#xAC1C;&#xBC1C;&#xC0AC;&#xC778; &#xC624;&#xD508;AI&#xB294; &#xCC57;GPT&#xC5D0;&#xC11C; &#xD0C0;&#xC778;&#xACFC;&#xC758; &#xB300;&#xD654; &#xAE30;&#xB85D;&#xC774; &#xB178;&#xCD9C;&#xB418;&#xB294; &#xC624;&#xB958;&#xAC00; &#xBC1C;&#xACAC;&#x2026;</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://r.yna.co.kr/www/home_n/v03/favicon/favicon_180x180_01.png?v=20250415_1040" alt="ChatGPT &#xB294; &#xC65C; &#xB2E4;&#xB978; &#xC0AC;&#xB78C;&#xC758; &#xCC44;&#xD305;&#xC744; &#xBCF4;&#xC5EC;&#xC900;&#xAC78;&#xAE4C;?"><span class="kg-bookmark-author">&#xC5F0;&#xD569;&#xB274;&#xC2A4;</span><span class="kg-bookmark-publisher">&#xAE40;&#xACC4;&#xD658;</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://img6.yna.co.kr/etc/inner/KR/2023/03/23/AKR20230323064100009_01_i_P4.jpg" alt="ChatGPT &#xB294; &#xC65C; &#xB2E4;&#xB978; &#xC0AC;&#xB78C;&#xC758; &#xCC44;&#xD305;&#xC744; &#xBCF4;&#xC5EC;&#xC900;&#xAC78;&#xAE4C;?"></div></a></figure><p>&#xC704; &#xB450; &#xC0AC;&#xB840;&#xB85C; &#xADF8; &#xC99D;&#xC138;&#xAC00; &#xBE44;&#xC2B7;&#xD558;&#xB2E4;. &#xB300;&#xB7B5; &#xBB38;&#xC81C;&#xB97C; &#xC815;&#xB9AC;&#xD574;&#xBCF4;&#xBA74; &#xB2E4;&#xC74C;&#xACFC; &#xAC19;&#xC558;&#xB2E4;.</p><ol><li>&#x200B;&#xC0AC;&#xC6A9;&#xC790;&#xC758; &#xC778;&#xC99D;&#xC774; &#xD544;&#xC694;&#xD558;&#xBA70; &#xD574;&#xB2F9; &#xC0AC;&#xC6A9;&#xC790;&#xC5D0;&#xAC8C; &#xC18D;&#xD55C; &#xC815;&#xBCF4;&#xB97C; &#xC870;&#xD68C;&#xD558;&#xC600;&#xB2E4;.</li><li>&#xC778;&#xC99D;&#xC5D0; &#xBB38;&#xC81C;&#xB294; &#xC5C6;&#xC5C8;&#xC73C;&#xBA70; &#xD0C0;&#xC778;&#xC758; &#xC815;&#xBCF4;&#xAC00; &#xB178;&#xCD9C;&#xB418;&#xC5C8;&#xB2E4;.</li><li>&#xB9E4;&#xBC88; &#xAC19;&#xC740; &#xC0AC;&#xB78C;&#xC758; &#xC815;&#xBCF4;&#xAC00; &#xC720;&#xCD9C;&#xB41C; &#xAC83;&#xC774; &#xC544;&#xB2C8;&#xB77C;, &#xB79C;&#xB364;&#xD558;&#xAC8C; &#xB2E4;&#xB978; &#xC0AC;&#xB78C;&#xC758; &#xC815;&#xBCF4;&#xAC00; &#xC720;&#xCD9C;&#xB418;&#xC5C8;&#xB2E4;.</li></ol><h2 id="%EC%B6%94%EB%A1%A0">&#xCD94;&#xB860;</h2><p>&#xD2B9;&#xD788; &#xC7AC;&#xBBF8;&#xC788;&#xB294; &#xBD80;&#xBD84;&#xC740; &quot;&#xB79C;&#xB364;&#xD558;&#xAC8C; &#xB2E4;&#xB978; &#xC0AC;&#xB78C;&#xC758; &#xC815;&#xBCF4;&#xAC00; &#xBCF4;&#xC778;&#xB2E4;&quot;&#xB294; &#xAC83;&#xC774;&#xB2E4;. &#xC778;&#xC99D;&#xBA74;&#xC5D0;&#xC11C;&#xB3C4; &#xBB38;&#xC81C;&#xAC00; &#xC5C6;&#xC5C8;&#xC73C;&#xBA70; &#xBC31;&#xC5D4;&#xB4DC;&#xC5D0;&#xC11C;&#xB3C4; &#xC815;&#xC0C1; &#xB3D9;&#xC791;&#xC744;&#xD574;&#xC11C; &#xC751;&#xB2F5;&#xC744; &#xC900; &#xC0C1;&#xD669;&#xC73C;&#xB85C; &#xBCF4;&#xC778;&#xB2E4;. &#xADF8;&#xB7EC;&#xBA74; &#xBB38;&#xC81C;&#xAC00; &#xC788;&#xC744; &#xBC95;&#xD55C; &#xBD80;&#xBD84;&#xC740; &#xC694;&#xC815;&#xB3C4;&#xAC00; &#xC788;&#xC9C0; &#xC54A;&#xC744;&#xAE4C;? &#xD558;&#xACE0; &#xC774;&#xC57C;&#xAE30;&#xB97C; &#xD588;&#xB2E4;.</p><ol><li>&#xC778;&#xC99D;&#xC744; &#xD558;&#xACE0; &#xC5C9;&#xB6B1;&#xD55C; &#xC720;&#xC800; &#xC815;&#xBCF4;&#xB97C; &#xBC18;&#xD658;&#xD558;&#xC5EC; &#xD574;&#xB2F9; &#xAC12;&#xC73C;&#xB85C; &#xB370;&#xC774;&#xD130;&#xB97C; &#xC694;&#xCCAD;&#xD568;</li><li>PK &#xB97C; &#xBC14;&#xD0D5;&#xC73C;&#xB85C; &#xB370;&#xC774;&#xD130;&#xB97C; &#xC870;&#xD68C;&#xD558;&#xB294; &#xACBD;&#xC6B0; &#xC798;&#xBABB;&#xB41C; DB &#xAD00;&#xB9AC;&#xB85C; &#xC778;&#xD55C; &#xBB38;&#xC81C;.</li><li>DB &#xD639;&#xC740; Cache &#xC5D0; &#xB300;&#xD55C; &#xBE44;&#xB3D9;&#xAE30; &#xC694;&#xCCAD;&#xC5D0;&#xC11C; &#xBC1C;&#xC0DD;&#xD558;&#xB294; &#xBB38;&#xC81C;.</li></ol><p>1 &#xBC88;&#xC758; &#xACBD;&#xC6B0; &#xAC00;&#xB2A5;&#xC131;&#xC774; &#xB192;&#xC9C4; &#xC54A;&#xB2E4;&#xACE0; &#xC0DD;&#xAC01;&#xD588;&#xB2E4;. &#xB192;&#xC740; &#xD655;&#xB960;&#xB85C; JWT &#xC640; &#xAC19;&#xC774; &#xBE44;&#xC138;&#xC158; &#xBC29;&#xC2DD;&#xC744; &#xD1B5;&#xD574; &#xC778;&#xC99D;&#xC744; &#xCC98;&#xB9AC;&#xD558;&#xACE0; &#xC788;&#xC5C8;&#xC744; &#xAC83;&#xC774;&#xACE0; (&#xC2E4;&#xC81C;&#xB85C; ChatGPT&#xB294; JWT &#xC0AC;&#xC6A9;), &#xC774; &#xACBD;&#xC6B0; &#xC11C;&#xBC84; &#xCE21; &#xC138;&#xC158;&#xC774; &#xAF2C;&#xC5EC;&#xC11C; &#xC720;&#xC800; &#xC815;&#xBCF4;&#xB97C; &#xC798;&#xBABB; &#xBC18;&#xD658;&#xD558;&#xB294; &#xC804;&#xD615;&#xC801;&#xC778; &#xBB38;&#xC81C;&#xB294; &#xBC1C;&#xC0DD;&#xD558;&#xC9C0; &#xC54A;&#xB294;&#xB2E4;.<br>&#xB2E4;&#xB9CC;, &#xADF8;&#xB807;&#xB2E4;&#xACE0; &#xD574;&#xC11C; &#x201C;&#xC808;&#xB300; &#xBC1C;&#xC0DD;&#xD560; &#xC218; &#xC5C6;&#xB2E4;&#x201D;&#xB294; &#xAC83;&#xB3C4; &#xC544;&#xB2C8;&#xB2E4;. JWT &#xC790;&#xCCB4;&#xB294; stateless&#xC9C0;&#xB9CC;, &#xD074;&#xB77C;&#xC774;&#xC5B8;&#xD2B8;&#xC5D0;&#xC11C; &#xD1A0;&#xD070;&#xC744; &#xAD00;&#xB9AC;&#xD558;&#xB294; &#xBC29;&#xC2DD;&#xC774;&#xB098;, &#xD504;&#xB85D;&#xC2DC;/&#xCE90;&#xC2DC; &#xC11C;&#xBC84;&#xC758; &#xCC98;&#xB9AC;, &#xD639;&#xC740; &#xBC31;&#xC5D4;&#xB4DC;&#xC758; context &#xBCF4;&#xC874; &#xBC29;&#xC2DD;&#xC5D0; &#xB530;&#xB77C; &#xC608;&#xAE30;&#xCE58; &#xC54A;&#xC740; &#xC0C1;&#xD0DC; &#xAF2C;&#xC784;&#xC774; &#xBC1C;&#xC0DD;&#xD560; &#xC5EC;&#xC9C0;&#xB294; &#xC788;&#xB2E4;. &#xADF8;&#xB798;&#xB3C4; &#xC774;&#xBC88; &#xC0AC;&#xB840;&#xC5D0;&#xC11C;&#xB294; &#xADF8;&#xB7F0; &#xC2DD;&#xC758; &#xD750;&#xB984; &#xC624;&#xB958;&#xB294; &#xC544;&#xB2C8;&#xC5C8;&#xB358; &#xAC83; &#xAC19;&#xC544;&#xC11C; &#xAC00;&#xB2A5;&#xC131; &#xB0AE;&#xAC8C; &#xBD24;&#xB2E4;.</p><p>2 &#xBC88;&#xC758; &#xACBD;&#xC6B0;&#xB294; PK &#xAE30;&#xBC18;&#xC73C;&#xB85C; &#xB370;&#xC774;&#xD130;&#xB97C; &#xC870;&#xD68C;&#xD558;&#xBA74;&#xC11C;, &#xC5EC;&#xB7EC; DB&#xB97C; &#xC6B4;&#xC601;&#xD558;&#xB294; &#xAD6C;&#xC870;&#xC5D0;&#xC11C; &#xD14C;&#xC774;&#xBE14;&#xC744; &#xB098;&#xB220; &#xC4F0;&#xAC70;&#xB098; &#xB9C8;&#xC774;&#xADF8;&#xB808;&#xC774;&#xC158; &#xC911; &#xC2E4;&#xC218;&#xB85C; &#xB3D9;&#xC77C;&#xD55C; ID&#xAC00; &#xC911;&#xBCF5;&#xB418;&#xC5B4; &#xB098;&#xD0C0;&#xB098;&#xB294; &#xBB38;&#xC81C;&#xAC00; &#xC544;&#xB2C8;&#xB0D0;&#xB294; &#xCD94;&#xB860;&#xC774;&#xC5C8;&#xB2E4;. &#xC608;&#xC804;&#xBD80;&#xD130; &#xD754;&#xD558;&#xAC8C; &#xB098;&#xC624;&#xB294; &#xBA40;&#xD2F0;&#xD14C;&#xB10C;&#xC2DC; &#xAD00;&#xB828; &#xC0AC;&#xACE0; &#xC911; &#xD558;&#xB098;&#xC774;&#xAE30;&#xB3C4; &#xD558;&#xB2E4;.<br>&#xADF8;&#xB7F0;&#xB370; &#xC774;&#xAC74; &#xAD6C;&#xC870;&#xC801;&#xC73C;&#xB85C; &#xADF8;&#xB807;&#xAC8C; &#xC124;&#xACC4;&#xD588;&#xB2E4;&#xBA74; &#xC9C4;&#xC791;&#xC5D0; &#xD14C;&#xC2A4;&#xD2B8;&#xB098; QA &#xACFC;&#xC815;&#xC5D0;&#xC11C; &#xAC78;&#xB838;&#xC744; &#xD655;&#xB960;&#xC774; &#xB192;&#xACE0;, &#xC2E4;&#xC81C;&#xB85C; ID&#xAC00; &#xC911;&#xBCF5;&#xB418;&#xB354;&#xB77C;&#xB3C4; &#x201C;&#xB79C;&#xB364;&#xD558;&#xAC8C; &#xD0C0;&#xC778;&#xC758; &#xB370;&#xC774;&#xD130;&#xAC00; &#xBCF4;&#xC778;&#xB2E4;&#x201D;&#xB294; &#xC99D;&#xC0C1;&#xACFC;&#xB294; &#xC870;&#xAE08; &#xACB0;&#xC774; &#xB2E4;&#xB974;&#xB2E4;. &#xC911;&#xBCF5;&#xB41C; ID&#xAC00; &#xC788;&#xB2E4;&#xACE0; &#xD574;&#xC11C; &#xB9E4; &#xC694;&#xCCAD;&#xB9C8;&#xB2E4; &#xD0C0;&#xC778;&#xC774; &#xACC4;&#xC18D; &#xBC14;&#xB00C;&#xB294; &#xC2DD;&#xC73C;&#xB85C; &#xC720;&#xCD9C;&#xB418;&#xC9C4; &#xC54A;&#xC744; &#xAC00;&#xB2A5;&#xC131;&#xC774; &#xD06C;&#xAE30; &#xB54C;&#xBB38;&#xC774;&#xB2E4;. &#xBB3C;&#xB860; &#xC2E4;&#xC218;&#xB85C; &#xC774;&#xB807;&#xAC8C; &#xB9CC;&#xB4E4; &#xC218;&#xB294; &#xC788;&#xACA0;&#xC9C0;&#xB9CC;, &#xADF8;&#xAC8C; root cause&#xC600;&#xB2E4;&#xBA74; &#xC880; &#xB354; &#xB2E4;&#xB978; &#xC591;&#xC0C1;&#xC73C;&#xB85C; &#xBB38;&#xC81C;&#xAC00; &#xB098;&#xD0C0;&#xB0AC;&#xC744; &#xAC70;&#xB77C;&#xACE0; &#xBCF8;&#xB2E4;.</p><p>3 &#xBC88;&#xC758; &#xACBD;&#xC6B0; &#xBE44;&#xB3D9;&#xAE30;&#xB85C; DB &#xC5D0; &#xB370;&#xC774;&#xD130;&#xB97C; &#xC5BB;&#xB294; &#xACFC;&#xC815;&#xC5D0;&#xC11C; &#xCEE4;&#xB125;&#xC158;&#xC5D0; &#xBB38;&#xC81C;&#xAC00; &#xC0DD;&#xACA8; &#xAF2C;&#xC778; &#xAC83;&#xC774; &#xC544;&#xB2C8;&#xB0D0;&#xB294; &#xAC83;. &#xADF8;&#xB7F4; &#xC218;&#xB3C4; &#xC788;&#xC9C0;&#xB9CC; DB &#xC640;&#xC758; &#xCEE4;&#xB125;&#xC158; &#xC694;&#xCCAD;&#xC5D0; &#xB300;&#xD55C; &#xC751;&#xB2F5;&#xC758; &#xC21C;&#xC11C;&#xAC00; &#xAF2C;&#xC778;&#xB2E4;&#xB294; &#xAC83;&#xC740; &#xC870;&#xAE08; &#xC774;&#xC0C1;&#xD558;&#xB2E4;. &#xC694;&#xCCAD;&#xC5D0;&#xC11C; &#xCEE4;&#xB125;&#xC158;&#xC744; &#xAC00;&#xC9C0;&#xACE0; &#xC628; &#xB4A4; &#xC694;&#xCCAD;-&#xC751;&#xB2F5;&#xC758; pair &#xAC00; &#xC644;&#xC131;&#xC774; &#xB418;&#xC5B4;&#xC788;&#xC744; &#xAC83;&#xC774;&#xAE30;&#xC5D0; &#xC77C;&#xBC18;&#xC801;&#xC73C;&#xB85C; &#xBC1C;&#xC0DD;&#xD558;&#xC9C0; &#xC54A;&#xB294;&#xB2E4;.</p><p>&#xC774;&#xC57C;&#xAE30;&#xB97C; &#xB098;&#xB204;&#xB2E4;&#xAC00;, &#xAE30;&#xC0AC;&#xB97C; &#xD1B5;&#xD574; &#xD78C;&#xD2B8;&#xB97C; &#xC5BB;&#xC5C8;&#xB294;&#xB370;, Redis-py &#xB77C;&#xB294; &#xB77C;&#xC774;&#xBE0C;&#xB7EC;&#xB9AC;&#xC640; &#xBE44;&#xB3D9;&#xAE30; &#xC0C1;&#xD669;&#xC5D0;&#xC11C;&#xC758; &#xBB38;&#xC81C;&#xB77C;&#xB294; &#xAC83;&#xC744; &#xC54C;&#xAC8C;&#xB418;&#xC5C8;&#xB2E4;. redis &#xC790;&#xCCB4;&#xB098; &#xBC31;&#xC5D4;&#xB4DC; &#xC11C;&#xBC84; &#xB85C;&#xC9C1;&#xC5D0;&#xC11C;&#xC758; &#xBB38;&#xC81C;&#xBCF4;&#xB2E4;&#xB294; redis &#xC640;&#xC758; &#xCEE4;&#xB125;&#xC158;&#xC744; &#xAD00;&#xB9AC;&#xD558;&#xAC70;&#xB098; &#xC694;&#xCCAD;, &#xC751;&#xB2F5;&#xC744; &#xCC98;&#xB9AC;&#xD558;&#xB294; &#xACFC;&#xC815;&#xC5D0;&#xC11C; &#xBB34;&#xC5B8;&#xAC00; &#xAF2C;&#xC778; &#xAC83;&#xC774;&#xB2E4;.</p><p>&#xADF8;&#xB7EC;&#xBA74; &#xB9CC;&#xC57D; redis &#xC640;&#xC758; &#xC5F0;&#xACB0;&#xC5D0;&#xC11C; &#xC774;&#xB7EC;&#xD55C; &#xAD6C;&#xC870;&#xB97C; &#xAC00;&#xC9C0;&#xACE0; &#xC788;&#xB2E4;&#xBA74; 3&#xBC88;&#xACFC; &#xAC19;&#xC740; &#xCF00;&#xC774;&#xC2A4;&#xAC00; &#xBC1C;&#xC0DD;&#xD560; &#xC218; &#xC788;&#xB2E4;&#xACE0; &#xC0DD;&#xAC01;&#xD588;&#xB2E4;. Redis &#xC640;&#xC758; &#xC694;&#xCCAD; / &#xC751;&#xB2F5; &#xAD6C;&#xC870;&#xAC00; &#xC774;&#xB807;&#xAC8C; &#xB418;&#xC9C0; &#xC54A;&#xC744;&#xAE4C;? &#xC2F6;&#xC5C8;&#xB2E4;. (&#xACB0;&#xAD6D; &#xC5EC;&#xB7EC; &#xC694;&#xCCAD;&#xC5D0; &#xB300;&#xD55C; &#xBE44;&#xB3D9;&#xAE30;&#xC801; &#xC751;&#xB2F5; &#xAD6C;&#xC870;&#xB294; &#xC774;&#xB807;&#xAC8C; &#xB418;&#xAE30; &#xB9C8;&#xB828;&#xC774;&#xB2C8;&#xAE4C;)</p><ol><li>Request queue &#xB97C; &#xD1B5;&#xD574; command request</li><li>Response queue &#xB97C; &#xD1B5;&#xD574; command response</li><li>&#xC989;, Request / Response &#xAC00; &#xAC01; queue &#xB97C; &#xD1B5;&#xD574; &#xC774;&#xB8E8;&#xC5B4;&#xC9D0;</li><li>&#xADF8;&#xB7F0;&#xB370; Request &#xC5D0; &#xB300;&#xD55C; Response &#xC720;&#xC2E4;&#xC774; &#xBC1C;&#xC0DD; (&#xBABB;&#xBC1B;&#xAC70;&#xB098; &#xC548;&#xBC1B;&#xAC70;&#xB098;)</li><li>Requester &#xC785;&#xC7A5;&#xC5D0;&#xC11C; Response &#xAC00; &#xD558;&#xB098;&#xC529; &#xBC00;&#xB9AC;&#xB294; &#xBB38;&#xC81C;&#xAC00; &#xBC1C;&#xC0DD;</li></ol><p>NVMe &#xC5D0;&#xC11C;&#xB294; CID &#xB97C; &#xD1B5;&#xD574; Command &#xC5D0; &#xB300;&#xD55C; &#xC694;&#xCCAD;-&#xC751;&#xB2F5; &#xB9E4;&#xCE6D;&#xC774; &#xAC00;&#xB2A5;&#xD558;&#xC9C0;&#xB9CC;, CID &#xC640; &#xAC19;&#xC774; &#xC694;&#xCCAD;&#xC5D0; &#xB300;&#xD55C; &#xC751;&#xB2F5;&#xC784;&#xC744; &#xD655;&#xC778;&#xD560; &#xC218; &#xC788;&#xB294; &#xAD6C;&#xC870;&#xAC00; &#xC544;&#xB2CC;, &#xB298; &#xC21C;&#xCC28;&#xC801;&#xC778; &#xCC98;&#xB9AC;&#xAC00; &#xBCF4;&#xC7A5;&#xB41C;&#xB2E4;&#xBA74; &#xCDA9;&#xBD84;&#xD788; &#xBC1C;&#xC0DD;&#xD560; &#xC218; &#xC788;&#xB294; &#xBB38;&#xC81C;&#xC774;&#xB2E4;. &#xC774; &#xACBD;&#xC6B0; &#xB79C;&#xB364;&#xD558;&#xAC8C; &#xB098;&#xD0C0;&#xB098;&#xB294; &#xD0C0;&#xC778;&#xC758; &#xB370;&#xC774;&#xD130;&#xB97C; &#xC124;&#xBA85;&#xD560; &#xC218; &#xC788;&#xB2E4;.</p><h2 id="%EC%9B%90%EC%9D%B8-%EB%A6%AC%EB%B7%B0">&#xC6D0;&#xC778; &#xB9AC;&#xBDF0;</h2><p>&#xADF8;&#xB7EC;&#xBA74; &#xC2E4;&#xC81C; &#xBB38;&#xC81C;&#xB294; &#xBB34;&#xC5C7;&#xC77C;&#xAE4C;?  &#xC774; &#xBB38;&#xC81C;&#xB294; &#xC774;&#xBBF8; &#xCDE8;&#xC57D;&#xC810;&#xC73C;&#xB85C; &#xC798; &#xC815;&#xB9AC;&#xAC00; &#xB418;&#xC5B4;&#xC788;&#xC5C8;&#xB2E4;. </p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://www.sonatype.com/blog/openai-data-leak-and-redis-race-condition-vulnerability-that-remains-unfixed?hs_amp=true"><div class="kg-bookmark-content"><div class="kg-bookmark-title">ChatGPT data leak and Redis race condition vulnerability that remains unfixed</div><div class="kg-bookmark-description">Last week&#x2019;s OpenAI payment data and chat history leak involved a Race Condition vulnerability in an open source component, Redis.</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://www.sonatype.com/favicon.ico" alt="ChatGPT &#xB294; &#xC65C; &#xB2E4;&#xB978; &#xC0AC;&#xB78C;&#xC758; &#xCC44;&#xD305;&#xC744; &#xBCF4;&#xC5EC;&#xC900;&#xAC78;&#xAE4C;?"><span class="kg-bookmark-author">2024 Sonatype Blog</span><span class="kg-bookmark-publisher">Ax Sharma</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://www.sonatype.com/hubfs/DevSecOpsDays.com%20master/Imported_Blog_Media/blog-ThisweekinMalware-1-100-4.jpg" alt="ChatGPT &#xB294; &#xC65C; &#xB2E4;&#xB978; &#xC0AC;&#xB78C;&#xC758; &#xCC44;&#xD305;&#xC744; &#xBCF4;&#xC5EC;&#xC900;&#xAC78;&#xAE4C;?"></div></a></figure><ol><li>connection pool &#xC774; &#xC874;&#xC7AC;</li><li>&#xD55C; connection &#xC5D0;&#xC11C; redis &#xCABD;&#xC73C;&#xB85C; &#xC694;&#xCCAD;(write) &#xC774;&#xD6C4; request &#xCDE8;&#xC18C;</li><li>response &#xAC00; pop &#xB418;&#xAE30; &#xC774;&#xC804; connection &#xC774; &#xB9DD;&#xAC00;&#xC9C0;&#xACE0;, &#xD574;&#xB2F9; connection &#xC790;&#xCCB4;&#xB294; &#xC0B4;&#xC544;&#xC11C; &#xBC18;&#xD658;</li><li>&#xB2E4;&#xB978; &#xC694;&#xCCAD;&#xC5D0;&#xC11C; &#xD574;&#xB2F9; Connection &#xC744; &#xBC1B;&#xC73C;&#xBA74; dequeue &#xC2DC; &#xB0A8;&#xC544;&#xC788;&#xB358; response &#xB97C; &#xBC1B;&#xC73C;&#xBA74;&#xC11C; &#xC21C;&#xC11C;&#xAC00; &#xAF2C;&#xC784;.</li></ol><p>&#xAF64; &#xADFC;&#xC811;&#xD55C; &#xC811;&#xADFC;&#xC744; &#xD588;&#xB2E4;. (&#xBFCC;&#xB4EF;)  &#xADF8;&#xB7F0;&#xB370; &#xAE00;&#xC744; &#xC77D;&#xC73C;&#xBA74;&#xC11C;, &#xC7AC;&#xBC0C;&#xB2E4;&#xACE0; &#xB290;&#xB080; &#xC810;&#xC740; Redis &#xC758; &#xC694;&#xCCAD; &#xCC98;&#xB9AC;&#xAD6C;&#xC870;&#xB294; CID &#xC640; &#xAC19;&#xC774; request / response &#xC5D0; &#xB300;&#xD55C; pair &#xB97C; &#xD655;&#xC778;&#xD560; &#xC218; &#xC5C6;&#xB2E4;&#xB294; &#xAC83;&#xC774;&#xB2E4;. &#xC774; &#xBD80;&#xBD84;&#xC774; &#xB108;&#xBB34; &#xB2F9;&#xC5F0;&#xD558;&#xB2E4;&#xACE0; &#xC0DD;&#xAC01;&#xD588;&#xB2E4;. &#xC65C;&#xB0D0;&#xBA74;, NVMe &#xC5D0;&#xC11C;&#xB294; CID &#xB97C; &#xD1B5;&#xD574;&#xC11C; &#xC774;&#xB97C; &#xBCF4;&#xC7A5;&#xD558;&#xACE4;&#xD558;&#xB294;&#xB370; (&#xC560;&#xCD08;&#xC5D0; Request &#xC5D0; &#xB300;&#xD55C; Response &#xC758; &#xC21C;&#xC11C;&#xAC00; &#xBCF4;&#xC7A5;&#xB418;&#xC9C0; &#xC54A;&#xC73C;&#xB2C8;, &#xC5C6;&#xC73C;&#xBA74; &#xC548;&#xB41C;&#xB2E4;.) Redis &#xC5D0;&#xC11C;&#xB294; &#xC774;&#xB7EC;&#xD55C; &#xC7A5;&#xCE58;&#xAC00; &#xC874;&#xC7AC;&#xD558;&#xC9C0; &#xC54A;&#xC558;&#xB2E4;.</p><h2 id="redis-%EA%B5%AC%EC%A1%B0-%EB%A7%9B%EB%B3%B4%EA%B8%B0">Redis &#xAD6C;&#xC870; &#xB9DB;&#xBCF4;&#xAE30;</h2><p>&#xC65C; &#xC774;&#xB807;&#xAC8C; &#xCC98;&#xB9AC;&#xB97C; &#xD558;&#xB294; &#xAC83;&#xC77C;&#xAE4C;? &#xC774;&#xB294; Redis &#xC758; &#xCCA0;&#xD559;&#xACFC; &#xC5F0;&#xAD00;&#xB41C;&#xB2E4;.</p><ol><li>&#xB2E8;&#xC21C;&#xD654;&#xB97C; &#xD1B5;&#xD574;&#xC11C; &#xC131;&#xB2A5; &#xADF9;&#xB300;&#xD654; / No Lock / Atomic / ... --&gt; single thread</li><li>single thread &#xAE30;&#xBC18;&#xC774;&#xB2C8; sequential &#xD55C; &#xCC98;&#xB9AC;</li><li>request / response &#xB610;&#xD55C; FIFO &#xAD6C;&#xC870; + &#xC0C1;&#xD0DC; &#xC608;&#xCE21; &#xAC00;&#xB2A5;.</li></ol><p>&#xADF8;&#xB7EC;&#xB2C8; redis &#xC785;&#xC7A5;&#xC5D0;&#xC11C;&#xB294; &#xD560; &#xC77C;&#xC744; &#xD574;&#xC900; &#xAC83;&#xC774;&#xB2E4;. &#xADF8;&#xB7F0;&#xB370; &#xBB38;&#xB4DD;, queue &#xC5D0; &#xB300;&#xD574;&#xC11C;&#xB3C4; &#xAD81;&#xAE08;&#xD568;&#xC774; &#xC0DD;&#xACBC;&#xB2E4;. &#xC2E4;&#xC81C;&#xB85C; queue &#xB294; &#xC5B4;&#xB290; &#xB808;&#xBCA8;&#xC5D0;&#xC11C; &#xC774;&#xB8E8;&#xC5B4;&#xC9C0;&#xB294; &#xAC83;&#xC77C;&#xAE4C;? &#xB9CC;&#xC57D; &#xD55C; connection &#xC5D0;&#xC11C; response &#xB97C; &#xAC00;&#xC838;&#xAC00;&#xC9C0; &#xC54A;&#xB294;&#xB2E4;&#xBA74; &#xB2E4;&#xB978; connection &#xC5D0;&#xC11C;&#xB3C4; &#xC774;&#xC5D0; &#xB300;&#xD55C; &#xC601;&#xD5A5;&#xC744; &#xBC1B;&#xB294;&#xB2E4;. &#xADF8;&#xB7EC;&#xB098; &#xC0C1;&#xD669;&#xC744; &#xC0B4;&#xD3B4;&#xBCFC; &#xB54C; connection &#xB2E8;&#xC704;&#xB85C; queue &#xAC00; &#xC720;&#xC9C0;&#xB418;&#xB294; &#xAC83;&#xC73C;&#xB85C; &#xBCF4;&#xC778;&#xB2E4;.</p><p>Redis &#xC5D0;&#xC11C;&#xC758; queue &#xB294; TCP &#xB97C; &#xD1B5;&#xD55C; socket stream &#xC774;&#xB2E4;. &#xC989;, connection &#xC5D0;&#xC11C; client &#xB294; server &#xC640;&#xC758; write buffer &#xC5D0; write &#xD558;&#xBA74;&#xC11C; &#xC694;&#xCCAD;&#xC744; &#xD558;&#xACE0;,  server &#xB294; &#xC751;&#xB2F5;&#xC744; &#xB2E4;&#xC2DC; buffer &#xC5D0; &#xC368;&#xC8FC;&#xBA74;&#xC11C; response &#xB97C; &#xD558;&#xB294; &#xAD6C;&#xC870;&#xC774;&#xB2E4;. &#xC989;, connection &#xC774; &#xB04A;&#xAE30;&#xBA74; queue &#xAC00; &#xB0A0;&#xB77C;&#xAC00;&#xB294; &#xC148;&#xC774;&#xB2E4;.</p><p>&#xB0B4;&#xBD80;&#xC801;&#xC73C;&#xB85C; connection &#xB610;&#xD55C; &#xC5B4;&#xB5BB;&#xAC8C; &#xCC98;&#xB9AC;&#xB418;&#xB294;&#xC9C0; &#xAD81;&#xAE08;&#xD574;&#xC11C; &#xCC3E;&#xC544;&#xBCF4;&#xB2C8;, single thread &#xAE30;&#xBC18;&#xC774;&#xAE30;&#xC5D0; epoll &#xACFC; &#xAC19;&#xC740; i/o multiplexing &#xC744; &#xD1B5;&#xD574; &#xC791;&#xB3D9;&#xD55C;&#xB2E4;. epoll &#xC744; &#xD1B5;&#xD574; event &#xB97C; &#xBC1B;&#xC544; i/o &#xC694;&#xCCAD;&#xC744; &#xCC98;&#xB9AC;&#xD558;&#xAC8C; &#xB420; &#xAC83;&#xC774;&#xACE0;, &#xAC01; connection &#xC5D0;&#xC11C;&#xB3C4; &#xB2E4;&#xC2DC; &#xC21C;&#xCC28;&#xC801;&#xC73C;&#xB85C; request &#xC5D0; &#xB300;&#xD574; response &#xAC00; &#xC21C;&#xCC28;&#xC801;&#xC73C;&#xB85C; &#xB3CC;&#xC544;&#xAC00;&#xB294; &#xAD6C;&#xC870;&#xC774;&#xB2E4;. </p><p>&#xB354; &#xC0DD;&#xAC01;&#xD574;&#xBCFC;&#xB9CC;&#xD55C; &#xC8FC;&#xC81C;&#xB85C;&#xB294; &#xC774;&#xB7EC;&#xD55C; &#xC21C;&#xCC28;&#xC801; &#xCC98;&#xB9AC; &#xAD6C;&#xC870;&#xAC00; &#xC88B;&#xC744; &#xC218;&#xB3C4; &#xC788;&#xC9C0;&#xB9CC;, &#xD55C; &#xD3B8;&#xC73C;&#xB85C;&#xB294; processing time &#xC774; &#xAE34; &#xBA85;&#xB839;&#xC5D0; &#xB300;&#xD574;&#xC11C;&#xB294; &#xC774;&#xD6C4;&#xC758; latency &#xB97C; &#xC99D;&#xAC00;&#xC2DC;&#xD0A4;&#xAE30;&#xC5D0; single thread &#xAD6C;&#xC870;&#xC5D0;&#xC11C;&#xB294; &#xB2E4;&#xC18C; &#xBD88;&#xB9AC;&#xD560; &#xC218;&#xB3C4; &#xC788;&#xB294; &#xAC83; &#xC544;&#xB2CC;&#xAC00;? &#xD558;&#xB294; &#xAC83;&#xC774;&#xB2E4;. &#xBB3C;&#xB860; atomic &#xD558;&#xAC8C; &#xC21C;&#xCC28;&#xC801;&#xC73C;&#xB85C; &#xCC98;&#xB9AC;&#xD558;&#xB3C4;&#xB85D; &#xD558;&#xB294; &#xAC83;&#xC774; &#xC5EC;&#xB7EC;&#xBA74;&#xC5D0;&#xC11C; &#xC720;&#xB9AC;&#xD560; &#xC218;&#xB294; &#xC788;&#xC73C;&#xB098; atomic &#xD558;&#xC9C0; &#xC54A;&#xC544;&#xB3C4; &#xB418;&#xB294; &#xBA85;&#xB839;&#xC774; &#xB4E4;&#xC5B4;&#xC624;&#xB294; &#xC0C1;&#xD669;&#xC5D0;&#xC11C;&#xB294; latency &#xB97C; &#xB298;&#xB9AC;&#xB294; &#xC0C1;&#xD669;&#xC774; &#xB9CE;&#xC774; &#xC5F0;&#xCD9C;&#xB420; &#xC218; &#xC788;&#xAE30; &#xB54C;&#xBB38;&#xC774;&#xB2E4;. &#xB611;&#xB611;&#xD55C; &#xC0AC;&#xB78C;&#xB4E4;&#xC774; &#xB9CC;&#xB4DC;&#xB2C8; &#xBD84;&#xBA85; &#xBB34;&#xC2A8; &#xB300;&#xCC45;&#xC774; &#xC788;&#xC5C8;&#xC744; &#xAC83; &#xAC19;&#xC740;&#xB370;, &#xB098;&#xC911;&#xC5D0; &#xD55C;&#xBC88; &#xCC3E;&#xC544;&#xBCFC;&#xB9CC;&#xD55C; &#xAC83; &#xAC19;&#xB2E4;.</p><h2 id="%EB%8B%A4%EB%A5%B8-%EA%B3%B3%EC%97%90%EC%84%9C%EB%8A%94">&#xB2E4;&#xB978; &#xACF3;&#xC5D0;&#xC11C;&#xB294;?</h2><p>&#xD558;&#xB098; &#xB354; &#xC0DD;&#xAC01;&#xD574;&#xBCFC; &#xC8FC;&#xC81C;&#xB77C;&#xBA74;,  DB &#xB098; &#xB2E4;&#xB978; &#xD504;&#xB85C;&#xD1A0;&#xCF5C;&#xC740; &#xC5B4;&#xB5BB;&#xAC8C; &#xCC98;&#xB9AC;&#xD558;&#xB294;&#xAC00;? &#xC774;&#xB2E4;. &#xC774;&#xB7EC;&#xD55C; &#xBB38;&#xC81C;&#xB294; MySQL, Postgres &#xC640; &#xAC19;&#xC740; &#xC77C;&#xBC18;&#xC801;&#xC778; DB &#xC5D0;&#xC11C;&#xB294; &#xBC1C;&#xC0DD;&#xD558;&#xC9C0; &#xC54A;&#xC558;&#xB2E4;. &#xC989;, &#xB0B4;&#xBD80;&#xC801;&#xC73C;&#xB85C; Request / Response &#xC5D0; &#xB300;&#xD55C; pair &#xB97C; &#xBCF4;&#xC7A5;&#xD574;&#xC8FC;&#xACE0; &#xC788;&#xB2E4;&#xB294; &#xAC83;&#xC774;&#xB2E4;. &#xC774; &#xBC29;&#xBC95;&#xC5D0; &#xB300;&#xD574; &#xC6B0;&#xC120; &#xCC3E;&#xC544;&#xBCF8; &#xBC29;&#xC2DD;&#xC740; &#xB450; &#xAC00;&#xC9C0; &#xC815;&#xB3C4;&#xB85C; &#xBCF4;&#xC778;&#xB2E4;.</p><ol><li>Stream / Request &#xC5D0; &#xB300;&#xD55C; &#xACE0;&#xC720; &#xC2DD;&#xBCC4;&#xC790; &#xC81C;&#xACF5;</li><li>Connection &#xC5D0;&#xC11C; &#xD55C; &#xBC88;&#xC5D0; &#xD558;&#xB098;&#xC758; &#xC694;&#xCCAD; &#xCC98;&#xB9AC;</li></ol><p>1 &#xBC88;&#xC758; &#xACBD;&#xC6B0; kafka / HTTP2 stream &#xC5D0;&#xC11C;&#xC758; &#xBC29;&#xC2DD;&#xC774;&#xB2E4;. &#xCC3E;&#xC544;&#xBCF4;&#xC9C0;&#xB294; &#xC54A;&#xC558;&#xC9C0;&#xB9CC;, &#xACB0;&#xAD6D; request &#xC5D0; &#xB300;&#xD55C; response &#xAC00; &#xC21C;&#xCC28;&#xC801;&#xC774;&#xC9C0; &#xC54A;&#xC740; &#xD658;&#xACBD;&#xC774;&#xB2E4;. (Storage &#xC758; I/O &#xB3C4; &#xB9C8;&#xCC2C;&#xAC00;&#xC9C0;) &#xC774;&#xB7EC;&#xD55C; &#xACBD;&#xC6B0; &#xB9CC;&#xC57D; request &#xC5D0; &#xB300;&#xD574; Sequential &#xD558;&#xAC8C; &#xCC98;&#xB9AC; &#xD560; &#xACBD;&#xC6B0; &#xB290;&#xB9B0; &#xC751;&#xB2F5;&#xC774; &#xC788;&#xB294; &#xACBD;&#xC6B0; latency &#xAC00; &#xAD49;&#xC7A5;&#xD788; &#xC99D;&#xAC00;&#xD558;&#xAC8C; &#xB420; &#xAC83;&#xC774;&#xBBC0;&#xB85C; &#xBE44;&#xD6A8;&#xC728;&#xC801;&#xC774;&#xB2E4;. &#xB530;&#xB77C;&#xC11C; &#xC21C;&#xCC28;&#xC801;&#xC774;&#xC9C0; &#xC54A;&#xC740; &#xC751;&#xB2F5;&#xC5D0; &#xB300;&#xD574; pair &#xB97C; &#xB9CC;&#xB4E4; &#xBC29;&#xBC95;&#xC774; &#xD544;&#xC694;&#xD558;&#xACE0;, &#xC774;&#xB97C; &#xACE0;&#xC720; ID &#xB97C; &#xD65C;&#xC6A9;&#xD55C;&#xB2E4;.</p><p>2 &#xBC88;&#xC758; &#xACBD;&#xC6B0; RDBMS &#xC5D0;&#xC11C; &#xC8FC;&#xB85C; &#xC120;&#xD0DD;&#xD558;&#xB294; &#xBC29;&#xC2DD;&#xC774;&#xB2E4;. &#xC774;&#xB4E4;&#xC740; connection &#xC5D0;&#xC11C; &#xD558;&#xB098;&#xC758; &#xC694;&#xCCAD;&#xC774; &#xB05D;&#xB098;&#xACE0; &#xB09C; &#xB4A4; &#xADF8; &#xB2E4;&#xC74C; &#xC694;&#xCCAD;&#xC5D0; &#xB300;&#xD574; &#xCC98;&#xB9AC;&#xD558;&#xB3C4;&#xB85D; &#xD55C;&#xB2E4;. &#xBB3C;&#xB860; &#xC774;&#xB4E4;&#xB3C4; redis &#xC640; &#xB2EC;&#xB9AC; multi thread &#xB97C; &#xD1B5;&#xD574; &#xBCD1;&#xB82C;&#xC801;&#xC73C;&#xB85C; &#xCC98;&#xB9AC;&#xB418;&#xB098; connection &#xB2E8;&#xC704;&#xC758; &#xACA9;&#xB9AC;&#xB41C; context &#xB97C; &#xD1B5;&#xD574; &#xB370;&#xC774;&#xD130; &#xC77C;&#xAD00;&#xC131;&#xC744; &#xBCF4;&#xC7A5;&#xD558;&#xACE0;&#xC790; &#xD568;&#xC73C;&#xB85C; &#xBCF4;&#xC778;&#xB2E4;. (&#xB9CC;&#xC57D; connection &#xB0B4;&#xC5D0;&#xC11C; &#xC774;&#xB807;&#xAC8C; &#xD558;&#xC9C0; &#xC54A;&#xC73C;&#xBA74; &#xC5C4;&#xCCAD;&#xB098;&#xAC8C; &#xB354; &#xB9CE;&#xC740; &#xC7A5;&#xCE58;&#xB4E4;&#xACFC; &#xD568;&#xAED8; &#xC6B0;&#xB9AC;&#xB294; &#xBC30;&#xC6B8;&#xAC8C; &#xB354; &#xB298;&#xC5B4;&#xB0AC;&#xC744; &#xAC83;&#xC774;&#xB2E4;...) </p><p>&#xBC18;&#xBA74;, Redis &#xB294; single-thread / sequential &#xCC98;&#xB9AC;&#xB85C; &#xC791;&#xB3D9;&#xD558;&#xC5EC; &#xAD6C;&#xC870;&#xC801;&#xC73C;&#xB85C; &#xBB38;&#xC81C;&#xAC00; &#xC5C6;&#xC73C;&#xB098; Client &#xCE21;&#xC5D0;&#xC11C; async + connection pool &#xC744; &#xAD6C;&#xD604;&#xD558;&#xB294; &#xACFC;&#xC815;&#xC5D0;&#xC11C; &#xC774;&#xB97C; &#xCC98;&#xB9AC;&#xD558;&#xC9C0; &#xBABB;&#xD558;&#xC5EC; &#xB098;&#xD0C0;&#xB098;&#xB294; &#xBB38;&#xC81C;&#xAC00; &#xB418;&#xBC84;&#xB9B0; &#xCF00;&#xC774;&#xC2A4;&#xB2E4;.</p><h2 id="%EB%A7%88%EB%AC%B4%EB%A6%AC">&#xB9C8;&#xBB34;&#xB9AC;</h2><p>&#xC0C1;&#xB2F9;&#xD788; &#xC7AC;&#xBBF8;&#xC788;&#xB294; &#xC8FC;&#xC81C;&#xC600;&#xB2E4;. (&#xB098;&#xB294; &#xC784;&#xBCA0;&#xB514;&#xB4DC; &#xB9E8;&#xC774;&#xB77C; &#xC798; &#xBAA8;&#xB974;&#xACA0;&#xC9C0;&#xB9CC;) &#xBC31;&#xC5D4;&#xB4DC; &#xC5D4;&#xC9C0;&#xB2C8;&#xC5B4;&#xB85C;&#xC11C;&#xB3C4; &#xAE30;&#xCD08;&#xC801;&#xC778; &#xC774;&#xB860;&#xC5D0; &#xAE30;&#xBC18;&#xD574;&#xC11C; &#xBD84;&#xC11D;&#xD558;&#xACE0; &#xBC30;&#xC6B8; &#xAC83;&#xC774; &#xB9CE;&#xC740; &#xC774;&#xC288;&#xC778; &#xAC83; &#xAC19;&#xB2E4;. SSD FW &#xB97C; &#xB2E4;&#xB8E8;&#xB294; &#xC785;&#xC7A5;&#xC5D0;&#xC11C;&#xB3C4; &#xC774;&#xB7EC;&#xD55C; &#xBA85;&#xB839; &#xCC98;&#xB9AC; &#xACFC;&#xC815; &#xC911; failure &#xC0C1;&#xD669;&#xC5D0;&#xC11C; &#xBC1C;&#xC0DD;&#xD560; &#xC218; &#xC788;&#xB294; &#xBB38;&#xC81C;&#xB098; NVMe &#xC5D0;&#xC11C;&#xC758; queue &#xAD6C;&#xC870;&#xC5D0; &#xB300;&#xD574;&#xC11C;&#xB3C4; &#xD55C;&#xBC88; &#xB2E4;&#xC2DC; &#xC0DD;&#xAC01;&#xC744; &#xD574;&#xBCFC; &#xC218; &#xC788;&#xC5C8;&#xB2E4;. (FW &#xB0B4;&#xBD80;&#xC5D0;&#xC11C;&#xC758; &#xBA85;&#xB839; &#xCC98;&#xB9AC; &#xAD6C;&#xC870;&#xC5D0;&#xC11C;&#xB3C4; &#xACE0;&#xBBFC;&#xD574;&#xBCFC;&#xB9CC;&#xD55C; &#xC7AC;&#xBBF8;&#xC788;&#xB294; &#xC8FC;&#xC81C;&#xAC19;&#xB2E4;.) &#xB355;&#xBD84;&#xC5D0; &#xCDE8;&#xC5C5;&#xD558;&#xACE0; &#xD55C;&#xCC38; &#xC26C;&#xB358; &#xBE14;&#xB85C;&#xADF8;&#xC5D0; &#xC7AC;&#xBBF8;&#xC788;&#xB294; &#xAE00;&#xB3C4; &#xC2E3;&#xB294;&#xB2E4;.</p>]]></content:encoded></item><item><title><![CDATA[OAuth 깊게 이해하기]]></title><description><![CDATA[<p></p><p>&#xC18C;&#xC15C; &#xB85C;&#xADF8;&#xC778;&#xC744; &#xAD6C;&#xD604;&#xD558;&#xB2E4;&#xBCF4;&#xBA74; OAuth &#xB97C; &#xC790;&#xC5F0;&#xC2A4;&#xB808; &#xB9C8;&#xC8FC;&#xCE58;&#xAC8C;&#xB41C;&#xB2E4;. &#xAD6C;&#xAE00;, &#xCE74;&#xCE74;&#xC624;, &#xD398;&#xC774;&#xC2A4;&#xBD81;, &#xB124;&#xC774;&#xBC84;... &#xC218; &#xB9CE;&#xC740; &#xC5F0;&#xB3D9;&#xC744; &#xD558;&#xC9C0;&#xB9CC; &#xC5F0;&#xB3D9; &#xAC00;&#xC774;&#xB4DC;</p>]]></description><link>https://life.photogrammer.me/understanding-oauth/</link><guid isPermaLink="false">66add7464b575c000124ae17</guid><category><![CDATA[Web]]></category><dc:creator><![CDATA[Sungjun Park]]></dc:creator><pubDate>Sat, 03 Aug 2024 11:10:09 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1503792243040-7ce7f5f06085?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDR8fGtleXxlbnwwfHx8fDE3MjI2ODM3MjB8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" medium="image"/><content:encoded><![CDATA[<img src="https://images.unsplash.com/photo-1503792243040-7ce7f5f06085?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDR8fGtleXxlbnwwfHx8fDE3MjI2ODM3MjB8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" alt="OAuth &#xAE4A;&#xAC8C; &#xC774;&#xD574;&#xD558;&#xAE30;"><p></p><p>&#xC18C;&#xC15C; &#xB85C;&#xADF8;&#xC778;&#xC744; &#xAD6C;&#xD604;&#xD558;&#xB2E4;&#xBCF4;&#xBA74; OAuth &#xB97C; &#xC790;&#xC5F0;&#xC2A4;&#xB808; &#xB9C8;&#xC8FC;&#xCE58;&#xAC8C;&#xB41C;&#xB2E4;. &#xAD6C;&#xAE00;, &#xCE74;&#xCE74;&#xC624;, &#xD398;&#xC774;&#xC2A4;&#xBD81;, &#xB124;&#xC774;&#xBC84;... &#xC218; &#xB9CE;&#xC740; &#xC5F0;&#xB3D9;&#xC744; &#xD558;&#xC9C0;&#xB9CC; &#xC5F0;&#xB3D9; &#xAC00;&#xC774;&#xB4DC;&#xB97C; &#xB530;&#xB97C; &#xBFD0;  OAuth&#xB97C; &#xC65C; &#xC0AC;&#xC6A9;&#xD558;&#xB294;&#xC9C0;&#xC5D0; &#xB300;&#xD574;&#xC11C;&#xB294; &#xACE8;&#xB618;&#xD788; &#xACE0;&#xBBFC;&#xD574;&#xBCF8; &#xC801;&#xC740; &#xC5C6;&#xC5C8;&#xB2E4;. &#xC774;&#xBC88; &#xAE00;&#xC5D0;&#xC11C;&#xB294; OAuth &#xAC00; &#xC5C6;&#xB358; &#xC138;&#xC0C1;&#xBD80;&#xD130; OAuth&#xAC00; &#xC5B4;&#xB5BB;&#xAC8C; &#xD0C0; &#xC11C;&#xBE44;&#xC2A4;&#xC640;&#xC758; &#xC5F0;&#xB3D9;&#xC744; &#xC774;&#xB8F0; &#xC218; &#xC788;&#xB3C4;&#xB85D;&#xD558;&#xB294;&#xC9C0; &#xC54C;&#xC544;&#xBCFC; &#xAC83;&#xC774;&#xB2E4;. &#xADF8;&#xB9AC;&#xACE0; &#xB05D;&#xC73C;&#xB85C; OAuth &#xC704;&#xC5D0;&#xC11C; &#xC791;&#xB3D9;&#xD558;&#xB294; OIDC &#xAC00; &#xBB34;&#xC5C7;&#xC778;&#xC9C0;, &#xC65C; &#xC0AC;&#xC6A9;&#xD558;&#xB294; &#xC9C0;&#xC5D0; &#xB300;&#xD574;&#xC11C; &#xC54C;&#xC544;&#xBCFC; &#xAC83;&#xC774;&#xB2E4;.</p><p>(&#xAE00; &#xC77D;&#xAE30;&#xC5D0; &#xC55E;&#xC11C;, &#xB300;&#xBD80;&#xBD84;&#xC758; &#xB0B4;&#xC6A9;&#xC740; RFC 6749&#xC5D0; &#xBA85;&#xC2DC;&#xB41C; &#xAC83;&#xC744; &#xC801;&#xB2F9;&#xD558;&#xAC8C; &#xD480;&#xC5B4;&#xC11C; &#xC774;&#xC57C;&#xAE30;&#xD558;&#xACE0; &#xC788;&#xC74C;&#xC744; &#xBC1D;&#xD78C;&#xB2E4;. &#xACB0;&#xAD6D; OAuth &#xC744; &#xC774;&#xD574;&#xD558;&#xAE30; &#xC704;&#xD574;&#xC11C;&#xB294; &#xC9C1;&#xC811; &#xAD6C;&#xD604;&#xACFC; &#xB354;&#xBD88;&#xC5B4; &#xD574;&#xB2F9; &#xBB38;&#xC11C;&#xC758; &#xC815;&#xB3C5;&#xC774; &#xD544;&#xC694;&#xD558;&#xB2E4;.)</p><h2 id="%ED%83%80-%EC%84%9C%EB%B9%84%EC%8A%A4%EC%99%80-%EC%97%B0%EB%8F%99%ED%95%98%EA%B8%B0">&#xD0C0; &#xC11C;&#xBE44;&#xC2A4;&#xC640; &#xC5F0;&#xB3D9;&#xD558;&#xAE30;</h2><p>OAuth &#xC5D0; &#xB300;&#xD574; &#xC54C;&#xC544;&#xBCF4;&#xAE30; &#xC804;&#xC5D0;, OAuth &#xAC00; &#xD0C4;&#xC0DD;&#xD558;&#xAC8C;&#xB41C; &#xBC30;&#xACBD;&#xC5D0; &#xB300;&#xD574;&#xC11C; &#xC54C;&#xC544;&#xBCFC; &#xD544;&#xC694;&#xAC00; &#xC788;&#xB2E4;. &#xD55C;&#xBC88; &quot;&#xC720;&#xD29C;&#xBE0C; &#xBD84;&#xC11D;&#xAE30;&quot; &#xB77C;&#xB294; &#xC5B4;&#xD50C;&#xB9AC;&#xCF00;&#xC774;&#xC158;&#xC744; &#xB9CC;&#xB4E0;&#xB2E4;&#xACE0; &#xAC00;&#xC815;&#xD574;&#xBCF4;&#xC790;. &#xC774; &#xC5B4;&#xD50C;&#xB9AC;&#xCF00;&#xC774;&#xC158;&#xC740; &#xB2E4;&#xC74C;&#xACFC; &#xAC19;&#xC740; &#xC77C;&#xC744; &#xD574;&#xC57C;&#xD55C;&#xB2E4;. (&#xC5EC;&#xAE30;&#xC11C; <strong>&#xD0C0; &#xC11C;&#xBE44;&#xC2A4;&#xB294; &quot;&#xC720;&#xD29C;&#xBE0C; &#xBD84;&#xC11D;&#xAE30;&quot;</strong> &#xAC00; &#xB41C;&#xB2E4;)</p><ul><li>&#xC0AC;&#xC6A9;&#xC790;&#xC758; &#xC720;&#xD29C;&#xBE0C; &#xAE30;&#xB85D;&#xC744; &#xC870;&#xD68C;&#xD558;&#xACE0; &#xC774;&#xB97C; &#xBD84;&#xC11D;&#xD55C;&#xB2E4;.</li></ul><p>&#xD574;&#xB2F9; &#xAE30;&#xB2A5;&#xC744; &#xAD6C;&#xD604;&#xD558;&#xAE30; &#xC704;&#xD574;&#xC11C;&#xB294; &quot;&#xC0AC;&#xC6A9;&#xC790;&#xC758; &#xC720;&#xD29C;&#xBE0C; &#xAE30;&#xB85D;&quot;&#xC744; &#xC870;&#xD68C;&#xD560; &#xC218; &#xC788;&#xC5B4;&#xC57C;&#xD55C;&#xB2E4;. &#xADF8;&#xB7F0;&#xB370; OAuth &#xAC00; &#xC874;&#xC7AC;&#xD558;&#xC9C0; &#xC54A;&#xB294; &#xC138;&#xC0C1;&#xC774;&#xB77C;&#xBA74; &#xC5B4;&#xB5BB;&#xAC8C; &quot;&#xC0AC;&#xC6A9;&#xC790;&#xC758; &#xC720;&#xD29C;&#xBE0C; &#xAE30;&#xB85D;&quot;&#xC744; &#xD68D;&#xB4DD;&#xD560; &#xC218; &#xC788;&#xC744;&#xAE4C;?</p><ul><li>&#xC0AC;&#xC6A9;&#xC790;&#xC5D0;&#xAC8C; &#xAD6C;&#xAE00; &#xC774;&#xBA54;&#xC77C; / &#xBE44;&#xBC00;&#xBC88;&#xD638;&#xB97C; &#xBC1B;&#xB294;&#xB2E4;.<ul><li>&#xADF8;&#xB9AC;&#xACE0; &#xADF8; &#xC774;&#xBA54;&#xC77C; / &#xBE44;&#xBC00;&#xBC88;&#xD638;&#xB97C; &#xC11C;&#xBC84;&#xB294; &#xC800;&#xC7A5;&#xD574;&#xB454;&#xB2E4;.</li></ul></li><li>&#xC5B4;&#xD50C;&#xB9AC;&#xCF00;&#xC774;&#xC158;&#xC5D0;&#xC11C;&#xB294; &#xD574;&#xB2F9; &#xAD6C;&#xAE00; &#xC774;&#xBA54;&#xC77C; / &#xBE44;&#xBC00;&#xBC88;&#xD638;&#xB85C; &#xB300;&#xC2E0; &#xB85C;&#xADF8;&#xC778;&#xD558;&#xACE0; &#xC815;&#xBCF4;&#xB97C; &#xAD6C;&#xAE00;&#xC5D0;&#xC11C; &#xD68D;&#xB4DD;&#xD55C;&#xB2E4;.</li></ul><p>&#xADF8;&#xB807;&#xB2E4;. &#xC9C1;&#xC811; &#xAD6C;&#xAE00;&#xC5D0; &#xB4E4;&#xC5B4;&#xAC08; &#xC218;&#xC788;&#xB294; &#xAD8C;&#xD55C;&#xC778; <code>&#xC544;&#xC774;&#xB514;&#xC640; &#xD328;&#xC2A4;&#xC6CC;&#xB4DC;</code> &#xB97C; &#xC0AC;&#xC6A9;&#xC790;&#xB294; &#xC6B0;&#xB9AC; &#xC5B4;&#xD50C;&#xB9AC;&#xCF00;&#xC774;&#xC158;&#xC5D0; &#xC81C;&#xACF5;&#xD574;&#xC57C;&#xD55C;&#xB2E4;.  &#xB4E3;&#xAE30;&#xB9CC;&#xD574;&#xB3C4; &#xC0AC;&#xC6A9;&#xC790; &#xADF8;&#xB9AC;&#xACE0; &#xC11C;&#xBE44;&#xC2A4; &#xC6B4;&#xC601;&#xC790; &#xBAA8;&#xB450;&#xC5D0;&#xAC8C; &#xAD49;&#xC7A5;&#xD788; &#xCC1D;&#xCC1D;&#xD55C; &#xC77C;&#xC774;&#xB2E4;. &#xC774;&#xB7F0; &#xBC29;&#xC2DD;&#xC73C;&#xB85C; &#xB85C;&#xADF8;&#xC778;&#xC744;&#xD55C;&#xB2E4;&#xBA74; &#xB2E4;&#xC74C;&#xACFC; &#xAC19;&#xC740; &#xBB38;&#xC81C;&#xAC00; &#xBC1C;&#xC0DD;&#xD560; &#xC218; &#xC788;&#xB2E4;.</p><ul><li>&#xC0AC;&#xC6A9;&#xC790;&#xC758; &#xAD8C;&#xD55C;&#xC744; &#xACFC;&#xB3C4;&#xD558;&#xAC8C; &#xD68D;&#xB4DD;&#xD55C;&#xB2E4;.<ul><li>&#xB098;&#xC05C; &#xB9C8;&#xC74C;&#xC744; &#xBA39;&#xC740; &#xC11C;&#xBE44;&#xC2A4; &#xC6B4;&#xC601;&#xC790;&#xAC00; &#xC0AC;&#xC6A9;&#xC790;&#xC758; &#xACC4;&#xC815;&#xC73C;&#xB85C; &#xB098;&#xC05C; &#xC9D3;&#xC744; &#xD560; &#xC218; &#xC788;&#xB2E4;.</li></ul></li><li>&#xC0AC;&#xC6A9;&#xC790;&#xC758; &#xBBFC;&#xAC10; &#xC815;&#xBCF4; &#xB178;&#xCD9C;&#xB41C;&#xB2E4;.</li><li>&#xC0AC;&#xC6A9;&#xC790;&#xB294; &#xBE44;&#xBC00;&#xBC88;&#xD638;&#xB97C; &#xBCC0;&#xACBD;&#xD558;&#xB294; &#xBC29;&#xBC95; &#xC678;&#xC5D0; &#xD574;&#xB2F9; &#xAD8C;&#xD55C;&#xC744; revoke &#xD560; &#xBC29;&#xBC95;&#xC774; &#xC874;&#xC7AC;&#xD558;&#xC9C0; &#xC54A;&#xB294;&#xB2E4;.</li><li>&#xD0C0; &#xC11C;&#xBE44;&#xC2A4; &#xC6B4;&#xC601;&#xC790;&#xC758; &#xACBD;&#xC6B0; &#xCD94;&#xAC00;&#xB85C; &#xAD6C;&#xAE00;&#xC5D0; &#xB300;&#xD55C; &#xC0AC;&#xC6A9;&#xC790;&#xC758; &#xBBFC;&#xAC10; &#xC815;&#xBCF4;&#xB97C; &#xBCC4;&#xB3C4;&#xB85C; &#xC2E0;&#xACBD;&#xC368;&#xC11C; &#xAD00;&#xB9AC;&#xB97C; &#xD574;&#xC57C;&#xD55C;&#xB2E4;.</li></ul><p>&#xD574;&#xB2F9; &#xBC29;&#xC2DD;&#xC740; &#xB9E4;&#xC6B0; &#xC704;&#xD5D8;&#xD558;&#xACE0; &#xC11C;&#xBE44;&#xC2A4; &#xC6B4;&#xC601;&#xC790;(&#xAD6C;&#xAE00;), &#xD0C0; &#xC11C;&#xBE44;&#xC2A4; &#xC6B4;&#xC601;&#xC790;(&#xC720;&#xD29C;&#xBE0C; &#xBD84;&#xC11D;&#xAE30;), &#xC0AC;&#xC6A9;&#xC790; &#xBAA8;&#xB450;&#xC5D0;&#xAC8C; &#xBD88;&#xD3B8;&#xD55C; &#xBC29;&#xC2DD;&#xC774;&#xB2E4;. &#xC774;&#xB7EC;&#xD55C; &#xBB38;&#xC81C;&#xB97C; &#xD574;&#xACB0;&#xD558;&#xACE0;&#xC790; OAuth &#xB77C;&#xB294; &#xD504;&#xB85C;&#xD1A0;&#xCF5C;&#xC774; &#xB4F1;&#xC7A5;&#xD558;&#xAC8C; &#xB41C;&#xB2E4;. </p><h2 id="oauth-open-authorization">OAuth (Open Authorization)</h2><p>&#xC55E;&#xC11C; &#xC6B0;&#xB9AC;&#xB294; &#xC0AC;&#xC6A9;&#xC790;&#xC758; &#xC790;&#xC6D0;&#xC744; &#xC81C; 3 &#xC11C;&#xBE44;&#xC2A4;&#xC5D0;&#xAC8C; &#xC81C;&#xACF5;&#xD558;&#xAE30; &#xC704;&#xD574; &#xC11C;&#xBE44;&#xC2A4;&#xC758; &quot;&#xB85C;&#xADF8;&#xC778; &#xBBFC;&#xAC10; &#xC815;&#xBCF4;&quot;&#xB97C; &#xC81C;&#xACF5;&#xD574;&#xC57C;&#xD588;&#xB2E4;. &#xC774; &#xACFC;&#xC815;&#xC5D0;&#xC11C; &#xB2E4;&#xC591;&#xD55C; &#xBB38;&#xC81C;&#xAC00; &#xBC1C;&#xC0DD;&#xD560; &#xC218; &#xC788;&#xC74C;&#xC744; &#xC54C; &#xC218; &#xC788;&#xC5C8;&#xB2E4;. OAuth &#xB294; &#xBC14;&#xB85C; &#xC774;&#xB7F0; &#xBB38;&#xC81C;&#xB97C; &#xD574;&#xACB0;&#xD558;&#xAE30; &#xC704;&#xD574;&#xC11C; &#xB4F1;&#xC7A5;&#xD588;&#xB2E4;. </p><h3 id="%EC%97%AD%EC%82%AC">&#xC5ED;&#xC0AC;</h3><p>OAuth &#xB294; &#xC0AC;&#xC2E4;  <strong>De facto &#xD45C;&#xC900;(&#xC0AC;&#xC2E4;&#xC0C1; &#xD45C;&#xC900;)</strong> &#xC73C;&#xB85C; &#xAE30;&#xAD00;&#xB4E4;&#xC774; &#xBAA8;&#xC5EC; &quot;&#xC774;&#xAC8C; &#xD45C;&#xC900;&#xC774;&#xC57C;&quot; &#xB77C;&#xACE0; &#xBAA8;&#xC5EC;&#xC11C; &#xB9CC;&#xB4E4;&#xC5B4;&#xC9C4; &#xD45C;&#xC900;&#xC740; &#xC544;&#xB2C8;&#xBA70; &#xB110;&#xB9AC; &#xC0AC;&#xC6A9;&#xB418;&#xC5EC; API &#xC811;&#xADFC; &#xAD8C;&#xD55C;&#xC5D0; &#xB300;&#xD55C; &#xC0AC;&#xC2E4;&#xC0C1;&#xC758; &#xD45C;&#xC900;&#xC774; &#xB418;&#xC5C8;&#xB2E4;.</p><p>2006&#xB144; &#xD2B8;&#xC704;&#xD130;&#xC5D0;&#xC11C; OpenID &#xAD6C;&#xD604;&#xACFC; &#xB3D9;&#xC2DC;&#xC5D0; &#xC704; &#xC608;&#xC2DC;&#xC640; &#xB9C8;&#xCC2C;&#xAC00;&#xC9C0;&#xB85C; Twitter, Google &#xACFC; &#xAC19;&#xC740; &#xC11C;&#xBE44;&#xC2A4;&#xC5D0; &#xC811;&#xADFC;&#xD558;&#xC5EC; &#xD2B9;&#xC815; &#xC815;&#xBCF4;&#xB97C; &#xD68D;&#xB4DD;&#xD558;&#xACE0;&#xC790; &#xD558;&#xB294; &#xC218;&#xC694;&#xAC00; &#xBC1C;&#xC0DD;&#xD558;&#xC600;&#xACE0;, &#xC774;&#xB7EC;&#xD55C; API &#xC5D0; &#xC811;&#xADFC;&#xD558;&#xAE30; &#xC704;&#xD55C; &#xD45C;&#xC900;&#xC774; &#xC5C6;&#xB2E4;&#xB294; &#xC0AC;&#xC2E4;&#xC5D0; <strong>OAuth Discussion Group</strong> &#xC774; &#xD0C4;&#xC0DD;&#xD558;&#xC5EC; 2007&#xB144; OAuth 1.0 &#xC5D0; &#xB300;&#xD55C; &#xCD5C;&#xC885; &#xCD08;&#xC548;&#xC774; &#xB4F1;&#xC7A5;&#xD558;&#xC600;&#xB2E4;. </p><h3 id="%EC%A0%95%EC%9D%98">&#xC815;&#xC758;</h3><p>OAuth 2.0 &#xC758; RFC&#xC758; &#xC694;&#xC57D;&#xBD80;&#xD130; &#xC0B4;&#xD3B4;&#xBCF4;&#xC790;.</p><ul><li>OAuth 2.0 &#xC778;&#xC99D; &#xD504;&#xB808;&#xC784;&#xC6CC;&#xD06C;&#xB294; <code>Resource Owner</code> &#xC640; <code>HTTP Service</code> &#xAC04; &#xC2B9;&#xC778; &#xC0C1;&#xD638; &#xC791;&#xC6A9;&#xC744; &#xC870;&#xC728;&#xD558;&#xC5EC; <code>Resource Owner</code> &#xB97C; &#xB300;&#xC2E0;&#xD558;&#xC5EC; &#xD0C0;&#xC0AC; &#xC560;&#xD50C;&#xB9AC;&#xCF00;&#xC774;&#xC158;(<code>Client</code>)&#xC774; <code>HTTP Service</code> &#xC5D0;&#xB300;&#xD55C; <strong>&#xC81C;&#xD55C;&#xB41C; &#xC561;&#xC138;&#xC2A4;</strong> &#xAD8C;&#xD55C;&#xC744; &#xC5BB;&#xAC70;&#xB098;, &#xD0C0;&#xC0AC; &#xC560;&#xD50C;&#xB9AC;&#xCF00;&#xC774;&#xC158;&#xC774; &#xC790;&#xCCB4;&#xC801;&#xC73C;&#xB85C; <strong>&#xC561;&#xC138;&#xC2A4; &#xAD8C;&#xD55C;&#xC744; &#xC5BB;&#xC744; &#xC218; &#xC788;&#xB3C4;&#xB85D;</strong> &#xD5C8;&#xC6A9;&#xD55C;&#xB2E4;.<ul><li>&#xC798; &#xC0B4;&#xD3B4;&#xBCF4;&#xBA74; &quot;<strong>&#xC778;&#xAC00;(Auhtorization)</strong>&quot;  &#xC5D0; &#xB300;&#xD574;&#xC11C; &#xC774;&#xC57C;&#xAE30;&#xD558;&#xACE0; &#xC788;&#xB2E4;. &quot;<strong>&#xC778;&#xC99D;</strong>&quot;&#xC774; &#xC544;&#xB2D8;&#xC744; &#xC798; &#xC0DD;&#xAC01;&#xD574;&#xB450;&#xC790;.</li></ul></li></ul><p>OAuth &#xD504;&#xB85C;&#xD1A0;&#xCF5C;&#xC740; &#xACB0;&#xAD6D; &#xB2E4;&#xC74C;&#xACFC; &#xAC19;&#xC740; &#xBAA9;&#xC801;&#xC744; &#xC704;&#xD574;&#xC11C; &#xB9CC;&#xB4E4;&#xC5B4;&#xC84C;&#xB2E4;&#xACE0; &#xC694;&#xC57D;&#xD574;&#xBCFC; &#xC218; &#xC788;&#xB2E4;.</p><ul><li>&#xD0C0;&#xC0AC; &#xC5B4;&#xD50C;&#xB9AC;&#xCF00;&#xC774;&#xC158;&#xC774; &#xC790;&#xC6D0; &#xC18C;&#xC720;&#xC790;&#xC758; &#xC790;&#xC6D0;&#xC5D0; &#xB300;&#xD574;&#xC11C; <strong>&quot;&#xC81C;&#xD55C;&#xC801; &#xC811;&#xADFC;&quot;</strong> &#xC744; &#xD560; &#xC218; &#xC788;&#xB3C4;&#xB85D; <strong>&quot;&#xC778;&#xAC00;&quot;</strong>&#xB97C; &#xC81C;&#xACF5;&#xD558;&#xBA70;, &#xC774; &#xACFC;&#xC815;&#xC774; <strong>&quot;&#xC548;&#xC804;&#xD558;&#xAC8C;&quot;</strong> &#xC774;&#xB8E8;&#xC5B4; &#xC9C8; &#xC218; &#xC788;&#xB3C4;&#xB85D; &#xD558;&#xB294; &#xD504;&#xB85C;&#xD1A0;&#xCF5C;</li></ul><p>&#xADF8;&#xB7F0;&#xB370;, &#xC5EC;&#xAE30;&#xC11C; &#xB4F1;&#xC7A5;&#xD558;&#xB294; &quot;&#xC5ED;&#xD560;&quot;&#xC5D0; &#xAD00;&#xD55C; &#xC6A9;&#xC5B4;&#xB4E4;&#xC774; &#xC6B0;&#xB9AC;&#xC5D0;&#xAC8C; &#xCE5C;&#xC219;&#xD55C; <code>client-server</code> &#xAD6C;&#xC870;&#xC640;  &#xB2E4;&#xC18C; &#xB2E4;&#xB974;&#xB2E4;. &#xADF8;&#xB798;&#xC11C; &#xBA3C;&#xC800; &#xAC01; &#xC5ED;&#xD560;&#xC5D0; &#xB300;&#xD55C; OAuth &#xC5D0;&#xC11C;&#xC758; &#xC7AC;&#xC815;&#xC758;&#xB97C; &#xC0B4;&#xD3B4;&#xBCF4;&#xC790;.</p><h3 id="role">Role</h3><h4 id="resource-owner">Resource Owner</h4><ul><li>&#xCD5C;&#xC885; &#xC0AC;&#xC6A9;&#xC790;&#xB97C; &#xC77C;&#xCEEB;&#xB294;&#xB2E4;. Google &#xC5D0; &quot;&#xC790;&#xC6D0;&quot;&#xC744; &#xC18C;&#xC720;&#xD55C; &#xBCF8;&#xC778;&#xC744; &#xC77C;&#xCEEB;&#xAE30;&#xC5D0; <code>Resource Owner</code> &#xB77C;&#xB294; &#xBA85;&#xCE6D;&#xC774; &#xBD99;&#xB294;&#xB2E4;.</li><li><code>Resource Owner</code> &#xB294; &#xACB0;&#xACFC;&#xC801;&#xC73C;&#xB85C; <code>Client</code> &#xC5D0;&#xAC8C; &#xC790;&#xC6D0;&#xC5D0; &#xB300;&#xD55C; &#xC811;&#xADFC;&#xC5D0; &#xB300;&#xD55C; &#xAD8C;&#xD55C;&#xC744; &#xC704;&#xC784;&#xD558;&#xAC8C; &#xB41C;&#xB2E4;.</li></ul><h4 id="resource-server">Resource Server</h4><ul><li>&#xC608;&#xC2DC;&#xC5D0;&#xC11C; <code>Google</code> &#xC5D0; &#xD574;&#xB2F9;&#xD55C;&#xB2E4;. <code>Resource Owner</code> &#xAC00; &#xC18C;&#xC720;&#xD55C; &#xC790;&#xC6D0;&#xC744; &#xAC00;&#xC9C0;&#xACE0;&#xC788;&#xB294; &#xC11C;&#xBC84;&#xB97C; &#xC77C;&#xCEEB;&#xB294;&#xB2E4;. </li><li> &#xD574;&#xB2F9; &#xC11C;&#xBC84;&#xB294; &#xC704;&#xC784;&#xB41C; &#xAD8C;&#xD55C;&#xC744; &#xC778;&#xC99D;&#xD558;&#xB294; &#xD1A0;&#xD070;&#xC744; &#xAC80;&#xC0AC;&#xD558;&#xACE0;, &#xD574;&#xB2F9; &#xC790;&#xC6D0;&#xC5D0; &#xB300;&#xD55C; &#xC751;&#xB2F5;&#xC744; &#xBCF4;&#xB0B4;&#xAC8C; &#xB41C;&#xB2E4;.</li></ul><h4 id="client">Client</h4><ul><li>&#xC608;&#xC2DC;&#xC5D0;&#xC11C; <code>&#xC720;&#xD29C;&#xBE0C; &#xBD84;&#xC11D;&#xAE30;</code> &#xC5D0; &#xD574;&#xB2F9;&#xD55C;&#xB2E4;. <code>Resource Owner</code> &#xAC00; &#xC18C;&#xC720;&#xD55C; &#xC790;&#xC6D0;&#xC5D0; &#xB300;&#xD55C; &#xAD8C;&#xD55C;&#xC744; &#xC704;&#xC784; &#xBC1B;&#xC544;, &#xB300;&#xB9AC;&#xB85C; &#xC790;&#xC6D0;&#xC5D0; &#xB300;&#xD574; &#xB2E4;&#xB8E8;&#xB294; &#xC8FC;&#xCCB4;&#xC774;&#xB2E4;.</li><li>&#xC77C;&#xBC18;&#xC801;&#xC73C;&#xB85C; <code>Resource Owner</code> &#xAC00; &#xD2B9;&#xC815; &#xC11C;&#xBE44;&#xC2A4;&#xB97C; &#xD65C;&#xC6A9;&#xD558;&#xAE30; &#xC704;&#xD574; &#xC811;&#xADFC;&#xD558;&#xB294; &#xC11C;&#xBC84;&#xAC00; &#xADF8; &#xB300;&#xC0C1;&#xC774; &#xB41C;&#xB2E4;.</li><li>Client &#xC758; &#xACBD;&#xC6B0; <code>confidential</code> / <code>public</code> &#xB450; &#xC885;&#xB958;&#xB85C; &#xB098;&#xB20C; &#xC218; &#xC788;&#xB2E4;.<ul><li><code>confidential</code> client &#xC758; &#xACBD;&#xC6B0; &#xC77C;&#xBC18;&#xC801;&#xC73C;&#xB85C; &#xC790;&#xACA9; &#xC99D;&#xBA85;&#xC758; &#xAE30;&#xBC00;&#xC131;&#xC744; &#xC720;&#xC9C0;&#xD560; &#xC218; &#xC788;&#xB294; client&#xB97C; &#xB9D0;&#xD55C;&#xB2E4;. &#xC77C;&#xBC18;&#xC801;&#xC73C;&#xB85C; web server &#xB97C; &#xD1B5;&#xD574;&#xC11C; &#xC811;&#xADFC; &#xAD8C;&#xD55C;&#xC744; &#xD68D;&#xB4DD;&#xD558;&#xB294; &#xACBD;&#xC6B0; &#xC774;&#xC5D0; &#xD574;&#xB2F9;&#xD55C;&#xB2E4;.<ul><li>confidential &#xD55C; &#xACBD;&#xC6B0;&#xC5D0;&#xB294; public / private key pair &#xC640; &#xAC19;&#xC774; client - authorization server &#xAC04;&#xC758; &#xC778;&#xC99D; &#xBC29;&#xBC95;&#xC744; &#xC81C;&#xACF5;&#xD558;&#xACE4;&#xD55C;&#xB2E4;.</li></ul></li><li><code>public</code> client &#xC758; &#xACBD;&#xC6B0; native app / user-agent &#xB97C; &#xB07C;&#xACE0;(&#xBE0C;&#xB77C;&#xC6B0;&#xC800; &#xC704;&#xC5D0;&#xC11C;) &#xB3D9;&#xC791;&#xD558;&#xB294; js app &#xACFC; &#xAC19;&#xC774; resource owner &#xAC00; &#xC9C1;&#xC811; &#xC2E4;&#xD589;&#xD558;&#xC5EC; &#xC790;&#xACA9; &#xC99D;&#xBA85;&#xC5D0; &#xB300;&#xD55C; &#xAE30;&#xBC00;&#xC131;&#xC744; &#xC720;&#xC9C0;&#xD560; &#xC218; &#xC5C6;&#xB294; client &#xB97C; &#xB9D0;&#xD55C;&#xB2E4;.</li></ul></li><li>&#xAC01; &#xC885;&#xB958;&#xC5D0; &#xB530;&#xB77C; Grant&#xB97C; &#xBC1B;&#xB294; &#xBC29;&#xC2DD;&#xC758; &#xBCC0;&#xD654;&#xAC00; &#xBC1C;&#xC0DD;&#xD560; &#xC218; &#xC788;&#xB2E4;. <ul><li>web server &#xC758; &#xACBD;&#xC6B0;&#xC5D0;&#xB294; &#xBCF4;&#xD1B5; authorization_code&#xB97C; &#xD1B5;&#xD55C;&#xB2E4;.</li><li>native app / browser app &#xACFC; &#xAC19;&#xC740; &#xACBD;&#xC6B0;&#xC5D0;&#xB294; implict &#xB97C; &#xC0AC;&#xC6A9;&#xD558;&#xC5EC; &#xBB38;&#xC81C;&#xB97C; &#xD574;&#xACB0;&#xD560; &#xC218; &#xC788;&#xB2E4;.</li></ul></li><li>+ Authorization server &#xC5D0;&#xC11C;&#xB294; &#xAC01; client &#xC5D0; &#xB300;&#xD55C; &#xC2DD;&#xBCC4;&#xC790;&#xB97C; &#xC81C;&#xACF5;&#xD574;&#xC57C;&#xD55C;&#xB2E4;. &#xC774;&#xB294; Authorization server &#xB0B4;&#xC5D0;&#xC11C; &#xAD6C;&#xBD84;&#xB418;&#xBA70;, secret &#xC73C;&#xB85C; &#xD65C;&#xC6A9;&#xD558;&#xB294; &#xB0B4;&#xC6A9;&#xC740; &#xC544;&#xB2C8;&#xB2E4;. <ul><li>CLIENT_ID &#xC640; &#xAC19;&#xC740; key &#xAC12;&#xC744; &#xC81C;&#xACF5;&#xD558;&#xB294;&#xB370; &#xC774;&#xAC8C; &#xBCF4;&#xD1B5; &#xC5EC;&#xAE30;&#xC5D0; &#xD574;&#xB2F9;&#xD55C;&#xB2E4;.</li></ul></li></ul><h4 id="authorization-server">Authorization Server</h4><ul><li>&#xC55E;&#xC120; &#xC608;&#xC2DC;&#xC5D0;&#xC11C;&#xB294; <code>Google OAuth Server</code> &#xAC00; &#xD574;&#xB2F9;&#xC774; &#xB41C;&#xB2E4;. &#xD574;&#xB2F9; &#xC790;&#xC6D0;&#xC5D0; &#xB300;&#xD55C; &#xC778;&#xAC00; &#xAD8C;&#xD55C;&#xC744; &#xBC1C;&#xAE09;&#xD558;&#xAE30; &#xC704;&#xD55C; &#xC11C;&#xBC84;&#xB85C; <code>Resource Owner</code> &#xC73C;&#xB85C;&#xBD80;&#xD130; &#xAD8C;&#xD55C;&#xC744; &#xC2B9;&#xC778;&#xBC1B;&#xACE0; <code>Resource Owner</code> &#xC5D0;&#xAC8C; Access Token &#xC744; &#xC2E4;&#xC81C;&#xB85C; &#xBC1C;&#xAE09;&#xD558;&#xB294; &#xC8FC;&#xCCB4;&#xAC00; &#xB41C;&#xB2E4;.<ul><li>&#xC774;&#xD6C4; &#xD574;&#xB2F9; Access Token&#xC744; <code>Resource Owner</code> &#xB294; <code>Client</code> &#xC5D0;&#xAC8C; &#xC81C;&#xACF5;&#xD558;&#xC5EC; &#xAD8C;&#xD55C;&#xC744; &#xC704;&#xC784;&#xD560; &#xAC83;&#xC774;&#xB2E4;&apos;&apos;.</li></ul></li></ul><h3 id="grant">Grant</h3><p>role &#xBD80;&#xBD84;&#xC5D0;&#xC11C; &#xC7A0;&#xC2DC; Grant&#xC5D0; &#xB300;&#xD55C; &#xB0B4;&#xC6A9;&#xC774; &#xC788;&#xC5C8;&#xB2E4;.  Grant &#xB294; &quot;&#xC5B4;&#xB5A4; &#xBC29;&#xC2DD;&#xC73C;&#xB85C; &#xC778;&#xAC00;&#xB97C; &#xBC1B;&#xC744; &#xAC83;&#xC778;&#xAC00;?&quot; &#xB77C;&#xB294; &#xAC83;&#xC5D0; &#xB300;&#xD55C; &#xB0B4;&#xC6A9;&#xC774;&#xB2E4;. </p><ol><li><strong>Authorization Code Grant</strong>: &#xAC00;&#xC7A5; &#xBCF4;&#xD3B8;&#xC801;&#xC778; &#xBC29;&#xC2DD;&#xC73C;&#xB85C;, &#xC0AC;&#xC6A9;&#xC790;&#xAC00; Authorization Server&#xC5D0;&#xC11C; &#xC778;&#xC99D;&#xD55C; &#xD6C4; Authorization Code&#xB97C; client &#xC5D0;&#xAC8C; &#xC804;&#xB2EC;&#xD55C;&#xB2E4;</li><li><strong>Implicit Grant</strong>: &#xC8FC;&#xB85C; &#xBE0C;&#xB77C;&#xC6B0;&#xC800; &#xAE30;&#xBC18; &#xC560;&#xD50C;&#xB9AC;&#xCF00;&#xC774;&#xC158;&#xC5D0;&#xC11C; &#xC0AC;&#xC6A9;&#xB418;&#xBA70;, Access Token&#xC744; &#xC9C1;&#xC811;&#xBC1B;&#xB294; &#xAC04;&#xB2E8;&#xD55C; &#xBC29;&#xC2DD;</li><li><strong>Resource Owner Password Credentials Grant</strong>: &#xC0AC;&#xC6A9;&#xC790;&#xAC00; &#xC790;&#xC2E0;&#xC758; &#xC0AC;&#xC6A9;&#xC790; &#xC774;&#xB984;&#xACFC; &#xBE44;&#xBC00;&#xBC88;&#xD638;&#xB97C; &#xC9C1;&#xC811; &#xD074;&#xB77C;&#xC774;&#xC5B8;&#xD2B8;&#xC5D0; &#xC785;&#xB825;&#xD558;&#xC5EC; Access Token&#xC744; &#xBC1B;&#xB294; &#xBC29;&#xC2DD;</li><li><strong>Client Credentials Grant</strong>: &#xD074;&#xB77C;&#xC774;&#xC5B8;&#xD2B8;&#xAC00; &#xC778;&#xC99D;&#xC11C;&#xC640; &#xAC19;&#xC740; &#xC790;&#xC2E0;&#xC758; &#xC790;&#xACA9;&#xC99D;&#xBA85;&#xC744; &#xC0AC;&#xC6A9;&#xD558;&#xC5EC; Access Token&#xC744; &#xBC1B;&#xC744; &#xB54C; &#xC0AC;&#xC6A9;&#xD55C;&#xB2E4;</li></ol><h3 id="protocol-endpoint">Protocol Endpoint</h3><h4 id="authorization-endpoint">Authorization Endpoint</h4><p>Authorization endpoint &#xB294; resource owner &#xC640; &#xC0C1;&#xD638;&#xC791;&#xC6A9;&#xC744;&#xD558;&#xACE0;, &#xC778;&#xAC00;&#xC5D0; &#xB300;&#xD55C; grant &#xB97C; &#xBC1B;&#xAE30; &#xC704;&#xD574;&#xC11C; &#xC0AC;&#xC6A9;&#xD55C;&#xB2E4;.  authorization server &#xB294; &#xBC18;&#xB4DC;&#xC2DC; resource owner &#xC5D0; &#xB300;&#xD55C; &#xC99D;&#xBA85;&#xC744; &#xD574;&#xC57C;&#xD55C;&#xB2E4;.(&#xAD6C;&#xAE00; &#xB85C;&#xADF8;&#xC778;&#xC744; &#xD560; &#xB54C; &#xC544;&#xC774;&#xB514;, &#xD328;&#xC2A4;&#xC6CC;&#xB4DC;&#xB97C; &#xC785;&#xB825;&#xD558;&#xB294; &#xBD80;&#xBD84;) &#xD574;&#xB2F9; &#xACFC;&#xC815;&#xC740; &#xC778;&#xC99D; &#xACFC;&#xC815;&#xACFC; &#xAD00;&#xB828;&#xC774; &#xB418;&#xC5B4;&#xC788;&#xC5B4; &#xBBFC;&#xAC10; &#xC815;&#xBCF4;&#xB97C; &#xB2E4;&#xB8E8;&#xAE30;&#xB3C4; &#xD558;&#xAE30;&#xC5D0; TLS &#xB97C; &#xD1B5;&#xD574;&#xC11C; &#xC774;&#xB8E8;&#xC5B4;&#xC838;&#xC57C;&#xD55C;&#xB2E4;.</p><ul><li>response_type<ul><li>authorization endpoint &#xB294; &#xC5B4;&#xB5A4; &#xD615;&#xD0DC;&#xC758; grant&#xB97C; &#xC0AC;&#xC6A9;&#xD560; &#xC9C0;&#xC5D0; &#xB300;&#xD574;&#xC11C; &#xBA85;&#xC2DC;&#xB97C; &#xD574;&#xC57C;&#xD55C;&#xB2E4;. &#xC774;&#xB97C; &#xC704;&#xD55C; &#xBD80;&#xBD84;&#xC774; required parameter &#xC774;&#xB2E4;.  &#xC77C;&#xBC18;&#xC801;&#xC73C;&#xB85C; OAuth &#xC18C;&#xC15C; &#xB85C;&#xADF8;&#xC778; &#xACFC;&#xC815;&#xC5D0;&#xC11C;&#xB294; &quot;code&quot; &#xB97C; &#xC0AC;&#xC6A9;&#xD558;&#xB294;&#xB370;, &#xC774;&#xB294; authorization code &#xD615;&#xD0DC;&#xC758; grant&#xB97C; &#xC218;&#xD589;&#xD568;&#xC744; &#xB098;&#xD0C0;&#xB0B8;&#xB2E4;. &#xBC18;&#xBA74;, access token &#xC744; &#xC9C1;&#xC811; &#xBC1B;&#xB294; implicit grant &#xC758; &#xACBD;&#xC6B0; &quot;token&quot;&#xC744; &#xC0AC;&#xC6A9;&#xD55C;&#xB2E4;.</li></ul></li></ul><h4 id="redirection-endpoint">Redirection Endpoint</h4><ul><li>Resource  owner &#xC640;&#xC758; &#xC0C1;&#xD638;&#xC791;&#xC6A9;&#xC744; &#xC885;&#xB8CC;&#xD558;&#xACE0; &#xB09C; &#xD6C4;, resource owner &#xC758; user agent &#xB97C; &#xC0AC;&#xC6A9;&#xD558;&#xC5EC; client &#xC5D0;&#xAC8C; &#xBCF4;&#xB0BC; &#xBC29;&#xBC95;&#xC774; &#xD544;&#xC694;&#xD558;&#xB2E4;. &#xC774; &#xB54C; &#xC0AC;&#xC6A9;&#xD558;&#xB294; endpoint &#xAC00; &#xBC14;&#xB85C; redirection endpoint &#xC774;&#xB2E4;.<ul><li>&#xC18C;&#xC15C; &#xB85C;&#xADF8;&#xC778; &#xACFC;&#xC815;&#xC5D0;&#xC11C; redirect uri &#xB97C; &#xC124;&#xC815;&#xD558;&#xACE4;&#xD558;&#xB294;&#xB370; &#xD574;&#xB2F9; &#xBD80;&#xBD84;&#xC774; &#xC774; &#xBD80;&#xBD84;&#xC774;&#xB2E4;.</li></ul></li><li>&#xC774; &#xB610;&#xD55C; &#xB098;&#xB984;&#xC758; &#xBBFC;&#xAC10; &#xC815;&#xBCF4;&#xC778; authorization code &#xB97C; &#xC804;&#xB2EC;&#xD558;&#xAE30;&#xC5D0; TLS &#xB97C; &#xD1B5;&#xD55C; &#xD1B5;&#xC2E0;&#xC744; &#xAD8C;&#xC7A5;&#xD558;&#xACE0; &#xC788;&#xB2E4;.</li></ul><h4 id="token-endpoint">Token Endpoint</h4><ul><li>Client &#xAC00; authorization code &#xD639;&#xC740; refresh token &#xC744; &#xC81C;&#xC2DC;&#xD558;&#xACE0; access token &#xC744; &#xC5BB;&#xB294;&#xB370; &#xC0AC;&#xC6A9;&#xD558;&#xB294; authoirzation server &#xB2E8;&#xC758; endpoint &#xC774;&#xB2E4;. &#xC774; &#xB54C; <code>POST</code> method&#xB97C; &#xD1B5;&#xD574; &#xC694;&#xCCAD;&#xD574;&#xC57C;&#xD55C;&#xB2E4;.</li></ul><h3 id="oauth-20-%ED%94%84%EB%A1%9C%ED%86%A0%EC%BD%9C%EC%9D%98-%ED%9D%90%EB%A6%84">OAuth 2.0 &#xD504;&#xB85C;&#xD1A0;&#xCF5C;&#xC758; &#xD750;&#xB984;</h3><p><strong>RFC 6749 &#xC608;&#xC2DC;</strong></p><pre><code class="language-text">     +--------+                               +---------------+
     |        |--(A)- Authorization Request -&gt;|   Resource    |
     |        |                               |     Owner     |
     |        |&lt;-(B)-- Authorization Grant ---|               |
     |        |                               +---------------+
     |        |
     |        |                               +---------------+
     |        |--(C)-- Authorization Grant --&gt;| Authorization |
     | Client |                               |     Server    |
     |        |&lt;-(D)----- Access Token -------|               |
     |        |                               +---------------+
     |        |
     |        |                               +---------------+
     |        |--(E)----- Access Token ------&gt;|    Resource   |
     |        |                               |     Server    |
     |        |&lt;-(F)--- Protected Resource ---|               |
     +--------+                               +---------------+

                     Figure 1: Abstract Protocol Flow
</code></pre><ol><li>(A) Client &#xB294; Resource Owner &#xC5D0;&#xAC8C; &#xC778;&#xC99D; &#xC694;&#xCCAD;&#xC744; &#xD55C;&#xB2E4;. (&#xAD6C;&#xAE00;&#xB85C; &#xB85C;&#xADF8;&#xC778;&#xD558;&#xAE30; &#xBC84;&#xD2BC; &#xD074;&#xB9AD;)</li><li>(B) Resource Owner &#xB294; &#xAD8C;&#xD55C; &#xBD80;&#xC5EC; &#xC694;&#xCCAD;&#xC744; &#xBC1B;&#xACE0;,  &#xAD8C;&#xD55C;&#xC5D0; &#xB300;&#xD55C; &#xD5C8;&#xAC00;&#xB97C; &#xB0B4;&#xC900;&#xB2E4;.<ol><li>&#xB2E4;&#xC18C; &#xC2E4;&#xC81C;&#xBCF4;&#xB2E4; &#xC9E7;&#xAC8C; &#xD45C;&#xD604;&#xB418;&#xB294;&#xB370; &#xAD6C;&#xAE00; &#xB85C;&#xADF8;&#xC778;&#xC744; &#xD558;&#xACE0; &#xAD8C;&#xD55C;(Scope)&#xC744; &#xC124;&#xC815;&#xD558;&#xB294; &#xBD80;&#xBD84;&#xC774; &#xC774;&#xC5D0; &#xD574;&#xB2F9;&#xD55C;&#xB2E4;.</li><li>(A) &#xACFC;&#xC815;&#xC5D0;&#xC11C; Client &#xB294; &#xAD6C;&#xAE00; Authorization Server &#xB85C;&#xC758; &#xACBD;&#xB85C;&#xB85C; &#xC0AC;&#xC6A9;&#xC790;&#xB97C; &#xBCF4;&#xB0B4;&#xACE0;, (B) &#xACFC;&#xC815;&#xC5D0;&#xC11C; &#xB85C;&#xADF8;&#xC778; -&gt; &#xC778;&#xC99D; &#xC815;&#xBCF4; &#xD68D;&#xB4DD; -&gt; Authorization code&#xC744; Client &#xC5D0;&#xAC8C; &#xC804;&#xC1A1;&#xC744; &#xB9D0;&#xD558;&#xACE0; &#xC788;&#xB2E4;.</li></ol></li><li>(C) Client &#xB294; Authorization &#xC11C;&#xBC84;&#xB85C; &#xAC00;&#xC11C; &#xD574;&#xB2F9; &#xAD8C;&#xD55C;&#xC73C;&#xB85C; Access Token &#xC744; &#xBC1C;&#xAE09; &#xBC1B;&#xB294;&#xB2E4;.<ol><li>Client &#xB294; 2&#xBC88; &#xACFC;&#xC815;&#xC5D0;&#xC11C; Authorization code &#xB97C; &#xC774;&#xBBF8; &#xD68D;&#xB4DD;&#xD558;&#xC600;&#xACE0;, Authorization code &#xB97C; &#xD1B5;&#xD574; Access Token &#xC744; &#xBC1C;&#xAE09;&#xBC1B;&#xB294; &#xACFC;&#xC815;.</li></ol></li><li>(D) Authorization Server &#xB294; Authorization code &#xB97C; &#xAC80;&#xC99D;&#xD558;&#xACE0; &#xAD8C;&#xD55C;&#xC5D0; &#xB300;&#xD55C; Access Token &#xC744; &#xBC1C;&#xAE09;&#xD55C;&#xB2E4;. <ol><li>&#xC5EC;&#xAE30;&#xC11C; &#xBC1B;&#xC740; Access token &#xC744; &#xD1B5;&#xD574; &#xC55E;&#xC73C;&#xB85C; Client &#xB294; Resource Owner &#xC758; &#xC790;&#xC6D0;&#xC5D0; &#xB300;&#xD574;&#xC11C; &#xB300;&#xB9AC;&#xB85C; &#xC811;&#xADFC;&#xD560; &#xC218; &#xC788;&#xB2E4;.</li></ol></li><li>(E) Client &#xB294; Access Token &#xC744; &#xB4E4;&#xACE0; Resource Owner &#xC5D0;&#xAC8C; &#xD574;&#xB2F9; &#xC790;&#xC6D0;&#xC5D0; &#xB300;&#xD574;&#xC11C; &#xC694;&#xCCAD;&#xC744; &#xD55C;&#xB2E4;.</li><li>(F) Resource Server &#xB294; &#xAC80;&#xC99D;&#xB41C; Access token &#xC77C; &#xACBD;&#xC6B0; &#xD574;&#xB2F9; &#xC790;&#xC6D0; &#xC694;&#xCCAD;&#xC5D0; &#xB300;&#xD574;&#xC11C; &#xC751;&#xB2F5;&#xD55C;&#xB2E4;.</li></ol><ul><li>&#xC544;&#xB798; hudi.blog &#xC5D0;&#xC11C; &#xC81C;&#xACF5;&#xD55C; &#xC608;&#xC2DC;&#xB294; &#xD574;&#xB2F9; &#xACFC;&#xC815;&#xC744; &#xB354; &#xC790;&#xC138;&#xD788; &#xD45C;&#xD604;&#xD558;&#xACE0; &#xC788;&#xB2E4;.</li></ul><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://hudi.blog/static/7dced69214d91d7f1f0892720b1b5e1b/ca1dc/oauth2.0-process.png" class="kg-image" alt="OAuth &#xAE4A;&#xAC8C; &#xC774;&#xD574;&#xD558;&#xAE30;" loading="lazy" width="680" height="517"><figcaption><span style="white-space: pre-wrap;">hudi.blog &#xC5D0;&#xC11C;&#xC758; &#xC870;&#xAE08; &#xB354; &#xC790;&#xC138;&#xD55C; &#xC608;&#xC2DC;-</span></figcaption></figure><ul><li>&#xC5EC;&#xAE30;&#xC11C; &#xC870;&#xAE08; &#xB2E4;&#xB978; &#xC810;&#xC740;  <code>DB &#xC5D0; Access Token &#xC800;&#xC7A5;</code> &#xBD80;&#xBD84;&#xC774;&#xB2E4;.<ul><li> &#xC77C;&#xBC18;&#xC801;&#xC73C;&#xB85C; &#xC5B4;&#xD50C;&#xB9AC;&#xCF00;&#xC774;&#xC158;&#xC5D0;&#xC11C; &#xC18C;&#xC15C; &#xB85C;&#xADF8;&#xC778;&#xC744; &#xD560; &#xACBD;&#xC6B0; &quot;&#xD68C;&#xC6D0; &#xC774;&#xBA54;&#xC77C;&quot; &quot; &#xC2DD;&#xBCC4;&#xC815;&#xBCF4;&quot; &quot;&#xC131;&#xBCC4;&quot; &#xB4F1;&#xC744; &#xD68D;&#xB4DD;&#xD558;&#xACE4;&#xD55C;&#xB2E4;.</li><li>&#xD574;&#xB2F9; &#xC815;&#xBCF4;&#xB294; (&#xAC70;&#xC758;) &#xBD88;&#xBCC0;&#xC131;&#xC744; &#xAC00;&#xC9C0;&#xACE0; &#xC788;&#xB2E4;. &#xCCAB; &#xB85C;&#xADF8;&#xC778;&#xC5D0;&#xC11C; access token &#xC744; &#xD1B5;&#xD574;&#xC11C; &#xD68D;&#xB4DD;&#xD558;&#xACE0; &#xB354; &#xC774;&#xC0C1; resource server &#xC5D0; &#xC694;&#xCCAD;&#xD558;&#xC9C0; &#xC54A;&#xC544;&#xB3C4; &#xB418;&#xB294; &#xC815;&#xBCF4;&#xC774;&#xAE30;&#xB3C4; &#xD55C;&#xB2E4;.</li><li>&#xB530;&#xB77C;&#xC11C;, Application &#xC744; &#xC791;&#xC131;&#xD558;&#xAE30;&#xC5D0; &#xB530;&#xB77C; &#xB2EC;&#xB77C;&#xC9C0;&#xAC8C; &#xB41C;&#xB2E4;. &#xB9CC;&#xC57D; &#xC720;&#xC800;&#xAC00; &quot;&#xC131;&#xBCC4;&quot; &quot;&#xB098;&#xC774;&quot; &quot;&#xC774;&#xBA54;&#xC77C;&quot; &#xB4F1;&#xC758; &#xC694;&#xC18C;&#xB97C; &#xC694;&#xCCAD;&#xD560; &#xACBD;&#xC6B0; Resource server &#xB85C; &#xBD80;&#xD130; &#xC811;&#xADFC;&#xD558;&#xC5EC; &#xD574;&#xB2F9; &#xC815;&#xBCF4;&#xB97C; &#xC81C;&#xACF5;&#xD560; &#xC218;&#xB3C4; &#xC788;&#xACE0;, Application &#xC758; DB&#xC5D0; &#xD574;&#xB2F9; &#xC815;&#xBCF4;&#xB97C; &#xBBF8;&#xB9AC; &#xC800;&#xC7A5;&#xD560; &#xC218;&#xB3C4; &#xC788;&#xB2E4;.</li><li>&#xB9CC;&#xC57D; <code>Youtube Analyzer</code> &#xC640; &#xAC19;&#xC740; &#xC5B4;&#xD50C;&#xB9AC;&#xCF00;&#xC774;&#xC158;&#xC774;&#xB77C;&#xBA74; access token &#xC758; &#xC18C;&#xC720;&#xB294; &#xD544;&#xC5F0;&#xC801;&#xC77C; &#xAC83;&#xC774;&#xB2E4;. (&#xACC4;&#xC18D; &#xB4E4;&#xACE0;&#xC640;&#xC11C; &#xBCF4;&#xC5EC;&#xC918;&#xC57C;&#xD558;&#xB2C8;&#xAE4C;..)</li></ul></li></ul><h2 id="oidc">OIDC</h2><p>OAuth &#xD504;&#xB85C;&#xD1A0;&#xCF5C;&#xC758; &#xACBD;&#xC6B0; &#xC81C;&#xD55C;&#xB41C; &#xC5D1;&#xC138;&#xC2A4;&#xC5D0; &#xB300;&#xD574; &#xC778;&#xAC00;&#xB97C; &#xC218;&#xD589;&#xD558;&#xB294; &#xD504;&#xB85C;&#xD1A0;&#xCF5C;&#xC774;&#xB2E4;. &#xC989;, &quot;&#xC778;&#xC99D;&quot;&#xACFC;&#xB294; &#xB2E4;&#xC18C; &#xBA40;&#xB2E4;. &#xC18C;&#xC15C; &#xB85C;&#xADF8;&#xC778; &#xACFC;&#xC815;&#xC744; &#xB5A0;&#xC62C;&#xB824;&#xBCF4;&#xBA74; &#xC774;&#xB97C; &#xC54C; &#xC218; &#xC788;&#xB2E4;.</p><ul><li>Authorization code &#xB97C; &#xBC1B;&#xC544;&#xC624;&#xACE0;, &#xC774;&#xB97C; &#xBC14;&#xD0D5;&#xC73C;&#xB85C; access token &#xC694;&#xCCAD;</li><li>access token&#xC744; &#xBC14;&#xD0D5;&#xC73C;&#xB85C; &#xD68C;&#xC6D0;&#xC758; &#xC815;&#xBCF4;&#xC5D0; &#xB300;&#xD55C; &#xC694;&#xCCAD;</li></ul><p>access token &#xB9CC;&#xC744; &#xD68D;&#xB4DD;&#xD558;&#xB294; &#xACFC;&#xC815;&#xC5D0;&#xC11C; &#xC0AC;&#xC2E4; &quot;&#xC778;&#xC99D;&quot;&#xC758; &#xBD80;&#xBD84;&#xC740; &#xB05D;&#xB09C; &#xAC83;&#xC774;&#xB098; &#xB2E4;&#xB984;&#xC5C6;&#xB2E4;. &#xADF8;&#xB7EC;&#xB098;, &#xD68C;&#xC6D0;&#xC5D0; &#xB300;&#xD55C; &#xD544;&#xC694;&#xD55C; &#xC815;&#xBCF4; (email / id) &#xB4F1;&#xC744; &#xD68D;&#xB4DD;&#xD558;&#xAE30; &#xC704;&#xD574;&#xC11C; access token &#xC744; &#xC0AC;&#xC6A9;&#xD558;&#xC5EC; &#xCD94;&#xAC00;&#xB85C; &#xC815;&#xBCF4;&#xB97C; &#xC694;&#xCCAD;&#xD574;&#xC57C;&#xD558;&#xB294; &#xBD88;&#xD3B8;&#xD568;&#xC774; &#xC788;&#xC5C8;&#xB2E4;. </p><p>&#xC774;&#xB7EC;&#xD55C; &#xBB38;&#xC81C;&#xB97C; &#xD574;&#xACB0;&#xD558;&#xACE0;&#xC790;&#xD558;&#xB294; &#xAC83;&#xC774; OIDC (OpenID Connect) &#xC774;&#xB2E4;. &#xC6D0;&#xB9AC;&#xB294; &#xAC04;&#xB2E8;&#xD558;&#xB2E4;. OAuth 2.0 &#xD504;&#xB85C;&#xD1A0;&#xCF5C; &#xC704;&#xC5D0;&#xC11C; access token &#xC744; &#xB3CC;&#xB824;&#xC8FC;&#xB294;&#xB370;, &#xD574;&#xB2F9; &#xD1A0;&#xD070;&#xC744; JWT &#xB85C; &#xAD6C;&#xC131;&#xD558;&#xACE0; payload &#xC5D0; &#xD544;&#xC694;&#xD55C; &#xD68C;&#xC6D0;&#xC758; &#xC815;&#xBCF4;&#xB97C; &#xAC19;&#xC774; &#xC804;&#xB2EC;&#xD558;&#xB294; &#xAC83;&#xC774;&#xB2E4;. &#xC774;&#xB97C; &#xD1B5;&#xD574; &#xC18C;&#xC15C; &#xB85C;&#xADF8;&#xC778;&#xACFC; &#xAC19;&#xC774; &#xD68C;&#xC6D0;&#xC5D0; &#xB300;&#xD55C; &#xC778;&#xC99D; &#xC791;&#xC5C5;&#xC744; &#xC218;&#xD589;&#xD558;&#xAE30; &#xC704;&#xD574; 2&#xBC88;&#xC758; &#xC694;&#xCCAD;&#xC744; &#xD55C; &#xBC88;&#xC73C;&#xB85C; &#xC904;&#xC77C; &#xC218; &#xC788;&#xB2E4;.</p><p>&#xD604;&#xC7AC; &#xB124;&#xC774;&#xBC84;&#xC758; &#xACBD;&#xC6B0;&#xC5D0;&#xB294; OIDC &#xB97C; &#xC9C0;&#xC6D0;&#xD558;&#xC9C0; &#xC54A;&#xC73C;&#xBA70;, &#xCE74;&#xCE74;&#xC624;&#xC758; &#xACBD;&#xC6B0;&#xC5D0;&#xB294; OIDC &#xB97C; &#xC9C0;&#xC6D0;&#xD558;&#xACE0; &#xC788;&#xB2E4;. &#xC704;&#xC5D0;&#xC11C; &#xBC30;&#xC6B4; &#xB0B4;&#xC6A9;&#xC744; &#xD1A0;&#xB300;&#xB85C; &#xC544;&#xB798; &#xCE74;&#xCE74;&#xC624;&#xC5D0;&#xC11C; &#xC81C;&#xC2DC;&#xD55C; &#xB85C;&#xADF8;&#xC778; &#xD750;&#xB984;&#xC744; &#xBCF4;&#xBA74; &#xC870;&#xAE08; &#xB354; &#xC774;&#xD574;&#xAC00; &#xC798;&#xB420; &#xAC83;&#xC774;&#xB2E4;.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://developers.kakao.com/docs/latest/ko/assets/style/images/kakaologin/kakaologin_sequence.png" class="kg-image" alt="OAuth &#xAE4A;&#xAC8C; &#xC774;&#xD574;&#xD558;&#xAE30;" loading="lazy" width="1600" height="2124"><figcaption><span style="white-space: pre-wrap;">kakao &#xC18C;&#xC15C; &#xB85C;&#xADF8;&#xC778; &#xD750;&#xB984;</span></figcaption></figure><p></p><h2 id="%08%EA%B6%81%EA%B8%88%ED%95%A0%EB%A7%8C%ED%95%9C-%EC%A0%95%EB%B3%B4%EB%93%A4">&#xAD81;&#xAE08;&#xD560;&#xB9CC;&#xD55C; &#xC815;&#xBCF4;&#xB4E4;</h2><h3 id="authorization-code-access-code-%EB%A5%BC-%EB%82%98%EB%88%84%EB%8A%94-%EC%9D%B4%EC%9C%A0">Authorization code / Access code &#xB97C; &#xB098;&#xB204;&#xB294; &#xC774;&#xC720;</h3><ul><li>Resource Owner &#xAC00; Client &#xC5D0;&#xAC8C; &#xC778;&#xAC00; &#xC815;&#xBCF4;&#xB97C; &#xC804;&#xC1A1;&#xD558;&#xB294; &#xBC29;&#xBC95;&#xC740; URI&#xB97C; &#xD1B5;&#xD55C; &#xBC29;&#xBC95;&#xBC16;&#xC5D0; &#xC5C6;&#xB2E4;.  (Redirect URI &#xACBD;&#xB85C;&#xB97C; &#xB530;&#xB77C;&#xAC00;&#xBA74;&#xC11C; &#xC804;&#xC1A1;&#xD558;&#xAE30; &#xB54C;&#xBB38;)<ul><li>&#xC774; &#xACFC;&#xC815;&#xC5D0;&#xC11C; &#xBC14;&#xB85C; &#xBE0C;&#xB77C;&#xC6B0;&#xC800;&#xB85C; &#xB178;&#xCD9C;&#xB418;&#xB294;&#xB370;, Access Token &#xC740; &#xD574;&#xB2F9; resource owner &#xC758; &#xC790;&#xC6D0;&#xC744; &#xC694;&#xCCAD;&#xD560; &#xC218; &#xC788;&#xB294; &#xBBFC;&#xAC10;&#xD55C; &#xD1A0;&#xD070;&#xC774;&#xB2E4;.</li><li>&#xB530;&#xB77C;&#xC11C; access token &#xC744; &#xBC1B;&#xB294; &#xC8FC;&#xCCB4;&#xB97C; server&#xB85C; &#xBCC0;&#xACBD;&#xD55C;&#xB2E4;. &#xC774; &#xB54C; &#xB2E8;&#xC21C;&#xD558;&#xAC8C; authorization code &#xB9CC;&#xC744; &#xB4E4;&#xACE0; &#xAC00;&#xB294; &#xAC83;&#xC774; &#xC544;&#xB2CC;, Authentication server &#xC640; &#xBBF8;&#xB9AC; &#xD569;&#xC758;&#xB41C; client id /  secret &#xACFC; &#xAC19;&#xC740; &#xC815;&#xBCF4;&#xB97C; &#xD568;&#xAED8; &#xC804;&#xC1A1;&#xD55C;&#xB2E4;.</li><li>&#xADF8; &#xACB0;&#xACFC;, &#xBCF4;&#xB2E4; &#xB354; &#xC548;&#xC804;&#xD558;&#xAC8C; resource owner &#xC758; &#xC790;&#xC6D0;&#xC5D0; &#xC811;&#xADFC;&#xD560; &#xC218; &#xC788;&#xB2E4;. </li></ul></li></ul><h3 id="refresh-token-%EC%9D%98-%ED%95%84%EC%9A%94%EC%84%B1">Refresh token &#xC758; &#xD544;&#xC694;&#xC131;</h3><ul><li>Access token &#xC740; stateless &#xD558;&#xB2E4;. stateless &#xD55C; access token &#xC774; &#xB178;&#xCD9C;&#xB418;&#xAC70;&#xB098; &#xD0C8;&#xCDE8;&#xB2F9;&#xD560; &#xACBD;&#xC6B0; &#xD574;&#xB2F9; access token &#xC73C;&#xB85C; &#xC811;&#xADFC;&#xD558;&#xB294; &#xAC83;&#xC744; &#xBC29;&#xBC95;&#xC774; &#xB9C8;&#xB545;&#xD788; &#xC874;&#xC7AC;&#xD558;&#xC9C0; &#xC54A;&#xB294;&#xB2E4;. (JWT &#xC5D0;&#xC11C;&#xC758; &#xBB38;&#xC81C;&#xC640; &#xB3D9;&#xC77C;)</li><li>&#xB530;&#xB77C;&#xC11C;, access token &#xC758; expire &#xC8FC;&#xAE30;&#xB97C; &#xC9E7;&#xAC8C; &#xC8FC;&#xACE0;, refresh token &#xC744; &#xD1B5;&#xD574;&#xC11C; access token &#xB9CC;&#xB8CC;&#xC2DC; &#xBE60;&#xB974;&#xAC8C; refresh token &#xC744; &#xD1B5;&#xD574; access token &#xC744; &#xAC31;&#xC2E0;&#xD558;&#xB294; &#xC6A9;&#xB3C4;&#xB85C; &#xD65C;&#xC6A9;&#xD55C;&#xB2E4;.</li></ul><h3 id="%08authorization-vs-authentication">Authorization vs Authentication</h3><ul><li>&#xC815;&#xB9D0; &#xB2E8;&#xC21C;&#xD558;&#xAC8C; &#xC2E4;&#xC0AC;&#xC6A9; &#xC608;&#xC2DC;&#xB85C; &#xD45C;&#xD604;&#xD558;&#xBA74; &#xB2E4;&#xC74C;&#xACFC; &#xAC19;&#xB2E4;.<ul><li>Authentication (&#xC778;&#xC99D;)<ul><li>&#xB85C;&#xADF8;&#xC778; / OTP</li></ul></li><li>Authorization (&#xC778;&#xAC00;)<ul><li>Cookie / JWT / API Key</li></ul></li></ul></li><li>Authentication (&#xC778;&#xC99D;) &#xC740; &#xC0AC;&#xC6A9;&#xC790;&#xC758; &#xC2E0;&#xC6D0;&#xC744; &#xD655;&#xC778;&#xD558;&#xB294; &#xD589;&#xC704;&#xC774;&#xB2E4;. &#xB530;&#xB77C;&#xC11C;, &#xC774;&#xBBF8; &#xC800;&#xC7A5;&#xB41C; &#xB370;&#xC774;&#xD130;&#xC640; &#xBE44;&#xAD50;&#xD558;&#xBA74;&#xC11C; &quot;&#xD574;&#xB2F9; &#xC0AC;&#xC6A9;&#xC790;&#xAC00; &#xB9DE;&#xB294;&#xAC00;?&quot;&#xB97C; &#xAC80;&#xC99D;&#xD55C;&#xB2E4;.<ul><li>ID / PW &#xB85C;&#xADF8;&#xC778;</li><li>2FA (OTP / Email &#xCD94;&#xAC00; &#xC778;&#xC99D; / &#xC0DD;&#xCCB4; &#xC778;&#xC99D; ...)</li><li>API &#xC778;&#xC99D;<ul><li>&#xC704; OAuth &#xC5D0;&#xC11C; API_ID / API_SECRET &#xC744; &#xD1B5;&#xD574;&#xC11C; &#xC2E0;&#xC6D0;&#xC744; &#xD655;&#xC778;&#xD558;&#xB294; &#xC791;&#xC5C5;&#xC774; &#xC788;&#xB294;&#xB370; &#xC778;&#xC99D;&#xC758; &#xACFC;&#xC815;&#xC774;&#xB77C;&#xACE0; &#xBCFC; &#xC218; &#xC788;&#xC74C;.</li></ul></li></ul></li><li>Authorization (&#xC778;&#xAC00;)&#xC740; &quot;&#xAD8C;&#xD55C;&quot; &#xC5D0; &#xB300;&#xD55C; &#xC774;&#xC57C;&#xAE30;&#xC774;&#xB2E4;. &quot;&#xC5B4;&#xB5A4; &#xC790;&#xC6D0;&#xC5D0; &#xB204;&#xAC00; &#xBB34;&#xC5C7;&#xC744; &#xD560; &#xC218; &#xC788;&#xB294;&#xAC00;?&quot; &#xB97C; &#xAC80;&#xC99D;&#xD558;&#xB294; &#xD589;&#xC704;&#xC774;&#xB2E4;.<ul><li>JWT</li></ul></li><ul><li>Session + Cookie</li></ul><ul><li>OAuth</li></ul><ul><li>OpenID<ul><li>&#xC704; OIDC &#xB54C;&#xBB38;&#xC5D0; &#xC870;&#xAE08; &#xD5F7;&#xAC08;&#xB9B4; &#xC218; &#xC788;&#xB2E4;. &#xB2E4;&#xB9CC; &#xADFC;&#xBCF8;&#xC801;&#xC73C;&#xB85C; &#xC0DD;&#xAC01;&#xD574;&#xBCF4;&#xBA74; OAuth 2.0 &#xC704;&#xC5D0;&#xC11C; Authentication (&#xC778;&#xC99D; &#xC11C;&#xBC84;&#xC5D0;&#xC11C;&#xC758; &#xC778;&#xC99D;) + Authorization (&#xD1A0;&#xD070;&#xC744; &#xD1B5;&#xD55C; &#xC811;&#xADFC;) &#xBAA8;&#xB450; &#xC218;&#xD589;&#xD558;&#xB294; &#xAC83;&#xC744; &#xC54C; &#xC218; &#xC788;&#xC74C;. (JWT  &#xC0DD;&#xAC01;&#xD574;&#xBCF4;&#xBA74; &#xC774;&#xD574;&#xAC00; &#xBE60;&#xB974;&#xB2E4;.)</li></ul></li></ul></ul><h3 id="%EC%B0%B8%EA%B3%A0-%EC%9E%90%EB%A3%8C">&#xCC38;&#xACE0; &#xC790;&#xB8CC;</h3><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://oauth.net/2/"><div class="kg-bookmark-content"><div class="kg-bookmark-title">OAuth 2.0 &#x2014; OAuth</div><div class="kg-bookmark-description"></div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://oauth.net/favicon.ico" alt="OAuth &#xAE4A;&#xAC8C; &#xC774;&#xD574;&#xD558;&#xAE30;"></div></div><div class="kg-bookmark-thumbnail"><img src="https://oauth.net/images/oauth-logo-square.png" alt="OAuth &#xAE4A;&#xAC8C; &#xC774;&#xD574;&#xD558;&#xAE30;"></div></a></figure><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://datatracker.ietf.org/doc/html/rfc6749"><div class="kg-bookmark-content"><div class="kg-bookmark-title">RFC 6749: The OAuth 2.0 Authorization Framework</div><div class="kg-bookmark-description">The OAuth 2.0 authorization framework enables a third-party application to obtain limited access to an HTTP service, either on behalf of a resource owner by orchestrating an approval interaction between the resource owner and the HTTP service, or by allowing the third-party application to obtain access on its own behalf. This specification replaces and obsoletes the OAuth 1.0 protocol described in RFC 5849. [STANDARDS-TRACK]</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://static.ietf.org/dt/12.21.0/ietf/images/ietf-logo-nor-180.png" alt="OAuth &#xAE4A;&#xAC8C; &#xC774;&#xD574;&#xD558;&#xAE30;"><span class="kg-bookmark-author">IETF Datatracker</span><span class="kg-bookmark-publisher">Dick Hardt</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://static.ietf.org/dt/12.21.0/ietf/images/ietf-logo-card.png" alt="OAuth &#xAE4A;&#xAC8C; &#xC774;&#xD574;&#xD558;&#xAE30;"></div></a></figure><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://hudi.blog/oauth-2.0/"><div class="kg-bookmark-content"><div class="kg-bookmark-title">OAuth 2.0 &#xAC1C;&#xB150;&#xACFC; &#xB3D9;&#xC791;&#xC6D0;&#xB9AC;</div><div class="kg-bookmark-description"></div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://hudi.blog/icons/icon-192x192.png?v=783d202426de32b9eb1449c3fca1b518" alt="OAuth &#xAE4A;&#xAC8C; &#xC774;&#xD574;&#xD558;&#xAE30;"><span class="kg-bookmark-publisher">Hudi</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://hudi.blog/og-image.png" alt="OAuth &#xAE4A;&#xAC8C; &#xC774;&#xD574;&#xD558;&#xAE30;"></div></a></figure><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://velog.io/@0xf4d3c0d3/OAuth-2.0"><div class="kg-bookmark-content"><div class="kg-bookmark-title">OAuth 2.0 / Refresh token, Authorization code</div><div class="kg-bookmark-description">&#xD3C9;&#xC18C; OAuth 2.0&#xC5D0;&#xC11C; &#xAD81;&#xAE08;&#xD588;&#xB358;&#xAC83;&#xB4E4;. Refresh token&#xC774; &#xC65C; &#xD544;&#xC694;&#xD55C;&#xAC74;&#xC9C0;, Authorization code Grant flow&#xC5D0;&#xC11C; &#xC65C; &#xAD73;&#xC774; Access token &#xB300;&#xC2E0; Authorization code&#xB97C; &#xC911;&#xAC04;&#xC5D0; &#xAC70;&#xCE58;&#xB294;&#xAC74;&#xC9C0;&#xC5D0; &#xB300;&#xD55C; &#xACE0;&#xBBFC; &#xAC19;&#xC740;&#xAC83;&#xB4E4;&#xC744; &#xC815;&#xB9AC;&#xD574;&#xBD24;&#xB2E4;.</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://static.velog.io/favicons/apple-icon-152x152.png" alt="OAuth &#xAE4A;&#xAC8C; &#xC774;&#xD574;&#xD558;&#xAE30;"></div></div><div class="kg-bookmark-thumbnail"><img src="https://velog.velcdn.com/images/0xf4d3c0d3/post/f1f30409-cc6b-48d6-bf69-7221d7de2d01/image.png" alt="OAuth &#xAE4A;&#xAC8C; &#xC774;&#xD574;&#xD558;&#xAE30;"></div></a></figure><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://en.wikipedia.org/wiki/OAuth"><div class="kg-bookmark-content"><div class="kg-bookmark-title">OAuth - Wikipedia</div><div class="kg-bookmark-description"></div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://en.wikipedia.org/static/apple-touch/wikipedia.png" alt="OAuth &#xAE4A;&#xAC8C; &#xC774;&#xD574;&#xD558;&#xAE30;"><span class="kg-bookmark-author">Wikimedia Foundation, Inc.</span><span class="kg-bookmark-publisher">Contributors to Wikimedia projects</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://upload.wikimedia.org/wikipedia/en/thumb/b/b4/Ambox_important.svg/40px-Ambox_important.svg.png" alt="OAuth &#xAE4A;&#xAC8C; &#xC774;&#xD574;&#xD558;&#xAE30;"></div></a></figure><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://baek.dev/post/24/"><div class="kg-bookmark-content"><div class="kg-bookmark-title">&#xBE44;&#xC2B7;&#xD574;&#xBCF4;&#xC774;&#xC9C0;&#xB9CC; &#xB2E4;&#xB978; &#xB450; &#xCE5C;&#xAD6C;&#xB97C; &#xC18C;&#xAC1C;&#xD569;&#xB2C8;&#xB2E4;. Authentication vs Authorization | &#xC544;&#xC6C3;&#xD48B; &#xD2B8;&#xB808;&#xC774;&#xB2DD;</div><div class="kg-bookmark-description">&#xB0B4;&#xC678;&#xBD80; &#xAD00;&#xB828;&#xB41C; &#xC11C;&#xBE44;&#xC2A4;&#xB97C; &#xB7F0;&#xCE6D;&#xD558;&#xAC70;&#xB098; &#xAE30;&#xB2A5;&#xC744; &#xCD94;&#xAC00;&#xD560;&#xB54C; &#xAC19;&#xC774; &#xB17C;&#xC758;&#xB418;&#xB294; Auth&#xC5D0; &#xB300;&#xD574; &#xB4E4;&#xC5B4;&#xBCF4;&#xC168;&#xC744;&#xD150;&#xB370;&#xC694;, &#xBCF4;&#xD1B5; Auth&#xB77C;&#xACE0; &#xD558;&#xBA74; Authentication&#xC744; &#xB9D0;&#xD558;&#xAC70;&#xB098; Authentication + Authorization&#xB97C; &#xD1B5;&#xCE6D;&#xD569;&#xB2C8;&#xB2E4;. &#xC774;&#xB807;&#xAC8C; &#xAD6C;&#xBD84;&#xC9C0;&#xC5B4; &#xBD84;&#xB9AC;&#xB97C; &#xD574;&#xB193;&#xC740; &#xAC70; &#xBCF4;&#xB2C8; &#xB2E4;&#xB978; &#xAC83; &#xAC19;&#xAE34;&#xD55C;&#xB370; &#xACFC;&#xC5F0; &#xBB34;&#xC5C7;&#xC774; &#xC5B4;&#xB5BB;&#xAC8C; &#xB2E4;&#xB97C;&#xAE4C;&#xC694;? &#xD568;&#xAED8; &#xC54C;&#xC544;&#xAC00;&#xC694;.</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://baek.dev/icons/icon-192x192.png?v=e2fe54bee9a6a02b1aac7b61c9f1ce81" alt="OAuth &#xAE4A;&#xAC8C; &#xC774;&#xD574;&#xD558;&#xAE30;"><span class="kg-bookmark-author">&#xC544;&#xC6C3;&#xD48B; &#xD2B8;&#xB808;&#xC774;&#xB2DD;</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://baek.dev/assets/images/post/2020/2020_024.png" alt="OAuth &#xAE4A;&#xAC8C; &#xC774;&#xD574;&#xD558;&#xAE30;"></div></a></figure>]]></content:encoded></item><item><title><![CDATA[공공 데이터 Open API 삽질기]]></title><description><![CDATA[공공 데이터 Open API 에서 Service Key 인코딩 문제 해결기]]></description><link>https://life.photogrammer.me/openapi-servicekey-encoding-problem/</link><guid isPermaLink="false">669bf226031eef00010184e2</guid><category><![CDATA[Web]]></category><category><![CDATA[Java]]></category><category><![CDATA[Development]]></category><dc:creator><![CDATA[Sungjun Park]]></dc:creator><pubDate>Sat, 20 Jul 2024 17:35:46 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1550527882-b71dea5f8089?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDN8fGtleXxlbnwwfHx8fDE3MjE0OTcyMjl8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" medium="image"/><content:encoded><![CDATA[<img src="https://images.unsplash.com/photo-1550527882-b71dea5f8089?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDN8fGtleXxlbnwwfHx8fDE3MjE0OTcyMjl8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" alt="&#xACF5;&#xACF5; &#xB370;&#xC774;&#xD130; Open API &#xC0BD;&#xC9C8;&#xAE30;"><p></p><h2 id="%EB%AC%B8%EC%A0%9C-%EC%BD%94%EB%93%9C">&#xBB38;&#xC81C; &#xCF54;&#xB4DC;</h2><pre><code class="language-java">// 	Web &#xC694;&#xCCAD;
final RestTemplate restTemplate = new RestTemplate();
final String url = &quot;&lt;http://apis.data.go.kr/6410000/busrouteservice/getBusRouteInfoItem&gt;&quot;;
final String serviceKey = &quot;QIMPxKy%2B%2FltHKSomethingapikeyxg%3D%3D&quot;;
final UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(url)
	.queryParam(&quot;serviceKey&quot;, serviceKey)
	.queryParam(&quot;routeId&quot;, &quot;234000031&quot;);
final String requestUri = builder.toUriString();
&quot;&quot;
// 	OpenAPI &#xD638;&#xCD9C;
ResponseEntity&lt;String&gt; response = restTemplate.getForEntity(requestUri, String.class);
System.out.println(response.getBody());
</code></pre><h3 id="result">result</h3><pre><code class="language-xml">&lt;OpenAPI_ServiceResponse&gt;
	&lt;cmmMsgHeader&gt;
		&lt;errMsg&gt;SERVICE ERROR&lt;/errMsg&gt;
		&lt;returnAuthMsg&gt;SERVICE_KEY_IS_NOT_REGISTERED_ERROR&lt;/returnAuthMsg&gt;
		&lt;returnReasonCode&gt;30&lt;/returnReasonCode&gt;
	&lt;/cmmMsgHeader&gt;
&lt;/OpenAPI_ServiceResponse&gt;
</code></pre><h2 id="%EB%AC%B8%EC%A0%9C">&#xBB38;&#xC81C;</h2><p>&#xC815;&#xC0C1;&#xC801;&#xC73C;&#xB85C; <code>serviceKey</code> &#xB97C; &#xC785;&#xB825;&#xD588;&#xC74C;&#xC5D0;&#xB3C4;, <code>serviceKey</code> &#xAC00; &#xB4F1;&#xB85D;&#xB418;&#xC9C0; &#xC54A;&#xC558;&#xB2E4;&#xB294; &#xC624;&#xB958;&#xB97C; &#xBC18;&#xD658;&#xBC1B;&#xC74C;</p><h2 id="%EB%B6%84%EC%84%9D">&#xBD84;&#xC11D;</h2><p>request URL &#xBCC0;&#xD658; &#xACFC;&#xC815;&#xC5D0; &#xBB38;&#xC81C;&#xAC00; &#xC788;&#xB2E4;&#xACE0; &#xAC00;&#xC815;&#xD558;&#xACE0; debug &#xC9C4;&#xD589;</p><figure class="kg-card kg-image-card"><img src="https://life.photogrammer.me/content/images/2024/07/image-11.png" class="kg-image" alt="&#xACF5;&#xACF5; &#xB370;&#xC774;&#xD130; Open API &#xC0BD;&#xC9C8;&#xAE30;" loading="lazy" width="2000" height="282" srcset="https://life.photogrammer.me/content/images/size/w600/2024/07/image-11.png 600w, https://life.photogrammer.me/content/images/size/w1000/2024/07/image-11.png 1000w, https://life.photogrammer.me/content/images/size/w1600/2024/07/image-11.png 1600w, https://life.photogrammer.me/content/images/2024/07/image-11.png 2000w" sizes="(min-width: 720px) 720px"></figure><p>query &#xB97C; &#xAC04;&#xD3B8;&#xD558;&#xAC8C; &#xC0BD;&#xC785;&#xD558;&#xAE30; &#xC704;&#xD574;&#xC11C; <code>UriComponentsBuilder</code> &#xB97C; &#xD65C;&#xC6A9;&#xD558;&#xC600;&#xB294;&#xB370;, <code>%</code> &#xC740; <code>unsafe character</code> &#xB85C; URI &#xBCC0;&#xD658; &#xACFC;&#xC815;&#xC5D0;&#xC11C; <code>%</code> &#xC774; <code>%25</code> &#xB85C; &#xBCC0;&#xD658;&#xB41C; &#xBAA8;&#xC2B5;&#xC744; &#xBCFC; &#xC218; &#xC788;&#xC5C8;&#xC74C;</p><h3 id="uricomponentbuilder">URIComponentBuilder</h3><p><code>URIComponentBuilder</code> &#xC758; &#xACB0;&#xACFC;&#xB97C; <code>toUriString()</code> &#xD560; &#xB54C;&#xB97C; &#xCC3E;&#xC544;&#xBCF4;&#xBA74; &#xB2E4;&#xC74C;&#xC744; &#xD638;&#xCD9C;&#xD55C;&#xB2E4;.</p><pre><code class="language-java"> this.build().encode().toUriString() 
</code></pre><p><code>encode()</code> &#xACFC;&#xC815;&#xC5D0;&#xC11C; &#xAE30;&#xC874;&#xC758; encoded &#xB41C; key &#xB97C; &#xB2E4;&#xC2DC; encode &#xD558;&#xACE0; &#xC788;&#xACE0; <code>%</code> &#xB97C; &#xB2E4;&#xC2DC; &#xC778;&#xCF54;&#xB529;&#xD558;&#xC5EC; &#xBB38;&#xC81C;&#xAC00; &#xC0DD;&#xAE34;&#xB2E4;.</p><h3 id="decoded-key%EB%A1%9C-%EB%B3%80%EA%B2%BD">Decoded Key&#xB85C; &#xBCC0;&#xACBD;</h3><p>&#xADF8;&#xB7EC;&#xBA74; encoding &#xC774;&#xC804;&#xC758; key&#xB85C; &#xBCC0;&#xACBD;&#xD558;&#xACE0; &#xC804;&#xB2EC;&#xD558;&#xBA74; &#xD574;&#xACB0;&#xB418;&#xC9C0; &#xC54A;&#xC744;&#xAE4C;</p><pre><code class="language-java">final String url = &quot;&lt;https://apis.data.go.kr/6410000/busrouteservice/getBusRouteInfoItem&gt;&quot;;
final String decodedKey = &quot;QIMPxKy+/lt~~~~~==&quot;;
final var uri = UriComponentsBuilder.fromUriString(url)
	.queryParam(&quot;serviceKey&quot;, decodedKey)
	.queryParam(&quot;routeId&quot;, &quot;234000031&quot;)
	.toUriString();
// 	OpenAPI &#xD638;&#xCD9C;
ResponseEntity&lt;String&gt; response = restTemplate.getForEntity(uri, String.class);
</code></pre><p>&#xC5EC;&#xC804;&#xD788; &#xAC19;&#xC740; &#xC624;&#xB958;&#xB97C; &#xBC1B;&#xC558;&#xC73C;&#xBA70;, <code>QIMPxKy+/lt~~~~~%3D%3D</code> &#xB77C;&#xACE0; encode &#xB41C; &#xAC83;&#xC744; &#xD655;&#xC778;&#xD588;&#xB2E4;.</p><p><code>=</code> &#xC758; &#xACBD;&#xC6B0; &#xC815;&#xC0C1;&#xC801;&#xC73C;&#xB85C; encode &#xB418;&#xC5B4; <code>%3D</code> &#xB85C; &#xC778;&#xCF54;&#xB529;&#xB418;&#xC5C8;&#xC73C;&#xB098;, <code>+</code> &#xC640; <code>/</code> &#xC758; &#xACBD;&#xC6B0; &#xC778;&#xCF54;&#xB529;&#xB418;&#xC9C0; &#xC54A;&#xC740; &#xAC83;.</p><p><a href="https://stackoverflow.com/questions/18138011/url-encoding-using-the-new-spring-uricomponentsbuilder">https://stackoverflow.com/questions/18138011/url-encoding-using-the-new-spring-uricomponentsbuilder</a></p><p><code>UriComponentBuilder</code> &#xB97C; &#xD1B5;&#xD574;&#xC11C;&#xB294; &#xC815;&#xC0C1;&#xC801;&#xC73C;&#xB85C; Request &#xAC00; &#xBD88;&#xAC00;&#xD55C; &#xC0C1;&#xD669;&#xC774;&#xB2E4;.</p><h3 id="string-%ED%95%A9%EC%B9%98%EA%B8%B0">String &#xD569;&#xCE58;&#xAE30;</h3><pre><code class="language-java">final String uri = url + &quot;?serviceKey=&quot; + encodedKey + &quot;&amp;routeId=&quot; + routeId;
</code></pre><p>&#xC774;&#xBC88;&#xC5D0;&#xB294; String &#xC5D0;&#xC11C; &#xD569;&#xCE58;&#xAE30;&#xB9CC; &#xD588;&#xB2E4;. &#xADF8;&#xB7EC;&#xB098; &#xC5EC;&#xC804;&#xD788; Response &#xB294; &#xAC19;&#xB2E4;. (&#xB300;&#xCCB4; &#xC65C;?)</p><h3 id="browser-%EC%97%90%EC%84%9C%EB%8A%94-%EC%A0%95%EC%83%81%EC%9D%B8-%EB%A7%81%ED%81%AC%EB%A1%9C-%EB%B0%94%EB%A1%9C-%EB%B3%B4%EB%82%B4%EA%B8%B0">Browser &#xC5D0;&#xC11C;&#xB294; &#xC815;&#xC0C1;&#xC778; &#xB9C1;&#xD06C;&#xB85C; &#xBC14;&#xB85C; &#xBCF4;&#xB0B4;&#xAE30;</h3><pre><code class="language-java">final String uri = &quot;&lt;https://apis.data.go.kr/6410000/busrouteservice/getBusRouteInfoItem?serviceKey={KEY}&amp;routeId=234000031&gt;&quot;;
</code></pre><p>Browser &#xC5D0;&#xC11C;&#xB294; &#xC544;&#xBB34;&#xB7F0; &#xBB38;&#xC81C;&#xAC00; &#xC5C6;&#xB294; &#xB9C1;&#xD06C;&#xB85C;&#xB3C4; &#xC804;&#xC1A1;&#xD574;&#xBCF4;&#xC558;&#xB2E4;. &#xBD84;&#xBA85; &#xC131;&#xACF5;&#xD574;&#xC57C;&#xD558;&#xB294;&#xB370;, &#xC5EC;&#xC804;&#xD788; Response &#xB294; &#xAC19;&#xB2E4;.</p><p>&#xB2F5;&#xB2F5;&#xD574;&#xC11C; wireshark &#xB85C; &#xAE4C;&#xBD24;&#xB2E4;.</p><div class="kg-card kg-toggle-card" data-kg-toggle-state="close">
            <div class="kg-toggle-heading">
                <h4 class="kg-toggle-heading-text"><span style="white-space: pre-wrap;">wireshark &#xC0BD;&#xC9C8;</span></h4>
                <button class="kg-toggle-card-icon" aria-label="Expand toggle to read content">
                    <svg id="Regular" xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24">
                        <path class="cls-1" d="M23.25,7.311,12.53,18.03a.749.749,0,0,1-1.06,0L.75,7.311"/>
                    </svg>
                </button>
            </div>
            <div class="kg-toggle-content"><p><span style="white-space: pre-wrap;">private relay &#xAC00; &#xCF1C;&#xC838;&#xC788;&#xB294;&#xC9C0; &#xAF2D; &#xD655;&#xC778;&#xD558;&#xC790;. &#xBAA8;&#xB4E0; &#xD328;&#xD0B7;&#xC774; private relay &#xB97C; &#xD1B5;&#xD558;&#xAE30;&#xC5D0; wireshark &#xC5D0;&#xC11C; &#xBCFC; &#xB54C;&#xB294; &#xB2E4; &#xC554;&#xD638;&#xD654;&#xAC00; &#xB418;&#xC5B4; &#xC788;&#xB2E4;.</span><br><span style="white-space: pre-wrap;">&#xC774; &#xB54C;&#xBB38;&#xC5D0; HTTP &#xD328;&#xD0B7;&#xC744; &#xBCFC; &#xC218; &#xAC00; &#xC5C6;&#xC5C8;&#xB2E4;. </span></p></div>
        </div><p>Wireshark &#xC5D0;&#xC11C; &#xD655;&#xC778;&#xD574;&#xBCF4;&#xB2C8; &#xB610; &#xB2E4;&#xC2DC; encoding &#xACFC;&#xC815;&#xC744; &#xAC70;&#xCE5C; &#xAC12;&#xC73C;&#xB85C; &#xC2E4;&#xC81C; &#xB9AC;&#xD018;&#xC2A4;&#xD2B8;&#xAC00; &#xAC14;&#xC74C;&#xC744; &#xD655;&#xC778;&#xD588;&#xB2E4;.</p><p>Debugger &#xC5D0;&#xC11C; URI &#xAC12;&#xC744; &#xD655;&#xC778;&#xD588;&#xC744; &#xB54C;&#xB294; &#xC815;&#xC0C1;&#xC801;&#xC73C;&#xB85C; parameter&#xAC00; &#xB118;&#xC5B4;&#xAC14;&#xB2E4;. &#xADF8;&#xB7EC;&#xB098;, &#xACB0;&#xAD6D; &#xC2E4;&#xC81C; request  &#xB85C; &#xB0A0;&#xB77C;&#xAC08; &#xB54C;&#xB294; &#xB610; &#xC778;&#xCF54;&#xB529;&#xC774; &#xB41C; &#xC0C1;&#xD0DC;&#xB85C; &#xB118;&#xC5B4;&#xAC04;&#xB2E4;. &#xC989;,  parameter &#xC0C1;&#xC5D0;&#xC11C; URLEncoded &#xB41C; URI &#xB97C; &#xB118;&#xACA8;&#xB3C4; &#xB610; &#xB2E4;&#xC2DC; <code>RestTemplate</code> &#xC758; &#xC694;&#xCCAD; &#xACFC;&#xC815; &#xC5B4;&#xB514;&#xC5D0;&#xC120;&#xAC00; Encoding &#xC744; &#xD55C;&#xB2E4;.</p><h3 id="%EB%B2%94%EC%9D%B8%EC%B0%BE%EA%B8%B0resttemplate">&#xBC94;&#xC778;&#xCC3E;&#xAE30; - RestTemplate</h3><figure class="kg-card kg-image-card"><img src="https://life.photogrammer.me/content/images/2024/07/image-12.png" class="kg-image" alt="&#xACF5;&#xACF5; &#xB370;&#xC774;&#xD130; Open API &#xC0BD;&#xC9C8;&#xAE30;" loading="lazy" width="2000" height="150" srcset="https://life.photogrammer.me/content/images/size/w600/2024/07/image-12.png 600w, https://life.photogrammer.me/content/images/size/w1000/2024/07/image-12.png 1000w, https://life.photogrammer.me/content/images/size/w1600/2024/07/image-12.png 1600w, https://life.photogrammer.me/content/images/2024/07/image-12.png 2000w" sizes="(min-width: 720px) 720px"></figure><p><code>RestTemplate</code> &#xC758; &#xACFC;&#xC815;&#xC744; &#xC0B4;&#xD3B4;&#xBCF4;&#xBA74; &#xACB0;&#xAD6D; URL &#xB300;&#xC0C1;&#xC73C;&#xB85C; &#xC694;&#xCCAD;&#xC744; <code>execute</code> &#xD558;&#xB294; &#xBD80;&#xBD84;&#xC774; &#xC788;&#xB2E4;. &#xC774; &#xBD80;&#xBD84;&#xC5D0;&#xC11C; URL &#xB85C; &#xB2E4;&#xC2DC; &#xBC14;&#xAFD4;&#xC11C; &#xC694;&#xCCAD;&#xC744; &#xC2E4;&#xD589;&#xD558;&#xB294;&#xB370; &#xC774; &#xBD80;&#xBD84;&#xC774; &#xBB38;&#xC81C;&#xB2E4;.</p><p>&#xBD88;&#xD589;&#xD558;&#xAC8C;&#xB3C4; &#xC704;&#xC5D0;&#xC11C;&#xC640; &#xAC19;&#xC740; &#xC774;&#xC720;&#xB85C; decoded &#xB41C; key &#xB97C; &#xB118;&#xAE30;&#xB354;&#xB77C;&#xB3C4; <code>+</code> &#xC640; &#xAC19;&#xC740; &#xBB38;&#xC790;&#xC5F4;&#xC774; &#xC778;&#xCF54;&#xB529;&#xB418;&#xC9C0; &#xC54A;&#xC544; &#xC815;&#xD655;&#xD55C; key &#xB97C; &#xBCF4;&#xB0BC; &#xC218; &#xC5C6;&#xB2E4;.</p><p>&#xB530;&#xB77C;&#xC11C;,  &#xD574;&#xB2F9; &#xACFC;&#xC815;&#xC744; &#xD53C;&#xD558;&#xB294; &#xBC29;&#xBC95;&#xC744; &#xB5A0;&#xC62C;&#xB824;&#xC57C;&#xD55C;&#xB2E4;.</p><h2 id="%ED%95%B4%EA%B2%B0-%EB%B0%A9%EC%95%88">&#xD574;&#xACB0; &#xBC29;&#xC548;</h2><pre><code class="language-java">final URI uri = URI.create(uriString);</code></pre><p>&#xB531; &#xC774; &#xD55C; &#xC904;&#xB9CC; &#xCD94;&#xAC00;&#xD558;&#xBA74; &#xB41C;&#xB2E4;... </p><p><code>URIComponentBuilder</code> &#xBD80;&#xBD84;&#xC5D0;&#xC11C; encoding &#xD558;&#xB294; &#xBB38;&#xC81C;&#xC758; &#xACBD;&#xC6B0;&#xC5D0;&#xB3C4; &#xD574;&#xACB0;&#xD560; &#xC218; &#xC788;&#xB2E4;. &#xB2E4;&#xC74C;&#xACFC; &#xAC19;&#xC774; &#xC791;&#xC131;&#xD574;&#xBCF4;&#xC790;.</p><pre><code class="language-Java">final var builder = new DefaultUriBuilderFactory();
builder.setEncodingMode(DefaultUriBuilderFactory.EncodingMode.NONE);

final String uriString = builder.builder()
    .scheme(&quot;http&quot;)
    .host(&quot;apis.data.go.kr&quot;)
    .path(&quot;/6410000/busrouteservice/getBusRouteInfoItem&quot;)
    .queryParam(&quot;serviceKey&quot;, encodedKey)
    .queryParam(&quot;routeId&quot;, routeId)
    .build()
    .toString();
final URI uri = URI.create(uriString);</code></pre><hr><p>&#xC0AC;&#xC2E4; &#xC544;&#xB798; &#xAE00;&#xC5D0;&#xC11C; &#xCC98;&#xC74C;&#xC5D0; &#xCC3E;&#xAE34; &#xD588;&#xB294;&#xB370;, &#xC5B4;&#xB514;&#xC11C; &#xBB38;&#xC81C;&#xB97C; &#xBC1C;&#xC0DD;&#xC2DC;&#xD0A4;&#xB294;&#xC9C0; &#xB2F9;&#xCD5C; &#xD30C;&#xC545;&#xC774; &#xC548;&#xB3FC;&#xC11C; &#xC5F4;&#xC2EC;&#xD788; &#xD30C;&#xBD24;&#xB2E4;. &#xC4F8; &#xB54C;&#xB9C8;&#xB2E4; &#xB298; &#xC5FC;&#xB450;&#xC5D0; &#xB458; &#xBD80;&#xBD84;&#xC778; &#xAC83; &#xAC19;&#xC544; &#xAE00;&#xB85C; &#xAE30;&#xB85D;&#xD574;&#xB454;&#xB2E4;.</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://velog.io/@cco2416/%EC%A1%B8%EC%97%85%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8%EA%B3%B5%EA%B3%B5%EB%8D%B0%EC%9D%B4%ED%84%B0-%ED%8F%AC%ED%84%B8-service-key-is-not-registered-error-%ED%95%B4%EA%B2%B0-%EB%B0%A9%EB%B2%95"><div class="kg-bookmark-content"><div class="kg-bookmark-title">[&#xC878;&#xC5C5;&#xD504;&#xB85C;&#xC81D;&#xD2B8;]&#xACF5;&#xACF5;&#xB370;&#xC774;&#xD130; &#xD3EC;&#xD138; service key is not registered error &#xD574;&#xACB0; &#xBC29;&#xBC95;</div><div class="kg-bookmark-description">&#xACF5;&#xACF5;&#xB370;&#xC774;&#xD130; &#xD3EC;&#xD138;&#xC758; API&#xB97C; &#xC878;&#xC5C5;&#xD504;&#xB85C;&#xC81D;&#xD2B8;&#xB97C; &#xC9C4;&#xD589;&#xD558;&#xBA74;&#xC11C; &#xC0AC;&#xC6A9;&#xD558;&#xAC8C; &#xB418;&#xC5C8;&#xB294;&#xB370;, &#xC774; &#xACFC;&#xC815;&#xC5D0;&#xC11C; &#x201C;service key is not registered error&#x201D;&#xB97C; &#xB9CC;&#xB098;&#xAC8C; &#xB418;&#xC5C8;&#xB2E4;. &#xC774; &#xC624;&#xB958;&#xB97C; &#xD574;&#xACB0;&#xD558;&#xAE30; &#xC704;&#xD55C; &#xACFC;&#xC815;&#xC774; &#xC801;&#xD600;&#xC788;&#xB2E4;.</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://static.velog.io/favicons/apple-icon-152x152.png" alt="&#xACF5;&#xACF5; &#xB370;&#xC774;&#xD130; Open API &#xC0BD;&#xC9C8;&#xAE30;"></div></div><div class="kg-bookmark-thumbnail"><img src="https://images.velog.io/velog.png" alt="&#xACF5;&#xACF5; &#xB370;&#xC774;&#xD130; Open API &#xC0BD;&#xC9C8;&#xAE30;"></div></a></figure>]]></content:encoded></item><item><title><![CDATA[Grass miner 만들기]]></title><description><![CDATA[Grass 코인을 서버에서 항시 채굴해보자]]></description><link>https://life.photogrammer.me/make-grass-miner/</link><guid isPermaLink="false">6688ed5a031eef000101841d</guid><dc:creator><![CDATA[Sungjun Park]]></dc:creator><pubDate>Sat, 06 Jul 2024 08:23:51 GMT</pubDate><media:content url="https://life.photogrammer.me/content/images/2024/07/SC-2024-07-05-at-12.42.23-PM.jpg" medium="image"/><content:encoded><![CDATA[<img src="https://life.photogrammer.me/content/images/2024/07/SC-2024-07-05-at-12.42.23-PM.jpg" alt="Grass miner &#xB9CC;&#xB4E4;&#xAE30;"><p></p><h2 id="grass">Grass</h2><p>&#xC57D; 3&#xB2EC; &#xC804;&#xCBE4; &#xC720;&#xD29C;&#xBE0C;&#xB97C; &#xBCF4;&#xB2E4;&#xAC00; &#xC6B0;&#xC5F0;&#xD788; &#xBC1C;&#xACAC;&#xD55C; &#xCF54;&#xC778;&#xC774;&#xB2E4;. &#xB0B4; &#xB124;&#xD2B8;&#xC6CC;&#xD06C; &#xB300;&#xC5ED;&#xD3ED;&#xC744; &#xC81C;&#xACF5;&#xD558;&#xACE0; &#xADF8; &#xB313;&#xAC00;&#xB85C; &#xD574;&#xB2F9; &#xCF54;&#xC778;&#xC744; &#xC9C0;&#xAE09;&#xD574;&#xC8FC;&#xB294; &#xAC1C;&#xB150;&#xC774;&#xB2E4;. (AI &#xD559;&#xC2B5;&#xC744; &#xC704;&#xD55C; &#xB370;&#xC774;&#xD130; &#xD68D;&#xB4DD;&#xC744; &#xC704;&#xD568;&#xC774;&#xB77C;&#xB098;...) &#xB54C;&#xBB38;&#xC5D0; &#xCEF4;&#xD4E8;&#xD305; &#xD30C;&#xC6CC;&#xB97C; &#xBB34;&#xC9C0;&#xB9C9;&#xC9C0;&#xD558;&#xAC8C; &#xD65C;&#xC6A9;&#xD574;&#xC57C;&#xD558;&#xB294; &#xB2E4;&#xB978; &#xCF54;&#xC778;&#xBCF4;&#xB2E4; &#xC190;&#xC27D;&#xAC8C; &#xCC44;&#xAD74;&#xD560; &#xC218; &#xC788;&#xB2E4;.</p><p> &#xB098;&#xB984; &#xBC29;&#xC2DD;&#xB3C4; &#xAC04;&#xB2E8;&#xD560; &#xBFD0;&#xB354;&#xB7EC; &#xC544;&#xC9C1; &#xD65C;&#xC131;&#xD654;&#xAC00; &#xB418;&#xC9C0; &#xC54A;&#xC544; &#xC2E4;&#xC81C;&#xB85C; &#xD2B8;&#xB798;&#xD53D;&#xC744; &#xC7A1;&#xC544;&#xBA39;&#xC9C0; &#xC54A;&#xC558;&#xB2E4;. &#xCC44;&#xAD74; &#xBCF4;&#xC0C1;&#xC740; &#xB300;&#xB7B5; 3 &#xB9CC;&#xC6D0; / ip &#xC815;&#xB3C4;&#xB85C; &#xC7A1;&#xACE0; &#xC788;&#xC5B4;, &#xD648; &#xC11C;&#xBC84;&#xAC00; &#xAD74;&#xB7EC;&#xAC00;&#xB294;&#xB370; &#xC18C;&#xC694;&#xB418;&#xB294; &#xC804;&#xAE30;&#xC138;&#xB97C; &#xC190;&#xC27D;&#xAC8C; &#xC5BB;&#xC5B4;&#xB0BC; &#xC218; &#xC788;&#xB2E4;&#xACE0; &#xC0DD;&#xAC01;&#xC774; &#xB4E4;&#xC5C8;&#xB2E4;.</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://app.getgrass.io/register/?referralCode=J_HeStgq_HJd8pX"><div class="kg-bookmark-content"><div class="kg-bookmark-title">Grass: Earn a Stake in the AI Revolution</div><div class="kg-bookmark-description">Grass is the easiest way to participate in the growth of AI. Join 2,000,000+ users securely monetizing their internet resources.</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://app.getgrass.io/favicon.png" alt="Grass miner &#xB9CC;&#xB4E4;&#xAE30;"><span class="kg-bookmark-author">Grass</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://app.getgrass.io/images/seo-dashboard.png" alt="Grass miner &#xB9CC;&#xB4E4;&#xAE30;"></div></a></figure><h3 id="%EC%9E%91%EB%8F%99-%EB%B0%A9%EC%8B%9D">&#xC791;&#xB3D9; &#xBC29;&#xC2DD;</h3><p>Grass &#xC758; &#xCC44;&#xAD74;&#xBC29;&#xC2DD;&#xC740; &#xAC04;&#xB2E8;&#xD558;&#xB2E4;. &#xADF8;&#xB0E5; Chrome extension &#xC744; &#xC124;&#xCE58;&#xD558;&#xACE0; &#xB85C;&#xADF8;&#xC778;&#xD558;&#xBA74; &#xD130;&#xB110;&#xC774; &#xD615;&#xC131;&#xB418;&#xC5B4; &#xB0B4; &#xB514;&#xBC14;&#xC774;&#xC2A4;&#xC758; &#xB124;&#xD2B8;&#xC6CC;&#xD06C;&#xB97C; &#xD1B5;&#xD574;&#xC11C; &#xB370;&#xC774;&#xD130;&#xB97C; &#xD68D;&#xB4DD;&#xD560; &#xC218; &#xC788;&#xB2E4;. </p><h2 id="miner-%EB%A7%8C%EB%93%A4%EA%B8%B0">Miner &#xB9CC;&#xB4E4;&#xAE30;</h2><p>&#xC0AC;&#xC2E4; &#xAE30;&#xC874;&#xC5D0; Grass miner &#xB85C; &#xC81C;&#xACF5;&#xB41C; &#xCF54;&#xB4DC;&#xB4E4;&#xC774; github &#xC5D0; &#xC788;&#xC5C8;&#xB2E4;. &#xB530;&#xB85C; &#xAC1C;&#xBC1C;&#xD558;&#xAE30;&#xB294; &#xADC0;&#xCC2E;&#xC544;&#xC11C; &#xD574;&#xB2F9; &#xD504;&#xB85C;&#xADF8;&#xB7A8;&#xC744; &#xC0AC;&#xC6A9;&#xD574;&#xC11C; &#xCC44;&#xAD74;&#xC744; &#xD588;&#xB2E4;. Chrome extension &#xC744; &#xD1B5;&#xD574;&#xC11C;&#xB9CC; &#xCC44;&#xAD74;&#xC774; &#xAC00;&#xB2A5;&#xD558;&#xAE30; &#xB54C;&#xBB38;&#xC5D0; &#xB300;&#xBD80;&#xBD84;&#xC758; &#xCC44;&#xAD74; &#xD504;&#xB85C;&#xADF8;&#xB7A8;&#xC740; &#xB2E4; webdriver &#xB97C; load &#xD558;&#xACE0; crx &#xD30C;&#xC77C;&#xC744; &#xD1B5;&#xD574;&#xC11C; &#xD655;&#xC7A5; &#xD504;&#xB85C;&#xADF8;&#xB7A8;&#xC744; &#xB85C;&#xB4DC;&#xD558;&#xBA70;, &#xC811;&#xC18D;&#xC744; &#xD655;&#xC778;&#xD558;&#xB294; &#xC815;&#xB3C4;&#xB85C; &#xC791;&#xB3D9;&#xD55C;&#xB2E4;.</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://github.com/kgregor98/grass"><div class="kg-bookmark-content"><div class="kg-bookmark-title">GitHub - kgregor98/grass: A Docker Image for getgrass.io</div><div class="kg-bookmark-description">A Docker Image for getgrass.io. Contribute to kgregor98/grass development by creating an account on GitHub.</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://github.githubassets.com/assets/pinned-octocat-093da3e6fa40.svg" alt="Grass miner &#xB9CC;&#xB4E4;&#xAE30;"><span class="kg-bookmark-author">GitHub</span><span class="kg-bookmark-publisher">kgregor98</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://opengraph.githubassets.com/43abaee8861ac6855c1898e60241195ae36030a8ccfc81cfbbe45a087f90306e/kgregor98/grass" alt="Grass miner &#xB9CC;&#xB4E4;&#xAE30;"></div></a></figure><p>&#xADF8;&#xB7F0;&#xB370; &#xC774;&#xBC88;&#xC5D0; &#xD655;&#xC7A5; &#xD504;&#xB85C;&#xADF8;&#xB7A8;&#xC758; &#xC0C8; &#xBC84;&#xC804;&#xC744; &#xCD9C;&#xC2DC;&#xD558;&#xBA70; 1.25x &#xC758; &#xBCF4;&#xC0C1;&#xC744; &#xC8FC;&#xC5C8;&#xACE0;, &#xAE30;&#xC874;&#xC758; &#xD504;&#xB85C;&#xADF8;&#xB7A8;&#xC758; &#xACBD;&#xC6B0; &#xC81C;&#xB300;&#xB85C; &#xB300;&#xC751;&#xC774; &#xB418;&#xC9C0; &#xC54A;&#xC558;&#xB2E4;. &#xCF54;&#xB4DC;&#xB97C; &#xC870;&#xAE08; &#xBCC0;&#xACBD;&#xD558;&#xBA74; &#xB418;&#xAE30;&#xB294; &#xD558;&#xB294;&#xB370;, &#xB2E8;&#xC21C;&#xD55C; &#xC791;&#xC5C5;&#xC778;&#xC9C0;&#xB77C; &#xCF54;&#xB4DC;&#xAC00; &#xAD49;&#xC7A5;&#xD788; &#xC9C0;&#xC800;&#xBD84;&#xD588;&#xB2E4;. </p><p>&#xB610;&#xD55C; &#xC774;&#xBC88;&#xC5D0; &#xBAA8;&#xB2C8;&#xD130;&#xB9C1;&#xC744; &#xC62E;&#xAE30;&#xBA74;&#xC11C; Grass &#xAC00; &#xC81C;&#xB300;&#xB85C; &#xCC44;&#xAD74;&#xB418;&#xACE0; &#xC788;&#xB294;&#xC9C0;&#xC5D0; &#xB300;&#xD574;&#xC11C;&#xB3C4; &#xC815;&#xBCF4;&#xB97C; &#xBC1B;&#xC544;&#xC640;&#xBCF4;&#xACE0; &#xC2F6;&#xC5C8;&#xB2E4;. &#xADF8;&#xB798;&#xC11C; &#xADF8;&#xB0E5; &#xCDE8;&#xBBF8;&#xACB8; &#xD55C;&#xBC88; &#xB9CC;&#xB4E4;&#xC5B4;&#xBCF4;&#xAE30;&#xB85C; &#xD588;&#xB2E4;.</p><h3 id="%EA%B5%AC%EC%83%81">&#xAD6C;&#xC0C1;</h3><p>Grass &#xC758; &#xACBD;&#xC6B0; &#xC774;&#xB807;&#xAC8C; &#xB530;&#xB85C; &#xC62C;&#xB824;&#xC11C; &#xCC44;&#xAD74;&#xD558;&#xB294; &#xBC29;&#xC2DD;&#xC740; &#xB2E4; &#xB3D9;&#xC77C;&#xD560; &#xC218; &#xBC16;&#xC5D0; &#xC5C6;&#xB2E4;. &#xB2E8;&#xC21C;&#xD788; &#xC5B4;&#xB5A4; &#xC5B8;&#xC5B4;&#xB85C; &#xC791;&#xC131;&#xD558;&#xB0D0;&#xC758; &#xCC28;&#xC774; &#xC815;&#xB3C4;&#xC774;&#xB2E4;.  &#xB2E4;&#xB9CC;, &#xC774;&#xBC88;&#xC5D0; Prometheus &#xB97C; &#xD1B5;&#xD55C; &#xBAA8;&#xB2C8;&#xD130;&#xB9C1;&#xC774; &#xAC00;&#xB2A5;&#xD558;&#xB3C4;&#xB85D; &#xD558;&#xB294; &#xAE30;&#xB2A5;&#xC744; &#xCD94;&#xAC00;&#xD560; &#xAC83;&#xC774;&#xBA70;, &#xCD94;&#xD6C4;&#xC5D0; &#xBCC0;&#xACBD;&#xC0AC;&#xD56D;&#xC774; &#xC788;&#xC744; &#xB54C; &#xC870;&#xAE08; &#xB354; &#xD3B8;&#xB9AC;&#xD558;&#xAC8C; &#xCF54;&#xB4DC;&#xB97C; &#xACE0;&#xCE58;&#xACE0;&#xC790; &#xAE54;&#xB054;&#xD558;&#xAC8C; &#xB9AC;&#xD329;&#xD1A0;&#xB9C1;&#xD558;&#xB294; &#xACFC;&#xC815;&#xC774; &#xB420; &#xAC83;&#xC774;&#xB2E4;.</p><p>&#xB300;&#xB7B5; &#xC815;&#xB9AC;&#xD558;&#xBA74; &#xC774;&#xB807;&#xAC8C; &#xAD6C;&#xC131;&#xD574;&#xC11C; &#xD504;&#xB85C;&#xADF8;&#xB7A8;&#xC744; &#xB9CC;&#xB4E4; &#xC218; &#xC788;&#xB2E4;.</p><ul><li>Chrome webdriver &#xB97C; &#xD1B5;&#xD574; &#xD655;&#xC7A5; &#xD504;&#xB85C;&#xADF8;&#xB7A8;&#xC744; &#xB85C;&#xB4DC;</li><li>Selenium &#xC744; &#xD1B5;&#xD574;&#xC11C; &#xB85C;&#xADF8;&#xC778; / &#xC815;&#xBCF4;&#xD68D;&#xB4DD; &#xC790;&#xB3D9;&#xD654;</li><li>FastAPI + Prometheus Client &#xB97C; &#xD1B5;&#xD574;&#xC11C; Prometheus metric &#xC81C;&#xACF5;</li></ul><h3 id="%EB%A6%AC%ED%8C%A9%ED%86%A0%EB%A7%81%ED%95%98%EA%B8%B0">&#xB9AC;&#xD329;&#xD1A0;&#xB9C1;&#xD558;&#xAE30;</h3><p>&#xC704; &#xB808;&#xD3EC;&#xC5D0; &#xC788;&#xB294; &#xCF54;&#xB4DC;&#xC758; &#xACBD;&#xC6B0;, <code>main.py</code> &#xC5D0; &#xB2E4; &#xB54C;&#xB824;&#xBC15;&#xC740; &#xD615;&#xD0DC;&#xC774;&#xB2E4;. &#xCF54;&#xB4DC;&#xB97C; &#xBCC0;&#xACBD;&#xD560; &#xC218;&#xB294; &#xC788;&#xC5C8;&#xC9C0;&#xB9CC; &#xB108;&#xBB34; &#xB354;&#xB7EC;&#xC6CC;&#xC11C; &#xC218;&#xC815;&#xD560; &#xB54C; &#xADC0;&#xCC2E;&#xC74C;&#xC774; &#xC788;&#xC5C8;&#xB2E4;. &#xADF8;&#xB798;&#xC11C; &#xAE30;&#xB2A5;&#xC801;&#xC73C;&#xB85C; &#xBAA8;&#xB4C8;&#xB85C; &#xBD84;&#xB9AC;&#xD574;&#xBCF4;&#xACE0;&#xC790; &#xD588;&#xB2E4;. &#xC704; &#xCF54;&#xB4DC;&#xB97C; &#xBCF4;&#xBA74; &#xB2E4;&#xC74C;&#xACFC; &#xAC19;&#xC774; &#xC6C0;&#xC9C1;&#xC778;&#xB2E4;.</p><ol><li>&#xD658;&#xACBD; &#xBCC0;&#xC218;&#xB85C;&#xBD80;&#xD130; &#xC720;&#xC800; &#xB85C;&#xADF8;&#xC778; &#xC815;&#xBCF4;&#xB97C; &#xD68D;&#xB4DD;&#xD55C;&#xB2E4;.</li><li>&#xD655;&#xC7A5; &#xD504;&#xB85C;&#xADF8;&#xB7A8;&#xC744; &#xB2E4;&#xC6B4;&#xBC1B;&#xB294;&#xB2E4;.</li><li>Chrome webdriver &#xB97C; &#xD655;&#xC7A5; &#xD504;&#xB85C;&#xADF8;&#xB7A8;&#xACFC; &#xD568;&#xAED8; &#xB85C;&#xB4DC;&#xD55C;&#xB2E4;.</li><li>webdriver &#xB97C; &#xD1B5;&#xD574;&#xC11C; &#xB85C;&#xADF8;&#xC778;&#xD55C;&#xB2E4;.</li><li>webdriver &#xB97C; &#xD1B5;&#xD574;&#xC11C; &#xC5F0;&#xACB0; &#xC0C1;&#xD0DC;&#xB97C; &#xAC80;&#xC99D;&#xD55C;&#xB2E4;.</li><li>&#xC5F0;&#xACB0; &#xC0C1;&#xD0DC;&#xB97C; api &#xB97C; &#xD1B5;&#xD574;&#xC11C; &#xBC1B;&#xC544;&#xC624;&#xAE30; &#xC704;&#xD574; Flask &#xB97C; &#xC2DC;&#xC791;&#xD55C;&#xB2E4;.</li></ol><p>&#xC774;&#xB97C; &#xAC01;&#xAC01; &#xAE30;&#xB2A5;&#xC801;&#xC73C;&#xB85C; &#xB098;&#xB220;&#xC11C; &#xC0DD;&#xAC01;&#xD574;&#xBD24;&#xB2E4;.</p><ul><li>&#xD658;&#xACBD;&#xBCC0;&#xC218;&#xB97C; &#xB85C;&#xB4DC;&#xD558;&#xB294; &#xAE30;&#xB2A5;</li><li>&#xD655;&#xC7A5; &#xD504;&#xB85C;&#xADF8;&#xB7A8;&#xC744; &#xAC00;&#xC838;&#xC624;&#xB294; &#xAE30;&#xB2A5;</li><li>webdriver &#xB97C; &#xB85C;&#xB4DC;&#xD558;&#xB294; &#xAE30;&#xB2A5;</li><li>grass &#xD398;&#xC774;&#xC9C0; &#xB0B4;&#xC5D0;&#xC11C; &#xC791;&#xC5C5;&#xC744; &#xD558;&#xAE30; &#xC704;&#xD574; webdriver &#xB97C; &#xC870;&#xC791;&#xD558;&#xB294; &#xAE30;&#xB2A5;</li><li>API</li></ul><p>&#xADF8;&#xB7F0;&#xB370;, &#xC774; &#xC911;&#xC5D0;&#xC11C; &#xD655;&#xC7A5; &#xD504;&#xB85C;&#xADF8;&#xB7A8;&#xC744; &#xB2E4;&#xC6B4;&#xBC1B;&#xB294; &#xAE30;&#xB2A5;&#xC740; &#xC81C;&#xC678;&#xD588;&#xB2E4;. &#xAD73;&#xC774; URL &#xB85C; &#xBC1B;&#xC544;&#xC62C; &#xC774;&#xC720;&#xAC00; &#xB531;&#xD788; &#xC5C6;&#xB2E4;. &#xBBF8;&#xB9AC; local &#xC5D0; &#xBC1B;&#xC544;&#xB450;&#xACE0; &#xC774;&#xB97C; &#xADF8;&#xB0E5; &#xBC14;&#xB85C; &#xC8FC;&#xC785;&#xD558;&#xB294; &#xD3B8;&#xC774; &#xB098;&#xC558;&#xB2E4;.    &#xACB0;&#xACFC;&#xC801;&#xC73C;&#xB85C; &#xB2E4;&#xC74C;&#xACFC; &#xAC19;&#xC774; &#xB2E4;&#xC2DC; &#xB098;&#xB204;&#xC5C8;&#xB2E4;.</p><ul><li><code>Config</code><ul><li>&#xD658;&#xACBD; &#xBCC0;&#xC218;&#xB97C; &#xAC00;&#xC838;&#xC624;&#xACE0; &#xAD00;&#xB9AC;</li></ul></li><li><code>Util</code><ul><li>&#xD504;&#xB85C;&#xADF8;&#xB7A8; &#xB0B4; &#xAE30;&#xD0C0; &#xC720;&#xD2F8;&#xB9AC;&#xD2F0; &#xAE30;&#xB2A5;</li></ul></li><li><code>GrassHandler</code><ul><li>webdriver &#xB97C; &#xD1B5;&#xD574; app.getgrass.io &#xC5D0;&#xC11C; &#xD578;&#xB4E4;&#xB9C1;&#xD558;&#xB294; &#xAE30;&#xB2A5; &#xC9D1;&#xD569;</li></ul></li><li><code>Grass</code><ul><li>Grass miner &#xB97C; &#xC2DC;&#xC791; / &#xAD00;&#xB9AC; / &#xB370;&#xC774;&#xD130; &#xD68D;&#xB4DD;&#xC744; &#xC704;&#xD574; driver / handler &#xB97C; &#xC81C;&#xACF5;&#xBC1B;&#xC544; &#xC791;&#xB3D9;&#xD558;&#xB294; &#xCD5C;&#xC885; &#xC778;&#xD130;&#xD398;&#xC774;&#xC2A4;</li></ul></li><li><code>API</code><ul><li>FastAPI &#xC758; controller code &#xB4E4;&#xC744; &#xB2F4;&#xC74C;</li></ul></li></ul><p><code>Grass</code> &#xC640; <code>GrassHandler</code> &#xC758; &#xACBD;&#xC6B0; &#xAD73;&#xC774; &#xAD6C;&#xBD84;&#xC744; &#xD55C; &#xC774;&#xC720;&#xB294; &#xBCF5;&#xC7A1;&#xC131; &#xB54C;&#xBB38;&#xC774;&#xC5C8;&#xB2E4;. &#xD504;&#xB85C;&#xADF8;&#xB7A8; &#xD2B9;&#xC131;&#xC0C1; <code>webdriver</code> &#xB97C; &#xBCC0;&#xACBD;&#xD558;&#xAC70;&#xB098; <code>handler</code> &#xB97C; &#xBCC0;&#xACBD;&#xD560; &#xC774;&#xC720;&#xB294; &#xC798; &#xC5C6;&#xAE30;&#xC5D0; <code>GrassHandler</code> &#xCF54;&#xB4DC;&#xC640; &#xD1B5;&#xD569;&#xB418;&#xC5B4; &#xC791;&#xC131;&#xD574;&#xB3C4; &#xBCC4; &#xBB38;&#xC81C;&#xB294; &#xC5C6;&#xB2E4;. &#xB2E4;&#xB9CC;, &#xC774;&#xB807;&#xAC8C; &#xB54C;&#xB824;&#xBC15;&#xC544;&#xBC84;&#xB9AC;&#xB2C8; &#xAE30;&#xC874;&#xC758; &#xCF54;&#xB4DC;&#xC640; &#xB2E4;&#xB97C; &#xBC14;&#xAC00; &#xC5C6;&#xC5C8;&#xACE0; &#xAE30;&#xB2A5; &#xAD6C;&#xBD84;&#xC774; &#xB418;&#xC9C0; &#xC54A;&#xC558;&#xB2E4;.</p><p> &#xADF8;&#xB798;&#xC11C; <code>Grass</code> &#xB294; &#xB0B4; &#xD504;&#xB85C;&#xADF8;&#xB7A8; &#xC785;&#xC7A5;&#xC5D0;&#xC11C; &#xD544;&#xC694;&#xD55C; &#xAE30;&#xB2A5;&#xB4E4;&#xC758; &#xC9D1;&#xD569;&#xD55C; &#xC778;&#xD130;&#xD398;&#xC774;&#xC2A4; &#xB290;&#xB08C;&#xC73C;&#xB85C; &#xD65C;&#xC6A9;&#xD558;&#xB3C4;&#xB85D; &#xD588;&#xB2E4;.  <code>GrassHandler</code> &#xC758; &#xACBD;&#xC6B0; <code>webdriver</code> &#xB97C; &#xC870;&#xC791;&#xD558;&#xB294;&#xB370;&#xB9CC; &#xC9D1;&#xC911;&#xD558;&#xB3C4;&#xB85D; &#xD588;&#xB2E4;.  &#xC774;&#xB807;&#xAC8C; &#xCF54;&#xB4DC;&#xB97C; &#xC791;&#xC131;&#xD560; &#xACBD;&#xC6B0; <code>webdriver</code> &#xB97C; &#xB2E4;&#xB978; &#xAC83;&#xC73C;&#xB85C; &#xAD50;&#xCCB4;&#xD558;&#xAC70;&#xB098; <code>webdriver</code> &#xAC00; &#xC544;&#xB2CC; &#xB2E4;&#xB978; &#xBC29;&#xC2DD;&#xC73C;&#xB85C; &#xCC44;&#xAD74;&#xC774; &#xAC00;&#xB2A5;&#xD574;&#xC84C;&#xC744; &#xB54C; <code>handler</code> &#xB9CC; &#xAD50;&#xCCB4;&#xD574;&#xC11C; &#xC0AC;&#xC6A9;&#xD558;&#xBA74; &#xB41C;&#xB2E4;.</p><p><code>Util</code> &#xBD80;&#xBD84;&#xC758; &#xACBD;&#xC6B0; &#xC0AC;&#xC2E4; &#xC560;&#xB9E4;&#xD55C; method &#xB4E4;&#xC758; &#xC9D1;&#xD569;&#xC774;&#xB2E4;. &#xC2DC;&#xAC04;&#xC744; &#xBCC0;&#xD658;&#xD55C;&#xB2E4;&#xAC70;&#xB098;, Chrome driver &#xB97C; &#xD68D;&#xB4DD;&#xD55C;&#xB2E4;&#xAC70;&#xB098; &#xD558;&#xB294; &#xAE30;&#xB2A5;&#xC774;&#xB2E4;. &#xC88B;&#xC740; &#xCF54;&#xB4DC;&#xB77C;&#xACE0;&#xB294; &#xD560; &#xC218; &#xC5C6;&#xACA0;&#xC73C;&#xB098; &#xB530;&#xB85C; &#xB098;&#xB220;&#xB458; &#xACF3;&#xB3C4; &#xB9C8;&#xB545;&#xD558;&#xC9C0; &#xC54A;&#xC544; &#xADF8;&#xB0E5; &#xBB36;&#xC5B4;&#xB480;&#xB2E4;.</p><p>&#xADF8;&#xB300;&#xB85C; &#xB098;&#xB984; &#xB098;&#xB204;&#xACE0; &#xB098;&#xB2C8; &#xCF54;&#xB4DC;&#xB97C; &#xC77D;&#xACE0; &#xC218;&#xC815;&#xD558;&#xB294;&#xB370; &#xAC04;&#xD3B8;&#xD574;&#xC84C;&#xB2E4;. (&#xB098;&#xB9CC; &#xADF8;&#xB7F4;&#xC9C0;&#xB3C4;)</p><h3 id="prometheus-client">Prometheus client</h3><p>Metric&#xC744; &#xBC1B;&#xC544;&#xC640;&#xC11C; Grafana &#xB85C; &#xBCF4;&#xACE0; &#xC2F6;&#xC5C8;&#xB2E4;. &#xBAA8;&#xB2C8;&#xD130;&#xB9C1; &#xC11C;&#xBC84;&#xC758; &#xACBD;&#xC6B0; Prometheus&#xB97C; &#xD1B5;&#xD574; &#xBA54;&#xD2B8;&#xB9AD;&#xC744; &#xBAA8;&#xB450; &#xC218;&#xC9D1;&#xD558;&#xACE0; &#xC788;&#xC5B4;, &#xC5EC;&#xAE30;&#xC11C;&#xB3C4; Prometheus &#xB97C; &#xD1B5;&#xD574;&#xC11C; pull &#xD558;&#xB3C4;&#xB85D; &#xD588;&#xB2E4;. &#xC774;&#xB294; <code>prometheus-client</code> &#xB77C;&#xC774;&#xBE0C;&#xB7EC;&#xB9AC;&#xC758; &#xD65C;&#xC6A9;&#xC744; &#xD1B5;&#xD574;&#xC11C; &#xC27D;&#xAC8C; &#xD574;&#xACB0;&#xD560; &#xC218; &#xC788;&#xB2E4;.</p><h3 id="%EA%B2%AA%EC%97%88%EB%8D%98-%EB%AC%B8%EC%A0%9C">&#xACAA;&#xC5C8;&#xB358; &#xBB38;&#xC81C;</h3><p><strong>FastAPI</strong> :&#xCF54;&#xB4DC;&#xB97C; &#xC791;&#xC131;&#xD558;&#xBA74;&#xC11C; <code>FastAPI</code> &#xB97C; &#xAD1C;&#xD788; &#xC0AC;&#xC6A9;&#xD588;&#xB2E4;&#xB294; &#xAC83;&#xC744; &#xC54C;&#xAC8C;&#xB410;&#xB2E4;. <code>FastAPI</code> &#xC758; &#xACBD;&#xC6B0; <code>asyncio</code> &#xB97C; &#xC0AC;&#xC6A9;&#xD558;&#xB294;&#xB370;, <code>selenium</code> &#xC744; &#xD1B5;&#xD574;&#xC11C; <code>webdriver</code> &#xB97C; &#xC870;&#xC791;&#xD558;&#xB294; &#xACFC;&#xC815;&#xC740; &#xBE14;&#xB85C;&#xD0B9; &#xB420; &#xC218; &#xBC16;&#xC5D0; &#xC5C6;&#xC5B4; &#xC774;&#xC810;&#xC744; &#xCDE8;&#xD558;&#xC9C0; &#xBABB;&#xD588;&#xB2E4;. </p><p>&#xB610;&#xD55C; &#xD504;&#xB85C;&#xADF8;&#xB7A8; &#xB85C;&#xB4DC; &#xACFC;&#xC815;&#xC5D0;&#xC11C; <code>main.py</code> &#xC5D0;&#xC11C; &#xC2E4;&#xD589;&#xD558;&#xB294; &#xB85C;&#xC9C1; &#xADF8;&#xB300;&#xB85C; &#xD504;&#xB85C;&#xADF8;&#xB7A8;&#xC774; &#xC2DC;&#xC791;&#xB418;&#xB294; &#xAC83;&#xC774; &#xC544;&#xB2C8;&#xC5C8;&#xB2E4;. &#xC774; &#xB54C;&#xBB38;&#xC5D0; &#xD504;&#xB85C;&#xADF8;&#xB7A8;&#xC744; &#xC885;&#xB8CC;&#xD558;&#xB294; &#xACFC;&#xC815;&#xC774; &#xBCF5;&#xC7A1;&#xD574;&#xC84C;&#xC73C;&#xBA70;, &#xC6D0;&#xD558;&#xB294; &#xC5D0;&#xB7EC; &#xCF54;&#xB4DC;&#xB85C; exit &#xD560; &#xC218;&#xB3C4; &#xC5C6;&#xC5C8;&#xACE0;, &#xAC1D;&#xCCB4;&#xB97C; &#xC870;&#xC791;&#xD568;&#xC5D0; &#xC788;&#xC5B4;&#xC11C;&#xB3C4; &#xC880; &#xACE0;&#xC0DD;&#xC744; &#xD588;&#xB2E4;. (python&#xC5D0; &#xB300;&#xD55C; &#xC774;&#xD574; &#xBD80;&#xC871;&#xC774;&#xB2E4;...)</p><p> &#xC694;&#xB9AC;&#xC870;&#xB9AC; &#xD574;&#xACB0; &#xBC29;&#xC548;&#xC744; &#xCC3E;&#xC544;&#xB0B4;&#xAE30;&#xB294; &#xD588;&#xC73C;&#xB098; &#xC801;&#xC808;&#xD558;&#xC9C0; &#xBABB;&#xD588;&#xB358; &#xC120;&#xD0DD;&#xC774;&#xC5C8;&#xB2E4;. <code>Flask</code> &#xB85C; &#xC804;&#xD658;&#xC744; &#xC880; &#xACE0;&#xB824;&#xD574;&#xBD10;&#xC57C;&#xACA0;&#xB2E4;.</p><p><strong>Selenium </strong>: app.getgrass.io &#xC758; &#xC11C;&#xBC84;&#xAC00; &#xAF64; &#xBD88;&#xC548;&#xC815;&#xD558;&#xB2E4;. &#xB85C;&#xADF8;&#xC778; &#xC694;&#xCCAD;&#xC744; &#xD588;&#xC744; &#xB54C; &#xBC14;&#xB85C; &#xC694;&#xCCAD;&#xC744; &#xBC1B;&#xC544;&#xC8FC;&#xBA74; &#xC88B;&#xACA0;&#xC73C;&#xB098; &#xADF8;&#xB0E5; &#xBB34;&#xD55C; &#xB300;&#xAE30;&#xB97C; &#xD574;&#xBC84;&#xB9AC;&#xB294; &#xACBD;&#xC6B0;&#xAC00; &#xBE48;&#xBC88;&#xD588;&#xB2E4;. &#xB610;&#xD55C; &#xB85C;&#xADF8;&#xC778;&#xC744; &#xD558;&#xB354;&#xB77C;&#xB3C4;, &#xB85C;&#xB4DC;&#xAC00; &#xC81C;&#xB300;&#xB85C; &#xB418;&#xC9C0; &#xC54A;&#xB294; &#xACBD;&#xC6B0;&#xB3C4; &#xB9CE;&#xC558;&#xB2E4;. &#xC774;&#xB7F0; &#xACBD;&#xC6B0; &#xB9C8;&#xB545;&#xD788; &#xBC29;&#xBC95;&#xC774; &#xC5C6;&#xC5B4;, &#xD504;&#xB85C;&#xADF8;&#xB7A8;&#xC744; &#xC7AC;&#xC2DC;&#xC791;&#xD558;&#xB294; &#xC218; &#xBC16;&#xC5D0; &#xC5C6;&#xC5C8;&#xB2E4;. </p><p><strong>Python : </strong> Grass &#xAC1D;&#xCCB4;&#xB098; Prometheus &#xAC1D;&#xCCB4;&#xC758; &#xACBD;&#xC6B0; &#xD504;&#xB85C;&#xADF8;&#xB7A8; &#xC804;&#xBC18;&#xC5D0;&#xC11C; &#xC778;&#xC2A4;&#xD134;&#xC2A4;&#xAC00; &#xD558;&#xB098;&#xB9CC; &#xC874;&#xC7AC;&#xD574;&#xC57C;&#xD55C;&#xB2E4;. Python &#xC73C;&#xB85C; &#xCF54;&#xB4DC;&#xB97C; &#xC81C;&#xB300;&#xB85C; &#xC791;&#xC131;&#xD574;&#xBCF8;&#xC801;&#xC774; &#xC5C6;&#xC5B4;&#xC11C; &#xC5B8;&#xC81C; &#xC778;&#xC2A4;&#xD134;&#xC2A4;&#xAC00; &#xB9CC;&#xB4E4;&#xC5B4;&#xC9C0;&#xACE0;, &#xCF54;&#xB4DC;&#xAC00; &#xC2E4;&#xD589;&#xB418;&#xB294;&#xC9C0;, &#xD074;&#xB798;&#xC2A4; &#xC0DD;&#xC131;&#xC790;&#xC5D0; &#xB300;&#xD55C; &#xC774;&#xD574;&#xAC00; &#xBD80;&#xC871;&#xD588;&#xB2E4;. &#xC9C0;&#xAE08; &#xD574;&#xACB0;&#xCC45;&#xC774;&#xB77C;&#xACE0; &#xD55C; &#xBC29;&#xBC95;&#xB4E4;&#xC774; &#xC88B;&#xC740; &#xBC29;&#xBC95;&#xC740; &#xC544;&#xB2D0; &#xAC83; &#xAC19;&#xB2E4;.</p><h3 id="grafana-dashboard-%EB%A7%8C%EB%93%A4%EA%B8%B0">Grafana Dashboard &#xB9CC;&#xB4E4;&#xAE30;</h3><p>Grafana Dashboard &#xC758; &#xACBD;&#xC6B0; &#xB9E4;&#xBC88; &#xC788;&#xB294; &#xAC83;&#xC744; &#xC0AC;&#xC6A9;&#xD588;&#xC5C8;&#xB2E4;. &#xC774;&#xBC88;&#xC5D0; &#xCC98;&#xC74C; &#xB9CC;&#xB4E4;&#xC5B4;&#xBCF4;&#xB294;&#xB370; &#xADF8;&#xB807;&#xAC8C; &#xC5B4;&#xB835;&#xC9C0;&#xB294; &#xC54A;&#xC558;&#xB2E4;. &#xB2E4;&#xC74C;&#xACFC; &#xAC19;&#xC740; &#xAD6C;&#xC131;&#xC73C;&#xB85C; &#xB300;&#xC2DC;&#xBCF4;&#xB4DC;&#xB97C; &#xAD6C;&#xC131;&#xD588;&#xB2E4;.</p><figure class="kg-card kg-image-card"><img src="https://life.photogrammer.me/content/images/2024/07/image-7.png" class="kg-image" alt="Grass miner &#xB9CC;&#xB4E4;&#xAE30;" loading="lazy" width="1532" height="1153" srcset="https://life.photogrammer.me/content/images/size/w600/2024/07/image-7.png 600w, https://life.photogrammer.me/content/images/size/w1000/2024/07/image-7.png 1000w, https://life.photogrammer.me/content/images/2024/07/image-7.png 1532w" sizes="(min-width: 720px) 720px"></figure><ul><li>&#xC804;&#xCCB4; &#xB178;&#xB4DC; &#xC0C1;&#xD0DC; &#xD655;&#xC778;<ul><li>Summary</li><li>&#xB124;&#xD2B8;&#xC6CC;&#xD06C; &#xD004;&#xB9AC;&#xD2F0; &#xAE30;&#xB85D; (range)</li><li>&#xCC44;&#xAD74;&#xB7C9;</li><li>&#xC2DC;&#xAC04;&#xBCC4; &#xCC44;&#xAD74;&#xB7C9;</li></ul></li><li>&#xAC01; &#xB178;&#xB4DC; &#xC0C1;&#xD0DC;<ul><li>&#xC704;&#xC640; &#xAC70;&#xC758; &#xB3D9;&#xC77C;</li></ul></li></ul><p>&#xC0DD;&#xAC01;&#xD55C;&#xB300;&#xB85C; &#xC798; &#xACB0;&#xACFC;&#xB97C; &#xBC1B;&#xC544;&#xC628;&#xB2E4;. grass &#xD648;&#xD398;&#xC774;&#xC9C0;&#xC5D0;&#xC11C;&#xB3C4; &#xC774;&#xBBF8; &#xBCF4;&#xC5EC;&#xC8FC;&#xB294; &#xC815;&#xBCF4;&#xB4E4;&#xC774;&#xB77C; &#xD544;&#xC694;&#xD55C;&#xAC00; &#xC2F6;&#xAE34;&#xD558;&#xB2E4; &#x314B;&#x314B;. &#xADF8;&#xB798;&#xB3C4; Grafana &#xB0B4;&#xC5D0;&#xC11C; &#xD655;&#xC778;&#xD560; &#xC218; &#xC788;&#xC73C;&#xB2C8; &#xB098;&#xB984; &#xC758;&#xBBF8;&#xB294; &#xC788;&#xACA0;&#xB2E4;. &#xB178;&#xB4DC;&#xAC00; &#xB9CE;&#xC558;&#xC73C;&#xBA74; &#xC870;&#xAE08; &#xB354; &#xD65C;&#xC6A9;&#xB3C4;&#xAC00; &#xC788;&#xC5C8;&#xC744;&#xD150;&#xB370; &#xC544;&#xC27D;&#xB2E4;.</p><p>&#xD604;&#xC7AC;&#xB294; &#xC2E4;&#xC81C;&#xB85C; &#xD2B8;&#xB798;&#xD53D;&#xC774; &#xBC1C;&#xC0DD;&#xD558;&#xC9C0; &#xC54A;&#xC544; &#xD070; &#xC758;&#xBBF8;&#xB294; &#xC5C6;&#xC9C0;&#xB9CC;, &#xD2B8;&#xB798;&#xD53D; &#xBAA8;&#xB2C8;&#xD130;&#xB9C1;&#xC740; &#xAE30;&#xB2A5;&#xC5D0; &#xCD94;&#xAC00;&#xD558;&#xB294;&#xAC8C; &#xC5B4;&#xB5A8;&#xAE4C;&#xC2F6;&#xB2E4;.</p><p></p><h2 id="%ED%9B%84%EA%B8%B0">&#xD6C4;&#xAE30;</h2><p>&#xC7AC;&#xBBF8;&#xC0BC;&#xC544;&#xC11C; &#xB9CC;&#xB4E4;&#xC5B4;&#xBCF8; &#xD504;&#xB85C;&#xC81D;&#xD2B8;&#xC600;&#xB2E4;. &#xD06C;&#xAC8C; &#xBB54;&#xAC00; &#xD55C; &#xAC83;&#xC740; &#xC5C6;&#xACE0; &#xB2E4;&#xC74C;&#xACFC; &#xAC19;&#xC740; &#xAC83;&#xB4E4;&#xC744; &#xAC00;&#xBCCD;&#xAC8C; &#xACBD;&#xD5D8;&#xD588;&#xB2E4;.</p><ul><li>&#xB098;&#xB984;&#xC758; OOP &#xD558;&#xAE30;</li><li>Selenium &#xC73C;&#xB85C; webdriver &#xC870;&#xC791;</li><li>Prometheus client &#xB9CC;&#xB4E4;&#xAE30;</li><li>Grafana dashboard &#xB9CC;&#xB4E4;&#xAE30;</li></ul><p>&#xD5C8;&#xC811;&#xD558;&#xC9C0;&#xB9CC;, &#xB204;&#xAD70;&#xAC00; github &#xC5D0;&#xC11C; &#xBCF4;&#xACE0; referal &#xC744; &#xD574;&#xC11C; &#xBD80;&#xC790;&#xAC00; &#xB410;&#xC73C;&#xBA74; &#xC88B;&#xACA0;&#xB2E4;. &#x314B;&#x314B;</p><p>&#xB05D;~</p>]]></content:encoded></item><item><title><![CDATA[홈 서버 모니터링 시스템 Oracle Cloud 로 이전하기 (2)]]></title><description><![CDATA[홈 서버의 메트릭 정보를 Prometheus 를 통해 Oracle cloud 로 보내는 과정]]></description><link>https://life.photogrammer.me/migration-monitoring-system-to-oracle-cloud-1-2/</link><guid isPermaLink="false">6681bc79264f850001f8a725</guid><category><![CDATA[Server]]></category><category><![CDATA[Development]]></category><dc:creator><![CDATA[Sungjun Park]]></dc:creator><pubDate>Mon, 01 Jul 2024 09:33:23 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1551288049-bebda4e38f71?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDh8fGdyYXBofGVufDB8fHx8MTcxOTgyNjI3M3ww&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" medium="image"/><content:encoded><![CDATA[<img src="https://images.unsplash.com/photo-1551288049-bebda4e38f71?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDh8fGdyYXBofGVufDB8fHx8MTcxOTgyNjI3M3ww&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" alt="&#xD648; &#xC11C;&#xBC84; &#xBAA8;&#xB2C8;&#xD130;&#xB9C1; &#xC2DC;&#xC2A4;&#xD15C; Oracle Cloud &#xB85C; &#xC774;&#xC804;&#xD558;&#xAE30; (2)"><p></p><p>&#xC9C0;&#xB09C; &#xAE00;&#xC5D0; &#xC774;&#xC5B4; Oracle Cloud &#xB85C; &#xBAA8;&#xB2C8;&#xD130;&#xB9C1; &#xC2DC;&#xC2A4;&#xD15C;&#xC744; &#xC62E;&#xAE30;&#xB294; &#xACFC;&#xC815;&#xC744; &#xB9C8;&#xC800; &#xC9C4;&#xD589;&#xD574;&#xBCF4;&#xACA0;&#xB2E4;.</p><h2 id="vpn-%EC%84%A4%EC%B9%98">VPN &#xC124;&#xCE58;</h2><ul><li>&#xBAA8;&#xB2C8;&#xD130;&#xB9C1; &#xC11C;&#xBC84;&#xC5D0;&#xC11C; &#xB0B4;&#xBD80; &#xC11C;&#xBE44;&#xC2A4;&#xC758; &#xACBD;&#xC6B0; &#xC678;&#xBD80;&#xB85C; &#xB178;&#xCD9C;&#xB420; &#xC774;&#xC720;&#xAC00; &#xC5C6;&#xB2E4;. &#xB530;&#xB77C;&#xC11C;, VPN &#xC744; &#xD1B5;&#xD574;&#xC11C;&#xB9CC; &#xD574;&#xB2F9; &#xC11C;&#xBC84;&#xC5D0; &#xC811;&#xC18D; &#xD560; &#xC218; &#xC788;&#xB3C4;&#xB85D; &#xD55C;&#xB2E4;.</li><li>&#xAE30;&#xC874;&#xC5D0; OpenVPN &#xC744; &#xD1B5;&#xD574;&#xC11C; VPN &#xC744; &#xAD6C;&#xCD95;&#xD558;&#xACE0; &#xC788;&#xC5B4;, &#xD574;&#xB2F9; &#xC11C;&#xBC84;&#xB3C4; OpenVPN &#xC744; &#xD65C;&#xC6A9;&#xD558;&#xB3C4;&#xB85D; &#xD560; &#xAC83;&#xC774;&#xB2E4;.</li></ul><h3 id="docker-container-%EC%98%AC%EB%A6%AC%EA%B8%B0">docker container &#xC62C;&#xB9AC;&#xAE30;</h3><ul><li>Wireguard / OpenVPN &#xB450; &#xAC00;&#xC9C0; &#xC120;&#xD0DD;&#xC9C0;&#xAC00; &#xC788;&#xB2E4;.</li><li>&#xAE30;&#xC874;&#xC758; &#xACBD;&#xC6B0; &#xB77C;&#xC6B0;&#xD130;&#xC5D0;&#xC11C; OpenVPN &#xC744; &#xC9C0;&#xC6D0;&#xD558;&#xC5EC; OpenVPN &#xC744; &#xBC14;&#xD0D5;&#xC73C;&#xB85C; &#xD1B5;&#xC2E0;&#xD558;&#xC600;&#xB2E4;. &#xADF8;&#xB7EC;&#xB098; &#xCD5C;&#xADFC; OpenVPN &#xBCF4;&#xB2E4; WireGuard &#xCABD;&#xC73C;&#xB85C; &#xD2B8;&#xB80C;&#xB4DC;&#xAC00; &#xB118;&#xC5B4;&#xAC04; &#xAC83;&#xC73C;&#xB85C; &#xBCF4;&#xC778;&#xB2E4;. OpenVPN &#xC5D0; &#xBE44;&#xD574;&#xC11C; &#xACBD;&#xB7C9;&#xD654; &#xB418;&#xC5B4;&#xC788;&#xC73C;&#xBA70; &#xBE60;&#xB974;&#xACE0; &#xBCF4;&#xC548;&#xC801;&#xC73C;&#xB85C;&#xB3C4; &#xC548;&#xC804;&#xD558;&#xB2E4;.  &#xB530;&#xB77C;&#xC11C; &#xC774;&#xBC88; &#xAE30;&#xD68C;&#xC5D0; VPN &#xC744; wireguard &#xB85C; &#xBCC0;&#xACBD;&#xD574;&#xBCF4;&#xACE0;&#xC790; &#xD55C;&#xB2E4;.</li><li>&#xC774;&#xBBF8;&#xC9C0;&#xB294; &#xB2E4;&#xC74C; &#xC774;&#xBBF8;&#xC9C0;&#xB97C; &#xC0AC;&#xC6A9;&#xD560; &#xAC83;&#x200B;&#xC774;&#xB2E4;. </li></ul><p><a href="https://hub.docker.com/r/linuxserver/wireguard">https://hub.docker.com/r/linuxserver/wireguard</a></p><ul><li>wireguard &#xC758; &#xACBD;&#xC6B0; gui &#xB97C; &#xC790;&#xCCB4; &#xC81C;&#xACF5;&#xD558;&#xC9C0; &#xC54A;&#xB294;&#xB2E4;. &#xC774;&#xB97C; &#xC81C;&#xACF5;&#xD558;&#xB294; web ui &#xB610;&#xD55C; &#xD568;&#xAED8; &#xCD94;&#xAC00;&#xD558;&#xC790;.</li></ul><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://github.com/ngoduykhanh/wireguard-ui"><div class="kg-bookmark-content"><div class="kg-bookmark-title">GitHub - ngoduykhanh/wireguard-ui: Wireguard web interface</div><div class="kg-bookmark-description">Wireguard web interface. Contribute to ngoduykhanh/wireguard-ui development by creating an account on GitHub.</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://github.githubassets.com/assets/pinned-octocat-093da3e6fa40.svg" alt="&#xD648; &#xC11C;&#xBC84; &#xBAA8;&#xB2C8;&#xD130;&#xB9C1; &#xC2DC;&#xC2A4;&#xD15C; Oracle Cloud &#xB85C; &#xC774;&#xC804;&#xD558;&#xAE30; (2)"><span class="kg-bookmark-author">GitHub</span><span class="kg-bookmark-publisher">ngoduykhanh</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://opengraph.githubassets.com/b6aae5ddf4eebb231c3409f37f96a1750323f350100e4763123f24adb2851203/ngoduykhanh/wireguard-ui" alt="&#xD648; &#xC11C;&#xBC84; &#xBAA8;&#xB2C8;&#xD130;&#xB9C1; &#xC2DC;&#xC2A4;&#xD15C; Oracle Cloud &#xB85C; &#xC774;&#xC804;&#xD558;&#xAE30; (2)"></div></a></figure><pre><code class="language-yaml">version: &quot;3.8&quot;
name: wireguard
services:
  wireguard:
    image: lscr.io/linuxserver/wireguard:latest
    container_name: wireguard
    cap_add:
      - NET_ADMIN
      - SYS_MODULE #optional
    environment:
      - PUID=1003
      - PGID=1003
      - TZ=Etc/UTC
      - SERVERURL=${SERVER_URL}me #optional
      - SERVERPORT=51820 #optional
      - PEERS=1 #optional
      - PEERDNS=auto #optional
      - INTERNAL_SUBNET=10.13.13.0 #optional
      - ALLOWEDIPS=0.0.0.0/0 #optional
      - PERSISTENTKEEPALIVE_PEERS= #optional
      - LOG_CONFS=true #optional
    volumes:
      - ./data/wireguard:/config
      - /lib/modules:/lib/modules #optional
    ports:
      - 5000:5000
      - 51820:51820/udp
    sysctls:
      - net.ipv4.conf.all.src_valid_mark=1
    restart: unless-stopped

  webui-wireguard:
    image: ngoduykhanh/wireguard-ui
    container_name: webui-wireguard
    cap_add:
      - NET_ADMIN
    network_mode: service:wireguard
    environment:
      - SENDGRID_API_KEY
      - EMAIL_FROM_ADDRESS
      - EMAIL_FROM_NAME
      - SESSION_SECRET
      - WGUI_USERNAME=${USER}
      - WGUI_PASSWORD=${PW}
      - WG_CONF_TEMPLATE
      - WGUI_MANAGE_START=false
      - WGUI_MANAGE_RESTART=false
    logging:
      driver: json-file
      options:
        max-size: 50m
    volumes:
      - ./data/db:/app/db
      - ./data/wireguard:/etc/wireguard
</code></pre><h3 id="%EB%B0%9C%EC%83%9D%ED%95%9C-%EB%AC%B8%EC%A0%9C%EB%93%A4">&#xBC1C;&#xC0DD;&#xD55C; &#xBB38;&#xC81C;&#xB4E4;</h3><ul><li>wireguard &#xAC00; &#xAC11;&#xC791;&#xC2A4;&#xB7FD;&#xAC8C; &#xC5F0;&#xACB0;&#xC774; &#xC548;&#xB418;&#xB294; &#xBB38;&#xC81C;&#xAC00; &#xC788;&#xC5C8;&#xB2E4;. &#xC774;&#xC0C1;&#xD558;&#xAC8C; &#xD578;&#xB4DC;&#xD3F0;&#xC5D0;&#xC11C;&#xB294;  &#xC5F0;&#xACB0;&#xC774; &#xB418;&#xB294;&#xB370;, mac &#xC5D0;&#xC11C;&#xB9CC; &#xC5F0;&#xACB0;&#xC774; &#xC548;&#xB410;&#xB2E4;.</li><li>Peer &#xCDA9;&#xB3CC;&#xB85C; &#xC778;&#xD55C; &#xBB38;&#xC81C;&#xC600;&#xB358; &#xAC83;&#xC73C;&#xB85C; &#xBCF4;&#xC778;&#xB2E4;. &#xB3D9;&#xC2DC;&#xC5D0; &#xC5EC;&#xB7EC; device &#xC5D0;&#xC11C; &#xC811;&#xADFC; &#xD558;&#xB294; &#xACBD;&#xC6B0;&#xC5D0; &#xC8FC;&#xC758;&#xC880; &#xD574;&#xC57C;&#xD560; &#xAC83; &#xAC19;&#xB2E4;.</li><li>web-ui &#xC5F0;&#xACB0;&#xD558;&#xBA74;&#xC11C;&#xB3C4; &#xB124;&#xD2B8;&#xC6CC;&#xD06C; &#xAD00;&#xB828;&#xD558;&#xC5EC; &#xBB38;&#xC81C;&#xAC00; &#xBC1C;&#xC0DD;&#xD588;&#xB2E4;.<ul><li>webui-wireguard &#xC640; wireguard container &#xAC00; &#xC11C;&#xB85C; &#xC5F0;&#xACB0;&#xB418;&#xC5B4;&#xC788;&#xC5B4;&#xC57C;&#xD55C;&#xB2E4;.</li><li>&#xD3EC;&#xD2B8; &#xAC1C;&#xBC29;&#xC744; web-ui &#xC5D0;&#xC11C; &#xD558;&#xB294; &#xAC83;&#xC774; &#xC544;&#xB2C8;&#xB2E4; (?) &#xC660;&#xC9C0;&#xB294; &#xBAA8;&#xB974;&#xACA0;&#xC9C0;&#xB9CC; &#xADF8;&#xB807;&#xAC8C; &#xC124;&#xC815;&#xC774; &#xB418;&#xC5B4;&#xC788;&#xB354;&#xB77C;.</li><li><code>/etc/wireguard</code> &#xBD80;&#xBD84;&#xC758; &#xACBD;&#xC6B0; docker container &#xB85C; &#xC62C;&#xB9AC;&#xB294; &#xACBD;&#xC6B0; <code>wireguard</code> &#xC758; <code>config</code> &#xBCFC;&#xB968;&#xACFC; &#xAC19;&#xC544;&#xC57C;&#xD55C;&#xB2E4;.</li></ul></li><li>DNS &#xBB38;&#xC81C;&#xAC00; &#xC885;&#xC885; &#xC0DD;&#xAE38; &#xC218;&#xB3C4; &#xC788;&#xB2E4;. &#xB0B4; &#xB77C;&#xC6B0;&#xD130;&#xC758; &#xACBD;&#xC6B0; pi-hole DNS &#xC640; &#xC5F0;&#xACB0;&#xB418;&#xC5B4;&#xC788;&#xB294;&#xB370; &#xB531;&#xD788; &#xBB38;&#xC81C;&#xAC00; &#xBC1C;&#xC0DD;&#xD558;&#xC9C0;&#xB294; &#xC54A;&#xC558;&#xB2E4;. &#xB2E4;&#xB9CC; &#xBB38;&#xC81C;&#xAC00; &#xBC1C;&#xC0DD;&#xD55C;&#xB2E4;&#xB294; &#xBCF4;&#xACE0;&#xAC00; &#xBA87; &#xAC1C; &#xC788;&#xB2E4;.</li></ul><h3 id="npm-proxy">NPM Proxy</h3><ul><li>VPN &#xC73C;&#xB85C; &#xC811;&#xC18D;&#xD558;&#xC5EC; &#xB0B4;&#xBD80; &#xB9DD; &#xACBD;&#xB85C;&#xB85C; &#xC811;&#xC18D;&#xC744; &#xD574;&#xB3C4; &#xB41C;&#xB2E4;. &#xD558;&#xC9C0;&#xB9CC;, &#xADF8;&#xB0E5; NPM &#xC790;&#xCCB4; &#xAE30;&#xB2A5;&#xC744; &#xD1B5;&#xD574; source ip &#xB97C; &#xC81C;&#xD55C;&#xD560; &#xC218; &#xC788;&#xB2E4;. NPM &#xC5D0;&#xC11C; access list &#xB97C; &#xC124;&#xC815;&#xD558;&#xACE0;, &#xC774;&#xB97C; &#xD574;&#xB2F9;&#xD558;&#xB294; &#xB3C4;&#xBA54;&#xC778;&#xC73C;&#xB85C; &#xC9C0;&#xC815;&#xD588;&#xB2E4;.</li></ul><figure class="kg-card kg-image-card"><img src="https://life.photogrammer.me/content/images/2024/06/SC-2024-07-01-at-6.36.47-AM.jpg" class="kg-image" alt="&#xD648; &#xC11C;&#xBC84; &#xBAA8;&#xB2C8;&#xD130;&#xB9C1; &#xC2DC;&#xC2A4;&#xD15C; Oracle Cloud &#xB85C; &#xC774;&#xC804;&#xD558;&#xAE30; (2)" loading="lazy" width="1726" height="940" srcset="https://life.photogrammer.me/content/images/size/w600/2024/06/SC-2024-07-01-at-6.36.47-AM.jpg 600w, https://life.photogrammer.me/content/images/size/w1000/2024/06/SC-2024-07-01-at-6.36.47-AM.jpg 1000w, https://life.photogrammer.me/content/images/size/w1600/2024/06/SC-2024-07-01-at-6.36.47-AM.jpg 1600w, https://life.photogrammer.me/content/images/2024/06/SC-2024-07-01-at-6.36.47-AM.jpg 1726w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://life.photogrammer.me/content/images/2024/06/SC-2024-07-01-at-6.37.35-AM.jpg" class="kg-image" alt="&#xD648; &#xC11C;&#xBC84; &#xBAA8;&#xB2C8;&#xD130;&#xB9C1; &#xC2DC;&#xC2A4;&#xD15C; Oracle Cloud &#xB85C; &#xC774;&#xC804;&#xD558;&#xAE30; (2)" loading="lazy" width="2000" height="442" srcset="https://life.photogrammer.me/content/images/size/w600/2024/06/SC-2024-07-01-at-6.37.35-AM.jpg 600w, https://life.photogrammer.me/content/images/size/w1000/2024/06/SC-2024-07-01-at-6.37.35-AM.jpg 1000w, https://life.photogrammer.me/content/images/size/w1600/2024/06/SC-2024-07-01-at-6.37.35-AM.jpg 1600w, https://life.photogrammer.me/content/images/2024/06/SC-2024-07-01-at-6.37.35-AM.jpg 2000w" sizes="(min-width: 720px) 720px"></figure><ul><li>VPN &#xC744; &#xD1B5;&#xD558;&#xC9C0; &#xC54A;&#xC740; &#xACBD;&#xB85C;&#xC758; &#xACBD;&#xC6B0; 403 &#xC774; &#xB098;&#xC624;&#xBA70; &#xC811;&#xC18D;&#xC774; &#xBD88;&#xAC00;&#xD574;&#xC84C;&#xB2E4;.</li></ul><p></p><h2 id="home-server-%EB%AA%A8%EB%8B%88%ED%84%B0%EB%A7%81">Home server &#xBAA8;&#xB2C8;&#xD130;&#xB9C1;</h2><h3 id="network">Network</h3><ul><li>VPN &#xC744; &#xD1B5;&#xD574;&#xC11C; &#xB450; &#xB124;&#xD2B8;&#xC6CC;&#xD06C;&#xB97C; &#xC787;&#xB294; &#xBC29;&#xBC95;&#xC744; &#xCC98;&#xC74C;&#xC5D0; &#xACE0;&#xB824;&#xD588;&#xB2E4;.<ul><li>&#xB2E4;&#xC74C;&#xACFC; &#xAC19;&#xC774; &#xC0DD;&#xAC01;&#xD574;&#xBCF4;&#xC558;&#xB2E4;.<ul><li>Home server &#xC758; docker container &#xB85C; wireguard &#xC62C;&#xB9AC;&#xAE30;</li><li>Oracle VM &#xACFC; wireguard &#xB85C; &#xC5F0;&#xACB0;</li><li>container &#xAC04; VPN &#xD1B5;&#xC2E0;&#xC73C;&#xB85C; &#xC815;&#xBCF4;&#xB97C; &#xC804;&#xB2EC;&#xD55C;&#xB2E4;.</li></ul></li><li>&#xADF8;&#xB7EC;&#xB098; &#xD574;&#xB2F9; &#xBC29;&#xC2DD;&#xC73C;&#xB85C; &#xAD6C;&#xD604;&#xD560; &#xACBD;&#xC6B0; &#xB2E4;&#xC74C;&#xACFC; &#xAC19;&#xC740; &#xBB38;&#xC81C;&#xAC00; &#xBC1C;&#xC0DD;&#xD55C;&#xB2E4;.<ul><li>pve-exporter &#xC758; &#xACBD;&#xC6B0; pve node &#xB85C;&#xBD80;&#xD130; &#xC815;&#xBCF4;&#xB97C; &#xBC1B;&#xC544;&#xC624;&#xB294;&#xB370;, &#xC774;&#xB294; home network &#xC5D0;&#xC11C;&#xB9CC; &#xB4E4;&#xACE0; &#xC62C; &#xC218; &#xC788;&#xB2E4;.</li><li>&#xADF8;&#xB7EC;&#xB098; &#xD574;&#xB2F9; &#xCEE8;&#xD14C;&#xC774;&#xB108;&#xB97C; Oracle &#xCABD;&#xC758; VPN &#xACFC; &#xBB36;&#xC73C;&#xBA74; home network &#xCABD;&#xC73C;&#xB85C; &#xC811;&#xADFC;&#xD560; &#xC218;&#xAC00; &#xC5C6;&#xB2E4;.</li></ul></li></ul></li><li>&#xB530;&#xB77C;&#xC11C;, &#xC55E;&#xC11C; NPM &#xC744; &#xD1B5;&#xD574; &#xC811;&#xADFC; &#xC81C;&#xC5B4;&#xB97C; &#xD55C; &#xBC29;&#xC2DD;&#xC73C;&#xB85C; &#xC811;&#xADFC;&#xD574;&#xBCF4;&#xB824;&#xACE0; &#xD55C;&#xB2E4;.<ul><li>&#xB9D8;&#xC5D0;&#xB294; &#xC548;&#xB4E4;&#xC9C0;&#xB9CC;... &#xD604;&#xC7AC; &#xCC3E;&#xC544;&#xBCF8; &#xBC14;&#xB85C;&#xB294; &#xBCC4; &#xC218;&#xAC00; &#xC5C6;&#xB294; &#xAC83; &#xAC19;&#xB2E4;.</li></ul></li><li>pve-exporter &#xC5D0;&#xC11C; &#xC804;&#xB2EC;&#xD574;&#xC8FC;&#xB294; metric &#xC744; &#xC678;&#xBD80;&#xB85C; &#xAC1C;&#xBC29;&#xD558;&#xB418;, access list &#xB97C; &#xD1B5;&#xD574;&#xC11C; oracle vm &#xCE21;&#xC5D0;&#xC11C;&#xB9CC; &#xB4E4;&#xACE0; &#xC62C; &#xC218; &#xC788;&#xB3C4;&#xB85D; &#xC124;&#xC815;&#xD588;&#xB2E4;.</li></ul><h3 id="pve-exporter">pve-exporter</h3><ul><li>proxmox node &#xC758; &#xACBD;&#xC6B0; pve-exporter &#xB97C; &#xD1B5;&#xD574;&#xC11C; prometheus &#xB85C; metric &#xC744; &#xBCF4;&#xB0BC; &#xC218; &#xC788;&#xB2E4;.</li></ul><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://www.techtutorials.tv/sections/management-and-monitoring/monitor-proxmox-ve-with-prometheus-and-grafana/"><div class="kg-bookmark-content"><div class="kg-bookmark-title">Monitor Proxmox VE With Prometheus And Grafana</div><div class="kg-bookmark-description">In the video below, we show how to monitor Proxmox VE with Prometheus and Grafana</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://www.techtutorials.tv/image/favicon.ico" alt="&#xD648; &#xC11C;&#xBC84; &#xBAA8;&#xB2C8;&#xD130;&#xB9C1; &#xC2DC;&#xC2A4;&#xD15C; Oracle Cloud &#xB85C; &#xC774;&#xC804;&#xD558;&#xAE30; (2)"><span class="kg-bookmark-author">Tech Tutorials</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://www.techtutorials.tv/sections/management-and-monitoring/monitor-proxmox-ve-with-prometheus-and-grafana/thumbnail.jpg" alt="&#xD648; &#xC11C;&#xBC84; &#xBAA8;&#xB2C8;&#xD130;&#xB9C1; &#xC2DC;&#xC2A4;&#xD15C; Oracle Cloud &#xB85C; &#xC774;&#xC804;&#xD558;&#xAE30; (2)"></div></a></figure><ul><li>&#xC704; &#xAC8C;&#xC2DC;&#xBB3C;&#xC5D0;&#xC11C; &#xC544;&#xC8FC; &#xCE5C;&#xC808;&#xD558;&#xAC8C; &#xC124;&#xBA85;&#xD574;&#xB46C;&#xC11C; &#xADF8;&#xAC83;&#xC744; &#xADF8;&#xB300;&#xB85C; &#xB530;&#xB77C;&#xAC14;&#xB2E4;.</li></ul><figure class="kg-card kg-image-card"><img src="https://life.photogrammer.me/content/images/2024/07/image.png" class="kg-image" alt="&#xD648; &#xC11C;&#xBC84; &#xBAA8;&#xB2C8;&#xD130;&#xB9C1; &#xC2DC;&#xC2A4;&#xD15C; Oracle Cloud &#xB85C; &#xC774;&#xC804;&#xD558;&#xAE30; (2)" loading="lazy" width="2000" height="641" srcset="https://life.photogrammer.me/content/images/size/w600/2024/07/image.png 600w, https://life.photogrammer.me/content/images/size/w1000/2024/07/image.png 1000w, https://life.photogrammer.me/content/images/size/w1600/2024/07/image.png 1600w, https://life.photogrammer.me/content/images/2024/07/image.png 2000w" sizes="(min-width: 720px) 720px"></figure><ul><li>&#xC774;&#xC81C; proxmox &#xB178;&#xB4DC; &#xC0C1;&#xD0DC;&#xB3C4; &#xC774; &#xACF3;&#xC5D0;&#xC11C; &#xAD00;&#xCC30; &#xD560; &#xC218; &#xC788;&#xB2E4;.</li></ul><h3 id="cadvisor">cAdvisor</h3><ul><li>&#xC774;&#xC655; &#xBAA8;&#xB2C8;&#xD130;&#xB9C1; &#xD558;&#xB294; &#xACB8;, &#xCEE8;&#xD14C;&#xC774;&#xB108;&#xB4E4;&#xC758; &#xC0C1;&#xD0DC;&#xB3C4; &#xBAA8;&#xB2C8;&#xD130;&#xB9C1;&#xD558;&#xACE0;&#xC790;&#xD55C;&#xB2E4;.</li><li>cAdvisor &#xB294; &#xCEE8;&#xD14C;&#xC774;&#xB108; &#xBAA8;&#xB2C8;&#xD130;&#xB9C1;&#xC5D0; &#xD2B9;&#xD654;&#xB41C; &#xD234;&#xC774;&#xB2E4;.  &#xB9C8;&#xCC2C;&#xAC00;&#xC9C0;&#xB85C; docker container &#xB97C; &#xD1B5;&#xD574;&#xC11C; &#xC62C;&#xB9B4; &#xC218; &#xC788;&#xB2E4;.</li></ul><pre><code class="language-yaml">
  cadvisor:
    image: gcr.io/cadvisor/cadvisor
    container_name: cadvisor
    ports:
      - 8080:8080
    volumes:
      - /:/rootfs:ro
      - /var/run:/var/run:rw
      - /sys:/sys:ro
      - /var/lib/docker/:/var/lib/docker:ro
      - /dev/disk/:/dev/disk:ro</code></pre><ul><li>metric &#xC744; prometheus &#xC5D0;&#xC11C; &#xC218;&#xC9D1;&#xD560; &#xC218; &#xC788;&#xB3C4;&#xB85D; &#xCD94;&#xAC00;&#xD574;&#xC900;&#xB2E4;.</li></ul><pre><code class="language-yaml"> - job_name: cadvisor
    scrape_interval: 15s
    static_configs:
      - targets:
        - cadvisor:8080</code></pre><ul><li>grafana dashboard &#xB610;&#xD55C; &#xCD94;&#xAC00;&#xD558;&#xBA74; &#xC774;&#xB807;&#xAC8C; &#xCEE8;&#xD14C;&#xC774;&#xD130;&#xB124; &#xB300;&#xD55C; &#xC815;&#xBCF4;&#xB97C; &#xC218;&#xC9D1;&#xD560; &#xC218; &#xC788;&#xB2E4;.</li></ul><figure class="kg-card kg-image-card"><img src="https://life.photogrammer.me/content/images/2024/07/image-2.png" class="kg-image" alt="&#xD648; &#xC11C;&#xBC84; &#xBAA8;&#xB2C8;&#xD130;&#xB9C1; &#xC2DC;&#xC2A4;&#xD15C; Oracle Cloud &#xB85C; &#xC774;&#xC804;&#xD558;&#xAE30; (2)" loading="lazy" width="2000" height="1703" srcset="https://life.photogrammer.me/content/images/size/w600/2024/07/image-2.png 600w, https://life.photogrammer.me/content/images/size/w1000/2024/07/image-2.png 1000w, https://life.photogrammer.me/content/images/size/w1600/2024/07/image-2.png 1600w, https://life.photogrammer.me/content/images/2024/07/image-2.png 2000w" sizes="(min-width: 720px) 720px"></figure><ul><li>&#xAC01; &#xC11C;&#xBC84;&#xB9C8;&#xB2E4; cAdvisor &#xB97C; &#xC124;&#xCE58;&#xD574;&#xC8FC;&#xC5C8;&#xACE0;, metric&#xC744; &#xC218;&#xC9D1;&#xD558;&#xB3C4;&#xB85D;&#xD558;&#xC600;&#xB2E4;.</li><li>Synology &#xC758; &#xACBD;&#xC6B0; &#xBB38;&#xC81C;&#xAC00; &#xBC1C;&#xC0DD;&#xD588;&#xC5C8;&#xB2E4;. <code>volume</code> &#xC5F0;&#xACB0;&#xC5D0;&#xC11C;&#xC758; &#xBB38;&#xC81C;&#xC778;&#xB370;, linux &#xD658;&#xACBD;&#xACFC; &#xB2E4;&#xB974;&#xAE30; &#xB54C;&#xBB38;&#xC774;&#xC5C8;&#xB2E4;.</li></ul><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://github.com/google/cadvisor/issues/1846"><div class="kg-bookmark-content"><div class="kg-bookmark-title">Issues with cadvisor on Synology NAS &#xB7; Issue #1846 &#xB7; google/cadvisor</div><div class="kg-bookmark-description">I am having issues running cadvisor on my Synology NAS. If ran on docker, I get this: I1227 04:16:53.543073 1 storagedriver.go:50] Caching stats in memory for 2m0s I1227 04:16:53.543643 1 manager.g&#x2026;</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://github.githubassets.com/assets/pinned-octocat-093da3e6fa40.svg" alt="&#xD648; &#xC11C;&#xBC84; &#xBAA8;&#xB2C8;&#xD130;&#xB9C1; &#xC2DC;&#xC2A4;&#xD15C; Oracle Cloud &#xB85C; &#xC774;&#xC804;&#xD558;&#xAE30; (2)"><span class="kg-bookmark-author">GitHub</span><span class="kg-bookmark-publisher">google</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://opengraph.githubassets.com/c28a5684195a4b7d15335c0aa01d9134427b3fec1b2b669b73bf035b8b49a067/google/cadvisor/issues/1846" alt="&#xD648; &#xC11C;&#xBC84; &#xBAA8;&#xB2C8;&#xD130;&#xB9C1; &#xC2DC;&#xC2A4;&#xD15C; Oracle Cloud &#xB85C; &#xC774;&#xC804;&#xD558;&#xAE30; (2)"></div></a></figure><ul><li>CPU &#xC0AC;&#xC6A9;&#xB7C9;&#xC774; &#xB2E4;&#xB978; &#xCEE8;&#xD14C;&#xC774;&#xB108;&#xC5D0; &#xBE44;&#xD574; &#xB208;&#xC5D0; &#xB744;&#xAC8C; &#xB192;&#xC558;&#xB2E4;. &#xB098;&#xB9CC; &#xADF8;&#xB7F0; &#xC0C1;&#xD669;&#xC740; &#xC544;&#xB2C8;&#xC5C8;&#xACE0;, &#xB2E4;&#xB978; &#xC0AC;&#xB78C;&#xB4E4;&#xB3C4; &#xBE44;&#xC2B7;&#xD558;&#xAC8C; &#xACAA;&#xACE0; &#xC788;&#xB294; &#xBB38;&#xC81C;&#xC600;&#xB2E4;. &#xC544;&#xB798; &#xC774;&#xC288;&#xC5D0;&#xC11C; &#xC81C;&#xC548;&#xD574;&#xC900;&#xB300;&#xB85C; <code>housekeeping_interval=15s</code> &#xC73C;&#xB85C; 15%-&gt; 2% &#xB85C; &#xC904;&#xC77C; &#xC218; &#xC788;&#xC5C8;&#xB2E4;.</li></ul><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://github.com/google/cadvisor/issues/2523"><div class="kg-bookmark-content"><div class="kg-bookmark-title">(Relatively) high CPU usage for the cadvisor container &#xB7; Issue #2523 &#xB7; google/cadvisor</div><div class="kg-bookmark-description">I noticed that the CPU usage of cadvisor is the highest of all containers I&#x2019;m running, which I feel is unexpected. it&#x2019;s still not crazy (an average of 7%), but I feel it should be less. I&#x2019;m using t&#x2026;</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://github.githubassets.com/assets/pinned-octocat-093da3e6fa40.svg" alt="&#xD648; &#xC11C;&#xBC84; &#xBAA8;&#xB2C8;&#xD130;&#xB9C1; &#xC2DC;&#xC2A4;&#xD15C; Oracle Cloud &#xB85C; &#xC774;&#xC804;&#xD558;&#xAE30; (2)"><span class="kg-bookmark-author">GitHub</span><span class="kg-bookmark-publisher">google</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://opengraph.githubassets.com/4dee53f56215b7c374b14071083c565b7db699374fca7b52792299ed5fdf918d/google/cadvisor/issues/2523" alt="&#xD648; &#xC11C;&#xBC84; &#xBAA8;&#xB2C8;&#xD130;&#xB9C1; &#xC2DC;&#xC2A4;&#xD15C; Oracle Cloud &#xB85C; &#xC774;&#xC804;&#xD558;&#xAE30; (2)"></div></a></figure><h2 id="router-%EB%AA%A8%EB%8B%88%ED%84%B0%EB%A7%81">Router &#xBAA8;&#xB2C8;&#xD130;&#xB9C1;</h2><ul><li>Router &#xCABD;&#xC758; &#xC0C1;&#xD0DC;&#xB3C4; &#xC54C;&#xC544;&#xB450;&#xBA74; &#xB098;&#xC058;&#xC9C0; &#xC54A;&#xACA0;&#xB2E4;&#xB294; &#xC0DD;&#xAC01;&#xC774; &#xB4E4;&#xC5C8;&#xB2E4;. &#xD55C;&#xAD6D;&#xC5D0;&#xC11C; &#xB0B4; &#xACF5;&#xC720;&#xAE30;&#xB85C; &#xC2DC;&#xB3C4;&#xB97C; &#xD558;&#xC2E0; &#xBD84;&#xC774; &#xC788;&#xC5B4; &#xADF8;&#xB300;&#xB85C; &#xC2DC;&#xB3C4;&#xD574;&#xBCF4;&#xC558;&#xB2E4;.</li></ul><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://soosoo-life.tistory.com/3"><div class="kg-bookmark-content"><div class="kg-bookmark-title">asus ac68u - prometheus, grafana &#xBAA8;&#xB2C8;&#xD130;&#xB9C1; &#xD558;&#xAE30;</div><div class="kg-bookmark-description">1. ac68u&#xC5D0;&#xC11C; &#xC815;&#xBCF4;&#xB97C; &#xC218;&#xC9D1;&#xD560; node_exporter&#xB97C; &#xCEF4;&#xD30C;&#xC77C; &#xD55C;&#xB2E4;. asus ac68u &#xC758; &#xACBD;&#xC6B0; armv7 &#xC544;&#xD0A4;&#xD14D;&#xCC98;&#xB97C; &#xC0AC;&#xC6A9;&#xD558;&#xACE0; &#xC788;&#xB2E4;. &#xC774; &#xC544;&#xD0A4;&#xD14D;&#xCC98;&#xC5D0; &#xB9DE;&#xB3C4;&#xB85D; node_exporter&#xB97C; &#xD06C;&#xB85C;&#xC2A4; &#xCEF4;&#xD30C;&#xC77C; &#xD55C;&#xB2E4;. git clone git@github.com:prometheus/node_exporter.git cd node_exporter GOARCH=&#x2018;arm&#x2019; GOOS=linux go build 2. node_exporter&#xB97C; ac68u&#xB85C; &#xC774;&#xB3D9; &#xD6C4; &#xC2E4;&#xD589; &#xD06C;&#xB85C;&#xC2A4; &#xCEF4;&#xD30C;&#xC77C; &#xD55C; node_exporter &#xD30C;&#xC77C;&#xC744; asus ac68u&#xB85C; &#xC774;&#xB3D9;&#xD55C; &#xD6C4; &#xC2E4;&#xD589;&#xD574;&#xC900;&#xB2E4;. scp ./node_exporter admin@192.168.1.1:~/ ssh admin@192.168.1.1 &#x2019;nohup ./node_exporter &gt;/de&#x2026;</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://t1.daumcdn.net/tistory_admin/top_v2/bi-tistory-favicon.svg" alt="&#xD648; &#xC11C;&#xBC84; &#xBAA8;&#xB2C8;&#xD130;&#xB9C1; &#xC2DC;&#xC2A4;&#xD15C; Oracle Cloud &#xB85C; &#xC774;&#xC804;&#xD558;&#xAE30; (2)"><span class="kg-bookmark-author">TISTORY</span><span class="kg-bookmark-publisher">&#xC218;&#xC218;&#xB77C;&#xC774;&#xD504;</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://img1.daumcdn.net/thumb/R800x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FYGMvF%2Fbtrw52zWBu9%2FPmGvaTLyXaY4I14B8G3BU1%2Fimg.webp" alt="&#xD648; &#xC11C;&#xBC84; &#xBAA8;&#xB2C8;&#xD130;&#xB9C1; &#xC2DC;&#xC2A4;&#xD15C; Oracle Cloud &#xB85C; &#xC774;&#xC804;&#xD558;&#xAE30; (2)"></div></a></figure><ul><li>&#xC5EC;&#xAE30;&#xC11C; &#xC0DD;&#xAC01;&#xB3C4; &#xC548;&#xD55C; &#xC0BD;&#xC9C8;&#xC744; &#xD588;&#xB294;&#xB370; -_-..  </li><li>AC68U &#xC640; AC68P &#xC758; &#xCC28;&#xC774;&#xC77C;&#xC9C0;&#xB3C4; &#xBAA8;&#xB974;&#xACA0;&#xB2E4;. ARMv7 &#xC544;&#xD0A4;&#xD14D;&#xCC98;&#xB85C; &#xB3D9;&#xC77C;&#xD55C;&#xB370;, &#xC704; &#xBC29;&#xC2DD;&#xC73C;&#xB85C; &#xCEF4;&#xD30C;&#xC77C;&#xD558;&#xBA74; <code>Illegal instruction</code> &#xC774; &#xBC1C;&#xC0DD;&#xD588;&#xB2E4;. </li><li><code>Linux RT-AC68P-8AF8 2.6.36.4brcmarm #1 SMP PREEMPT Sat Jan 1 13:43:55 EST 2022 armv7l ASUSWRT-Merlin</code>  &#xB77C;&#xACE0; &#xB098;&#xC628;&#xB2E4;. ARMv7 &#xC5D0; linux &#xB2C8;&#xAE4C; &#xC548;&#xB420;&#xB9AC;&#xAC00;. &#xC5C6;&#xC5B4; &#xC774;&#xD574;&#xAC00; &#xC548;&#xB410;&#xB2E4;.</li><li>&#xB0B4; &#xCEF4;&#xD30C;&#xC77C; &#xBC14;&#xC774;&#xB108;&#xB9AC;&#xAC00; &#xBB38;&#xC820;&#xAC00; &#xC2F6;&#xC5B4;, &#xC815;&#xC2DD;&#xC73C;&#xB85C; &#xBC30;&#xD3EC;&#xB41C; &#xBC14;&#xC774;&#xB108;&#xB9AC;&#xB97C; &#xBC1B;&#xC544;&#xB3C4; &#xB9C8;&#xCC2C;&#xAC00;&#xC9C0;.</li></ul><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://github.com/caddyserver/caddy/issues/1822"><div class="kg-bookmark-content"><div class="kg-bookmark-title">Illegal instruction on Asus RT-AC68U router &#xB7; Issue #1822 &#xB7; caddyserver/caddy</div><div class="kg-bookmark-description">1. What version of Caddy are you using (caddy -version)? Website says 10.0.6, caddy -version gives &#x201C;illegal instruction&#x201D; 2. What are you trying to do? this is my first try to run Caddy on Asus RT-A&#x2026;</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://github.githubassets.com/assets/pinned-octocat-093da3e6fa40.svg" alt="&#xD648; &#xC11C;&#xBC84; &#xBAA8;&#xB2C8;&#xD130;&#xB9C1; &#xC2DC;&#xC2A4;&#xD15C; Oracle Cloud &#xB85C; &#xC774;&#xC804;&#xD558;&#xAE30; (2)"><span class="kg-bookmark-author">GitHub</span><span class="kg-bookmark-publisher">caddyserver</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://opengraph.githubassets.com/82792764629d17beb8bce685efcfced753ad52bef240dae14341d91934feebf0/caddyserver/caddy/issues/1822" alt="&#xD648; &#xC11C;&#xBC84; &#xBAA8;&#xB2C8;&#xD130;&#xB9C1; &#xC2DC;&#xC2A4;&#xD15C; Oracle Cloud &#xB85C; &#xC774;&#xC804;&#xD558;&#xAE30; (2)"></div></a></figure><ul><li>&#xBE44;&#xC2B7;&#xD55C; &#xBB38;&#xC81C;&#xB97C; ac68u &#xC5D0;&#xC11C; &#xACAA;&#xC740; &#xC0AC;&#xB78C;&#xC774; &#xC788;&#xC5C8;&#xB2E4;. ARMv7 &#xB85C;&#xD558;&#xBA74; &#xC548;&#xB418;&#xACE0; ARMv5&#xB85C; &#xD574;&#xC57C; &#xB41C;&#xB2E8;&#xB2E4;. (?)  &#xD639;&#xC2DC;&#xB098; &#xC2F6;&#xC5B4; ARMv5 &#xBC84;&#xC804;&#xC744; &#xAC00;&#xC838;&#xC640;&#xC11C; &#xC0AC;&#xC6A9;&#xD558;&#xB2C8; &#xC798; &#xC791;&#xB3D9;&#xD55C;&#xB2E4;.</li><li>SNMP &#xB85C; &#xC790;&#xB8CC; &#xC218;&#xC9D1;&#xC774; &#xAC00;&#xB2A5;&#xD558;&#xAE34;&#xD558;&#xB2E4;. </li></ul><h2 id="%EA%B2%B0%EA%B3%BC">&#xACB0;&#xACFC;</h2><p>&#xD648; &#xC11C;&#xBC84;&#xC5D0; &#xB300;&#xD55C; &#xBAA8;&#xB2C8;&#xD130;&#xB9C1; &#xB3C4;&#xAD6C;&#xB97C; &#xBAA8;&#xB450; Oracle Cloud &#xB85C; &#xC62E;&#xACBC;&#xB2E4;. &#xAE30;&#xC874;&#xC5D0;&#xB294; Proxmox node &#xC5D0; &#xB300;&#xD574;&#xC11C;&#xB9CC; &#xBAA8;&#xB2C8;&#xD130;&#xB9C1;&#xD558;&#xACE0; &#xC788;&#xC5C8;&#xC73C;&#xB098;, &#xC774;&#xBC88; &#xAE30;&#xD68C;&#xC5D0; &#xB2E4;&#xC74C;&#xACFC; &#xAC19;&#xC774; &#xBAA8;&#xB2C8;&#xD130;&#xB9C1; &#xB3C4;&#xAD6C;&#xB97C; &#xCD94;&#xAC00;&#xD588;&#xB2E4;.</p><ul><li>Proxmox node &#xBAA8;&#xB2C8;&#xD130;&#xB9C1;<ul><li>pve-exporter</li></ul></li><li>Oracle Cloud VM&#xBAA8;&#xB2C8;&#xD130;&#xB9C1;<ul><li>node-exporter</li></ul></li><li>&#xD638;&#xC2A4;&#xD305; &#xC911;&#xC778; web service &#xBAA8;&#xB2C8;&#xD130;&#xB9C1;<ul><li>blackbox-exporter</li></ul></li><li>docker container &#xBAA8;&#xB2C8;&#xD130;&#xB9C1;<ul><li>cAdvisor</li></ul></li></ul><p>&#xB610;&#xD55C; Grafana &#xB97C; &#xD1B5;&#xD574; &#xC774;&#xB97C; &#xC2DC;&#xAC01;&#xD654;&#xD558;&#xC600;&#xC73C;&#xBA70;, Grafana &#xC758; &#xC54C;&#xB9BC; &#xB3C4;&#xAD6C;&#xB97C; &#xD1B5;&#xD574; hosting &#xC911;&#xC778; &#xC11C;&#xBE44;&#xC2A4;&#xAC00; down &#xB418;&#xB294; &#xACBD;&#xC6B0; &#xC989;&#xAC01; &#xC54C;&#xB9BC;&#xC774; &#xC624;&#xB3C4;&#xB85D; &#xC870;&#xCE58;&#xD588;&#xB2E4;. &#xD14C;&#xC2A4;&#xD2B8; &#xACB0;&#xACFC; &#xC544;&#xC8FC; &#xC798; &#xC791;&#xB3D9;&#xD558;&#xACE0; &#xC788;&#xB2E4;.</p><p>&#xC774;&#xC804;&#xACFC; &#xB9C8;&#xCC2C;&#xAC00;&#xC9C0;&#xB85C; &#xAC1C;&#xC778; VM &#xC774;&#xAE30;&#xC5D0; &#xB0B4;&#xBD80; &#xB9DD;&#xC5D0; &#xC811;&#xADFC;&#xD558;&#xAE30; &#xC704;&#xD574; VPN &#xC744; &#xC124;&#xC815;&#xD558;&#xC600;&#xACE0;, &#xC774;&#xBC88;&#xC5D0;&#xB294; Wireguard &#xB97C; &#xD65C;&#xC6A9;&#xD558;&#xC600;&#xB2E4;. &#xC5EC;&#xB7EC; VPN &#xC744; &#xAD73;&#xC774; &#xC0AC;&#xC6A9;&#xD560; &#xC774;&#xC720;&#xB3C4; &#xC5C6;&#xACE0;, OpenVPN &#xC5D0; &#xBE44;&#xD574; Wireguard &#xAC00; &#xC774;&#xC810;&#xC774; &#xC788;&#xC5B4;, &#xD648; &#xC11C;&#xBC84; &#xB610;&#xD55C; Wireguard &#xB85C; &#xC804;&#xD658;&#xD558;&#xB294; &#xAC83;&#xC744; &#xAC80;&#xD1A0;&#xD574;&#xBCFC; &#xD544;&#xC694;&#xAC00; &#xC788;&#xB2E4;. &#xB2E4;&#xB9CC;, Router &#xB2E8;&#xC5D0;&#xC11C; &#xC9C1;&#xC811; &#xC811;&#xC18D;&#xC744; &#xD558;&#xB294; &#xAC83;&#xC744; &#xC6D0;&#xD558;&#xB294; &#xC0C1;&#xD669;&#xC778;&#xB370;, &#xD604;&#xC7AC; &#xD38C;&#xC6E8;&#xC5B4;&#xC5D0;&#xC11C;&#xB294; Wireguard &#xB97C; &#xC9C0;&#xC6D0;&#xD558;&#xC9C0; &#xC54A;&#xC544; &#xADF8; &#xBC29;&#xBC95;&#xC744; &#xBAA8;&#xC0C9;&#xD574;&#xBD10;&#xC57C;&#xD560; &#xAC83;&#xC774;&#xB2E4;.</p><p>&#xC55E;&#xC73C;&#xB85C; &#xCD94;&#xAC00;&#xB85C; &#xAE30;&#xAE30;&#xB97C; &#xCD94;&#xAC00;&#xD558;&#xAC70;&#xB098; VM &#xC744; &#xB298;&#xB9B0;&#xB2E4;&#xBA74; &#xD604;&#xC7AC; &#xC791;&#xC5C5;&#xD55C; &#xB0B4;&#xC6A9;&#xC744; &#xC218;&#xB3D9;&#xC73C;&#xB85C; &#xC77C;&#xC77C;&#xD788; &#xCD94;&#xAC00;&#xD574;&#xC57C;&#xD55C;&#xB2E4;. &#xC880; &#xADC0;&#xCC2E;&#xC740; &#xC791;&#xC5C5;&#xC774;&#xB77C;&#xC11C; &#xC790;&#xB3D9;&#xC73C;&#xB85C; &#xD560; &#xC218; &#xC788;&#xB294; &#xBC29;&#xBC95;&#xC5D0; &#xB300;&#xD574;&#xC11C;&#xB3C4; &#xCC3E;&#xC544;&#xBCFC; &#xD544;&#xC694;&#xAC00; &#xC788;&#xB2E4;.</p><p>&#xB610;&#xD55C;, Cloud &#xC640; &#xD648; &#xC11C;&#xBC84;&#xC758; &#xB124;&#xD2B8;&#xC6CC;&#xD06C; &#xAD00;&#xB828;&#xD55C; &#xC791;&#xC5C5;&#xC774; &#xC740;&#xADFC;&#xD788; &#xACE8;&#xCE6B;&#xAC70;&#xB9AC;&#xC600;&#xB2E4;. &#xD604;&#xC7AC;&#xB294; &#xB2E8;&#xC21C;&#xD558;&#xAC8C; ACL &#xC744; &#xD1B5;&#xD574; &#xC811;&#xADFC;&#xC744; &#xC81C;&#xD55C;&#xD558;&#xACE0; &#xC788;&#xB2E4;. &#xD558;&#xC9C0;&#xB9CC; &#xCD5C;&#xB300;&#xD55C; &#xACA9;&#xB9AC;&#xAC00; &#xD544;&#xC694;&#xD55C; &#xD658;&#xACBD;&#xC5D0;&#xC11C;&#xB294; &#xC11C;&#xB85C; &#xB2E4;&#xB978; &#xB124;&#xD2B8;&#xC6CC;&#xD06C;&#xB97C; &#xBB36;&#xC5B4;&#xC57C;&#xD560;&#xD150;&#xB370; &#xC774;&#xC5D0; &#xB300;&#xD574;&#xC11C; &#xC9C0;&#xC2DD;&#xC774; &#xC804;&#xBB34;&#xD558;&#xC5EC; &#xC5B4;&#xB5BB;&#xAC8C; &#xD574;&#xC57C;&#xD560; &#xC9C0; &#xBAB0;&#xB790;&#xB2E4;. &#xC544;&#xB9C8; site-to-site VPN &#xAC19;&#xC740; &#xC11C;&#xBE44;&#xC2A4;&#xB97C; Cloud &#xC81C;&#xACF5; &#xC5C5;&#xCCB4;&#xC5D0;&#xC11C; &#xC81C;&#xACF5;&#xD558;&#xB294; &#xAC83;&#xC73C;&#xB85C; &#xC54C;&#xACE0; &#xC788;&#xB294;&#xB370; &#xC870;&#xAE08; &#xB354; &#xCC3E;&#xC544;&#xBD10;&#xC57C;&#xD560; &#xAC83; &#xAC19;&#xB2E4;.</p><p>&#xC774;&#xBC88;&#xC5D0; &#xC0AC;&#xC6A9;&#xD55C; &#xD234;&#xB4E4;&#xC5D0; &#xB300;&#xD574;&#xC11C; &#xAC01;&#xAC01; &#xACF5;&#xBD80;&#xD574;&#xBCFC;&#xB9CC;&#xD55C; &#xAC83;&#xC774; &#xAF64; &#xB9CE;&#xB2E4;. &#xD604;&#xC7AC;&#xB294; &#xB2E8;&#xC21C;&#xD558;&#xAC8C; &#xD234;&#xC758; &#xC870;&#xD569;&#xC744; &#xB9DE;&#xCD98; &#xAC83;&#xC774;&#xC9C0;&#xB9CC;, &#xC774;&#xD6C4; &#xBC31;&#xC5D4;&#xB4DC; &#xC11C;&#xBC84;&#xB97C; &#xAD6C;&#xC131;&#xD558;&#xAC70;&#xB098; &#xD55C;&#xB2E4;&#xBA74; &#xB0B4;&#xAE30; &#xD544;&#xC694;&#xD55C; &#xBAA8;&#xB2C8;&#xD130;&#xB9C1; &#xC694;&#xC18C;&#xB97C; &#xAD00;&#xCC30; &#xD560; &#xC218; &#xC788;&#xB3C4;&#xB85D; &#xB9CC;&#xB4E4;&#xC5B4;&#xC57C;&#xD560; &#xAC83;&#xC774;&#xB2E4;. &#xC801;&#xC5B4;&#xB3C4;, prometheus &#xC5D0; &#xB300;&#xD574;&#xC11C;&#xB294; &#xAE4A;&#xAC8C; &#xC9DA;&#xACE0; &#xB118;&#xC5B4;&#xAC08; &#xD544;&#xC694;&#xB294; &#xC788;&#xC5B4;&#xBCF4;&#xC778;&#xB2E4;.</p><p>&#xACB0;&#xACFC;&#xC801;&#xC73C;&#xB85C; &#xD604;&#xC7AC; &#xB098;&#xC758; &#xBAA8;&#xB2C8;&#xD130;&#xB9C1; &#xAD6C;&#xC870;&#xB294; &#xC544;&#xB798;&#xC640; &#xAC19;&#xC774; &#xB418;&#xC5C8;&#xB2E4;. </p><figure class="kg-card kg-image-card"><img src="https://life.photogrammer.me/content/images/2024/07/image-3.png" class="kg-image" alt="&#xD648; &#xC11C;&#xBC84; &#xBAA8;&#xB2C8;&#xD130;&#xB9C1; &#xC2DC;&#xC2A4;&#xD15C; Oracle Cloud &#xB85C; &#xC774;&#xC804;&#xD558;&#xAE30; (2)" loading="lazy" width="2000" height="1250" srcset="https://life.photogrammer.me/content/images/size/w600/2024/07/image-3.png 600w, https://life.photogrammer.me/content/images/size/w1000/2024/07/image-3.png 1000w, https://life.photogrammer.me/content/images/size/w1600/2024/07/image-3.png 1600w, https://life.photogrammer.me/content/images/2024/07/image-3.png 2000w" sizes="(min-width: 720px) 720px"></figure>]]></content:encoded></item><item><title><![CDATA[홈 서버 모니터링 시스템 Oracle Cloud 로 이전하기 (1)]]></title><description><![CDATA[ 서버가 터졌는데 4시간 후에야 알았다..!  클라우드로 모니터링 서버를 옮겨보자.]]></description><link>https://life.photogrammer.me/migration-monitoring-system-to-oracle-cloud-1/</link><guid isPermaLink="false">667dd471eea4f8000160af90</guid><category><![CDATA[Server]]></category><category><![CDATA[Development]]></category><dc:creator><![CDATA[Sungjun Park]]></dc:creator><pubDate>Sat, 29 Jun 2024 19:17:05 GMT</pubDate><media:content url="https://life.photogrammer.me/content/images/2024/06/SC-2024-06-30-at-4.13.00-AM-2.jpg" medium="image"/><content:encoded><![CDATA[<img src="https://life.photogrammer.me/content/images/2024/06/SC-2024-06-30-at-4.13.00-AM-2.jpg" alt="&#xD648; &#xC11C;&#xBC84; &#xBAA8;&#xB2C8;&#xD130;&#xB9C1; &#xC2DC;&#xC2A4;&#xD15C; Oracle Cloud &#xB85C; &#xC774;&#xC804;&#xD558;&#xAE30; (1)"><p></p><h2 id="%EB%B0%B0%EA%B2%BD">&#xBC30;&#xACBD;</h2><ul><li>&#xC544;&#xCC14;&#xD55C; &#xC77C;&#xC774; &#xC788;&#xC5C8;&#xB2E4;. &#xBA74;&#xC811;&#xC744; &#xBCF4;&#xB294; &#xB2F9;&#xC77C;&#xC5D0; &#xAC11;&#xC791;&#xC2A4;&#xB808; &#xC9D1;&#xC5D0; &#xC788;&#xB294; &#xC11C;&#xBC84;&#xAC00; &#xB2E4;&#xC6B4;&#xC774; &#xB418;&#xC5C8;&#xB2E4;. &#xC774;&#xB97C; &#xC778;&#xC9C0;&#xD55C; &#xAC83;&#xC740; &#xC2E4;&#xC81C;&#xB85C; &#xC11C;&#xBC84;&#xAC00; &#xB2E4;&#xC6B4;&#xB418;&#xACE0; 4&#xC2DC;&#xAC04;&#xC774;&#xB098; &#xC9C0;&#xB09C; &#xC774;&#xD6C4;&#xC600;&#xB2E4;. &#xB2E4;&#xD589;&#xD788; &#xBA74;&#xC811; &#xACFC;&#xC815;&#xC5D0;&#xC11C; &#xC9C1;&#xC811; &#xC11C;&#xBC84;&#xC5D0; &#xC811;&#xC18D;&#xD558;&#xAC70;&#xB098; &#xD558;&#xB294; &#xC77C;&#xC740; &#xC5C6;&#xC5C8;&#xC9C0;&#xB9CC;, &#xC644;&#xC804;&#xD788; &#xC190;&#xC744; &#xB308; &#xC218; &#xC5C6;&#xB294; &#xC0C1;&#xD669;&#xC774; &#xB418;&#xC5B4; &#xC0C1;&#xB2F9;&#xD788; &#xB2F9;&#xD669;&#xC2A4;&#xB7EC;&#xC6E0;&#xB2E4;.</li></ul><figure class="kg-card kg-image-card"><img src="https://life.photogrammer.me/content/images/2024/06/image-4.png" class="kg-image" alt="&#xD648; &#xC11C;&#xBC84; &#xBAA8;&#xB2C8;&#xD130;&#xB9C1; &#xC2DC;&#xC2A4;&#xD15C; Oracle Cloud &#xB85C; &#xC774;&#xC804;&#xD558;&#xAE30; (1)" loading="lazy" width="2000" height="1354" srcset="https://life.photogrammer.me/content/images/size/w600/2024/06/image-4.png 600w, https://life.photogrammer.me/content/images/size/w1000/2024/06/image-4.png 1000w, https://life.photogrammer.me/content/images/size/w1600/2024/06/image-4.png 1600w, https://life.photogrammer.me/content/images/2024/06/image-4.png 2000w" sizes="(min-width: 720px) 720px"></figure><ul><li>&#xAE30;&#xC874; &#xC11C;&#xBC84;&#xC758; &#xACBD;&#xC6B0; &#xC704;&#xC640; &#xAC19;&#xC740; &#xAD6C;&#xC870;&#xB97C; &#xCDE8;&#xD558;&#xACE0; &#xC788;&#xB294;&#xB370;,  &#xB0B4;&#xBD80;&#xB9DD; &#xAD00;&#xB9AC; &#xBC0F; &#xBAA8;&#xB2C8;&#xD130;&#xB9C1;&#xACFC; &#xC2E4;&#xC81C; &#xC11C;&#xBE44;&#xC2A4; &#xD30C;&#xD2B8;&#xB97C; &#xB098;&#xB204;&#xACE0; &#xC788;&#xC744; &#xBFD0;&#xC774;&#xB2E4;.</li><li>&#xD604;&#xC7AC; &#xC0C1;&#xD0DC;&#xC5D0;&#xC11C;&#xB294; &#xC5EC;&#xB7EC;&#xAC00;&#xC9C0; &#xBB38;&#xC81C; &#xC0C1;&#xD669;&#xC774; &#xBC1C;&#xC0DD;&#xD560; &#xC218; &#xC788;&#xB2E4;.<ul><li>&#xC11C;&#xBE44;&#xC2A4; &#xC11C;&#xBC84;&#xAC00; &#xBED7;&#xB294; &#xACBD;&#xC6B0;<ul><li>&#xC11C;&#xBE44;&#xC2A4; &#xC811;&#xC18D; &#xBD88;&#xB2A5;&#xC73C;&#xB85C; &#xC774;&#xC5B4;&#xC9D0;.</li><li>&#xD574;&#xB2F9; &#xACBD;&#xC6B0;&#xC5D0;&#xB294; &#xC11C;&#xBC84;&#xAC00; &#xB2E4;&#xC6B4; &#xB41C; &#xAC83;&#xC744; &#xC778;&#xC9C0;&#xD558;&#xAE30;&#xB9CC; &#xD558;&#xBA74;, &#xC6D0;&#xACA9;&#xC73C;&#xB85C; &#xC7AC;&#xBD80;&#xD305; / &#xC7AC;&#xC124;&#xC815;&#xC774; &#xAC00;&#xB2A5;&#xD558;&#xB2E4;.</li></ul></li><li>&#xBAA8;&#xB2C8;&#xD130;&#xB9C1; &#xC11C;&#xBC84;&#xAC00; &#xBED7;&#xB294; &#xACBD;&#xC6B0;<ul><li>&#xBAA8;&#xB2C8;&#xD130;&#xB9C1;&#xC774; &#xC911;&#xB2E8;&#xB418;&#xACE0;, &#xB0B4;&#xBD80; DNS &#xC11C;&#xBC84;&#xAC00; &#xC911;&#xC9C0;&#xB418;&#xC5B4; &#xB0B4;&#xBD80; &#xB9DD; &#xC811;&#xC18D;&#xC5D0;&#xC11C; &#xBB38;&#xC81C;&#xAC00; &#xBC1C;&#xC0DD;&#xD560; &#xC218; &#xC788;&#xC74C;.</li><li>&#xB77C;&#xC6B0;&#xD130;&#xAC00; &#xB2E4;&#xC6B4;&#xB418;&#xC9C0; &#xC54A;&#xC558;&#xB2E4;&#xB294; &#xAC00;&#xC815; &#xD558;&#xC5D0;, &#xC7AC;&#xBD80;&#xD305; &#xBC0F; &#xC7AC;&#xC124;&#xC815;&#xC740; &#xAC00;&#xB2A5;&#xD568;.</li></ul></li><li>&#xC11C;&#xBC84; &#xB77C;&#xC6B0;&#xD130;, &#xD639;&#xC740; WAN &#xC774; &#xB4E4;&#xC5B4;&#xC624;&#xB294; &#xCCAB; &#xBAA8;&#xB380;&#xCABD; &#xC2A4;&#xC704;&#xCE58;&#xAC00; &#xB2E4;&#xC6B4;&#xB418;&#xB294; &#xACBD;&#xC6B0;<ul><li>&#xC774; &#xCF00;&#xC774;&#xC2A4;&#xB85C; &#xC778;&#xD574;&#xC11C; &#xC774;&#xBC88;&#xC5D0; &#xC11C;&#xBC84;&#xAC00; &#xC644;&#xC804;&#xD788; &#xC811;&#xC18D; &#xBD88;&#xAC00;&#xD558;&#xC600;&#xC74C;.</li><li>&#xC678;&#xBD80;&#xC5D0;&#xC11C; &#xC811;&#xC18D;&#xD560; &#xC218;&#xB2E8;&#xC774; &#xC544;&#xC608; &#xC874;&#xC7AC;&#xD558;&#xC9C0; &#xC54A;&#xC73C;&#xBBC0;&#xB85C;, &#xC6D0;&#xACA9;&#xC73C;&#xB85C; &#xCC98;&#xB9AC;&#xD560; &#xC218; &#xC788;&#xB294; &#xBC29;&#xC548;&#xC774; &#xC874;&#xC7AC;&#xD558;&#xC9C0; &#xC54A;&#xC74C;.</li><li>&#xC801;&#xC5B4;&#xB3C4; &#xC11C;&#xBE44;&#xC2A4;&#xAC00; &#xC911;&#xB2E8;&#xB418;&#xC5C8;&#xB2E4;&#xB294; &#xC0AC;&#xC2E4;&#xC740; &#xC778;&#xC9C0;&#xD560; &#xD544;&#xC694;&#xAC00; &#xC788;&#xC74C;.</li></ul></li></ul></li></ul><h2 id="%ED%95%B4%EA%B2%B0-%EB%B0%A9%EC%95%88-%EB%AA%A8%EC%83%89">&#xD574;&#xACB0; &#xBC29;&#xC548; &#xBAA8;&#xC0C9;</h2><ul><li>&#xC774;&#xBC88;&#xC5D0; &#xBC1C;&#xC0DD;&#xD55C; &#xBB38;&#xC81C;&#xB294; &quot;&#xC678;&#xBD80;&#xC5D0;&#xC11C; &#xC644;&#xC804;&#xD788; &#xB300;&#xC751;&#xC774; &#xBD88;&#xAC00;&#xB2A5;&#xD55C;&quot; &#xC0C1;&#xD669;&#xC774;&#xC5C8;&#xB2E4;.</li><li>&#xC774;&#xC0C1;&#xC801;&#xC73C;&#xB85C;&#xB294; &#xC678;&#xBD80;&#xC5D0; &#xB2E4;&#xB978; &#xD074;&#xB7EC;&#xC2A4;&#xD130;&#xB97C; &#xAD6C;&#xCD95;&#xD558;&#xACE0; &#xC774;&#xC911;&#xD654;&#xB97C; &#xD568;&#xC73C;&#xB85C;&#xC11C; &#xD574;&#xACB0;&#xD558;&#xB294; &#xBC29;&#xBC95;&#xC774; &#xC788;&#xB2E4;. &#xADF8;&#xB7EC;&#xB098; &#xBE44;&#xC6A9;&#xC744; &#xC0DD;&#xAC01;&#xD558;&#xBA74; &#xD569;&#xB9AC;&#xC801;&#xC774;&#xC9C0; &#xC54A;&#xB2E4;.<ul><ul><li>Proxmox Cluster &#xB85C; &#xCD94;&#xAC00; &#xAD6C;&#xC131;&#xD558;&#xB294; &#xACBD;&#xC6B0;&#xC5D0;&#xB294; &#xC11C;&#xBC84; &#xAD6C;&#xCD95; &#xBE44;&#xC6A9;&#xC774; &#xCD94;&#xAC00;&#xB85C; &#xBC1C;&#xC0DD;&#xD55C;&#xB2E4;. &#xD55C; &#xB450;&#xD47C;&#xC774; &#xC544;&#xB2C8;&#xB77C;&#xC11C; &#xC81C;&#xC678;&#xD55C;&#xB2E4;.</li><li>&#xD074;&#xB77C;&#xC6B0;&#xB4DC;&#xC758; &#xBB34;&#xB8CC; &#xC11C;&#xBE44;&#xC2A4;&#xB97C; &#xD65C;&#xC6A9;&#xD574;&#xBCF4;&#xB294; &#xAC83;&#xB3C4; &#xACE0;&#xB824;&#xD574;&#xBCF4;&#xC790;.</li></ul></ul></li><li>&#xC644;&#xC804;&#xD788; &#xC11C;&#xBC84;&#xAC00; &#xB2E4;&#xC6B4;&#xC774; &#xB418;&#xB294; &#xACBD;&#xC6B0;&#xC5D0; &#xB300;&#xD574;&#xC11C;&#xB294; &#xB300;&#xC751;&#xC740; &#xD558;&#xC9C0; &#xBABB;&#xD558;&#xB354;&#xB77C;&#xB3C4; &#xC801;&#xC5B4;&#xB3C4; &#xC11C;&#xBC84;&#xAC00; &#xB2E4;&#xC6B4;&#xB418;&#xC5C8;&#xB2E4;&#xB294; &#xC0AC;&#xC2E4;&#xC740; &#xC778;&#xC9C0;&#xD574;&#xC57C;&#xD55C;&#xB2E4;. &#xB530;&#xB77C;&#xC11C;, &#xAC01; &#xC11C;&#xBC84;&#xC5D0; &#xB300;&#xD574;&#xC11C; health check &#xB97C; &#xC678;&#xBD80;&#xC5D0;&#xC11C; &#xD560; &#xC218; &#xC788;&#xB3C4;&#xB85D; &#xD558;&#xACE0;, &#xBB38;&#xC81C;&#xAC00; &#xBC1C;&#xC0DD;&#xD55C; &#xACBD;&#xC6B0; &#xC54C;&#xB9BC;&#xC744; &#xBC1B;&#xC744; &#xC218; &#xC788;&#xB3C4;&#xB85D; &#xD558;&#xB824;&#xACE0; &#xD55C;&#xB2E4;.</li><li>&#xC548;&#xC815;&#xC131;&#xC774; &#xCD5C;&#xC6B0;&#xC120;&#xC774;&#xBBC0;&#xB85C;, &#xC774;&#xB294; &#xC678;&#xBD80; &#xD074;&#xB77C;&#xC6B0;&#xB4DC;&#xB97C; &#xD1B5;&#xD558;&#xB294; &#xAC83;&#xC774; &#xC801;&#xC808;&#xD558;&#xB2E4;.</li><li>&#xAC00;&#xB2A5;&#xD558;&#xB2E4;&#xBA74;, &#xC774;&#xC911;&#xD654;&#xB3C4; &#xACE0;&#xB824;&#xD574;&#xBCF8;&#xB2E4;.</li></ul><h2 id="%ED%81%B4%EB%9D%BC%EC%9A%B0%EB%93%9C-%EC%84%A0%EC%A0%95">&#xD074;&#xB77C;&#xC6B0;&#xB4DC; &#xC120;&#xC815;</h2><ul><li>&#xD074;&#xB77C;&#xC6B0;&#xB4DC; &#xC120;&#xC815;&#xC5D0;&#xC11C; &#xAC00;&#xC7A5; &#xC911;&#xC694;&#xD55C; &#xAC83;&#xC740; &#xBE44;&#xC6A9;&#xC774;&#xB2E4;.<ul><li>&#xC131;&#xB2A5;&#xC758; &#xACBD;&#xC6B0; &#xAD00;&#xB9AC;&#xD558;&#xB294; &#xC11C;&#xBC84;&#xAC00; &#xB9CE;&#xC9C0; &#xC54A;&#xACE0; &#xACE0;&#xBD80;&#xD558; &#xC791;&#xC5C5;&#xC774; &#xC874;&#xC7AC;&#xD558;&#xC9C0; &#xC54A;&#xAE30;&#xC5D0; &#xD06C;&#xAC8C; &#xACE0;&#xB824;&#xD558;&#xC9C0; &#xC54A;&#xB294;&#xB2E4;.</li></ul></li></ul><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://hoing.io/archives/10446"><div class="kg-bookmark-content"><div class="kg-bookmark-title">&#xD074;&#xB77C;&#xC6B0;&#xB4DC;(Cloud) &#xD504;&#xB9AC;&#xD2F0;&#xC5B4; &#xBE44;&#xAD50; - &#xC11C;&#xBE44;&#xC2A4; &#xBC0F; &#xC2A4;&#xD399; &#xBE44;&#xAD50; - &#xC0C1;&#xC2DC; &#xBB34;&#xB8CC; &#xBE44;&#xAD50;</div><div class="kg-bookmark-description">&#xD074;&#xB77C;&#xC6B0;&#xB4DC; &#xD504;&#xB9AC;&#xD2F0;&#xC5B4; &#xC774;&#xBC88;&#xC5D0;&#xB294; &#xAC01; 4&#xAC1C; &#xD68C;&#xC0AC;&#xC758; &#xD074;&#xB77C;&#xC6B0;&#xB4DC; &#xD504;&#xB9AC;&#xD2F0;&#xC5B4; &#xC11C;&#xBE44;&#xC2A4; &#xC911; &#xAE30;&#xBCF8;&#xC778; &#xCEF4;&#xD4E8;&#xD2B8;(VM) &#xC2A4;&#xD399; &#xC911;&#xC810;&#xC73C;&#xB85C; &#xBE44;&#xAD50; &#xD655;&#xC778; &#xD574;&#xBCF4;&#xB3C4;&#xB85D; &#xD558;&#xACA0;&#xC2B5;&#xB2C8;&#xB2E4;. &#xD074;&#xB77C;&#xC6B0;&#xB4DC; &#xD68C;&#xC0AC;&#xC5D0;&#xC11C;&#xB294; &#xC5EC;&#xB7EC;&#xAC00;&#xC9C0; &#xC720;&#xD615;&#xC73C;&#xB85C; &#xB9DB;&#xBCF4;&#xAE30; &#xC11C;&#xBE44;&#xC2A4; &#xD615;&#xD0DC;&#xC778; &#xD504;&#xB9AC;&#xD2F0;&#xC5B4; &#xC11C;&#xBE44;&#xC2A4; &#xB97C; &#xD558;&#xACE0; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;. &#xD504;&#xB9AC;&#xD2F0;&#xC5B4; &#xC81C;&#xACF5; &#xB0B4;&#xC5ED; &#xD504;&#xB9AC;&#xD2F0;&#xC5B4; &#xC548;&#xC5D0;&#xB294; &#xC138;&#xBD80;&#xC801;&#xC73C;&#xB85C; &#xD06C;&#xAC8C; &#xC0C1;&#xC2DC; &#xBB34;&#xB8CC; &#xC640; &#xAE30;&#xAC04;&#xC81C; &#xBB34;&#xB8CC; &#xADF8;&#xB9AC;&#xACE0; &#xD06C;&#xB808;&#xB527; &#xC81C;&#xACF5; &#xD615;&#xD0DC;&#xB85C; &#xAD6C;&#xBD84; &#xB429;&#xB2C8;&#xB2E4;. - &#xAE30;&#xAC04;&#xC81C; &#xBB34;&#xB8CC;&#xB294; &#xD2B9;&#xC815; &#xAE30;&#xAC04;&#xC5D0;&#xC11C;</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://hoing.io/storage/fbrfg/safari-pinned-tab.svg" alt="&#xD648; &#xC11C;&#xBC84; &#xBAA8;&#xB2C8;&#xD130;&#xB9C1; &#xC2DC;&#xC2A4;&#xD15C; Oracle Cloud &#xB85C; &#xC774;&#xC804;&#xD558;&#xAE30; (1)"><span class="kg-bookmark-author">Hoing</span><span class="kg-bookmark-publisher">Jade(&#xC815;&#xD604;&#xD638;)</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://hoing.io/storage/2021/03/Cloud_Logo_4.png" alt="&#xD648; &#xC11C;&#xBC84; &#xBAA8;&#xB2C8;&#xD130;&#xB9C1; &#xC2DC;&#xC2A4;&#xD15C; Oracle Cloud &#xB85C; &#xC774;&#xC804;&#xD558;&#xAE30; (1)"></div></a></figure><ul><li>&#xB2E4;&#xB978; Cloud VM &#xD504;&#xB9AC;&#xD2F0;&#xC5B4;&#xC758; &#xACBD;&#xC6B0; &#xB300;&#xBD80;&#xBD84; &#xAE30;&#xAC04;&#xC758; &#xC81C;&#xD55C;&#xC774; &#xC788;&#xB2E4;. </li><li>&#xB7EC;&#xB2DD;&#xCEE4;&#xBE0C;&#xB97C; &#xC0DD;&#xAC01;&#xD558;&#xBA74;, &#xAE30;&#xC874;&#xC5D0; &#xC0AC;&#xC6A9;&#xD560; &#xC218; &#xC788;&#xB358; AWS &#xB97C; &#xC0AC;&#xC6A9;&#xD558;&#xB294; &#xAC83;&#xC774; &#xC88B;&#xC744; &#xC218; &#xC788;&#xB2E4;&#xB9CC; 1&#xB144;&#xC758; &#xD504;&#xB9AC;&#xD2F0;&#xC5B4; &#xC81C;&#xD55C;&#xC744; &#xC774;&#xBBF8; &#xB2E4; &#xC368;&#xBA39;&#xC5C8;&#xB2E4;. (&#xACC4;&#xC815;&#xC744; &#xC0C8;&#xB85C; &#xB9CC;&#xB4E4;&#xBA74; &#xB418;&#xAE30;&#xB294; &#xD568;) </li><li>&#xC624;&#xB77C;&#xD074;&#xC758; &#xACBD;&#xC6B0;&#xC5D0;&#xB294; ARM &#xC744; &#xC0AC;&#xC6A9;&#xD558;&#xB294; VM &#xC758; &#xACBD;&#xC6B0; &#xBB34;&#xB8CC;&#xB85C; &#xC0AC;&#xC6A9;&#xC774; &#xAC00;&#xB2A5;&#xD558;&#xB2E4;.<ul><li>&#xAF64; &#xB9E4;&#xB825;&#xC801;&#xC778; &#xC870;&#xAC74;&#xC774;&#xB2E4;.</li><li>ARM 4 core / 24GB or 1GB / 6GB *4 VM &#xC774; &#xAC00;&#xB2A5;&#xD558;&#xB2E4;.</li><li>Oracle DB (10GB &#xC815;&#xB3C4;) &#xC0AC;&#xC6A9;&#xC774; &#xAC00;&#xB2A5;&#xD558;&#xB2E4;.</li><li>Object Storage 10GB &#xB3C4; &#xC0AC;&#xC6A9;&#xC774; &#xAC00;&#xB2A5;&#xD558;&#xB2E4;.</li><li>&#xAC00;&#xC7A5; &#xB180;&#xB77C;&#xC6B4;&#xAC74; &quot;&#xD3C9;&#xC0DD; &#xBB34;&#xB8CC;&quot; &#xB77C;&#xB294; &#xC810;&#xC774;&#xB2E4;.<ul><li>&#xC5B8;&#xC820;&#xAC00;&#xB294; &#xB9C9;&#xD790;&#xC9C0;&#xB3C4; &#xBAA8;&#xB974;&#xACA0;&#xC9C0;&#xB9CC;...?</li></ul></li></ul></li></ul><h2 id="%EC%98%A4%EB%9D%BC%ED%81%B4-%ED%81%B4%EB%9D%BC%EC%9A%B0%EB%93%9C-%EC%82%BD%EC%A7%88%EA%B8%B0">&#xC624;&#xB77C;&#xD074; &#xD074;&#xB77C;&#xC6B0;&#xB4DC; &#xC0BD;&#xC9C8;&#xAE30;</h2><h3 id="free-tier-vm-instance-%EB%A7%8C%EB%93%A4%EA%B8%B0">Free-tier VM Instance &#xB9CC;&#xB4E4;&#xAE30;</h3><ul><li>&#xC774;&#xAC8C; &#xC0BD;&#xC9C8;&#xC774; &#xB420; &#xC904;&#xC740; &#xBAB0;&#xB790;&#xB2E4;...</li><li>&#xC624;&#xB77C;&#xD074; &#xD074;&#xB77C;&#xC6B0;&#xB4DC;&#xB294; &#xD504;&#xB9AC;&#xD2F0;&#xC5B4;&#xB97C; &#xC81C;&#xACF5;&#xD558;&#xAE30;&#xB294; &#xD558;&#xB098;, &#xC774; &#xC0AC;&#xC6A9;&#xB7C9;&#xC774; &#xC81C;&#xD55C;&#xB418;&#xC5B4;&#xC788;&#xB2E4;.<ul><li>&#xC774; &#xC18C;&#xC2DD;&#xC744; &#xB4E3;&#xACE0; &#xB2E4;&#xB978; &#xD648; &#xB9AC;&#xC804;(&#xC2F1;&#xAC00;&#xD3F4;)&#xC5D0; &#xC9C0;&#xC815;&#xD558;&#xC5EC; &#xB9CC;&#xB4E4;&#xC5C8;&#xB2E4;. &#xADF8;&#xB7EC;&#xB098; &#xC2F1;&#xAC00;&#xD3F4; &#xB9AC;&#xC804;&#xB3C4; &#xD3EC;&#xD654; &#xC0C1;&#xD0DC;&#xC774;&#xB2E4;. &#xAD1C;&#xD788; &#xC4F8;&#xB370;&#xC5C6;&#xC774; &#xBA3C; &#xACF3;&#xC5D0; &#xB3D9;&#xB85D;&#xD588;&#xB2E4;(...) &#xB354;&#xAD70;&#xB2E4;&#xB098; &#xC624;&#xB77C;&#xD074; &#xD074;&#xB77C;&#xC6B0;&#xB4DC;&#xC758; &#xACBD;&#xC6B0; &#xACC4;&#xC815; &#xC7AC;&#xC0DD;&#xC131;&#xC774; &#xC5B4;&#xB835;&#xB2E4;. <ul><li>&#xC0C8;&#xB85C; &#xACC4;&#xC815;&#xC744; &#xD30C;&#xB354;&#xB77C;&#xB3C4; &#xAE30;&#xC874;&#xC5D0; &#xC0AC;&#xC6A9;&#xD55C; &#xCE74;&#xB4DC; &#xBC88;&#xD638;&#xB97C; &#xC0AC;&#xC6A9;&#xD560; &#xACBD;&#xC6B0; &#xACC4;&#xC815; &#xBE14;&#xB77D;&#xC774; &#xB418;&#xAC70;&#xB098; &#xC544;&#xC608; &#xC0DD;&#xC131;&#xC774; &#xB418;&#xC9C0; &#xC54A;&#xC744; &#xC218; &#xC788;&#xB2E4;. (AWS &#xAC00; &#xBC8C;&#xC368; &#xADF8;&#xB9AC;&#xC6CC;&#xC9C4;&#xB2E4;.)</li><li>&#xBAA8;&#xB2C8;&#xD130;&#xB9C1;&#xC6A9;&#xC73C;&#xB85C; &#xAD6C;&#xC131;&#xD558;&#xB294; &#xC11C;&#xBC84;&#xC774;&#xAE30;&#xC5D0; &#xC6B0;&#xC120;&#xC740; &#xC2E0;&#xACBD;&#xC744; &#xB044;&#xB3C4;&#xB85D; &#xD558;&#xB824;&#xACE0; &#xD55C;&#xB2E4;. &#xC2E4;&#xC81C; &#xC11C;&#xBE44;&#xC2A4;&#xB97C; &#xC62C;&#xB9AC;&#xB294; &#xACBD;&#xC6B0;&#xB294; &#xC544;&#xC9C1; &#xC5C6;&#xACE0;, &#xC788;&#xB354;&#xB77C;&#xB3C4; &#xC774;&#xC911;&#xD654; &#xBAA9;&#xC801;&#xC73C;&#xB85C; &#xC0AC;&#xC6A9;&#xD560; &#xAC83;&#xC774;&#xB2E4;.</li></ul></li></ul></li><li>&#xD504;&#xB9AC;&#xD2F0;&#xC5B4; &#xACC4;&#xC815;&#xC5D0;&#xC11C;&#xB9CC; &#xC0DD;&#xC131;&#xC774; &#xB418;&#xC9C0; &#xC54A;&#xB294; &#xAC83;&#xC774;&#xAE30; &#xB54C;&#xBB38;&#xC5D0; &#xC720;&#xB8CC; &#xACC4;&#xC815;&#xC73C;&#xB85C; &#xC804;&#xD658;&#xD588;&#xB2E4;<ul><li>&#xC9C0;&#xAE09; &#xAC80;&#xC0AC;&#xB85C; 100&#xBD88; &#xC815;&#xB3C4; &#xC18C;&#xC694;&#xAC00; &#xB418;&#xC5C8;&#xB2E4;. </li><li>&#xC77C;&#xBC18;&#xC801;&#xC73C;&#xB85C; &#xC774;&#xAC83;&#xB3C4; &#xBC14;&#xB85C;&#xBC14;&#xB85C; &#xCDE8;&#xC18C;&#xB418;&#xB294; &#xD3B8;&#xC778;&#xB370;, &#xC660;&#xAC78; &#xBC14;&#xB85C; &#xCDE8;&#xC18C;&#xAC00; &#xB418;&#xC9C0; &#xC54A;&#xC544; &#xB2F9;&#xD669;&#xD588;&#xB2E4;. (&#xC544;&#xC9C1;&#xB3C4; &#xC548;&#xB410;&#xB2E4;...)</li><li>&#xCE74;&#xB4DC; &#xACB0;&#xC81C; &#xBFD0; &#xB9CC;&#xC544;&#xB2C8;&#xB77C;, &#xACC4;&#xC815; &#xC5C5;&#xADF8;&#xB808;&#xC774;&#xB4DC;&#xB3C4; &#xC2DC;&#xAC04;&#xC774; &#xC18C;&#xC694;&#xB41C;&#xB2E4;. (&#xB3C8; &#xC8FC;&#xACE0; &#xC4F4;&#xB2E4;&#xB294;&#xB370; &#xB300;&#xCCB4; &#xC65C; &#xC774;&#xB7EC;&#xB294;&#xC9C0; &#xC774;&#xD574;&#xD560; &#xC218;&#xAC00; &#xC5C6;&#xB2E4;.) <ul><li>&#xACC4;&#xC815; &#xC5C5;&#xADF8;&#xB808;&#xC774;&#xB4DC;&#xB294; &#xBE60;&#xB974;&#xBA74; 30&#xBD84; &#xAE38;&#xBA74; &#xC77C;&#xC8FC;&#xC77C; &#xC815;&#xB3C4; &#xC18C;&#xC694;&#xB41C;&#xB2E4;. &#xB098;&#xB294; &#xC57D; 3&#xC2DC;&#xAC04; &#xC815;&#xB3C4;&#xC758; &#xC2DC;&#xAC04;&#xC774; &#xC18C;&#xC694;&#xB410;&#xB2E4;.</li></ul></li></ul></li><li>&#xC720;&#xB8CC; &#xACC4;&#xC815;&#xC73C;&#xB85C; &#xC804;&#xD658;&#xD55C; &#xB4A4;, &#xC815;&#xC0C1;&#xC801;&#xC73C;&#xB85C; &#xC778;&#xC2A4;&#xD134;&#xC2A4;&#xB97C; &#xC0DD;&#xC131;&#xD560; &#xC218; &#xC788;&#xC5C8;&#xB2E4;. &#xC6B0;&#xC120; &#xB9CC;&#xB4E0; &#xC778;&#xC2A4;&#xD134;&#xC2A4;&#xB294; ARM 2 core / 12G RAM &#xC774;&#xB2E4;.</li><li>SSH &#xC811;&#xC18D;&#xC758; &#xACBD;&#xC6B0;, &#xCCAB; &#xC0DD;&#xC131; &#xACFC;&#xC815;&#xC5D0;&#xC11C; &#xC5BB;&#xC740; private key&#xB97C; &#xD1B5;&#xD574; &#xC811;&#xC18D;&#xD560; &#xC218; &#xC788;&#xC5C8;&#xB2E4;.</li><li>&#xC774;&#xD6C4; &#xACE0;&#xC815; IP &#xD560;&#xB2F9;&#xC744; &#xD574;&#xC92C;&#xB2E4;.<ul><li>Reserved IP &#xC124;&#xC815; &#xC5C5;&#xB370;&#xC774;&#xD2B8;&#xAC00; &#xBC14;&#xB85C; &#xB418;&#xC9C0; &#xC54A;&#xB294;&#xB370;, &#xAE30;&#xB2E4;&#xB9AC;&#xBA74; &#xB41C;&#xB2E4;.</li></ul></li></ul><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://boring-notes.tistory.com/entry/OCI-%EC%98%A4%EB%9D%BC%ED%81%B4-%ED%81%B4%EB%9D%BC%EC%9A%B0%EB%93%9C-2-%EC%99%B8%EB%B6%80%EC%A0%91%EC%86%8D-%EC%84%A4%EC%A0%95"><div class="kg-bookmark-content"><div class="kg-bookmark-title">[OCI] &#xC624;&#xB77C;&#xD074; &#xD074;&#xB77C;&#xC6B0;&#xB4DC; - 2. &#xACE0;&#xC815; IP &#xC124;&#xC815;</div><div class="kg-bookmark-description">&#xC624;&#xB77C;&#xD074; &#xD074;&#xB77C;&#xC6B0;&#xB4DC;&#xC5D0; VM&#xC744; &#xC0DD;&#xC131;&#xD558;&#xBA74; &#xC784;&#xC2DC; IP&#xAC00; &#xBC30;&#xC815;&#xC774; &#xB418;&#xB294;&#xB370; &#xC678;&#xBD80;&#xC5D0;&#xC11C; &#xC811;&#xADFC;&#xD558;&#xAE30; &#xC704;&#xD574;&#xC11C;&#xB294; &#xACE0;&#xC815;IP&#xB97C; &#xC124;&#xC815;&#xD574; &#xC8FC;&#xC5B4;&#xC57C; &#xD55C;&#xB2E4; 1. &#xACE0;&#xC815;IP &#xC608;&#xC57D; &#xC124;&#xC815; OCI&#xC5D0;&#xC11C; &#xBA3C;&#xC800; &#xACE0;&#xC815;IP&#xB97C; &#xC608;&#xC57D;&#xD558;&#xC790; &#xC544;&#xB798;&#xC640; &#xAC19;&#xC774; OCI &#xBA54;&#xB274;&#xC5D0;&#xC11C; Networking &#x2192; IP Management &#x2192; Reserved Public IPs &#xB85C; &#xC811;&#xC18D;&#xD55C;&#xD6C4; Reserve Public IP Address &#xBC84;&#xD2BC;&#xC744; &#xB20C;&#xB7EC; &#xACE0;&#xC815; IP&#xB97C; &#xC608;&#xC57D;&#xD558;&#xC790; Reserve Publlic IP Address &#xBA54;&#xB274;&#xB85C; &#xB4E4;&#xC5B4;&#xAC00;&#xBA74; &#xC544;&#xB798;&#xC640; &#xAC19;&#xC740; &#xCC3D;&#xC774; &#xB098;&#xC624;&#xB294;&#xB370; Reserved Public IP Address Name &#xC5D0; &#xC784;&#xC758;&#xC758; &#xC774;&#xB984;&#xC744; &#xC785;&#xB825;&#xD558;&#xACE0;, IP Address Source&#xC5D0;&#xC11C; Oracle&#xC744; &#xC120;&#xD0DD;&#xD55C; &#xD6C4; &#xC544;&#xB798;&#xCABD;&#xC5D0; Reserve Public IP Address &#xBC84;&#xD2BC;&#xC744; &#xD074;&#xB9AD;&#xD558;&#xBA74; &#xC544;&#xB798;&#xC640; &#xAC19;&#xC774; &#xC704;&#x2026;</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://t1.daumcdn.net/tistory_admin/top_v2/bi-tistory-favicon.svg" alt="&#xD648; &#xC11C;&#xBC84; &#xBAA8;&#xB2C8;&#xD130;&#xB9C1; &#xC2DC;&#xC2A4;&#xD15C; Oracle Cloud &#xB85C; &#xC774;&#xC804;&#xD558;&#xAE30; (1)"><span class="kg-bookmark-author">TISTORY</span><span class="kg-bookmark-publisher">&#xAE30;&#xC5B5;&#xB825;&#xC774; &#xC810;&#xC810; &#xB098;&#xBE60;&#xC9C4;&#xB2E4;</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://img1.daumcdn.net/thumb/R800x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fw4Ltl%2FbtrFqsJw1jF%2FVxuVEvMy2w55xg2zuhrcBk%2Fimg.png" alt="&#xD648; &#xC11C;&#xBC84; &#xBAA8;&#xB2C8;&#xD130;&#xB9C1; &#xC2DC;&#xC2A4;&#xD15C; Oracle Cloud &#xB85C; &#xC774;&#xC804;&#xD558;&#xAE30; (1)"></div></a></figure><h3 id="%EA%B8%B0%EB%B3%B8-%EC%84%A4%EC%A0%95">&#xAE30;&#xBCF8; &#xC124;&#xC815;</h3><ul><li>&#xCD08;&#xAE30;&#xC5D0;&#xB294; &#xC0AC;&#xC6A9;&#xC790;&#xAC00; ubuntu &#xB85C; &#xC9C0;&#xC815;&#xB418;&#xC5B4;&#xC788;&#xB2E4;. &#xBCF4;&#xC548;&#xC801;&#xC778; &#xC774;&#xC720;&#xB85C; &#xACC4;&#xC815;&#xBA85;&#xC744; &#xBCC0;&#xACBD;&#xD588;&#xB2E4;.</li></ul><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://blog.chnrit.com/oracle-ubuntu-account-configuration/"><div class="kg-bookmark-content"><div class="kg-bookmark-title">&#xC624;&#xB77C;&#xD074; &#xD074;&#xB77C;&#xC6B0;&#xB4DC; &#xC6B0;&#xBD84;&#xD22C; &#xACC4;&#xC815; &#xC124;&#xC815; &#xAC00;&#xC774;&#xB4DC; - &#xC774;&#xBD88;&#xC0C9; &#xD558;&#xB298;</div><div class="kg-bookmark-description">&#xACC4;&#xC815; &#xC774;&#xB984;&#xC744; &#xC0DD;&#xC131; &#xC804; &#xC815;&#xD560; &#xC218; &#xC788;&#xB294; Azure&#xC640; &#xB2EC;&#xB9AC; &#xC624;&#xB77C;&#xD074;, AWS (&#xD544;&#xC790;&#xB294; AWS&#xB97C; &#xC0AC;&#xC6A9;&#xD574;&#xBCF4;&#xC9C0; &#xC54A;&#xC558;&#xC9C0;&#xB9CC;) &#xB4F1;&#xC5D0;&#xC11C;&#xB294; &#xAC00;&#xC0C1; &#xCEF4;&#xD4E8;&#xD2B8; &#xC778;&#xC2A4;&#xD134;&#xC2A4;, &#xADF8;&#xB7EC;&#xB2C8;&#xAE4C; &#xC11C;&#xBC84;&#xB97C; &#xC0DD;&#xC131;&#xD560;&#xB54C; &#xC0AC;&#xC6A9;&#xC790; &#xC774;&#xB984;&#xC744; ubuntu&#xB85C; &#xBD80;&#xC5EC;&#xD574;&#xC900;&#xB2E4;. ssh ubuntu@ip -i ~/.ssh/id_rsa.pub &#xC77C;&#xB2E8; &#xC11C;&#xBC84;&#xB85C; ssh&#xC811;&#xC18D;&#xC744; &#xD55C;&#xB2E4;. sudo -i &#xC811;&#xC18D; &#xD6C4; &#xB8E8;&#xD2B8; &#xACC4;&#xC815;&#xC73C;&#xB85C; &#xB85C;&#xADF8;&#xC778;&#xD55C;&#xB2E4;. adduser user&#xB97C; &#xCD94;&#xAC00;&#xD55C;&#xB2E4;. &#xB294; &#xAF2D; &#xC790;&#xC2E0;&#xC774; &#xD558;&#xACE0; &#xC2F6;&#xC740; &#xC774;&#xB984;&#xC73C;&#xB85C; &#xBC14;&#xAFB8;&#xB3C4;&#xB85D; &#xD55C;&#xB2E4;. (&#xC608;: azureuser, ...) mkdir</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://blog.chnrit.com/wp-content/uploads/2021/07/cropped-Crit-official-1-270x270.png" alt="&#xD648; &#xC11C;&#xBC84; &#xBAA8;&#xB2C8;&#xD130;&#xB9C1; &#xC2DC;&#xC2A4;&#xD15C; Oracle Cloud &#xB85C; &#xC774;&#xC804;&#xD558;&#xAE30; (1)"><span class="kg-bookmark-author">&#xC774;&#xBD88;&#xC0C9; &#xD558;&#xB298; - Chnrit&#xC758; &#xBE14;&#xB85C;&#xADF8;</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://blog.chnrit.com/wp-content/uploads/2021/07/cropped-Crit-official-1.png" alt="&#xD648; &#xC11C;&#xBC84; &#xBAA8;&#xB2C8;&#xD130;&#xB9C1; &#xC2DC;&#xC2A4;&#xD15C; Oracle Cloud &#xB85C; &#xC774;&#xC804;&#xD558;&#xAE30; (1)"></div></a></figure><ul><li>&#xB124;&#xD2B8;&#xC6CC;&#xD06C; inbound / outbound &#xBCF4;&#xC548; &#xADDC;&#xCE59; &#xC124;&#xC815;&#xC774; &#xD544;&#xC694;&#xD558;&#xB2E4;. VCN (AWS &#xC758; VPC &#xAC00; &#xC5EC;&#xAE30;&#xC11C;&#xB294; VCN &#xC774;&#xB2E4;.) &#xC5D0;&#xC11C; &#xBCF4;&#xC548; &#xADDC;&#xCE59;&#xC744; &#xC124;&#xC815;&#xD55C;&#xB2E4;.</li></ul><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://yongc.tistory.com/62"><div class="kg-bookmark-content"><div class="kg-bookmark-title">Oracle Cloud&#xC5D0;&#xC11C; HTTP &#xD3EC;&#xD2B8; &#xC5F4;&#xAE30;</div><div class="kg-bookmark-description">Oracle Cloud&#xB97C; &#xC0AC;&#xC6A9;&#xD574;&#xC11C; &#xC6F9; &#xC11C;&#xBE44;&#xC2A4;&#xB97C; &#xB9CC;&#xB4E4;&#xACBD;&#xC6B0; &#xAE30;&#xBCF8;&#xC801;&#xC73C;&#xB85C; ICMP, SSH&#xB9CC; &#xC5F4;&#xC5B4;&#xB193;&#xAE30; &#xB54C;&#xBB38;&#xC5D0; HTTP, HTTPS &#xC694;&#xCCAD;&#xC740; &#xAC70;&#xBD80;&#xD558;&#xAC8C; &#xB429;&#xB2C8;&#xB2E4;. &#xC774;&#xB97C; &#xD574;&#xACB0;&#xD558;&#xAE30; &#xC704;&#xD574;&#xC11C; Oracle cloud&#xC5D0;&#xC11C; HTTP, HTTPS&#xB97C; &#xC81C;&#xACF5;&#xD558;&#xAE30; &#xC704;&#xD574; &#xD574;&#xB2F9; &#xD3EC;&#xD2B8;&#xB97C; &#xC5EC;&#xB294; &#xBC29;&#xBC95;&#xC744; &#xC815;&#xB9AC;&#xD574;&#xBCF4;&#xACA0;&#xC2B5;&#xB2C8;&#xB2E4;. &#xBA3C;&#xC800;, &#xC624;&#xB77C;&#xD074; &#xD074;&#xB77C;&#xC6B0;&#xB4DC; &#xCF58;&#xC194;&#xB85C; &#xC811;&#xC18D;&#xD569;&#xB2C8;&#xB2E4;. &#xB124;&#xD2B8;&#xC6CC;&#xD06C; &#xAD00;&#xB828; &#xC124;&#xC815;&#xC744; &#xC704;&#xD574; &#xAC00;&#xC0C1; &#xD074;&#xB77C;&#xC6B0;&#xB4DC; &#xB124;&#xD2B8;&#xC6CC;&#xD06C;(VCN)&#xB85C; &#xC774;&#xB3D9;&#xD569;&#xB2C8;&#xB2E4;. &#xD604;&#xC7AC; &#xC778;&#xC2A4;&#xD134;&#xC2A4;&#xAC00; &#xC18D;&#xD574;&#xC788;&#xB294; VCN&#xC744; &#xC120;&#xD0DD;&#xD574;&#xC11C; &#xB4E4;&#xC5B4;&#xAC11;&#xB2C8;&#xB2E4;. (&#xB530;&#xB85C; &#xC124;&#xC815;&#xD558;&#xC9C0; &#xC54A;&#xC558;&#xB2E4;&#xBA74; &#xAE30;&#xBCF8;&#xC73C;&#xB85C; &#xC0DD;&#xC131;&#xB418;&#xC5B4;&#xC788;&#xB294; &#xAC83; &#xD55C;&#xAC1C;&#xB9CC; &#xC874;&#xC7AC;&#xD569;&#xB2C8;&#xB2E4;.) VCN&#xC5D0; &#xB4E4;&#xC5B4;&#xAC00;&#xBA74; &#xC88C;&#xCE21;&#xC5D0; &#xB9AC;&#xC18C;&#xC2A4;&#xC5D0; &#xB124;&#xD2B8;&#xC6CC;&#xD06C; &#xBCF4;&#xC548; &#xADF8;&#xB8F9;&#xC73C;&#xB85C; &#xC774;&#xB3D9;&#xD569;&#xB2C8;&#xB2E4;. &#xC0C8;&#xB85C;&#xC6B4; &#xADDC;&#xCE59;&#xC744; &#xC0DD;&#xC131;&#xD558;&#xAE30; &#xC704;&#xD574; &#x201D;&#xB124;&#xD2B8;&#xC6CC;&#xD06C; &#xBCF4;&#xC548; &#xADF8;&#xB8F9; &#xC0DD;&#xC131;&#x201D; &#xBC84;&#xD2BC;&#xC744; &#xB20C;&#xB7EC; &#xC0C8;&#xB85C;&#xC6B4; &#xBCF4;&#xC548; &#xADF8;&#xB8F9;&#xC744; &#xC0DD;&#xC131;&#xD569;&#xB2C8;&#xB2E4;. &#xB124;&#xD2B8;&#xC6CC;&#xD06C; &#xBCF4;&#xC548;&#xADF8;&#xB8F9;&#xC5D0;&#x2026;</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://t1.daumcdn.net/tistory_admin/top_v2/bi-tistory-favicon.svg" alt="&#xD648; &#xC11C;&#xBC84; &#xBAA8;&#xB2C8;&#xD130;&#xB9C1; &#xC2DC;&#xC2A4;&#xD15C; Oracle Cloud &#xB85C; &#xC774;&#xC804;&#xD558;&#xAE30; (1)"><span class="kg-bookmark-author">TISTORY</span><span class="kg-bookmark-publisher">yongckim</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://img1.daumcdn.net/thumb/R800x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbIXXlD%2FbtrM3andin7%2FoORRSvkYqJzil74OVkM1yk%2Fimg.png" alt="&#xD648; &#xC11C;&#xBC84; &#xBAA8;&#xB2C8;&#xD130;&#xB9C1; &#xC2DC;&#xC2A4;&#xD15C; Oracle Cloud &#xB85C; &#xC774;&#xC804;&#xD558;&#xAE30; (1)"></div></a></figure><ul><li>&#xC870;&#xAE08; &#xB354; &#xD3B8;&#xB9AC;&#xD558;&#xAC8C; &#xC811;&#xC18D;&#xC744; &#xD558;&#xACE0;&#xC790;, &#xD574;&#xB2F9; &#xC11C;&#xBC84;&#xC5D0; &#xB530;&#xB85C; &#xBCC4;&#xCE6D;&#xC744; &#xC8FC;&#xAE30;&#xB85C; &#xD588;&#xB2E4;.<ul><li><code>photogrammer.me</code> &#xC758; DNS &#xB97C; &#xAD00;&#xB9AC;&#xD558;&#xB294; cloudflare &#xC5D0;&#xC11C; &#xB808;&#xCF54;&#xB4DC; &#xD14C;&#xC774;&#xBE14;&#xC5D0; &#xCD94;&#xAC00;&#xD588;&#xB2E4;.</li></ul></li></ul><h2 id="%EB%AA%A8%EB%8B%88%ED%84%B0%EB%A7%81-%EA%B5%AC%EC%B6%95">&#xBAA8;&#xB2C8;&#xD130;&#xB9C1; &#xAD6C;&#xCD95;</h2><ul><li>&#xBAA8;&#xB2C8;&#xD130;&#xB9C1;&#xC758; &#xB300;&#xC0C1;&#xC740; &#xB2E4;&#xC74C;&#xACFC; &#xAC19;&#xB2E4;.<ul><li>Oracle Cloud VM / &#xB0B4;&#xBD80; &#xBAA8;&#xB2C8;&#xD130;&#xB9C1; &#xC11C;&#xBE44;&#xC2A4;</li><li>Router</li><li>Proxmox hosts</li><li>Home server &#xC758; &#xC6F9; &#xC11C;&#xBE44;&#xC2A4;</li></ul></li><li>&#xAE30;&#xC874;&#xC758; &#xBAA8;&#xB2C8;&#xD130;&#xB9C1;&#xC758; &#xACBD;&#xC6B0; InfluxDB + Grafana &#xD615;&#xD0DC;&#xC600;&#xC73C;&#xB098;, &#xC774;&#xBC88;&#xC5D0;&#xB294; Prometheus &#xB85C; &#xBCC0;&#xACBD;&#xD558;&#xACE0;&#xC790;&#xD55C;&#xB2E4;.<ul><li>Promethus &#xB97C; &#xC0AC;&#xC6A9;&#xD568;&#xC73C;&#xB85C;&#xC11C; &#xAE30;&#xC874; Proxmox &#xC774;&#xC678;&#xC5D0;&#xB3C4; Router &#xCABD;&#xC758; metric &#xC744; &#xBCF4;&#xB2E4; &#xC27D;&#xAC8C; &#xAC00;&#xC838;&#xC62C; &#xC218; &#xC788;&#xC73C;&#xBA70;, Blackbox exporter &#xB97C; &#xD65C;&#xC6A9;&#xD558;&#xBA74; service health check &#xB3C4; &#xC870;&#xAE08; &#xB354; &#xAC04;&#xD3B8;&#xD574;&#xC9C4;&#xB2E4;.</li><li>&#xCD94;&#xAC00;&#xB85C;, &#xC804;&#xC6D0; &#xC0AC;&#xC6A9;&#xB7C9; &#xAD00;&#xB828;&#xD574;&#xC11C;&#xB3C4; &#xBAA8;&#xB2C8;&#xD130;&#xB9C1;&#xC744; &#xCD94;&#xAC00;&#xD560; &#xC608;&#xC815;&#xC778;&#xB370; metric &#xC744; prometheus &#xB85C; &#xBF51;&#xC544;&#xC8FC;&#xB294; &#xCF54;&#xB4DC;&#xAC00; &#xC788;&#xC5B4; &#xAC04;&#xD3B8;&#xD558;&#xB2E4;.</li><li>&#xC544;&#xBB34;&#xB798;&#xB3C4; influx db &#xB294; &#xC2DC;&#xACC4;&#xC5F4; &#xB370;&#xC774;&#xD130;&#xBCA0;&#xC774;&#xC2A4;&#xC77C; &#xBFD0;&#xC774;&#xAE30; &#xB54C;&#xBB38;&#xC5D0;, metric &#xC5D0; &#xD2B9;&#xD654;&#xB41C; prometheus &#xB97C; &#xD65C;&#xC6A9;&#xD558;&#xB294; &#xAC83;&#xC774; &#xC870;&#xAE08; &#xB354; &#xC88B;&#xACA0;&#xB2E4;.</li></ul></li></ul><h3 id="oracle-cloud-%EB%82%B4%EB%B6%80-%EC%84%9C%EB%B9%84%EC%8A%A4-%EB%AA%A8%EB%8B%88%ED%84%B0%EB%A7%81-%ED%95%98%EA%B8%B0">Oracle Cloud &#xB0B4;&#xBD80; &#xC11C;&#xBE44;&#xC2A4; &#xBAA8;&#xB2C8;&#xD130;&#xB9C1; &#xD558;&#xAE30;</h3><ul><li>&#xD648; &#xC11C;&#xBC84;&#xC640;&#xC758; &#xD1B5;&#xC2E0;&#xC758; &#xACBD;&#xC6B0; &#xBCF4;&#xC548;&#xC801;&#xC778; &#xBB38;&#xC81C;&#xB97C; &#xBA3C;&#xC800; &#xACE0;&#xB824;&#xD574;&#xC57C;&#xD55C;&#xB2E4;. Prometheus &#xB97C; &#xD1B5;&#xD574;&#xC11C; &#xD1B5;&#xC2E0;&#xC744; &#xD558;&#xAC8C; &#xB420; &#xAC83;&#xC778;&#xB370;, Prometheus &#xC758; &#xACBD;&#xC6B0; pulling &#xBC29;&#xC2DD;&#xC73C;&#xB85C; &#xB370;&#xC774;&#xD130;&#xB97C; &#xAC00;&#xC838;&#xC628;&#xB2E4;. &#xC774;&#xB294; &#xD648;&#xC11C;&#xBC84;&#xC5D0;&#xC11C; pulling &#xC744; &#xD558;&#xAE30; &#xC704;&#xD55C; &#xD3EC;&#xD2B8;&#xB97C; &#xBCC4;&#xAC1C;&#xB85C; &#xAC1C;&#xBC29;&#xD574;&#xB46C;&#xC57C;&#xD55C;&#xB2E4;&#xB294; &#xC758;&#xBBF8;&#xAC00; &#xB41C;&#xB2E4;.</li><li>&#xADF8;&#xB7EC;&#xB098;, &#xC5B4;&#xB514;&#xC11C;&#xB098; &#xB0B4; &#xC11C;&#xBC84;&#xC758; &#xC815;&#xBCF4;&#xB97C; &#xAC00;&#xC838;&#xC624;&#xB3C4;&#xB85D; &#xD558;&#xB294; &#xAC83;&#xC740; &#xBC14;&#xB78C;&#xC9C1;&#xD558;&#xC9C0; &#xC54A;&#xB2E4;. &#xC774; &#xBD80;&#xBD84;&#xC5D0; &#xB300;&#xD574;&#xC11C;&#xB294; &#xC798; &#xC0DD;&#xAC01;&#xD574;&#xC11C; &#xCD5C;&#xB300;&#xD55C; &#xD0C0;&#xC778;&#xC774; &#xC811;&#xADFC;&#xD560; &#xC218; &#xC788;&#xB294; &#xAD6C;&#xC870;&#xB85C; &#xBCC0;&#xACBD;&#xD574;&#xC57C;&#xD55C;&#xB2E4;.</li><li>&#xC774;&#xB7EC;&#xD55C; &#xC774;&#xC720;&#xB85C; &#xC6B0;&#xC120; Oracle cloud &#xB0B4;&#xBD80;&#xC758; &#xC11C;&#xBE44;&#xC2A4;&#xB97C; Promethues + Grafana &#xB97C; &#xD1B5;&#xD574;&#xC11C; &#xBAA8;&#xB2C8;&#xD130;&#xB9C1;&#xD558;&#xB3C4;&#xB85D; &#xD588;&#xB2E4;.</li></ul><h4 id="grafana">Grafana</h4><ul><li>&#xBAA8;&#xB2C8;&#xD130;&#xB9C1; &#xC2DC;&#xAC01;&#xD654; &#xB3C4;&#xAD6C;&#xB85C;&#xC11C; Grafana&#xB97C; &#xD65C;&#xC6A9;&#xD55C;&#xB2E4;.</li><li>&#xD604;&#xC7AC; &#xACC4;&#xD68D;&#xC740; Grafana &#xB97C; &#xC2DC;&#xAC01;&#xD654; &#xB3C4;&#xAD6C;&#xB85C; &#xD65C;&#xC6A9;&#xD558;&#xACE0;, Prometheus &#xB294; metric &#xC218;&#xC9D1; &#xB3C4;&#xAD6C;&#xB85C; &#xD65C;&#xC6A9;&#xD558;&#xACE0;&#xC790; &#xD55C;&#xB2E4;.</li><li>docker compose &#xB97C; &#xD1B5;&#xD574;&#xC11C; container &#xB85C; &#xC62C;&#xB9B0;&#xB2E4;.</li></ul><pre><code>  grafana:
    image: grafana/grafana:latest
    container_name: grafana
    restart: always
    ports:
      - ?:3000
    volumes:
      - ./data/grafana:/var/lib/grafana
    depends_on:
      - prometheus
    networks:
      - monitoring</code></pre><ul><li>&#xD574;&#xB2F9; &#xC124;&#xC815;&#xC5D0;&#xC11C; Grafana &#xAC00; <code>permisson deined</code> &#xB97C; &#xBFDC;&#xC73C;&#xBA70; start &#xB418;&#xC9C0; &#xC54A;&#xB294; &#xBB38;&#xC81C;&#xAC00; &#xBC1C;&#xC0DD;&#xD558;&#xC600;&#xB2E4;.<ul><li><code>volume</code> &#xC73C;&#xB85C; &#xC7A1;&#xC740; &#xACF3;&#xC5D0; grafana &#xAC00; &#xC811;&#xADFC;&#xC744; &#xD558;&#xC9C0; &#xBABB;&#xD558;&#xACE0; &#xC788;&#xC5C8;&#xB2E4;.</li><li>&#xCC98;&#xC74C;&#xC5D0;&#xB294; <code>user:root</code> &#xB85C; &#xAD8C;&#xD55C;&#xC744; &#xC7A1;&#xC544;&#xC92C;&#xC73C;&#xB098;. log &#xC5D0;&#xC11C; previliged &#xB41C; &#xC720;&#xC800;&#xB97C; &#xC0AC;&#xC6A9;&#xD558;&#xB294; &#xAC83;&#xC5D0; &#xB300;&#xD574;&#xC11C; &#xACBD;&#xACE0;&#xB97C; &#xD588;&#xB2E4;.</li><li>&#xB530;&#xB77C;&#xC11C;, <code>volume</code> &#xC73C;&#xB85C; &#xC7A1;&#xC740; &#xB514;&#xB809;&#xD1A0;&#xB9AC;&#xC5D0; &#xB300;&#xD574; &#xAD8C;&#xD55C;&#xC744; &#xBCC0;&#xACBD;&#xD588;&#xB2E4;.<ul><li><code>sudo chmod 777 {volume_dir}</code></li><li>&#xB2E4;&#xB9CC; &#xC870;&#xAE08; &#xB354; &#xC12C;&#xC138;&#xD558;&#xAC8C; &#xAD8C;&#xD55C;&#xC744; &#xC81C;&#xC5B4;&#xD558;&#xB294; &#xAC83;&#xC774; &#xB0AB;&#xB2E4;&#xACE0; &#xBCF8;&#xB2E4;.</li></ul></li></ul></li></ul><h4 id="prometheus">Prometheus</h4><ul><li>&#xAE30;&#xC874; &#xD648;&#xC11C;&#xBC84;&#xC758; &#xACBD;&#xC6B0; InfluxDB &#xC5D0; metric &#xC744; push &#xD558;&#xACE0; grafana&#xB97C; &#xBAA8;&#xB2C8;&#xD130;&#xB9C1; &#xC2DC;&#xC2A4;&#xD15C;&#xC73C;&#xB85C; &#xD65C;&#xC6A9;&#xD558;&#xACE0; &#xC788;&#xC5C8;&#xB2E4;. &#xC774;&#xB294; Proxmox &#xC790;&#xCCB4;&#xC5D0;&#xC11C; InfluxDB &#xB85C; metric &#xC744; &#xBCF4;&#xB0B4;&#xB294; &#xAE30;&#xB2A5;&#xC740; &#xC788;&#xC73C;&#xB098; Prometheus &#xCABD;&#xC73C;&#xB85C; &#xBCF4;&#xB0B4;&#xB294; &#xAE30;&#xB2A5;&#xC740; &#xB0B4;&#xC7A5;&#xD558;&#xC9C0; &#xC54A;&#xC558;&#xAE30; &#xB54C;&#xBB38;&#xC774;&#xC5C8;&#xB2E4;.</li><li>&#xADF8;&#xB7EC;&#xB098;, &#xC774;&#xBC88;&#xC5D0;&#xB294; Prometheus &#xB85C; &#xD1B5;&#xD569;&#xD574;&#xC11C; &#xBAA8;&#xB4E0;&#xAC78; &#xD574;&#xBCF4;&#xB824;&#xACE0; &#xD55C;&#xB2E4;. InfluxDB &#xC758; &#xACBD;&#xC6B0; &#xC2DC;&#xACC4;&#xC5F4; DB &#xC77C; &#xBFD0; &#xBAA8;&#xB2C8;&#xD130;&#xB9C1;&#xC5D0; &#xB300;&#xD55C; &#xCC45;&#xC784;&#xC740; &#xC5C6;&#xB2E4;. &#xADF8;&#xB7EC;&#xB098; Prometheus &#xB294; &#xC774;&#xB97C; &#xC704;&#xD574; &#xD0C4;&#xC0DD;&#xD55C; &#xD504;&#xB85C;&#xADF8;&#xB7A8;&#xC774;&#xBA70;, Prometheus &#xC5D0; metric &#xC744; &#xBCF4;&#xB0BC; &#xC218; &#xC788;&#xB294; &#xB2E4;&#xC591;&#xD55C; &#xC11C;&#xBE44;&#xC2A4;&#xB4E4;&#xC774; &#xC874;&#xC7AC;&#xD55C;&#xB2E4;.</li><li>&#xD604;&#xC7AC; VM &#xC0C1;&#xD0DC; &#xB610;&#xD55C; &#xC9C1;&#xC811; InfluxDB &#xCABD;&#xC73C;&#xB85C; &#xBCF4;&#xB0B4;&#xB3C4;&#xB85D; cron job &#xC744; &#xB9CC;&#xB4E4;&#xAC70;&#xB098; &#xD574;&#xC57C;&#xD558;&#xB294;&#xB370;, &#xC774;&#xBCF4;&#xB2E4;&#xB294; &#xC544;&#xB798; &#xD65C;&#xC6A9;&#xD55C; <code>node-exporter</code> &#xB97C; &#xD65C;&#xC6A9;&#xD558;&#xB294; &#xAC83;&#xC774; &#xB354; &#xD3B8;&#xB9AC;&#xD558;&#xBA70;, &#xC6F9; &#xC11C;&#xBE44;&#xC2A4;&#xC758; &#xC0C1;&#xD0DC; &#xCCB4;&#xD06C; &#xB610;&#xD55C; <code>blackbox exporter</code> &#xB97C; &#xD65C;&#xC6A9;&#xD558;&#xB294; &#xAC83;&#xC774; &#xB354; &#xD3B8;&#xB9AC;&#xD558;&#xB2E4;.</li><li>&#xC544;&#xBB34;&#xD2BC;, Prometheus &#xB610;&#xD55C; docker compose &#xC5D0; &#xD568;&#xAED8; &#xC62C;&#xB838;&#xB2E4;.</li></ul><pre><code class="language-yaml">  prometheus:
    image: prom/prometheus:latest
    container_name: prometheus
    restart: unless-stopped
    volumes:
      - ./configs/prometheus.yml:/etc/prometheus/prometheus.yml
      - ./data/prometheus:/prometheus
    command:
      - --config.file=/etc/prometheus/prometheus.yml
      - --storage.tsdb.path=/prometheus
      - --web.console.libraries=/etc/prometheus/console_libraries
      - --web.console.templates=/etc/prometheus/consoles
      - --web.enable-lifecycle
    ports:
      - ?:9090
    networks:
      - monitoring
    depends_on:
      - node-exporter
      - blackbox
</code></pre><ul><li>Prometheus &#xC758; &#xACBD;&#xC6B0; metric &#xC218;&#xC9D1;&#xC744; &#xC704;&#xD55C; config &#xAC00; &#xBCC4;&#xB3C4;&#xB85C; &#xD544;&#xC694;&#xD558;&#xB2E4;. &#xC124;&#xC815;&#xC740; &#xC544;&#xB798;&#xC640; &#xAC19;&#xC774; &#xD588;&#xB2E4;.<ul><li>&#xC544;&#xC9C1; &#xC774;&#xCABD; config&#xC5D0; &#xB300;&#xD574;&#xC11C; &#xC790;&#xC138;&#xD788; &#xC54C;&#xACE0; &#xC788;&#xC9C0; &#xC54A;&#xC544;, &#xAE30;&#xBCF8;&#xC801;&#xC73C;&#xB85C; &#xAC01; exporter &#xB4E4;&#xC758; &#xAE30;&#xBCF8; &#xC124;&#xC815;&#xC744; &#xAC00;&#xC838;&#xC654;&#xB2E4;.</li></ul></li></ul><pre><code class="language-yaml">global:
  scrape_interval: 1m

scrape_configs:
  - job_name: &apos;prometheus&apos;
    scrape_interval: 1m
    static_configs:
      - targets:
        - prometheus:9090

  - job_name: &apos;node&apos;
    static_configs:
      - targets: 
        - node-exporter:9100

  - job_name: blackbox
    metrics_path: /probe
    scrape_interval: 5s
    params:
      module: [http_2xx]
    static_configs:
    - targets:
      - ...
    relabel_configs:
    - source_labels: [__address__]
      target_label: __param_target
    - source_labels: [__param_target]
      target_label: instance
    - target_label: __address__
      replacement: blackbox:9115
</code></pre><h4 id="node-exporter">Node exporter</h4><ul><li>node exporter &#xB294; host &#xC758; &#xC0C1;&#xD0DC;&#xB97C; prometheus &#xB85C; export &#xD560; &#xC218; &#xC788;&#xB3C4;&#xB85D; &#xB3D5;&#xB294; &#xB3C4;&#xAD6C;&#xC774;&#xB2E4;.</li><li>&#xC774;&#xC0C1;&#xC801;&#xC73C;&#xB85C;&#xB294; host &#xCABD;&#xC5D0; &#xC9C1;&#xC811; &#xC124;&#xCE58;&#xD558;&#xB294; &#xAC83;&#xC774; &#xBC14;&#xB78C;&#xC9C1;&#xD558;&#xB2E4;. &#xADF8;&#xB7EC;&#xB098;, &#xB2E4;&#xD589;&#xD788;&#xB3C4; container &#xB85C; &#xC62C;&#xB824;&#xC11C; host &#xC758; &#xC815;&#xBCF4;&#xB97C; &#xBC1B;&#xC544;&#xC62C; &#xC218; &#xC788;&#xB3C4;&#xB85D; &#xD558;&#xB294; &#xBC29;&#xBC95;&#xC774; &#xC874;&#xC7AC;&#xD588;&#xB2E4;.<ul><li>container &#xC758; &#xD2B9;&#xC131;&#xC0C1; host &#xCABD;&#xC758; &#xC815;&#xBCF4;&#xB97C; &#xC54C;&#xAC8C;&#xD558;&#xB294;&#xAC8C; &#xC801;&#xC808;&#xD55C; &#xD589;&#xB3D9;&#xC740; &#xC544;&#xB2C8;&#xB2E4;.</li></ul></li><li>docker compose &#xB294; &#xB2E4;&#xC74C;&#xACFC; &#xAC19;&#xB2E4;.</li></ul><pre><code class="language-yaml">  node-exporter:
    image: prom/node-exporter:latest
    container_name: node-exporter
    restart: unless-stopped
    volumes:
      - /proc:/host/proc:ro
      - /sys:/host/sys:ro
      - /:/rootfs:ro
    command:
      - --path.procfs=/host/proc
      - --path.rootfs=/rootfs
      - --path.sysfs=/host/sys
      - --collector.filesystem.mount-points-exclude=^/(sys|proc|dev|host|etc)($$|/)</code></pre><ul><li>Prometheus &#xCABD;&#xC5D0;&#xC11C;&#xB3C4; &#xC124;&#xC815;&#xC744; &#xC7A1;&#xC544;&#xC918;&#xC57C;&#xD55C;&#xB2E4;.</li></ul><pre><code class="language-text">  - job_name: &apos;node&apos;
    static_configs:
      - targets: 
        - node-exporter:9100</code></pre><ul><li>Grafana &#xC5D0;&#xC11C; node exporter dashboard &#xB97C; &#xAC00;&#xC838;&#xC654;&#xB2E4;. &#xB2E8;&#xC21C;&#xD558;&#xAC8C; prometheus &#xB85C; &#xC5F0;&#xB3D9;&#xD558;&#xBA74; &#xB05D;&#xB09C;&#xB2E4;.</li></ul><figure class="kg-card kg-image-card"><img src="https://life.photogrammer.me/content/images/2024/06/image-6.png" class="kg-image" alt="&#xD648; &#xC11C;&#xBC84; &#xBAA8;&#xB2C8;&#xD130;&#xB9C1; &#xC2DC;&#xC2A4;&#xD15C; Oracle Cloud &#xB85C; &#xC774;&#xC804;&#xD558;&#xAE30; (1)" loading="lazy" width="1465" height="1208" srcset="https://life.photogrammer.me/content/images/size/w600/2024/06/image-6.png 600w, https://life.photogrammer.me/content/images/size/w1000/2024/06/image-6.png 1000w, https://life.photogrammer.me/content/images/2024/06/image-6.png 1465w" sizes="(min-width: 720px) 720px"></figure><ul><li>&#xC5F0;&#xB3D9; &#xACFC;&#xC815; &#xC911;&#xC5D0; docker network &#xAC00; &#xC11C;&#xB85C; &#xC81C;&#xB300;&#xB85C; &#xC5F0;&#xACB0;&#xC774; &#xB418;&#xC9C0; &#xC54A;&#xC544; &#xBB38;&#xC81C;&#xAC00; &#xBC1C;&#xC0DD;&#xD588;&#xC5C8;&#xB2E4;. &#xC774;&#xC720;&#xB294; &#xBA4D;&#xCCAD;&#xD558;&#xAC8C; &#xD574;&#xB2F9; &#xC11C;&#xBE44;&#xC2A4;&#xB97C; &#xB3C4;&#xCEE4; &#xB124;&#xD2B8;&#xC6CC;&#xD06C;&#xC5D0; &#xBB36;&#xC9C0; &#xC54A;&#xC558;&#xB358;&#xAC83;, &#xADF8;&#xB9AC;&#xACE0; &#xB124;&#xD2B8;&#xC6CC;&#xD06C; &#xB0B4;&#xBD80; &#xB9DD;&#xC778;&#xB370; &#xC678;&#xBD80; &#xD3EC;&#xD2B8;&#xB85C; &#xC5F0;&#xACB0;&#xD558;&#xACE0; &#xC788;&#xB358; &#xAC83;&#xC774;&#xC5C8;&#xB2E4;.</li></ul><h4 id="blackbox-exporter">Blackbox exporter</h4><ul><li>blackbox exporter &#xB294; Web service &#xB4E4;&#xC5D0; &#xB300;&#xD574;&#xC11C; healthcheck &#xB97C; &#xD558;&#xACE0; &#xC774;&#xC5D0; &#xB300;&#xD55C; metric &#xC744; export &#xD558;&#xB294; &#xD234;&#xC774;&#xB2E4;.</li><li>&#xC774;&#xBC88; &#xBAA8;&#xB2C8;&#xD130;&#xB9C1; &#xB3C4;&#xAD6C;&#xC758; &#xD575;&#xC2EC;&#xC774;&#xBA70;, &#xD648;&#xC5D0;&#xC11C; &#xD638;&#xC2A4;&#xD305;&#xD558;&#xACE0; &#xC788;&#xB294; &#xC11C;&#xBE44;&#xC2A4;&#xC5D0; &#xB300;&#xD574;&#xC11C; &#xBAA8;&#xB450; &#xBAA8;&#xB2C8;&#xD130;&#xB9C1; &#xD560; &#xAC83;&#xC774;&#xB2E4;.</li><li>&#xC124;&#xCE58; &#xBC0F; &#xC124;&#xC815;&#xC740; &#xAC04;&#xB2E8;&#xD558;&#xB2E4;. &#xC544;&#xB798;&#xC640; &#xAC19;&#xC774; compose, blackbox config, prometheus config &#xB97C; &#xC791;&#xC131;&#xD588;&#xB2E4;.</li><li>docker compose</li></ul><pre><code class="language-yaml">  blackbox:
    image: prom/blackbox-exporter:latest
    container_name: blackbox
    ports:
      - 19115:9115
    command:
      - --config.file=/etc/blackbox/blackbox.yml
    volumes:
      - ./configs/blackbox.yml:/etc/blackbox/blackbox.yml
    networks:
      - monitoring
    restart: unless-stopped
</code></pre><ul><li>blackbox config</li></ul><pre><code class="language-yaml">modules:
  http_2xx:
    prober: http
    timeout: 5s
    http:
      method: GET
</code></pre><ul><li>prometheus config</li></ul><pre><code class="language-text">  - job_name: blackbox
    metrics_path: /probe
    scrape_interval: 5s
    params:
      module: [http_2xx]
    static_configs:
    - targets:
      - ...
    relabel_configs:
    - source_labels: [__address__]
      target_label: __param_target
    - source_labels: [__param_target]
      target_label: instance
    - target_label: __address__
      replacement: blackbox:9115
</code></pre><ul><li>&#xB9C8;&#xCC2C;&#xAC00;&#xC9C0;&#xB85C; Grafana &#xC5D0; &#xC774;&#xBBF8; &#xB9CC;&#xB4E4;&#xC5B4;&#xC9C4; dashboard &#xB97C; &#xB123;&#xC5B4;&#xC92C;&#xB2E4;. prometheus &#xB791; &#xC5F0;&#xB3D9;&#xD558;&#xBA74; &#xB05D;.</li></ul><figure class="kg-card kg-image-card"><img src="https://life.photogrammer.me/content/images/2024/06/SC-2024-06-30-at-4.13.00-AM.jpg" class="kg-image" alt="&#xD648; &#xC11C;&#xBC84; &#xBAA8;&#xB2C8;&#xD130;&#xB9C1; &#xC2DC;&#xC2A4;&#xD15C; Oracle Cloud &#xB85C; &#xC774;&#xC804;&#xD558;&#xAE30; (1)" loading="lazy" width="2000" height="1681" srcset="https://life.photogrammer.me/content/images/size/w600/2024/06/SC-2024-06-30-at-4.13.00-AM.jpg 600w, https://life.photogrammer.me/content/images/size/w1000/2024/06/SC-2024-06-30-at-4.13.00-AM.jpg 1000w, https://life.photogrammer.me/content/images/size/w1600/2024/06/SC-2024-06-30-at-4.13.00-AM.jpg 1600w, https://life.photogrammer.me/content/images/2024/06/SC-2024-06-30-at-4.13.00-AM.jpg 2000w" sizes="(min-width: 720px) 720px"></figure><ul><li>&#xCD94;&#xAC00;&#xB85C;, &#xC11C;&#xBE44;&#xC2A4;&#xAC00; &#xB2E4;&#xC6B4; &#xB41C; &#xACBD;&#xC6B0; &#xC54C;&#xB9BC;&#xC774; &#xC624;&#xB3C4;&#xB85D; &#xAC04;&#xB2E8;&#xD558;&#xAC8C; &#xC54C;&#xB9BC;&#xC744; &#xC124;&#xC815;&#xD588;&#xB2E4;.<ul><li>Dashboard &#xC5D0;&#xC11C; Fail &#xBD80;&#xBD84;&#xC5D0; 0 &#xC774;&#xC0C1; &#xAC12;&#xC774; &#xB3C4;&#xB2EC;&#xD55C; &#xACBD;&#xC6B0; &#xC54C;&#xB9BC;&#xC744; &#xC1A1;&#xC2E0;&#xD558;&#xB3C4;&#xB85D; &#xC124;&#xC815;&#xD588;&#xB2E4;.</li><li>&#xD648; &#xC11C;&#xBC84; &#xC804;&#xCCB4;&#xB97C; &#xB0B4;&#xB824;&#xBCF4;&#xC558;&#xACE0;, &#xC815;&#xC0C1;&#xC801;&#xC73C;&#xB85C; &#xC54C;&#xB9BC;&#xC744; &#xC218;&#xC2E0;&#xD560; &#xC218; &#xC788;&#xC5C8;&#xB2E4;.</li></ul></li></ul><figure class="kg-card kg-image-card"><img src="https://life.photogrammer.me/content/images/2024/06/image-8.png" class="kg-image" alt="&#xD648; &#xC11C;&#xBC84; &#xBAA8;&#xB2C8;&#xD130;&#xB9C1; &#xC2DC;&#xC2A4;&#xD15C; Oracle Cloud &#xB85C; &#xC774;&#xC804;&#xD558;&#xAE30; (1)" loading="lazy" width="1520" height="1766" srcset="https://life.photogrammer.me/content/images/size/w600/2024/06/image-8.png 600w, https://life.photogrammer.me/content/images/size/w1000/2024/06/image-8.png 1000w, https://life.photogrammer.me/content/images/2024/06/image-8.png 1520w" sizes="(min-width: 720px) 720px"></figure><ul><li>&#xC774;&#xB807;&#xAC8C; &#xC124;&#xC815;&#xD558;&#xACE0; &#xC774;&#xD2C0; &#xC815;&#xB3C4; &#xC0AC;&#xC6A9;&#xD588;&#xB294;&#xB370;, &#xAC70;&#xC9D3; &#xC54C;&#xB9BC;&#xC774; &#xC790;&#xAFB8;&#xB9CC; &#xC654;&#xB2E4;.</li><li>&#xAE30;&#xC874; alert &#xC758; &#xACBD;&#xC6B0; <code>count(probe_success{ job ~= blackbox} == 0)</code> &#xC73C;&#xB85C; &#xCCB4;&#xD06C;&#xB97C; &#xD558;&#xACE0; &#xC788;&#xC5C8;&#xB294;&#xB370;, probe &#xC5D0; &#xC885;&#xC885; &#xC2E4;&#xD328;&#xD558;&#xB294; &#xACBD;&#xC6B0;&#xAC00; &#xB9CE;&#xC774; &#xBC1C;&#xC0DD;&#xD558;&#xB294; &#xAC83;&#xC774; &#xBB38;&#xC81C;&#xC600;&#xB2E4;.</li><li>&#xB530;&#xB77C;&#xC11C;, &#xD2B9;&#xC815; &#xC9C0;&#xC810;&#xC5D0;&#xC11C;&#xC758; &#xAC12;&#xC744; &#xBCF4;&#xB294; &#xAC83; &#xBCF4;&#xB2E4;&#xB294; &#xC77C;&#xC815; interval &#xC5D0;&#xC11C; &#xBE44;&#xAD50;&#xD558;&#xB294; &#xAC83;&#xC774; &#xC801;&#xD569;&#xD558;&#xB2E4;&#xACE0; &#xD310;&#xB2E8;&#xD588;&#xB2E4;.<ul><li>&#xAE30;&#xC874;&#xC758;  <code>count(probe_success{ job =~ blackbox} == 0)</code> &#xB294; probe &#xC5D0; &#xC2E4;&#xD328;&#xD55C; &#xAC2F;&#xC218;&#xB97C; &#xC138;&#xB294;&#xB370;, &#xC774;&#xB807;&#xAC8C; &#xD558;&#xBA74; &#xC77C;&#xC2DC;&#xC801;&#xC73C;&#xB85C; probe &#xC5D0; &#xC2E4;&#xD328;&#xD558;&#xB294; &#xC0C1;&#xD669;&#xC5D0;&#xC11C; &#xAC70;&#xC9D3; &#xC54C;&#xB9BC; &#xBB38;&#xC81C;&#xAC00; &#xBC1C;&#xC0DD;&#xD55C;&#xB2E4;. &#xC774; &#xAC70;&#xC9D3; &#xC54C;&#xB9BC;&#xC740; &#xC21C;&#xC804;&#xD788; &#xC6B4;&#xC73C;&#xB85C; &#xB098;&#xC624;&#xB294; &#xAC83;&#xC774;&#xB77C;&#xC11C;, &#xC7AC;&#xC218;&#xAC00; &#xC5C6;&#xC73C;&#xBA74; pending &#xB418;&#xB294; &#xC911;&#xC5D0;&#xB3C4; &#xB2E4;&#xC2DC; probe &#xC5D0; &#xC2E4;&#xD328;&#xD558;&#xACE0; &#xC54C;&#xB9BC;&#xC744; &#xBC1C;&#xC1A1;&#xD55C;&#xB2E4;.</li><li>&#xB530;&#xB77C;&#xC11C;, probe &#xB300;&#xC0C1;&#xC758; &#xAC2F;&#xC218;&#xC640; interval &#xB3D9;&#xC548; probe &#xC5D0; &#xC131;&#xACF5;&#xD55C; &#xAC2F;&#xC218;&#xC758; &#xCD5C;&#xB313;&#xAC12;&#xC744; &#xBE44;&#xAD50;&#xD558;&#xB3C4;&#xB85D; &#xD588;&#xB2E4;. &#xB530;&#xB77C;&#xC11C; A &#xAC12;&#xC744;  probe &#xC5D0; &#xC131;&#xACF5;&#xD55C; &#xC218;&#xC778; <code>count(probe_success{ job =~ blackbox} == 1)</code> &#xB85C; &#xC218;&#xC815;&#xD558;&#xACE0;, &#xC774;&#xB97C; 2m &#xB3D9;&#xC548;&#xC758; interval &#xB3D9;&#xC548;&#xC758; range &#xB85C; &#xAC00;&#xC838;&#xC624;&#xB3C4;&#xB85D;&#xD588;&#xB2E4;.</li><li>probe &#xB300;&#xC0C1;&#xC758; &#xC218;&#xB3C4; &#xD544;&#xC694;&#xD558;&#xB2E4;. &#xC774;&#xB294; <code>count(up{job=blackbox})</code> &#xB85C; &#xD68D;&#xB4DD;&#xD560; &#xC218; &#xC788;&#xB2E4;.</li><li>A &#xAC12;&#xC740; &#xC2DC;&#xB9AC;&#xC988;&#xC774;&#xAE30; &#xB54C;&#xBB38;&#xC5D0;, &#xC774; &#xAC12;&#xB4E4; &#xC911;&#xC5D0;&#xC11C; MAX &#xAC12;&#xC744; reduce &#xD574;&#xC628;&#xB2E4;. &#xC778;&#xD130;&#xBC8C; &#xB0B4;&#xB0B4; MAX &#xAC12;&#xC774; up &#xAC12;&#xACFC; &#xC77C;&#xCE58;&#xD558;&#xC9C0; &#xC54A;&#xB294;&#xB2E4;&#xBA74; &#xD2B9;&#xC815; &#xC11C;&#xBC84;&#xAC00; &#xB2E4;&#xC6B4;&#xB418;&#xC5C8;&#xC74C;&#xC744; &#xC758;&#xBBF8;&#xD558;&#xAC8C; &#xB41C;&#xB2E4;.</li><li>&#xADF8;&#xB9AC;&#xACE0; $B==$C &#xAC12;&#xC73C;&#xB85C; &#xD574;&#xB2F9; true / false &#xB85C; &#xD45C;&#xD604;&#xD558;&#xACE0; threshold &#xB97C; &#xC7A1;&#xC544;&#xC92C;&#xB2E4;.</li></ul></li></ul><figure class="kg-card kg-image-card"><img src="https://life.photogrammer.me/content/images/2024/07/image-5.png" class="kg-image" alt="&#xD648; &#xC11C;&#xBC84; &#xBAA8;&#xB2C8;&#xD130;&#xB9C1; &#xC2DC;&#xC2A4;&#xD15C; Oracle Cloud &#xB85C; &#xC774;&#xC804;&#xD558;&#xAE30; (1)" loading="lazy" width="2000" height="1351" srcset="https://life.photogrammer.me/content/images/size/w600/2024/07/image-5.png 600w, https://life.photogrammer.me/content/images/size/w1000/2024/07/image-5.png 1000w, https://life.photogrammer.me/content/images/size/w1600/2024/07/image-5.png 1600w, https://life.photogrammer.me/content/images/2024/07/image-5.png 2366w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://life.photogrammer.me/content/images/2024/07/image-6.png" class="kg-image" alt="&#xD648; &#xC11C;&#xBC84; &#xBAA8;&#xB2C8;&#xD130;&#xB9C1; &#xC2DC;&#xC2A4;&#xD15C; Oracle Cloud &#xB85C; &#xC774;&#xC804;&#xD558;&#xAE30; (1)" loading="lazy" width="2000" height="1314" srcset="https://life.photogrammer.me/content/images/size/w600/2024/07/image-6.png 600w, https://life.photogrammer.me/content/images/size/w1000/2024/07/image-6.png 1000w, https://life.photogrammer.me/content/images/size/w1600/2024/07/image-6.png 1600w, https://life.photogrammer.me/content/images/2024/07/image-6.png 2350w" sizes="(min-width: 720px) 720px"></figure><ul><li>&#xB2E4;&#xB9CC;, &#xD604;&#xC7AC;&#xB294; down &#xB41C; &#xC11C;&#xBC84;&#xAC00; &#xC788;&#xC73C;&#xBA74; &#xADF8;&#xB0E5; &#xC54C;&#xB9BC;&#xC774; &#xC624;&#xB3C4;&#xB85D;&#xD588;&#xB294;&#xB370; &quot;&#xC5B4;&#xB5A4; &#xC11C;&#xBC84;&#xAC00; down &#xB418;&#xC5C8;&#xB294;&#xAC00;?&quot; &#xB77C;&#xB294; &#xC0C1;&#xC138; &#xC815;&#xBCF4;&#xAE4C;&#xC9C0;&#xB294; &#xC54C; &#xC218; &#xC5C6;&#xB2E4;. &#xC5EC;&#xAE30;&#xC5D0; &#xB300;&#xD574;&#xC11C;&#xB294; &#xC870;&#xAE08; &#xB354; &#xCC3E;&#xC544;&#xBD10;&#xC57C;&#xACA0;&#xB2E4;.</li></ul><h4 id="%EA%B5%AC%EC%A1%B0">&#xAD6C;&#xC870;</h4><figure class="kg-card kg-image-card"><img src="https://life.photogrammer.me/content/images/2024/06/image-9.png" class="kg-image" alt="&#xD648; &#xC11C;&#xBC84; &#xBAA8;&#xB2C8;&#xD130;&#xB9C1; &#xC2DC;&#xC2A4;&#xD15C; Oracle Cloud &#xB85C; &#xC774;&#xC804;&#xD558;&#xAE30; (1)" loading="lazy" width="1770" height="934" srcset="https://life.photogrammer.me/content/images/size/w600/2024/06/image-9.png 600w, https://life.photogrammer.me/content/images/size/w1000/2024/06/image-9.png 1000w, https://life.photogrammer.me/content/images/size/w1600/2024/06/image-9.png 1600w, https://life.photogrammer.me/content/images/2024/06/image-9.png 1770w" sizes="(min-width: 720px) 720px"></figure><ul><li>&#xACB0;&#xACFC;&#xC801;&#xC73C;&#xB85C; &#xC704;&#xC640; &#xAC19;&#xC740; &#xAD6C;&#xC870;&#xB97C; &#xAC16;&#xCD94;&#xC5C8;&#xB2E4;. Oracle cloud &#xC704;&#xC5D0; &#xC788;&#xB294; VM &#xC5D0; &#xB300;&#xD55C; &#xBAA8;&#xB2C8;&#xD130;&#xB9C1;&#xACFC; &#xD648; &#xC11C;&#xBC84;&#xC5D0;&#xC11C; &#xD638;&#xC2A4;&#xD305; &#xC911;&#xC778; &#xC11C;&#xBE44;&#xC2A4;&#xC758; health check &#xAC00; &#xAC00;&#xB2A5;&#xD558;&#xAC8C; &#xB418;&#xC5C8;&#xC73C;&#xBA70;, &#xC11C;&#xBC84;&#xC5D0; &#xBB38;&#xC81C;&#xAC00; &#xBC1C;&#xC0DD;&#xD588;&#xC744; &#xB54C;, &#xD154;&#xB808;&#xADF8;&#xB7A8;&#xC73C;&#xB85C; &#xC54C;&#xB9BC;&#xC774; &#xC628;&#xB2E4;.</li><li>Oracle Cloud &#xAC00; &#xC911;&#xB2E8;&#xB418;&#xB294; &#xACBD;&#xC6B0;&#xB97C; &#xB300;&#xBE44;&#xD558;&#xC5EC; &#xD648;&#xC11C;&#xBC84; &#xCE21;&#xC5D0;&#xC11C;&#xB3C4; &#xD074;&#xB77C;&#xC6B0;&#xB4DC;&#xC5D0; &#xB300;&#xD55C; &#xBAA8;&#xB2C8;&#xD130;&#xB9C1;&#xC744; &#xACE0;&#xB824;&#xD574;&#xBCFC; &#xC218;&#xB3C4; &#xC788;&#xACA0;&#xB2E4;. &#xB2E4;&#xB9CC;,  &#xC774;&#xB294; &#xB098;&#xC911;&#xC5D0; &#xD558;&#xB294; &#xAC83;&#xC73C;&#xB85C; &#xC6B0;&#xC120;&#xC740; &#xBBF8;&#xB904;&#xB450;&#xC790;.</li></ul><h3 id="cloud-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-%EC%84%A4%EC%A0%95">Cloud &#xB124;&#xD2B8;&#xC6CC;&#xD06C; &#xC124;&#xC815;</h3><h4 id="reverse-proxy-%EC%84%A4%EC%A0%95">Reverse Proxy &#xC124;&#xC815;</h4><ul><li>Reverse Proxy &#xC758; &#xACBD;&#xC6B0; Nginx Proxy Manager &#xB97C; &#xD65C;&#xC6A9;&#xD588;&#xB2E4;.</li><li>&#xC124;&#xC815; &#xC911;&#xC5D0; &#xBA87; &#xAC00;&#xC9C0; &#xBB38;&#xC81C;&#xAC00; &#xC788;&#xC5C8;&#xB2E4;.</li></ul><ol><li><strong>aarch64 &#xD658;&#xACBD;&#xC5D0;&#xC11C; SSL &#xBB38;&#xC81C;</strong></li></ol><ul><li>&#xAE30;&#xC874; &#xD648; &#xC11C;&#xBC84;&#xC758; &#xACBD;&#xC6B0; x86 &#xD658;&#xACBD;&#xC774;&#xC5C8;&#xB2E4;. &#xBCC4;&#xB2E4;&#xB978; &#xC774;&#xC288; &#xC5C6;&#xC774; cloudflare &#xC758; api &#xB97C; &#xD65C;&#xC6A9;&#xD574;&#xC11C; Lets encrypt + certbot &#xC744; &#xD65C;&#xC6A9;&#xD560; &#xC218; &#xC788;&#xC5C8;&#xB2E4;.</li><li>&#xADF8;&#xB7EC;&#xB098;, &#xC774;&#xBC88;&#xC758; &#xACBD;&#xC6B0; certbot &#xCABD;&#xC5D0;&#xC11C; &#xC54C; &#xC218; &#xC5C6;&#xB294; &#xBB38;&#xC81C;&#xAC00; &#xBC1C;&#xC0DD;&#xD588;&#xB2E4;. &#xB2E4;&#xD589;&#xD788; &#xD574;&#xB2F9; &#xC774;&#xC288;&#xAC00; github &#xC5D0; &#xC788;&#xC5C8;&#xB2E4;. &#xD604;&#xC7AC; latest &#xBC84;&#xC804;&#xC740; &#xD574;&#xACB0;&#xC774; &#xB418;&#xC5B4;&#xC788;&#xC9C0; &#xC54A;&#xC73C;&#xB098;, &#xBB38;&#xC81C;&#xB97C; &#xD574;&#xACB0;&#xD558;&#xACE0; &#xC788;&#xB294; &#xBC84;&#xC804;&#xC73C;&#xB85C; &#xBCC0;&#xACBD;&#xD558;&#xC5EC; &#xD574;&#xACB0;&#xD588;&#xB2E4;.</li></ul><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://github.com/NginxProxyManager/nginx-proxy-manager/issues/2381"><div class="kg-bookmark-content"><div class="kg-bookmark-title">certbot-dns-cloudflare install fails. &#xB7; Issue #2381 &#xB7; NginxProxyManager/nginx-proxy-manager</div><div class="kg-bookmark-description">Checklist Have you pulled and found the error with jc21/nginx-proxy-manager:latest docker image? Yes Are you sure you&#x2019;re not using someone else&#x2019;s docker image? Yes Have you searched for similar iss&#x2026;</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://github.githubassets.com/assets/pinned-octocat-093da3e6fa40.svg" alt="&#xD648; &#xC11C;&#xBC84; &#xBAA8;&#xB2C8;&#xD130;&#xB9C1; &#xC2DC;&#xC2A4;&#xD15C; Oracle Cloud &#xB85C; &#xC774;&#xC804;&#xD558;&#xAE30; (1)"><span class="kg-bookmark-author">GitHub</span><span class="kg-bookmark-publisher">NginxProxyManager</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://opengraph.githubassets.com/f5ff6fd41d91d0579734ee4f708d7c21ff0435553ce0338b1278d106c0abbc65/NginxProxyManager/nginx-proxy-manager/issues/2381" alt="&#xD648; &#xC11C;&#xBC84; &#xBAA8;&#xB2C8;&#xD130;&#xB9C1; &#xC2DC;&#xC2A4;&#xD15C; Oracle Cloud &#xB85C; &#xC774;&#xC804;&#xD558;&#xAE30; (1)"></div></a></figure><ol start="2"><li><strong>proxy &#xB97C; &#xD558;&#xC9C0; &#xBABB;&#xD558;&#xB294; &#xBB38;&#xC81C;</strong></li></ol><ul><li>&#xAC01; &#xC11C;&#xBE44;&#xC2A4;&#xC5D0; &#xB300;&#xD574;&#xC11C; &#xB3C4;&#xBA54;&#xC778;&#xC744; &#xBD99;&#xC5EC;&#xB450;&#xACE0; reverse proxy &#xB97C; &#xD558;&#xACE0;&#xC790; &#xD588;&#xC73C;&#xB098;, 502 Bad Gateway &#xAC00; &#xBC1C;&#xC0DD;&#xD588;&#xB2E4;.</li><li>NPM &#xC11C;&#xBE44;&#xC2A4;&#xCABD;&#xC5D0;&#xC11C; &#xB2E4;&#xB978; &#xC11C;&#xBE44;&#xC2A4;&#xC640; &#xB3C4;&#xCEE4; &#xB124;&#xD2B8;&#xC6CC;&#xD06C;&#xAC00; &#xC77C;&#xCE58;&#xD558;&#xC9C0; &#xC54A;&#xC544; &#xCC3E;&#xC744; &#xC218; &#xC5C6;&#xB294; &#xBB38;&#xC81C;&#xC600;&#xB2E4;.<ul><li>&#xAE30;&#xC874;&#xC5D0;&#xB294; <code>localhost:port</code> &#xB85C; &#xD45C;&#xAE30;&#xD588;&#xC73C;&#xB098;, &#xB3C4;&#xCEE4; &#xB124;&#xD2B8;&#xC6CC;&#xD06C; &#xC548;&#xCABD;&#xC774;&#xB77C;&#xC11C; &#xC548;&#xB418;&#xB294; &#xAC83;&#xC73C;&#xB85C; &#xBCF4;&#xC600;&#xB2E4;.</li></ul></li><li>compose &#xD30C;&#xC77C; &#xC790;&#xCCB4;&#xB294; &#xB2E4;&#xB974;&#xB098;, docker network &#xB294; &#xACF5;&#xC720;&#xD558;&#xB3C4;&#xB85D;&#xD588;&#xB2E4;.<ul><li><code>docker network connect {network} {container}</code></li></ul></li></ul><h4 id="ingress-%EB%B3%B4%EC%95%88-%EA%B7%9C%EC%B9%99">Ingress &#xBCF4;&#xC548; &#xADDC;&#xCE59;</h4><ul><li>&#xBAA8;&#xB4E0; &#xD3EC;&#xD2B8;&#xB85C; &#xC811;&#xC18D;&#xD558;&#xAC8C; &#xD558;&#xB294; &#xAC83;&#xC740; &#xC704;&#xD5D8;&#xD558;&#xBA70;, &#xCD5C;&#xC804;&#xBC29;&#xC5D0; Reverse Proxy &#xB97C; &#xD1B5;&#xD574;&#xC11C; &#xC811;&#xC18D;&#xD558;&#xB3C4;&#xB85D; &#xD558;&#xACE0;&#xC790; &#xD588;&#xB2E4;.</li><li>80, 443 &#xD3EC;&#xD2B8;&#xB9CC; &#xAC1C;&#xBC29;&#xD558;&#xB3C4;&#xB85D; &#xD588;&#xB2E4;.</li></ul><figure class="kg-card kg-image-card"><img src="https://life.photogrammer.me/content/images/2024/06/image-5.png" class="kg-image" alt="&#xD648; &#xC11C;&#xBC84; &#xBAA8;&#xB2C8;&#xD130;&#xB9C1; &#xC2DC;&#xC2A4;&#xD15C; Oracle Cloud &#xB85C; &#xC774;&#xC804;&#xD558;&#xAE30; (1)" loading="lazy" width="1107" height="127" srcset="https://life.photogrammer.me/content/images/size/w600/2024/06/image-5.png 600w, https://life.photogrammer.me/content/images/size/w1000/2024/06/image-5.png 1000w, https://life.photogrammer.me/content/images/2024/06/image-5.png 1107w" sizes="(min-width: 720px) 720px"></figure><p></p><p></p><p>&#xC0DD;&#xAC01;&#xBCF4;&#xB2E4; &#xAE00;&#xC774; &#xB9CE;&#xC774; &#xAE38;&#xC5B4;&#xC838;&#xC11C; &#xD648;&#xC11C;&#xBC84; Proxmox node / Router &#xBAA8;&#xB2C8;&#xD130;&#xB9C1;&#xC740; &#xB2E4;&#xC74C; &#xAE00;&#xC5D0; &#xC774;&#xC5B4;&#xC11C; &#xC791;&#xC131;&#xD558;&#xACA0;&#xB2E4;. &#xC774;&#xBC88; &#xAE00;&#xC744; &#xD1B5;&#xD574;&#xC11C; &#xAD6C;&#xCD95;&#xD55C; &#xC11C;&#xBC84;&#xC758; &#xAD6C;&#xC870;&#xB294; &#xB2E4;&#xC74C;&#xACFC; &#xAC19;&#xB2E4;.</p><figure class="kg-card kg-image-card"><img src="https://life.photogrammer.me/content/images/2024/06/image-10.png" class="kg-image" alt="&#xD648; &#xC11C;&#xBC84; &#xBAA8;&#xB2C8;&#xD130;&#xB9C1; &#xC2DC;&#xC2A4;&#xD15C; Oracle Cloud &#xB85C; &#xC774;&#xC804;&#xD558;&#xAE30; (1)" loading="lazy" width="1584" height="1634" srcset="https://life.photogrammer.me/content/images/size/w600/2024/06/image-10.png 600w, https://life.photogrammer.me/content/images/size/w1000/2024/06/image-10.png 1000w, https://life.photogrammer.me/content/images/2024/06/image-10.png 1584w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://life.photogrammer.me/migration-monitoring-system-to-oracle-cloud-1-2/"><div class="kg-bookmark-content"><div class="kg-bookmark-title">&#xD648; &#xC11C;&#xBC84; &#xBAA8;&#xB2C8;&#xD130;&#xB9C1; &#xC2DC;&#xC2A4;&#xD15C; Oracle Cloud &#xB85C; &#xC774;&#xC804;&#xD558;&#xAE30; (2)</div><div class="kg-bookmark-description">&#xC9C0;&#xB09C; &#xAE00;&#xC5D0; &#xC774;&#xC5B4; Oracle Cloud &#xB85C; &#xBAA8;&#xB2C8;&#xD130;&#xB9C1; &#xC2DC;&#xC2A4;&#xD15C;&#xC744; &#xC62E;&#xAE30;&#xB294; &#xACFC;&#xC815;&#xC744; &#xB9C8;&#xC800; &#xC9C4;&#xD589;&#xD574;&#xBCF4;&#xACA0;&#xB2E4;. VPN &#xC124;&#xCE58; * &#xBAA8;&#xB2C8;&#xD130;&#xB9C1; &#xC11C;&#xBC84;&#xC5D0;&#xC11C; &#xB0B4;&#xBD80; &#xC11C;&#xBE44;&#xC2A4;&#xC758; &#xACBD;&#xC6B0; &#xC678;&#xBD80;&#xB85C; &#xB178;&#xCD9C;&#xB420; &#xC774;&#xC720;&#xAC00; &#xC5C6;&#xB2E4;. &#xB530;&#xB77C;&#xC11C;, VPN &#xC744; &#xD1B5;&#xD574;&#xC11C;&#xB9CC; &#xD574;&#xB2F9; &#xC11C;&#xBC84;&#xC5D0; &#xC811;&#xC18D; &#xD560; &#xC218; &#xC788;&#xB3C4;&#xB85D; &#xD55C;&#xB2E4;. * &#xAE30;&#xC874;&#xC5D0; OpenVPN &#xC744; &#xD1B5;&#xD574;&#xC11C; VPN &#xC744; &#xAD6C;&#xCD95;&#xD558;&#xACE0; &#xC788;&#xC5B4;, &#xD574;&#xB2F9; &#xC11C;&#xBC84;&#xB3C4; OpenVPN &#xC744; &#xD65C;&#xC6A9;&#xD558;&#xB3C4;&#xB85D; &#xD560; &#xAC83;&#xC774;&#xB2E4;. docker</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://life.photogrammer.me/content/images/size/w256h256/2024/02/android-chrome-512x512.png" alt="&#xD648; &#xC11C;&#xBC84; &#xBAA8;&#xB2C8;&#xD130;&#xB9C1; &#xC2DC;&#xC2A4;&#xD15C; Oracle Cloud &#xB85C; &#xC774;&#xC804;&#xD558;&#xAE30; (1)"><span class="kg-bookmark-author">Photogrammer</span><span class="kg-bookmark-publisher">Sungjun Park</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://images.unsplash.com/photo-1551288049-bebda4e38f71?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDh8fGdyYXBofGVufDB8fHx8MTcxOTgyNjI3M3ww&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" alt="&#xD648; &#xC11C;&#xBC84; &#xBAA8;&#xB2C8;&#xD130;&#xB9C1; &#xC2DC;&#xC2A4;&#xD15C; Oracle Cloud &#xB85C; &#xC774;&#xC804;&#xD558;&#xAE30; (1)"></div></a></figure>]]></content:encoded></item><item><title><![CDATA[더미 데이터 생성기 - Mock2CSV]]></title><description><![CDATA[더미 데이터를 CSV 로 만드는 간단한 라이브러리 만들기]]></description><link>https://life.photogrammer.me/mock2csv-post/</link><guid isPermaLink="false">664290ddc032a0000171b611</guid><category><![CDATA[Development]]></category><category><![CDATA[Javascript]]></category><dc:creator><![CDATA[Sungjun Park]]></dc:creator><pubDate>Mon, 13 May 2024 22:21:21 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1543966888-7c1dc482a810?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDE2fHxqYXZhc2NyaXB0fGVufDB8fHx8MTcxNTYzODg3MHww&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" medium="image"/><content:encoded><![CDATA[<img src="https://images.unsplash.com/photo-1543966888-7c1dc482a810?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDE2fHxqYXZhc2NyaXB0fGVufDB8fHx8MTcxNTYzODg3MHww&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" alt="&#xB354;&#xBBF8; &#xB370;&#xC774;&#xD130; &#xC0DD;&#xC131;&#xAE30; - Mock2CSV"><p></p><h2 id="mock-data-%EC%83%9D%EC%84%B1%EA%B8%B0%EC%9D%98-%ED%95%84%EC%9A%94%EC%84%B1">Mock Data &#xC0DD;&#xC131;&#xAE30;&#xC758; &#xD544;&#xC694;&#xC131;</h2><ul><li>dummy data &#xB97C; &#xB300;&#xB7C9;&#xC73C;&#xB85C; &#xC0DD;&#xC0B0;&#xD558;&#xAE30; &#xC704;&#xD574;&#xC11C;&#xB294; &#xBA87; &#xAC00;&#xC9C0; &#xBC29;&#xBC95;&#xC774; &#xC788;&#xC5C8;&#xB2E4;.<ul><li>mock generator (web) &#xC774;&#xC6A9;</li><li>procedure &#xC791;&#xC131;</li><li>&#xC9C1;&#xC811; &#xCF54;&#xB4DC; &#xC791;&#xC131;</li></ul></li><li>mock generator &#xC758; &#xACBD;&#xC6B0; &#xAC04;&#xD3B8;&#xD558;&#xAC8C; &#xB9CC;&#xB4E4;&#xAE30;&#xB294; &#xD558;&#xC9C0;&#xB9CC;, &#xBC31; &#xB9CC; &#xAC74;&#xC774; &#xCD08;&#xACFC;&#xD558;&#xB294; &#xACBD;&#xC6B0;&#xC5D0; &#xD574;&#xB2F9; web &#xC5D0;&#xC11C; &#xC751;&#xB2F5;&#xC744; &#xD558;&#xC9C0; &#xC54A;&#xAC70;&#xB098;, &#xC720;&#xB8CC; &#xACB0;&#xC81C;&#xAC00; &#xD544;&#xC694;&#xD588;&#xB2E4;. &#xD2B9;&#xD788;, csv &#xB85C; export &#xD574;&#xC11C; <code>LOAD DATA</code> &#xB97C; &#xD1B5;&#xD574;&#xC11C; &#xC801;&#xC7AC;&#xD560; &#xACBD;&#xC6B0; &#xBC31; &#xB9CC; &#xAC74;&#xC5D0; 30&#xCD08; &#xBBF8;&#xB9CC;&#xC73C;&#xB85C; &#xC544;&#xC8FC; &#xBE60;&#xB974;&#xAC8C; &#xC801;&#xC7AC;&#xD560; &#xC218; &#xC788;&#xC5C8;&#xC73C;&#xB098;, &#xCC9C; &#xB9CC; &#xAC74; &#xC774;&#xC0C1;&#xC758; &#xB370;&#xC774;&#xD130;&#xB97C; &#xD68D;&#xB4DD; &#xBD88;&#xAC00;&#xD558;&#xC5EC; &#xC544;&#xC27D;&#xAC8C;&#xB3C4; &#xC81C;&#xC678;&#xD588;&#xB2E4;.</li><li>procedure &#xC758; &#xACBD;&#xC6B0; insert into &#xAD6C;&#xBB38;&#xC744; loop &#xB3CC;&#xBA74;&#xC11C; &#xC8FC;&#xC785;&#xD55C;&#xB2E4;. &#xAF64;&#xB098; &#xD3B8;&#xB9AC;&#xD55C; &#xBC29;&#xBC95;&#xC774;&#xACE0;, BULK INSERT &#xB97C; &#xD65C;&#xC6A9;&#xD55C;&#xB2E4;&#xBA74; &#xB354; &#xBE60;&#xB978; &#xC801;&#xC7AC;&#xB97C; &#xD560; &#xC218; &#xC788;&#xB2E4;. &#xB2E4;&#xB9CC;, &#xC0DD;&#xC131;&#xD560; &#xC218; &#xC788;&#xB294; &#xB370;&#xC774;&#xD130;&#xC758; &#xD615;&#xD0DC;&#xAC00; &#xD55C;&#xC815;&#xB418;&#xC5B4;&#xC788;&#xB2E4;.</li><li>&#xC9C1;&#xC811; &#xCF54;&#xB4DC;&#xB97C; &#xC791;&#xC131;&#xD558;&#xB294; &#xBC29;&#xBC95;&#xC758; &#xACBD;&#xC6B0;, <code>json-schema-faker</code> &#xB77C;&#xB294; &#xB77C;&#xC774;&#xBE0C;&#xB7EC;&#xB9AC;&#xB97C; &#xACB0;&#xD569;&#xD558;&#xC5EC; &#xD65C;&#xC6A9;&#xD558;&#xB294; &#xBC29;&#xBC95;&#xC774; &#xC788;&#xC5C8;&#xB2E4;. &#xADF8;&#xB7EC;&#xB098;, <code>json-schema-faker</code> &#xB97C; &#xC774;&#xC6A9;&#xD558;&#xB824;&#xBA74;, <code>json-schema</code> &#xB97C; &#xC791;&#xC131;&#xD574;&#xC57C;&#xD558;&#xACE0;, <code>faker</code> &#xB97C; &#xD1B5;&#xD574;&#xC11C;&#xB9CC; &#xB370;&#xC774;&#xD130; &#xC0DD;&#xC131;(&#xBB3C;&#xB860; &#xD53C;&#xD558;&#xB294; &#xBC29;&#xBC95;&#xC774; &#xC788;&#xAE30;&#xB294; &#xD568;.)&#xD574;&#xC57C;&#xD574;&#xC11C;, &#xB2E4;&#xC18C; &#xBD88;&#xD3B8;&#xD568;&#xC744; &#xB290;&#xAF08;&#xB2E4;.</li><li>&#xACB0;&#xACFC;&#xC801;&#xC73C;&#xB85C;, Programmable &#xD558;&#xAC8C; &#xCF54;&#xB4DC;&#xB85C; &#xAC04;&#xB2E8;&#xD558;&#xAC8C; &#xC791;&#xC131;&#xD558;&#xC5EC; &#xC6D0;&#xD558;&#xB294; &#xD615;&#xD0DC;&#xC758; &#xB370;&#xC774;&#xD130;&#xB97C; &#xBE60;&#xB974;&#xAC8C; csv &#xD30C;&#xC77C; &#xB9CC;&#xB4E4;&#xC5B4;&#xB0B4;&#xB294; &#xB77C;&#xC774;&#xBE0C;&#xB7EC;&#xB9AC;&#xB97C; &#xD558;&#xB098; &#xB9CC;&#xB4DC;&#xB294; &#xAC83;&#xC774; &#xB354; &#xB0AB;&#xACA0;&#xB2E4;&#xB294; &#xD310;&#xB2E8;&#xC744; &#xD588;&#xACE0;, <code>mock2csv</code> &#xB77C;&#xC774;&#xBE0C;&#xB7EC;&#xB9AC;&#xB97C; &#xC81C;&#xC791;&#xD588;&#xB2E4;.</li></ul><h2 id="mock2csv">Mock2CSV</h2><ul><li>&#xC5B8;&#xC5B4;&#xB294; typescript &#xB97C; &#xC120;&#xD0DD;&#xD588;&#xB2E4;.<ul><li>npm &#xC5D0;&#xC11C; &#xD65C;&#xC6A9;&#xD560; &#xC218; &#xC788;&#xB294; &#xB77C;&#xC774;&#xBE0C;&#xB7EC;&#xB9AC;&#xAC00; &#xB9CE;&#xC558;&#xC73C;&#xBA70;, &#xD558;&#xB098; &#xBAA8;&#xB4C8; &#xC791;&#xC131;&#xD558;&#xB294;&#xB370; &#xCF54;&#xB4DC; &#xC791;&#xC131; &#xC2DC;&#xAC04;&#xC774; &#xC9E7;&#xB2E4;.</li><li>Web GUI &#xB97C; &#xAD6C;&#xC131;&#xD558;&#xACE0;&#xC790; &#xD558;&#xB294; &#xC695;&#xC2EC;&#xC774; &#xC788;&#xC5C8;&#xACE0;, Web GUI &#xB97C; &#xB9CC;&#xB4E4;&#xAE30; &#xD3B8;&#xD55C; &#xC5B8;&#xC5B4;&#xAE30;&#xB3C4; &#xD558;&#xB2E4;.</li><li>Java &#xB97C; &#xC120;&#xD0DD;&#xD588;&#xB2E4;&#xBA74;, Entity &#xB97C; &#xB04C;&#xC5B4;&#xB2E4;&#xC640;&#xC11C; convert &#xD560; &#xC218; &#xC788;&#xB294; &#xC5EC;&#xC9C0;&#xAC00; &#xC788;&#xC5C8;&#xC744; &#xAC83; &#xAC19;&#xB2E4;. &#xB2E4;&#xB9CC;, &#xAC1C;&#xBC1C; / &#xD14C;&#xC2A4;&#xD2B8; / &#xC0AC;&#xC6A9;&#xC5D0;&#xC11C;&#xB294; &#xC624;&#xD788;&#xB824; &#xD234;&#xB85C;&#xC11C; &#xC0AC;&#xC6A9;&#xD558;&#xAE30;&#xC5D0; &#xBD88;&#xD3B8;&#xD558;&#xB2E4;&#xACE0; &#xD310;&#xB2E8;&#xD588;&#xB2E4;.</li></ul></li><li>&#xAE30;&#xC874; &#xB77C;&#xC774;&#xBE0C;&#xB7EC;&#xB9AC; &#xCD5C;&#xB300;&#xD55C; &#xD65C;&#xC6A9;&#xD560; &#xC218; &#xC788;&#xC73C;&#xBA70;, programmable &#xD558;&#xAC8C; &#xCF54;&#xB4DC;&#xB97C; &#xC791;&#xC131;&#xD558;&#xC5EC; csv &#xB85C; &#xC0DD;&#xC131;&#xD560; &#xC218; &#xC788;&#xB3C4;&#xB85D; &#xD558;&#xC600;&#xB2E4;.</li><li>csv &#xD30C;&#xC77C;&#xC744; &#xB9CC;&#xB4DC;&#xB294; &#xBD80;&#xBD84;&#xC740; &#xCD5C;&#xB300;&#xD55C; &#xB77C;&#xC774;&#xBE0C;&#xB7EC;&#xB9AC;&#xC5D0; &#xB9E1;&#xAE30;&#xACE0;, &#xC5B4;&#xB5A4; &#xB370;&#xC774;&#xD130;&#xB97C; &#xC0DD;&#xC131;&#xD574;&#xC57C;&#xD558;&#xB294;&#xC9C0;&#xC5D0; &#xB300;&#xD55C; &#xBD80;&#xBD84;&#xC740; programmable &#xD558;&#xAC8C; &#xC801;&#xC744; &#xC218; &#xC788;&#xB3C4;&#xB85D; &#xD558;&#xACE0; &#xC2F6;&#xC5C8;&#xB2E4;. <code>json-schema-faker</code> &#xC758; &#xACBD;&#xC6B0; &#xC815;&#xC801;&#xC778; <code>json-schema</code> &#xB97C; &#xD1B5;&#xD574;&#xC11C; &#xC0DD;&#xC131;&#xD574;&#xC57C;&#xD558;&#xAE30;&#xC5D0;, &#xBD88;&#xD3B8;&#xD568;&#xC744; &#xB290;&#xAF08;&#xAE30; &#xB54C;&#xBB38;&#xC774;&#xB2E4;.</li><li>&#xB530;&#xB77C;&#xC11C;, &#xAC04;&#xB2E8;&#xD55C; interface &#xB97C; schema &#xB85C; &#xC815;&#xD588;&#xB2E4;. (schema &#xAC00; &#xC801;&#xC808;&#xD55C; &#xB2E8;&#xC5B4; &#xC120;&#xD0DD;&#xC778;&#xC9C0;&#xB294; &#xBAA8;&#xB974;&#xACA0;&#xC9C0;&#xB9CC;...)</li></ul><h3 id="schema">Schema</h3><pre><code class="language-typescript">export interface Schema {
	[key: string]: () =&gt; string;
}

let uid = 1;
const User: Schema = {
	user_id : () =&gt; (uid++).toString(),
	nickname: () =&gt; faker.internet.userName(),
	...
}
</code></pre><p><code>Schema interface</code> &#xB294; &#xC544;&#xC8FC; &#xB2E8;&#xC21C;&#xD558;&#xB2E4;. <code>Object</code> &#xC758; <code>key</code> &#xB294; &#xAC01; <code>column</code> &#xC744; &#xC758;&#xBBF8;&#xD558;&#xBA70;, &#xAC01; <code>column</code> &#xC758; &#xC0DD;&#xC0B0; &#xBC29;&#xBC95;&#xC744; <code>lambda function </code>&#xC73C;&#xB85C; &#xC815;&#xC758;&#xD55C;&#xB2E4;. &#xC774;&#xB807;&#xAC8C;&#xD558;&#xBA74;, <code>faker</code> &#xC5D0;&#xC11C; &#xCC98;&#xB9AC;&#xD558;&#xC9C0; &#xBABB;&#xD558;&#xB294; &#xB2E4;&#xC591;&#xD55C; &#xD0C0;&#xC785;&#xB3C4; &#xB2E4;&#xB978; library &#xB97C; &#xB04C;&#xC5B4;&#xC640;&#xC11C; &#xB300;&#xCCB4;&#xD558;&#xAC70;&#xB098; &#xC9C1;&#xC811; &#xC791;&#xC131;&#xD560; &#xC218; &#xC788;&#xB2E4;. &#xB610;&#xD55C;, <code>id</code> &#xC640; &#xAC19;&#xC740;<code>sequence</code> &#xB610;&#xD55C; &#xAC04;&#xB2E8;&#xD55C; &#xCF54;&#xB4DC;&#xB85C; &#xCC98;&#xB9AC;&#xAC00; &#xAC00;&#xB2A5;&#xD558;&#xB2E4;.</p><h3 id="mock2csv-1">Mock2CSV</h3><pre><code class="language-typescript">class Mock2CSV {
	// member variables..
	constructor(options?: Options) {
      ...
    }

    generate(schema: Schema, recordNum: number, filePath: string) {
      ...
    }
    
    generateToStream(schema: Schema, recordNum: number, stream: WriteStream) {
      ...
    }
}
</code></pre><p>csv &#xB97C; &#xB9CC;&#xB4DC;&#xB294; class &#xB85C; <code>Mock2CSV</code> &#xB77C;&#xB294; &#xD074;&#xB798;&#xC2A4;&#xB97C; &#xB9CC;&#xB4E4;&#xC5C8;&#xB2E4;. &#xD574;&#xB2F9; &#xD074;&#xB798;&#xC2A4;&#xB294; csv &#xD615;&#xC2DD;&#xC758; &#xB370;&#xC774;&#xD130;&#xB97C; <code>schema&#xB97C;</code> &#xBC14;&#xD0D5;&#xC73C;&#xB85C; &#xC81C;&#xC791;&#xD558;&#xB294; &#xCC45;&#xC784;&#xC744; &#xAC00;&#xC9C0;&#xACE0; &#xC788;&#xB2E4;. web &#xBC84;&#xC804;&#xC758; mock generator &#xB97C; &#xCC38;&#xACE0;&#xD558;&#xC5EC;, <code>quote, escape, delimiter, newline</code> &#xC744; configuration &#xD560; &#xC218; &#xC788;&#xB3C4;&#xB85D; &#xD574;&#xB450;&#xC5C8;&#xB2E4;.</p><p>&#xCD08;&#xAE30; &#xBC84;&#xC804;&#xC5D0;&#xC11C;&#xB294; <code>Mock2CSV</code> &#xAC1D;&#xCCB4; &#xC0DD;&#xC131; &#xACFC;&#xC815;&#xC5D0;&#xC11C; <code>schema, recordNum, filePath</code> &#xB4F1;&#xC744; &#xC8FC;&#xC785;&#xD588;&#xB2E4;. &#xADF8;&#xB7EC;&#xB098;, &#xADF8;&#xB807;&#xAC8C; &#xC0AC;&#xC6A9;&#xD560; &#xACBD;&#xC6B0; &#xC0C8;&#xB85C;&#xC6B4; schema &#xC5D0; &#xB300;&#xD574;&#xC11C; &#xC0DD;&#xC0B0;&#xC744; &#xD560; &#xB54C;&#xB9C8;&#xB2E4; &#xAC1D;&#xCCB4;&#xB97C; &#xC0C8;&#xB85C; &#xC0DD;&#xC131;&#xD574;&#xC57C;&#xD55C;&#xB2E4;. &#xB530;&#xB77C;&#xC11C;, csv &#xB97C; &#xC5B4;&#xB5BB;&#xAC8C; &#xD3EC;&#xBA54;&#xD305;&#xD560; &#xC9C0;&#xC5D0; &#xB300;&#xD55C; &#xC124;&#xC815;&#xB9CC;&#xC744; &#xD558;&#xACE0; <code>generate(schema, recordNum, filePath)</code> &#xB97C; &#xD1B5;&#xD574;&#xC11C; &#xC5EC;&#xB7EC; &#xBC88; &#xC7AC;&#xC0AC;&#xC6A9;&#xD560; &#xC218; &#xC788;&#xB3C4;&#xB85D; &#xBCC0;&#xACBD;&#xD558;&#xC600;&#xB2E4;.</p><p> <code>generateToStream(schema, recordNum, stream)</code> &#xB610;&#xD55C; &#xCD94;&#xAC00;&#xD588;&#xB2E4;. &#xC774;&#xB294; stream &#xC744; &#xD1B5;&#xD574;&#xC11C; &#xC678;&#xBD80;&#xC5D0; &#xC804;&#xC1A1;&#xD558;&#xB294; &#xACBD;&#xC6B0;&#xB97C; &#xC5FC;&#xB450;&#xC5D0; &#xB454; &#xAC83;&#xC774;&#xB2E4;. web GUI &#xB97C; &#xAC04;&#xB7B5;&#xD558;&#xAC8C; &#xBD99;&#xC5EC;&#xC11C; Mock Generator &#xC640; &#xAC19;&#xC740; &#xD658;&#xACBD;&#xC744; &#xBCF4;&#xB2E4; &#xC27D;&#xAC8C; &#xB9CC;&#xB4E4;&#xC5B4;&#xB0B4;&#xAE30; &#xC704;&#xD568;&#xC774;&#xB2E4;. &#xC774;&#xD6C4; &#xC791;&#xC5C5;&#xC774; &#xC788;&#xB2E4;&#xBA74; Schema &#xB97C; &#xC678;&#xBD80; GUI &#xB97C; &#xD1B5;&#xD574;&#xC11C; &#xC120;&#xD0DD;&#xD558;&#xACE0; &#xC774;&#xB97C; &#xAC1D;&#xCCB4;&#xB85C; &#xB9CC;&#xB4E0; &#xD6C4; generation &#xD560; &#xC218; &#xC788;&#xB294; &#xD615;&#xD0DC;&#xB85C; &#xB9CC;&#xB4E4;&#xC5B4;&#xB0B4;&#xB294; &#xACFC;&#xC815;&#xC774; &#xB420; &#xAC83;&#xC774;&#xB2E4;. (&#xD639;&#xC740; &#xC608;&#xC678;&#xCC98;&#xB9AC;?)</p><p> <code>generateAsync</code> &#xB97C; <code>v0.0.7</code> &#xC5D0;&#xC11C; &#xCD94;&#xAC00;&#xD558;&#xC600;&#xB2E4;. <code>LOAD DATA</code> &#xC2E4;&#xD5D8; &#xC911;&#xC5D0; &#xB098;&#xB220;&#xC9C4; &#xB370;&#xC774;&#xD130;&#xB97C; &#xC8FC;&#xC785;&#xD558;&#xAE30; &#xC704;&#xD574; &#xD55C; &#xBC88;&#xC5D0; 20&#xAC1C;&#xC758; csv &#xD30C;&#xC77C;&#xC744; &#xC0DD;&#xC131;&#xD574;&#xC57C;&#xD588;&#xB2E4;. &#xB2E8;&#xC77C; &#xD30C;&#xC77C;&#xC744; &#xCC98;&#xB9AC;&#xD558;&#xB294; &#xACBD;&#xC6B0;&#xC5D0;&#xB294; &#xAD1C;&#xCC2E;&#xC558;&#xC73C;&#xB098;, &#xD604;&#xC7AC; &#xCF54;&#xB4DC;&#xC758; &#xACBD;&#xC6B0;&#xC5D0;&#xB294; &#xBAA8;&#xB4E0;  stream &#xC774; &#xC885;&#xB8CC;&#xB418;&#xACE0; &#xB09C; &#xC774;&#xD6C4;&#xC5D0;&#xC57C; &#xD30C;&#xC77C;&#xC774; &#xD55C;&#xBC88;&#xC5D0; &#xC0DD;&#xC131;&#xB418;&#xB294;&#xB370; &#xC801;&#xC808;&#xD55C; &#xB3D9;&#xC791;&#xC740; &#xC544;&#xB2C8;&#xB77C;&#xACE0; &#xC0DD;&#xAC01;&#xB418;&#xC5C8;&#xB2E4;.  &#xB54C;&#xBB38;&#xC5D0;, <code>Async</code> &#xAC00; &#xC9C0;&#xC6D0;&#xB418;&#xB294; API &#xB97C; &#xCD94;&#xAC00;&#xD558;&#xC600;&#xB2E4;. </p><h3 id="%08%EA%B0%9C%EB%B0%9C%ED%95%98%EB%A9%B4%EC%84%9C">&#xAC1C;&#xBC1C;&#xD558;&#xBA74;&#xC11C; ...</h3><p><code>v0.0.6</code> &#xAE4C;&#xC9C0;&#xB294; &#xD14C;&#xC2A4;&#xD2B8; &#xC5C6;&#xC774; &#xCF54;&#xB4DC;&#xB97C; &#xC791;&#xC131;&#xD558;&#xC600;&#xB294;&#xB370;, &#xC548;&#xC815;&#xC131;&#xC774; &#xB108;&#xBB34; &#xB5A8;&#xC5B4;&#xC84C;&#xB2E4;. &#xD2B9;&#xD788;, <code>async</code>  api &#xD558;&#xB098; &#xB4E4;&#xC5B4;&#xC624;&#xAE30; &#xC2DC;&#xC791;&#xD558;&#xB2C8;, &#xD14C;&#xC2A4;&#xD2B8; &#xD504;&#xB808;&#xC784;&#xC6CC;&#xD06C;&#xC758; &#xB3C4;&#xC6C0;&#xC774; &#xC808;&#xC2E4;&#xD574;&#xC84C;&#xB2E4;. <code>vitest</code> &#xAC00; &#xAE54;&#xB054;&#xD558;&#xB2C8; &#xAD1C;&#xCC2E;&#xC544;&#xBCF4;&#xC5EC; &#xB3C4;&#xC785;&#xD558;&#xC600;&#xACE0;, &#xB355;&#xBD84;&#xC5D0; <code>escape</code> &#xB97C; &#xCC98;&#xB9AC;&#xD558;&#xACE0; &#xC788;&#xC9C0; &#xC54A;&#xC558;&#xB358; &#xBB38;&#xC81C;&#xB85C; &#xD568;&#xAED8; &#xC218;&#xC815;&#xD560; &#xC218; &#xC788;&#xC5C8;&#xB2E4;. (&#xC5ED;&#xC2DC; &#xD14C;&#xC2A4;&#xD2B8;&#xB294; &#xC120;&#xD0DD;&#xC774; &#xC544;&#xB2CC; &#xD544;&#xC218;&#xC774;&#xB2E4;)  &#xB2E4;&#xB9CC;, api &#xC5D0; &#xB300;&#xD55C; e2e &#xD14C;&#xC2A4;&#xD2B8;&#xB9CC; &#xC218;&#xD589;&#xD558;&#xACE0; &#xB0B4;&#xBD80; private method &#xC5D0; &#xB300;&#xD55C; &#xAC80;&#xC99D;&#xC740; &#xC544;&#xC9C1; &#xD558;&#xC9C0; &#xBABB;&#xD588;&#xB2E4;. (&#xC544;&#xB9C8; &#xBC29;&#xBC95;&#xC774; &#xC788;&#xC744; &#xAC83; &#xAC19;&#xC740;&#xB370;, &#xC870;&#xAE08; &#xCC3E;&#xC544;&#xBD10;&#xC57C;&#xD560; &#xB4EF; &#xC2F6;&#xB2E4;.)</p><p><code>option</code> &#xAD00;&#xB828;&#xD574;&#xC11C;&#xB3C4; &#xACE0;&#xBBFC;&#xC774; &#xB9CE;&#xC558;&#xC5C8;&#xB2E4;. (&#xBB3C;&#xB860; &#xB098;&#xB9CC; &#xC4F0;&#xC9C0;&#xB9CC;) &#xB2E4;&#xB978; &#xC0AC;&#xB78C;&#xC774; &#xC0AC;&#xC6A9;&#xD55C;&#xB2E4;&#xBA74; &#xC5B4;&#xB5BB;&#xAC8C; &#xCC98;&#xB9AC;&#xD558;&#xB294; &#xAC83;&#xC774; &#xC870;&#xAE08; &#xB354; &#xD3B8;&#xB9AC;&#xD560;&#xAE4C;? &#xB77C;&#xB294; &#xACE0;&#xBBFC;&#xC5D0; &#xB300;&#xD574;&#xC11C; &#xB9CE;&#xC774; &#xD558;&#xAC8C; &#xB418;&#xC5C8;&#xB2E4;. &#xCD08;&#xAE30;&#xC5D0;&#xB294; <code>fn(options: Options = new Option())</code>  &#xD615;&#xD0DC;&#xB97C; &#xCDE8;&#xD588;&#xB294;&#xB370;, &#xC720;&#xC5F0;&#xC131;&#xC774; &#xBD80;&#xC871;&#xD588;&#xB2E4;. &#xC774;&#xD6C4;&#xC5D0; <code>fn(options?: Options | Object)</code> &#xD615;&#xD0DC;&#xB85C; &#xBCC0;&#xACBD;&#xD558;&#xC600;&#xACE0;, <code>this.options = { new DefaultOption(), ...options};</code> &#xB85C; &#xBCC0;&#xACBD;&#xD558;&#xBA70; <code>Option</code> &#xAC1D;&#xCCB4;&#xB97C; &#xBAA8;&#xB450; &#xBC1B;&#xC9C0; &#xC54A;&#xC544;&#xB3C4; &#xC124;&#xC815;&#xC774; &#xAC00;&#xB2A5;&#xD558;&#xB3C4;&#xB85D; &#xBCC0;&#xACBD;&#xD588;&#xB2E4;. &#xC544;&#xB9C8; &#xB2E4;&#xB978; &#xBC29;&#xBC95;&#xC774; &#xB354; &#xC788;&#xC744; &#xAC83; &#xAC19;&#xAE30;&#xB294; &#xD558;&#xB098;, &#xD604;&#xC7AC;&#xB294; &#xB9CC;&#xC871;.</p><p>&#xC544;&#xBB34;&#xD2BC;, &#xB9CC;&#xB4E0; &#xC774;&#xD6C4; &#xC774;&#xC804; &#xC791;&#xC131;&#xAE00;&#xC5D0;&#xC11C; LOAD DATA &#xB97C; &#xD14C;&#xC2A4;&#xD2B8;&#xD558;&#xB294;&#xB370; &#xAD49;&#xC7A5;&#xD788; &#xC720;&#xC6A9;&#xD558;&#xAC8C; &#xD65C;&#xC6A9;&#xD588;&#xB2E4;. &#xB370;&#xC774;&#xD130; &#xC0DD;&#xC131; &#xB85C;&#xC9C1; &#xC790;&#xCCB4;&#xAC00; &#xB208;&#xC5D0; &#xC798; &#xB4E4;&#xC5B4;&#xC640;&#xC11C; &#xD3B8;&#xB9AC;&#xD588;&#xACE0;, &#xB098;&#xB984; &#xC798; &#xB9CC;&#xB4E0; &#xAC83; &#xAC19;&#xB2E4;&#xB294; &#xC0DD;&#xAC01;&#xC774; &#xB4E0;&#xB2E4;.</p><h3 id="example">example</h3><p>&#xC0AC;&#xC6A9; &#xBC29;&#xBC95;&#xC740; &#xC5B4;&#xB835;&#xC9C0; &#xC54A;&#xB2E4;. <code>schema</code> &#xB97C; &#xC815;&#xC758;&#xD558;&#xACE0;, <code>Mock2CSV instance</code> &#xC5D0;&#xC11C; <code>.generate(schema, recordNum, filePath);</code> &#xB97C; &#xD638;&#xCD9C;&#xD558;&#xBA74; &#xB41C;&#xB2E4;.</p><pre><code class="language-typescript">import { bcrypt, Schema, faker, moment, Mock2CSV } from &quot;mock2csv&quot;;

let user_id = 1;
const pw = bcrypt.hashSync(&quot;password123&quot;, 10); // encrypt password (encryption is time-consuming)

const User: Schema = {
	userId: () =&gt; (user_id++).toString(),
	nickname: () =&gt; faker.internet.userName(),
	email: () =&gt; faker.internet.email(),
	password: () =&gt; pw,
	createdAt: () =&gt; moment().tz(&quot;Asia/Seoul&quot;).format(&quot;YYYY-MM-DDTHH:mm:ss.SSSSSSZ&quot;),
	updatedAt: () =&gt; moment().tz(&quot;Asia/Seoul&quot;).format(&quot;YYYY-MM-DDTHH:mm:ss.SSSSSSZ&quot;),
};

const m2c = new Mock2CSV();  

m2c.generate(User, 1e3, &quot;user.csv&quot;);
</code></pre><h3 id="%EB%B0%B0%ED%8F%AC">&#xBC30;&#xD3EC;</h3><ul><li>npm &#xC5D0; &#xBC30;&#xD3EC;&#xD558;&#xB294; &#xAC83;&#xC740; &#xCC98;&#xC74C;&#xC774;&#xC5C8;&#xB2E4;. typescript &#xB97C; &#xB9CC;&#xC9C4;&#xC9C0; &#xAF64; &#xB418;&#xC5B4; &#xAD8C;&#xC7A5; &#xC124;&#xC815;&#xC73C;&#xB85C; &#xB300;&#xCDA9; &#xB9CC;&#xB4E4;&#xC5B4;&#xB0C8;&#xB2E4;.</li><li>&#xC0AC;&#xC18C;&#xD55C; &#xBCC0;&#xACBD; &#xC0AC;&#xD56D;(<code>README.md</code> &#xC218;&#xC815;&#xC774;&#xB098; <code>package.json</code> &#xC218;&#xC815;)&#xC5D0;&#xB3C4; &#xC0C8;&#xB85C;&#xC6B4; &#xBC84;&#xC804;&#xC744; publish &#xD574;&#xC57C;&#xD588;&#xB2E4;. &#xBC84;&#xC804;&#xC744; &#xC758;&#xBBF8;&#xC5C6;&#xC774; &#xB9CE;&#xC774; &#xC62C;&#xB838;&#xB294;&#xB370;, &#xC870;&#xAE08; &#xB354; &#xC2E0;&#xC911;&#xD558;&#xAC8C; &#xC218;&#xC815; / &#xBC30;&#xD3EC;&#xAC00; &#xD544;&#xC694;&#xD568;&#xC744; &#xB290;&#xAF08;&#xB2E4;.</li><li>&#xB2E8;&#xC21C;&#xD55C; &#xCF54;&#xB4DC;&#xC774;&#xAE30;&#xB294; &#xD558;&#xB098;, &#xC774;&#xB807;&#xAC8C; &#xBC30;&#xD3EC;&#xD558;&#xB294; &#xAC83;&#xC740; &#xCC98;&#xC74C;&#xC774;&#xB77C; &#xC0C9;&#xB2E4;&#xB978; &#xACBD;&#xD5D8;(?) &#xC774;&#xC5C8;&#xB2E4;. &#xB098; &#xB9D0;&#xACE0; &#xC0AC;&#xC6A9;&#xD560; &#xC0AC;&#xB78C;&#xC774; &#xB354; &#xC788;&#xC744;&#xC9C0;&#xB294; &#xBAA8;&#xB974;&#xACA0;&#xC73C;&#xB098;, &#xC5C5;&#xB370;&#xC774;&#xD2B8;&#xC2DC;&#xC5D0; &#xC774;&#xAC83;&#xC800;&#xAC83; &#xC8FC;&#xC758;&#xD574;&#xC57C;&#xD560; &#xAC83;&#xB4E4;&#xC774; &#xB9CE;&#xC774; &#xBCF4;&#xC778;&#xB2E4;. (&#xB9CC;&#xB4E4;&#xC790;&#xB9C8;&#xC790; <code>deprecated</code> &#xB418;&#xC5B4;&#xBC84;&#xB9B0; &#xACBD;&#xC6B0;&#xB3C4; &#xC788;&#xC5C8;&#xB294;&#xB370;, &#xC2E4;&#xC81C; &#xB204;&#xAC00; &#xC0AC;&#xC6A9;&#xD558;&#xB294; &#xB77C;&#xC774;&#xBE0C;&#xB7EC;&#xB9AC;&#xB77C;&#xBA74; &#xACE4;&#xB780;&#xD588;&#xC744; &#xAC83;&#xC774;&#xB2E4;.)</li><li>typescript &#xC5D0;&#xC11C; &#xC190; &#xB5C0;&#xC9C0; &#xC2DC;&#xAC04;&#xC774; &#xC880; &#xB410;&#xB294;&#xB370;, &#xAD00;&#xB828; configuration &#xC7A1;&#xB294; &#xAC83;&#xC5D0; &#xB300;&#xD574;&#xC11C;&#xB3C4; &#xB2E4;&#xC2DC; &#xC9DA;&#xACE0; &#xB118;&#xC5B4;&#xAC08; &#xD544;&#xC694;&#xAC00; &#xC788;&#xC5C8;&#xB2E4;.</li><li>&#xBC30;&#xD3EC;&#xD55C; &#xB77C;&#xC774;&#xBE0C;&#xB7EC;&#xB9AC;&#xB294; &#xC544;&#xB798;&#xC5D0;&#xC11C; &#xBCFC; &#xC218; &#xC788;&#xB2E4;.<ul><li><a href="https://www.npmjs.com/package/mock2csv">mock2csv-npm</a></li><li><a href="https://github.com/JuneParkCode/Mock2CSV">github</a></li></ul></li></ul>]]></content:encoded></item><item><title><![CDATA[대량의 더미 데이터 DB에 주입하기]]></title><description><![CDATA[대량의 데이터는 어떻게 DB에 넣어야할까? ]]></description><link>https://life.photogrammer.me/insert-big-data-into-db/</link><guid isPermaLink="false">664186b4f583410001d72264</guid><category><![CDATA[Development]]></category><category><![CDATA[Projects]]></category><category><![CDATA[DB]]></category><dc:creator><![CDATA[Sungjun Park]]></dc:creator><pubDate>Mon, 13 May 2024 03:45:14 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1583521214690-73421a1829a9?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDZ8fGZpbGV8ZW58MHx8fHwxNzE1NjM4OTIxfDA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" medium="image"/><content:encoded><![CDATA[<h2 id="%EB%8C%80%EB%9F%89%EC%9D%98-%EB%8D%94%EB%AF%B8-%EB%8D%B0%EC%9D%B4%ED%84%B0-db%EC%97%90-%EC%A3%BC%EC%9E%85%ED%95%98%EA%B8%B0">&#xB300;&#xB7C9;&#xC758; &#xB354;&#xBBF8; &#xB370;&#xC774;&#xD130; DB&#xC5D0; &#xC8FC;&#xC785;&#xD558;&#xAE30;</h2><img src="https://images.unsplash.com/photo-1583521214690-73421a1829a9?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDZ8fGZpbGV8ZW58MHx8fHwxNzE1NjM4OTIxfDA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" alt="&#xB300;&#xB7C9;&#xC758; &#xB354;&#xBBF8; &#xB370;&#xC774;&#xD130; DB&#xC5D0; &#xC8FC;&#xC785;&#xD558;&#xAE30;"><p>&#xD604;&#xC7AC; &#xB9CC;&#xB4E4;&#xACE0; &#xC788;&#xB294; &#xD1A0;&#xC774; &#xD504;&#xB85C;&#xC81D;&#xD2B8;&#xC5D0;&#xC11C;&#xB294; &#xB300;&#xB7C9;&#xC758; &#xB370;&#xC774;&#xD130;&#xAC00; &#xC874;&#xC7AC;&#xD558;&#xB294; DB &#xB97C; &#xB300;&#xC0C1;&#xC73C;&#xB85C; &#xC5EC;&#xB7EC;&#xAC00;&#xC9C0; &#xD14C;&#xC2A4;&#xD2B8;&#xB97C; &#xC218;&#xD589;&#xD55C;&#xB2E4;. &#xD14C;&#xC2A4;&#xD2B8;&#xB97C; &#xC218;&#xD589;&#xD558;&#xAE30; &#xC704;&#xD574;&#xC11C; &#xB354;&#xBBF8; &#xB370;&#xC774;&#xD130;&#xB97C; &#xC8FC;&#xC785;&#xD560; &#xBC29;&#xBC95;&#xC5D0; &#xB300;&#xD574;&#xC11C; &#xBAA8;&#xC0C9;&#xD574;&#xC57C;&#xD588;&#xB2E4;.</p><h3 id="sql-procedure">SQL Procedure</h3><ul><li>SQL &#xBB38;&#xC73C;&#xB85C; &#xC9C1;&#xC811; &#xD14C;&#xC774;&#xBE14;&#xC5D0; &#xB370;&#xC774;&#xD130;&#xB97C; &#xC8FC;&#xC785;&#xD55C;&#xB2E4;.</li><li>&#xC9C1;&#xC811; <code>Insert into () values ();</code> &#xC640; &#xAC19;&#xC740; &#xAD6C;&#xBB38;&#xC744; &#xC791;&#xC131;&#xD560; &#xC218;&#xB3C4; &#xC788;&#xC9C0;&#xB9CC;, Procedure &#xD639;&#xC740; function &#xC744; &#xC9C1;&#xC811; &#xC791;&#xC131;&#xD558;&#xC5EC; &#xD574;&#xACB0;&#xD558;&#xB294; &#xD3B8;&#xC774; &#xB0AB;&#xB2E4;.</li><li>Procedure &#xC608;&#xC2DC;</li></ul><pre><code class="language-SQL">  
DROP PROCEDURE IF EXISTS init_perfomances $$  
CREATE  PROCEDURE init_perfomances(  
    IN num_rows INT  
) BEGIN  
    DECLARE i INT DEFAULT 1;  
    DECLARE name VARCHAR(255);  
    DECLARE start_at TIMESTAMP;  
    DECLARE end_at TIMESTAMP;  
    DECLARE created_at TIMESTAMP;  
    DECLARE updated_at TIMESTAMP;  
--  loop num_rows times  
    WHILE i &lt;= num_rows DO  
        SET name = CONCAT(&apos;name_&apos;, i);  
        SET created_at = FROM_UNIXTIME(UNIX_TIMESTAMP(&apos;2020-01-01&apos;) + FLOOR(RAND() * (UNIX_TIMESTAMP(&apos;2024-01-01&apos;) - UNIX_TIMESTAMP(&apos;2020-01-01&apos;))));  
        SET updated_at = created_at;  
#         start at is a random time larger than created Time  
        SET start_at = FROM_UNIXTIME(UNIX_TIMESTAMP(created_at) +  
                                     FLOOR(RAND() * (UNIX_TIMESTAMP(&apos;2024-01-01&apos;) - UNIX_TIMESTAMP(created_at))));  
#         end at is a random time larger than start Time  
        SET end_at = FROM_UNIXTIME(UNIX_TIMESTAMP(start_at) +  
                                   FLOOR(RAND() * (UNIX_TIMESTAMP(&apos;2024-01-01&apos;) - UNIX_TIMESTAMP(start_at))));  
        INSERT INTO performances (performance_id, name, start_at, end_at, created_at, updated_at) VALUES (i, name, start_at, end_at, created_at, updated_at);  
        SET i = i + 1;  
    END WHILE;  
END $$
</code></pre><ul><li>Procedure &#xC744; &#xC0AC;&#xC6A9;&#xD560; &#xACBD;&#xC6B0; 8 min per 1,000,000 rows &#xC815;&#xB3C4; &#xAC78;&#xB9B0;&#xB2E4;.<ul><li>&#xC774;&#xB294; loop &#xB85C; 100 &#xB9CC; &#xAC74;&#xC758; insert into &#xB97C; &#xD558;&#xAE30; &#xB54C;&#xBB38;&#xC5D0; &#xB354; &#xB290;&#xB9AC;&#xB2E4;. </li><li>&#xB2E8;&#xC21C; &#xD14C;&#xC2A4;&#xD2B8;&#xC5D0;&#xC11C;&#xB294; bulk insert (100  rows split) &#xC73C;&#xB85C; &#xD560; &#xACBD;&#xC6B0; &lt; 40s &#xC815;&#xB3C4; &#xC18C;&#xC694;&#xB41C;&#xB2E4;.</li></ul></li><li>&#xB098;&#xB984; &#xAC04;&#xD3B8;&#xD558;&#xAC8C; &#xB370;&#xC774;&#xD130;&#xB97C; &#xC0DD;&#xC131;&#xD558;&#xACE0; &#xC8FC;&#xC785;&#xD560; &#xC218; &#xC788;&#xB2E4;&#xB294; &#xC7A5;&#xC810;&#xC774; &#xC788;&#xB2E4;.</li><li>&#xB370;&#xC774;&#xD130; &#xC801;&#xC7AC; &#xC18D;&#xB3C4;&#xB85C; &#xB530;&#xC9C0;&#xBA74; &#xD6C4;&#xC5D0; &#xAE30;&#xC220;&#xD560; CSV &#xB97C; &#xD1B5;&#xD55C; LOAD DATA &#xC5D0; &#xBE44;&#xD574;&#xC11C; &#xB9CE;&#xC774; &#xB290;&#xB9B0; &#xD3B8;&#xC774;&#xB2E4;. &#xD558;&#xC9C0;&#xB9CC;, constraint &#xB97C; &#xC798; &#xC9C0;&#xD0A4;&#xBA74;&#xC11C; &#xBE60;&#xB974;&#xAC8C; &#xC791;&#xC131;&#xD558;&#xAE30;&#xC5D0; &#xC6A9;&#xC774;&#xD558;&#xB2E4;&#xB294; &#xC7A5;&#xC810;&#xC774; &#xC788;&#xB2E4;.</li><li>&#xB2E4;&#xB9CC; &#xC774; &#xBC29;&#xBC95;&#xC758; &#xACBD;&#xC6B0; `INSERT INTO `&#xAD6C;&#xBB38;&#xC774; &#xB108;&#xBB34; &#xB9CE;&#xC774; &#xD638;&#xCD9C;&#xB41C;&#xB2E4;. BULK INSERT &#xB97C; &#xC774;&#xC6A9;&#xD558;&#xC5EC; INSERT INTO &#xAD6C;&#xBB38;&#xC758; &#xD638;&#xCD9C; &#xD69F;&#xC218;&#xB97C; &#xC904;&#xC5EC; &#xC5B4;&#xB290;&#xC815;&#xB3C4; &#xC18D;&#xB3C4; &#xC99D;&#xAC00;&#xB97C; &#xAE30;&#xB300;&#xD560; &#xC218; &#xC788;&#xB2E4;.</li><li>Procedure &#xC744; &#xC11C;&#xBC84;&#xC5D0;&#xC11C; &#xC2E4;&#xD589;&#xD558;&#xAE30;&#xB9CC; &#xD558;&#xBA74; &#xB418;&#xBBC0;&#xB85C;, &#xBCC4;&#xB3C4;&#xB85C; &#xB370;&#xC774;&#xD130;&#xB97C; &#xC0DD;&#xC131;&#xD558;&#xACE0; &#xC62E;&#xAE30;&#xAC70;&#xB098; &#xD558;&#xB294; &#xC791;&#xC5C5;&#xC774; &#xD544;&#xC694; &#xC5C6;&#xB2E4;&#xB294; &#xAC83; &#xB610;&#xD55C; &#xD070; &#xC7A5;&#xC810;&#xC774;&#xB2E4;.</li></ul><h3 id="mock-generator">Mock Generator</h3><ul><li><a href="https://generatedata.com/generator">&#xB354;&#xBBF8; &#xB370;&#xC774;&#xD130; &#xC0DD;&#xC131;&#xAE30;</a> &#xC640; &#xAC19;&#xC740; &#xC0DD;&#xC131;&#xAE30;&#xB97C; &#xD65C;&#xC6A9;&#xD558;&#xB294; &#xBC29;&#xBC95;&#xC774;&#xB2E4;. &#xC0DD;&#xC131;&#xAE30;&#xC758; &#xACBD;&#xC6B0; &#xB2E4;&#xC591;&#xD55C; &#xB370;&#xC774;&#xD130; &#xD0C0;&#xC785;&#xC774;&#xB098; &#xC885;&#xB958;&#xC5D0; &#xB300;&#xD574;&#xC11C; &#xC758;&#xBBF8;&#xC788;&#xAC8C; &#xC2DD;&#xBCC4;&#xB418;&#xB294; &#xB2E4;&#xC591;&#xD55C; &#xB370;&#xC774;&#xD130;&#xB97C; &#xC0BD;&#xC785;&#xD55C;&#xB2E4;. &#xC2E4;&#xC81C;&#xC640; &#xAC19;&#xC740; &#xD658;&#xACBD;&#xC744; &#xC77C;&#xBD80; &#xBAA8;&#xC0AC;&#xD558;&#xACE0; &#xC2F6;&#xC744; &#xACBD;&#xC6B0; &#xD574;&#xB2F9; &#xBC29;&#xBC95;&#xC744; &#xC0AC;&#xC6A9;&#xD560; &#xC218; &#xC788;&#xB2E4;.</li><li>csv &#xD3EC;&#xBA67;&#xC73C;&#xB85C; export &#xD574;&#xB450;&#xB294;&#xAC8C; &#xC88B;&#xB2E4;. &#xC544;&#xB798; &#xAE30;&#xC220;&#xB420; <code>LOAD DATA INFILE</code> &#xC744; &#xD65C;&#xC6A9;&#xD558;&#xBA74; &#xBE60;&#xB974;&#xAC8C; &#xB370;&#xC774;&#xD130;&#xB97C; &#xB123;&#xC744; &#xC218; &#xC788;&#xB2E4;.</li><li>&#xD14C;&#xC2A4;&#xD2B8; &#xACB0;&#xACFC; &#xC6F9;&#xC744; &#xD1B5;&#xD55C; Dummy data &#xC0DD;&#xC131;&#xAE30;&#xB294; &#xB300;&#xBD80;&#xBD84; 1,000,000 &#xAC74; &#xC774; &#xCD08;&#xACFC;&#xD560; &#xACBD;&#xC6B0; &#xC4F8; &#xAC83;&#xC774; &#xBABB;&#xB41C;&#xB2E4;. &#xC0DD;&#xC131; &#xC2DC;&#xAC04; &#xC790;&#xCCB4;&#xAC00; &#xB108;&#xBB34; &#xC624;&#xB798;&#xAC78;&#xB9AC;&#xACE0; &#xD574;&#xB2F9; &#xC11C;&#xBC84;&#xC5D0;&#xC11C; timeout &#xC774; &#xB098;&#xB294; &#xAC83;&#xC73C;&#xB85C; &#xBCF4;&#xC778;&#xB2E4;. &#xB354; &#xD070; &#xB370;&#xC774;&#xD130;&#xC758; &#xACBD;&#xC6B0;&#xC5D0;&#xB294; &#xC720;&#xB8CC; &#xACB0;&#xC81C;&#xB85C; &#xD574;&#xACB0;&#xC744; &#xD574;&#xC57C;&#xD55C;&#xB2E4;.</li><li>&#xC9C1;&#xC811; <code>Faker</code> &#xB77C;&#xC774;&#xBE0C;&#xB7EC;&#xB9AC; &#xB4F1;&#xC744; &#xD65C;&#xC6A9;&#xD574;&#xC11C; CSV &#xD30C;&#xC77C;&#xC744; &#xB9CC;&#xB4DC;&#xB294; &#xAC83;&#xB3C4; &#xD55C; &#xBC29;&#xBC95;&#xC774;&#xB2E4;.<ul><li>&#xC8FC;&#xC785;&#xD560; schema &#xB97C; &#xC785;&#xB825; / &#xD544;&#xC694;&#xD55C; format &#xC744; &#xC815;&#xC758;&#xD558;&#xBA74; &#xC790;&#xB3D9;&#xC73C;&#xB85C; &#xC8FC;&#xC785;&#xD558;&#xB3C4;&#xB85D; &#xD55C;&#xB2E4;&#xBA74;, &#xBCF4;&#xB2E4; &#xC27D;&#xAC8C; &#xB9CC;&#xB4E4;&#xC5B4;&#xB0BC; &#xC218; &#xC788;&#xB2E4;.</li><li>&#xB2E4;&#xB9CC;, &#xC774;&#xB97C; &#xC644;&#xC804;&#xD788; &#xC9C0;&#xC6D0;&#xD558;&#xB294; &#xB77C;&#xC774;&#xBE0C;&#xB7EC;&#xB9AC;&#xAC00; &#xC874;&#xC7AC;&#xD558;&#xB294;&#xC9C0;&#xB294; &#xC544;&#xC9C1; &#xBAA8;&#xB974;&#xACA0;&#xB2E4;. &#xC6F9; &#xBC84;&#xC804;&#xC73C;&#xB85C;&#xB294; &#xD604;&#xC7AC; &#xC874;&#xC7AC;&#xD558;&#xB294;&#xB370;, docker &#xC5D0; &#xC62C;&#xB824;&#xC11C; &#xC0AC;&#xC6A9;&#xD560; &#xC218; &#xC788;&#xB3C4;&#xB85D; &#xB77C;&#xC774;&#xBE0C;&#xB7EC;&#xB9AC;&#xB97C; &#xB9CC;&#xB4E4;&#xC5B4;&#xC11C; &#xD558;&#xB098; &#xBC30;&#xD3EC;&#xD558;&#xB294; &#xAC83;&#xB3C4; &#xAD1C;&#xCC2E;&#xC544;&#xBCF4;&#xC778;&#xB2E4;.</li></ul></li></ul><h3 id="load-data">LOAD DATA</h3><ul><li>Mock Generator &#xC640; &#xAC19;&#xC740; &#xD234;&#xC740; &#xC77C;&#xBC18;&#xC801;&#xC73C;&#xB85C; csv, sql &#xBB38; &#xB4F1;&#xC73C;&#xB85C; DB &#xC5D0; &#xC0BD;&#xC785;&#xD560; &#xBC29;&#xBC95;&#xC744; &#xC81C;&#xACF5;&#xD55C;&#xB2E4;. &#xADF8; &#xC911;&#xC5D0;&#xC11C;, csv &#xB97C; &#xD65C;&#xC6A9;&#xD574;&#xC11C; &#xB2E4;&#xC74C;&#xACFC; &#xAC19;&#xC774; load &#xD560; &#xACBD;&#xC6B0; &#xBE60;&#xB974;&#xAC8C; &#xB370;&#xC774;&#xD130;&#xB97C; &#xC0BD;&#xC785;&#xD560; &#xC218; &#xC788;&#xB2E4;.</li></ul><pre><code class="language-bash">mysql --local-infile=1 -u root -p
-- input password.
use test_db;
-- load data from csv
LOAD DATA LOCAL INFILE &apos;/var/lib/mysql/output.csv&apos; INTO TABLE USERS
FIELDS ENCLOSED BY &apos;&quot;&apos; TERMINATED BY &apos;;&apos; ESCAPED BY &apos;&quot;&apos; LINES TERMINATED BY &apos;\n&apos;
(@col1, @col2, @col3, @col4, @col5, @col6) set user_id=@col1,nickname=@col2,email=@col3,password=@col4,created_at=@col5,updated_at=@col6;
</code></pre><ul><li>procedure &#xC758; &#xACBD;&#xC6B0; &#xBC31; &#xB9CC; &#xAC74;&#xC5D0; &#xCD1D; 8&#xBD84; &#xAC00;&#xB7C9; &#xC18C;&#xC694;&#xB41C; &#xBC18;&#xBA74; &#xD574;&#xB2F9; &#xCFFC;&#xB9AC;&#xB85C;&#xB294; 30&#xCD08;&#xB9CC;&#xC5D0; &#xC801;&#xC7AC;&#xAC00; &#xC644;&#xB8CC;&#xB418;&#xC5C8;&#xB2E4;.</li><li>&#xBBF8;&#xB9AC; &#xB370;&#xC774;&#xD130;&#xB97C; csv &#xB85C; &#xC0DD;&#xC131;&#xD560; &#xC218; &#xC788;&#xB2E4;&#xBA74; &#xD574;&#xB2F9; &#xBC29;&#xBC95;&#xC744; &#xD1B5;&#xD558;&#xB294; &#xAC83;&#xC774; &#xAC00;&#xC7A5; &#xBE60;&#xB974;&#xB2E4;.</li><li><a href="https://dev.mysql.com/doc/refman/8.0/en/load-data.html">MySQL - LOAD DATA</a></li></ul><h4 id="load-data-%ED%85%8C%EC%8A%A4%ED%8A%B8">LOAD DATA &#xD14C;&#xC2A4;&#xD2B8;</h4><ul><li>100 &#xB9CC;&#xAC74; &#xC8FC;&#xC785; &#xC2DC;&#xC5D0;&#xB294; &#xC57D; 20&#xCD08;&#xC5D0; &#xC801;&#xC7AC;&#xAC00; &#xC644;&#xB8CC;&#xB418;&#xC5C8;&#xC73C;&#xB098;, 1,000 &#xB9CC;&#xAC74;&#xC774; &#xB4E4;&#xC5B4;&#xC788;&#xB294; csv &#xD30C;&#xC77C;&#xC744; &#xC8FC;&#xC785;&#xD558;&#xB294; &#xACBD;&#xC6B0;&#xC5D0;&#xB294; 30&#xBD84;&#xC774; &#xB118;&#xB3C4;&#xB85D; &#xC8FC;&#xC785;&#xC5D0; &#xC2E4;&#xD328;&#xD588;&#xB2E4;.</li><li>index &#xC0DD;&#xC131;&#xC73C;&#xB85C; &#xC778;&#xD55C; &#xBB38;&#xC81C;&#xC778;&#xC9C0; &#xD639;&#xC740; &#xB2E4;&#xB978; &#xBB38;&#xC81C;&#xC778;&#xC9C0; &#xD655;&#xC778;&#xD558;&#xACE0;&#xC790; &#xD14C;&#xC2A4;&#xD2B8;&#xB97C; &#xC9C4;&#xD589;&#xD588;&#xB2E4;.</li><li>&#xC6B0;&#xC120; &#xC544;&#xB798; &#xB450; &#xCF00;&#xC774;&#xC2A4;&#xB97C; &#xBE44;&#xAD50;&#xD574;&#xBCF4;&#xC790;.</li></ul><ol><li>10 M rows &#xB97C; &#xD55C;&#xBC88;&#xC5D0; &#xC8FC;&#xC785;</li><li>500K &#xC529; &#xB098;&#xB204;&#xC5B4; 20&#xBC88;, &#xCD1D; 10M row &#xC8FC;&#xC785;</li></ol><p>&#xC6B0;&#xC120;, 1&#xBC88; 10M &#xCF00;&#xC774;&#xC2A4;&#xB294; &gt; 30 min &#xC774; &#xC18C;&#xC694;&#xB418;&#xC5C8;&#xC73C;&#xBA70; &#xC2DC;&#xAC04;&#xC774; &#xC99D;&#xAC00;&#xD560;&#xC218;&#xB85D; &#xB370;&#xC774;&#xD130;&#xAC00; &#xC8FC;&#xC785;&#xB418;&#xB294; &#xC18D;&#xB3C4;&#xAC00; &#xC810;&#xC810; &#xB290;&#xB824;&#xC838; &#xD14C;&#xC2A4;&#xD2B8;&#xB97C; &#xC911;&#xB2E8;&#xD588;&#xB2E4;. &#xC5EC;&#xAE30;&#xC11C; &#xB0B4; &#xCD94;&#xCE21;&#xC740; 10 M &#xC744; &#xCD94;&#xAC00;&#xD558;&#xB294; &#xACFC;&#xC815;&#xC5D0;&#xC11C; index &#xC0DD;&#xC131; &#xC624;&#xBC84;&#xD5E4;&#xB4DC;&#xAC00; &#xC810;&#xC810;  &#xC99D;&#xAC00;&#xD558;&#xC5EC;, &#xB370;&#xC774;&#xD130; &#xC8FC;&#xC785;&#xC774; &#xB290;&#xB824;&#xC9C0;&#xB294; &#xAC83;&#xC73C;&#xB85C; &#xCD94;&#xCE21;&#xD588;&#xB2E4;. (&#xADF8;&#xB7EC;&#xB098;, &#xD604;&#xC7AC; &#xC8FC;&#xC785;&#xD558;&#xB294; &#xB370;&#xC774;&#xD130;&#xAC00; index &#xB97C; 3&#xAC1C;&#xB9CC; &#xAC00;&#xC9C0;&#xACE0; &#xC788;&#xB294;&#xB370; &#xB108;&#xBB34; &#xD070; &#xC624;&#xBC84;&#xD5E4;&#xB4DC;&#xAC00; &#xC544;&#xB2CC;&#xAC00;? &#xD558;&#xB294; &#xC0DD;&#xAC01;&#xC774; &#xB4E0;&#xB2E4;.)</p><p>2&#xBC88; 500K * 20 &#xCF00;&#xC774;&#xC2A4;&#xC5D0;&#xC11C;&#xB294; &#xB180;&#xB784;&#xB9CC;&#xD55C; &#xACB0;&#xACFC;&#xB97C; &#xC5BB;&#xC5C8;&#xB2E4;. 10 M &#xC758; &#xB370;&#xC774;&#xD130;&#xB97C; &#xC8FC;&#xC785;&#xD558;&#xB294;&#xB370; &#xCD1D; 160 sec &#xC774; &#xC18C;&#xC694;&#xB418;&#xC5C8;&#xC73C;&#xBA70;,  &#xAC01; &#xCFFC;&#xB9AC;&#xB2F9; 10 sec &#xBBF8;&#xB9CC;&#xC774; &#xC18C;&#xC694;&#xB418;&#xC5C8;&#xB2E4;. &#xB9CC;&#xC57D; &#xC778;&#xB371;&#xC2A4; &#xC0DD;&#xC131;&#xC73C;&#xB85C; &#xC778;&#xD55C; &#xC624;&#xBC84;&#xD5E4;&#xB4DC;&#xAC00; &#xC874;&#xC7AC;&#xD588;&#xB2E4;&#xBA74;, record &#xC758; &#xC99D;&#xAC00;&#xC640; &#xBE44;&#xB840;&#xD558;&#xC5EC; &#xB370;&#xC774;&#xD130; &#xC801;&#xC7AC; &#xC2DC;&#xAC04;&#xC774; &#xC99D;&#xAC00;&#xD574;&#xC57C;&#xD55C;&#xB2E4;. &#xADF8;&#xB7EC;&#xB098;, &#xC804;&#xD600; &#xAD00;&#xB828;&#xC774; &#xC5C6;&#xB294; &#xBAA8;&#xC2B5;&#xC774;&#xB2E4;. 10 M &#xAE4C;&#xC9C0;&#xB294; &#xC778;&#xB371;&#xC2A4;&#xC758; &#xC601;&#xD5A5;&#xACFC; &#xAD00;&#xACC4;&#xC5C6;&#xC774; <code>&#xD55C;&#xBC88;&#xC5D0; &#xC5BC;&#xB9C8;&#xB9CC;&#xD07C;&#xC758; &#xB370;&#xC774;&#xD130;&#xB97C; &#xC8FC;&#xC785;&#xD558;&#xB294;&#xAC00;?</code> &#xAC00; &#xC911;&#xC694;&#xD558;&#xB2E4;. &#xD574;&#xB2F9; &#xAD6C;&#xAC04;&#xC5D0;&#xC11C;&#xB294; record&#xC758; &#xC801;&#xC7AC;&#xC5D0; &#xB300;&#xD574;&#xC11C; index&#xC758; &#xC601;&#xD5A5;&#xC740; &#xD06C;&#xC9C0; &#xC54A;&#xB2E4;. </p><figure class="kg-card kg-image-card"><img src="https://life.photogrammer.me/content/images/2024/05/image-1.png" class="kg-image" alt="&#xB300;&#xB7C9;&#xC758; &#xB354;&#xBBF8; &#xB370;&#xC774;&#xD130; DB&#xC5D0; &#xC8FC;&#xC785;&#xD558;&#xAE30;" loading="lazy" width="722" height="434" srcset="https://life.photogrammer.me/content/images/size/w600/2024/05/image-1.png 600w, https://life.photogrammer.me/content/images/2024/05/image-1.png 722w" sizes="(min-width: 720px) 720px"></figure><ul><li>&#xC544;&#xB798; stack overflow &#xC758; &#xC9C8;&#xBB38;&#xC5D0;&#xC11C;&#xB294; &#xB098;&#xC640; &#xAC19;&#xC740; &#xACE0;&#xBBFC;&#xC744; &#xC774;&#xC57C;&#xAE30;&#xD558;&#xACE0; &#xC788;&#xB2E4;. </li></ul><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://stackoverflow.com/questions/63110455/loading-lots-of-data-into-mysql-too-slow"><div class="kg-bookmark-content"><div class="kg-bookmark-title">Loading Lots of Data into MySQL too Slow</div><div class="kg-bookmark-description">I&#x2019;m running MySQL on my local computer. I&#x2019;ve setup a database with multiple tables, 3 of which are potentially interesting here:
CREATE TABLE rnames ( id INT AUTO_INCREMENT PRIMARY KEY, rname</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://cdn.sstatic.net/Sites/stackoverflow/Img/apple-touch-icon.png?v=c78bd457575a" alt="&#xB300;&#xB7C9;&#xC758; &#xB354;&#xBBF8; &#xB370;&#xC774;&#xD130; DB&#xC5D0; &#xC8FC;&#xC785;&#xD558;&#xAE30;"><span class="kg-bookmark-author">Stack Overflow</span><span class="kg-bookmark-publisher">mimo31</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://cdn.sstatic.net/Sites/stackoverflow/Img/apple-touch-icon@2.png?v=73d79a89bded" alt="&#xB300;&#xB7C9;&#xC758; &#xB354;&#xBBF8; &#xB370;&#xC774;&#xD130; DB&#xC5D0; &#xC8FC;&#xC785;&#xD558;&#xAE30;"></div></a></figure><ul><li>&#xC9C8;&#xBB38;&#xC790;&#xAC00; &#xC9C8;&#xBB38;&#xC744; &#xD558;&#xAC8C; &#xB41C; &#xB370;&#xC774;&#xD130; &#xC801;&#xC7AC;&#xB7C9; - &#xC18D;&#xB3C4;&#xC758; &#xC5F0;&#xAD00;&#xC740; &#xC544;&#xB798; &#xADF8;&#xB798;&#xD504;&#xC640; &#xAC19;&#xB2E4;.</li></ul><figure class="kg-card kg-image-card"><img src="https://life.photogrammer.me/content/images/2024/07/image-9.png" class="kg-image" alt="&#xB300;&#xB7C9;&#xC758; &#xB354;&#xBBF8; &#xB370;&#xC774;&#xD130; DB&#xC5D0; &#xC8FC;&#xC785;&#xD558;&#xAE30;" loading="lazy" width="1188" height="868" srcset="https://life.photogrammer.me/content/images/size/w600/2024/07/image-9.png 600w, https://life.photogrammer.me/content/images/size/w1000/2024/07/image-9.png 1000w, https://life.photogrammer.me/content/images/2024/07/image-9.png 1188w" sizes="(min-width: 720px) 720px"></figure><ul><li>&#xB0B4;&#xAC00; &#xACBD;&#xD5D8;&#xD55C;&#xB300;&#xB85C; &#xAC01; CSV &#xC5D0; row &#xC218;&#xAC00; &#xC99D;&#xAC00;&#xD560; &#xC218;&#xB85D; &#xB370;&#xC774;&#xD130; &#xC801;&#xC7AC; &#xC18D;&#xB3C4;&#xAC00; &#xBE44;&#xC120;&#xD615;&#xC801;&#xC73C;&#xB85C; &#xC99D;&#xAC00;&#xD55C;&#xB2E4;. </li><li>&#xB354; &#xB208;&#xC5EC;&#xACA8;&#xBCFC; &#xAC83;&#xC740; &#xADF8;&#xAC00; index / fk contraint &#xB97C; &#xC81C;&#xAC70;&#xD558;&#xACE0; &#xC801;&#xC7AC;&#xD55C; &#xC0C1;&#xD669;&#xC774;&#xB2E4;.</li></ul><figure class="kg-card kg-image-card"><img src="https://life.photogrammer.me/content/images/2024/07/image-10.png" class="kg-image" alt="&#xB300;&#xB7C9;&#xC758; &#xB354;&#xBBF8; &#xB370;&#xC774;&#xD130; DB&#xC5D0; &#xC8FC;&#xC785;&#xD558;&#xAE30;" loading="lazy" width="1206" height="868" srcset="https://life.photogrammer.me/content/images/size/w600/2024/07/image-10.png 600w, https://life.photogrammer.me/content/images/size/w1000/2024/07/image-10.png 1000w, https://life.photogrammer.me/content/images/2024/07/image-10.png 1206w" sizes="(min-width: 720px) 720px"></figure><ul><li>3e6 &#xCF00;&#xC774;&#xC2A4;&#xC5D0;&#xC11C;&#xB294; 900s-&gt;  60s &#xC73C;&#xB85C; 95% &#xAC00;&#xB7C9;&#xC758; &#xC18D;&#xB3C4;&#xB97C; &#xC904;&#xC600;&#xB2E4;. index &#xAC00; &#xC2E4;&#xC81C;&#xB85C; &#xB370;&#xC774;&#xD130;&#xB97C; &#xC801;&#xC7AC;&#xD558;&#xB294;&#xB370; &#xC601;&#xD5A5;&#xC744; &#xBBF8;&#xCE58;&#xACE0; &#xC788;&#xB2E4;.</li><li>&#xB2E4;&#xB9CC; &#xC774;&#xB294; &#xB0B4;&#xAC00; 2&#xBC88;&#xC5D0;&#xC11C; &#xD14C;&#xC2A4;&#xD2B8;&#xD55C; &#xC0C1;&#xD669;&#xACFC; &#xB2E4;&#xC18C; &#xB2E4;&#xB974;&#xB2E4;. &#xC791;&#xC131;&#xC790;&#xB294; csv &#xD30C;&#xC77C; &#xC790;&#xCCB4;&#xC758; &#xD06C;&#xAE30;&#xB97C; &#xC9C0;&#xC18D;&#xC801;&#xC73C;&#xB85C; &#xB298;&#xB824;&#xAC04; &#xBC18;&#xBA74;, &#xB098;&#xC758; &#xACBD;&#xC6B0;&#xC5D0;&#xB294; record &#xC758; &#xAC1C;&#xC218;&#xC640; &#xC5F0;&#xAD00;&#xC774; &#xC788;&#xB2E4;.</li><li>&#xACB0;&#xACFC;&#xC801;&#xC73C;&#xB85C;, <code>&#xD55C;&#xBC88;&#xC5D0; &#xC801;&#xC7AC;&#xD558;&#xB294; &#xC591;</code> &#xC740; <code>&#xC778;&#xB371;&#xC2A4;</code> &#xC640; &#xC5F0;&#xAD00;&#xC744; &#xAC16;&#xB294;&#xAC83;&#xC73C;&#xB85C; &#xBCF4;&#xC778;&#xB2E4;.</li><li>&#xC774;&#xB294; Bulk insert &#xACFC;&#xC815;&#xC5D0;&#xC11C; &#xB450; &#xAC00;&#xC9C0;&#xC758; &#xBB38;&#xC81C;&#xB97C; &#xC9DA;&#xC5B4;&#xBCFC; &#xC218; &#xC788;&#xB2E4;.<ul><li>transaction log</li></ul></li><ul><ul><li>LOAD DATA &#xC758; &#xACBD;&#xC6B0; &#xD558;&#xB098;&#xC758; Transaction &#xC73C;&#xB85C; &#xBB36;&#xC5EC; &#xC2E4;&#xD589;&#xB41C;&#xB2E4;. &#xADF8;&#xB7F0;&#xB370;, infile &#xC758; data &#xAC00; &#xC99D;&#xAC00;&#xD560; &#xC218;&#xB85D; transaction &#xC758; &#xD06C;&#xAE30;&#xAC00; &#xCEE4;&#xC9C0;&#xACE0; &#xC774;&#xC5D0; &#xB530;&#xB77C; transaction log &#xB610;&#xD55C; &#xD568;&#xAED8; &#xC99D;&#xAC00;&#xD55C;&#xB2E4;.<ul><li>load &#xACFC;&#xC815;&#xC5D0;&#xC11C; trasnaction log &#xAD00;&#xB828;&#xD55C; warning &#xC774; &#xB728;&#xAE30;&#xB3C4; &#xD588;&#xB2E4;.</li></ul></li></ul><li>index<ul><li>index &#xB97C; &#xAC31;&#xC2E0;&#xD560; &#xB54C;, &#xD55C; &#xBC88;&#xC5D0; &#xAC31;&#xC2E0;&#xD558;&#xB294; &#xC591;&#xC774; &#xB9CE;&#xC744; &#xC218;&#xB85D; B-Tree &#xC758; rebalancing&#xC774; &#xB354; &#xB9CE;&#xC774; &#xD544;&#xC694;&#xD558;&#xAC8C; &#xB41C;&#xB2E4;.<ul><li>(&#xD574;&#xB2F9; &#xBD80;&#xBD84;&#xC740; &#xB0B4;&#xBD80; &#xB3D9;&#xC791;&#xC5D0; &#xB300;&#xD574;&#xC11C; &#xC544;&#xC9C1; &#xC774;&#xD574;&#xAC00; &#xB418;&#xC9C0; &#xC54A;&#xC558;&#xB2E4;. B-Tree &#xC758; rebalancing &#xC774; &#xBE44;&#xC6A9;&#xC774; &#xB192;&#xC740; &#xC791;&#xC5C5;&#xC784;&#xC740; &#xC774;&#xD574;&#xD558;&#xB098;, record &#xC758; &#xC218;&#xC5D0; &#xBE44;&#xB840;&#xD558;&#xB294; &#xC791;&#xC5C5;&#xC774;&#xAE30;&#xB3C4; &#xD558;&#xB2E4;.)</li></ul></li></ul></li></ul><li>&#xB530;&#xB77C;&#xC11C;, &#xB300;&#xB7C9;&#xC758; &#xB370;&#xC774;&#xD130;&#xB97C; migration &#xD558;&#xAC70;&#xB098; &#xC0BD;&#xC785;&#xD574;&#xC57C;&#xD558;&#xB294; &#xACBD;&#xC6B0;&#xC5D0;&#xB294; &#xB2E4;&#xC74C;&#xACFC; &#xAC19;&#xC740; &#xBC29;&#xBC95;&#xC73C;&#xB85C; &#xC18D;&#xB3C4;&#xB97C; &#xCD5C;&#xC801;&#xD654;&#xD560; &#xC218; &#xC788;&#xB2E4;.<ul><li>&#xC815;&#xD569;&#xC131;&#xC774; &#xBCF4;&#xC7A5;&#xB41C; &#xB370;&#xC774;&#xD130;&#xB77C;&#xBA74; index &#xB97C; &#xC7A0;&#xC2DC; drop &#xD558;&#xACE0; load &#xC774;&#xD6C4;&#xC5D0; &#xB2E4;&#xC2DC; index&#xB97C; &#xC124;&#xC815;&#xD55C;&#xB2E4;.</li><li>&#xB370;&#xC774;&#xD130; &#xC801;&#xC7AC;&#xC2DC; &#xD55C;&#xBC88;&#xC5D0; &#xB108;&#xBB34; &#xB9CE;&#xC740; &#xC591;&#xC744; &#xBCF4;&#xB0B4;&#xAE30;&#xBCF4;&#xB2E4;, &#xB098;&#xB220;&#xC11C; &#xC801;&#xC7AC;&#xD55C;&#xB2E4;. (transaction &#xC758; &#xD06C;&#xAE30;&#xB97C; &#xCD5C;&#xC801;&#xD654;)  </li></ul></li></ul><h3 id="%EB%B0%A9%EB%B2%95%EC%97%90-%EB%94%B0%EB%A5%B8-%EB%B9%84%EA%B5%90">&#xBC29;&#xBC95;&#xC5D0; &#xB530;&#xB978; &#xBE44;&#xAD50;</h3><ul><li>&#xD658;&#xACBD;<ul><li>M1 Macbook Pro (Ram 16GB / M1 Pro)</li><li>Docker + MySQL 8.0</li></ul></li><li>LOAD DATA (10M &#xCF00;&#xC774;&#xC2A4;&#xC758; &#xACBD;&#xC6B0; 1 / 10 &#xAC12;&#xC744; &#xC0B0;&#xC815;&#xD568;)</li></ul><table>
<thead>
<tr>
<th>&#xBC29;&#xBC95;</th>
<th>&#xC18C;&#xC694;&#xC2DC;&#xAC04; (per 1,000,000 rows)</th>
</tr>
</thead>
<tbody>
<tr>
<td>Procedure (loop)</td>
<td>&lt; 9 min</td>
</tr>
<tr>
<td>Procedure (bulk, 100)</td>
<td>&lt; 40 sec</td>
</tr>
<tr>
<td>LOAD DATA (1M)</td>
<td>&lt; 20 sec</td>
</tr>
<tr>
<td>LOAD DATA (10M)</td>
<td>&gt;&gt; 5 min</td>
</tr>
<tr>
<td>LOAD DATA (500K)</td>
<td>&lt; 15 sec</td>
</tr>
</tbody>
</table>
<ul><li>LOAD DATA / Procedure &#xBAA8;&#xB450; index &#xB97C; &#xD574;&#xC81C;&#xD558;&#xACE0; &#xC801;&#xC7AC; &#xD6C4; &#xB2E4;&#xC2DC; &#xC0DD;&#xC131;&#xD55C;&#xB2E4;&#xBA74; &#xC2DC;&#xAC04;&#xC744; &#xC904;&#xC77C; &#xC218; &#xC788;&#xB2E4;.</li></ul><h3 id="%EA%B2%B0%EB%A1%A0">&#xACB0;&#xB860;</h3><ul><li>&#xC0C1;&#xD669;&#xC5D0; &#xB530;&#xB77C; &#xB300;&#xB7C9;&#xC758; &#xB370;&#xC774;&#xD130;&#xB97C; &#xC0BD;&#xC785; &#xC2DC; &#xB450; &#xAC00;&#xC9C0;&#xC758; &#xBC29;&#xBC95;&#xC744; &#xACE0;&#xB824;&#xD558;&#xC790;.<ul><li>Procedure + Bulk insert<ul><li>&#xB354;&#xBBF8;&#xB370;&#xC774;&#xD130;&#xB97C; &#xC0DD;&#xC131;&#xD558;&#xB294; &#xACBD;&#xC6B0; &#xC720;&#xC6A9;&#xD558;&#xB2E4;. csv &#xD30C;&#xC77C;&#xB85C; &#xC800;&#xC7A5;&#xD560; &#xACBD;&#xC6B0;,  csv &#xD30C;&#xC77C;&#xC758; &#xD06C;&#xAE30; &#xB9CC;&#xC73C;&#xB85C;&#xB3C4; &#xC0C1;&#xB2F9;&#xD788; &#xD06C;&#xB2E4;. <code>LOAD DATA</code> &#xBCF4;&#xB2E4; &#xB290;&#xB9AC;&#xAE30;&#xB294; &#xD558;&#xB098;, 2&#xBC30; &#xC815;&#xB3C4; &#xCC28;&#xC774;&#xB098;&#xBBC0;&#xB85C; &#xC2DC;&#xB3C4;&#xD574;&#xBCFC;&#xB9CC; &#xD558;&#xB2E4;.</li></ul></li><li>LOAD DATA (CHUNKED)<ul><li>DATA &#xB97C; migration &#xD558;&#xB294; &#xACBD;&#xC6B0;&#xC5D0; &#xAC00;&#xC7A5; &#xC88B;&#xC740; &#xBC29;&#xBC95;&#xC73C;&#xB85C; &#xD310;&#xB2E8;&#xB41C;&#xB2E4;. &#xBAA8;&#xB4E0; &#xBC29;&#xBC95; &#xC911;&#xC5D0;&#xC11C; &#xAC00;&#xC7A5; &#xBE60;&#xB974;&#xAC8C; &#xC801;&#xC7AC;&#xD560; &#xC218; &#xC788;&#xB294; &#xBC29;&#xBC95;&#xC774;&#xBA70;, &#xB123;&#xC744; &#xB370;&#xC774;&#xD130;&#xB97C; &#xB098;&#xB20C; Chunk &#xC758; &#xD06C;&#xAE30; &#xC870;&#xC808;&#xACFC; MySQL &#xC124;&#xC815;, Index &#xC124;&#xC815; &#xB4F1;&#xC744; &#xD1B5;&#xD574;&#xC11C; &#xB354;&#xC6B1; &#xB354; &#xBE60;&#xB974;&#xAC8C; &#xCD5C;&#xC801;&#xD654;&#xD560; &#xC218; &#xC788;&#xB2E4;.</li></ul></li></ul></li></ul>]]></content:encoded></item><item><title><![CDATA[Ghost blog 를 사용하면서...]]></title><description><![CDATA[Ghost Blog 3개월 사용 후기]]></description><link>https://life.photogrammer.me/ghost-blog-e-daehan-jujeori/</link><guid isPermaLink="false">662a69ca9f52be0001aeeb78</guid><category><![CDATA[Blog]]></category><category><![CDATA[Daily]]></category><dc:creator><![CDATA[Sungjun Park]]></dc:creator><pubDate>Thu, 25 Apr 2024 14:53:58 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1460925895917-afdab827c52f?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDExfHxibG9nfGVufDB8fHx8MTcxNDA1NTg3N3ww&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" medium="image"/><content:encoded><![CDATA[<img src="https://images.unsplash.com/photo-1460925895917-afdab827c52f?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDExfHxibG9nfGVufDB8fHx8MTcxNDA1NTg3N3ww&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" alt="Ghost blog &#xB97C; &#xC0AC;&#xC6A9;&#xD558;&#xBA74;&#xC11C;..."><p></p><p>Ghost CMS &#xB97C; &#xD65C;&#xC6A9;&#xD55C; &#xBE14;&#xB85C;&#xADF8;&#xB85C; &#xB118;&#xC5B4;&#xC628;&#xC9C0; &#xC57D; 3&#xAC1C;&#xC6D4; &#xC815;&#xB3C4; &#xB418;&#xC5B4;&#xAC04;&#xB2E4;. &#xCD5C;&#xADFC;&#xAE4C;&#xC9C0; &#xAE00;&#xC744; &#xC798; &#xC62C;&#xB9AC;&#xC9C0; &#xC54A;&#xB2E4;&#xAC00;, &#xB2E4;&#xC2DC; &#xC4F8; &#xB9CC;&#xD55C; &#xAE00;&#xB4E4;&#xC774; &#xC788;&#xC5B4;&#xC11C; &#xC4F0;&#xACE0; &#xC788;&#xB2E4;.</p><p>&#xCD08;&#xAE30;&#xC5D0; &#xB3C4;&#xC785;&#xD560; &#xB2F9;&#xC2DC;&#xC5D0;&#xB294; Self-host &#xAC00; &#xAC00;&#xB2A5;&#xD55C; &#xAC83;, &#xB0B4; &#xB9C8;&#xC74C;&#xB300;&#xB85C; &#xC8FC;&#xBB34;&#xB97C; &#xC218; &#xC788;&#xB294; &#xAC83;&#xC744; &#xAC15;&#xC810;&#xC73C;&#xB85C; &#xC0DD;&#xAC01;&#xD558;&#xACE0; &#xB3C4;&#xC785;&#xD588;&#xB2E4;. &#xADF8;&#xB7F0;&#xB370;, &#xC0DD;&#xAC01;&#xBCF4;&#xB2E4; &#xAF64;&#xB098; &#xBD88;&#xD3B8;&#xD55C; &#xAC83;&#xB4E4;&#xC774; &#xB9CE;&#xB2E4;.</p><h3 id="blog-%EB%A5%BC-%EC%9C%84%ED%95%9C-cms-%EA%B0%80-%EC%95%84%EB%8B%88%EB%8B%A4">Blog &#xB97C; &#xC704;&#xD55C; CMS &#xAC00; &#xC544;&#xB2C8;&#xB2E4;.</h3><p>Ghost &#xB294; &#xBE14;&#xB85C;&#xADF8;&#xB97C; &#xB9CC;&#xB4DC;&#xB294; &#xC0AC;&#xB78C;&#xC744; &#xC704;&#xC8FC;&#xB85C; &#xB9CC;&#xB4E4;&#xC5B4;&#xC9C0;&#xC9C0; &#xC54A;&#xC558;&#xB2E4;.  &#xC624;&#xD788;&#xB824; &#xC0C1;&#xC5C5; &#xC0AC;&#xC774;&#xD2B8;&#xB97C; &#xB9CC;&#xB4DC;&#xB294;&#xB370; &#xCD5C;&#xC801;&#xD654;&#xB418;&#xC5B4;&#xC788;&#xB2E4;. &#xC608;&#xB97C; &#xB4E4;&#xC5B4; &#xBA64;&#xBC84;&#xC2ED; &#xAE30;&#xB2A5;&#xC774;&#xB77C;&#xB358;&#xAC00;, &#xB2E4;&#xC911; &#xC720;&#xC800;&#xAC00; &#xD3EC;&#xC2A4;&#xD2B8;&#xB97C; &#xC791;&#xC131;&#xD560; &#xC218; &#xC788;&#xB3C4;&#xB85D; &#xC720;&#xC800; &#xBAA9;&#xB85D;&#xC744; &#xC720;&#xC9C0;&#xD560; &#xC218; &#xC788;&#xB2E4;&#xAC70;&#xB098;... &#xC544;&#xBB34;&#xD2BC; &#xC0C1;&#xC5C5; &#xC0AC;&#xC774;&#xD2B8;&#xC5D0;&#xC11C; &#xC801;&#xADF9;&#xC801;&#xC73C;&#xB85C; &#xD65C;&#xC6A9;&#xD560; &#xC218; &#xC788;&#xB294; &#xAE30;&#xB2A5;&#xB4E4;&#xC774; &#xB9CE;&#xB2E4;.</p><p>&#xADF8;&#xB7EC;&#xB098;, &#xBE14;&#xB85C;&#xADF8;&#xB97C; &#xB300;&#xC0C1;&#xC73C;&#xB85C;&#xD558;&#xBA74; &#xAE30;&#xB2A5;&#xC774; &#xAF64;&#xB098; &#xBD80;&#xC2E4;&#xD558;&#xB2E4;. &#xBE14;&#xB85C;&#xADF8;&#xC758; &#xAE30;&#xCD08;&#xC778; Category &#xAE30;&#xB2A5;&#xBD80;&#xD130; &#xC5C6;&#xB2E4;.  Tag&#xB97C; &#xD1B5;&#xD574;&#xC11C; &#xC9C1;&#xC811; &#xBD84;&#xB958;&#xD558;&#xB3C4;&#xB85D; &#xD574;&#xC57C;&#xD558;&#xBA70;, Category &#xCC98;&#xB7FC; &#xBCF4;&#xC774;&#xAE30; &#xC704;&#xD574;&#xC11C;&#xB294; theme &#xC744; &#xC9C1;&#xC811; &#xAC74;&#xB4DC;&#xB9AC;&#xBA74;&#xC11C; tag &#xB97C; &#xC694;&#xB9AC;&#xC870;&#xB9AC; &#xBCF6;&#xC544;&#xC57C;&#xD55C;&#xB2E4;. &#xB313;&#xAE00; &#xAE30;&#xB2A5;&#xB3C4; &#xAE30;&#xBCF8;&#xC73C;&#xB85C; &#xC9C0;&#xC6D0;&#xD558;&#xC9C0; &#xC54A;&#xC73C;&#xBA70;, TOC (&#xBAA9;&#xCC28;) &#xB3C4; &#xC9C1;&#xC811; &#xB123;&#xC5B4;&#xC8FC;&#xC5B4;&#xC57C;&#xD55C;&#xB2E4;. (&#xAD1C;&#xD788; &#xAE30;&#xC131; &#xBE14;&#xB85C;&#xADF8; &#xD50C;&#xB7AB;&#xD3FC;&#xC744; &#xC0AC;&#xC6A9;&#xD558;&#xB294; &#xAC83;&#xC774; &#xC544;&#xB2C8;&#xB2E4;.)</p><p>&#xBB3C;&#xB860;, &#xC790;&#xC720;&#xB3C4;&#xAC00; &#xAF64; &#xB192;&#xC740; &#xD3B8;&#xC774;&#xAE30;&#xC5D0; &#xC9C1;&#xC811; theme &#xC744; &#xB9CC;&#xB4E4;&#xAE30; &#xC2DC;&#xC791;&#xD558;&#xBA74; &#xC880; &#xB2EC;&#xB77C;&#xC9C8;&#xC9C0;&#xB3C4; &#xBAA8;&#xB974;&#xACA0;&#xB2E4;. &#xB2E4;&#xB9CC;, Ghost &#xC5D0; &#xB9DE;&#xB294; &#xD504;&#xB860;&#xD2B8; &#xBDF0;&#xB97C; &#xBFCC;&#xB9AC;&#xAE30; &#xC704;&#xD574;&#xC11C; &#xC790;&#xCCB4; API &#xC5D0; &#xB300;&#xD55C; &#xD559;&#xC2B5;, &#xD65C;&#xC6A9;&#xC774; &#xD544;&#xC694;&#xD558;&#xB2E4;. &#xC5EC;&#xAC04; &#xADC0;&#xCC2E;&#xC544;&#xC11C;, &#xADF8;&#xB0E5; &#xC81C;&#xACF5;&#xD574;&#xC8FC;&#xB294; &#xAE30;&#xBCF8; theme &#xC744; &#xC0AC;&#xC6A9; &#xC911;&#xC778;&#xB370;, &#xC218;&#xC815; &#xC5C6;&#xC774; &#xBE14;&#xB85C;&#xADF8;&#xB85C; &#xC0AC;&#xC6A9;&#xD558;&#xAE30;&#xC5D0;&#xB294; &#xB9CE;&#xC774; &#xBD80;&#xC871;&#xD558;&#xB2E4;.</p><h3 id="free-theme-blog-%EB%A5%BC-%EC%9C%84%ED%95%9C-theme-%EC%9D%B4-%EB%B6%80%EC%A1%B1%ED%95%98%EB%8B%A4">Free Theme / Blog &#xB97C; &#xC704;&#xD55C; Theme &#xC774; &#xBD80;&#xC871;&#xD558;&#xB2E4;.</h3><p>WordPress &#xB97C; &#xC0AC;&#xC6A9;&#xD588;&#xB2E4;&#xBA74; &#xC5B4;&#xB560;&#xC744;&#xAE4C;? &#xD558;&#xB294; &#xC0DD;&#xAC01;&#xC774; &#xB4DC;&#xB294; &#xBD80;&#xBD84;&#xC774; &#xBC14;&#xB85C; &#xC774;&#xAC83;&#xC774;&#xB2E4;. WordPress &#xC5D0; &#xBE44;&#xD558;&#xBA74; &#xB0B4;&#xAC00; &#xC120;&#xD0DD;&#xD560; &#xC218;&#xC788;&#xB294; theme &#xC5D0; &#xB300;&#xD55C; &#xC120;&#xD0DD;&#xC9C0;&#xAC00; &#xB108;&#xBB34;&#xB098; &#xC881;&#xB2E4;. &#xD2B9;&#xD788; &#xC55E;&#xC11C; &#xC5B8;&#xAE09;&#xD588;&#xB4EF;, Blog &#xB97C; &#xC704;&#xD55C; CMS &#xAC00; &#xC544;&#xB2C8;&#xB2E4;&#xBCF4;&#xB2C8; &#xC720;&#xB8CC; Theme &#xC870;&#xCC28;&#xB3C4; &#xBE14;&#xB85C;&#xADF8;&#xBCF4;&#xB2E4;&#xB294; &#xC0C1;&#xC5C5; &#xC0AC;&#xC774;&#xD2B8;&#xB4E4;&#xC5D0; &#xB9DE;&#xCDB0;&#xC838;&#xC788;&#xB2E4;. &#xC885;&#xC885; Free Theme &#xC744; &#xCC3E;&#xC744; &#xC218;&#xB294; &#xC788;&#xAE30;&#xB294; &#xD558;&#xB098;, Ghost &#xBC84;&#xC804;&#xC774; &#xB9DE;&#xC9C0; &#xC54A;&#xB294; &#xACBD;&#xC6B0;&#xAC00; &#xB9CE;&#xC73C;&#xBA70; &#xC5B8;&#xC5B4; &#xB54C;&#xBB38;&#xC778;&#xC9C0; Ghost &#xBC84;&#xC804; &#xB54C;&#xBB38;&#xC778;&#xC9C0; &#xBAA8;&#xB97C; &#xD638;&#xD658;&#xC131; &#xBB38;&#xC81C;&#xAC00; &#xC788;&#xB2E4;.</p><h3 id="self-host-%EC%9D%98-%EC%95%BD%EC%A0%90">Self host &#xC758; &#xC57D;&#xC810;</h3><p>Self-host blog &#xB294; &#xC774;&#xBC88;&#xC774; &#xCC98;&#xC74C;&#xC778;&#xB370;, &#xAD49;&#xC7A5;&#xD55C; &#xC57D;&#xC810;&#xC774; &#xC788;&#xB2E4;. SEO &#xAC00; &#xC548;&#xB41C;&#xB2E4;. &#xADF8;&#xB0E5; &#xB0B4; &#xBE14;&#xB85C;&#xADF8;&#xAC00; &#xAD6C;&#xAE00;, &#xB124;&#xC774;&#xBC84;&#xC5D0; &#xB178;&#xCD9C; &#xC790;&#xCCB4;&#xAC00; &#xC548;&#xB418;&#xACE0; &#xC788;&#xB2E4;. &#xADF8;&#xB0E5; &#xC0AC;&#xB78C;&#xC774; &#xB098; &#xBE7C;&#xACE0; &#xC548;&#xC628;&#xB2E4; -_-; &#xAD11;&#xACE0; &#xC218;&#xC775;&#xC744; &#xAE30;&#xB300;&#xD55C;&#xB2E4;&#xAC70;&#xB098;, &#xD2B9;&#xBCC4;&#xD788; &#xB110;&#xB9AC; &#xC54C;&#xB9AC;&#xACE0;&#xC790; &#xD558;&#xB294; &#xC758;&#xB3C4;&#xB294; &#xC5C6;&#xC5B4;&#xC11C; &#xD06C;&#xAC8C; &#xC0C1;&#xAD00;&#xC5C6;&#xAE30;&#xB294; &#xD558;&#xC9C0;&#xB9CC;, &#xC774;&#xC655; &#xC5F4;&#xC2EC;&#xD788; &#xC791;&#xC131;&#xD55C; &#xAE00; &#xB9CE;&#xC740; &#xC0AC;&#xB78C;&#xB4E4;&#xC774; &#xBCF4;&#xBA74; &#xC88B;&#xC9C0; &#xC54A;&#xC740;&#xAC00;?</p><p>&#xC544;&#xBB34;&#xB798;&#xB3C4; &#xB0B4; &#xBE14;&#xB85C;&#xADF8;&#xC758; &#xACBD;&#xC6B0;&#xC5D0;&#xB294; &#xC644;&#xC804;&#xD788; &#xC0C8;&#xB85C;&#xC6B4; &#xB3C4;&#xBA54;&#xC778;&#xC73C;&#xB85C;&#xD65C;&#xB3D9;&#xD558;&#xBA70;, &#xC774;&#xC804;&#xC758; &#xC77C;&#xBD80; &#xBB38;&#xC11C;&#xB97C; &#xAC00;&#xC838;&#xC624;&#xBA70; &#xC911;&#xBCF5;&#xB41C; &#xAC8C;&#xC2DC;&#xBB3C;&#xB85C; &#xC0AC;&#xC774;&#xD2B8; &#xD3C9;&#xD310;&#xC774; &#xB0AE;&#xAE30; &#xB54C;&#xBB38;&#xC73C;&#xB85C; &#xBCF4;&#xC778;&#xB2E4;. &#xC774;&#xB7F0; &#xBB38;&#xC81C;&#xB97C; &#xAC00;&#xBCCD;&#xAC8C; &#xBE14;&#xB85C;&#xADF8;&#xD558;&#xBA74;&#xC11C; &#xB530;&#xB85C; &#xC2E0;&#xACBD;&#xC4F0;&#xAE30;&#xC5D0;&#xB294; &#xC0C1;&#xB2F9;&#xD788; &#xACE8;&#xCE58;&#xC544;&#xD504;&#xB2E4;. &#xC0C1;&#xC5C5;&#xC801;&#xC778; &#xBAA9;&#xC801;&#xC744; &#xAC00;&#xC9C4;&#xB2E4;&#xBA74; &#xC644;&#xC804; &#xBE44;&#xCD94;&#xB2E4;. &#xD50C;&#xB7AB;&#xD3FC; &#xC704;&#xC5D0;&#xC11C; &#xB178;&#xB294; &#xC774;&#xC720;&#xAC00; &#xB2E4; &#xC788;&#xB2E4;.</p><h3 id="%EA%B7%B8%EB%9F%BC%EC%97%90%EB%8F%84-%EC%A2%8B%EC%9D%80-%EC%A0%90">&#xADF8;&#xB7FC;&#xC5D0;&#xB3C4; &#xC88B;&#xC740; &#xC810;</h3><p>Markdown &#xAE30;&#xBC18;&#xC73C;&#xB85C; &#xC791;&#xC131;&#xC774; &#xD3B8;&#xD558;&#xB2E4;.  &#xCD5C;&#xADFC; Obsidian &#xC73C;&#xB85C; &#xAE30;&#xB85D;&#xC744; &#xD558;&#xACE0; &#xC774; &#xCABD;&#xC73C;&#xB85C; &#xB118;&#xAE30;&#xBA74;&#xC11C; &#xAE00;&#xC744; &#xC791;&#xC131;&#xD558;&#xACE0; &#xC788;&#xB294;&#xB370;, &#xC774;&#xB7F0; &#xBA74;&#xC5D0;&#xC11C; &#xAD49;&#xC7A5;&#xD788; &#xD3B8;&#xB9AC;&#xD558;&#xB2E4;. &#xADF8;&#xB0E5; native &#xD558;&#xAC8C; &#xC9C0;&#xC6D0;&#xD558;&#xAE30;&#xC5D0; &#xBA38;&#xB9AC;&#xC544;&#xD50C; &#xC77C;&#xC774; &#xC5C6;&#xB2E4;.</p><p>&#xB610;&#xD55C; Ghost API &#xB97C; &#xD1B5;&#xD574;&#xC11C; Obsidian &#xC5D0;&#xC11C; &#xBC14;&#xB85C; &#xAE00;&#xC744; &#xB118;&#xAE38; &#xC218;&#xB3C4; &#xC788;&#xB2E4;. &#xC774;&#xBBF8;&#xC9C0;&#xAE4C;&#xC9C0; &#xB118;&#xAE30;&#xC9C0;&#xB294; &#xBABB;&#xD574;&#xC11C; &#xC798; &#xC0AC;&#xC6A9;&#xD558;&#xC9C0;&#xB294; &#xC54A;&#xAE30;&#xB294; &#xD558;&#xC9C0;&#xB9CC;, Obsidian &#xACFC;&#xC758; &#xC5F0;&#xB3D9;&#xC131;, &#xADF8;&#xB9AC;&#xACE0; API &#xB97C; &#xD65C;&#xC6A9;&#xD574;&#xC11C; &#xB354; &#xB9CE;&#xC740; &#xAC83;&#xC744; &#xD560; &#xC218; &#xC788;&#xB2E4;&#xB294; &#xC810;&#xC774; &#xAF64;&#xB098; &#xC778;&#xC0C1;&#xAE4A;&#xC5C8;&#xB2E4;.</p><p>unsplash &#xC640; &#xC5F0;&#xB3D9;&#xB418;&#xC5B4; &#xC774;&#xBBF8;&#xC9C0;&#xB97C; &#xBE60;&#xB974;&#xAC8C; &#xC0BD;&#xC785;&#xD560; &#xC218; &#xC788;&#xB294; &#xAC83;&#xB3C4; &#xAF64;&#xB098; &#xD070; &#xC7A5;&#xC810;&#xC774;&#xB2E4;. &#xD14C;&#xB9C8;&#xC5D0; &#xB530;&#xB77C; &#xB2E4;&#xB974;&#xB098;, &#xAC00;&#xBCCD;&#xAC8C; thumbnail&#xC744; &#xAC00;&#xC838;&#xC640;&#xC11C; &#xC4F8; &#xC218; &#xC788;&#xB2E4;. (&#xC774;&#xC05C; &#xBE14;&#xB85C;&#xADF8;&#xB9CC;&#xB4E4;&#xAE30;&#xC5D0; &#xC88B;&#xB2E4;. &#x314B;&#x314B;) &#xC544;&#xB9C8;, &#xC0C1;&#xC5C5;&#xC801; &#xD65C;&#xC6A9;&#xC5D0; &#xBAA9;&#xC801;&#xC744; &#xB450;&#xACE0; &#xC788;&#xC5B4;&#xC11C; &#xCD94;&#xAC00;&#xD55C; &#xAE30;&#xB2A5;&#xC73C;&#xB85C; &#xBCF4;&#xC778;&#xB2E4;.</p><h3 id="%EC%95%9E%EC%9C%BC%EB%A1%9C">&#xC55E;&#xC73C;&#xB85C;..</h3><p>&#xB118;&#xC5B4;&#xC624;&#xB294;&#xAC8C; &#xAF64; &#xADC0;&#xCC2E;&#xC740; &#xC791;&#xC5C5;&#xC774;&#xC5C8;&#xACE0; &#xC9C0;&#xAE08; &#xBCF4;&#xAE30;&#xC5D0;&#xB294; WordPress &#xB9D0;&#xACE0;&#xB294; &#xB531;&#xD788; &#xB118;&#xC5B4;&#xAC08;&#xB9CC;&#xD55C; &#xB300;&#xC0C1;&#xB3C4; &#xC5C6;&#xB2E4;. &#xC81C;&#xB300;&#xB85C; &#xD65C;&#xC6A9;&#xD558;&#xB824;&#xBA74; Theme &#xC744; &#xD558;&#xB098; &#xC9C1;&#xC811; &#xB9CC;&#xB4E4;&#xC5B4;&#xBD10;&#xC57C;&#xD560; &#xAC83; &#xAC19;&#xC740;&#xB370;, &#xC5EC;&#xAE30;&#xC5D0; &#xD22C;&#xC790;&#xD560; &#xB9CC;&#xD07C; &#xC2DC;&#xAC04;&#xC774; &#xB109;&#xB109;&#xD558;&#xC9C0;&#xB294; &#xC54A;&#xB2E4;. &#xCD5C;&#xB300;&#xD55C; &#xC2EC;&#xD50C;&#xD558;&#xBA74;&#xC11C; &#xBE14;&#xB85C;&#xADF8; &#xAE30;&#xB2A5;&#xC744; &#xAC16;&#xCD98; &#xD615;&#xD0DC;&#xB85C; &#xC5B8;&#xC820;&#xAC00; &#xD55C;&#xBC88; &#xC790;&#xCCB4; &#xC81C;&#xC791;&#xD558;&#xACE0; Open &#xD574;&#xB46C;&#xBD10;&#xC57C;&#xACA0;&#xB2E4;.</p>]]></content:encoded></item><item><title><![CDATA[인증 인가의 상태 코드 반환은 어떻게 해야할까?]]></title><description><![CDATA[인증이 실패하면 늘 401일까? 상황에 따른 적절한 HTTP 상태 코드를 살펴보자.]]></description><link>https://life.photogrammer.me/how-to-response-http-auth-statuscode/</link><guid isPermaLink="false">66269b88f2aaa600011eb191</guid><category><![CDATA[Web]]></category><category><![CDATA[Development]]></category><category><![CDATA[TicketWar]]></category><category><![CDATA[Projects]]></category><dc:creator><![CDATA[Sungjun Park]]></dc:creator><pubDate>Mon, 22 Apr 2024 17:18:48 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1580163661417-3606299aba72?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDN8fEhUVFB8ZW58MHx8fHwxNzEzODA2MjYwfDA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" medium="image"/><content:encoded><![CDATA[<img src="https://images.unsplash.com/photo-1580163661417-3606299aba72?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDN8fEhUVFB8ZW58MHx8fHwxNzEzODA2MjYwfDA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" alt="&#xC778;&#xC99D; &#xC778;&#xAC00;&#xC758; &#xC0C1;&#xD0DC; &#xCF54;&#xB4DC; &#xBC18;&#xD658;&#xC740; &#xC5B4;&#xB5BB;&#xAC8C; &#xD574;&#xC57C;&#xD560;&#xAE4C;?"><p></p><h2 id="%EC%9D%B8%EC%A6%9D-%EC%9D%B8%EA%B0%80%EC%99%80-%EC%83%81%ED%83%9C-%EB%B0%98%ED%99%98-%EC%BD%94%EB%93%9C">&#xC778;&#xC99D; &#xC778;&#xAC00;&#xC640; &#xC0C1;&#xD0DC; &#xBC18;&#xD658; &#xCF54;&#xB4DC;</h2><h3 id="%EC%9A%94%EA%B5%AC%EC%82%AC%ED%95%AD">&#xC694;&#xAD6C;&#xC0AC;&#xD56D;</h3><ul><li>HTTP &#xD45C;&#xC900;&#xACFC; &#xBD80;&#xD569;&#xD574;&#xC57C;&#xD55C;&#xB2E4;.</li><li>Client &#xC785;&#xC7A5;&#xC5D0;&#xC11C; &#xCC98;&#xB9AC;&#xD558;&#xAE30; &#xD3B8;&#xB9AC;&#xD574;&#xC57C;&#xD55C;&#xB2E4;.</li><li>&#xBCF4;&#xC548;&#xC744; &#xACE0;&#xB824;&#xD574;&#xC57C;&#xD55C;&#xB2E4;.</li></ul><h3 id="%EA%B3%A0%EB%A0%A4%EB%8C%80%EC%83%81">&#xACE0;&#xB824;&#xB300;&#xC0C1;</h3><ul><li>&#xC778;&#xC99D;&#xC5D0; &#xC2E4;&#xD328;&#xD560; &#xACBD;&#xC6B0; &#xD56D;&#xC0C1; 401 (Unauthorized)</li><li>&#xC0C1;&#xD669;&#xC5D0; &#xB530;&#xB978; HTTP Status code<ul><li>&#xC778;&#xC99D; &#xC815;&#xBCF4;&#xAC00; &#xC788;&#xB294; &#xACBD;&#xC6B0;<ul><li>&#xC131;&#xACF5;</li><li>&#xC2E4;&#xD328;<ul><li>&#xC798;&#xBABB;&#xB41C; &#xC815;&#xBCF4;&#xB85C; &#xC778;&#xC99D; &#xD558;&#xB294; &#xACBD;&#xC6B0;</li><li>&#xC720;&#xD6A8;&#xD55C; &#xC778;&#xC99D;&#xC774;&#xB098; &#xC811;&#xADFC;&#xC774; &#xBD88;&#xAC00;&#xB2A5; &#xD55C; &#xACBD;&#xC6B0;<ul><li>403 ? 404 ?</li></ul></li></ul></li></ul></li><li>&#xC778;&#xC99D; &#xC815;&#xBCF4;&#xAC00; &#xC5C6;&#xB294; &#xACBD;&#xC6B0;</li></ul></li></ul><h3 id="%EC%9D%98%EC%82%AC%EA%B2%B0%EC%A0%95">&#xC758;&#xC0AC;&#xACB0;&#xC815;</h3><ul><li><strong>&#xC0C1;&#xD669;&#xC5D0; &#xB530;&#xB77C; HTTP Status code &#xB97C; &#xBD84;&#xB9AC;&#xD574;&#xC11C; &#xB098;&#xD0C0;&#xB0B4;&#xC57C;&#xD55C;&#xB2E4;.</strong></li><li><strong>&#xC798;&#xBABB;&#xB41C; &#xC778;&#xC99D; &#xC815;&#xBCF4;(&#xB9CC;&#xB8CC;&#xB41C; &#xD1A0;&#xD070;&#xACFC; &#xAC19;&#xC740; &#xACBD;&#xC6B0;)&#xC5D0; &#xB300;&#xD574;&#xC11C;&#xB9CC; <code>401 Unauthorized</code> &#xB85C; &#xCC98;&#xB9AC;&#xD55C;&#xB2E4;.</strong><ul><li>&#xB9CC;&#xC57D; &#xBAA8;&#xB4E0; &#xBE44;&#xC778;&#xAC00; &#xC0C1;&#xD0DC;&#xC5D0; &#xB300;&#xD574;&#xC11C; <code>401 Unauthorized</code> &#xB85C; &#xBCF4;&#xB0BC; &#xACBD;&#xC6B0; &#xB2E4;&#xC74C;&#xACFC; &#xAC19;&#xC740; &#xBB38;&#xC81C;&#xAC00; &#xBC1C;&#xC0DD;&#xD560; &#xC218; &#xC788;&#xB2E4;.<ul><li>&#xC6B0;&#xC120; <code>401 Unauthorized</code> &#xC758; &#xACBD;&#xC6B0; <code>&#xC778;&#xC99D; &#xACFC;&#xC815;&#xC758; &#xC774;&#xC288;</code> &#xB97C; &#xB098;&#xD0C0;&#xB0B4;&#xB294; &#xC0C1;&#xD0DC;&#xCF54;&#xB4DC;&#xC774;&#xB2E4;. &#xB530;&#xB77C;&#xC11C;, &#xC774;&#xB294; token &#xB9CC;&#xB8CC; &#xD639;&#xC740; &#xC798;&#xBABB;&#xB41C; &#xC778;&#xC99D; &#xC815;&#xBCF4;&#xC5D0; &#xB300;&#xD55C; &#xC751;&#xB2F5;&#xC774; &#xC801;&#xD569;&#xD558;&#xB2E4;.<ul><li><code>&#xC798;&#xBABB;&#xB41C; &#xC815;&#xBCF4;&#xB85C; &#xC778;&#xC99D;&#xC744; &#xC2DC;&#xB3C4;&#xD55C; &#xAC83; &#xAC19;&#xC544;</code> &#xB77C;&#xB294; &#xC751;&#xB2F5;&#xC5D0; &#xC801;&#xD569;&#xD558;&#xB2E4;.</li></ul></li><li>&#xBC18;&#xBA74; <code>403 Forbidden</code> &#xD639;&#xC740; <code>404 Not Found</code> &#xC740; &#xD574;&#xB2F9; &#xC790;&#xC6D0;&#xC5D0; &#xB300;&#xD55C; &#xC811;&#xADFC;&#xC5D0; &#xB300;&#xD55C; &#xCC98;&#xB9AC;&#xC774;&#xB2E4;.<ul><li><code>403 Forbidden</code> &#xC758; &#xACBD;&#xC6B0; <code>&#xB124;&#xAC00; &#xB204;&#xAD6C;&#xC778;&#xC9C0;&#xB294; &#xC544;&#xB294;&#xB370;, &#xC774;&#xB7EC;&#xD55C; &#xC774;&#xC720;&#xB85C; &#xC774; &#xC790;&#xC6D0;&#xC5D0; &#xC811;&#xADFC;&#xD560; &#xC218; &#xC5C6;&#xC5B4;.</code> &#xB77C;&#xACE0; &#xBA85;&#xC2DC;&#xC801;&#xC73C;&#xB85C; &#xD074;&#xB77C;&#xC774;&#xC5B8;&#xD2B8;&#xC5D0;&#xAC8C; &#xC54C;&#xB9B0;&#xB2E4;.</li><li><code>404 Not Found</code> &#xC758; &#xACBD;&#xC6B0; <code>(&#xB124;&#xAC00; &#xB204;&#xAD6C;&#xC778;&#xC9C0; &#xC544;&#xB294;&#xB370; &#xD574;&#xB2F9; &#xC790;&#xC6D0;&#xC5D0; &#xC5B4;&#xCC28;&#xD53C; &#xC811;&#xADFC; &#xBABB;&#xD560;&#xAC70;&#xB2C8;&#xAE4C;) &#xADF8;&#xB0E5; &#xC5C6;&#xB294; &#xD398;&#xC774;&#xC9C0;&#xB77C;&#xACE0; &#xC54C;&#xB824;&#xC918;&#xC57C;&#xACA0;&#xB2E4;.</code> &#xB77C;&#xACE0; &#xC0DD;&#xAC01;&#xD558;&#xBA74; &#xB41C;&#xB2E4;. &#xC544;&#xB798; &#xC124;&#xBA85;&#xD558;&#xACA0;&#xC9C0;&#xB9CC;, &#xBCF4;&#xC548;&#xC801;&#xC73C;&#xB85C; &#xC774; &#xD3B8;&#xC774; &#xB0AB;&#xB2E4;.</li></ul></li></ul></li></ul></li><li><strong>&#xAD8C;&#xD55C; &#xBB38;&#xC81C;&#xB85C; &#xC778;&#xD574; &#xC811;&#xADFC;&#xC774; &#xBD88;&#xAC00;&#xB2A5;&#xD55C; &#xACBD;&#xC6B0;&#xC5D0;&#xB294; <code>404 Not Found</code>&#xC73C;&#xB85C; &#xCC98;&#xB9AC;&#xD55C;&#xB2E4;.</strong><ul><li>&#xC758;&#xBBF8;&#xC801;&#xC73C;&#xB85C;&#xB294; <code>403 Forbidden</code> &#xC774; &#xC801;&#xD569;&#xD560; &#xC218; &#xC788;&#xB2E4;. &#xADF8;&#xB7EC;&#xB098;, &#xBCF4;&#xC548;&#xC801;&#xC778; &#xCE21;&#xBA74;&#xC5D0;&#xC11C;&#xB294; <code>404 Not Found</code> &#xB97C; &#xC804;&#xB2EC;&#xD558;&#xB294; &#xAC83;&#xC774; &#xB354; &#xC720;&#xB9AC;&#xD558;&#xB2E4;.</li><li><strong>403 Forbidden</strong><br>The server understood the request, but is refusing to fulfill it. Authorization will not help and the request SHOULD NOT be repeated. If the request method was not HEAD and the server wishes to make public why the request has not been fulfilled, it SHOULD describe the reason for the refusal in the entity.&#xA0;If the server does not wish to make this information available to the client, the status code 404 (Not Found) can be used instead.</li><li>Attacker &#xC785;&#xC7A5;&#xC5D0;&#xC11C; <code>403 Forbidden</code> &#xC73C;&#xB85C; &#xC804;&#xC1A1;&#xBC1B;&#xC744; &#xACBD;&#xC6B0; &#xC720;&#xC0AC; &#xACBD;&#xB85C;&#xC5D0; &#xB300;&#xD574;&#xC11C; &#xACF5;&#xACA9;&#xC744; &#xAC10;&#xD589;&#xD560; &#xC218; &#xC788;&#xB294; &#xADFC;&#xAC70;&#xAC00; &#xB9C8;&#xB828;&#xB420; &#xC218; &#xC788;&#xB2E4;. &#xC11C;&#xBC84; &#xC785;&#xC7A5;&#xC5D0;&#xC11C;&#xB294; &#xC774;&#xB7EC;&#xD55C; &#xACF5;&#xACA9;&#xC744; &#xBC29;&#xC9C0;&#xD558;&#xAE30; &#xC704;&#xD574; &#xC774;&#xB7EC;&#xD55C; &#xC815;&#xBCF4;&#xB97C; &#xC81C;&#xACF5;&#xD558;&#xC9C0; &#xC54A;&#xC74C;&#xC73C;&#xB85C;&#xC11C; &#xBCF4;&#xC548;&#xC744; &#xD55C;&#xCE35; &#xAC15;&#xD654;&#xD560; &#xC218; &#xC788;&#xB2E4;.<ul><li><a href="https://meta.stackexchange.com/questions/258756/what-is-the-reason-behind-marking-forbidden-pages-as-404">What is the reason behind marking forbidden pages as 404?</a></li><li><a href="https://en.wikipedia.org/wiki/Security_through_obscurity">Security through obscurity</a></li><li><a href="https://lockmedown.com/when-should-you-return-404-instead-of-403-http-status-code/">When Should You Return 404 Instead of 403 HTTP Status Code</a></li></ul></li><li>Security through obscurity &#xC5D0; &#xB300;&#xD55C; &#xC608;&#xC2DC;&#xB97C; &#xD558;&#xB098; &#xB4E4;&#xC790;&#xBA74; &#xC774;&#xB7F0; &#xB290;&#xB08C;&#xC774;&#xB2E4;.<ul><li>&#xC601;&#xD654; &apos;&#xC544;&#xC800;&#xC528;&apos;&#xB97C; &#xBCF4;&#xBA74;, &#xD2B9;&#xBCC4;&#xD55C; &#xACFC;&#xAC70;&#xB97C; &#xAC00;&#xC9C4; &#xC6D0;&#xBE48;&#xC758; &#xC815;&#xBCF4;&#xC5D0; &#xB300;&#xD574;&#xC11C;&#xB9CC; &#xD2B9;&#xBCC4;&#xD788; &#xC811;&#xADFC; &#xAD8C;&#xD55C;&#xC744; &#xC81C;&#xD55C;&#xD588;&#xB2E4;. &#xACBD;&#xCC30;&#xB4E4;&#xC740; &#xC774;&#xB97C; &#xD1B5;&#xD574;&#xC11C; &#xC6D0;&#xBE48;&#xC5D0; &#xB300;&#xD574;&#xC11C; <code>&#xC774; &#xC0AC;&#xB78C; &#xBB34;&#xC5B8;&#xAC00; &#xC788;&#xB2E4;!</code> &#xB77C;&#xACE0; &#xCD94;&#xCE21;&#xC744; &#xD560; &#xC218; &#xC788;&#xC5C8;&#xB2E4;. &#xADF8;&#xB9AC;&#xACE4; &#xC54C;&#xB2E4;&#xC2DC;&#xD53C; &#xD2B9;&#xBCC4;&#xD55C; &#xBC29;&#xBC95;(?)&#xB97C; &#xB3D9;&#xC6D0;&#xD574; &#xADF8;&#xC758; &#xC815;&#xBCF4;&#xB97C; &#xC5BB;&#xC5B4;&#xB0C8;&#xB2E4;.</li><li>&#xB9CC;&#xC57D;, &#xD574;&#xB2F9; &#xC778;&#xBB3C;&#xC5D0; &#xB300;&#xD574;&#xC11C; &#xC870;&#xD68C;&#xD588;&#xC744; &#xACBD;&#xC6B0; <code>&#xC774;&#xB7F0; &#xC0AC;&#xB78C; &#xC5C6;&#xB294;&#xB370;&#xC694;?</code> &#xB77C;&#xACE0; &#xC870;&#xD68C; &#xACB0;&#xACFC;&#xB97C; &#xBCF4;&#xC5EC;&#xC92C;&#xB2E4;&#xBA74;, &#xACBD;&#xCC30;&#xB4E4;&#xC740; <code>&#xC6B0;&#xB9AC;&#xAC00; &#xC798;&#xBABB; &#xC870;&#xD68C;&#xD55C;&#xAC74;&#xAC00;?</code> <code>&#xC6B0;&#xB9AC; &#xB370;&#xC774;&#xD130;&#xBCA0;&#xC774;&#xC2A4;&#xC5D0; &#xC5C6;&#xB294; &#xC0AC;&#xB78C;&#xC778;&#xAC00;?</code> &#xC544;&#xB2C8;&#xBA74; <code>&#xC774; &#xC0AC;&#xB78C; &#xD2B9;&#xBCC4;&#xD55C; &#xC0AC;&#xB78C;&#xC778;&#xAC00;?</code> &#xB77C;&#xACE0; &#xC5EC;&#xB7EC; &#xBC29;&#xC2DD;&#xC73C;&#xB85C; &#xC0DD;&#xAC01;&#xD55C;&#xB2E4;. &#xC77C;&#xBC18;&#xC801;&#xC73C;&#xB85C;&#xB294; <code>&#xC798;&#xBABB; &#xC870;&#xD68C;&#xD55C; &#xAC83; &#xAC19;&#xB124; &#xAC00;&#xBA85;&#xC744; &#xC4F0;&#xB098;? &#xC131;&#xD615;&#xD588;&#xB098;? &#xBB50;&#xC9C0;?</code> &#xB77C;&#xACE0; &#xC0DD;&#xAC01;&#xD558;&#xBA70; &#xADF8;&#xC758; &#xC815;&#xBCF4;&#xB97C; &#xCC3E;&#xB294;&#xB370; &#xC5B4;&#xB824;&#xC6C0;&#xC744; &#xACAA;&#xC5C8;&#xC744; &#xAC83;&#xC774;&#xB2E4;.</li></ul></li><li>&#xB530;&#xB77C;&#xC11C;, &#xC811;&#xADFC; &#xBD88;&#xAC00;&#xB2A5;&#xD55C; &#xC0AC;&#xC6A9;&#xC790;&#xAC00; &#xACBD;&#xB85C;&#xC5D0; &#xB300;&#xD55C; &#xCD94;&#xCE21;&#xC744; &#xD560; &#xC218; &#xC5C6;&#xB3C4;&#xB85D; <code>404 Not Found</code>&#xB97C; &#xC751;&#xB2F5;&#xD55C;&#xB2E4;.<ul><li>&#xB2E4;&#xB9CC;, &#xC11C;&#xBC84; &#xB0B4;&#xC5D0;&#xC11C;&#xB294; &#xC774;&#xB97C; &#xB2E8;&#xC21C; Not Found &#xC640; &#xAC19;&#xC740; &#xB85C;&#xADF8;&#xB97C; &#xB0A8;&#xAE30;&#xAE30;&#xBCF4;&#xB2E4;&#xB294; &#xC798;&#xBABB;&#xB41C; &#xC720;&#xC800;&#xC758; &#xC811;&#xADFC;&#xC784;&#xC744; &#xBA85;&#xD655;&#xD558;&#xAC8C; &#xB0A8;&#xAE30;&#xC790;.</li></ul></li></ul></li></ul>]]></content:encoded></item><item><title><![CDATA[Java + Spring 에서 NestJS Style Auth Guard 만들기]]></title><description><![CDATA[Spring Security, JWT 만을 사용하기에는 너무 크고 복잡하다. 간단한 Annotation으로 컨트롤러의 인증 인가를 설정하는 코드를 작성해보자.]]></description><link>https://life.photogrammer.me/java-spring-eseo-nestjs-style-auth-guard-mandeulgi/</link><guid isPermaLink="false">662650cef2aaa600011eb143</guid><category><![CDATA[Java]]></category><category><![CDATA[Development]]></category><category><![CDATA[Spring]]></category><category><![CDATA[Web]]></category><category><![CDATA[TicketWar]]></category><dc:creator><![CDATA[Sungjun Park]]></dc:creator><pubDate>Mon, 22 Apr 2024 12:58:33 GMT</pubDate><media:content url="https://life.photogrammer.me/content/images/2024/04/--------------------------------20240419221050414.webp" medium="image"/><content:encoded><![CDATA[<img src="https://life.photogrammer.me/content/images/2024/04/--------------------------------20240419221050414.webp" alt="Java + Spring &#xC5D0;&#xC11C; NestJS Style Auth Guard &#xB9CC;&#xB4E4;&#xAE30;"><p></p><h2 id="passportjava">PassportJava</h2><ul><li>&#xC0C8;&#xB85C;&#xC6B4; &#xD504;&#xB85C;&#xC81D;&#xD2B8;&#xC5D0;&#xC11C; &#xC778;&#xC99D;, &#xC778;&#xAC00; &#xACFC;&#xC815;&#xC5D0; Spring Security &#xB97C; &#xC0AC;&#xC6A9;&#xD558;&#xB294; &#xAC83;&#xC774; &#xC801;&#xD569;&#xD558;&#xB2E4;&#xB294; &#xC758;&#xC0AC;&#xACB0;&#xC815;&#xC744; &#xB0B4;&#xB9AC;&#xAE30;&#xB294; &#xD588;&#xC73C;&#xB098;, NestJS &#xB97C; &#xD1B5;&#xD574; &#xBC31;&#xC5D4;&#xB4DC;&#xB97C; &#xAD6C;&#xD604;&#xD588;&#xB358; &#xC785;&#xC7A5;&#xC5D0;&#xC11C;&#xB294; Spring Security&#xC758; &#xC0AC;&#xC6A9;&#xC5D0; &#xB2E4;&#xC18C; &#xBD88;&#xD3B8;&#xD568;&#xC774; &#xC788;&#xC5C8;&#xB2E4;. &#xB54C;&#xBB38;&#xC5D0;, Java + Spring &#xC5D0;&#xC11C; NestJS Style (AuthGuard + Passport.js) &#xC73C;&#xB85C; &#xC778;&#xC99D; / &#xC778;&#xAC00; &#xD504;&#xB808;&#xC784;&#xC6CC;&#xD06C;&#xB97C; &#xC81C;&#xC791;&#xD574;&#xBCF4;&#xACE0; Spring Security &#xC640;&#xC758; &#xC7A5;&#xB2E8;&#xC810;&#xC744; &#xBE44;&#xAD50;&#xD574;&#xBCF4;&#xACE0;&#xC790; &#xD588;&#xB2E4;.</li><li>&#xB0B4;&#xAC00; &#xAD6C;&#xD604;&#xD558;&#xACE0;&#xC790; &#xD558;&#xB294; &#xC2DC;&#xC2A4;&#xD15C;(?)&#xC758; &#xBAA9;&#xD45C;&#xB294; &#xB2E4;&#xC74C;&#xACFC; &#xAC19;&#xB2E4;.<ul><li>NestJS &#xC640; &#xAC19;&#xC774; @AuthGuard(Guard) &#xC640; &#xAC19;&#xC740; &#xD615;&#xD0DC;&#xB85C; Controller &#xC758; method &#xC5D0; &#xB300;&#xD574;&#xC11C; &#xAC00;&#xBCCD;&#xAC8C; Auth &#xACFC;&#xC815;&#xC744; &#xD45C;&#xD604;&#xD560; &#xC218; &#xC788;&#xC744; &#xAC83;.</li><li>AuthGuard &#xC758; &#xACBD;&#xC6B0; Strategy &#xC758; &#xC120;&#xD0DD;&#xC744; &#xD1B5;&#xD574;&#xC11C; Guard &#xC758; &#xC791;&#xB3D9; &#xBC29;&#xC2DD;&#xC744; &#xC120;&#xD0DD;&#xD560; &#xC218; &#xC788;&#xC5B4; &#xC720;&#xC5F0;&#xC131;&#xC744; &#xAC00;&#xC9C8; &#xC218; &#xC788;&#xC744; &#xAC83;. (Strategy pattern &#xC801;&#xC6A9;)</li><li>Guard &#xC5D0;&#xC11C; &#xCC98;&#xB9AC;&#xD55C; &#xC815;&#xBCF4;&#xB97C; &#xC774;&#xD6C4; Method &#xC5D0;&#xC11C; &#xC0AC;&#xC6A9;&#xD560; &#xC218; &#xC788;&#xB3C4;&#xB85D; Parameter&#xB97C; &#xD1B5;&#xD574;&#xC11C; &#xC8FC;&#xC785;&#xD560; &#xC218; &#xC788;&#xB3C4;&#xB85D; &#xD560; &#xAC83;.</li><li>&#xC0AC;&#xC6A9;&#xC790; &#xC785;&#xC7A5;&#xC5D0;&#xC11C;&#xB294; Guard, Strategy&#xC758; &#xC815;&#xC758;&#xB9CC;&#xC73C;&#xB85C; &#xC27D;&#xAC8C; Auth &#xACFC;&#xC815;&#xC744; &#xC815;&#xC758;&#xD560; &#xC218; &#xC788;&#xC744; &#xAC83;.</li></ul></li><li>Passport.js &#xC758; &#xAD6C;&#xC870;&#xC640; NestJS &#xC758; &#xAD6C;&#xC870;&#xB97C; &#xB530;&#xB77C;&#xD588;&#xB2E4;&#xB294; &#xC810;&#xC5D0;&#xC11C; PassportJava &#xB77C;&#xB294; &#xC774;&#xB984;&#xC744; &#xBD99;&#xC5EC;&#xBCF4;&#xC558;&#xB2E4;.</li></ul><h3 id="%EA%B5%AC%EC%A1%B0">&#xAD6C;&#xC870;</h3><ul><li>Controller&#xC758; method&#xB97C; &#xB300;&#xC0C1;&#xC73C;&#xB85C; Request &#xCC98;&#xB9AC; &#xC774;&#xC804;&#xC5D0; intercept&#xD558;&#xC5EC; &#xC2E4;&#xD589;&#xD560; &#xB85C;&#xC9C1;&#xC744; &#xACB0;&#xC815;&#xD558;&#xB294; &#xC2DC;&#xC2A4;&#xD15C;&#xC774;&#xB2E4;. &#xD574;&#xB2F9; &#xC2DC;&#xC2A4;&#xD15C;&#xC740; <code>@UseGuards</code>, <code>@Guard</code> &#xB97C; &#xD1B5;&#xD574;&#xC11C; <code>Guard</code>&#xB97C; &#xC120;&#xD0DD;&#xD558;&#xC5EC; method&#xC5D0; &#xC801;&#xC6A9;&#xD560; &#xC218; &#xC788;&#xC73C;&#xBA70;, &#xB85C;&#xC9C1;&#xC758; &#xC815;&#xC758;&#xB294; <code>Strategy</code> &#xB97C; &#xD1B5;&#xD574; &#xC218;&#xD589;&#xD55C;&#xB2E4;.</li></ul><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://life.photogrammer.me/content/images/2024/04/image.png" class="kg-image" alt="Java + Spring &#xC5D0;&#xC11C; NestJS Style Auth Guard &#xB9CC;&#xB4E4;&#xAE30;" loading="lazy" width="2000" height="1425" srcset="https://life.photogrammer.me/content/images/size/w600/2024/04/image.png 600w, https://life.photogrammer.me/content/images/size/w1000/2024/04/image.png 1000w, https://life.photogrammer.me/content/images/size/w1600/2024/04/image.png 1600w, https://life.photogrammer.me/content/images/2024/04/image.png 2024w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">PassportJava &#xAD6C;&#xC870;</span></figcaption></figure><h3 id="guard">@Guard</h3><ul><li>Controller &#xC5D0;&#xC11C; &#xC0AC;&#xC6A9;&#xC790;&#xAC00; request &#xC774;&#xC804;&#xC5D0; &#xC778;&#xC99D; / &#xC778;&#xAC00; &#xACFC;&#xC815;&#xC5D0; &#xC0AC;&#xC6A9;&#xD560; <code>Guard</code>&#xB97C; &#xC120;&#xD0DD;&#xD560; &#xC218; &#xC788;&#xB3C4;&#xB85D; &#xD558;&#xB294; <code>annotation</code> &#xC774;&#xB2E4;.</li><li>&#xC0AC;&#xC6A9;&#xBC95;<ul><li><code>value = {...&lt;T extends AuthGuard&gt; T.class}</code></li><li><code>args = {...String}</code><ul><li>&#xC8FC;&#xC785;&#xD560; &#xC778;&#xC790;&#xAC00; &#xC5C6;&#xC744; &#xACBD;&#xC6B0; &#xC785;&#xB825;&#xD558;&#xC9C0; &#xC54A;&#xACE0; <code>@Guard(RoleGuard.class)</code> &#xC640; &#xAC19;&#xC774; &#xC0AC;&#xC6A9;&#xD574;&#xB3C4; &#xB41C;&#xB2E4;.</li></ul></li></ul></li></ul><pre><code class="language-java">@Guard(value = RoleGuard.class, args = {&quot;ADMIN&quot;})  
public ResponseEntity&lt;UserResDto&gt; getById(@PathVariable(&quot;id&quot;) Long id)  
	throws NotFoundException {  
	return ResponseEntity.ok(userService.getById(id));  
}
</code></pre><h3 id="useguards">@UseGuards</h3><ul><li>Controller &#xC5D0;&#xC11C; &#xC0AC;&#xC6A9;&#xC790;&#xAC00; request &#xC774;&#xC804;&#xC5D0; &#xC778;&#xC99D; / &#xC778;&#xAC00; &#xACFC;&#xC815;&#xC5D0; &#xC0AC;&#xC6A9;&#xD560; <code>Guard</code>&#xB97C; <strong>&#xC5EC;&#xB7EC; &#xAC1C;</strong> &#xC120;&#xD0DD;&#xD560; &#xC218; &#xC788;&#xB3C4;&#xB85D; &#xD558;&#xB294; <code>annotation</code> &#xC774;&#xB2E4;.<ul><li><strong>Guard&#xB97C; &#xC5EC;&#xB7EC;&#xAC1C; &#xC0AC;&#xC6A9;&#xD558;&#xB294; &#xAC83;&#xACFC; &#xB2E4;&#xB974;&#xC9C0;&#xB294; &#xC54A;&#xB2E4;.</strong></li></ul></li><li>&#xC0AC;&#xC6A9;&#xBC95;<ul><li><code>value = {...Guard.class}</code></li><li><code>args = {...String.class}</code></li></ul></li></ul><pre><code class="language-java">@UseGuards({  
	@Guard(JwtGuard.class),  
	@Guard(value = RoleGuard.class, args = {&quot;ADMIN&quot;})  
})
public ResponseEntity&lt;UserResDto&gt; getById(@PathVariable(&quot;id&quot;) Long id)  
	throws NotFoundException {  
	return ResponseEntity.ok(userService.getById(id));  
}
</code></pre><h3 id="authguard">AuthGuard</h3><ul><li><code>AuthGuard</code> &#xB294; <code>UseGuard</code> &#xC5D0;&#xC11C; &#xC0AC;&#xC6A9;&#xD560; <code>Guard</code>&#xC758; &#xAE30;&#xD2C0;&#xC774; &#xB418;&#xB294; <code>abstract class</code> &#xC774;&#xB2E4;.</li><li>&#xD574;&#xB2F9; &#xD074;&#xB798;&#xC2A4;&#xB294; <code>AuthStrategy</code> &#xB97C; <code>private member</code> &#xB85C; &#xAC00;&#xC9C0;&#xACE0; &#xC788;&#xC73C;&#xBA70;, &#xC774;&#xB97C; &#xC0C1;&#xC18D;&#xD558;&#xB294; &#xBAA8;&#xB4E0; <code>Guard</code> &#xAC1D;&#xCCB4;&#xB294; <code>super(strategy)</code> &#xB97C; &#xD1B5;&#xD574; &#xD574;&#xB2F9; <code>Guard</code>&#xAC00; &#xC0AC;&#xC6A9;&#xD558;&#xB294; <code>Strategy</code>&#xB97C; &#xACB0;&#xC815;&#xD55C;&#xB2E4;.<ul><li><code>AuthStrategy</code> &#xB97C; &#xD1B5;&#xD574;&#xC11C; &#xC9C1;&#xC811; &#xC0AC;&#xC6A9;&#xD560; &#xC218; &#xC788;&#xC73C;&#xB098; &#xB2E4;&#xC74C;&#xACFC; &#xAC19;&#xC774; &#xAD6C;&#xD604;&#xD55C; &#xC774;&#xC720;&#xB294; &#xC544;&#xB798;&#xC640; &#xAC19;&#xB2E4;.<ul><li><code>Guard</code> &#xC758; &#xACBD;&#xC6B0; &#xC5B4;&#xB5A4; &#xD615;&#xD0DC;&#xC758; <code>Auth</code> &#xACFC;&#xC815;&#xC758; <code>Guard</code>&#xB97C; &#xC801;&#xC6A9; &#xD568;&#xC744; &#xC758;&#xBBF8;&#xD55C;&#xB2E4;.<ul><li>Guard&#xC758; &#xC801;&#xC6A9;&#xC740; &#xACB0;&#xAD6D; Controller &#xC758; method &#xC2E4;&#xD589; &#xC774;&#xC804; &#xC5B4;&#xB5A4; &#xB3D9;&#xC791;&#xC774; &#xC2E4;&#xD589;&#xB428;&#xC744; &#xC801;&#xC6A9;&#xD558;&#xB294; &#xAC83;&#xC774;&#xB2E4;.</li></ul></li><li>&#xC608;&#xB97C; &#xB4E4;&#xC5B4;, &#xC720;&#xC800;&#xC758; &#xB85C;&#xADF8;&#xC778; &#xAC00;&#xB2A5; &#xC5EC;&#xBD80;&#xB97C; &#xBB3B;&#xB294; &#xC778;&#xC99D; &#xACFC;&#xC815;&#xC774;&#xB77C;&#xACE0; &#xD558;&#xC790;.  &#xC774;&#xB97C; <code>LoginedGuard</code> &#xB77C;&#xACE0; &#xD558;&#xBA74;, &#xD574;&#xB2F9; &#xC778;&#xC99D; &#xACFC;&#xC815;&#xC5D0;&#xB294; <code>JWT</code> &#xB97C; &#xC0AC;&#xC6A9;&#xD55C; &#xC804;&#xB7B5;&#xC774; &#xC0AC;&#xC6A9;&#xB420; &#xC218;&#xB3C4; &#xC788;&#xACE0;, <code>Session</code> &#xC744; &#xD1B5;&#xD55C; &#xC804;&#xB7B5;&#xC774; &#xC0AC;&#xC6A9;&#xB420; &#xC218;&#xB3C4; &#xC788;&#xB2E4;. &#xD639;&#xC740; &#xB610; &#xB2E4;&#xB978; &#xC804;&#xB7B5;&#xC774; &#xC120;&#xD0DD;&#xB420; &#xC218;&#xB3C4; &#xC788;&#xB2E4;.</li><li>&#xC804;&#xB7B5;&#xC774; &#xBCC0;&#xACBD;&#xB41C; &#xACBD;&#xC6B0;&#xC5D0;&#xB3C4;, &#xD574;&#xB2F9; <code>Guard</code>&#xC758; &#xC5ED;&#xD560;&#xC740; &#xB85C;&#xADF8;&#xC778; &#xAC80;&#xC99D;&#xC77C; &#xBFD0;&#xC774;&#xBBC0;&#xB85C;, &#xBC14;&#xB00C;&#xC9C0; &#xC54A;&#xB294;&#xB2E4;. &#xB530;&#xB77C;&#xC11C; &#xB2E8;&#xC21C;&#xD788; &#xD574;&#xB2F9; &#xC720;&#xC800;&#xB97C; &#xAC80;&#xC99D;&#xD558;&#xB294; &#xC804;&#xB7B5;&#xB9CC; &#xBCC0;&#xACBD; &#xD568;&#xC73C;&#xB85C;&#xC368; &#xCF54;&#xB4DC;&#xC758; &#xB2E8; &#xD55C;&#xBD80;&#xBD84;&#xB9CC; &#xBCC0;&#xACBD;&#xD558;&#xC5EC; &#xD574;&#xB2F9; &#xC804;&#xB7B5;&#xC758; &#xBCC0;&#xACBD;&#xC774; &#xAC00;&#xB2A5;&#xD558;&#xB2E4;.</li><li>&#xB9CC;&#xC57D; &#xADF8;&#xB807;&#xC9C0; &#xC54A;&#xB2E4;&#xBA74;, <code>@UseGuards({JwtStrategy.class})</code> &#xB77C;&#xACE0; &#xC791;&#xC131;&#xB41C; &#xBAA8;&#xB4E0; method&#xB97C; &#xBCC0;&#xACBD;&#xD574;&#xC57C;&#xD560; &#xAC83;&#xC774;&#xB2E4;.</li></ul></li></ul></li><li>&#xD574;&#xB2F9; &#xD074;&#xB798;&#xC2A4;&#xB97C; &#xAD6C;&#xD604;&#xD558;&#xB294; &#xAC1D;&#xCCB4;&#xB294; <code>@Component</code> &#xB97C; &#xD1B5;&#xD574; <code>Spring bean</code> &#xC73C;&#xB85C; &#xB4F1;&#xB85D;&#xB418;&#xC5B4;&#xC57C;&#xD55C;&#xB2E4;. <code>GuardResolver</code> &#xC5D0;&#xC11C; &#xD574;&#xB2F9; &#xAC1D;&#xCCB4;&#xB4E4;&#xC744; &#xC2A4;&#xCE94;&#xD558;&#xC5EC; &#xAC00;&#xC9C0;&#xACE0; &#xC788;&#xC5B4;&#xC57C;&#xD55C;&#xB2E4;.</li><li>&#xAD6C;&#xD604;</li></ul><pre><code class="language-java">public abstract class AuthGuard {  
	private AuthStrategy authStrategy;  
	/**  
	* &#xC0C1;&#xC18D;&#xBC1B;&#xC740; &#xD074;&#xB798;&#xC2A4;&#xB294; &#xBC18;&#xB4DC;&#xC2DC; AuthStrategy&#xB97C; &#xC9C0;&#xC815;&#xD574;&#xC57C;&#xD569;&#xB2C8;&#xB2E4;.  
	*  
	* @param authStrategy  
	*/  
	public AuthGuard(AuthStrategy authStrategy) {  
		this.authStrategy = authStrategy;  
	}  
	  
	public final void check(HttpServletRequest request, String... args) {  
		try {  
			authStrategy.check(request, args);  
		} catch (CustomException customException) {  
			throw customException;  
		} catch (RuntimeException e) {  
			throw new CustomException(ExceptionStatus.UNAUTHORIZED_USER);  
		}  
	}  
}
</code></pre><ul><li>&#xC0AC;&#xC6A9;&#xBC95;</li></ul><pre><code class="language-java">@Component  
public class RoleGuard extends AuthGuard {  
	  
	public RoleGuard(@Autowired RoleStrategy strategy) {  
		super(strategy);  
	}  
}
</code></pre><h3 id="authstrategy">AuthStrategy</h3><ul><li><code>AuthStrategy</code> &#xB294; &#xC0AC;&#xC6A9;&#xC790;&#xAC00; &#xC815;&#xC758;&#xD560; <code>Strategy</code>&#xC758; &#xAE30;&#xD2C0;&#xC774; &#xB418;&#xB294; <code>interface</code> &#xC774;&#xB2E4;.<ul><li>&#xBCF4;&#xB2E4; &#xC720;&#xC5F0;&#xD558;&#xAC8C; &#xC804;&#xB7B5;&#xC744; &#xC120;&#xD0DD;&#xD558;&#xC5EC; <code>Guard</code> &#xB97C; &#xC815;&#xC758;&#xD558;&#xB3C4;&#xB85D; &#xD558;&#xC600;&#xB2E4;.</li></ul></li><li>&#xD574;&#xB2F9; <code>interface</code> &#xB294; <code>AuthGuard</code> &#xC5D0; &#xC8FC;&#xC785;&#xB420; &#xAC1D;&#xCCB4;&#xB97C; &#xC815;&#xC758;&#xD558;&#xBA70;, <code>implements</code> &#xD558;&#xB294; <code>class</code> &#xB294; <code>public void check(HttpServletRequest request, String... args)</code> &#xB97C; &#xC815;&#xC758;&#xD574;&#xC57C;&#xD55C;&#xB2E4;.</li><li>&#xC774;&#xD6C4; &#xD574;&#xB2F9; &#xC804;&#xB7B5;&#xC744; &#xC0AC;&#xC6A9;&#xD558;&#xAE30; &#xC704;&#xD574;&#xC11C;&#xB294; <code>AuthGuard</code> &#xB97C; &#xC0C1;&#xC18D;&#xD55C; &#xAC1D;&#xCCB4;&#xC758; constructor&#xC5D0;&#xC11C; &#xC0AC;&#xC6A9;&#xD560; Spring bean strategy&#xB97C; &#xC8FC;&#xC785;&#xD560; &#xC218; &#xC788;&#xB3C4;&#xB85D; <code>JwtGuard(@Autowired JwtStrategy strategy)</code> &#xC640; &#xAC19;&#xC774; &#xC815;&#xC758;&#xD574;&#xC57C;&#xD55C;&#xB2E4;.</li><li>&#xAD6C;&#xD604;</li></ul><pre><code class="language-java">public interface AuthStrategy {  
	/**  
	* Check method&#xB294; &#xD574;&#xB2F9; Auth &#xC791;&#xC5C5;&#xC5D0; &#xB300;&#xD55C; &#xC804;&#xB7B5;&#xC744; &#xC218;&#xD589;&#xD569;&#xB2C8;&#xB2E4;. &#xB9CC;&#xC57D;, &#xAC80;&#xC99D; &#xACFC;&#xC815;&#xC5D0;&#xC11C; &#xC2E4;&#xD328;&#xD560; &#xACBD;&#xC6B0; Error&#xB97C; throw &#xD569;&#xB2C8;&#xB2E4;. &#xD574;&#xB2F9; Error&#xB294;  
	* Exception Handler &#xC5D0;&#xC11C; &#xCC98;&#xB9AC;&#xD560; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.  
	*  
	* @param request  
	*/  
	public void check(HttpServletRequest request, String... args);  
}
</code></pre><ul><li>&#xC0AC;&#xC6A9;&#xBC95;</li></ul><pre><code class="language-java">@Component  
public class RoleStrategy implements AuthStrategy {  
	@Override  
	public void check(HttpServletRequest request, String[] args) {  
	// role check  
	}  
}

// JwtGuard &#xC758; &#xC815;&#xC758;
public class RoleGuard extends AuthGuard {
  public RoleGuard(@Autowired RoleStrategy strategy) { super(strategy); }
}
</code></pre><h3 id="guardaspect">GuardAspect</h3><ul><li><code>@UseGuards</code> &#xB97C; &#xD578;&#xB4E4;&#xB9C1;&#xD558;&#xAE30; &#xC704;&#xD55C; <code>ApectJ</code>&#xB97C; &#xC0AC;&#xC6A9;&#xD558;&#xB294; <code>class</code>&#xC774;&#xB2E4;. <code>handleUseGuards()</code> &#xB97C; &#xD1B5;&#xD574; &#xD574;&#xB2F9; <code>annotation</code> &#xC744; &#xC120;&#xC5B8;&#xD55C; &#xBA54;&#xC18C;&#xB4DC;&#xAC00; &#xC2E4;&#xD589;&#xB418;&#xAE30; &#xC774;&#xC804;&#xC5D0; <code>Guard</code> &#xC758; <code>Strategy</code> &#xB97C; &#xC2E4;&#xD589;&#xD55C;&#xB2E4;.</li><li><code>GuardAspect</code> &#xC758; &#xACBD;&#xC6B0; <code>GuardResolver</code> &#xB97C; &#xD1B5;&#xD574; <code>Guard</code> &#xAC1D;&#xCCB4;&#xB97C; &#xCC3E;&#xC544;&#xB0B8;&#xB2E4;.</li><li>&#xAD6C;&#xD604;</li></ul><pre><code class="language-java">@Aspect  
@Component  
public class GuardAspect {  
	  
	@Autowired  
	private GuardResolver guardResolver;  
	  
	@Before(&quot;@annotation(useGuards)&quot;)  
	public void handleUseGuards(UseGuards useGuards) {  
		final HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder
		.currentRequestAttributes())
		.getRequest();  
		final List&lt;Guard&gt; guards = Arrays.stream(useGuards.value()).toList();  
		for (Guard guard : guards) {  
			AuthGuard authGuard = guardResolver.getGuard(guard.value().getSimpleName());  
			authGuard.check(request, guard.args());  
		}  
	}  
	  
	@Before(&quot;@annotation(guard)&quot;)  
	public void handleGuard(Guard guard) {  
		final HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder  
		.currentRequestAttributes()).getRequest();  
		final AuthGuard authGuard =  
		guardResolver.getGuard(guard.value().getSimpleName());  
		authGuard.check(request, guard.args());  
	}  
}
</code></pre><h3 id="guardresolver">GuardResolver</h3><ul><li><code>Spring Bean</code> &#xC73C;&#xB85C; &#xB4F1;&#xB85D;&#xB41C; &#xAC1D;&#xCCB4; &#xC911; <code>AuthGuard</code> &#xD0C0;&#xC785;&#xC758; &#xAC1D;&#xCCB4;&#xB97C; &#xCC3E;&#xC544; &#xC800;&#xC7A5;&#xD558;&#xACE0;, &#xC774;&#xB97C; &#xC774;&#xD6C4;&#xC5D0; <code>GuardAspect</code> &#xC5D0; &#xC804;&#xB2EC;&#xD558;&#xB294; &#xC5ED;&#xD560;&#xC744; &#xC218;&#xD589;&#xD55C;&#xB2E4;.</li><li>&#xAD6C;&#xD604;</li></ul><pre><code class="language-java">  
@Component  
public class GuardResolver {  
	  
	private final Map&lt;String, AuthGuard&gt; guards;  
	  
	public GuardResolver(List&lt;AuthGuard&gt; guards) {  
		this.guards = guards.stream()  
			.collect(  
				Collectors.toMap(  
				g -&gt; g.getClass().getSimpleName(),  
				Function.identity()  
			));  
	}  
	  
	public AuthGuard getGuard(@NonNull String guardName) {  
		return this.guards.get(guardName);  
	}  
}
</code></pre><h2 id="userdata">UserData</h2><ul><li><code>Guard</code> &#xB97C; &#xD1B5;&#xD574;&#xC11C; <code>Session</code> &#xD639;&#xC740; <code>JWT</code> &#xC815;&#xBCF4;&#xB97C; &#xAC00;&#xC838;&#xC62C; &#xC218; &#xC788;&#xB2E4;. &#xD574;&#xB2F9; &#xACBD;&#xC6B0;&#xB97C; &#xC704;&#xD55C; &#xC9C0;&#xC6D0;&#xC73C;&#xB85C; <code>HttpServletRequest</code> &#xAC1D;&#xCCB4;&#xB97C; &#xD1B5;&#xD574;&#xC11C; &#xC720;&#xC800;&#xC758; &#xB370;&#xC774;&#xD130;&#xB97C; <code>parameter</code> &#xB97C; &#xD1B5;&#xD574; &#xC8FC;&#xC785;&#xD558;&#xB294; &#xC5ED;&#xD560;&#xC744; &#xC218;&#xD589;&#xD558;&#xB294; <code>annotation</code> &#xC774; &#xD544;&#xC694;&#xD558;&#xB2E4;.</li></ul><h3 id="userdata-1">@UserData</h3><ul><li><code>Guard</code> &#xC5D0;&#xC11C; &#xC8FC;&#xC785;&#xB41C; &#xC815;&#xBCF4;&#xB97C; &#xC0AC;&#xC6A9;&#xD558;&#xBA70;, &#xC774; &#xC815;&#xBCF4;&#xB294; <code>HttpServletRequest</code> &#xC758; <code>USER_DATA</code> attribute &#xB97C; &#xAE30;&#xBCF8;&#xC73C;&#xB85C; &#xD55C;&#xB2E4;. &#xB9CC;&#xC57D; &#xB2E4;&#xB978; &#xD615;&#xD0DC;&#xC758; attribute &#xB97C; &#xC0AC;&#xC6A9;&#xD558;&#xACE0;&#xC790; &#xD558;&#xB294; &#xACBD;&#xC6B0;, <code>@UserData </code>&#xC758; <code>value</code> &#xAC12;&#xC744; &#xC9C0;&#xC815;&#xD574;&#xC57C;&#xD55C;&#xB2E4;.<ul><li>&#xD574;&#xB2F9; &#xAC12;&#xC740; &#xC678;&#xBD80; <code>Configure</code> &#xC744; &#xD1B5;&#xD55C; &#xC8FC;&#xC785;&#xC744; &#xCD94;&#xCC9C;&#xD558;&#xBA70;, <code>HttpServletRequest</code> &#xC758; <code>attribute</code> &#xC640; &#xACB9;&#xCE58;&#xC9C0; &#xC54A;&#xB3C4;&#xB85D;&#xD574;&#xC57C;&#xD55C;&#xB2E4;. <code>SNAKE_CASE(UPPER CASE)</code> &#xB97C; &#xCD94;&#xCC9C;&#xD55C;&#xB2E4;.</li></ul></li></ul><h4 id="%EC%98%88%EC%8B%9C">&#xC608;&#xC2DC;</h4><ul><li>Guard</li></ul><pre><code class="language-java">@Component  
public class JwtStrategy implements AuthStrategy {  
	@Value(&quot;jwt.data.name&quot;)  
	private String dataName = &quot;JWT_DATA&quot;;  
	  
	@Override  
	public void check(HttpServletRequest request, String... args) {
		String token = getTokenFromRequest(request);
		request.setAttribute(dataName, token);  

	}  
	  
	private String getTokenFromRequest(@NonNull HttpServletRequest request) {  
		// Get Bearer token from authorization  
		return request.getHeader(HttpHeaders.AUTHORIZATION);  
	}  
}
</code></pre><ul><li>UserData &#xC801;&#xC6A9;</li></ul><pre><code class="language-java">// controller code
@Value(&quot;jwt.data.name&quot;)
private String jwtDataName;

//...

@GetMapping(&quot;/{id}&quot;)
public boolean someMethod(
	@PathVariable(&quot;id&quot;) Long id,  
	@UserData(jwtDataName) String token, // token is injected
	@UserData JwtData data // value &#xC5C6;&#xC774;&#xB3C4; &#xAC00;&#xB2A5;. default &quot;USER_DATA&quot; &#xC0AC;&#xC6A9;.
	) throws NotFoundException {
	return ResponseEntity.ok(userService.getById(id, token));  
}
</code></pre><h3 id="userdataaspect">UserDataAspect</h3><ul><li><code>@UserData</code> &#xB97C; &#xD578;&#xB4E4;&#xB9C1;&#xD558;&#xAE30; &#xC704;&#xD55C; <code>ApectJ</code>&#xB97C; &#xC0AC;&#xC6A9;&#xD558;&#xB294; <code>class</code>&#xC774;&#xB2E4;. <code>handleUserData()</code> &#xB97C; &#xD1B5;&#xD574; &#xD574;&#xB2F9; <code>annotation</code> &#xC744; &#xC120;&#xC5B8;&#xD55C; <code>parameter</code> &#xAC12;&#xC5D0; &#xD574;&#xB2F9; <code>Object</code> &#xB97C; &#xC8FC;&#xC785;&#xD55C;&#xB2E4;.</li><li><strong>&#xD574;&#xB2F9; annotation&#xC744; &#xC0AC;&#xC6A9;&#xD560; &#xB54C; &#xBC18;&#xB4DC;&#xC2DC; Strategy&#xC5D0;&#xC11C; &#xC0AC;&#xC6A9;&#xD558;&#xB294; &#xD0C0;&#xC785;&#xACFC; &#xC77C;&#xCE58;&#xD574;&#xC57C;&#xD55C;&#xB2E4;.</strong></li><li>&#xAD6C;&#xD604;</li></ul><pre><code class="language-Java">
@Aspect
@Component
public class UserDataAspect {

  /**
   * TokenData annotation &#xC744; &#xC801;&#xC6A9;&#xD55C; Parameter &#xC5D0; &#xB300;&#xD574;&#xC11C; Request&#xC758; TokenData Attribute &#xB97C; &#xAC00;&#xC838;&#xC635;&#xB2C8;&#xB2E4;. Pointcut :
   * method(params.., @TokenData(Type data), params..)
   * &lt;p&gt;
   * TokenData &#xC758; &#xACBD;&#xC6B0; v
   *
   * @param joinPoint
   * @return
   * @throws Throwable
   */
  @Around(&quot;execution(* *(.., @com.ticketwar.ticketwar.auth.pass.UserData (*), ..))&quot;)
  public Object handleUserData(ProceedingJoinPoint joinPoint)
      throws Throwable {
    final Signature signature = joinPoint.getSignature();
    final MethodSignature methodSignature = (MethodSignature) signature;
    final Method method = methodSignature.getMethod();
    final Parameter[] parameters = method.getParameters();
    final Object args[] = joinPoint.getArgs();
    final HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder
        .currentRequestAttributes()).getRequest();

    for (int idx = 0; idx &lt; parameters.length; ++idx) {
      UserData userData = parameters[idx].getAnnotation(UserData.class);
      if (userData != null) {
        args[idx] = request.getAttribute(userData.value());
        break;
      }
    }
    return joinPoint.proceed(args);
  }
}</code></pre><h2 id="jwt-%EC%A0%81%EC%9A%A9%ED%95%98%EA%B8%B0">JWT &#xC801;&#xC6A9;&#xD558;&#xAE30;</h2><p>JWT &#xC758; &#xACBD;&#xC6B0; <code>auth0:java-jwt</code> &#xB77C;&#xC774;&#xBE0C;&#xB7EC;&#xB9AC;&#xB97C; &#xD65C;&#xC6A9;&#xD558;&#xC600;&#xB2E4;.</p><p>(&#xB2E8;&#xC21C;&#xD55C; PassportJava &#xC801;&#xC6A9; &#xC608;&#xC2DC;)</p><h3 id="jwtconfigure">JwtConfigure</h3><ul><li>Spring Bean &#xC73C;&#xB85C;, &#xC678;&#xBD80; &#xBCC0;&#xC218;&#xB97C; &#xC8FC;&#xC785;&#xD558;&#xAE30; &#xC704;&#xD568;&#xC774;&#xB2E4;.<ul><li><code>jwt.data.name</code><ul><li><code>@UserData</code> &#xC5D0; &#xC800;&#xC7A5;&#xD560; <code>request</code> &#xC758; <code>attribute</code> &#xC774;&#xB984;&#xC744; &#xC9C0;&#xC815;&#xD568;.</li></ul></li><li><code>jwt.secret</code><ul><li>JWT secret &#xC9C0;&#xC815;.</li></ul></li></ul></li></ul><pre><code class="language-Java">
@Component
public class JwtConfigure {
  @Value(&quot;${jwt.data.name:USER_DATA}&quot;)
  private String dataName;

  @Value(&quot;${jwt.secret}&quot;)
  private String secret;

  public String getDataName() {
    return dataName;
  }

  public String getSecret() {
    return secret;
  }
}
</code></pre><h3 id="jwtutil">JwtUtil</h3><ul><li>SpringBean (Configure &#xC0AC;&#xC6A9; &#xBC0F; &#xD0C0; Bean &#xC5D0;&#xC11C; autowire &#xC0AC;&#xC6A9;&#xC744; &#xC704;&#xD568;.) &#xC73C;&#xB85C;, JWT &#xD1A0;&#xD070; &#xD68D;&#xB4DD; &#xACFC;&#xC815;&#xACFC; &#xAD00;&#xB828;&#xB41C; method&#xB97C; &#xB2F4;&#xB294;&#xB2E4;.</li><li><code>verifyTokenFromRequestAuthorizationHeader</code><ul><li><code>HttpServletRequest</code> &#xB85C; &#xBD80;&#xD130; <code>Bearer Token</code> &#xC744; &#xD68D;&#xB4DD;&#xD558;&#xACE0;, &#xC774;&#xB97C; <code>JwtData</code> &#xD615;&#xD0DC;&#xB85C; &#xBCC0;&#xD658;&#xD55C;&#xB2E4;.</li></ul></li><li>&#xC774;&#xD6C4; &#xB2E4;&#xB978; &#xD615;&#xD0DC;&#xB85C; JWT &#xAC00; &#xD544;&#xC694;&#xD560; &#xACBD;&#xC6B0;, &#xD574;&#xB2F9; &#xD615;&#xD0DC;&#xB85C; &#xAC00;&#xC838;&#xC640;&#xC11C; &#xC0AC;&#xC6A9;&#xD560; &#xC218; &#xC788;&#xB3C4;&#xB85D; method&#xB97C; &#xCD94;&#xAC00;&#xD560; &#xAC83;&#xC774;&#xB2E4;.</li></ul><pre><code class="language-Java">
@Component
public class JwtUtil {
  private final String BEARER = &quot;BEARER &quot;;
  @Autowired
  private JwtConfigure jwtConfigure;

  /**
   * Verify Authorization header&apos;s bearer token.
   * &lt;p&gt;
   * if fails, it throws RuntimeException.
   *
   * @param request
   * @return
   */
  public JwtData verifyTokenFromRequestAuthorizationHeader(HttpServletRequest request) {
    final String bearerToken = request.getHeader(HttpHeaders.AUTHORIZATION).substring(BEARER.length());
    final Algorithm algorithm = Algorithm.HMAC256(jwtConfigure.getSecret());
    final JWTVerifier jwtVerifier = JWT.require(algorithm).build();
    final DecodedJWT decodedJWT = jwtVerifier.verify(bearerToken);

    return getJwtDataFromDecodedJwt(decodedJWT);
  }

  private JwtData getJwtDataFromDecodedJwt(DecodedJWT decodedJWT) {
    final Claim id = decodedJWT.getClaim(&quot;id&quot;);
    final Claim email = decodedJWT.getClaim(&quot;email&quot;);
    final Claim nickname = decodedJWT.getClaim(&quot;nickname&quot;);
    final Claim role = decodedJWT.getClaim(&quot;role&quot;);

    return JwtData.builder()
        .id(id.asLong())
        .email(email.asString())
        .nickname(nickname.asString())
        .role(role.asString())
        .build();
  }
}
</code></pre><h3 id="jwtstrategy">JwtStrategy</h3><pre><code class="language-Java">@Component
public class JwtStrategy implements AuthStrategy {
  @Autowired
  private JwtConfigure jwtConfigure;
  @Autowired
  private JwtUtil jwtUtil;

  @Override
  public void check(HttpServletRequest request, String... args) {
    final JwtData jwtData = jwtUtil.verifyTokenFromRequestAuthorizationHeader(request);
    request.setAttribute(jwtConfigure.getDataName(), jwtData);
  }

}
</code></pre><h3 id="jwtguard">JwtGuard</h3><pre><code class="language-Java">@Component
public class JwtGuard extends AuthGuard {
  public JwtGuard(@Autowired JwtStrategy strategy) {
    super(strategy);
  }
}
</code></pre><h2 id="%EA%B0%9C%EB%B0%9C-%EA%B3%BC%EC%A0%95-%EC%A4%91-%EB%AC%B8%EC%A0%9C">&#xAC1C;&#xBC1C; &#xACFC;&#xC815; &#xC911; &#xBB38;&#xC81C;</h2><h3 id="spring-bean-%ED%9A%8D%EB%93%9D%EA%B3%BC-new-%EB%A5%BC-%ED%86%B5%ED%95%9C-object">Spring bean &#xD68D;&#xB4DD;&#xACFC; new ()&#xB97C; &#xD1B5;&#xD55C; Object</h3><ul><li>AuthGuard &#xC758; &#xC124;&#xACC4; &#xCD08;&#xAE30;&#xC5D0;&#xB294; <code>super(new JwtStrategy())</code> &#xC640; &#xAC19;&#xC740; &#xD615;&#xD0DC;&#xB97C; &#xD1B5;&#xD574;&#xC11C; <code>Strategy</code> &#xB97C; &#xC8FC;&#xC785;&#xD558;&#xC600;&#xB2E4;. Spring &#xACFC; &#xC0C1;&#xAD00; &#xC5C6;&#xC774; <code>Strategy</code> &#xB97C; &#xC81C;&#xC791;&#xC744; &#xD558;&#xACE0;&#xC790; &#xD568;&#xC774;&#xC5C8;&#xB2E4;.</li></ul><pre><code class="language-java">@Component  
public class JwtGuard extends AuthGuard {  
	  
	public JwtGuard() {  
		super(new JwtStrategy());  
	}  
}
</code></pre><ul><li>&#xADF8;&#xB7EC;&#xB098; <code>JwtStrategy</code> &#xB97C; &#xB9CC;&#xB4E4;&#xBA74;&#xC11C;, &#xC2E4;&#xD328;&#xD588;&#xB2E4;. <code>JwtStrategy</code> &#xC758; &#xACBD;&#xC6B0; &#xD544;&#xC5F0;&#xC801;&#xC73C;&#xB85C; <code>secret</code> &#xC744; &#xC678;&#xBD80;&#xB85C;&#xBD80;&#xD130; &#xC8FC;&#xC785;&#xBC1B;&#xC544;&#xC57C;&#xD558;&#xB294;&#xB370;, &#xBCF4;&#xD1B5; &#xADF8; &#xC218;&#xB2E8;&#xC73C;&#xB85C; Spring&#xC758; <code>@Value</code> &#xB97C; &#xD1B5;&#xD574;&#xC11C; &#xAC12;&#xC744; &#xC8FC;&#xC785;&#xBC1B;&#xB294;&#xB2E4;. &#xADF8;&#xB7EC;&#xB098;, &#xC774;&#xB294; <code>Spring bean</code> &#xC5D0; &#xC758;&#xD574;&#xC11C;&#xB9CC; &#xAC00;&#xB2A5;&#xD558;&#xB2E4;.</li><li>&#xB530;&#xB77C;&#xC11C; &#xC5B4;&#xCA54; &#xC218; &#xC5C6;&#xC774;, <code>@Component</code> &#xB97C; &#xC120;&#xC5B8;&#xD558;&#xACE0;, Spring bean &#xC5D0; &#xB4F1;&#xB85D;&#xC744; &#xD558;&#xC600;&#xC73C;&#xB098;, <code>jwt.secret</code> &#xC758; &#xAC12;&#xC744; &#xC81C;&#xB300;&#xB85C; &#xAC00;&#xC838;&#xC624;&#xC9C0; &#xBABB;&#xD588;&#xB2E4;. &#xC704; &#xCF54;&#xB4DC;&#xB97C; &#xBCF4;&#xBA74; &#xC54C; &#xC218; &#xC788;&#xB4EF;, <code>JwtStrategy</code> &#xB97C; <code>new</code> &#xB97C; &#xD1B5;&#xD574;&#xC11C; &#xC0C8;&#xB85C; &#xC778;&#xC2A4;&#xD134;&#xC2A4;&#xB97C; &#xB9CC;&#xB4E4;&#xACE0; &#xC8FC;&#xC785;&#xD558;&#xAE30;&#xC5D0;, <code>Bean</code> &#xACFC; &#xAD00;&#xB828;&#xC5C6;&#xB294; &#xAC1D;&#xCCB4;&#xAC00; &#xC8FC;&#xC785;&#xC774;&#xB418;&#xC5C8;&#xB2E4;.</li><li><code>AuthGuard</code> &#xC758; <code>constructor</code> &#xC5D0;&#xC11C; &#xC9C1;&#xC811; bean &#xC744; &#xCC3E;&#xC544; &#xB123;&#xB294; &#xBC29;&#xC2DD;&#xB3C4; &#xC2DC;&#xB3C4;&#xD558;&#xC600;&#xC73C;&#xB098;, &#xC801;&#xC808;&#xD558;&#xC9C0;&#xB3C4; &#xC54A;&#xC73C;&#xBA70;, &#xD574;&#xB2F9; &#xC2DC;&#xC810;&#xC5D0;&#xB294; <code>ApplicationContext</code>&#xAC00; &#xC644;&#xC131;&#xB418;&#xC9C0; &#xC54A;&#xC544; &#xD65C;&#xC6A9;&#xD560; &#xC218;&#xB3C4; &#xC5C6;&#xB2E4;. (&#xB418;&#xB3C4;&#xB85D;&#xC774;&#xBA74; &#xC811;&#xADFC;&#xD558;&#xC9C0; &#xC54A;&#xB294; &#xAC83;&#xC774; &#xB9DE;&#xB2E4;&#xACE0; &#xC0DD;&#xAC01;&#xD55C;&#xB2E4;.) &#xC774;&#xB807;&#xAC8C; &#xD560; &#xACBD;&#xC6B0;, Spring &#xC790;&#xCCB4;&#xC5D0;&#xB3C4; &#xC758;&#xC874;&#xC131;&#xC774; &#xC0DD;&#xACA8;&#xBC84;&#xB9B0; &#xC0C1;&#xD0DC;&#xAE30; &#xB54C;&#xBB38;&#xC5D0; &#xC758;&#xBBF8;&#xAC00; &#xC5C6;&#xC5C8;&#xB2E4;.</li><li>&#xC560;&#xCD08;&#xC5D0; &#xD574;&#xB2F9; &#xC2DC;&#xC2A4;&#xD15C; &#xC790;&#xCCB4;&#xAC00; Spring&#xC5D0; &#xC758;&#xC874;&#xC744; &#xD558;&#xACE0; &#xC788;&#xAE30; &#xB54C;&#xBB38;&#xC5D0;, Strategy&#xB97C; Component&#xB85C; &#xB4F1;&#xB85D;&#xD558;&#xC9C0; &#xC54A;&#xC744; &#xC774;&#xC720;&#xB294; &#xC5C6;&#xC5C8;&#xB2E4;. &#xB530;&#xB77C;&#xC11C;, &#xD56D;&#xC0C1; <code>AuthStrategy</code> &#xAD6C;&#xD604; &#xAC1D;&#xCCB4;&#xB294; Spring Bean &#xC5D0; &#xB4F1;&#xB85D;&#xD558;&#xACE0;, <code>@Autowired</code> &#xB97C; &#xD1B5;&#xD574;&#xC11C; &#xC774;&#xB97C; &#xB4F1;&#xB85D;&#xD558;&#xB3C4;&#xB85D; &#xD588;&#xB2E4;.</li><li>&#xACB0;&#xACFC;&#xC801;&#xC73C;&#xB85C;&#xB294; NestJS + Passport &#xC758; &#xBC29;&#xC2DD;&#xC5D0; &#xBE44;&#xD558;&#xBA74; &#xC870;&#xAE08; &#xBCF5;&#xC7A1;&#xD558;&#xAE30;&#xB294; &#xD558;&#xB098;, <code>AuthGuard</code> &#xC758; &#xC720;&#xC5F0;&#xC131;&#xC744; &#xC9C0;&#xD0A4;&#xACE0;, &#xBA87; &#xC904; &#xC548;&#xB418;&#xB294; &#xCF54;&#xB4DC;&#xB85C; <code>AuthStrategy</code> &#xB97C; &#xACB0;&#xC815;&#xD560; &#xC218; &#xC788;&#xB294; &#xBC29;&#xC2DD;&#xC774; &#xB418;&#xC5C8;&#xB2E4;. &#xB098;&#xB984; &#xAE54;&#xB054;&#xD558;&#xAC8C; &#xC0AC;&#xC6A9;&#xC790;&#xAC00; &#xC120;&#xC5B8;&#xD560; &#xC218; &#xC788;&#xC5B4; &#xB9C8;&#xC74C;&#xC5D0; &#xB4E0;&#xB2E4;.</li></ul><pre><code class="language-java">@Component  
public class JwtGuard extends AuthGuard {  
	  
	public JwtGuard(@Autowired JwtStrategy strategy) {  
		super(strategy);  
	}  
}
</code></pre><h3 id="guard-useguards%EC%97%90%EC%84%9C-arguments">@Guard, @UseGuards&#xC5D0;&#xC11C; arguments</h3><pre><code class="language-java">@UseGuards({JwtGuard.class, RoleGuard.class})
</code></pre><ul><li>&#xCD08;&#xAE30;&#xC5D0;&#xB294; <code>@Guard</code> &#xC5C6;&#xC774; <code>@UseGuards</code> &#xB9CC;&#xC73C;&#xB85C; &#xAD6C;&#xC131;&#xD588;&#xB2E4;. &#xB610;&#xD55C;, &#xC778;&#xC790;&#xB97C; &#xBC1B;&#xC9C0; &#xC54A;&#xC558;&#xB2E4;.</li><li><code>JwtGuard</code> &#xC758; &#xACBD;&#xC6B0;, JWT verification &#xB9CC; &#xD558;&#xACE0; &#xB05D;&#xB0B4;&#xBA74; &#xB418;&#xB2C8;, &#xD2B9;&#xBCC4;&#xD55C; &#xC778;&#xC790;&#xAC00; &#xD544;&#xC694;&#xC5C6;&#xC9C0;&#xB9CC;, <code>RoleGuard</code> &#xC758; &#xACBD;&#xC6B0; &#xD574;&#xB2F9; method &#xC758; &#xC811;&#xADFC; &#xAD8C;&#xD55C;&#xC744; &#xC124;&#xC815;&#xD574;&#xC57C;&#xD558;&#xAE30; &#xB54C;&#xBB38;&#xC5D0; &#xBB38;&#xC81C;&#xAC00; &#xBC1C;&#xC0DD;&#xD55C;&#xB2E4;.</li><li>&#xB610;&#xD55C; &#xB2E4;&#xB978; custom guard &#xB97C; &#xB9CC;&#xB4E4; &#xACBD;&#xC6B0;&#xC5D0;&#xC11C;&#xB3C4; &#xC778;&#xC790;&#xB97C; &#xBC1B;&#xC744; &#xC218; &#xC5C6;&#xC5B4; &#xC720;&#xC5F0;&#xC131;&#xC774; &#xBD80;&#xC871;&#xD558;&#xB2E4;. &#xAD8C;&#xD55C;&#xB9C8;&#xB2E4; &#xB9E4;&#xBC88; Guard&#xB97C; &#xB9CC;&#xB4E4; &#xC218;&#xB294; &#xC5C6;&#xB2E4;.</li></ul><pre><code class="language-java">@Target({ElementType.METHOD})  
@Retention(RetentionPolicy.RUNTIME)  
public @interface UseGuards {  
  
	Class[] value();  
	String[] args();
}

@UseGuards(value = {JwtGuard.class, RoleGuard.class}, args = {null, &quot;ADMIN&quot;})
</code></pre><ul><li>&#xADF8;&#xB807;&#xB2E4;&#xACE0;, &#xC704;&#xC640; &#xAC19;&#xC774; args&#xB97C; &#xC21C;&#xC11C;&#xB300;&#xB85C; &#xB9E4;&#xD551;&#xD558;&#xB294; &#xB290;&#xB08C;&#xC73C;&#xB85C; &#xC0AC;&#xC6A9;&#xD558;&#xB294; &#xAC83;&#xB3C4; &#xBC14;&#xB78C;&#xC9C1;&#xD558;&#xC9C0; &#xC54A;&#xB2E4;. &#xB610;&#xD55C; &#xC5EC;&#xB7EC; &#xC778;&#xC790;&#xB97C; &#xD55C; Guard&#xC5D0; &#xC804;&#xB2EC;&#xD560; &#xC218;&#xB3C4; &#xC5C6;&#xB2E4;.</li><li>&#xB530;&#xB77C;&#xC11C;, &#xAC01; <code>AuthGuard</code>&#xB294; &#xD574;&#xB2F9; &#xD074;&#xB798;&#xC2A4;&#xC640; &#xC778;&#xC790;&#xB97C; &#xC804;&#xB2EC;&#xD558;&#xB294; <code>@Guard</code> &#xB97C; &#xD1B5;&#xD574;&#xC11C; &#xC0AC;&#xC6A9;&#xD558;&#xB3C4;&#xB85D; &#xD588;&#xB2E4;.</li></ul><pre><code class="language-java">@Target({ElementType.METHOD})  
@Retention(RetentionPolicy.RUNTIME)  
public @interface Guard {  

	Class value();  
	  
	String[] args() default {};  
}
</code></pre><ul><li>&#xC774;&#xB97C; &#xD1B5;&#xD574;&#xC11C; <code>Guard</code> &#xB294; &#xAC01;&#xAC01;&#xC758; &#xC778;&#xC790;&#xB97C; &#xBC1B;&#xC544;&#xC62C; &#xC218; &#xC788;&#xAC8C; &#xB418;&#xC5C8;&#xB2E4;.</li><li>&#xB610;&#xD55C;, &#xC5EC;&#xB7EC;&#xAC1C;&#xC758; <code>Guard</code>&#xB97C; &#xC21C;&#xCC28;&#xC801;&#xC73C;&#xB85C; &#xC2E4;&#xD589;&#xD558;&#xB294; &#xAC83;&#xB3C4; &#xD544;&#xC694;&#xD558;&#xAE30;&#xC5D0; <code>@UseGuards</code> &#xB294; &#xB2E4;&#xC74C;&#xACFC; &#xAC19;&#xC774; &#xACE0;&#xCCE4;&#xB2E4;.</li></ul><pre><code class="language-java">/**  
* UseGuards  
*/  
@Target({ElementType.METHOD})  
@Retention(RetentionPolicy.RUNTIME)  
public @interface UseGuards {  
  
	Guard[] value();  
}

@GetMapping(&quot;/{id}&quot;)  
@UseGuards({  
	@Guard(JwtGuard.class),  
	@Guard(value = RoleGuard.class, args = {&quot;ADMIN&quot;})  
})  
public ResponseEntity&lt;UserResDto&gt; getById(){...}
</code></pre><ul><li>&#xB2E4;&#xC18C; &#xBCF5;&#xC7A1;&#xD558;&#xAE30;&#xB294; &#xD558;&#xB098;, &#xD544;&#xC694;&#xD55C; &#xC694;&#xC18C;&#xB4E4;&#xC744; &#xBAA8;&#xB450; &#xD45C;&#xD604;&#xD560; &#xC218; &#xC788;&#xB2E4;. &#xB2E4;&#xB9CC;, String&#xC744; &#xD1B5;&#xD574;&#xC11C;&#xB9CC; &#xC778;&#xC790;&#xB97C; &#xBC1B;&#xC544;&#xC62C; &#xC218; &#xC788;&#xAE30; &#xB54C;&#xBB38;&#xC5D0; &#xC544;&#xC26C;&#xC6B4; &#xBA74;&#xC774; &#xC788;&#xB2E4;.<ul><li><code>UserRole.ADMIN</code> &#xACFC; &#xAC19;&#xC774; &#xC124;&#xC815;&#xD55C;&#xB2E4;&#xBA74; &#xB354;&#xC6B1; &#xD3B8;&#xB9AC;&#xD560; &#xAC83;&#xC774;&#xB2E4;. &#xD558;&#xC9C0;&#xB9CC;, annotation&#xC5D0;&#xC11C; Enum&#xC758; &#xACBD;&#xC6B0; &#xD2B9;&#xC815;&#xD574;&#xC57C;&#xB9CC; &#xC0AC;&#xC6A9; &#xAC00;&#xB2A5;&#xD558;&#xC5EC;, &#xB2E4;&#xC591;&#xD55C; &#xD615;&#xD0DC;&#xB97C; &#xBC1B;&#xC544;&#xC57C;&#xD558;&#xB294; &#xD604;&#xC7AC;&#xB85C;&#xC11C;&#xB294; &#xC5B4;&#xCA54; &#xC218; &#xC5C6;&#xC5C8;&#xB2E4;.</li></ul></li></ul><h2 id="spring-security-%EC%99%80%EC%9D%98-%EB%B9%84%EA%B5%90">Spring Security &#xC640;&#xC758; &#xBE44;&#xAD50;</h2><p>&#xC9C1;&#xC811; &#xAD6C;&#xD604; &#xC774;&#xC804;&#xC5D0;&#xB294;, Spring security &#xC758; &#xC608;&#xC2DC;&#xB9CC; &#xC54C;&#xACE0; &#xC788;&#xAE30; &#xB54C;&#xBB38;&#xC5D0; &#xC9C1;&#xC811; &#xAC1C;&#xBC1C;&#xD55C; &#xD615;&#xD0DC;&#xC758; &#xBC29;&#xC2DD;&#xC740; &#xC5B4;&#xB5A4; &#xC7A5;&#xC810;&#xACFC; &#xB2E8;&#xC810;&#xC744; &#xAC00;&#xC9C8; &#xC9C0;&#xC5D0; &#xB300;&#xD574;&#xC11C; &#xBA85;&#xD655;&#xD558;&#xAC8C; &#xC815;&#xC758;&#xB97C; &#xB0B4;&#xB9AC;&#xAE30; &#xC5B4;&#xB824;&#xC6E0;&#xB2E4;. &#xC9C1;&#xC811; &#xAD6C;&#xD604; &#xC774;&#xD6C4; Spring security &#xC758; &#xC801;&#xC6A9;&#xC5D0; &#xBE44;&#xD574;&#xC11C; &#xAC00;&#xC9C8; &#xC218; &#xC788;&#xB294; &#xC7A5;&#xB2E8;&#xC810;&#xC744; &#xAC04;&#xB7B5;&#xD558;&#xAC8C; &#xC0DD;&#xAC01;&#xD574;&#xBCF4;&#xC558;&#xB2E4;.</p><h3 id="%EC%9E%A5%EC%A0%90">&#xC7A5;&#xC810;</h3><ul><li>&#xC0C1;&#xB300;&#xC801;&#xC73C;&#xB85C; &#xC27D;&#xB2E4;.<ul><li>&#xC774;&#xB294; &#xC790;&#xCCB4;&#xC801;&#xC73C;&#xB85C; &#xAD6C;&#xC870;&#xAC00; &#xB2E8;&#xC21C;&#xD558;&#xAE30; &#xB54C;&#xBB38;&#xC774;&#xB2E4;. Spring security &#xC758; &#xACBD;&#xC6B0; &#xB2E4;&#xC591;&#xD55C; &#xBCF4;&#xC548; &#xAD00;&#xB828; &#xAE30;&#xB2A5;&#xC744; &#xC9C0;&#xC6D0;&#xD574;&#xC57C;&#xD558;&#xACE0;, &#xC774;&#xB85C; &#xC778;&#xD574;&#xC11C; &#xC5B4;&#xCA54; &#xC218; &#xC5C6;&#xC774; &#xBCF5;&#xC7A1;&#xD55C; &#xAD6C;&#xC870;&#xB97C; &#xAC00;&#xC838;&#xC57C;&#xD55C;&#xB2E4;. (&#xC2E4;&#xC81C;&#xB85C; &#xC0AC;&#xC6A9;&#xC790;&#xAC00; &#xC0AC;&#xC6A9;&#xD558;&#xC9C0; &#xC54A;&#xB294; &#xAE30;&#xB2A5;&#xB4E4; &#xAE4C;&#xC9C0; &#xB2F4;&#xC544;&#xC57C;&#xD558;&#xBBC0;&#xB85C;...) &#xBC18;&#xBA74;, &#xD574;&#xB2F9; PassportJava &#xC758; &#xACBD;&#xC6B0; Controller method&#xC758; &#xC2E4;&#xD589; &#xC774;&#xC804; intercept &#xD558;&#xC5EC; &#xC2E4;&#xD589;&#xD560; &#xB0B4;&#xC6A9;&#xC744; &#xC815;&#xC758;&#xD558;&#xB294; &#xAC83;&#xC744; &#xC9C0;&#xC6D0;&#xD558;&#xB294; &#xAC83; &#xBFD0;&#xC774;&#xB2E4;. &#xAD6C;&#xC870;&#xC801;&#xC73C;&#xB85C; &#xB2E8;&#xC21C;&#xD558;&#xB2C8;, &#xC26C;&#xC6B8; &#xC218; &#xBC16;&#xC5D0; &#xC5C6;&#xB2E4;.</li><li>&#xB610;&#xD55C;, &#xAC1C;&#xBC1C;&#xC790;&#xAC00; &#xC9C1;&#xC811; &#xD574;&#xB2F9; &#xAE30;&#xB2A5;&#xC5D0; &#xB300;&#xD55C; &#xC791;&#xB3D9;&#xC744; &#xC815;&#xC758;&#xD558;&#xAE30; &#xB54C;&#xBB38;&#xC5D0; &#xC0C1;&#xB300;&#xC801;&#xC73C;&#xB85C; &#xADF8; &#xCF54;&#xB4DC;&#xB97C; &#xC791;&#xC131;&#xD55C; &#xAC1C;&#xBC1C;&#xC790;&#xC5D0;&#xAC8C; &#xC788;&#xC5B4;&#xC11C;&#xB294; &#xC774;&#xD574;&#xAC00; &#xC26C;&#xC6B8; &#xAC83;&#xC774;&#xB2E4;. &#xADF8;&#xB7EC;&#xB098;, &#xD300; &#xB2E8;&#xC704;&#xB85C; &#xAC1C;&#xBC1C;&#xD558;&#xB294; &#xD658;&#xACBD;&#xC744; &#xACE0;&#xB824;&#xD558;&#xBA74; &#xC815;&#xD615;&#xD654;&#xB418;&#xC5B4; &#xC788;&#xB294; &#xD615;&#xD0DC;&#xB85C; &#xC791;&#xC131;&#xD574;&#xC57C;&#xD558;&#xB294; &#xC0DD;&#xD0DC;&#xACC4; (Spring security)&#xAC00; &#xC624;&#xD788;&#xB824; &#xCF54;&#xB4DC;&#xC640; &#xAD6C;&#xC870;&#xB97C; &#xC774;&#xD574;&#xD558;&#xB294; &#xCE21;&#xBA74;&#xC5D0;&#xC11C;&#xB294; &#xB098;&#xC744; &#xAC83; &#xAC19;&#xB2E4;.</li></ul></li><li>&#xC9C1;&#xC811; &#xC81C;&#xC5B4; &#xAC00;&#xB2A5;&#xD558;&#xB2E4;.<ul><li>Spring security &#xC640; &#xAC19;&#xC740; &#xD615;&#xD0DC;&#xC758; &#xC774;&#xBBF8; &#xC8FC;&#xC5B4;&#xC9C4; &#xD504;&#xB808;&#xC784;&#xC6CC;&#xD06C;&#xC5D0;&#xC11C;&#xB294; &#xC5B4;&#xCA54; &#xC218; &#xC5C6;&#xC774;, &#xC81C;&#xD55C;&#xB41C; &#xD658;&#xACBD;&#xC5D0;&#xC11C; &#xD574;&#xB2F9; &#xAD6C;&#xC870;&#xC5D0; &#xC54C;&#xB9DE;&#xAC8C; &#xCF54;&#xB4DC;&#xB97C; &#xC791;&#xC131;&#xD574;&#xC57C;&#xD55C;&#xB2E4;. &#xBB3C;&#xB860; &#xC5B4;&#xB290;&#xC815;&#xB3C4; &#xC720;&#xC5F0;&#xD558;&#xAC8C; &#xC791;&#xC131;&#xD560; &#xC218;&#xB294; &#xC788;&#xACA0;&#xC73C;&#xB098;, &#xD504;&#xB808;&#xC784;&#xC6CC;&#xD06C;&#xAC00; &#xC81C;&#xACF5;&#xD558;&#xB294; &#xC2DC;&#xC810; &#xC544;&#xB798;&#xC5D0;&#xC11C; &#xCF54;&#xB4DC;&#xAC00; &#xC791;&#xC131;&#xB418;&#xC5B4;&#xC57C;&#xD558;&#xBA70; &#xB514;&#xD14C;&#xC77C;&#xD55C; &#xC870;&#xC815;&#xC740; &#xBD88;&#xAC00;&#xD558;&#xB2E4;.</li><li>&#xBC18;&#xBA74;, &#xC774;&#xB807;&#xAC8C; &#xC9C1;&#xC811; &#xC791;&#xC131;&#xD558;&#xB294; &#xACBD;&#xC6B0; &#xAC1C;&#xBC1C;&#xC790;&#xAC00; &#xC6D0;&#xD558;&#xB294; &#xBC29;&#xC2DD;&#xC73C;&#xB85C; &#xBAA8;&#xB450; &#xC81C;&#xC5B4;&#xD560; &#xC218; &#xC788;&#xB2E4;. &quot;&#xBD88;&#xB9CC;&#xC774; &#xC788;&#xC73C;&#xBA74; &#xC9C1;&#xC811; &#xB6F0;&#xB358;&#xAC00;&quot; &#xC758; &#xC608;&#xC2DC;...? &#xACB0;&#xAD6D;&#xC5D0;&#xB294; Spring Security &#xAC00; &#xB4F1;&#xC7A5;&#xD558;&#xAE30; &#xC774;&#xC804;&#xC5D0;&#xB294; &#xC5B4;&#xCA54; &#xC218; &#xC5C6;&#xC774; &#xC774;&#xB807;&#xAC8C; &#xCF54;&#xB4DC;&#xB97C; &#xC791;&#xC131;&#xD574;&#xC57C;&#xD55C; &#xD588;&#xC744; &#xAC83;&#xC774;&#xB2E4;.</li></ul></li></ul><h3 id="%EB%8B%A8%EC%A0%90">&#xB2E8;&#xC810;</h3><ul><li>&#xB2E4;&#xC591;&#xD55C; &#xAE30;&#xB2A5; &#xC9C0;&#xC6D0;&#xC758; &#xBD80;&#xC7AC;<ul><li>&quot;&#xC27D;&#xB2E4;/&#xB2E8;&#xC21C;&#xD558;&#xB2E4;&quot; &#xC5D0;&#xC11C; &#xBE44;&#xB86F;&#xB418;&#xB294; &#xC5B4;&#xCA54; &#xC218; &#xC5C6;&#xB294; &#xB2E8;&#xC810;&#xC774;&#xB2E4;.  &#xD544;&#xC694;&#xD55C; &#xAE30;&#xB2A5;&#xC774; &#xC788;&#xC744; &#xACBD;&#xC6B0; &#xAC1C;&#xBC1C;&#xC790;&#xAC00; &#xC9C1;&#xC811; &#xC9C0;&#xC6D0;&#xD558;&#xB3C4;&#xB85D; &#xB9CC;&#xB4E4;&#xC5B4;&#xC57C;&#xD55C;&#xB2E4;. &#xC2DC;&#xAC04;&#xC801;&#xC778; &#xCE21;&#xBA74;&#xC5D0;&#xC11C; &#xBB38;&#xC81C;&#xAC00; &#xC788;&#xB2E4;.</li></ul></li><li>&#xC548;&#xC815;&#xC131;<ul><li>&#xAC70;&#xB300;&#xD558;&#xACE0; &#xC548;&#xC815;&#xB41C; &#xCEE4;&#xBBA4;&#xB2C8;&#xD2F0;&#xC5D0;&#xC11C; &#xB9CC;&#xB4E4;&#xC5B4;&#xC9C4; &#xD504;&#xB808;&#xC784;&#xC6CC;&#xD06C;&#xB97C; &#xC0AC;&#xC6A9;&#xD558;&#xB294; &#xAC83;&#xC5D0; &#xBE44;&#xD558;&#xBA74; &#xC548;&#xC815;&#xC131;&#xC5D0;&#xC11C; &#xD655;&#xC2E4;&#xD558;&#xC9C0; &#xC54A;&#xB2E4;. &#xC774;&#xB294; &#xC774;&#xB7EC;&#xD55C; &#xD615;&#xD0DC;&#xC758; &#xC2DC;&#xC2A4;&#xD15C;&#xC744; &#xB9CC;&#xB4DC;&#xB294; &#xC0AC;&#xB78C;&#xC5D0; &#xB530;&#xB77C; &#xB2E4;&#xB974;&#xACA0;&#xC73C;&#xB098;,  &#xC544;&#xBB34;&#xB798;&#xB3C4; Spring Security &#xC5D0; &#xBE44;&#xD558;&#xBA74; &#xBD80;&#xC871;&#xD568;&#xC740; &#xC0AC;&#xC2E4;&#xC774;&#xB2E4;.</li></ul></li><li>(&#xB0B4; &#xAD6C;&#xC870;&#xC758; &#xACBD;&#xC6B0;) &#xC5EC;&#xC804;&#xD788; Spring&#xC5D0; &#xC758;&#xC874;&#xD55C;&#xB2E4;.<ul><li>Spring bean &#xC774; &#xB418;&#xC5B4; &#xD574;&#xB2F9;&#xD558;&#xB294; <code>AuthGuard</code>&#xB97C; &#xCC3E;&#xC544;&#xB0B4;&#xACE0;, &#xC801;&#xD569;&#xD55C; <code>Strategy</code>&#xB97C; &#xC8FC;&#xC785;&#xD55C;&#xB2E4;. &#xC774;&#xB85C; &#xC778;&#xD574; Spring &#xC73C;&#xB85C;&#xBD80;&#xD130; &#xB3C5;&#xB9BD;&#xB41C; &#xD328;&#xD0A4;&#xC9C0;&#xAC00; &#xC544;&#xB2C8;&#xB2E4;. &#xB2E4;&#xB978; Java &#xC758; Framework &#xC5D0; &#xC801;&#xC6A9;&#xD560; &#xC218; &#xC5C6;&#xB2E4;.</li></ul></li><li>&#xACB0;&#xAD6D;&#xC5D0;&#xB294; Spring Security &#xD615;&#xD0DC;&#xB97C; &#xB530;&#xB77C;&#xAC08; &#xC218; &#xBC16;&#xC5D0; &#xC5C6;&#xB2E4;.<ul><li>&#xC774;&#xBC88;&#xC5D0; PassportJava&#xB97C; &#xB9CC;&#xB4E4;&#xC5B4;&#xB0B4;&#xBA74;&#xC11C;, Spring security &#xC758; &#xB4F1;&#xC7A5;&#xC5D0; &#xB300;&#xD574;&#xC11C; &#xC0DD;&#xAC01;&#xD574;&#xBCF4;&#xC558;&#xB2E4;. </li></ul></li><ul><ul><li>Spring Security &#xC774;&#xC804;&#xC5D0;&#xB294; Spring scope &#xB0B4;&#xC5D0;&#xC11C; &#xCC98;&#xB9AC;&#xD558;&#xAE30; &#xC704;&#xD574;&#xC11C;&#xB294; PassportJava &#xC640; &#xAC19;&#xC740; &#xD615;&#xD0DC;&#xB85C; &#xC81C;&#xC791;&#xC744; &#xD574;&#xC57C;&#xB9CC; &#xD588;&#xC744; &#xAC83;&#xC774;&#xB2E4;.</li><li>&#xD639;&#xC740;, Spring Security &#xC640; &#xB9C8;&#xCC2C;&#xAC00;&#xC9C0;&#xB85C; Servlet &#xC5D0; &#xC9C1;&#xC811; &#xC811;&#xADFC;&#xD558;&#xC5EC; Filter &#xB97C; &#xC0AC;&#xC6A9;&#xD558;&#xB294; &#xD615;&#xC2DD;&#xC744; &#xCDE8;&#xD560; &#xAC83;&#xC774;&#xB2E4;. &#xC774;&#xB7F0; &#xD615;&#xD0DC;&#xC758; &#xCD5C;&#xC885; &#xCD94;&#xC0C1;&#xD654;&#xAC00; &#xBC14;&#xB85C; Spring Security &#xD615;&#xD0DC;&#xC774;&#xB2E4;.</li></ul><li>&#xAC1C;&#xBC1C;&#xC790;&#xAC00; &#xC6D0;&#xD558;&#xB294; &#xD615;&#xD0DC;&#xC758; &#xC0AC;&#xC6A9;&#xC790; &#xC778;&#xC99D; Process &#xB294; &#xACB0;&#xAD6D; &#xBE44;&#xC2B7;&#xD558;&#xB2E4;. &#xB2E4;&#xC591;&#xD55C; &#xD615;&#xD0DC;&#xC758; &#xC778;&#xC99D; &#xD504;&#xB85C;&#xC138;&#xC2A4;&#xB97C; &#xBC94;&#xC6A9;&#xC801;&#xC73C;&#xB85C; &#xC9C0;&#xC6D0;&#xD558;&#xAE30; &#xC704;&#xD55C; &#xACE0;&#xBBFC;&#xC744; Spring security &#xC5D0;&#xC11C; &#xB098;&#xB984;&#xC758; &#xC815;&#xB2F5;&#xC744; &#xB0B4;&#xB193;&#xC740; &#xC148;&#xC774;&#xB2E4;. &#xB354; &#xB098;&#xC740; &#xD504;&#xB85C;&#xC138;&#xC2A4;&#xAC00; &#xC874;&#xC7AC;&#xD560; &#xC218;&#xB3C4; &#xC788;&#xC9C0;&#xB9CC;, &#xACB0;&#xAD6D;&#xC5D0;&#xB294; &#xC720;&#xC0AC;&#xD55C; &#xD615;&#xD0DC;&#xC758; &#xACB0;&#xACFC;&#xAC00; &#xB9CC;&#xB4E4;&#xC5B4;&#xC9C0;&#xACE4;&#xD55C;&#xB2E4;.</li><li>&#xD2B9;&#xBCC4;&#xD788; &#xB354; &#xB098;&#xC740; &#xD615;&#xD0DC;&#xC758; &#xAD6C;&#xC870;&#xC758; &#xBC1C;&#xC0C1;&#xC774; &#xC788;&#xC9C0; &#xC54A;&#xB2E4;&#xBA74;, &#xB204;&#xAD6C;&#xB098; &#xC811;&#xADFC;&#xD560; &#xC218; &#xC788;&#xC73C;&#xBA70;, &#xC0AC;&#xC6A9;&#xBC95;&#xACFC; &#xAD6C;&#xC870;&#xC5D0; &#xB300;&#xD574; &#xC774;&#xD574;&#xAC00; &#xC788;&#xB294; Spring Security &#xB97C; &#xC801;&#xC6A9;&#xD558;&#xB294; &#xAC83;&#xC774; &#xC0DD;&#xC0B0;&#xC131; &#xCE21;&#xBA74;&#xC5D0;&#xC11C; &#xB354; &#xC720;&#xB9AC;&#xD558;&#xB9AC;&#xB77C; &#xC0DD;&#xAC01;&#xD55C;&#xB2E4;.</li></ul></ul><p></p><h3 id="%ED%85%8C%EC%8A%A4%ED%8A%B8%EC%97%90%EC%84%9C%EC%9D%98-%EB%AC%B8%EC%A0%9C">&#xD14C;&#xC2A4;&#xD2B8;&#xC5D0;&#xC11C;&#xC758; &#xBB38;&#xC81C;</h3><ul><li>&#xD574;&#xB2F9; &#xB77C;&#xC774;&#xBE0C;&#xB7EC;&#xB9AC;&#xB294; AspectJ &#xB97C; &#xD65C;&#xC6A9;&#xD574;&#xC11C; Method&#xAC00; &#xC2E4;&#xD589;&#xB418;&#xAE30; &#xC774;&#xC804; intercept &#xD558;&#xC5EC; &#xC2E4;&#xD589;&#xD55C;&#xB2E4;.</li><li>&#xC774;&#xB294; Controller &#xC601;&#xC5ED;&#xC758; &#xD14C;&#xC2A4;&#xD2B8;&#xC5D0;&#xC11C; &#xBB38;&#xC81C;&#xAC00; &#xBC1C;&#xC0DD;&#xD55C;&#xB2E4;. Test &#xB97C; &#xC704;&#xD55C; &#xC9C0;&#xC6D0;&#xC774;  &#xD3EC;&#xD568;&#xB418;&#xC5B4;&#xC788;&#xB294; Spring Security &#xC640; &#xB2EC;&#xB9AC;, &#xD574;&#xB2F9; &#xB77C;&#xC774;&#xBE0C;&#xB7EC;&#xB9AC;&#xB294; Test &#xB97C; &#xD560; &#xB54C; Intercept &#xD558;&#xACE0;, argument &#xB97C; &#xC8FC;&#xC785;&#xD558;&#xB294; &#xC601;&#xC5ED;&#xC5D0; &#xB300;&#xD574; &#xAC1C;&#xBCC4;&#xC801;&#xC73C;&#xB85C; mocking&#xC744; &#xD558;&#xAC70;&#xB098; &#xD558;&#xB294; &#xBC29;&#xC2DD;&#xC73C;&#xB85C; &#xCC98;&#xB9AC;&#xB97C; &#xD574;&#xC57C;&#xD55C;&#xB2E4;.</li></ul><pre><code class="language-Java">@Test
void something() {
  // &#xC774;&#xB7F0; &#xBC29;&#xC2DD;&#xC73C;&#xB85C; Strategy &#xC758; &#xB3D9;&#xC791;&#xACFC; Resolver &#xC758; &#xB3D9;&#xC791;&#xC744; &#xAD6C;&#xC131;&#xD574;&#xC57C;&#xD568;...
  BDDMockito.doNothing().when(jwtStrategy).check(any(HttpServletRequest.class));
      BDDMockito.given(userIdArgumentResolver.supportsParameter(any())).willReturn(true);
      BDDMockito.given(userIdArgumentResolver.resolveArgument(any(), any(), any(), any()))
}</code></pre><p></p>]]></content:encoded></item><item><title><![CDATA[Ghost 블로그 이전 과정 기록]]></title><description><![CDATA[Tistory에서 Ghost 로 블로그를 옮겼다. 그 삽질에 대한 과정]]></description><link>https://life.photogrammer.me/blog-migration-to-ghost/</link><guid isPermaLink="false">65bfc6f1d63b920001591174</guid><category><![CDATA[Blog]]></category><category><![CDATA[Daily]]></category><category><![CDATA[Server]]></category><dc:creator><![CDATA[Sungjun Park]]></dc:creator><pubDate>Tue, 06 Feb 2024 12:35:00 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1501504905252-473c47e087f8?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDE3fHxibG9nfGVufDB8fHx8MTcwNzIwNTg0NXww&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" medium="image"/><content:encoded><![CDATA[<h2 id="%EC%98%AE%EA%B8%B0%EA%B2%8C-%EB%90%9C-%EC%8A%A4%ED%86%A0%EB%A6%AC">&#xC62E;&#xAE30;&#xAC8C; &#xB41C; &#xC2A4;&#xD1A0;&#xB9AC;...</h2><img src="https://images.unsplash.com/photo-1501504905252-473c47e087f8?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDE3fHxibG9nfGVufDB8fHx8MTcwNzIwNTg0NXww&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" alt="Ghost &#xBE14;&#xB85C;&#xADF8; &#xC774;&#xC804; &#xACFC;&#xC815; &#xAE30;&#xB85D;"><p>&#xAF64; &#xC5B4;&#xB9B0; &#xC2DC;&#xC808;&#xBD80;&#xD130; &#xBE14;&#xB85C;&#xADF8;&#xB97C; &#xD588;&#xC5C8;&#xB2E4;. &#xD587;&#xC218;&#xB85C; &#xCE58;&#xBA74; 15&#xB144; &#xC815;&#xB3C4; &#xB418;&#xB294; &#xAC83; &#xAC19;&#xC740;&#xB370;, &#xC57D; 3~5&#xB144; &#xC815;&#xB3C4;&#xC758; &#xC8FC;&#xAE30;&#xB85C; &#xC774;&#xBC88;&#xCC98;&#xB7FC; &#xC0C8;&#xB85C;&#xC6B4; &#xD50C;&#xB7AB;&#xD3FC;&#xC5D0;&#xC11C; &#xC0C8;&#xB85C;&#xC6B4; &#xC2DC;&#xC791;&#xC744; &#xD558;&#xACE4; &#xD55C;&#xB2E4;. &#xC774;&#xC804; &#xBE14;&#xB85C;&#xADF8;&#xB294; &#xD2F0;&#xC2A4;&#xD1A0;&#xB9AC;&#xC5D0;&#xC11C; <a href="https://photogrammers.tistory.com">https://photogrammers.tistory.com</a> &#xC73C;&#xB85C; &#xC6B4;&#xC601;&#xD558;&#xACE0; &#xC788;&#xC5C8;&#xACE0;, &#xAC1C;&#xBC1C;&#xC790;&#xC758; &#xAE38;&#xB85C; &#xC811;&#xC5B4;&#xB4E0; &#xB54C;&#xC5D0; &#xC2DC;&#xC791;&#xC744; &#xD588;&#xB358; &#xBE14;&#xB85C;&#xADF8;&#xC774;&#xB2E4;.</p><p>&#xD2F0;&#xC2A4;&#xD1A0;&#xB9AC; &#xBE14;&#xB85C;&#xADF8;&#xB294; &#xD070; &#xBAA9;&#xC801;&#xC131;&#xC744; &#xB450;&#xACE0; &#xB9CC;&#xB4E0; &#xBE14;&#xB85C;&#xADF8;&#xBCF4;&#xB2E4;&#xB294; &#xBC30;&#xC6B4; &#xB0B4;&#xC6A9;&#xB4E4;&#xC744; &#xAE30;&#xB85D;&#xD558;&#xB294; &#xC6A9;&#xB3C4;&#xB85C; &#xD65C;&#xC6A9;&#xD588;&#xC5C8;&#xACE0;, &#xBE14;&#xB85C;&#xADF8; &#xB0B4;&#xC5D0; &#xC758;&#xBBF8;&#xAC00; &#xC5C6;&#xB294; &#xB0B4;&#xC6A9;&#xC758; &#xAE00; (&#xCF54;&#xD14C; &#xBB38;&#xC81C; &#xD480;&#xC774;, &#xAC04;&#xB7B5;&#xD55C; &#xD68C;&#xACE0; &#xB4F1;)&#xC774; &#xB9CE;&#xC558;&#xB2E4;. &#xC54C;&#xCC2C; &#xB0B4;&#xC6A9;&#xC758; &#xAE00;&#xB4E4;&#xC744; &#xC8FC;&#xB85C; &#xC2E3;&#xACE0; &#xC2F6;&#xC5C8;&#xB294;&#xB370; &#xBAA9;&#xC801;&#xC774; &#xC11E;&#xC774;&#xB2E4;&#xBCF4;&#xB2C8; &#xAE00; &#xD3EC;&#xC2A4;&#xD305;&#xC774; &#xC880; &#xC560;&#xB9E4;&#xD574;&#xC84C;&#xB2E4;. &#xB54C;&#xBB38;&#xC5D0; &#xC8FC;&#xB85C; &#xC2E0;&#xACBD;&#xC368;&#xC11C; &#xC4F4; &#xAE00;&#xB4E4;&#xC740; Notion &#xC744; &#xD1B5;&#xD574;&#xC11C; &#xC791;&#xC131;&#xD558;&#xACE0; &#xD314;&#xB9CC;&#xCF54;&#xB529;&#xACBD;&#xC744; &#xD1B5;&#xD574;&#xC11C; &#xC62C;&#xB838;&#xB294;&#xB370;, &#xC774;&#xAC8C; &#xB0B4; &#xBE14;&#xB85C;&#xADF8;&#xB85C;&#xC758; &#xC720;&#xC785;&#xC740; &#xC904;&#xC774;&#xACE0; &#xADF8; &#xCABD;&#xC73C;&#xB85C;&#xC758; &#xC720;&#xC785;&#xB9CC; &#xC62C;&#xB9AC;&#xB294; &#xAF34;&#xC774;&#xB77C;&#xC11C; &#xC774;&#xAC83;&#xB300;&#xB85C; &#xACE0;&#xBBFC;&#xC774;&#xC5C8;&#xB2E4;.</p><p>&#xD2F0;&#xC2A4;&#xD1A0;&#xB9AC; &#xC790;&#xCCB4;&#xB3C4; &#xC0AC;&#xC2E4; &#xB9D8;&#xC5D0; &#xB4E4;&#xC9C0;&#xB294; &#xC54A;&#xC558;&#xB2E4;.  &#xB178;&#xC158;&#xC744; &#xC0AC;&#xC6A9;&#xD558;&#xACE0;&#xBD80;&#xD130; &#xB9C8;&#xD06C;&#xB2E4;&#xC6B4;&#xC73C;&#xB85C; &#xC8FC;&#xB85C; &#xAE00;&#xC744; &#xC791;&#xC131;&#xD588;&#xB294;&#xB370; &#xD2F0;&#xC2A4;&#xD1A0;&#xB9AC;&#xC5D0;&#xC11C;&#xB294; &#xC774;&#xAC8C; &#xC0C1;&#xB2F9;&#xD788; &#xBD88;&#xD3B8;&#xD588;&#xB2E4;. &#xC801;&#xB2F9;&#xD788; &#xC2A4;&#xD0A8; &#xAC08;&#xC544; &#xB07C;&#xC6CC;&#xBCF4;&#xACE0; &#xC774;&#xB798;&#xC800;&#xB798; &#xD574;&#xBD10;&#xB3C4; &#xC5D0;&#xB514;&#xD130;&#xC758; &#xADFC;&#xBCF8;&#xC801;&#xC778; &#xD2B9;&#xC131;&#xC0C1; &#xD574;&#xACB0;&#xD560; &#xC218;&#xB294; &#xC5C6;&#xC5C8;&#xB2E4;.</p><p>&#xB610;&#xD55C; &#xD2F0;&#xC2A4;&#xD1A0;&#xB9AC;&#xC5D0; 2&#xCC28; &#xB3C4;&#xBA54;&#xC778;&#xC744; &#xBD99;&#xC774;&#xACE0; &#xC774;&#xC804; &#xD3EC;&#xC2A4;&#xD305;&#xACFC; &#xD604;&#xC7AC; &#xD3EC;&#xC2A4;&#xD305;&#xC774; &#xAD6C;&#xAE00; &#xC5D4;&#xC9C4;&#xC5D0;&#xC11C; &#xACB9;&#xCE58;&#xB294; &#xBC14;&#xB78C;&#xC5D0; &#xAD6C;&#xAE00; &#xAC80;&#xC0C9;&#xC5D0;&#xC11C; &#xC644;&#xC804;&#xD788; &#xB9DD;&#xD574;&#xBC84;&#xB838;&#xACE0;, &#xC0AC;&#xC2E4;&#xC0C1; &#xB9DD;&#xD55C; &#xBE14;&#xB85C;&#xADF8;&#xAC00; &#xB418;&#xC5B4;&#xBC84;&#xB838;&#xB2E4;. &#x3160;&#x3160;.. </p><p>&#xADF8;&#xB7EC;&#xB358; &#xC640;&#xC911; &#xD2F0;&#xC2A4;&#xD1A0;&#xB9AC;&#xC5D0;&#xC11C; &#xD574;&#xB2F9; &#xBE14;&#xB85C;&#xADF8;&#xAC00; &#xC57D;&#xAD00; &#xC704;&#xBC18;&#xC73C;&#xB85C; &#xC778;&#xD574; &#xCC28;&#xB2E8;&#xAE4C;&#xC9C0; &#xB2F9;&#xD588;&#xB2E4;. 2&#xCC28; &#xB3C4;&#xBA54;&#xC778;&#xC73C;&#xB85C; &#xAC15;&#xC81C; &#xB9AC;&#xB2E4;&#xC774;&#xB809;&#xD2B8;&#xB97C; &#xC2DC;&#xD0A4;&#xB294; &#xC2A4;&#xD06C;&#xB9BD;&#xD2B8;&#xAC00; &#xD2F0;&#xC2A4;&#xD1A0;&#xB9AC; &#xC57D;&#xAD00; &#xC704;&#xBC18;&#xC774;&#xC5C8;&#xACE0; (&#xD574;&#xB3C4; &#xB418;&#xB294;&#xC904; &#xC54C;&#xC558;&#xC9C0;...) &#xBE14;&#xB85C;&#xADF8; &#xAE00;&#xC870;&#xCC28; &#xC870;&#xD68C;&#xB97C; &#xD560; &#xC218; &#xC5C6;&#xAC8C; &#xB418;&#xC5B4;&#xBC84;&#xB824; &#xADF8;&#xB0E5; &#xAE30;&#xD68C;&#xB2E4; &#xC2F6;&#xC5B4;&#xC11C; &#xC140;&#xD504; &#xD638;&#xC2A4;&#xD305;&#xC744; &#xD558;&#xB294; &#xBC29;&#xD5A5;&#xC73C;&#xB85C; CMS &#xB97C; &#xCC3E;&#xC544;&#xBCF4;&#xAC8C; &#xB418;&#xC5C8;&#xB2E4;.</p><h2 id="cms-%EC%84%A0%EC%A0%95%ED%95%98%EA%B8%B0">CMS &#xC120;&#xC815;&#xD558;&#xAE30;</h2><p>velog, medium &#xC744; &#xC0AC;&#xC6A9;&#xD558;&#xAC70;&#xB098; &#xC544;&#xB2C8;&#xBA74; github.io &#xB97C; &#xD1B5;&#xD55C; &#xBE14;&#xB85C;&#xADF8;&#xB97C; &#xB9CC;&#xB4DC;&#xB294; &#xAC83;&#xC744; &#xCC98;&#xC74C;&#xC5D0; &#xACE0;&#xB824;&#xD588;&#xB2E4;. velog, medium&#xC758; &#xACBD;&#xC6B0; &#xCDA9;&#xBD84;&#xD788; &#xAE54;&#xB054;&#xD558;&#xAE30;&#xB294; &#xD558;&#xB098; &quot;&#xB0B4; &#xBE14;&#xB85C;&#xADF8;&quot; &#xB97C; &#xB9CC;&#xB4DC;&#xB294; &#xAC1C;&#xB150;&#xC774;&#xB77C;&#xAE30; &#xBCF4;&#xB2E4;&#xB294; &#xD574;&#xB2F9; &#xD50C;&#xB7AB;&#xD3FC;&#xC5D0; &#xAE00;&#xC744; &#xAE30;&#xACE0;&#xD558;&#xB294; &#xB290;&#xB08C;&#xC774;&#xAE30;&#xC5D0; &#xC790;&#xC720;&#xB3C4; &#xBA74;&#xC5D0;&#xC11C; &#xBD80;&#xC871;&#xD588;&#xB2E4;. &#xBC18;&#xBA74;, &#xAE43;&#xD5C8;&#xBE0C; &#xBE14;&#xB85C;&#xADF8;&#xC758; &#xACBD;&#xC6B0;&#xC5D0;&#xB294; &#xC790;&#xC720;&#xB3C4;&#xAC00; &#xC0C1;&#xB300;&#xC801;&#xC73C;&#xB85C; &#xB192;&#xB2E4;&#xB294; &#xC7A5;&#xC810;&#xC774; &#xC788;&#xC9C0;&#xB9CC;, &#xADF8; &#xC790;&#xC720;&#xB3C4;&#xB97C; &#xC704;&#xD574;&#xC11C; &#xC2A4;&#xC2A4;&#xB85C; &#xB9CC;&#xB4E4;&#xC5B4;&#xC57C;&#xD558;&#xB294; &#xAC83;&#xC774; &#xAF64;&#xB098; &#xB9CE;&#xB2E4;&#xB294; &#xAC83;, &#xADF8;&#xB9AC;&#xACE0; &#xC140;&#xD504; &#xD638;&#xC2A4;&#xD305;&#xC744; &#xC774;&#xBC88;&#xC5D0; &#xD574;&#xBCF4;&#xACE0; &#xC2F6;&#xC5C8;&#xB2E4;&#xB294; &#xC810;&#xC5D0;&#xC11C; &#xC81C;&#xC678;&#xD558;&#xAC8C; &#xB418;&#xC5C8;&#xB2E4;.</p><p>&#xB530;&#xB77C;&#xC11C;, &#xBAA9;&#xC801;&#xC5D0; &#xB9DE;&#xAC8C; &#xB9CC;&#xB4E4;&#xAE30; &#xC704;&#xD574;&#xC11C;&#xB294; CMS &#xB97C; &#xC0AC;&#xC6A9;&#xD574;&#xC57C;&#xD558;&#xB294;&#xB370; &#xB300;&#xD45C;&#xC801;&#xC73C;&#xB85C; Word Press &#xAC00; &#xC788;&#xC5C8;&#xACE0; &#xB610; &#xD558;&#xB098;&#xC758; &#xB300;&#xC548;&#xC73C;&#xB85C; &#xCC3E;&#xC740; &#xAC83;&#xC774; Ghost CMS &#xC600;&#xB2E4;. &#xB514;&#xC790;&#xC778;&#xB3C4; &#xAE54;&#xB054;&#xD558;&#xACE0;, &#xBB38;&#xC11C;&#xD654;&#xB3C4; &#xC798; &#xB418;&#xC5B4;&#xC788;&#xACE0;, &#xAE08;&#xBC29; &#xC62C;&#xB824;&#xC11C; &#xC0AC;&#xC6A9;&#xD558;&#xAE30;&#xB3C4; &#xD3B8;&#xD558;&#xACE0;.. &#xC5EC;&#xB7EC;&#xBAA8;&#xB85C; &#xB9C8;&#xC74C;&#xC5D0; &#xB4E4;&#xC5B4;&#xC11C; Ghost &#xB97C; &#xCC44;&#xD0DD;&#xD588;&#xB2E4;. (&#xADF8;&#xB0E5; &#xC660;&#xC9C0; &#xB04C;&#xB838;&#xB2E4;.)</p><h2 id="ghost-%EC%98%AC%EB%A6%AC%EA%B8%B0">Ghost &#xC62C;&#xB9AC;&#xAE30;</h2><p>Ghost&#xB97C; &#xC62C;&#xB9AC;&#xB294; &#xACFC;&#xC815;&#xC740; &#xADF8;&#xB2E5; &#xC5B4;&#xB835;&#xC9C0; &#xC54A;&#xB2E4;. &#xB098;&#xB294; &#xC560;&#xCD08;&#xBD80;&#xD130; Ghost &#xB97C; Docker &#xB97C; &#xD1B5;&#xD574;&#xC11C; &#xD638;&#xC2A4;&#xD305;&#xD558;&#xACE0;&#xC790; &#xD588;&#xAE30; &#xB54C;&#xBB38;&#xC5D0; &#xADF8;&#xB0E5; compose &#xD30C;&#xC77C; &#xD558;&#xB098; &#xAD6C;&#xC131;&#xD558;&#xACE0;, &#xBCFC;&#xB968;&#xC815;&#xB3C4; &#xC7A1;&#xC544;&#xC900; &#xB4A4; &#xC62C;&#xB9AC;&#xBA74; &#xB05D;&#xC774;&#xB2E4;. </p><p>&#xB2E4;&#xB9CC;, &#xC544;&#xBB34;&#xB798;&#xB3C4; &#xBE14;&#xB85C;&#xADF8;&#xB2E4;&#xBCF4;&#xB2C8; &#xD56D;&#xC0C1; &#xC11C;&#xBC84;&#xAC00; &#xCF1C;&#xC838;&#xC788;&#xC5B4;&#xC57C;&#xD558;&#xACE0; &#xC804;&#xB825;&#xC744; &#xB35C;&#xBA39;&#xB294; ZBOX nano&#xC5D0; &#xACE0;&#xC2A4;&#xD2B8;&#xB97C; &#xC62C;&#xB824;&#xB450;&#xC5C8;&#xB294;&#xB370; &#xC774;&#xB85C; &#xC778;&#xD574;&#xC11C; &#xBE14;&#xB85C;&#xADF8;&#xAC00; &#xC0C1;&#xB2F9;&#xD788; &#xB290;&#xB9B0; &#xBB38;&#xC81C;&#xAC00; &#xC788;&#xC5B4; &#xC544;&#xB798; &#xAE00;&#xB4E4;&#xACFC; &#xAC19;&#xC740; &#xC0BD;&#xC9C8;&#xC744; &#xD574;&#xC57C;&#xD588;&#xB2E4;. &#xD639;&#xC2DC;&#xB098; Ghost &#xB97C; &#xC140;&#xD504;&#xD638;&#xC2A4;&#xD305; &#xD55C;&#xB2E4;&#xBA74; &#xB108;&#xBB34; &#xC800;&#xC0AC;&#xC591;&#xC73C;&#xB85C;&#xB294; &#xAE30;&#xB300;&#xD558;&#xC9C0; &#xB9D0;&#xAE38;..</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://life.photogrammer.me/why-my-blog-is-slow-1/"><div class="kg-bookmark-content"><div class="kg-bookmark-title">&#xB0B4; Ghost blog&#xB294; &#xC65C; &#xB290;&#xB9B4;&#xAE4C;? - (1)</div><div class="kg-bookmark-description">Ghost &#xBE14;&#xB85C;&#xADF8;&#xB85C; &#xC62E;&#xAE30;&#xACE0; &#xC774;&#xC0C1;&#xD55C; &#xBB38;&#xC81C;&#xB97C; &#xBC1C;&#xACAC;&#xD588;&#xB2E4;. &#xBE14;&#xB85C;&#xADF8;&#xAC00; &#xB108;&#xBB34; &#xB290;&#xB9AC;&#xB2E4;&#xB294; &#xAC83;. &#xB0B4; &#xBE14;&#xB85C;&#xADF8;&#xB294; &#xB300;&#xCCB4; &#xC65C; &#xB290;&#xB9B0;&#xAC78;&#xAE4C;? &#xD558;&#xB098; &#xD558;&#xB098; &#xC9DA;&#xC5B4;&#xAC00;&#xBA70; &#xD574;&#xACB0;&#xD558;&#xB294; &#xACFC;&#xC815;&#xC744; &#xAE30;&#xB85D;&#xD574;&#xBCF4;&#xC558;&#xB2E4;. &#xBB38;&#xC81C; &#xC0C1;&#xD669; &#xC77C;&#xB2E8; &#xC18D;&#xB3C4; &#xC800;&#xD558;&#xB97C; &#xD06C;&#xAC8C; &#xB450; &#xAC00;&#xC9C0; &#xACBD;&#xC6B0;&#xB85C; &#xB098;&#xB20C; &#xC218; &#xC788;&#xC5C8;&#xB2E4;. &#xBB38;&#xC81C;&#xC0C1;&#xD669; 1 - &#xCCAB; &#xB85C;&#xB4DC; &#xC0C1;&#xD669; &#xD2B9;&#xC815; &#xD398;&#xC774;&#xC9C0;&#xC5D0; &#xC644;&#xC804;&#xD788; &#xCCAB; &#xC811;&#xADFC;&#xD558;&#xB294; &#xACBD;&#xC6B0;&#xC5D0; &#xBB38;&#xC81C;&#xAC00; &#xBC1C;&#xC0DD;&#xD588;&#xB2E4;. &#xD55C; &#xD3EC;&#xC2A4;&#xD305; &#xD639;&#xC740;</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://life.photogrammer.me/content/images/size/w256h256/2024/02/android-chrome-512x512.png" alt="Ghost &#xBE14;&#xB85C;&#xADF8; &#xC774;&#xC804; &#xACFC;&#xC815; &#xAE30;&#xB85D;"><span class="kg-bookmark-author">Photogrammer</span><span class="kg-bookmark-publisher">Sungjun Park</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://life.photogrammer.me/content/images/2024/02/image-5-2.png" alt="Ghost &#xBE14;&#xB85C;&#xADF8; &#xC774;&#xC804; &#xACFC;&#xC815; &#xAE30;&#xB85D;"></div></a></figure><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://life.photogrammer.me/why-my-blog-is-slow-2/"><div class="kg-bookmark-content"><div class="kg-bookmark-title">&#xB0B4; Ghost blog&#xB294; &#xC65C; &#xB290;&#xB9B4;&#xAE4C;? - (2)</div><div class="kg-bookmark-description">&#xC55E;&#xC120; &#xAE00;&#xC5D0;&#xC11C; &#xB290;&#xB9B0; Ghost blog &#xC758; &#xC6D0;&#xC778;&#xC744; &#xCC3E;&#xACE0; &#xAC1C;&#xC120;(?)&#xC744; &#xD588;&#xB2E4;. &#xB0A8;&#xACA8;&#xC9C4; &#xBB38;&#xC81C;&#xB97C; &#xD574;&#xACB0;&#xD558;&#xB294; &#xACFC;&#xC815;&#xC744; &#xC0B4;&#xD3B4;&#xBCF4;&#xC790;. &#xB0A8;&#xACA8;&#xC9C4; &#xBB38;&#xC81C; &#xC11C;&#xBC84; &#xC2DC;&#xC791; &#xD6C4; &#xCCAB; &#xC811;&#xADFC;&#xC5D0;&#xC11C; 8~10 s &#xC758; &#xC2DC;&#xAC04;&#xC774; &#xC18C;&#xC694;&#xB418;&#xB294; &#xBB38;&#xC81C;&#xAC00; &#xBC1C;&#xACAC;&#xB418;&#xC5C8;&#xB2E4;. &#xADF8;&#xB7EC;&#xB098;, &#xB530;&#xB85C; &#x201D;&#xC11C;&#xBC84; &#xC2DC;&#xC791; &#xD6C4; &#xCCAB; &#xB85C;&#xB529;&#xC774; &#xC5C4;&#xCCAD; &#xB290;&#xB824;&#xC694;&#x201D; &#xB77C;&#xB294; &#xBB38;&#xC11C;&#xB97C; &#xCC3E;&#xC544;&#xBCFC; &#xC218;&#xB294; &#xC5C6;&#xC5C8;&#xB2E4;. &#xB2F5;&#xB2F5;&#xD55C; &#xB9C8;&#xC74C;&#xC5D0;, &#xC11C;&#xBC84;&#xD3EC;&#xB7FC;&#xC73C;&#xB85C; &#xAC00;&#xC11C; &#xC9C8;&#xBB38;&#xAE00;&#xC744;</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://life.photogrammer.me/content/images/size/w256h256/2024/02/android-chrome-512x512.png" alt="Ghost &#xBE14;&#xB85C;&#xADF8; &#xC774;&#xC804; &#xACFC;&#xC815; &#xAE30;&#xB85D;"><span class="kg-bookmark-author">Photogrammer</span><span class="kg-bookmark-publisher">Sungjun Park</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://images.unsplash.com/photo-1451187580459-43490279c0fa?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDEyfHxzZXJ2ZXJ8ZW58MHx8fHwxNzA2OTcyNjkxfDA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" alt="Ghost &#xBE14;&#xB85C;&#xADF8; &#xC774;&#xC804; &#xACFC;&#xC815; &#xAE30;&#xB85D;"></div></a></figure><p>&#xC560;&#xCD08;&#xC5D0; &#xAE00;&#xC744; &#xBAA8;&#xB450; &#xAC00;&#xC838;&#xC62C; &#xBAA9;&#xC801;&#xC740; &#xC5C6;&#xC5C8;&#xAE30;&#xC5D0; 2022 &#xB144; &#xC774;&#xD6C4; &#xC791;&#xC131;&#xD55C; &#xAE30;&#xC220; &#xAD00;&#xB828; &#xAE00;&#xB9CC; &#xBCC4;&#xB3C4;&#xB85C; &#xD2F0;&#xC2A4;&#xD1A0;&#xB9AC;&#xC5D0;&#xC11C; &#xAC00;&#xC838;&#xC654;&#xB2E4;. &#xC62E;&#xAE38; &#xB54C; &#xC0AC;&#xC9C4;&#xC744; &#xC9C1;&#xC811; &#xAC00;&#xC838;&#xC640;&#xC57C;&#xD55C;&#xB2E4;&#xB294; &#xC810; &#xC81C;&#xC678;&#xD558;&#xACE0;&#xB294; &#xB531;&#xD788; &#xBB38;&#xC81C;&#xAC00; &#xC788;&#xC9C0;&#xB294; &#xC54A;&#xC558;&#xB2E4;. (&#xAE00; &#xBC31;&#xC5C5;&#xB3C4; &#xB9C9;&#xD600;&#xC11C; &#xB2E4; &#xB4E4;&#xACE0;&#xC62C; &#xC218;&#xB3C4; &#xC5C6;&#xC5C8;&#xB2E4;...)</p><h2 id="%EC%9E%85%EB%A7%9B%EB%8C%80%EB%A1%9C-%EB%B0%94%EA%BE%B8%EA%B8%B0">&#xC785;&#xB9DB;&#xB300;&#xB85C; &#xBC14;&#xAFB8;&#xAE30;</h2><p>&#xB098;&#xB984; &#xC2A4;&#xC2A4;&#xB85C; &#xAC74;&#xB4DC;&#xB9B4; &#xC218; &#xC788;&#xB294; &#xBD80;&#xBD84;&#xC774; &#xAF64; &#xC788;&#xB2E4;. &#xD2F0;&#xC2A4;&#xD1A0;&#xB9AC;&#xC640; &#xAE43;&#xD5C8;&#xBE0C; &#xBE14;&#xB85C;&#xADF8; &#xC0AC;&#xC774;&#xC758; &#xC5B4;&#xB518;&#xAC00; &#xB290;&#xB08C;&#xC774;&#xB2E4;. &#xC2A4;&#xD0A8; &#xB9CC;&#xB4DC;&#xB294;&#xB370;&#xB294; &#xD070; &#xCDE8;&#xBBF8;&#xAC00; &#xC5C6;&#xAE30;&#xC5D0; &#xADF8;&#xB0E5; &#xC801;&#xB2F9;&#xD788; &#xD544;&#xC694;&#xD55C; &#xAC83;&#xB4E4;&#xB9CC; &#xB123;&#xC5B4;&#xC8FC;&#xC5C8;&#xB2E4;.</p><h3 id="%EC%B9%B4%ED%85%8C%EA%B3%A0%EB%A6%AC-%EB%A7%8C%EB%93%A4%EA%B8%B0">&#xCE74;&#xD14C;&#xACE0;&#xB9AC;(?) &#xB9CC;&#xB4E4;&#xAE30;</h3><p>Ghost &#xC5D0;&#xC11C;&#xB294; &#xB530;&#xB85C; &#xCE74;&#xD14C;&#xACE0;&#xB9AC; &#xAE30;&#xB2A5;&#xC774; &#xC5C6;&#xB2E4;! &#xB300;&#xC2E0; &#xD0DC;&#xADF8;&#xB97C; &#xC0AC;&#xC6A9;&#xD55C;&#xB2E4;. &#xB0B4; &#xBE14;&#xB85C;&#xADF8; &#xC0C1;&#xB2E8;&#xC5D0; &quot;&#xC11C;&#xBC84; &#xAC1C;&#xBC1C; &#xC77C;&#xC0C1;&quot; &#xC774;&#xB7F0; &#xAC83;&#xB4E4;&#xB3C4; &#xADF8;&#xB0E5; &#xD0DC;&#xADF8; &#xBAA8;&#xC544;&#xBCF4;&#xAE30;&#xC77C; &#xBFD0;&#xC774;&#xB2E4;. &#xD2F0;&#xC2A4;&#xD1A0;&#xB9AC;&#xC758; &#xACBD;&#xC6B0; &#xACC4;&#xCE35;&#xD654;&#xB418;&#xC5B4;&#xC788;&#xC5B4;&#xC11C; &#xD3B8;&#xB9AC;&#xD588;&#xB294;&#xB370; &#xC870;&#xAE08; &#xC544;&#xC27D;&#xAE34; &#xD558;&#xB2E4;. &#xB2E4;&#xB9CC;, &#xC624;&#xD788;&#xB824; &#xD0DC;&#xADF8;&#xB85C; &#xBD84;&#xB958;&#xD558;&#xB2C8; &#xD648;&#xC11C;&#xBC84; - &#xAC1C;&#xBC1C; &#xACFC; &#xAC19;&#xC774; &#xACB9;&#xCE58;&#xB294; &#xC694;&#xC18C;&#xB4E4;&#xC744; &#xB3D9;&#xC2DC;&#xC5D0; &#xAC01;&#xAC01;&#xC5D0; &#xB458; &#xC218; &#xC788;&#xC5B4;&#xC11C; &#xD3B8;&#xD558;&#xAE30;&#xB3C4; &#xD558;&#xB2E4;.</p><p>&#xC544;&#xBB34;&#xD2BC;, Admin&#xC5D0;&#xC11C; &#xD0DC;&#xADF8; &#xC0DD;&#xC131;&#xD558;&#xACE0; Navigation &#xC5D0;&#xC11C; /tag/{tag_name} &#xC73C;&#xB85C; &#xCD94;&#xAC00;&#xD558;&#xC5EC;  &#xB124;&#xC774;&#xAC8C;&#xC774;&#xC158; &#xBC14; &#xC704;&#xC758; &#xCE74;&#xD14C;&#xACE0;&#xB9AC; &#xB290;&#xB08C;&#xC73C;&#xB85C; &#xC0B4;&#xB9B4; &#xC218; &#xC788;&#xB2E4;.</p><p>About &#xD398;&#xC774;&#xC9C0;&#xC758; &#xACBD;&#xC6B0; &quot;Post&quot;&#xAC00; &#xC544;&#xB2C8;&#xB77C; &quot;Page&quot; &#xB97C; &#xC0AC;&#xC6A9;&#xD588;&#xB2E4;. Post&#xB294; &#xC77C;&#xBC18;&#xC801;&#xC778; article &#xB290;&#xB08C;&#xC774;&#xBA70; feed &#xC5D0; &#xB4F1;&#xB85D;&#xC774; &#xB41C;&#xB2E4;. &#xBC18;&#xBA74; page &#xB294; post &#xC758; &#xC77C;&#xC885;&#xC774;&#xB098;, feed &#xC5D0; &#xB4F1;&#xB85D;&#xC774; &#xB418;&#xC9C0; &#xC54A;&#xACE0;, &#xC9C1;&#xC811; &#xB9C1;&#xD06C;&#xB97C; &#xAC78;&#xC5B4;&#xC11C; &#xB4E4;&#xC5B4;&#xAC08; &#xC218; &#xC788;&#xB2E4;. &#xADF8;&#xB798;&#xC11C; about &#xB3C4; &#xB531;&#xD788; &#xD53C;&#xB4DC;&#xC5D0; &#xB4F1;&#xB85D;&#xB420; &#xD544;&#xC694;&#xB3C4; &#xC5C6;&#xACE0; &#xB3C5;&#xB9BD;&#xC801;&#xC778; &#xD558;&#xB098;&#xC758; &#xD398;&#xC774;&#xC9C0;&#xB77C;&#xACE0; &#xC0DD;&#xAC01;&#xD558;&#xC5EC; &#xC774;&#xB97C; &#xC801;&#xC6A9;&#xD588;&#xB2E4;.</p><h3 id="%EA%B8%B0%EB%B3%B8%EC%9C%BC%EB%A1%9C-%EC%B6%94%EA%B0%80-%ED%95%A0-%EB%A7%8C%ED%95%9C-%EA%B8%B0%EB%8A%A5">&#xAE30;&#xBCF8;&#xC73C;&#xB85C; &#xCD94;&#xAC00; &#xD560; &#xB9CC;&#xD55C; &#xAE30;&#xB2A5;</h3><p>Ghost &#xBE14;&#xB85C;&#xADF8;&#xC5D0;&#xC11C; &#xD544;&#xC694;&#xD558;&#xC9C0;&#xB9CC; &#xC5C6;&#xB294; &#xAE30;&#xB2A5;&#xB4E4;&#xC740; &#xC694; &#xC815;&#xB3C4;&#xAC00; &#xC788;&#xB2E4;.</p><ul><li>&#xCF54;&#xB4DC; &#xBB38;&#xBC95; &#xAC15;&#xC870;</li><li>&#xB313;&#xAE00; (&#xBA64;&#xBC84; &#xB4F1;&#xB85D;&#xD574;&#xC57C;&#xC9C0; &#xC4F8; &#xC218; &#xC788;&#xC74C;)</li><li>&#xBAA9;&#xCC28;</li></ul><p>&#xAC01;&#xAC01; &#xB2E4;&#xC74C;&#xACFC; &#xAC19;&#xC774; &#xD574;&#xACB0;&#xD588;&#xB2E4;.  &#xC544;&#xB798; &#xB9C1;&#xD06C;&#xB3C4; &#xAC19;&#xC774; &#xCCA8;&#xBD80;&#xD574;&#xB480;&#xB2E4;.</p><ul><li><strong>prism syntax highlight</strong><ul><li>&apos;```&apos; &#xC73C;&#xB85C; &#xB9CC;&#xB4DC;&#xB294; &#xCF54;&#xB4DC; &#xBE14;&#xB7ED;&#xC5D0; &#xB300;&#xD574;&#xC11C; &#xBB38;&#xBC95; &#xAC15;&#xC870;</li><li>Code injection &#xC5D0;&#xC11C; &#xC2A4;&#xD06C;&#xB9BD;&#xD2B8; &#xCD94;&#xAC00;</li></ul></li></ul><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://www.lesstif.com/javascript/ghost-cms-prism-js-syntax-hightlight-125305547.html"><div class="kg-bookmark-content"><div class="kg-bookmark-title">ghost cms &#xC5D0; prism js &#xB85C; &#xAD6C;&#xBB38; &#xAC15;&#xC870;(syntax hightlight) &#xD558;&#xAE30;</div><div class="kg-bookmark-description"></div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://www.lesstif.com/download/attachments/33489356/JS?version=1&amp;amp;modificationDate=1491125725000&amp;amp;api=v2" alt="Ghost &#xBE14;&#xB85C;&#xADF8; &#xC774;&#xC804; &#xACFC;&#xC815; &#xAE30;&#xB85D;"><span class="kg-bookmark-author">&#xAE30;&#xB85D;&#xC740; &#xAE30;&#xC5B5;&#xC744; &#xC9C0;&#xBC30;&#xD55C;&#xB2E4;.</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://www.lesstif.com/javascript/files/125305547/125305563/1/1634966021000/image2021-10-23_14-13-39.png" alt="Ghost &#xBE14;&#xB85C;&#xADF8; &#xC774;&#xC804; &#xACFC;&#xC815; &#xAE30;&#xB85D;"></div></a></figure><ul><li><strong>giscus</strong><ul><li>github discussion &#xC744; &#xD1B5;&#xD574;&#xC11C; &#xB313;&#xAE00;&#xC744; &#xB2EC; &#xC218; &#xC788;&#xC74C;.</li><li>hbs &#xD30C;&#xC77C; &#xC218;&#xC815;</li></ul></li></ul><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://giscus.app/ko"><div class="kg-bookmark-content"><div class="kg-bookmark-title">giscus</div><div class="kg-bookmark-description">A comments widget built on GitHub Discussions.</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://giscus.app/apple-touch-icon.png" alt="Ghost &#xBE14;&#xB85C;&#xADF8; &#xC774;&#xC804; &#xACFC;&#xC815; &#xAE30;&#xB85D;"><span class="kg-bookmark-publisher">giscus</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://opengraph.githubassets.com/4f866d5b634e7cd5422af77f8dbfb6d48dd288b7c5c18326544c1973210320ed/giscus/giscus" alt="Ghost &#xBE14;&#xB85C;&#xADF8; &#xC774;&#xC804; &#xACFC;&#xC815; &#xAE30;&#xB85D;"></div></a></figure><ul><li><strong>tocbot</strong><ul><li>&#xAE30;&#xBCF8;&#xC73C;&#xB85C; &#xC81C;&#xACF5;&#xD558;&#xC9C0; &#xC54A;&#xB294; &#xBAA9;&#xCC28; &#xC0DD;&#xC131;</li><li>Code injection + hbs &#xD30C;&#xC77C; &#xC218;&#xC815;</li></ul></li></ul><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://www.dingran.me/o/add-toc-to-ghost-without-editing-template/"><div class="kg-bookmark-content"><div class="kg-bookmark-title">How to add a table of contents in Ghost without editing the site template</div><div class="kg-bookmark-description">How to add a table of contents in Ghost without editing the site template</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://www.dingran.me/content/images/size/w256h256/2022/04/ran_hs_bw_square.png" alt="Ghost &#xBE14;&#xB85C;&#xADF8; &#xC774;&#xC804; &#xACFC;&#xC815; &#xAE30;&#xB85D;"><span class="kg-bookmark-author">Ran Ding</span><span class="kg-bookmark-publisher">Ran Ding</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://images.unsplash.com/photo-1472289065668-ce650ac443d2?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDQzfHx0YWJsZSUyMG9mJTIwY29udGVudHxlbnwwfHx8fDE2ODM4MTc2OTZ8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000content/images/size/w1200" alt="Ghost &#xBE14;&#xB85C;&#xADF8; &#xC774;&#xC804; &#xACFC;&#xC815; &#xAE30;&#xB85D;"></div></a></figure><h3 id="%EB%B3%84%EB%8F%84%EB%A1%9C-%EC%9A%B4%EC%98%81%EA%B3%BC-%EA%B4%80%EB%A0%A8%ED%95%98%EC%97%AC-%EC%B6%94%EA%B0%80%ED%95%A0-%EA%B2%83%EB%93%A4">&#xBCC4;&#xB3C4;&#xB85C; &#xC6B4;&#xC601;&#xACFC; &#xAD00;&#xB828;&#xD558;&#xC5EC; &#xCD94;&#xAC00;&#xD560; &#xAC83;&#xB4E4;...</h3><ul><li>Search console &#xB3D9;&#xB85D;<ul><li>&#xAD6C;&#xAE00; &#xAC80;&#xC0C9;&#xC5D4;&#xC9C4;&#xC5D0; &#xAE01;&#xD600;&#xC57C;&#xD558;&#xB2C8;&#xAE4C; &#xBBF8;&#xB9AC;&#xBBF8;&#xB9AC; &#xCD94;&#xAC00;&#xB97C; &#xD574;&#xB480;&#xB2E4;.</li></ul></li><li>Google analytics &#xB4F1;&#xB85D;<ul><li>Pro &#xBC84;&#xC804;&#xC5D0;&#xC11C;&#xB294; &#xAD00;&#xB828; &#xD1B5;&#xACC4; &#xC815;&#xBCF4;&#xB97C; &#xC81C;&#xACF5;&#xD558;&#xB294; &#xAC83;&#xC73C;&#xB85C; &#xC54C;&#xACE0;&#xC788;&#xB2E4;. &#xADF8;&#xB7EC;&#xB098; &#xC9C1;&#xC811; &#xD638;&#xC2A4;&#xD305;&#xD558;&#xB294; &#xACBD;&#xC6B0;&#xC5D0;&#xB294; &#xD544;&#xC694;&#xD558;&#xB2E4;.</li></ul></li><li>Ghost SMTP &#xC774;&#xBA54;&#xC77C; &#xBC1C;&#xC1A1; &#xC124;&#xC815;<ul><li>&#xC124;&#xC815; &#xC548;&#xD574;&#xB450;&#xBA74; &#xB098;&#xC911;&#xC5D0; &#xC5B4;&#xB4DC;&#xBBFC; &#xACC4;&#xC815; &#xC783;&#xC5B4;&#xBC84;&#xB9AC;&#xBA74; &#xACE8;&#xCE58;&#xC544;&#xD30C;&#xC9C4;&#xB2E4;. &#xAE30;&#xBCF8;&#xC73C;&#xB85C;&#xB294; mailgun &#xC774;&#xB77C;&#xB294; &#xCE5C;&#xAD6C;&#xB97C; &#xC0AC;&#xC6A9;&#xD558;&#xB77C;&#xACE0; &#xD558;&#xB294;&#xB370;, &#xC774;&#xB294; &#xB274;&#xC2A4;&#xB808;&#xD130;&#xAC19;&#xC740; &#xAC83;&#xB4E4;&#xC744; &#xBCF4;&#xB0BC; &#xB54C; &#xBAA9;&#xC801;&#xC131;&#xC774; &#xD06C;&#xB2E4;. &#xADF8;&#xB0E5; gmail &#xD1B5;&#xD574;&#xC11C; &#xBCF4;&#xB0B4;&#xBA74; &#xB41C;&#xB2E4;.</li></ul></li></ul><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://blog.wsgvet.com/ghost-google-smtp-mail-setting/"><div class="kg-bookmark-content"><div class="kg-bookmark-title">ghost&#xC5D0; &#xAD6C;&#xAE00; SMTP &#xC124;&#xC815;&#xD558;&#xAE30;</div><div class="kg-bookmark-description">ghost &#xD3F4;&#xB354;&#xC5D0; &#xC788;&#xB294; config.production.json &#xC704; &#xD30C;&#xC77C;&#xC744; &#xC218;&#xC815;&#xD574;&#xC57C; &#xD569;&#xB2C8;&#xB2E4;. 16&#xBC88;&#xC9F8; &#xC904;&#xC744;&#x2026;</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://blog.wsgvet.com/icons/icon-192x192.png?v=a0664d466c7b910ed068b334db2796f8" alt="Ghost &#xBE14;&#xB85C;&#xADF8; &#xC774;&#xC804; &#xACFC;&#xC815; &#xAE30;&#xB85D;"><span class="kg-bookmark-author">Woosung</span><span class="kg-bookmark-publisher">Woosung</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://blog.wsgvet.com/static/dc9f327b0ba8495f3f2d2500bc96bd9a/a8483/gmail-cover-r.jpg" alt="Ghost &#xBE14;&#xB85C;&#xADF8; &#xC774;&#xC804; &#xACFC;&#xC815; &#xAE30;&#xB85D;"></div></a></figure><h3 id="%EC%9D%B4%EB%AF%B8%EC%A7%80-%EC%B5%9C%EC%A0%81%ED%99%94%EB%A5%BC-%EC%9C%84%ED%95%9C-%EC%9D%B4%EB%AF%B8%EC%A7%80-%ED%8F%AC%EB%A9%A7-%EC%84%A4%EC%A0%95">&#xC774;&#xBBF8;&#xC9C0; &#xCD5C;&#xC801;&#xD654;&#xB97C; &#xC704;&#xD55C; &#xC774;&#xBBF8;&#xC9C0; &#xD3EC;&#xBA67; &#xC124;&#xC815;</h3><p>Ghost &#xC758; &#xACBD;&#xC6B0; &#xC790;&#xCCB4;&#xC801;&#xC73C;&#xB85C; &#xC774;&#xBBF8;&#xC9C0; &#xCD5C;&#xC801;&#xD654; &#xAE30;&#xB2A5;&#xB3C4; &#xC81C;&#xACF5;&#xD55C;&#xB2E4;. &#xB0B4;&#xBD80; &#xCF54;&#xC5B4;&#xC5D0;&#xC11C; &#xC790;&#xCCB4;&#xC801;&#xC73C;&#xB85C; &#xD074;&#xB77C;&#xC774;&#xC5B8;&#xD2B8;&#xC758; &#xD658;&#xACBD;&#xC5D0; &#xB530;&#xB77C; &#xB354; &#xC791;&#xC740; &#xC0AC;&#xC9C4;&#xC744; &#xC81C;&#xACF5;&#xD55C;&#xB2E4;. (&#xBAA8;&#xBC14;&#xC77C;&#xC5D0;&#xC11C;&#xB294; w400, &#xB370;&#xC2A4;&#xD06C;&#xD0D1;&#xC5D0;&#xC11C;&#xB294; w2000&#xC73C;&#xB85C;...) &#xC5EC;&#xAE30;&#xAE4C;&#xC9C0;&#xB294; &#xB300;&#xBD80;&#xBD84; &#xAE30;&#xBCF8;&#xC73C;&#xB85C; &#xC124;&#xC815;&#xC774; &#xAC00;&#xB2A5;&#xD558;&#xB2E4;. &#xB2E4;&#xB9CC;, &#xD574;&#xB2F9; &#xAE30;&#xB2A5;&#xC774; &#xCF1C;&#xC838;&#xC788;&#xC73C;&#xBA74; &#xC11C;&#xBC84;&#xC5D0;&#xC11C; &#xAC19;&#xC740; &#xC774;&#xBBF8;&#xC9C0;&#xB97C; &#xC5EC;&#xB7EC; &#xC0AC;&#xC774;&#xC988;&#xB85C; &#xB9CC;&#xB4E4;&#xC5B4; &#xB0B4;&#xBD80; &#xB514;&#xC2A4;&#xD06C; &#xC6A9;&#xB7C9;&#xC744; &#xB354; &#xC0AC;&#xC6A9;&#xD55C;&#xB2E4;.</p><p>&#xADF8;&#xB9AC;&#xACE0; Ghost 5.7&#xC5D0;&#xC11C; &#xB9CC;&#xB4E4;&#xC5B4;&#xC9C4; &#xAE30;&#xB2A5;&#xC774; &#xC788;&#xB294;&#xB370;, avif, webp &#xC640; &#xAC19;&#xC740; &#xD3EC;&#xBA67;&#xC73C;&#xB85C; &#xBCF4;&#xB0BC; &#xC218; &#xC788;&#xB2E4;&#xBA74; &#xD574;&#xB2F9; &#xD3EC;&#xBA67;&#xC758; &#xC0AC;&#xC9C4;&#xC73C;&#xB85C; &#xBCF4;&#xB0B4;&#xC8FC;&#xB294; &#xAE30;&#xB2A5;&#xC774;&#xB2E4;. </p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://forum.ghost.org/t/updated-img-url-helper-convert-image-formats-automatically/31760"><div class="kg-bookmark-content"><div class="kg-bookmark-title">Updated img_url helper: convert image formats automatically</div><div class="kg-bookmark-description">In Ghost 5.7.0, we updated the functionality of the img_url helper: it now can convert image formats automatically! This update is perfect for theme developers who are serious about performance &#x1F3CE; Why it&#x2019;s important Images are the heaviest part of your website. The new helper automatically converts an image from PNG, GIF, or JPEG to WebP, which reduces its size by ~25% without any visible loss of quality. Using the new helper will make your website faster, positively impact SEO, and&#x2026;</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://global.discourse-cdn.com/business4/uploads/ghost2/optimized/2X/f/f381b3b952df5ad42fe691a8b14aa7f0c96c461a_2_180x180.png" alt="Ghost &#xBE14;&#xB85C;&#xADF8; &#xC774;&#xC804; &#xACFC;&#xC815; &#xAE30;&#xB85D;"><span class="kg-bookmark-author">Ghost Forum</span><span class="kg-bookmark-publisher">RyanF</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://global.discourse-cdn.com/business4/uploads/ghost2/original/2X/8/8d4e1be1543b3ed506f105953a0d062b84797e42.png" alt="Ghost &#xBE14;&#xB85C;&#xADF8; &#xC774;&#xC804; &#xACFC;&#xC815; &#xAE30;&#xB85D;"></div></a></figure><p>&#xC774; &#xAE30;&#xB2A5;&#xC744; &#xC0AC;&#xC6A9;&#xD558;&#xBA74; &#xCEE4;&#xBC84; &#xC774;&#xBBF8;&#xC9C0; / &#xD3EC;&#xC2A4;&#xD305; &#xCE74;&#xB4DC; &#xC774;&#xBBF8;&#xC9C0;&#xB4F1; &#xC790;&#xC8FC; &#xB178;&#xCD9C;&#xB418;&#xB294; &#xC774;&#xBBF8;&#xC9C0;&#xC5D0; &#xB300;&#xD574;&#xC11C; &#xC791;&#xC740; &#xC0AC;&#xC774;&#xC988;&#xB85C; &#xD074;&#xB77C;&#xC774;&#xC5B8;&#xD2B8;&#xC5D0;&#xAC8C; &#xC804;&#xC1A1;&#xD560; &#xC218; &#xC788;&#xB2E4;. &#xC2E4;&#xC81C;&#xB85C; &#xC774;&#xB97C; &#xD1B5;&#xD574; 75kb &#xC758; &#xD30C;&#xC77C;&#xC744; 2kb &#xAE4C;&#xC9C0; &#xC904;&#xC5EC;&#xC11C; &#xBCF4;&#xB0BC; &#xC218; &#xC788;&#xC5C8;&#xB2E4;. </p><p>(&#xC801;&#xC6A9;&#xD558;&#xB290;&#xB77C; &#xAF64; &#xC0BD;&#xC9C8;&#xC744; &#xD588;&#xB294;&#xB370; <code>&lt;picture&gt;</code> &#xD0DC;&#xADF8; &#xC548;&#xCABD;&#xC5D0; <code>&lt;source&gt; &lt;img&gt;</code> &#xB97C; &#xAC19;&#xC774; &#xC0AC;&#xC6A9;&#xD588;&#xC5B4;&#xC57C;&#xD588;&#xB2E4;. HTML &#xC54C;&#xBABB;... )</p><p>&#xB0B4; &#xAE00;&#xC5D0;&#xB294; &#xB2E4;&#xC774;&#xC5B4;&#xADF8;&#xB7A8;&#xC744; excaildraw &#xB97C; &#xD1B5;&#xD574;&#xC11C; png &#xB85C; &#xBCF5;&#xC0AC;&#xD574;&#xC11C; &#xC624;&#xAC70;&#xB098;, &#xB9E5;&#xC758; &#xCEA1;&#xCCD0; &#xAE30;&#xB2A5;&#xC744; &#xD1B5;&#xD574;&#xC11C; &#xB123;&#xB294; &#xACBD;&#xC6B0;&#xAC00; &#xAF64; &#xC788;&#xB294;&#xB370;, &#xC774;&#xB807;&#xAC8C; &#xB123;&#xC740; &#xD30C;&#xC77C;&#xC774; &#xB108;&#xBB34; &#xD06C;&#xAE30;&#xC5D0; &#xAE00; &#xC790;&#xCCB4;&#xC758; &#xC0AC;&#xC774;&#xC988;&#xAC00; &#xCEE4;&#xC9C0;&#xB294; &#xBB38;&#xC81C;&#xAC00; &#xC788;&#xC5C8;&#xB2E4;. &#xADF8;&#xB798;&#xC11C; &#xD574;&#xB2F9; &#xAE30;&#xB2A5;&#xC744; &#xAE00; &#xC548;&#xC5D0; &#xC788;&#xB294; &#xC774;&#xBBF8;&#xC9C0;&#xC5D0;&#xB3C4; &#xC801;&#xC6A9;&#xC774; &#xAC00;&#xB2A5;&#xD55C;&#xC9C0; &#xC774;&#xB798;&#xC800;&#xB798; &#xC0BD;&#xC9C8;&#xC744; &#xD574;&#xBD24;&#xB294;&#xB370; &#xACB0;&#xAD6D; &#xC2E4;&#xD328;&#xD588;&#xB2E4;. &#xD3EC;&#xB7FC;&#xC5D0;&#xB3C4; &#xB2E4;&#xC74C;&#xACFC; &#xAC19;&#xC774; &#xBB3C;&#xC5B4;&#xBD24;&#xB294;&#xB370; &#xC548;&#xB41C;&#xB2E8;&#xB2E4;. (&#xC5D0;&#xB514;&#xD130; &#xC790;&#xCCB4;&#xC5D0;&#xC11C; &#xB9CC;&#xB4DC;&#xB294;&#xAC70;&#xB77C; &#xC5B4;&#xCA54; &#xC218;&#xAC00; &#xC5C6;&#xB2E4;. &#xADF8;&#xB0E5; &#xC790;&#xCCB4;&#xC801;&#xC73C;&#xB85C; &#xC0AC;&#xC774;&#xC988;&#xC5D0; &#xB530;&#xB77C; &#xC8FC;&#xB294;&#xAC70;&#xC5D0; &#xB9CC;&#xC871;&#xD558;&#xC790;..)</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://forum.ghost.org/t/is-it-possible-to-format-via-img-url-for-images-included-in-content-added-via-editor/44740"><div class="kg-bookmark-content"><div class="kg-bookmark-title">Is it possible to format via img_url for images included in content added via Editor?</div><div class="kg-bookmark-description">I&#x2019;m looking at that feature and trying to change the image format to serve it to the user. I modified the img_url that exists in the hbs file of the theme as suggested in the guide, and in that case, it is being sent to the user as an avif file or webp file as normal. However, it doesn&#x2019;t seem to work for images added via the editor (both snippet and pasting images from the editor). I have not been able to find any relevant information or code on this either. How is it possible to send webp&#x2026;</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://global.discourse-cdn.com/business4/uploads/ghost2/optimized/2X/f/f381b3b952df5ad42fe691a8b14aa7f0c96c461a_2_180x180.png" alt="Ghost &#xBE14;&#xB85C;&#xADF8; &#xC774;&#xC804; &#xACFC;&#xC815; &#xAE30;&#xB85D;"><span class="kg-bookmark-author">Ghost Forum</span><span class="kg-bookmark-publisher">JuneParkCode</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://global.discourse-cdn.com/business4/uploads/ghost2/original/2X/8/8d4e1be1543b3ed506f105953a0d062b84797e42.png" alt="Ghost &#xBE14;&#xB85C;&#xADF8; &#xC774;&#xC804; &#xACFC;&#xC815; &#xAE30;&#xB85D;"></div></a></figure><h2 id="%ED%95%B4%EA%B2%B0-%EC%A4%91%EC%9D%B8-%EB%AC%B8%EC%A0%9C">&#xD574;&#xACB0; &#xC911;&#xC778; &#xBB38;&#xC81C;</h2><p>&#xACE0;&#xC2A4;&#xD2B8; &#xBE14;&#xB85C;&#xADF8; &#xC4F0;&#xBA74;&#xC11C; &#xB2E4; &#xC88B;&#xC740;&#xB370; &#xC9C0;&#xAE08; &#xD558;&#xB098; &#xB9D8;&#xC5D0; &#xC548;&#xB4DC;&#xB294; &#xAC83;&#xC774; &#xC788;&#xB2E4;. &#xD06C;&#xB85C;&#xBBF8;&#xC6C0; &#xACC4;&#xC5F4;&#xC5D0;&#xC11C; &#xC791;&#xC131;&#xD55C; &#xAE00;&#xC744;  Safari&#xC5D0;&#xC11C; &#xC77D;&#xC73C;&#xBA74; &#xC885;&#xC885; &#xC774;&#xC0C1;&#xD55C; &#xBB38;&#xC790;&#xAC00; &#xBCF4;&#xC778;&#xB2E4;. &#xC774;&#xB798;&#xC800;&#xB798; &#xD14C;&#xC2A4;&#xD2B8;&#xB97C; &#xD574;&#xBD10;&#xB3C4; &#xB3C4;&#xC800;&#xD788; &#xBB38;&#xC81C;&#xAC00; &#xBB34;&#xC5C7;&#xC778;&#xC9C0; &#xBAA8;&#xB974;&#xACA0;&#xC5B4;&#xC11C; &#xC77C;&#xB2E8; &#xD3EC;&#xB7FC;&#xC5D0; &#xBC84;&#xADF8; &#xC774;&#xC288; &#xB4F1;&#xB85D;&#xB9CC; &#xD574;&#xB480;&#xB2E4;. (&#xD639;&#xC2DC; &#xD574;&#xACB0;&#xBC29;&#xC548; &#xC54C;&#xBA74; &#xC54C;&#xB824;&#xC8FC;&#xC138;&#xC694;...)</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://forum.ghost.org/t/unknown-characters-are-visible-only-when-using-safari-browser-korean-input/44762"><div class="kg-bookmark-content"><div class="kg-bookmark-title">Unknown characters are visible only when using Safari browser + Korean input</div><div class="kg-bookmark-description">Unknown characters are visible only when using Safari browser + Korean input. This only happens when a post containing Korean characters is created in the editor and viewed through Safari browser on Chromium-based browsers. (Same on mobile devices, not visible when viewed on Chromium-based browsers.) I&#x2019;ve found a few cases through personal testing, but the problem still occurs in unknown cases. Here&#x2019;s the page I tested for my own purposes. Test with only English input (no problem) Unknown C&#x2026;</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://global.discourse-cdn.com/business4/uploads/ghost2/optimized/2X/f/f381b3b952df5ad42fe691a8b14aa7f0c96c461a_2_180x180.png" alt="Ghost &#xBE14;&#xB85C;&#xADF8; &#xC774;&#xC804; &#xACFC;&#xC815; &#xAE30;&#xB85D;"><span class="kg-bookmark-author">Ghost Forum</span><span class="kg-bookmark-publisher">JuneParkCode</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://global.discourse-cdn.com/business4/uploads/ghost2/optimized/3X/c/c/ccb6e170e2babd2da447b1ab4fa21033df23714c_2_1024x682.jpeg" alt="Ghost &#xBE14;&#xB85C;&#xADF8; &#xC774;&#xC804; &#xACFC;&#xC815; &#xAE30;&#xB85D;"></div></a></figure><h2 id="%EC%82%AC%EC%9A%A9-%ED%9B%84%EA%B8%B0">&#xC0AC;&#xC6A9; &#xD6C4;&#xAE30;</h2><p>&#xAF64; &#xAD1C;&#xCC2E;&#xC740; CMS &#xC774;&#xB2E4;. &#xCC98;&#xC74C;&#xC5D0; &#xB531; &#xB290;&#xB080; &#xC778;&#xC0C1;&#xC740; &#xAC01; &#xC774;&#xB7EC;&#xD55C; &#xBE14;&#xB85C;&#xADF8; &#xD50C;&#xB7AB;&#xD3FC;&#xC5D0;&#xC11C; &#xC88B;&#xC740; &#xAC83;&#xB4E4;&#xB9CC; &#xC798; &#xBE7C;&#xC654;&#xB2E4;&#xB294; &#xAC83;&#xC774;&#xB2E4;. &#xAD49;&#xC7A5;&#xD788; &#xBAA8;&#xB358;&#xD574;&#xC9C4; &#xD2F0;&#xC2A4;&#xD1A0;&#xB9AC;&#xB97C; &#xC9C1;&#xC811; &#xB3CC;&#xB9AC;&#xB294; &#xAC83; &#xAC19;&#xAE30;&#xB3C4; &#xD558;&#xACE0; &#xB9D0;&#xC774;&#xB2E4;. &#xB0B4; &#xACBD;&#xC6B0;&#xC5D0;&#xB294; Pro &#xBC84;&#xC804;&#xC774; &#xC544;&#xB2CC; &#xC140;&#xD504; &#xD638;&#xC2A4;&#xD305;&#xC774;&#xC9C0;&#xB9CC;, Pro &#xBC84;&#xC804;&#xC744; &#xC0AC;&#xC6A9;&#xD558;&#xB294; &#xAC83;&#xB3C4; &#xAF64; &#xB098;&#xC058;&#xC9C0; &#xC54A;&#xC744; &#xAC83; &#xAC19;&#xB2E4;.</p><p>&#xD50C;&#xB7AB;&#xD3FC; &#xC704;&#xC5D0;&#xC11C; &#xD3B8;&#xD558;&#xAC8C; &#xAC80;&#xC0C9; &#xC720;&#xC785;&#xBC1B;&#xC744; &#xC218; &#xC788;&#xB294; &#xD61C;&#xD0DD;&#xC740; &#xB0A0;&#xB77C;&#xAC14;&#xC9C0;&#xB9CC;, &#xADF8;&#xB798;&#xB3C4; &#xC9C1;&#xC811; &#xC62C;&#xB9AC;&#xACE0; &#xAD00;&#xB9AC;&#xD574;&#xBCF4;&#xB294; &#xACBD;&#xD5D8;&#xC774; &#xC7AC;&#xBC0C;&#xAE30;&#xB3C4; &#xD558;&#xACE0; &#xC885;&#xC885; &#xC18C;&#xC2A4;&#xCF54;&#xB4DC;&#xB3C4; &#xAE4C;&#xBCF4;&#xACE0; &#xD558;&#xB2E4;&#xBCF4;&#xB2C8; &#xBC30;&#xC6B0;&#xB294; &#xAC83;&#xB3C4; &#xAF64; &#xC788;&#xB2E4;. &#xB098;&#xB984; &#xAD1C;&#xCC2E;&#xC740; &#xC120;&#xD0DD;&#xC774;&#xC5C8;&#xB2E4;.</p>]]></content:encoded></item><item><title><![CDATA[InfluxDB + Grafana를 통해 Proxmox Host CPU 온도 모니터링 시각화 및 알림 구축]]></title><description><![CDATA[PVE node 상태를 모니터링해보고 온도 정보에 대해서도 받아보자.]]></description><link>https://life.photogrammer.me/influx-db-grafana-cpu-temp-monitoring/</link><guid isPermaLink="false">65c0aa4ca963e000013c17a0</guid><category><![CDATA[Server]]></category><dc:creator><![CDATA[Sungjun Park]]></dc:creator><pubDate>Mon, 05 Feb 2024 12:38:05 GMT</pubDate><media:content url="https://life.photogrammer.me/content/images/2024/02/head.webp" medium="image"/><content:encoded><![CDATA[<img src="https://life.photogrammer.me/content/images/2024/02/head.webp" alt="InfluxDB + Grafana&#xB97C; &#xD1B5;&#xD574; Proxmox Host CPU &#xC628;&#xB3C4; &#xBAA8;&#xB2C8;&#xD130;&#xB9C1; &#xC2DC;&#xAC01;&#xD654; &#xBC0F; &#xC54C;&#xB9BC; &#xAD6C;&#xCD95;"><p>Influx DB &#xC640; Grafana &#xB97C; &#xD1B5;&#xD574;&#xC11C; Proxmox &#xB97C; &#xBAA8;&#xB2C8;&#xD130;&#xB9C1; &#xD560; &#xC218; &#xC788;&#xB3C4;&#xB85D; &#xAD6C;&#xC131;&#xD588;&#xC2B5;&#xB2C8;&#xB2E4;. &#xAE30;&#xBCF8;&#xC801;&#xC73C;&#xB85C; &#xC81C;&#xACF5;&#xD558;&#xB294; &#xB370;&#xC774;&#xD130; &#xC774;&#xC678;&#xC5D0;&#xB3C4;, CPU &#xC628;&#xB3C4;&#xC5D0; &#xB300;&#xD55C; &#xD328;&#xB110;&#xC744; &#xCD94;&#xAC00;&#xD558;&#xACE0; telegram&#xC744; &#xD1B5;&#xD574; &#xC54C;&#xB9BC;&#xC744; &#xC124;&#xC815;&#xD558;&#xB294; &#xACFC;&#xC815;&#xAE4C;&#xC9C0;&#xB97C; &#xB2F4;&#xC558;&#xC2B5;&#xB2C8;&#xB2E4;.</p><h2 id="proxmox-%EB%AA%A8%EB%8B%88%ED%84%B0%EB%A7%81%ED%95%98%EA%B8%B0">Proxmox &#xBAA8;&#xB2C8;&#xD130;&#xB9C1;&#xD558;&#xAE30;</h2><p>&#xC6B0;&#xC120;, InfluxDB + Grafana &#xB97C; &#xD1B5;&#xD574;&#xC11C; Proxmox &#xBAA8;&#xB2C8;&#xD130;&#xB9C1;&#xC740; &#xC544;&#xB798; &#xC0AC;&#xC774;&#xD2B8;&#xB97C; &#xB530;&#xB77C;&#xAC00;&#xC2DC;&#xBA74; &#xC27D;&#xAC8C; &#xD574;&#xACB0;&#xD558;&#xC2E4; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://svrforum.com/svr/806840"><div class="kg-bookmark-content"><div class="kg-bookmark-title">&#xC11C;&#xBC84;&#xD3EC;&#xB7FC; - InfluxDB &#xBC0F; Grafana&#xB85C; Proxmox &#xBAA8;&#xB2C8;&#xD130;&#xB9C1;&#xD558;&#xAE30;</div><div class="kg-bookmark-description">&#xC548;&#xB155;&#xD558;&#xC138;&#xC694;. &#xC624;&#xB298; &#xC5F4;&#xC538;&#xD788; &#xC9D1;&#xC5D0;&#xC11C;&#xB3C4; &#xC77C;&#xD558;&#xACE0;&#xC788;&#xB294; &#xB2EC;&#xC18C;&#xC785;&#xB2C8;&#xB2E4;. ESXi&#xBD80;&#xD130; &#xC9C4;&#xD589;&#xD588;&#xB358; &#xD648;&#xC11C;&#xBC84;&#xAC00; &#xC5B4;&#xB290;&#xB367; Proxmox&#xC5D0;&#xC11C; &#xC5B4;&#xB290;&#xC815;&#xB3C4; &#xC815;&#xCC29;&#xC744; &#xD558;&#xACE0; &#xC6B4;&#xC601;&#xC744; &#xC798;&#xD558;&#xACE0;&#xC788;&#xB294;&#xC0C1;&#xD669;&#xC5D0;&#xC11C; &#xB9CE;&#xC740; &#xC720;&#xC800;&#xBD84;&#xB4E4;&#xAED8;&#xC11C; Proxmox&#xB97C; &#xC0AC;&#xC6A9;&#xD558;&#xACE0; &#xACC4;&#xC2DC;&#xB2C8; Proxmox&#x2026;</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://svrforum.com/files/attach/xeicon/217/favicon.ico?t=1609060434" alt="InfluxDB + Grafana&#xB97C; &#xD1B5;&#xD574; Proxmox Host CPU &#xC628;&#xB3C4; &#xBAA8;&#xB2C8;&#xD130;&#xB9C1; &#xC2DC;&#xAC01;&#xD654; &#xBC0F; &#xC54C;&#xB9BC; &#xAD6C;&#xCD95;"><span class="kg-bookmark-author">&#xC11C;&#xBC84;&#xD3EC;&#xB7FC;</span><span class="kg-bookmark-publisher">&#xC720;&#xBA38;&amp;&#xC815;&#xBCF4;</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://svrforum.com/files/attach/images/2023/05/27/31c49e385bcecb5a7b917dc37e7c4f7f.jpg" alt="InfluxDB + Grafana&#xB97C; &#xD1B5;&#xD574; Proxmox Host CPU &#xC628;&#xB3C4; &#xBAA8;&#xB2C8;&#xD130;&#xB9C1; &#xC2DC;&#xAC01;&#xD654; &#xBC0F; &#xC54C;&#xB9BC; &#xAD6C;&#xCD95;"></div></a></figure><p>&#xC774;&#xB807;&#xAC8C; &#xC138;&#xD305;&#xC744; &#xD558;&#xACE0; &#xB098;&#xBA74; &#xCD08;&#xAE30;&#xC5D0;&#xB294; &#xB2E4;&#xC74C;&#xACFC; &#xAC19;&#xC740; &#xBDF0;&#xB97C; &#xC5BB;&#xC744; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://life.photogrammer.me/content/images/2024/02/monitor.jpeg" class="kg-image" alt="InfluxDB + Grafana&#xB97C; &#xD1B5;&#xD574; Proxmox Host CPU &#xC628;&#xB3C4; &#xBAA8;&#xB2C8;&#xD130;&#xB9C1; &#xC2DC;&#xAC01;&#xD654; &#xBC0F; &#xC54C;&#xB9BC; &#xAD6C;&#xCD95;" loading="lazy" width="2000" height="963" srcset="https://life.photogrammer.me/content/images/size/w600/2024/02/monitor.jpeg 600w, https://life.photogrammer.me/content/images/size/w1000/2024/02/monitor.jpeg 1000w, https://life.photogrammer.me/content/images/size/w1600/2024/02/monitor.jpeg 1600w, https://life.photogrammer.me/content/images/2024/02/monitor.jpeg 2000w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">&#xC11C;&#xBC84;&#xD3EC;&#xB7FC; &#xB2EC;&#xC18C;&#xB2D8; &#xC2A4;&#xD06C;&#xB9B0;&#xC0F7;</span></figcaption></figure><h2 id="cpu-%EC%98%A8%EB%8F%84-%EB%AA%A8%EB%8B%88%ED%84%B0%EB%A7%81-%EC%B6%94%EA%B0%80%ED%95%98%EA%B8%B0">CPU &#xC628;&#xB3C4; &#xBAA8;&#xB2C8;&#xD130;&#xB9C1; &#xCD94;&#xAC00;&#xD558;&#xAE30;</h2><p>&#xC0AC;&#xC2E4; &#xC774; &#xC815;&#xB3C4;&#xC758; &#xC815;&#xBCF4;&#xB85C;&#xB3C4; &#xBAA8;&#xB2C8;&#xD130;&#xB9C1;&#xD558;&#xB294;&#xB370; &#xCDA9;&#xBD84;&#xD569;&#xB2C8;&#xB2E4;.</p><p>&#xADF8;&#xB7EC;&#xB098;, &#xC81C; &#xACBD;&#xC6B0;&#xC5D0; CPU &#xC628;&#xB3C4; / VM &#xBCC4; CPU | Memory &#xC0C1;&#xD0DC; / Docker container &#xBCC4; &#xC0C1;&#xD0DC;&#xB97C; &#xD55C; &#xACF3;&#xC5D0;&#xC11C; &#xBCF4;&#xACE0; &#xC2F6;&#xC5C8;&#xC2B5;&#xB2C8;&#xB2E4;.</p><p>&#xD2B9;&#xD788;, CPU &#xC628;&#xB3C4;&#xC758; &#xACBD;&#xC6B0; &#xC11C;&#xBC84;&#xB97C; &#xC704;&#xD55C; &#xC7A5;&#xBE44;&#xAC00; &#xC544;&#xB2CC; mini PC &#xB97C; &#xD1B5;&#xD574;&#xC11C; &#xC791;&#xB3D9;&#xD558;&#xACE0; &#xC788;&#xB294;&#xB370;, ZBOX &#xC758; &#xACBD;&#xC6B0; &#xD32C; &#xC870;&#xCC28; &#xC874;&#xC7AC;&#xD558;&#xC9C0; &#xC54A;&#xB294; &#xC81C;&#xD488;&#xC774;&#xAE30;&#xC5D0; &#xC8FC;&#xAE30;&#xC801;&#xC778; &#xBAA8;&#xB2C8;&#xD130;&#xB9C1;&#xC774; &#xD544;&#xC694;&#xD588;&#xC73C;&#xBA70; , X300 &#xC758; &#xACBD;&#xC6B0; &#xC18C;&#xC74C;&#xC73C;&#xB85C; &#xC778;&#xD574; &#xD32C; &#xC18D;&#xB3C4; &#xC81C;&#xD55C;&#xC744; &#xAC78;&#xC5B4;&#xB454; &#xC0C1;&#xD0DC;&#xC778;&#xB370; &#xC608;&#xC0C1;&#xBCF4;&#xB2E4; CPU &#xC628;&#xB3C4;&#xAC00; &#xB108;&#xBB34; &#xCE58;&#xC19F;&#xC744; &#xACBD;&#xC6B0; &#xC774; &#xC18D;&#xB3C4;&#xB97C; &#xCD94;&#xD6C4;&#xC5D0; &#xC870;&#xC808;&#xD558;&#xACE0;&#xC790; &#xBAA8;&#xB2C8;&#xD130;&#xB9C1;&#xC774; &#xD544;&#xC694;&#xD588;&#xC2B5;&#xB2C8;&#xB2E4;.</p><p>&#xB610;&#xD55C;, &#xD574;&#xB2F9; &#xBC29;&#xBC95;&#xC744; &#xC798; &#xC751;&#xC6A9;&#xD558;&#xBA74; CPU &#xC0AC;&#xC6A9;&#xB7C9;&#xACFC; &#xC628;&#xB3C4; &#xADF8;&#xB9AC;&#xACE0; &#xBA54;&#xBAA8;&#xB9AC; &#xC0AC;&#xC6A9;&#xB7C9;&#xC744; Router&#xB85C; &#xBD80;&#xD130;&#xB3C4; &#xC218;&#xC9D1;&#xD558;&#xC5EC; &#xC81C; &#xC11C;&#xBC84;&#xB97C; &#xAD6C;&#xC131;&#xD558;&#xB294; &#xC7A5;&#xCE58;&#xB4E4;&#xC758; &#xC0C1;&#xD0DC;&#xB97C; &#xC77C;&#xAD04;&#xC801;&#xC73C;&#xB85C; Grafana&#xB97C; &#xD1B5;&#xD574;&#xC11C; &#xD655;&#xC778;&#xD560; &#xC218; &#xC788;&#xC744; &#xAC83;&#xC744; &#xAE30;&#xB300;&#xD558;&#xACE0; &#xC791;&#xC5C5;&#xC744; &#xC2DC;&#xC791;&#xD588;&#xC2B5;&#xB2C8;&#xB2E4;.</p><p>&#xB2E4;&#xD589;&#xD788; &#xC2DC;&#xC2A4;&#xD15C;&#xC758; &#xC7A5;&#xCE58; &#xC628;&#xB3C4;&#xB97C; &#xC5BB;&#xC5B4;&#xC11C; Influx DB &#xB85C; &#xC1A1;&#xC2E0;&#xD558;&#xB294; &#xD234;&#xC740; &#xC774;&#xBBF8; &#xC874;&#xC7AC;&#xD569;&#xB2C8;&#xB2E4;. &#xC544;&#xB798; &#xB808;&#xD3EC;&#xC9C0;&#xD1A0;&#xB9AC;&#xB97C; &#xAC00;&#xC2DC;&#xBA74; &#xD655;&#xC778;&#xD558;&#xC2E4; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://github.com/MightySlaytanic/pve-monitoring"><div class="kg-bookmark-content"><div class="kg-bookmark-title">GitHub - MightySlaytanic/pve-monitoring: Proxmox VE temperature and disk-health stats upload to influxdb2</div><div class="kg-bookmark-description">Proxmox VE temperature and disk-health stats upload to influxdb2 - GitHub - MightySlaytanic/pve-monitoring: Proxmox VE temperature and disk-health stats upload to influxdb2</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://github.githubassets.com/assets/pinned-octocat-093da3e6fa40.svg" alt="InfluxDB + Grafana&#xB97C; &#xD1B5;&#xD574; Proxmox Host CPU &#xC628;&#xB3C4; &#xBAA8;&#xB2C8;&#xD130;&#xB9C1; &#xC2DC;&#xAC01;&#xD654; &#xBC0F; &#xC54C;&#xB9BC; &#xAD6C;&#xCD95;"><span class="kg-bookmark-author">GitHub</span><span class="kg-bookmark-publisher">MightySlaytanic</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://opengraph.githubassets.com/e77a35b79a61d34468668523b85d05eaefe39b50841d476c43cd2834c447a1e3/MightySlaytanic/pve-monitoring" alt="InfluxDB + Grafana&#xB97C; &#xD1B5;&#xD574; Proxmox Host CPU &#xC628;&#xB3C4; &#xBAA8;&#xB2C8;&#xD130;&#xB9C1; &#xC2DC;&#xAC01;&#xD654; &#xBC0F; &#xC54C;&#xB9BC; &#xAD6C;&#xCD95;"></div></a></figure><p>&#xC704; &#xB808;&#xD3EC;&#xC640; &#xD568;&#xAED8; &#xC544;&#xB798; &#xAC00;&#xC774;&#xB4DC;&#xB97C;  &#xB530;&#xB77C;&#xD558;&#xBA74;, &#xCD5C;&#xC885;&#xC801;&#xC73C;&#xB85C; &#xC774;&#xB807;&#xAC8C; &#xC791;&#xB3D9;&#xD558;&#xAC8C;&#xB429;&#xB2C8;&#xB2E4;.</p><figure class="kg-card kg-image-card"><img src="https://life.photogrammer.me/content/images/2024/02/image-38.png" class="kg-image" alt="InfluxDB + Grafana&#xB97C; &#xD1B5;&#xD574; Proxmox Host CPU &#xC628;&#xB3C4; &#xBAA8;&#xB2C8;&#xD130;&#xB9C1; &#xC2DC;&#xAC01;&#xD654; &#xBC0F; &#xC54C;&#xB9BC; &#xAD6C;&#xCD95;" loading="lazy" width="2000" height="1743" srcset="https://life.photogrammer.me/content/images/size/w600/2024/02/image-38.png 600w, https://life.photogrammer.me/content/images/size/w1000/2024/02/image-38.png 1000w, https://life.photogrammer.me/content/images/size/w1600/2024/02/image-38.png 1600w, https://life.photogrammer.me/content/images/2024/02/image-38.png 2059w" sizes="(min-width: 720px) 720px"></figure><p>&#xAC00;&#xC774;&#xB4DC;&#xB3C4; &#xC798; &#xC791;&#xC131;&#xB41C; &#xC0C1;&#xD0DC;&#xB77C;&#xC11C; &#xD574;&#xB2F9; &#xAC00;&#xC774;&#xB4DC;&#xB97C; &#xCB49; &#xB530;&#xB77C;&#xAC00;&#xC2DC;&#xBA74; CPU &#xC628;&#xB3C4;&#xB97C; &#xC5BB;&#xC5B4;&#xB0B4;&#xC2E4; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;. (&#xC2A4;&#xD06C;&#xB9BD;&#xD2B8; &#xC790;&#xCCB4;&#xB3C4; &#xB2E8;&#xC21C;&#xD569;&#xB2C8;&#xB2E4;.) &#xB2E4;&#xB9CC;, &#xC81C; &#xACBD;&#xC6B0;&#xC5D0; X300 &#xC5D0;&#xC11C; Ryzen 4750G &#xB97C; &#xC0AC;&#xC6A9;&#xD558;&#xACE0; &#xC788;&#xB294;&#xB370; &#xD574;&#xB2F9; &#xD234;&#xC5D0;&#xC11C; &#xC815;&#xC758;&#xD574;&#xB454; &#xADDC;&#xACA9;&#xACFC;&#xB294; &#xB2E4;&#xC18C; &#xB2E4;&#xB985;&#xB2C8;&#xB2E4;. AMD &#xC758; &#xACBD;&#xC6B0; CPU Core &#xC5D0; &#xB300;&#xD55C; &#xC815;&#xBCF4;, PCH &#xC5D0; &#xB300;&#xD55C; &#xC815;&#xBCF4;&#xB4E4;&#xC774; &#xB530;&#xB85C; &#xC874;&#xC7AC;&#xD558;&#xC9C0; &#xC54A;&#xC2B5;&#xB2C8;&#xB2E4;. &#xB54C;&#xBB38;&#xC5D0; &#xC77C;&#xBD80;&#xBD84; &#xC218;&#xC815;&#xD574;&#xC57C;&#xD569;&#xB2C8;&#xB2E4;.</p><p>&#xC81C; &#xACBD;&#xC6B0;&#xC5D0;&#xB294; Core &#xC5D0; &#xB300;&#xD55C; &#xC628;&#xB3C4;&#xB294; &#xD06C;&#xAC8C; &#xC758;&#xBBF8; &#xC5C6;&#xC73C;&#xBA70;, &#xD1B5;&#xD569;&#xC801;&#xC73C;&#xB85C; &#xC815;&#xBCF4;&#xB97C; &#xC5BB;&#xC5B4;&#xB0B4;&#xAE30;&#xBA74; &#xD558;&#xBA74; &#xB418;&#xAE30;&#xC5D0; &#xC2A4;&#xD06C;&#xB9BD;&#xD2B8;&#xB97C; &#xC77C;&#xBD80; &#xC218;&#xC815;&#xD588;&#xC2B5;&#xB2C8;&#xB2E4;.</p><h3 id="%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EA%B3%A0%EC%B9%98%EA%B8%B0">&#xC2A4;&#xD06C;&#xB9BD;&#xD2B8; &#xACE0;&#xCE58;&#xAE30;</h3><ul><li><code>pve_temp_stats_to_influxdb2.py</code></li></ul><pre><code class="language-python">#!/root/scripts/venv/bin/python3

# Note about python shabang string above: if you&apos;re running on a Debian 11
# system use the standard &quot;#!/usr/bin/python3&quot; string while if you are on
# a Debian 12 system you need to create a virtual-env with influxdb_client
# and use the shabang string pointing to the python3 interpreter within
# the virtual-env, such as &quot;#!/root/scripts/venv/bin/python3&quot;
#
# For example, to create the virtual-env in /root/scripts/venv and install
# the required package do the following:
#
# python3 -m venv /root/scripts/venv
# . /root/scripts/venv/bin/activate
# pip3 install influxdb-client
# deactivate

import re
import sys
import json
import argparse
from datetime import datetime
from os import getenv
from subprocess import run,PIPE

from influxdb_client import InfluxDBClient
from influxdb_client.client.write_api import SYNCHRONOUS
from influxdb_client.client.exceptions import InfluxDBError

INFLUX_HOST = getenv(&quot;INFLUX_HOST&quot;)
INFLUX_PORT = getenv(&quot;INFLUX_PORT&quot;)
INFLUX_TOKEN = getenv(&quot;INFLUX_TOKEN&quot;)
INFLUX_ORGANIZATION = getenv(&quot;INFLUX_ORGANIZATION&quot;)
INFLUX_BUCKET = getenv(&quot;INFLUX_BUCKET&quot;)
HOST = getenv(&quot;HOST_TAG&quot;)

CORE_OFFSET=2

CPU_TEMP = getenv(&quot;CPU_TEMP&quot;).split(&apos;:&apos;)

if __name__ == &apos;__main__&apos;:
    parser = argparse.ArgumentParser(usage=&quot;PVE Sensors Stats to influxdb2 uploader&quot;)

    parser.add_argument(
        &quot;-t&quot;,
        &quot;--test&quot;,
        help=&quot;Just print the results without uploading to influxdb2&quot;,
        action=&quot;store_true&quot;
    )

    args = parser.parse_args()

    measurements = []
    stats = {}

    data = json.loads(run([&quot;/usr/bin/sensors -j&quot;], stdout=PIPE, stderr=None, text=True, shell=True).stdout)

    if CPU_TEMP[0]: 
        stats[CPU_TEMP[0]] = int(data[CPU_TEMP[1]][CPU_TEMP[2]][CPU_TEMP[3]])

    measurements.append({
        &quot;measurement&quot;: &quot;temp&quot;,
        &quot;tags&quot;: {&quot;host&quot;: HOST, &quot;service&quot;: &quot;lm_sensors&quot;},
        &quot;fields&quot;: stats
    })

    if args.test:
        print(f&quot;\nMeasurements for host {HOST}&quot;)
        print(json.dumps(measurements, indent=4))
    else:
        try:
            client = InfluxDBClient(url=f&quot;http://{INFLUX_HOST}:{INFLUX_PORT}&quot;, token=INFLUX_TOKEN, org=INFLUX_ORGANIZATION, timeout=30000)
            write_api = client.write_api(write_options=SYNCHRONOUS)

            write_api.write(
                INFLUX_BUCKET,
                INFLUX_ORGANIZATION,
                measurements
            )

        except TimeoutError as e:
            failure = True
            print(e,file=sys.stderr)
            print(f&quot;[{datetime.now().strftime(&apos;%Y-%m-%d %H:%M:%S&apos;)}] TimeoutError: Could not upload data to {INFLUX_HOST}:{INFLUX_PORT} for host {HOST}&quot;,file=sys.stderr)
            exit(-1)
        except InfluxDBError as e:
            failure = True
            print(e,file=sys.stderr)
            print(f&quot;[{datetime.now().strftime(&apos;%Y-%m-%d %H:%M:%S&apos;)}] InfluxDBError: Could not upload data to {INFLUX_HOST}:{INFLUX_PORT} for host {HOST}&quot;,file=sys.stderr)
            exit(-1)
        except Exception as e:
            failure = True
            print(e, file=sys.stderr)
            print(f&quot;[{datetime.now().strftime(&apos;%Y-%m-%d %H:%M:%S&apos;)}] Connection Error: Could not upload data to {INFLUX_HOST}:{INFLUX_PORT} for host {HOST}&quot;,file=sys.stderr)
            exit(-1)

        client.close()
</code></pre><ul><li><code>pve_temp_stats_to_influxdb2.sh</code></li></ul><pre><code class="language-bash">#!/bin/bash

export INFLUX_HOST=&quot;influx_IP_or_DNS&quot;
export INFLUX_PORT=&quot;influx_PORT&quot;
export INFLUX_ORGANIZATION=&quot;influx_organization&quot;
export INFLUX_BUCKET=&quot;influx_bucket&quot;
export INFLUX_TOKEN=&quot;influx_token&quot;
export HOST_TAG=&quot;measurements_host_tag&quot;
export CPU_CORES=&quot;6&quot;

# Execute &quot;sensors -j&quot; and then use the information to set the following environment variables.
# In case some of them, like ACPITZ stuff, are not available, set them to &quot;&quot;
# For example if you want the PCH temperature to be stored in a pch field and you see the following
# within &quot;sensors -j&quot; output
#   &quot;pch_cannonlake-virtual-0&quot;:{
#      &quot;Adapter&quot;: &quot;Virtual device&quot;,
#      &quot;temp1&quot;:{
#         &quot;temp1_input&quot;: 61.000
#      }
#   }
# AMD Ryzen 4750G output
#  &quot;k10temp-pci-00c3&quot;:{
#     &quot;Adapter&quot;: &quot;PCI adapter&quot;,
#     &quot;Tctl&quot;:{
#        &quot;temp1_input&quot;: 62.875
#     }
#  },
# Set PCH_INFO as the following, by looking at the chain of values that lead to the temperature of PCH
export CPU_TEMP=&quot;cpu_temp:k10temp-pci-00c3:Tctl:temp1_input&quot;

# Debian 11 without Python Virtual Environment
# python3 /home/scripts/pve_temp_stats_to_influxdb2.py $*

# Debian 12 with Python Virtual Environment in /path/to/venv
/path/to/venv/bin/python3 /home/scripts/pve_temp_stats_to_influxdb2.py $*</code></pre><p>&#xD06C;&#xAC8C; &#xBC14;&#xB010; &#xBD80;&#xBD84;&#xC740; &#xC5C6;&#xACE0;, &#xC81C;&#xAC8C; &#xC874;&#xC7AC;&#xD558;&#xC9C0; &#xC54A;&#xB294; &#xC815;&#xBCF4; (<code>PCH_INFO</code>, <code>ACPITZ_INFO</code>,<code>CORETEMP_NAME</code>, <code>NVME_INFO</code>) &#xB97C; &#xC0AD;&#xC81C;&#xD558;&#xACE0; python &#xC2A4;&#xD06C;&#xB9BD;&#xD2B8;&#xC5D0;&#xC11C;&#xB3C4; &#xB9C8;&#xCC2C;&#xAC00;&#xC9C0;&#xB85C; &#xC81C;&#xAC70;&#xD588;&#xC2B5;&#xB2C8;&#xB2E4;. (nvme &#xC758; &#xACBD;&#xC6B0; &#xD68D;&#xB4DD;&#xC740; &#xB418;&#xB098;, &#xB531;&#xD788; &#xC81C;&#xAC8C;&#xB294; &#xC758;&#xBBF8;&#xAC00; &#xC5C6;&#xC5B4;&#xC11C; &#xC81C;&#xAC70;&#xD574;&#xB450;&#xC5C8;&#xC2B5;&#xB2C8;&#xB2E4;. &#xD544;&#xC694;&#xD558;&#xC2DC;&#xB2E4;&#xBA74; &#xAC00;&#xC774;&#xB4DC;&#xB300;&#xB85C; &#xC815;&#xBCF4; &#xD68D;&#xB4DD;&#xD574;&#xC11C; &#xCD94;&#xAC00;&#xD574;&#xC8FC;&#xC2DC;&#xBA74; &#xB429;&#xB2C8;&#xB2E4;.)</p><h3 id="grafana%EC%97%90%EC%84%9C-%ED%8C%A8%EB%84%90-%EC%B6%94%EA%B0%80%ED%95%98%EA%B8%B0">Grafana&#xC5D0;&#xC11C; &#xD328;&#xB110; &#xCD94;&#xAC00;&#xD558;&#xAE30;</h3><p>&#xC774;&#xC81C; InfluxDB &#xC5D0; &#xB370;&#xC774;&#xD130;&#xAC00; &#xC218;&#xC2E0;&#xB418;&#xACE0; &#xC788;&#xC73C;&#xB2C8;, Grafana&#xC5D0; &#xCD94;&#xAC00;&#xD560; &#xCC28;&#xB840;&#xC785;&#xB2C8;&#xB2E4;. &#xCD5C;&#xC885;&#xC801;&#xC73C;&#xB85C; &#xACB0;&#xACFC;&#xB294; &#xC774;&#xB807;&#xAC8C; &#xB098;&#xC62C;&#xAC81;&#xB2C8;&#xB2E4;.</p><figure class="kg-card kg-image-card"><img src="https://life.photogrammer.me/content/images/2024/02/image-29.png" class="kg-image" alt="InfluxDB + Grafana&#xB97C; &#xD1B5;&#xD574; Proxmox Host CPU &#xC628;&#xB3C4; &#xBAA8;&#xB2C8;&#xD130;&#xB9C1; &#xC2DC;&#xAC01;&#xD654; &#xBC0F; &#xC54C;&#xB9BC; &#xAD6C;&#xCD95;" loading="lazy" width="2000" height="554" srcset="https://life.photogrammer.me/content/images/size/w600/2024/02/image-29.png 600w, https://life.photogrammer.me/content/images/size/w1000/2024/02/image-29.png 1000w, https://life.photogrammer.me/content/images/size/w1600/2024/02/image-29.png 1600w, https://life.photogrammer.me/content/images/2024/02/image-29.png 2000w" sizes="(min-width: 720px) 720px"></figure><p>Grafana &#xB300;&#xC2DC;&#xBCF4;&#xB4DC;&#xC5D0;&#xC11C; Add &#xB97C; &#xD1B5;&#xD574; &#xD328;&#xB110;&#xC744; &#xD558;&#xB098; &#xCD94;&#xAC00;&#xD569;&#xB2C8;&#xB2E4;.</p><figure class="kg-card kg-image-card"><img src="https://life.photogrammer.me/content/images/2024/02/image-30.png" class="kg-image" alt="InfluxDB + Grafana&#xB97C; &#xD1B5;&#xD574; Proxmox Host CPU &#xC628;&#xB3C4; &#xBAA8;&#xB2C8;&#xD130;&#xB9C1; &#xC2DC;&#xAC01;&#xD654; &#xBC0F; &#xC54C;&#xB9BC; &#xAD6C;&#xCD95;" loading="lazy" width="2000" height="64" srcset="https://life.photogrammer.me/content/images/size/w600/2024/02/image-30.png 600w, https://life.photogrammer.me/content/images/size/w1000/2024/02/image-30.png 1000w, https://life.photogrammer.me/content/images/size/w1600/2024/02/image-30.png 1600w, https://life.photogrammer.me/content/images/2024/02/image-30.png 2000w" sizes="(min-width: 720px) 720px"></figure><p>&#xCFFC;&#xB9AC;&#xC758; &#xACBD;&#xC6B0; &#xB2E4;&#xC74C;&#xACFC; &#xAC19;&#xC774; &#xC791;&#xC131;&#xD558;&#xBA74; &#xB429;&#xB2C8;&#xB2E4;.  (&#xAC00;&#xC774;&#xB4DC;&#xB300;&#xB85C; &#xB530;&#xB77C;&#xD558;&#xC168;&#xB2E4;&#xBA74;, <code>r._field</code> &#xAC12;&#xC5D0; <code>pch</code>&#xAC00; &#xD544;&#xC694;&#xD560; &#xAC83;&#xC785;&#xB2C8;&#xB2E4;.)</p><pre><code class="language-flux">from(bucket: &quot;${Bucket}&quot;)
  |&gt; range(start: v.timeRangeStart, stop:v.timeRangeStop)
  |&gt; filter(fn: (r) =&gt; r[&quot;host&quot;] =~ /${server:regex}/)
  |&gt; filter(fn: (r) =&gt; r._measurement == &quot;temp&quot; and r._field == &quot;cpu_temp&quot;)
</code></pre><p>&#xC800;&#xB294; &#xC2DC;&#xACC4;&#xC5F4; &#xB370;&#xC774;&#xD130;&#xB97C; &#xADF8;&#xB798;&#xD504;&#xB85C; &#xBCF4;&#xC5EC;&#xC8FC;&#xB294; Time series &#xC640; Gauge &#xB97C; &#xC0AC;&#xC6A9;&#xD558;&#xC600;&#xC2B5;&#xB2C8;&#xB2E4;. &#xCC98;&#xC74C; &#xD328;&#xB110;&#xC744; &#xC0DD;&#xC131;&#xD558;&#xAC8C; &#xB420; &#xACBD;&#xC6B0; Threshold &#xAC12;&#xC774;&#xB098;, &#xADF8;&#xB798;&#xD504;&#xC5D0; &#xB300;&#xD574;&#xC11C;&#xB294; &#xAE30;&#xBCF8; &#xAC12;&#xC73C;&#xB85C; &#xC124;&#xC815;&#xB418;&#xC5B4;&#xC788;&#xB294;&#xB370;, &#xC801;&#xB2F9;&#xD788; &#xC124;&#xC815;&#xD574;&#xC11C; &#xC0AC;&#xC6A9;&#xD558;&#xC2DC;&#xBA74; &#xB429;&#xB2C8;&#xB2E4;.</p><p>&#xAC19;&#xC740; &#xBC29;&#xBC95;&#xC744; &#xC0AC;&#xC6A9;&#xD558;&#xC5EC; &#xC544;&#xB798;&#xC640; &#xAC19;&#xC774; Summary &#xD0ED;&#xC5D0;&#xC11C; Host &#xBCC4; CPU&#xB3C4; &#xBCF4;&#xC5EC;&#xC904; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.</p><figure class="kg-card kg-image-card"><img src="https://life.photogrammer.me/content/images/2024/02/image-31.png" class="kg-image" alt="InfluxDB + Grafana&#xB97C; &#xD1B5;&#xD574; Proxmox Host CPU &#xC628;&#xB3C4; &#xBAA8;&#xB2C8;&#xD130;&#xB9C1; &#xC2DC;&#xAC01;&#xD654; &#xBC0F; &#xC54C;&#xB9BC; &#xAD6C;&#xCD95;" loading="lazy" width="2000" height="311" srcset="https://life.photogrammer.me/content/images/size/w600/2024/02/image-31.png 600w, https://life.photogrammer.me/content/images/size/w1000/2024/02/image-31.png 1000w, https://life.photogrammer.me/content/images/size/w1600/2024/02/image-31.png 1600w, https://life.photogrammer.me/content/images/2024/02/image-31.png 2000w" sizes="(min-width: 720px) 720px"></figure><p>&#xD574;&#xB2F9; &#xD328;&#xB110;&#xC758; &#xCFFC;&#xB9AC;&#xB294; &#xC544;&#xB798;&#xC640; &#xAC19;&#xC774; &#xC124;&#xC815;&#xD558;&#xC2DC;&#xBA74; &#xB429;&#xB2C8;&#xB2E4;. (&#xB0B4;&#xBD80; &#xD328;&#xB110; &#xB514;&#xC790;&#xC778;&#xC740; &#xCDE8;&#xD5A5;&#xC5D0; &#xB9DE;&#xCDB0; &#xC124;&#xC815;&#xD558;&#xC2DC;&#xBA74; &#xB429;&#xB2C8;&#xB2E4;.</p><pre><code class="language-flux">from(bucket: &quot;${Bucket}&quot;)
  |&gt; range(start: v.timeRangeStart, stop: v.timeRangeStop)
  |&gt; filter(fn: (r) =&gt; r._measurement == &quot;temp&quot; and r._field == &quot;cpu_temp&quot;)
  |&gt; filter(fn: (r) =&gt; r.host == &quot;${server}&quot;)</code></pre><h3 id="grafana-%EB%A5%BC-%ED%86%B5%ED%95%B4-alert-%EB%B3%B4%EB%82%B4%EA%B8%B0">Grafana &#xB97C; &#xD1B5;&#xD574; Alert &#xBCF4;&#xB0B4;&#xAE30;</h3><p>&#xB2E8;&#xC21C;&#xD788; &#xBAA8;&#xB2C8;&#xD130;&#xB9C1; &#xC2DC;&#xAC01;&#xD654;&#xB97C; &#xD560; &#xBFD0;&#xB9CC; &#xC544;&#xB2C8;&#xB77C;, &#xC704;&#xD5D8; &#xC218;&#xCE58;&#xC5D0; &#xB3C4;&#xB2EC;&#xD588;&#xC744; &#xB54C; alert &#xB97C; &#xBCF4;&#xB0B4;&#xC92C;&#xC73C;&#xBA74; &#xD558;&#xC5EC;, grafana &#xB97C; &#xD1B5;&#xD574; alert &#xC2DC;&#xC2A4;&#xD15C;&#xAE4C;&#xC9C0; &#xD55C;&#xBC88; &#xAD6C;&#xCD95;&#xD574;&#xBCF4;&#xACA0;&#xC2B5;&#xB2C8;&#xB2E4;.</p><h4 id="telegram-%EC%9D%84-%ED%86%B5%ED%95%9C-alert">Telegram &#xC744; &#xD1B5;&#xD55C; Alert</h4><p>Grafana &#xC758; &#xACBD;&#xC6B0; &#xB2E4;&#xC591;&#xD55C; &#xBC29;&#xBC95;&#xC744; &#xD1B5;&#xD574; alert &#xB97C; &#xBCF4;&#xB0BC; &#xC218; &#xC788;&#xB3C4;&#xB85D; &#xC124;&#xC815;&#xD560; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;. &#xC5EC;&#xAE30;&#xC11C;&#xB294; telegram &#xC744; &#xD1B5;&#xD574; &#xC124;&#xC815;&#xD574;&#xBCF4;&#xACA0;&#xC2B5;&#xB2C8;&#xB2E4;.</p><p>&#xC6B0;&#xC120; Telegram &#xC744; Contact point &#xB85C; &#xC9C0;&#xC815;&#xD574;&#xB46C;&#xC57C;&#xD569;&#xB2C8;&#xB2E4;.  Contact point &#xC5D0;&#xC11C; Add contact point &#xB97C; &#xB204;&#xB974;&#xACE0; Telegram bot&#xC744; &#xC120;&#xD0DD;&#xD569;&#xB2C8;&#xB2E4;.</p><figure class="kg-card kg-gallery-card kg-width-wide"><div class="kg-gallery-container"><div class="kg-gallery-row"><div class="kg-gallery-image"><img src="https://life.photogrammer.me/content/images/2024/02/image-34.png" width="744" height="972" loading="lazy" alt="InfluxDB + Grafana&#xB97C; &#xD1B5;&#xD574; Proxmox Host CPU &#xC628;&#xB3C4; &#xBAA8;&#xB2C8;&#xD130;&#xB9C1; &#xC2DC;&#xAC01;&#xD654; &#xBC0F; &#xC54C;&#xB9BC; &#xAD6C;&#xCD95;" srcset="https://life.photogrammer.me/content/images/size/w600/2024/02/image-34.png 600w, https://life.photogrammer.me/content/images/2024/02/image-34.png 744w" sizes="(min-width: 720px) 720px"></div><div class="kg-gallery-image"><img src="https://life.photogrammer.me/content/images/2024/02/image-33.png" width="2000" height="986" loading="lazy" alt="InfluxDB + Grafana&#xB97C; &#xD1B5;&#xD574; Proxmox Host CPU &#xC628;&#xB3C4; &#xBAA8;&#xB2C8;&#xD130;&#xB9C1; &#xC2DC;&#xAC01;&#xD654; &#xBC0F; &#xC54C;&#xB9BC; &#xAD6C;&#xCD95;" srcset="https://life.photogrammer.me/content/images/size/w600/2024/02/image-33.png 600w, https://life.photogrammer.me/content/images/size/w1000/2024/02/image-33.png 1000w, https://life.photogrammer.me/content/images/size/w1600/2024/02/image-33.png 1600w, https://life.photogrammer.me/content/images/size/w2400/2024/02/image-33.png 2400w" sizes="(min-width: 720px) 720px"></div></div></div></figure><p>Telegram bot &#xC758; &#xC0DD;&#xC131;&#xC758; &#xACBD;&#xC6B0; &#xC544;&#xB798;&#xB97C; &#xCC38;&#xACE0;&#xD574;&#xC8FC;&#xC138;&#xC694;.</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://wikidocs.net/213846"><div class="kg-bookmark-content"><div class="kg-bookmark-title">(1) &#xD154;&#xB808;&#xADF8;&#xB7A8; &#xBD07; &#xB9CC;&#xB4E4;&#xAE30;</div><div class="kg-bookmark-description">1. &#xD154;&#xB808;&#xADF8;&#xB7A8; &#xC571;&#xC5D0; &#xB4E4;&#xC5B4;&#xAC00;&#xC154;&#xC11C; BotFather&#xB97C; &#xAC80;&#xC0C9;&#xD558;&#xC5EC; &#xB4E4;&#xC5B4;&#xAC11;&#xB2C8;&#xB2E4;. ![](https://wikidocs.net/images/page/213846/%EB%B4%87%ED%8C&#x2026;</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://wikidocs.net/static/img/favicon.ico" alt="InfluxDB + Grafana&#xB97C; &#xD1B5;&#xD574; Proxmox Host CPU &#xC628;&#xB3C4; &#xBAA8;&#xB2C8;&#xD130;&#xB9C1; &#xC2DC;&#xAC01;&#xD654; &#xBC0F; &#xC54C;&#xB9BC; &#xAD6C;&#xCD95;"><span class="kg-bookmark-author">&#xC704;&#xD0A4;&#xB3C5;&#xC2A4;</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://wikidocs.net/images/book/%EC%8B%A0%ED%95%9C%EC%9D%B8%EB%94%94%EC%82%AC%EC%9A%A9%EB%B2%95.jpg" alt="InfluxDB + Grafana&#xB97C; &#xD1B5;&#xD574; Proxmox Host CPU &#xC628;&#xB3C4; &#xBAA8;&#xB2C8;&#xD130;&#xB9C1; &#xC2DC;&#xAC01;&#xD654; &#xBC0F; &#xC54C;&#xB9BC; &#xAD6C;&#xCD95;"></div></a></figure><p>&#xC785;&#xB825;&#xC744; &#xC644;&#xB8CC;&#xD558;&#xBA74; Test &#xBC84;&#xD2BC;&#xC744; &#xD1B5;&#xD574;&#xC11C; &#xC815;&#xC0C1;&#xC801;&#xC73C;&#xB85C; &#xBA54;&#xC2DC;&#xC9C0;&#xAC00; &#xC798; &#xC218;&#xC2E0;&#xB418;&#xB294;&#xC9C0; &#xD655;&#xC778;&#xD569;&#xB2C8;&#xB2E4;.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://life.photogrammer.me/content/images/2024/02/image-35.png" class="kg-image" alt="InfluxDB + Grafana&#xB97C; &#xD1B5;&#xD574; Proxmox Host CPU &#xC628;&#xB3C4; &#xBAA8;&#xB2C8;&#xD130;&#xB9C1; &#xC2DC;&#xAC01;&#xD654; &#xBC0F; &#xC54C;&#xB9BC; &#xAD6C;&#xCD95;" loading="lazy" width="1246" height="302" srcset="https://life.photogrammer.me/content/images/size/w600/2024/02/image-35.png 600w, https://life.photogrammer.me/content/images/size/w1000/2024/02/image-35.png 1000w, https://life.photogrammer.me/content/images/2024/02/image-35.png 1246w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">&#xC815;&#xC0C1;&#xC801;&#xC73C;&#xB85C; &#xC798; &#xC654;&#xC2B5;&#xB2C8;&#xB2E4;.</span></figcaption></figure><p>&#xC815;&#xC0C1;&#xC801;&#xC73C;&#xB85C; &#xC218;&#xC2E0;&#xC774;&#xB418;&#xBA74;, Notification Policies &#xB85C; &#xAC11;&#xB2C8;&#xB2E4;. Default Policy &#xC758; &#xACBD;&#xC6B0; Default email &#xC73C;&#xB85C; &#xC9C0;&#xC815;&#xC774;&#xB418;&#xC5B4;&#xC788;&#xB294;&#xB370;, &#xC774;&#xB97C; &#xBC29;&#xAE08; &#xB9CC;&#xB4E0; Telegram bot &#xC73C;&#xB85C; contract point&#xB97C; &#xC9C0;&#xC815;&#xD574;&#xC90D;&#xB2C8;&#xB2E4;.</p><figure class="kg-card kg-image-card"><img src="https://life.photogrammer.me/content/images/2024/02/image-40.png" class="kg-image" alt="InfluxDB + Grafana&#xB97C; &#xD1B5;&#xD574; Proxmox Host CPU &#xC628;&#xB3C4; &#xBAA8;&#xB2C8;&#xD130;&#xB9C1; &#xC2DC;&#xAC01;&#xD654; &#xBC0F; &#xC54C;&#xB9BC; &#xAD6C;&#xCD95;" loading="lazy" width="2000" height="817" srcset="https://life.photogrammer.me/content/images/size/w600/2024/02/image-40.png 600w, https://life.photogrammer.me/content/images/size/w1000/2024/02/image-40.png 1000w, https://life.photogrammer.me/content/images/size/w1600/2024/02/image-40.png 1600w, https://life.photogrammer.me/content/images/2024/02/image-40.png 2000w" sizes="(min-width: 720px) 720px"></figure><p>&#xC774;&#xD6C4; &#xB2E4;&#xC2DC; &#xB300;&#xC2DC;&#xBCF4;&#xB4DC;&#xB85C; &#xB3CC;&#xC544;&#xAC11;&#xB2C8;&#xB2E4;. &#xD604;&#xC7AC;&#xB294; CPU &#xC628;&#xB3C4;&#xC5D0; &#xB300;&#xD55C; &#xC54C;&#xB9BC;&#xC744; &#xAD6C;&#xCD95;&#xD558;&#xACE0; &#xC788;&#xC73C;&#xB2C8;, &#xC55E;&#xC11C; &#xB9CC;&#xB4E0; &#xD328;&#xB110;&#xC744; &#xB204;&#xB974;&#xACE0; <code>More -&gt; New alert rule</code> &#xC744; &#xD1B5;&#xD574; &#xC0C8; alert &#xADDC;&#xCE59;&#xC744; &#xCD94;&#xAC00;&#xD569;&#xB2C8;&#xB2E4;. (&#xC774;&#xB807;&#xAC8C; &#xD558;&#xBA74; &#xAD00;&#xB828; &#xCFFC;&#xB9AC;&#xB97C; &#xADF8;&#xB300;&#xB85C; &#xB4E4;&#xACE0;&#xC640;&#xC11C; &#xD3B8;&#xD569;&#xB2C8;&#xB2E4;.)</p><figure class="kg-card kg-image-card"><img src="https://life.photogrammer.me/content/images/2024/02/image-36.png" class="kg-image" alt="InfluxDB + Grafana&#xB97C; &#xD1B5;&#xD574; Proxmox Host CPU &#xC628;&#xB3C4; &#xBAA8;&#xB2C8;&#xD130;&#xB9C1; &#xC2DC;&#xAC01;&#xD654; &#xBC0F; &#xC54C;&#xB9BC; &#xAD6C;&#xCD95;" loading="lazy" width="2000" height="1021" srcset="https://life.photogrammer.me/content/images/size/w600/2024/02/image-36.png 600w, https://life.photogrammer.me/content/images/size/w1000/2024/02/image-36.png 1000w, https://life.photogrammer.me/content/images/size/w1600/2024/02/image-36.png 1600w, https://life.photogrammer.me/content/images/2024/02/image-36.png 2000w" sizes="(min-width: 720px) 720px"></figure><p>Rule &#xC744; &#xC0DD;&#xC131;&#xD558;&#xB294; &#xACF3;&#xC5D0; &#xB3C4;&#xB2EC;&#xD558;&#xBA74; &#xB2E4;&#xC74C;&#xACFC; &#xAC19;&#xC740; &#xCFFC;&#xB9AC;&#xB97C; &#xBCFC; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;. &#xD574;&#xB2F9; &#xC601;&#xC5ED;&#xC5D0;&#xC11C;&#xB294; &#xB530;&#xB85C; Grafana Dashboard &#xC758; &#xBCC0;&#xC218;&#xB97C; &#xC0AC;&#xC6A9;&#xD560; &#xC218; &#xC5C6;&#xC5B4; &#xBA85;&#xD655;&#xD558;&#xAC8C; &#xC9C0;&#xC815;&#xB418;&#xC5B4;&#xC788;&#xB294; &#xBAA8;&#xC2B5;&#xC744; &#xBCFC; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;. </p><p>&#xADF8;&#xB7F0;&#xB370;, &#xD328;&#xB110;&#xC5D0;&#xC11C; &#xB4E4;&#xACE0;&#xC624;&#xBA74; &#xBCF4;&#xD1B5; Host &#xC5D0; &#xB300;&#xD55C; &#xD544;&#xD130;&#xB9C1;&#xC774; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;. &#xC774;&#xB807;&#xAC8C; &#xD544;&#xD130;&#xB9C1;&#xC774; &#xB41C; &#xCFFC;&#xB9AC;&#xB97C; &#xC0AC;&#xC6A9;&#xD560; &#xACBD;&#xC6B0; alert rule &#xC744; host&#xB9C8;&#xB2E4; &#xAC01;&#xAC01; &#xB9CC;&#xB4E4;&#xC5B4;&#xC57C;&#xD569;&#xB2C8;&#xB2E4;. &#xB530;&#xB77C;&#xC11C; &#xCFFC;&#xB9AC;&#xC5D0;&#xC11C; host&#xB97C; &#xB530;&#xB85C; &#xD544;&#xD130;&#xB9C1;&#xD558;&#xB294; &#xBD80;&#xBD84;&#xC744; &#xC81C;&#xAC70;&#xD574;&#xC8FC;&#xC138;&#xC694;. &#xC81C; &#xACBD;&#xC6B0; &#xB2E4;&#xC74C;&#xACFC; &#xAC19;&#xC774; &#xCFFC;&#xB9AC;&#xB97C; &#xC791;&#xC131;&#xD588;&#xC2B5;&#xB2C8;&#xB2E4;.</p><pre><code class="language-flux">from(bucket: &quot;proxmox&quot;)
  |&gt; range(start: v.timeRangeStart, stop: v.timeRangeStop)
  |&gt; filter(fn: (r) =&gt; r._measurement == &quot;temp&quot; and r._field == &quot;cpu_temp&quot;)</code></pre><p>&#xADF8; &#xB2E4;&#xC74C;&#xC5D0;&#xB294; alert &#xB97C; &#xC704;&#xD55C; &#xD45C;&#xD604;&#xC2DD;&#xC744; &#xC791;&#xC131;&#xD558;&#xB294; &#xBD80;&#xBD84;&#xC785;&#xB2C8;&#xB2E4;.  A &#xB77C;&#xB294; &#xACB0;&#xACFC;&#xB294; &#xCFFC;&#xB9AC;&#xB97C; &#xD1B5;&#xD574;&#xC11C; &#xC5BB;&#xC740; &#xACB0;&#xACFC;&#xC774;&#xBA70; B&#xB294; &#xC5EC;&#xAE30;&#xC11C; &#xAC12;&#xC744; &#xC815;&#xD558;&#xB294; &#xACFC;&#xC815;(&#xD3C9;&#xADE0;&#xAC12;, &#xCD5C;&#xB300;/&#xCD5C;&#xC18C;&#xAC12;, &#xB9C8;&#xC9C0;&#xB9C9; &#xAC12;)  &#xADF8;&#xB9AC;&#xACE0; C &#xC5D0;&#xC11C; Threshold&#xB97C; &#xC124;&#xC815;&#xD558;&#xB294; &#xAC83;&#xC785;&#xB2C8;&#xB2E4;. (&#xB2E8;&#xC21C;&#xD558;&#xAC8C; &#xC798; &#xB9CC;&#xB4E4;&#xC5B4;&#xB1A8;&#xB124;&#xC694;.)</p><figure class="kg-card kg-image-card"><img src="https://life.photogrammer.me/content/images/2024/02/image-37.png" class="kg-image" alt="InfluxDB + Grafana&#xB97C; &#xD1B5;&#xD574; Proxmox Host CPU &#xC628;&#xB3C4; &#xBAA8;&#xB2C8;&#xD130;&#xB9C1; &#xC2DC;&#xAC01;&#xD654; &#xBC0F; &#xC54C;&#xB9BC; &#xAD6C;&#xCD95;" loading="lazy" width="2000" height="992" srcset="https://life.photogrammer.me/content/images/size/w600/2024/02/image-37.png 600w, https://life.photogrammer.me/content/images/size/w1000/2024/02/image-37.png 1000w, https://life.photogrammer.me/content/images/size/w1600/2024/02/image-37.png 1600w, https://life.photogrammer.me/content/images/2024/02/image-37.png 2000w" sizes="(min-width: 720px) 720px"></figure><p>CPU &#xC628;&#xB3C4;&#xAC00; &#xC77C;&#xC815; &#xC774;&#xC0C1; &#xC624;&#xB974;&#xBA74; &#xC54C;&#xB9BC;&#xC774; &#xAC00;&#xB3C4;&#xB85D;, Threshold &#xC758; <code>IS ABOVE</code> &#xAC12;&#xC744; &#xBCC0;&#xACBD;&#xD569;&#xB2C8;&#xB2E4;. &#xC800;&#xB294; 70&#xB3C4;&#xB97C; &#xAE30;&#xC900;&#xC73C;&#xB85C; &#xC7A1;&#xC558;&#xC2B5;&#xB2C8;&#xB2E4;. (&#xD14C;&#xC2A4;&#xD2B8;&#xB97C; &#xC704;&#xD574;&#xC11C;&#xB77C;&#xBA74; &#xB2F9;&#xC7A5; &#xC6B8;&#xB9B4;&#xB9CC;&#xD55C; &#xC218;&#xCE58;&#xB85C; &#xD55C;&#xBC88; &#xC124;&#xC815;&#xD574;&#xBCF4;&#xACE0; &#xCD94;&#xD6C4;&#xC5D0; &#xBCC0;&#xACBD;&#xD558;&#xB294; &#xAC83;&#xB3C4; &#xC88B;&#xC2B5;&#xB2C8;&#xB2E4;.)</p><p>Evaluation Behavior &#xC5D0;&#xC11C;&#xB294; &#xAC19;&#xC740; &#xAC04;&#xACA9;&#xB9C8;&#xB2E4; alert &#xC5D0; &#xB300;&#xD55C; &#xD3C9;&#xAC00;&#xB97C; &#xC9C4;&#xD589;&#xD560; &#xADF8;&#xB8F9;&#xC744; &#xB9CC;&#xB4ED;&#xB2C8;&#xB2E4;. &#xC55E;&#xC11C; cron &#xC744; &#xD1B5;&#xD574; 1&#xBD84;&#xB9C8;&#xB2E4; &#xACB0;&#xACFC;&#xB97C; &#xC5BB;&#xC5B4;&#xB0B4;&#xB3C4;&#xB85D; &#xD558;&#xC600;&#xC73C;&#xB2C8;, &#xC800;&#xB294; &#xB9E4; 1&#xBD84;&#xB9C8;&#xB2E4; &#xC628;&#xB3C4;&#xB97C; &#xBCF4;&#xACE0;&#xD558;&#xB3C4;&#xB85D; &#xC124;&#xC815;&#xD588;&#xC2B5;&#xB2C8;&#xB2E4;. &#xC774; &#xB610;&#xD55C; &#xAC01;&#xC790;&#xC758; &#xC0DD;&#xAC01;&#xC5D0; &#xB530;&#xB77C; &#xC124;&#xC815;&#xD558;&#xBA74; &#xB429;&#xB2C8;&#xB2E4;.</p><p>pending period &#xC758; &#xACBD;&#xC6B0; Threshold &#xB85C; &#xC124;&#xC815;&#xB41C; &#xAC12;&#xC774; &#xC77C;&#xC815; &#xC2DC;&#xAC04;&#xB3D9;&#xC548; &#xC9C0;&#xC18D;&#xB418;&#xB294;&#xC9C0; &#xBAA8;&#xB2C8;&#xD130;&#xB9C1; &#xD6C4; fire &#xD558;&#xB3C4;&#xB85D; &#xD569;&#xB2C8;&#xB2E4;. &#xC608;&#xB97C; &#xB4E4;&#xC5B4;, 5m &#xC73C;&#xB85C; &#xC7A1;&#xC73C;&#xBA74; 5&#xBD84;&#xAC04; 70&#xB3C4; &#xC774;&#xC0C1;&#xC758; &#xC628;&#xB3C4;&#xAC00; &#xAC10;&#xC9C0;&#xB420; &#xACBD;&#xC6B0; &#xBA54;&#xC2DC;&#xC9C0;&#xAC00; &#xBC1C;&#xC1A1;&#xB429;&#xB2C8;&#xB2E4;. </p><figure class="kg-card kg-image-card"><img src="https://life.photogrammer.me/content/images/2024/02/image-39.png" class="kg-image" alt="InfluxDB + Grafana&#xB97C; &#xD1B5;&#xD574; Proxmox Host CPU &#xC628;&#xB3C4; &#xBAA8;&#xB2C8;&#xD130;&#xB9C1; &#xC2DC;&#xAC01;&#xD654; &#xBC0F; &#xC54C;&#xB9BC; &#xAD6C;&#xCD95;" loading="lazy" width="1190" height="576" srcset="https://life.photogrammer.me/content/images/size/w600/2024/02/image-39.png 600w, https://life.photogrammer.me/content/images/size/w1000/2024/02/image-39.png 1000w, https://life.photogrammer.me/content/images/2024/02/image-39.png 1190w" sizes="(min-width: 720px) 720px"></figure><p>&#xC774;&#xB807;&#xAC8C; &#xACC4;&#xC18D; threshold &#xB97C; &#xB118;&#xB294;&#xC9C0; &#xCCB4;&#xD06C;&#xD558;&#xC5EC; &#xC801;&#xD569;&#xD55C; &#xC0C1;&#xD669;&#xC5D0; fire&#xB420; &#xC218; &#xC788;&#xB3C4;&#xB85D; &#xD560; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;. &#xB9CC;&#xC57D;, &#xC989;&#xAC01;&#xC801;&#xC73C;&#xB85C; &#xBCF4;&#xB0B4;&#xACE0;&#xC790; &#xD55C;&#xB2E4;&#xBA74; 0&#xC744; &#xC9C0;&#xC815;&#xD558;&#xBA74; &#xB429;&#xB2C8;&#xB2E4;. </p><p>&#xC124;&#xC815;&#xC774; &#xC644;&#xB8CC;&#xB418;&#xACE0; &#xD14C;&#xC2A4;&#xD2B8;&#xB97C; &#xD574;&#xBCF4;&#xC558;&#xC2B5;&#xB2C8;&#xB2E4;.</p><figure class="kg-card kg-image-card"><img src="https://life.photogrammer.me/content/images/2024/02/image-41.png" class="kg-image" alt="InfluxDB + Grafana&#xB97C; &#xD1B5;&#xD574; Proxmox Host CPU &#xC628;&#xB3C4; &#xBAA8;&#xB2C8;&#xD130;&#xB9C1; &#xC2DC;&#xAC01;&#xD654; &#xBC0F; &#xC54C;&#xB9BC; &#xAD6C;&#xCD95;" loading="lazy" width="1520" height="1766" srcset="https://life.photogrammer.me/content/images/size/w600/2024/02/image-41.png 600w, https://life.photogrammer.me/content/images/size/w1000/2024/02/image-41.png 1000w, https://life.photogrammer.me/content/images/2024/02/image-41.png 1520w" sizes="(min-width: 720px) 720px"></figure><p>&#xD154;&#xB808;&#xADF8;&#xB7A8;&#xC73C;&#xB85C; &#xC54C;&#xB9BC;&#xC774; &#xC798; &#xC218;&#xC2E0;&#xB418;&#xB294; &#xAC83;&#xC744; &#xBCFC; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;. </p><p></p><p></p><p></p>]]></content:encoded></item><item><title><![CDATA[홈서버 구축기  - 서버 구입 및 초기 설정]]></title><description><![CDATA[나의 숙원사업 홈 서버 구축기]]></description><link>https://life.photogrammer.me/home-server-1/</link><guid isPermaLink="false">65be8eb5da344e0001d83418</guid><category><![CDATA[Server]]></category><dc:creator><![CDATA[Sungjun Park]]></dc:creator><pubDate>Sun, 04 Feb 2024 10:55:59 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1601462904263-f2fa0c851cb9?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDV8fGhvbWUlMjBzZXJ2ZXJ8ZW58MHx8fHwxNzA3MDQ0MTMxfDA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" medium="image"/><content:encoded><![CDATA[<img src="https://images.unsplash.com/photo-1601462904263-f2fa0c851cb9?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDV8fGhvbWUlMjBzZXJ2ZXJ8ZW58MHx8fHwxNzA3MDQ0MTMxfDA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" alt="&#xD648;&#xC11C;&#xBC84; &#xAD6C;&#xCD95;&#xAE30;  - &#xC11C;&#xBC84; &#xAD6C;&#xC785; &#xBC0F; &#xCD08;&#xAE30; &#xC124;&#xC815;"><p>&#xC5B8;&#xC820;&#xAC00; &#xB9CC;&#xB4E4;&#xC5B4;&#xBD10;&#xC57C;&#xC9C0;.. &#xD558;&#xACE0; &#xB9C8;&#xC74C; &#xBA39;&#xC5C8;&#xB358; &#xD648;&#xC11C;&#xBC84;. &#xB4DC;&#xB514;&#xC5B4; &#xAD6C;&#xCD95;&#xC744; &#xD588;&#xC2B5;&#xB2C8;&#xB2E4;. Host PC &#xAD6C;&#xB9E4;&#xBD80;&#xD130; Proxmox &#xB97C; &#xD1B5;&#xD55C; &#xAC00;&#xC0C1;&#xD654;&#xAE4C;&#xC9C0;&#xC758; &#xACFC;&#xC815;&#xC744; &#xB2F4;&#xC558;&#xC2B5;&#xB2C8;&#xB2E4;. (&#xD2F0;&#xC2A4;&#xD1A0;&#xB9AC;&#xC5D0;&#xC11C; &#xB098;&#xB220;&#xC838;&#xC788;&#xB358; &#xAE00;&#xC744; &#xD1B5;&#xD569;&#xD568;)</p><h1 id="%ED%99%88%EC%84%9C%EB%B2%84-%EA%B5%AC%EC%B6%95%ED%95%98%EA%B8%B0">&#xD648;&#xC11C;&#xBC84; &#xAD6C;&#xCD95;&#xD558;&#xAE30;</h1><h2 id="%EB%82%98%EB%8A%94-%EC%99%9C-%EC%84%9C%EB%B2%84%EB%A5%BC-%EA%B5%AC%EC%B6%95%ED%95%98%EA%B2%8C-%EB%90%98%EC%97%88%EB%82%98">&#xB098;&#xB294; &#xC65C; &#xC11C;&#xBC84;&#xB97C; &#xAD6C;&#xCD95;&#xD558;&#xAC8C; &#xB418;&#xC5C8;&#xB098;.</h2><p>&#xC5B4;&#xB9B0; &#xC2DC;&#xC808;&#xBD80;&#xD130; &#xB098;&#xB294; &quot;&#xB098;&#xB9CC;&#xC758; &#xC11C;&#xBC84;&quot;&#xAC00; &#xAC16;&#xACE0; &#xC2F6;&#xC5C8;&#xB2E4;. &#xCD5C;&#xADFC;&#xC5D0;&#xB294; &#xD074;&#xB77C;&#xC6B0;&#xB4DC;&#xB97C; &#xAC04;&#xD3B8;&#xD558;&#xAC8C; &#xC0AC;&#xC6A9;&#xD560; &#xC218; &#xC788;&#xAC8C; &#xB418;&#xBA74;&#xC11C; &#xADF8; &#xD544;&#xC694;&#xC131;&#xC774; &#xB0AE;&#xC544;&#xC9C0;&#xACE0; &#xC788;&#xC9C0;&#xB9CC; &#xC9C1;&#xC811; &#xB0B4; &#xC11C;&#xBC84; &#xADF8;&#xB9AC;&#xACE0; &#xB124;&#xD2B8;&#xC6CC;&#xD06C;&#xB97C; &#xB9CC;&#xB4E4;&#xC5B4;&#xB098;&#xAC00;&#xB294; &#xC77C;&#xC740; &#xAC00;&#xC2B4;&#xC774; &#xB450;&#xADFC;&#xB450;&#xADFC;&#xAC70;&#xB9AC;&#xB294; &#xC77C;&#xC774;&#xB2E4;.</p><p>&#xB9C8;&#xCE68; 42&#xC5D0;&#xC11C; &#xC81C;&#xACF5;&#xD558;&#xACE0; &#xC788;&#xB358; AWS Credit &#xC11C;&#xBE44;&#xC2A4;&#xAC00; &#xC885;&#xB8CC;&#xB418;&#xC5C8;&#xB2E4;. &#xC6D4; &#xD06C;&#xB808;&#xB527; $200 &#xC815;&#xB3C4; &#xC18C;&#xBAA8;&#xD558;&#xACE0; &#xC788;&#xC5C8;&#xAE30;&#xC5D0; (&#xC0AC;&#xC2E4;&#xC0C1; &#xBB34;&#xB8CC;&#xB77C;&#xACE0; &#xB108;&#xBB34; &#xD391;&#xD391;&#xC4F0;&#xAE30;&#xB294; &#xD588;&#xB2E4;.) &#xC774;&#xB97C; &#xADF8;&#xB300;&#xB85C; &#xC9C0;&#xCD9C;&#xD558;&#xB294; &#xAC83;&#xC740; &#xD070; &#xBD80;&#xB2F4;&#xC774;&#xC5C8;&#xACE0;, &#xADF8;&#xB0E5; &#xC88B;&#xC740; &#xAE30;&#xD68C;&#xB77C;&#xACE0; &#xC0DD;&#xAC01;&#xD558;&#xBA70; &#xB0B4; &#xC11C;&#xBC84;&#xB97C; &#xD558;&#xB098; &#xB9CC;&#xB4E4;&#xC5B4;&#xBCF4;&#xAE30;&#xB85C; &#xD588;&#xB2E4;.</p><p>&#xC0AC;&#xC2E4;, &#xC774;&#xC804;&#xC5D0;&#xB3C4; &#xB180;&#xACE0; &#xC788;&#xB294; &#xCEF4;&#xD4E8;&#xD130;, &#xB178;&#xD2B8;&#xBD81;&#xC73C;&#xB85C; &#xC11C;&#xBC84;&#xB97C; &#xB9CC;&#xB4DC;&#xB824;&#xB294; &#xC2DC;&#xB3C4;&#xB294; &#xB9CE;&#xC774;&#xD588;&#xC9C0;&#xB9CC; &#xADF8;&#xB2E5; &#xD65C;&#xC6A9;&#xC131;&#xC774; &#xB192;&#xC9C0; &#xC54A;&#xC558;&#xB2E4;. &#xC11C;&#xBC84;&#xC5D0; &#xD544;&#xC694;&#xD55C; &#xC9C0;&#xC2DD;&#xC774; &#xC804;&#xBB34;&#xD588;&#xAE30; &#xB54C;&#xBB38;&#xC774;&#xB2E4;. &#xADF8;&#xB7EC;&#xB098;, &#xC774;&#xC81C;&#xB294; &#xC774;&#xB798;&#xC800;&#xB798; &#xCE58;&#xC774;&#xBA74;&#xC11C; &#xC2A4;&#xC2A4;&#xB85C; &#xB9CC;&#xB4E4; &#xC900;&#xBE44;&#xAC00; &#xB418;&#xC5C8;&#xB2E4;&#xACE0; &#xC0DD;&#xAC01;&#xD55C;&#xB2E4;. </p><h2 id="%EC%84%9C%EB%B2%84%EB%A1%9C-%EC%82%AC%EC%9A%A9%ED%95%A0-%EA%B8%B0%EA%B8%B0-%EA%B5%AC%EB%A7%A4%ED%95%98%EA%B8%B0">&#xC11C;&#xBC84;&#xB85C; &#xC0AC;&#xC6A9;&#xD560; &#xAE30;&#xAE30; &#xAD6C;&#xB9E4;&#xD558;&#xAE30;</h2><p>&#xC11C;&#xBC84; &#xAD6C;&#xCD95;&#xC758; &#xC2DC;&#xC791;&#xC740; &#xC11C;&#xBC84;&#xB85C; &#xC0AC;&#xC6A9;&#xD560; &#xAE30;&#xAE30;&#xB97C; &#xAD6C;&#xB9E4;&#xD558;&#xB294; &#xAC83;&#xC774;&#xB2E4;.  &#xBCF4;&#xD1B5; &#xC5C5;&#xADF8;&#xB808;&#xC774;&#xB4DC; &#xD558;&#xBA74;&#xC11C; &#xB0A8;&#xB294; PC, &#xB178;&#xD2B8;&#xBD81;&#xC744;&#xD65C;&#xC6A9;&#xD558;&#xC5EC; &#xB9CC;&#xB4E4;&#xAC70;&#xB098;, &#xC544;&#xB2C8;&#xBA74; &#xAD6C; &#xBC84;&#xC804;&#xC758; &#xC81C;&#xC628;&#xC744; &#xC0AC;&#xC11C; &#xADF8;&#xB7F4;&#xB4EF;&#xD55C; &#xC11C;&#xBC84;&#xB97C; &#xB9CC;&#xB4E4;&#xC5B4;&#xBCF8;&#xB2E4;&#xAC70;&#xB098;, &#xC544;&#xB2C8;&#xBA74; &#xB098;&#xCC98;&#xB7FC; &#xBBF8;&#xB2C8; PC &#xB97C; &#xC0AC;&#xAE30;&#xB3C4; &#xD55C;&#xB2E4;.  </p><p>&#xB0B4; &#xACBD;&#xC6B0;&#xC5D0;&#xB294; &#xB0B4; &#xBC29; &#xC548;&#xC5D0;&#xC11C; &#xC6B4;&#xC601;&#xD574;&#xC57C;&#xD558;&#xACE0;, &#xC804;&#xAE30;&#xC138; &#xB610;&#xD55C; &#xC0DD;&#xAC01;&#xD558;&#xBA74;&#xC11C; &#xC6B4;&#xC601;&#xD574;&#xC57C;&#xD558;&#xAE30;&#xC5D0;, &quot;&#xC800;&#xC18C;&#xC74C; - &#xC800;&#xC804;&#xB825; - &#xC18C;&#xD615;&quot; &#xC774; &#xAE30;&#xAE30; &#xAD6C;&#xB9E4;&#xC758; &#xD0A4;&#xC6CC;&#xB4DC;&#xC600;&#xB2E4;. </p><h3 id="%EA%B8%B0%EC%A1%B4%EC%97%90-%EA%B0%80%EC%A7%80%EA%B3%A0-%EC%9E%88%EB%8D%98-%EB%AF%B8%EB%8B%88-%EC%84%9C%EB%B2%84">&#xAE30;&#xC874;&#xC5D0; &#xAC00;&#xC9C0;&#xACE0; &#xC788;&#xB358; &#xBBF8;&#xB2C8; &#xC11C;&#xBC84;</h3><p>&#xC55E;&#xC120; &#xBAA9;&#xC801;&#xC73C;&#xB85C; &#xC608;&#xC804;&#xC5D0; ZBOX-nano &#xC81C;&#xD488;&#xC744; &#xD558;&#xB098; &#xAD6C;&#xB9E4;&#xD574;&#xB480;&#xB2E4;.  &quot;&#xBB34;&#xC18C;&#xC74C; - &#xC800;&#xC804;&#xB825; - &#xCD08;&#xC18C;&#xD615;&quot;&#xC73C;&#xB85C; &#xC644;&#xC804;&#xD788; &#xB0B4;&#xAC00; &#xC6D0;&#xD558;&#xB294; &#xD615;&#xD0DC;&#xC758; &#xAE30;&#xAE30;&#xC600;&#xB2E4;.  &#xADF8;&#xB7EC;&#xB098;, &#xC7A0;&#xAE50; &#xC2A4;&#xD399;&#xC744; &#xC0B4;&#xD3B4;&#xBCF4;&#xBA74;</p><pre><code>CPU - Intel N4100 (1.1Ghz to 2.4Ghz)
RAM - 8GB
SSD - WD GREEN 120GB (SATA)</code></pre><p>&#xADF8;&#xB0E5; &#xC778;&#xD130;&#xB137;&#xC774;&#xB098; &#xACA8;&#xC6B0; &#xD560; &#xC131;&#xB2A5;&#xC744; &#xAC00;&#xC9C0;&#xACE0; &#xC788;&#xB2E4;.  &#xB354;&#xAD70;&#xB2E4;&#xB098; &#xBB34;&#xC18C;&#xC74C;&#xC774;&#xB77C;&#xC11C; &#xB85C;&#xB4DC;&#xAC00; &#xC624;&#xB798; &#xC9C0;&#xC18D;&#xB418;&#xBA74; &#xD070; &#xBD80;&#xB2F4;&#xC774; &#xB418;&#xC5B4;, &#xD074;&#xB7ED;&#xC774; 2Ghz&#xAE4C;&#xC9C0; &#xC798; &#xBABB;&#xAC04;&#xB2E4;. &#xC9C0;&#xAE08;&#xB3C4; &#xC0AC;&#xC6A9;&#xD558;&#xACE0;&#xB294; &#xC788;&#xC9C0;&#xB9CC;, Ghost &#xBE14;&#xB85C;&#xADF8;&#xB97C; &#xC5EC;&#xAE30;&#xC5D0; &#xC62C;&#xB838;&#xB2E4;&#xAC00; &#xC131;&#xB2A5;&#xB54C;&#xBB38;&#xC5D0; &#xB108;&#xBB34; &#xB290;&#xB824;&#xC11C; &#xC0BD;&#xC9C8;&#xC744; &#xD558;&#xAE30;&#xB3C4; &#xD588;&#xB2E4;. </p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://life.photogrammer.me/why-my-blog-is-slow-2/"><div class="kg-bookmark-content"><div class="kg-bookmark-title">&#xB0B4; Ghost blog&#xB294; &#xC65C; &#xB290;&#xB9B4;&#xAE4C;? - (2)</div><div class="kg-bookmark-description">&#xC55E;&#xC120; &#xAE00;&#xC5D0;&#xC11C; &#xB290;&#xB9B0; Ghost blog &#xC758; &#xC6D0;&#xC778;&#xC744; &#xCC3E;&#xACE0; &#xAC1C;&#xC120;(?)&#xC744; &#xD588;&#xB2E4;. &#xB0A8;&#xACA8;&#xC9C4; &#xBB38;&#xC81C;&#xB97C; &#xD574;&#xACB0;&#xD558;&#xB294; &#xACFC;&#xC815;&#xC744; &#xC0B4;&#xD3B4;&#xBCF4;&#xC790;. &#xB0A8;&#xACA8;&#xC9C4; &#xBB38;&#xC81C; &#xC11C;&#xBC84; &#xC2DC;&#xC791; &#xD6C4; &#xCCAB; &#xC811;&#xADFC;&#xC5D0;&#xC11C; 8~10 s &#xC758; &#xC2DC;&#xAC04;&#xC774; &#xC18C;&#xC694;&#xB418;&#xB294; &#xBB38;&#xC81C;&#xAC00; &#xBC1C;&#xACAC;&#xB418;&#xC5C8;&#xB2E4;. &#xADF8;&#xB7EC;&#xB098;, &#xB530;&#xB85C; &#x201D;&#xC11C;&#xBC84; &#xC2DC;&#xC791; &#xD6C4; &#xCCAB; &#xB85C;&#xB529;&#xC774; &#xC5C4;&#xCCAD; &#xB290;&#xB824;&#xC694;&#x201D; &#xB77C;&#xB294; &#xBB38;&#xC11C;&#xB97C; &#xCC3E;&#xC544;&#xBCFC; &#xC218;&#xB294; &#xC5C6;&#xC5C8;&#xB2E4;. &#xB2F5;&#xB2F5;&#xD55C; &#xB9C8;&#xC74C;&#xC5D0;, &#xC11C;&#xBC84;&#xD3EC;&#xB7FC;&#xC73C;&#xB85C; &#xAC00;&#xC11C; &#xC9C8;&#xBB38;&#xAE00;&#xC744;</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://life.photogrammer.me/content/images/size/w256h256/2024/02/android-chrome-512x512.png" alt="&#xD648;&#xC11C;&#xBC84; &#xAD6C;&#xCD95;&#xAE30;  - &#xC11C;&#xBC84; &#xAD6C;&#xC785; &#xBC0F; &#xCD08;&#xAE30; &#xC124;&#xC815;"><span class="kg-bookmark-author">Photogrammer</span><span class="kg-bookmark-publisher">Sungjun Park</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://images.unsplash.com/photo-1451187580459-43490279c0fa?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDEyfHxzZXJ2ZXJ8ZW58MHx8fHwxNzA2OTcyNjkxfDA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" alt="&#xD648;&#xC11C;&#xBC84; &#xAD6C;&#xCD95;&#xAE30;  - &#xC11C;&#xBC84; &#xAD6C;&#xC785; &#xBC0F; &#xCD08;&#xAE30; &#xC124;&#xC815;"></div></a></figure><p>&#xC544;&#xBB34;&#xD2BC;, &#xD574;&#xB2F9; &#xAE30;&#xAE30;&#xB85C;&#xB294; &#xC81C;&#xB300;&#xB85C;&#xB41C; &#xC11C;&#xBC84; &#xC6B4;&#xC601;&#xC774; &#xD798;&#xB4E4;&#xACE0; &#xAE30;&#xC874;&#xC5D0; &#xC788;&#xB358; &#xC11C;&#xBE44;&#xC2A4;&#xB97C; &#xC6B4;&#xC601;&#xD558;&#xAC70;&#xB098;, &#xC0C8;&#xB85C;&#xC6B4; &#xC11C;&#xBE44;&#xC2A4;&#xB97C; &#xD655;&#xC7A5;&#xD574;&#xC11C; &#xC6B4;&#xC601;&#xD558;&#xAE30;&#xC5D0;&#xB294; &#xC131;&#xB2A5;&#xC774; &#xAD1C;&#xCC2E;&#xC740; PC &#xAC00; &#xD558;&#xB098; &#xD544;&#xC694;&#xD588;&#xB2E4;. </p><h3 id="%EA%B5%AC%EB%A7%A4%ED%95%9C-%EC%84%9C%EB%B2%84">&#xAD6C;&#xB9E4;&#xD55C; &#xC11C;&#xBC84;</h3><p>&#xC5EC;&#xC804;&#xD788; &quot;&#xC800;&#xC18C;&#xC74C; - &#xC800;&#xC804;&#xB825; - &#xC18C;&#xD615;&quot; &#xC740; &#xCD94;&#xAD6C;&#xD574;&#xC57C;&#xD558;&#xC9C0;&#xB9CC; &#xC774;&#xBC88;&#xC5D0;&#xB294; &quot;&#xACE0;&#xC131;&#xB2A5;&quot; &#xAE4C;&#xC9C0; &#xD544;&#xC694;&#xD588;&#xB2E4;. &#xBCA0;&#xC5B4;&#xBCF8; &#xC81C;&#xD488;&#xC5D0;&#xC11C; &#xC8FC;&#xB85C; &#xCC3E;&#xC544;&#xBCF4;&#xB2E4;&#xAC00; &#xD574;&#xB2F9; &#xC81C;&#xD488;&#xC744; &#xBC1C;&#xACAC;&#xD588;&#xB2E4;.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://blog.kakaocdn.net/dn/61ouY/btsAJDJnlQC/3rgnMnpPFGLvYcXLVCUqZ1/img.jpg" class="kg-image" alt="&#xD648;&#xC11C;&#xBC84; &#xAD6C;&#xCD95;&#xAE30;  - &#xC11C;&#xBC84; &#xAD6C;&#xC785; &#xBC0F; &#xCD08;&#xAE30; &#xC124;&#xC815;" loading="lazy" width="500" height="500"><figcaption><span style="white-space: pre-wrap;">Deskmini X300</span></figcaption></figure><p>&#xBC14;&#xB85C; Deskmini X300 &#xC81C;&#xD488;&#xC774;&#xB2E4;.  &#xAE30;&#xBCF8;&#xC801;&#xC73C;&#xB85C;&#xB294; &#xCF00;&#xC774;&#xC2A4; + AMD CPU &#xAF42;&#xC744; &#xC218; &#xC788;&#xB294; &#xBCF4;&#xB4DC;&#xB97C; &#xD310;&#xB9E4;&#xD558;&#xACE0;,  CPU, RAM, SSD &#xB4F1;&#xC740; &#xC54C;&#xC544;&#xC11C; &#xAD6C;&#xB9E4;&#xD574;&#xC11C; &#xC0AC;&#xC6A9;&#xD558;&#xB294; &#xD0C0;&#xC785;&#xC774;&#xB2E4;.</p><p>&#xC1FC;&#xD551;&#xBAB0;&#xC744; &#xB4A4;&#xC838;&#xBCF4;&#xBA74; X300 &#xC5D0; 5600G / 8GB / nvme 512 &#xC774;&#xB7F0; &#xC2DD;&#xC73C;&#xB85C; &#xAC19;&#xC774; &#xC870;&#xB9BD;&#xB418;&#xC5B4; &#xD30C;&#xB294; &#xC81C;&#xD488;&#xC774; &#xC788;&#xC73C;&#xB098;, &#xC544;&#xBB34;&#xB798;&#xB3C4; &#xAC00;&#xC131;&#xBE44;&#xAC00; &#xC870;&#xAE08; &#xB5A8;&#xC5B4;&#xC9C4;&#xB2E4;. &#xC5B4;&#xCC28;&#xD53C; &#xCEF4;&#xD4E8;&#xD130;&#xB294; &#xC911;&#xACE0;&#xB85C; &#xC0AC;&#xB3C4; &#xD06C;&#xAC8C; &#xCC28;&#xC774;&#xAC00; &#xC5C6;&#xC5B4; &#xC911;&#xACE0; &#xC81C;&#xD488;&#xC744; &#xC54C;&#xC544;&#xBCF4;&#xC558;&#xB2E4;.</p><p>&#xB9C8;&#xCE68; &#xC911;&#xACE0;&#xB098;&#xB77C;&#xC5D0; &#xAC00;&#xC0C1;&#xD654; &#xC11C;&#xBC84; &#xBAA9;&#xC801;&#xC73C;&#xB85C; &#xC0AC;&#xC6A9;&#xD558;&#xB358; &#xD574;&#xB2F9; &#xC81C;&#xD488;&#xC774; &#xC788;&#xC5C8;&#xACE0;, &#xAC00;&#xACA9; &#xB610;&#xD55C; &#xC801;&#xB2F9;&#xD588;&#xB2E4;. &#xC2A4;&#xD399;&#xC740; &#xC774;&#xB7EC;&#xD558;&#xB2E4;.</p><pre><code>CPU : AMD&#xA0;4750G
RAM : 64 GB
SSD : Hynix Gold 500G</code></pre><p>4750G &#xB77C;&#xC11C; &#xC2A4;&#xB808;&#xB4DC;&#xB3C4; &#xB9CE;&#xACE0;, &#xB7A8;&#xB3C4; &#xB109;&#xB109;&#xD558;&#xAE30;&#xC5D0; &#xBC14;&#xB85C; &#xAD6C;&#xB9E4;&#xB97C; &#xD588;&#xB2E4;. &#xB2E4;&#xB9CC;, &#xAE30;&#xBCF8; &#xCFE8;&#xB7EC;&#xC758; &#xACBD;&#xC6B0; &#xAD49;&#xC7A5;&#xD788; &#xC18C;&#xC74C;&#xC774; &#xC2EC;&#xD574;&#xC11C; &#xB179;&#xD22C;&#xC544; &#xC81C;&#xD488;&#xC73C;&#xB85C; &#xAD50;&#xCCB4;&#xD588;&#xB2E4;. (&#xB179;&#xD22C;&#xC544; &#xCC98;&#xC74C; &#xC368;&#xBD24;&#xB294;&#xB370; &#xAC70;&#xC758; &#xBB34;&#xC18C;&#xC74C;&#xC774; &#xB418;&#xC5C8;&#xB2E4; &#x3137;&#x3137;..)</p><h2 id="%EA%B0%80%EC%83%81%ED%99%94">&#xAC00;&#xC0C1;&#xD654;</h2><p>&#xC11C;&#xBC84;&#xB97C; &#xAD6C;&#xB9E4;&#xD588;&#xC73C;&#xB2C8;, &#xB2E4;&#xC74C;&#xC73C;&#xB85C; &#xD560; &#xC791;&#xC5C5;&#xC740; &#xAC00;&#xC0C1;&#xD654;&#xC774;&#xB2E4;.  PC &#xC758; &#xC131;&#xB2A5;&#xC774; &#xB108;&#xBB34; &#xC88B;&#xAE30;&#xC5D0; &#xC5EC;&#xB7EC; &#xBAA9;&#xC801;&#xC73C;&#xB85C; &#xB098;&#xB204;&#xC5B4;&#xC11C; &#xC0AC;&#xC6A9;&#xD558;&#xACE0; &#xC2F6;&#xC5C8;&#xB2E4;.  NAS (Synology) | Windows | Linux &#xC774;&#xB807;&#xAC8C; &#xB2E4;&#xC591;&#xD55C; OS &#xB97C; &#xB450;&#xACE0; &#xD544;&#xC694;&#xD55C; &#xBAA9;&#xC801;&#xC5D0; &#xB530;&#xB77C; &#xC0AC;&#xC6A9;&#xD560; &#xC218; &#xC788;&#xB3C4;&#xB85D; &#xAC00;&#xC0C1;&#xD654;&#xAC00; &#xD544;&#xC694;&#xD588;&#xB2E4;.</p><p>&#xC774; &#xACFC;&#xC815;&#xC5D0;&#xC11C; Hypervisor &#xB77C;&#xB294; &#xAC83;&#xC744; &#xB4DC;&#xB514;&#xC5B4; &#xC0AC;&#xC6A9;&#xD558;&#xAC8C; &#xB418;&#xC5C8;&#xB2E4;. &#xC0AC;&#xC2E4;, Virtual Box, VMWare &#xB4F1;&#xC73C;&#xB85C; &#xC885;&#xC885; &#xC0AC;&#xC6A9;&#xD574;&#xBCF8;&#xC801;&#xC740; &#xC788;&#xC73C;&#xB098;, &#xC774;&#xB807;&#xAC8C; &#xBCA0;&#xC5B4;&#xBA54;&#xD0C8; &#xC704;&#xC5D0; &#xBC14;&#xB85C; &#xBD99;&#xC5B4;&#xC11C; OS &#xB97C; &#xC5EC;&#xB7EC;&#xAC1C; &#xB3CC;&#xB9AC;&#xACE0; &#xBAA8;&#xB2C8;&#xD130;&#xB9C1;&#xD558;&#xB294; Type 1 Hypervisor&#xB294; &#xC0AC;&#xC6A9;&#xD574;&#xBCF8; &#xC801;&#xC774; &#xC5C6;&#xC5C8;&#xB2E4;.</p><p>VMWare ESXi &#xC640; Prxmox &#xB450; &#xC81C;&#xD488; &#xC911;&#xC5D0; &#xACE0;&#xBBFC;&#xC744; &#xD588;&#xACE0; &#xB2E4;&#xC74C;&#xACFC; &#xAC19;&#xC740; &#xC774;&#xC720;&#xC5D0;&#xC11C; Proxmox &#xB97C; &#xACE8;&#xB790;&#xB2E4;.</p><ul><li>&#xC624;&#xD508;&#xC18C;&#xC2A4; / &#xBB34;&#xB8CC;</li><li>ESXi &#xC5D0;&#xC11C; &#xC81C;&#xD55C;&#xAC78;&#xC5B4;&#xB454; &#xAE30;&#xB2A5;&#xB4E4; &#xC0AC;&#xC6A9; &#xAC00;&#xB2A5;</li><li>&#xC11C;&#xBC84; &#xD3EC;&#xB7FC;&#xC5D0;&#xC11C; &#xC801;&#xADF9;&#xC801;&#xC73C;&#xB85C; &#xC0AC;&#xC6A9;&#xD558;&#xACE0; &#xC788;&#xC5B4;, &#xBB38;&#xC81C; &#xD574;&#xACB0;&#xC774; &#xC6A9;&#xC774;</li><li>&#xB9AC;&#xB205;&#xC2A4;&#xB77C;&#xC11C; &#xB0B4;&#xBD80;&#xC801;&#xC73C;&#xB85C;&#xB3C4; &#xB2E4;&#xB8E8;&#xAE30; &#xD3B8;&#xD568;.</li></ul><h2 id="%EC%84%9C%EB%B2%84-%EA%B5%AC%EC%A1%B0-%EA%B3%84%ED%9A%8D">&#xC11C;&#xBC84; &#xAD6C;&#xC870; &#xACC4;&#xD68D;</h2><p>&#xCCAB; &#xD648;&#xC11C;&#xBC84;&#xC758; &#xAD6C;&#xC870;&#xC640; &#xAE00;&#xC744; &#xC4F0;&#xB294; &#xC9C0;&#xAE08;&#xC758; &#xAD6C;&#xC870;&#xAC00; &#xC0C1;&#xB2F9;&#xD788; &#xB2E4;&#xB974;&#xB2E4;. &#xC6B0;&#xC120;&#xC740; &#xB2F9;&#xC2DC;&#xC5D0; &#xACC4;&#xD68D;&#xD55C; &#xAD6C;&#xC870;&#xB97C; &#xADF8;&#xB824;&#xBCF4;&#xACA0;&#xB2E4;.</p><h4 id="%EA%B5%AC%EC%A1%B0">&#xAD6C;&#xC870;</h4><figure class="kg-card kg-image-card"><img src="https://life.photogrammer.me/content/images/2024/02/image-26.png" class="kg-image" alt="&#xD648;&#xC11C;&#xBC84; &#xAD6C;&#xCD95;&#xAE30;  - &#xC11C;&#xBC84; &#xAD6C;&#xC785; &#xBC0F; &#xCD08;&#xAE30; &#xC124;&#xC815;" loading="lazy" width="2000" height="850" srcset="https://life.photogrammer.me/content/images/size/w600/2024/02/image-26.png 600w, https://life.photogrammer.me/content/images/size/w1000/2024/02/image-26.png 1000w, https://life.photogrammer.me/content/images/size/w1600/2024/02/image-26.png 1600w, https://life.photogrammer.me/content/images/size/w2400/2024/02/image-26.png 2400w" sizes="(min-width: 720px) 720px"></figure><p>&#xB2E8;&#xC21C;&#xD788; X300 &#xB9CC; &#xAC00;&#xC0C1;&#xD654;&#xB97C; &#xD558;&#xB294; &#xAC83;&#xC774; &#xCCAB; &#xACC4;&#xD68D;&#xC774;&#xC5C8;&#xB2E4;. ZBOX &#xC758; &#xACBD;&#xC6B0; &#xC0AC;&#xC591;&#xC774; &#xB0AE;&#xC544; Hypervisor - VM - Docker &#xAE4C;&#xC9C0; &#xC0AC;&#xC6A9;&#xD558;&#xBA74; &#xC0C1;&#xB2F9;&#xD788; &#xBD80;&#xB2F4;&#xC774; &#xB420; &#xAC83; &#xAC19;&#xC558;&#xACE0;, X300 &#xB97C; &#xC0AC;&#xC6A9;&#xD558;&#xAC8C; &#xB418;&#xBA74; &#xD06C;&#xAC8C; &#xC0AC;&#xC6A9;&#xD558;&#xC9C0; &#xC54A;&#xC744; &#xAC83; &#xAC19;&#xC544; Proxmox &#xB97C; &#xC62C;&#xB9B4; &#xACC4;&#xD68D;&#xC740; &#xC5C6;&#xC5C8;&#xB2E4;. </p><p>&#xB530;&#xB77C;&#xC11C;, Proxmox &#xB97C; X300&#xC5D0; &#xC124;&#xCE58;&#xD558;&#xACE0;, &#xB3CC;&#xC544;&#xAC00;&#xB294; VM&#xC740; &#xCD1D; 3&#xAC1C;&#xC758; &#xC6B4;&#xC601;&#xCCB4;&#xC81C; (Ubuntu / Windows / DSM ) &#xC744; &#xC124;&#xCE58;&#xD588;&#xB2E4;. &#xC124;&#xCE58; &#xACFC;&#xC815;&#xC758; &#xACBD;&#xC6B0; <a href="https://svrforum.com/">&#xC11C;&#xBC84;&#xD3EC;&#xB7FC;</a> &#xC5D0; &#xB108;&#xBB34; &#xC798; &#xC124;&#xBA85;&#xC774; &#xB418;&#xC5B4;&#xC788;&#xC5B4; &#xC0DD;&#xB7B5;..</p><h4 id="%EC%9A%94%EC%B2%AD-%EA%B2%BD%EB%A1%9C-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC">&#xC694;&#xCCAD; &#xACBD;&#xB85C; (&#xB124;&#xD2B8;&#xC6CC;&#xD06C;)</h4><p>&#xADF8;&#xB9AC;&#xACE0; &#xC11C;&#xBC84;&#xB85C;&#xC758; &#xC694;&#xCCAD;&#xC740; &#xB2E4;&#xC74C;&#xACFC; &#xAC19;&#xC774; &#xAC04;&#xB7B5;&#xD558;&#xAC8C; &#xC7A1;&#xC558;&#xB2E4;.</p><figure class="kg-card kg-image-card"><img src="https://life.photogrammer.me/content/images/2024/02/image-27.png" class="kg-image" alt="&#xD648;&#xC11C;&#xBC84; &#xAD6C;&#xCD95;&#xAE30;  - &#xC11C;&#xBC84; &#xAD6C;&#xC785; &#xBC0F; &#xCD08;&#xAE30; &#xC124;&#xC815;" loading="lazy" width="1856" height="1075" srcset="https://life.photogrammer.me/content/images/size/w600/2024/02/image-27.png 600w, https://life.photogrammer.me/content/images/size/w1000/2024/02/image-27.png 1000w, https://life.photogrammer.me/content/images/size/w1600/2024/02/image-27.png 1600w, https://life.photogrammer.me/content/images/2024/02/image-27.png 1856w" sizes="(min-width: 720px) 720px"></figure><p>&#xB2E8;&#xC21C;&#xD788; &#xD3EC;&#xD2B8; &#xD3EC;&#xC6CC;&#xB529;&#xC744; &#xD1B5;&#xD574;&#xC11C; Ubuntu &#xC758; Docker container &#xB85C; &#xB3D9;&#xC791;&#xD558;&#xACE0; &#xC788;&#xB294; nginx &#xB85C; &#xB3C4;&#xB2EC;&#xD558;&#xACE0;, &#xB2E4;&#xC2DC; nginx &#xC5D0;&#xC11C;&#xB294; &#xB0B4;&#xBD80; &#xB9DD;&#xC5D0; &#xC874;&#xC7AC;&#xD558;&#xB294; &#xC11C;&#xBE44;&#xC2A4;&#xB85C; Reverse proxy &#xD558;&#xB294; &#xAD6C;&#xC870;&#xC774;&#xB2E4;.</p><p>&#xB2E4;&#xB9CC;, &#xB108;&#xBB34; &#xB2E8;&#xC21C;&#xD558;&#xAC8C; &#xAD6C;&#xC131;&#xC744; &#xD574;&#xB46C;&#xC11C; &#xC774;&#xD6C4;&#xC5D0; &#xBCF4;&#xC548;&#xC801;&#xC73C;&#xB85C; &#xCDE8;&#xC57D;&#xD55C; &#xBD80;&#xBD84;&#xB4E4;&#xC774; &#xB9CE;&#xC774; &#xBCF4;&#xC600;&#xB2E4;. &#xC608;&#xB97C; &#xB4E4;&#xC5B4;, &#xB0B4;&#xBD80; &#xAD00;&#xB9AC; &#xC11C;&#xBE44;&#xC2A4;&#xC5D0; &#xB300;&#xD55C; &#xC811;&#xADFC; &#xB610;&#xD55C; <code>*.photogrammer.me</code> &#xB97C; &#xD1B5;&#xD574;&#xC11C; &#xC811;&#xADFC;&#xC774; &#xAC00;&#xB2A5;&#xD558;&#xB3C4;&#xB85D; &#xD574;&#xB450;&#xC5C8;&#xB294;&#xB370;, nginx &#xC5D0;&#xC11C; &#xB0B4;&#xBD80; &#xB9DD;&#xC73C;&#xB85C;&#xB9CC; &#xC81C;&#xD55C;&#xC744; &#xAC78;&#xB354;&#xB77C;&#xB3C4; IP &#xC2A4;&#xD478;&#xD551;&#xC744; &#xD1B5;&#xD574;&#xC11C; &#xC811;&#xADFC;&#xC774; &#xAC00;&#xB2A5;&#xD558;&#xAE30;&#xB3C4; &#xD558;&#xC600;&#xB2E4;. &#xC774;&#xB7F0; &#xBD80;&#xBD84;&#xB4E4;&#xC744; &#xCD94;&#xD6C4;&#xC5D0; VPN &#xACFC; &#xAD00;&#xB9AC; &#xC791;&#xC5C5;&#xC5D0; &#xB300;&#xD55C; &#xD638;&#xC2A4;&#xD2B8; &#xBD84;&#xB9AC; &#xB4F1;&#xC744; &#xD1B5;&#xD574;&#xC11C; &#xD574;&#xACB0;&#xD558;&#xC600;&#xB2E4;.</p>
<h4 id="vm-%ED%99%9C%EC%9A%A9-%EB%B0%A9%EC%95%88">VM &#xD65C;&#xC6A9; &#xBC29;&#xC548;</h4><h5 id="ubuntu">Ubuntu</h5><p>&#xAE30;&#xBCF8; &#xBAA9;&#xC801;&#xC740; &#xB2E4;&#xC591;&#xD55C; Docker container &#xB97C; &#xC62C;&#xB9AC;&#xB294; &#xAC83;&#xC774;&#xB2E4;.  &#xCEE8;&#xD14C;&#xC774;&#xB108;&#xAC00; &#xC544;&#xB2C8;&#xB77C;, &#xC798;&#xAC8C; VM &#xC744; &#xCABC;&#xAC1C;&#xC11C; (EC2&#xCC98;&#xB7FC;) &#xC0AC;&#xC6A9;&#xD560; &#xC218;&#xB3C4; &#xC788;&#xACA0;&#xC9C0;&#xB9CC;, &#xAD00;&#xB9AC;&#xC801;&#xC778; &#xCE21;&#xBA74;&#xC774;&#xB098;, &#xC804;&#xCCB4; &#xC790;&#xC6D0; &#xC18C;&#xBAA8; &#xCE21;&#xBA74;&#xC5D0;&#xC11C;&#xB098; OS &#xD558;&#xB098; &#xB450;&#xACE0; &#xB3C4;&#xCEE4;&#xB85C; &#xC0AC;&#xC6A9;&#xD558;&#xB294; &#xAC83;&#xC774; &#xC870;&#xAE08; &#xB354; &#xB0AB;&#xB2E4;&#xACE0; &#xD310;&#xB2E8;&#xD588;&#xB2E4;.  &#xC774;&#xD6C4; k8s &#xAD00;&#xB828; &#xC9C0;&#xC2DD;&#xC744; &#xC880; &#xC2B5;&#xB4DD;&#xD558;&#xACE0; &#xB098;&#xBA74;, Docker &#xBCF4;&#xB2E4; K8s &#xB97C; &#xD1B5;&#xD574;&#xC11C; &#xC11C;&#xBE44;&#xC2A4;&#xB4E4;&#xC744; &#xAD00;&#xB9AC;&#xD574;&#xBCFC; &#xACC4;&#xD68D;&#xC774;&#xB2E4;.</p><p>&#xD604;&#xC7AC;&#xB294; &#xADF8;&#xB0E5; Docker &#xB85C; &#xAD00;&#xB9AC;&#xD558;&#xC9C0;&#xB294; &#xC54A;&#xACE0;, Dockge &#xB77C;&#xB294; docker &#xB97C; &#xB9E4;&#xB2C8;&#xC9D5; &#xD560; &#xC218; &#xC788;&#xB294; &#xB3C4;&#xAD6C;&#xB97C; &#xD1B5;&#xD574;&#xC11C; &#xAD00;&#xB9AC;&#xD558;&#xACE0; &#xC788;&#xB2E4;. &#xC11C;&#xBC84;&#xD3EC;&#xB7FC;&#xC744; &#xD1B5;&#xD574; &#xC18C;&#xAC1C;&#xBC1B;&#xC544;&#xC11C; &#xC0AC;&#xC6A9;&#xD558;&#xACE0; &#xC788;&#xB294;&#xB370; &#xC0DD;&#xAC01;&#xBCF4;&#xB2E4; &#xD3B8;&#xD558;&#xB2E4;. &#xB098;&#xC911;&#xC5D0; &#xD55C;&#xBC88; &#xC18C;&#xAC1C;&#xD574;&#xBCF4;&#xACA0;&#xB2E4;.</p><h5 id="dsm-synology">DSM (Synology)</h5><p>&#xC62C;&#xD574; &#xBD80;&#xB85C; OneDrive, Google Drive &#xB4F1; &#xD559;&#xAD50; &#xACC4;&#xC815;&#xC744; &#xD1B5;&#xD574;&#xC11C; &#xC81C;&#xACF5;&#xBC1B;&#xACE0; &#xC788;&#xB358; &#xD074;&#xB77C;&#xC6B0;&#xB4DC; &#xB4DC;&#xB77C;&#xC774;&#xBE0C;&#xC5D0; &#xB300;&#xD55C; &#xC811;&#xADFC;&#xC774; &#xC81C;&#xD55C;&#xB418;&#xC5C8;&#xB2E4;. &#xB530;&#xB77C;&#xC11C;, &#xAE30;&#xC874;&#xC758; &#xB370;&#xC774;&#xD130;&#xB97C; &#xC880; &#xC62E;&#xACA8;&#xB458; &#xACF3;&#xC774; &#xD544;&#xC694;&#xD588;&#xACE0; &#xD5E4;&#xB180;&#xB85C;&#xC9C0;&#xB97C; &#xC62C;&#xB824;&#xC11C; &#xD574;&#xACB0;&#xD558;&#xAE30;&#xB85C; &#xD588;&#xB2E4;.</p><p>&#xC774;&#xB97C; &#xC704;&#xD574;&#xC11C; &#xAE30;&#xC874;&#xC5D0; &#xC678;&#xC7A5; SSD &#xB85C; &#xC4F0;&#xACE0; &#xC788;&#xC5C8;&#xB358; SSD&#xB97C; X300 &#xC5D0; &#xC2EC;&#xC5C8;&#xACE0;, Proxmox &#xB0B4;&#xC5D0;&#xC11C; &#xC2A4;&#xD1A0;&#xB9AC;&#xC9C0;&#xB85C; &#xB123;&#xC5B4;&#xB450;&#xC5C8;&#xB2E4;. DSM &#xC5D0;&#xC11C;&#xB3C4; &#xB3C4;&#xCEE4; &#xCEE8;&#xD14C;&#xC774;&#xB108; &#xC791;&#xB3D9;&#xC774; &#xAC00;&#xB2A5;&#xD558;&#xC9C0;&#xB9CC;, DSM &#xC790;&#xCCB4;&#xB294; &#xD074;&#xB77C;&#xC6B0;&#xB4DC; &#xB4DC;&#xB77C;&#xC774;&#xBE0C;&#xC758; &#xC131;&#xACA9;&#xC73C;&#xB85C; &#xC0AC;&#xC6A9;&#xD558;&#xAE30;&#xB85C; &#xD558;&#xC5EC; &#xCEF4;&#xD4E8;&#xD305; &#xC131;&#xB2A5;&#xC744; &#xB0AE;&#xAC8C; &#xC7A1;&#xC544;&#xB450;&#xC5C8;&#xACE0;, &#xB300;&#xBD80;&#xBD84; &#xC800;&#xC7A5;&#xB41C; &#xC815;&#xBCF4;&#xB97C; &#xD1B5;&#xD574;&#xC11C; &#xBB34;&#xC5B8;&#xAC00;&#xB97C; &#xD560; &#xC218; &#xC788;&#xB294; &#xC131;&#xACA9;&#xC758; &#xC11C;&#xBE44;&#xC2A4;&#xB4E4;&#xB9CC; &#xC62C;&#xB824;&#xB450;&#xB824;&#xACE0; &#xD55C;&#xB2E4;.</p><h5 id="windows">Windows</h5><p>Windows &#xC758; &#xACBD;&#xC6B0; &#xC77C;&#xBD80; &#xC708;&#xB3C4;&#xC6B0;&#xB97C; &#xD1B5;&#xD574;&#xC11C;&#xB9CC; &#xAC00;&#xB2A5;&#xD55C; &#xC791;&#xC5C5;&#xC744; &#xD558;&#xAC70;&#xB098;,  &#xAC00;&#xBCCD;&#xAC8C; RDP &#xB97C; &#xD1B5;&#xD574;&#xC11C; &#xCF54;&#xB529; &#xD558;&#xB294; &#xC6A9;&#xB3C4;&#xB85C; &#xC120;&#xC815;&#xD574;&#xB450;&#xC5C8;&#xB2E4;. &#xB2E4;&#xB9CC;, &#xC2E4;&#xC81C;&#xB85C; &#xC124;&#xCE58;&#xD558;&#xACE0; &#xC0AC;&#xC6A9;&#xD588;&#xC744; &#xB54C; Linux &#xB098; DSM &#xACFC; &#xB2EC;&#xB9AC; &#xBA54;&#xBAA8;&#xB9AC;&#xAC00; &#xC2E4;&#xC81C; &#xC0AC;&#xC6A9;&#xB7C9;&#xC5D0; &#xB530;&#xB77C; &#xC99D;&#xAC00;&#xD558;&#xC9C0; &#xC54A;&#xACE0;, &#xCD08;&#xAE30;&#xC5D0; 16&#xAE30;&#xAC00;&#xB97C; &#xD560;&#xB2F9;&#xD558;&#xBA74; &#xADF8;&#xB300;&#xB85C; &#xC0AC;&#xC6A9; &#xC0C1;&#xD0DC;&#xB85C; &#xD560;&#xB2F9;&#xB418;&#xC5B4;&#xBC84;&#xB9AC;&#xB294; &#xBB38;&#xC81C;&#xAC00; &#xC788;&#xC5C8;&#xB2E4;. &#xC774;&#xB294; Windows &#xAC00; &#xBD80;&#xD305;&#xACFC; &#xB3D9;&#xC2DC;&#xC5D0; &#xBA54;&#xBAA8;&#xB9AC; &#xC601;&#xC5ED;&#xC744; 0&#xC73C;&#xB85C; &#xCD08;&#xAE30;&#xD654;&#xD558;&#xBA70; &#xC811;&#xADFC;&#xD558;&#xAE30;&#xC5D0; &#xBC1C;&#xC0DD;&#xD558;&#xB294; &#xBB38;&#xC81C;&#xB85C;, &#xB531;&#xD788; &#xD574;&#xACB0;&#xC744; &#xD560; &#xC218;&#xB294; &#xC5C6;&#xC5C8;&#xB2E4;. </p><p>&#xB54C;&#xBB38;&#xC5D0;, &#xC77C;&#xBC18;&#xC801;&#xC73C;&#xB85C; &#xBA54;&#xBAA8;&#xB9AC;&#xB97C; &#xC815;&#xD655;&#xD558;&#xAC8C; &#xB098;&#xB220;&#xC11C; &#xC0AC;&#xC6A9;&#xD558;&#xAE30;&#xB294; &#xD558;&#xC9C0;&#xB9CC;,  &#xB0B4; &#xACBD;&#xC6B0; &#xB2E4;&#xB978; OS &#xCABD;&#xC5D0; &#xB354; &#xB109;&#xB109;&#xD558;&#xAC8C; &#xC8FC;&#xACE0;, &#xACB9;&#xCE58;&#xB3C4;&#xB85D; &#xC0AC;&#xC6A9;&#xD558;&#xB824;&#xACE0; &#xD558;&#xB294; &#xACC4;&#xD68D;&#xC740; &#xBB3C;&#xAC70;&#xD488;&#xC774; &#xB418;&#xC5C8;&#xB2E4;. (&#xB9CC;&#xC57D;, &#xACB9;&#xCE58;&#xB294; &#xC21C;&#xAC04;&#xC774; &#xC624;&#xBA74; &#xADF8;&#xB0E5; &#xC885;&#xB8CC;&#xB41C;&#xB2E4;.) &#xB2E4;&#xB9CC;, &#xB7A8; &#xC790;&#xCCB4;&#xAC00; &#xB109;&#xB109;&#xD574;&#xC11C; &#xC544;&#xC9C1;&#xC740; &#xADF8;&#xB0E5; &#xB109;&#xB109;&#xD558;&#xAC8C; &#xC8FC;&#xACE0; &#xC0AC;&#xC6A9; &#xC911;&#xC774;&#xB2E4;.</p><h2 id="%EC%B4%88%EA%B8%B0-%EC%84%A4%EC%A0%95%EC%9D%80-%EB%81%9D%EB%82%AC%EB%8B%A4">&#xCD08;&#xAE30; &#xC124;&#xC815;&#xC740; &#xB05D;&#xB0AC;&#xB2E4;.</h2><p>&#xCD08;&#xAE30; &#xC124;&#xC815;&#xC740; &#xC774;&#xC815;&#xB3C4;&#xB85C; &#xB9C8;&#xBB34;&#xB9AC;&#xD588;&#xC5C8;&#xB2E4;. &#xB2E4;&#xB9CC;, &#xC774;&#xB294; 11&#xC6D4; &#xCBE4; &#xAD6C;&#xC131;&#xD588;&#xB358; &#xAD6C;&#xC131;&#xC774;&#xC5C8;&#xACE0;, &#xC9C0;&#xAE08;&#xC740; &#xBC14;&#xB010; &#xAC83;&#xB4E4;&#xC774; &#xC788;&#xB2E4;. &#xC774;&#xD6C4; &#xD3EC;&#xC2A4;&#xD305;&#xC5D0;&#xC11C;&#xB294; &#xC11C;&#xBC84;&#xB97C; &#xC5B4;&#xB5A4; &#xC2DD;&#xC73C;&#xB85C; &#xBCC0;&#xD654;&#xD574;&#xC654;&#xB294;&#xC9C0; &#xD55C;&#xBC88; &#xC124;&#xBA85;&#xD574;&#xBCF4;&#xACA0;&#xB2E4;.</p>]]></content:encoded></item></channel></rss>