<?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[Hameln's Cafe]]></title><description><![CDATA[JavaScript, Web]]></description><link>https://blog.cinntiq.synology.me/</link><image><url>https://blog.cinntiq.synology.me/favicon.png</url><title>Hameln&apos;s Cafe</title><link>https://blog.cinntiq.synology.me/</link></image><generator>Ghost 5.62</generator><lastBuildDate>Wed, 06 May 2026 12:15:58 GMT</lastBuildDate><atom:link href="https://blog.cinntiq.synology.me/rss/" rel="self" type="application/rss+xml"/><ttl>60</ttl><item><title><![CDATA[HTTPS 보안]]></title><description><![CDATA[HTTPS란 암호로 통신해서 보안을 높이는 프로토콜입니다. ]]></description><link>https://blog.cinntiq.synology.me/https/</link><guid isPermaLink="false">66a5da503fe881000168f8c9</guid><category><![CDATA[HTTP]]></category><dc:creator><![CDATA[Hameln]]></dc:creator><pubDate>Mon, 29 Jul 2024 08:56:10 GMT</pubDate><content:encoded><![CDATA[<h3 id="https%EC%99%80-%EB%B3%B4%EC%95%88">HTTPS&#xC640; &#xBCF4;&#xC548;</h3><p>&#x2003;&#xBCF4;&#xC548;&#xACFC; &#xC554;&#xD638;&#xB294; &#xB5C4;&#xB808;&#xC57C; &#xB5C4; &#xC218; &#xC5C6;&#xB294; &#xAD00;&#xACC4;&#xC785;&#xB2C8;&#xB2E4;. &#xC554;&#xD638;&#xC758; &#xC5ED;&#xC0AC;&#xB294; &#xAE41;&#xB2C8;&#xB2E4;. &#xACE0;&#xB300; &#xADF8;&#xB9AC;&#xC2A4;&#xC5D0;&#xC120; &#xC804;&#xC7C1; &#xC2DC; &#xC815;&#xBCF4;&#xB97C; &#xC544;&#xAD70;&#xB4E4;&#xB9CC; &#xC54C;&#xB3C4;&#xB85D; &#xC554;&#xD638;&#xB97C; &#xC37C;&#xACE0;, &#xC911;&#xC138; &#xBC30;&#xACBD;&#xC758; &#xCC3D;&#xC791;&#xBB3C;&#xC744; &#xBCF4;&#xBA74; &#xC2E4;&#xB9C1; &#xC641;&#xC2A4;&#xB85C; &#xD3B8;&#xC9C0;&#xB97C; &#xBD09;&#xD558;&#xAC70;&#xB098;, &#xD2B9;&#xC815; &#xB2E8;&#xC5B4;&#xB97C; &#xCE58;&#xD658;&#xD558;&#xAC70;&#xB098; &#xC740;&#xC720;&#xB97C; &#xC0AC;&#xC6A9;&#xD558;&#xC8E0;. &#xC774;&#xCC98;&#xB7FC; &#xBA54;&#xC2DC;&#xC9C0; &#xBC1C;&#xAC01;&#xACFC; &#xBCC0;&#xC870;&#xB97C; &#xB9C9;&#xB294; &#xB178;&#xB825;&#xC740; &#xB04A;&#xC784;&#xC5C6;&#xC5C8;&#xC2B5;&#xB2C8;&#xB2E4;. </p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://blog.cinntiq.synology.me/content/images/2024/07/olga-vilkha-Xab99-PutvA-unsplash.jpg" class="kg-image" alt loading="lazy" width="2000" height="1333" srcset="https://blog.cinntiq.synology.me/content/images/size/w600/2024/07/olga-vilkha-Xab99-PutvA-unsplash.jpg 600w, https://blog.cinntiq.synology.me/content/images/size/w1000/2024/07/olga-vilkha-Xab99-PutvA-unsplash.jpg 1000w, https://blog.cinntiq.synology.me/content/images/size/w1600/2024/07/olga-vilkha-Xab99-PutvA-unsplash.jpg 1600w, https://blog.cinntiq.synology.me/content/images/size/w2400/2024/07/olga-vilkha-Xab99-PutvA-unsplash.jpg 2400w" sizes="(min-width: 720px) 720px"><figcaption>&#xC774;&#xBBF8;&#xC9C0; &#xCD9C;&#xCC98;: https://unsplash.com/ko/%EC%82%AC%EC%A7%84/%EC%A2%85%EC%9D%B4-%EC%9C%84%EC%97%90-%EB%86%93%EC%9D%B8-%EC%99%81%EC%8A%A4-%EC%8A%A4%ED%83%AC%ED%94%84-Xab99-PutvA?utm_content=creditShareLink&amp;utm_medium=referral&amp;utm_source=unsplash</figcaption></figure><p>&#x2003;&#xC0AC;&#xB78C;&#xC774; &#xAE30;&#xC5B5;&#xD558;&#xACE0; &#xC368;&#xC57C; &#xD558;&#xBBC0;&#xB85C; &#xCD08;&#xAE30; &#xC554;&#xD638;&#xD654;(encryption, encoding), &#xBCF5;&#xD638;&#xD654;(decryption, decoding)&#xBC29;&#xBC95;&#xC740; &#xC5B4;&#xB835;&#xC9C0; &#xC54A;&#xC558;&#xC2B5;&#xB2C8;&#xB2E4;. &#xA0;&#xD558;&#xC9C0;&#xB9CC; &#xC774;&#xB294; &#xD5C8;&#xC220;&#xD55C; &#xBCF4;&#xC548;&#xC774;&#xC5C8;&#xACE0;, &#xC0AC;&#xB78C;&#xB4E4;&#xC740; &#xC810;&#xC810; &#xB354; &#xBCF5;&#xC7A1;&#xD55C; &#xC554;&#xD638;&#xB97C; &#xB3C4;&#xC785;&#xD588;&#xC2B5;&#xB2C8;&#xB2E4;.</p><h3 id="%EC%95%94%ED%98%B8-%ED%82%A4">&#xC554;&#xD638; &#xD0A4;</h3><p>&#x2003;&#xD604;&#xB300; &#xC554;&#xD638; &#xCCB4;&#xACC4;&#xB294; &#xD558;&#xB098;&#xC758; &#xC554;&#xD638;&#xD654; &#xC54C;&#xACE0;&#xB9AC;&#xC998;&#xC744; &#xAC00;&#xC9C0;&#xB418;, &#xC554;&#xD638; &#xD0A4;&#xC5D0; &#xB530;&#xB77C;&#xC11C;&#xB9CC; &#xC554;&#xD638;&#xD654;&#xAC00; &#xB2EC;&#xB77C;&#xC9C0;&#xB294; &#xAD6C;&#xC870;&#xB97C; &#xB9CE;&#xC774; &#xC501;&#xB2C8;&#xB2E4;. &#xC774;&#xB294; &#xCF00;&#xB974;&#xD06C;&#xD638;&#xD504;&#xC2A4;&#xC758; &#xC6D0;&#xB9AC;(kerckhoffs&apos;s principle)&#xC5D0; &#xB530;&#xB985;&#xB2C8;&#xB2E4;. <strong>&#xC554;&#xD638; &#xCCB4;&#xACC4; &#xC790;&#xCCB4;&#xB294; &#xBE44;&#xBC00;&#xC2A4;&#xB7EC;&#xC6B8; &#xD544;&#xC694;&#xAC00; &#xC5C6;&#xC744; &#xBFD0;&#xB354;&#xB7EC;, &#xC801;&#xC5D0;&#xAC8C; &#xB118;&#xC5B4;&#xAC00;&#xB354;&#xB77C;&#xB3C4; &#xC544;&#xBB34;&#xB7F0; &#xBB38;&#xC81C;&#xAC00; &#xC5C6;&#xC5B4;&#xC57C; &#xD569;&#xB2C8;&#xB2E4;. &#xD0A4;&#xC758; &#xBE44;&#xBC00;&#xC131;&#xB9CC; &#xC9C0;&#xD0A4;&#xBA74; &#xB418;&#xB294; &#xC2DC;&#xC2A4;&#xD15C;&#xC774; &#xC911;&#xC694;&#xD569;&#xB2C8;&#xB2E4;.</strong></p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://blog.cinntiq.synology.me/content/images/2024/07/mceclip5-6384577650035.png" class="kg-image" alt loading="lazy" width="854" height="823" srcset="https://blog.cinntiq.synology.me/content/images/size/w600/2024/07/mceclip5-6384577650035.png 600w, https://blog.cinntiq.synology.me/content/images/2024/07/mceclip5-6384577650035.png 854w" sizes="(min-width: 720px) 720px"><figcaption>&#xC774;&#xBBF8;&#xC9C0; &#xCD9C;&#xCC98;: https://encyclopedia.pub/entry/36775</figcaption></figure><p>&#x2003;&#xB0B4;&#xAC00; &quot;Hello Alice!&quot;&#xB97C; &#xADF8;&#xB300;&#xB85C; &#xBCF4;&#xB0B4;&#xBA74; &#xB204;&#xAD70;&#xAC00;&#xAC00; &#xD6D4;&#xCCD0;&#xBCFC; &#xC218; &#xC788;&#xC73C;&#xBBC0;&#xB85C;, &#xC554;&#xD638; 6EB69570...&#xC73C;&#xB85C; &#xBCC0;&#xD658;&#xD574;&#xC11C; &#xBCF4;&#xB0C5;&#xB2C8;&#xB2E4;. Alice&#xB294; &#xC554;&#xD638;&#xB97C; &#xBC1B;&#xC544;&#xC11C; &quot;Hello Alice!&quot;&#xB77C;&#xB294; &#xBB38;&#xC7A5;&#xC73C;&#xB85C; &#xD574;&#xB3C5;&#xD574;&#xC11C; &#xC77D;&#xC8E0;.<br>&#x2003;&#xC774;&#xB294; &#xAC04;&#xACB0;&#xD558;&#xBA74;&#xC11C;&#xB3C4; &#xC9C1;&#xC811; &#xD30C;&#xD6FC;&#xD558;&#xAE30;&#xB294; &#xAD49;&#xC7A5;&#xD788; &#xC5B4;&#xB824;&#xC6B4; &#xBCF4;&#xC548; &#xC2DC;&#xC2A4;&#xD15C;&#xC785;&#xB2C8;&#xB2E4;. &#xAC1C;&#xC778; &#xC554;&#xD638;<strong> &#xD0A4;&#xB97C; &#xB9E4;&#xBC88; &#xBC14;&#xAFD4;&#xC11C; &#xC4F4;&#xB2E4;&#xBA74; &#xBCF4;&#xC548;&#xC740; &#xB354;&#xC6B1; &#xCCA0;&#xC800;</strong>&#xD574;&#xC9C0;&#xACA0;&#xC8E0;.</p><h3 id="https%EC%99%80-tls">HTTPS&#xC640; TLS</h3><p>&#x2003;HTTPS&#xB294; &#xC6F9; &#xC694;&#xCCAD;&#xC5D0; &#xC704;&#xC758; &#xBC29;&#xC2DD;&#xC744; &#xC801;&#xC6A9;&#xD55C; &#xAC1C;&#xB150;&#xC785;&#xB2C8;&#xB2E4;. SSL &#xD639;&#xC740; TLS(Transport Layer Security)&#xB77C;&#xB294; &#xD504;&#xB85C;&#xD1A0;&#xCF5C;&#xC744; &#xAC70;&#xCCD0;&#xC11C; &#xD2B8;&#xB798;&#xD53D;&#xC744; &#xC554;&#xD638;&#xB85C; &#xBC14;&#xAFC9;&#xB2C8;&#xB2E4;.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://blog.cinntiq.synology.me/content/images/2024/07/Difference-Between-HTTP-and-HTTPS.webp" class="kg-image" alt loading="lazy" width="648" height="520" srcset="https://blog.cinntiq.synology.me/content/images/size/w600/2024/07/Difference-Between-HTTP-and-HTTPS.webp 600w, https://blog.cinntiq.synology.me/content/images/2024/07/Difference-Between-HTTP-and-HTTPS.webp 648w"><figcaption>&#xC774;&#xBBF8;&#xC9C0; &#xCD9C;&#xCC98;: https://www.edhotels.com/http-vs-https-the-difference-and-everything-you-need-to-know/</figcaption></figure><p>&#x2003;&#xAE30;&#xC874; HTTP &#xD1B5;&#xC2E0;&#xC740; &#xC694;&#xCCAD;&#xACFC; &#xC751;&#xB2F5; &#xBA54;&#xC2DC;&#xC9C0; &#xB0B4;&#xC6A9;&#xC774; &#xACE0;&#xC2A4;&#xB780;&#xD788; &#xB178;&#xCD9C;&#xB429;&#xB2C8;&#xB2E4;. &#xBA54;&#xC2DC;&#xC9C0;&#xAC00; &#xC911;&#xAC04;&#xC5D0; &#xD0C8;&#xCDE8;&#xB2F9;&#xD55C;&#xB2E4;&#xBA74; &#xC911;&#xC694;&#xD55C; &#xC815;&#xBCF4;&#xAC00; &#xB4E4;&#xD0A4;&#xC8E0;. <strong>&#xC6B0;&#xB9AC;&#xB294; &#xD3C9;&#xBC94;&#xD558;&#xAC8C; &#xC791;&#xC131;&#xD55C; &#xC694;&#xCCAD;&#xACFC; &#xC751;&#xB2F5;&#xC744; &#xC8FC;&#xACE0;&#xBC1B;&#xC9C0;&#xB9CC;, HTTPS&#xAC00; &#xC790;&#xB3D9;&#xC73C;&#xB85C; &#xC554;&#xD638;&#xD654;&#xC640; &#xBCF5;&#xD638;&#xD654;&#xB97C; &#xC218;&#xD589;</strong>&#xD569;&#xB2C8;&#xB2E4;. HTTPS&#xAC00; &#xD544;&#xC218;&#xC778; &#xC774;&#xC720;&#xC785;&#xB2C8;&#xB2E4;.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://blog.cinntiq.synology.me/content/images/2024/07/SSLTLShandshake.jpg" class="kg-image" alt loading="lazy" width="751" height="376" srcset="https://blog.cinntiq.synology.me/content/images/size/w600/2024/07/SSLTLShandshake.jpg 600w, https://blog.cinntiq.synology.me/content/images/2024/07/SSLTLShandshake.jpg 751w" sizes="(min-width: 720px) 720px"><figcaption>&#xC774;&#xBBF8;&#xC9C0; &#xCD9C;&#xCC98;: https://www.geeksforgeeks.org/what-is-ssl-tls-handshake/</figcaption></figure><p>&#x2003;TLS &#xD578;&#xB4DC;&#xC170;&#xC774;&#xD06C;&#xB294; &#xD074;&#xB77C;&#xC774;&#xC5B8;&#xD2B8;&#xC640; &#xC11C;&#xBC84;&#xAC00; &#xC11C;&#xB85C; &#xC5B4;&#xB5BB;&#xAC8C; &#xC554;&#xD638;&#xB97C; &#xC8FC;&#xACE0; &#xBC1B;&#xC744;&#xC9C0; &#xD611;&#xC758;&#xD558;&#xACE0; &#xC554;&#xD638; &#xD0A4;&#xB97C; &#xC8FC;&#xACE0;&#xBC1B;&#xC2B5;&#xB2C8;&#xB2E4;. &#xC554;&#xD638; &#xD0A4;&#xB294; <strong>&#xD1B5;&#xC2E0;&#xC774; &#xC0C8;&#xB85C; &#xC5F4;&#xB9B4; &#xB54C;&#xB9C8;&#xB2E4; &#xBC1C;&#xAE09;</strong>&#xD558;&#xBA70; &#xC774;&#xB97C; &#xC138;&#xC158; &#xD0A4;&#xB77C;&#xACE0;&#xB3C4; &#xBD80;&#xB985;&#xB2C8;&#xB2E4;. <strong>&#xC554;&#xD638;&#xD654; &#xD328;&#xD134;&#xC774; &#xB9E4;&#xBC88; &#xB2EC;&#xB77C;</strong>&#xC9C0;&#xBBC0;&#xB85C; &#xBCF4;&#xC548;&#xC774; &#xC5C4;&#xC911;&#xD574;&#xC9C0;&#xACA0;&#xC8E0;.<br>&#x2003;&#xD604;&#xB300;&#xC5D0;&#xB294; 256&#xBE44;&#xD2B8; &#xC554;&#xD638; &#xD0A4;&#xB97C; &#xC9C0;&#xC6D0;&#xD558;&#xB294; &#xC11C;&#xBE44;&#xC2A4;&#xAC00; &#xD754;&#xD55C;&#xB370;, &#xC774;&#xB294; 2&#xC758; 256&#xC81C;&#xACF1; &#xB9CC;&#xD07C;&#xC758; &#xCF00;&#xC774;&#xC2A4;&#xAC00; &#xBC1C;&#xC0DD;&#xD55C;&#xB2E4;&#xB294; &#xB73B;&#xC774;&#xACE0;, 1&#xCD08;&#xC5D0; 1&#xC870; &#xAC00;&#xC9C0; &#xCF00;&#xC774;&#xC2A4;&#xB97C; &#xC2DC;&#xD5D8;&#xD558;&#xB294; &#xC288;&#xD37C; &#xCEF4;&#xD4E8;&#xD130;&#xB85C; &#xC774;&#xB97C; &#xD574;&#xD0B9;&#xD558;&#xB824;&#xBA74; <strong>10&#xC758; 61&#xC81C;&#xACF1;&#xB144;</strong>&#xC774; &#xB118;&#xAC8C; &#xC18C;&#xC694;&#xB429;&#xB2C8;&#xB2E4;. &#xC6B0;&#xC8FC;&#xC758; &#xB098;&#xC774;&#xB97C; &#xC544;&#xB4DD;&#xD788; &#xB6F0;&#xC5B4;&#xB118;&#xC2B5;&#xB2C8;&#xB2E4;. HTTPS&#xB294; &#xBCF4;&#xC548; &#xC218;&#xC900;&#xC744; &#xB9E4;&#xC6B0; &#xB192;&#xC600;&#xC2B5;&#xB2C8;&#xB2E4;.<br>&#x2003;HTTPS&#xB85C; &#xC554;&#xD638;&#xD654;&#xB41C; &#xBA54;&#xC2DC;&#xC9C0;&#xB294; &#xC808;&#xB300; &#xC548;&#xC804;&#xC744; &#xBCF4;&#xC7A5;&#xD560;&#xAE4C;&#xC694;? &#xD398;&#xC774;&#xC2A4;&#xBD81;&#xC774; &#xADF8; &#xBC18;&#xB840;&#xB97C; &#xBCF4;&#xC5EC;&#xC90D;&#xB2C8;&#xB2E4;.</p><h3 id="%ED%8E%98%EC%9D%B4%EC%8A%A4%EB%B6%81%EC%9D%98-%EC%A4%91%EA%B0%84%EC%9E%90-%EA%B3%B5%EA%B2%A9">&#xD398;&#xC774;&#xC2A4;&#xBD81;&#xC758; &#xC911;&#xAC04;&#xC790; &#xACF5;&#xACA9;</h3><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://blog.cinntiq.synology.me/content/images/2024/07/be-aware-of-onavo-facebooks-va-1910-1239-1535019825.jpg" class="kg-image" alt loading="lazy" width="500" height="287"><figcaption>&#xC774;&#xBBF8;&#xC9C0; &#xCD9C;&#xCC98;: https://vnexpress.net/apple-loai-ung-dung-bao-mat-cua-facebook-vi-thu-thap-du-lieu-3797117.html</figcaption></figure><p>&#x2003;2019&#xB144; &#xD398;&#xC774;&#xC2A4;&#xBD81;&#xC5D0;&#xC120; &#xC720;&#xC800;&#xC5D0;&#xAC8C; Onavo Protect&#xB77C;&#xB294; VPN &#xC571;&#xC744; &#xC124;&#xCE58;&#xD558;&#xAC8C; &#xD588;&#xC2B5;&#xB2C8;&#xB2E4;. <br>&#x2003;<strong>VPN&#xC740; &#xD074;&#xB77C;&#xC774;&#xC5B8;&#xD2B8;&#xC640; &#xC11C;&#xBC84; &#xC0AC;&#xC774;&#xC5D0; &#xC704;&#xCE58;&#xD558;&#xAE30; &#xB54C;&#xBB38;&#xC5D0; &#xCEE8;&#xD150;&#xCE20;&#xB97C; &#xD544;&#xD130;&#xB9C1;</strong>&#xD560; &#xC218;&#xB3C4; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;. &#xCCAD;&#xC18C;&#xB144;&#xC5D0;&#xAC8C; <strong>&#xC720;&#xD574;&#xD55C; &#xCEE8;&#xD150;&#xCE20;&#xB97C; &#xCC28;&#xB2E8;</strong>&#xD55C;&#xB2E4;&#xB358;&#xC9C0;, &#xD68C;&#xC0AC;&#xC758; <strong>&#xAE30;&#xBC00; &#xC720;&#xCD9C;&#xC744; &#xAC80;&#xC0AC;</strong>&#xD55C;&#xB2E4;&#xB358;&#xC9C0;&#xC694;. &#xC774;&#xB294; SSL Bumping&#xC774;&#xB77C;&#xACE0; &#xD558;&#xB294;, &#xBCF4;&#xC548; &#xBAA9;&#xC801;&#xC758; &#xAE30;&#xC220;&#xC785;&#xB2C8;&#xB2E4;. <br>&#x2003;<strong>&#xC554;&#xD638;&#xD654;&#xB41C; &#xD2B8;&#xB798;&#xD53D;&#xC744; &#xC911;&#xAC04;&#xC790;&#xAC00; &#xAC80;&#xC0AC;</strong>&#xD55C;&#xB2E4;&#xB294; &#xAC83;&#xC740; &#xBBFC;&#xAC10;&#xD55C; &#xC0AC;&#xD56D;&#xC785;&#xB2C8;&#xB2E4;. &#xC608;&#xC2DC;&#xB9CC; &#xBD10;&#xB3C4; &#xAC1C;&#xC778;&#xBCF4;&#xB2E4;&#xB294; &apos;&#xD2B9;&#xC815;&#xD55C; &#xC870;&#xC9C1;&apos; &#xB2E8;&#xC704;&#xC5D0;&#xC11C; &#xC774;&#xC6A9;&#xD558;&#xB294; &#xAC8C; &#xC801;&#xC808;&#xD558;&#xC8E0;. <br>&#x2003;&#xD398;&#xC774;&#xC2A4;&#xBD81;&#xC740; &#xC65C; &#xC774;&#xB7F0; VPN&#xC744; &#xAC1C;&#xC778; &#xC0AC;&#xC6A9;&#xC790;&#xB4E4;&#xC5D0;&#xAC8C; &#xC694;&#xAD6C;&#xD588;&#xC744;&#xAE4C;&#xC694;? &#xC774;&#xB4E4;&#xC740; &#xC0AC;&#xC6A9;&#xC790;&#xAC00; &#xB2E4;&#xB978; &#xC571;(Snapchat, YouTube, Amazon &#xB4F1;)&#xACFC; &#xC8FC;&#xACE0;&#xBC1B;&#xB294; &#xD2B8;&#xB798;&#xD53D;&#xC744; &#xD6D4;&#xCCD0;&#xBCF4;&#xB824;&#xB294; &#xBAA9;&#xC801;&#xC774; &#xC788;&#xC5C8;&#xC2B5;&#xB2C8;&#xB2E4;. </p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://blog.cinntiq.synology.me/content/images/2024/07/canvas_new-board-240729_0837.png" class="kg-image" alt loading="lazy" width="1612" height="1180" srcset="https://blog.cinntiq.synology.me/content/images/size/w600/2024/07/canvas_new-board-240729_0837.png 600w, https://blog.cinntiq.synology.me/content/images/size/w1000/2024/07/canvas_new-board-240729_0837.png 1000w, https://blog.cinntiq.synology.me/content/images/size/w1600/2024/07/canvas_new-board-240729_0837.png 1600w, https://blog.cinntiq.synology.me/content/images/2024/07/canvas_new-board-240729_0837.png 1612w" sizes="(min-width: 720px) 720px"><figcaption>&#xC774;&#xBBF8;&#xC9C0; &#xCD9C;&#xCC98;: &#xC81C;&#xAC00; &#xC9C1;&#xC811; &#xADF8;&#xB838;&#xC2B5;&#xB2C8;&#xB2E4;.</figcaption></figure><p>&#x2003;&#xD398;&#xC774;&#xC2A4;&#xBD81;&#xC740; &#xC0AC;&#xC6A9;&#xC790; &#xAE30;&#xAE30;&#xC5D0; &#xC790;&#xC2E0;&#xB4E4;&#xC758; &#xC790;&#xCCB4; &#xC778;&#xC99D;&#xC11C;&#xB97C; &quot;&#xC2E0;&#xB8B0;&#xD560; &#xC218; &#xC788;&#xB294; &#xC778;&#xC99D;&#xC11C;&quot;&#xB85C;&#xC11C; &#xC124;&#xCE58;&#xC2DC;&#xCF30;&#xC2B5;&#xB2C8;&#xB2E4;. &#xC774;&#xB97C; &#xD1B5;&#xD574; &#xD398;&#xC774;&#xC2A4;&#xBD81;&#xC740; &#xC0AC;&#xC6A9;&#xC790;&#xC640; &#xD0C0;&#xC0AC; &#xC571;&#xC744; &#xB300;&#xC2E0;&#xD574;&#xC11C; &#xC18C;&#xD1B5;&#xD560; &#xAD8C;&#xD55C;&#xC744; &#xAC00;&#xC9C0;&#xAC8C; &#xB410;&#xC2B5;&#xB2C8;&#xB2E4;. <strong>&#xC0AC;&#xC6A9;&#xC790;&#xB294; &#xD398;&#xC774;&#xC2A4;&#xBD81;&#xC744; Snapchat&#xC774;&#xB77C;&#xACE0; &#xBBFF;&#xACE0;, Snapchat&#xC740; &#xD398;&#xC774;&#xC2A4;&#xBD81;&#xC744; &#xC0AC;&#xC6A9;&#xC790;&#xB77C;&#xACE0; &#xBBFF;&#xC73C;&#xBA70; &#xC18C;&#xD1B5;</strong>&#xD574;&#xC628; &#xAC83; &#xC774;&#xC8E0;. &#xC774;&#xB7EC;&#xD55C; &#xACF5;&#xACA9;&#xC744; MITM(Man In the Middle attack, &#xC911;&#xAC04;&#xC790; &#xACF5;&#xACA9;)&#xC774;&#xB77C;&#xACE0; &#xD569;&#xB2C8;&#xB2E4;.<br>&#x2003;&#xC774; &#xCF00;&#xC774;&#xC2A4;&#xB294; &quot;&#xAE30;&#xC5C5;&#xC774; &#xC0AC;&#xC6A9;&#xC790;&#xB97C; &#xAE30;&#xB9DD;&#xD55C; &#xCF00;&#xC774;&#xC2A4;&quot;&#xC785;&#xB2C8;&#xB2E4;. &#xADF8;&#xB807;&#xB2E4;&#xBA74; &#xD574;&#xCEE4;&#xAC00; HTTPS&#xB97C; &#xB6AB;&#xACE0; &#xACF5;&#xACA9;&#xD560; &#xC77C;&#xC740; &#xC5C6;&#xC744;&#xAE4C;&#xC694;? &#xB2F9;&#xC5F0;&#xD788; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.</p><h3 id="ssltls-%EB%8B%A4%EC%9A%B4%EA%B7%B8%EB%A0%88%EC%9D%B4%EB%93%9C-%EA%B3%B5%EA%B2%A9">SSL/TLS &#xB2E4;&#xC6B4;&#xADF8;&#xB808;&#xC774;&#xB4DC; &#xACF5;&#xACA9;</h3><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://blog.cinntiq.synology.me/content/images/2024/08/image29.png" class="kg-image" alt loading="lazy" width="602" height="291" srcset="https://blog.cinntiq.synology.me/content/images/size/w600/2024/08/image29.png 600w, https://blog.cinntiq.synology.me/content/images/2024/08/image29.png 602w"><figcaption>&#xC774;&#xBBF8;&#xC9C0; &#xCD9C;&#xCC98;: https://www.acunetix.com/blog/articles/tls-vulnerabilities-attacks-final-part/</figcaption></figure><p>&#x2003;SSL/TLS &#xB2E4;&#xC6B4;&#xADF8;&#xB808;&#xC774;&#xB4DC; &#xACF5;&#xACA9;&#xC740; &#xCDE8;&#xC57D;&#xD55C; Wi-Fi&#xB77C;&#xB358;&#xC9C0;, DNS&#xB97C; &#xC870;&#xC791;&#xD558;&#xAC70;&#xB098; &#xB77C;&#xC6B0;&#xD130;&#xB97C; &#xC18D;&#xC774;&#xB294; &#xB4F1;&#xC758; &#xBC29;&#xBC95;&#xC73C;&#xB85C; &#xD574;&#xCEE4;&#xAC00; &#xC911;&#xAC04;&#xC5D0; &#xB07C;&#xC5B4;&#xB4E0; &#xB2E4;&#xC74C;, <strong>SSL/TLS &#xD504;&#xB85C;&#xD1A0;&#xCF5C;&#xC744; &#xCDE8;&#xC57D; &#xBC84;&#xC804;&#xC73C;&#xB85C; &#xB0AE;&#xCDB0;&#xC11C; &#xC694;&#xCCAD; &#xC751;&#xB2F5;&#xC744; &#xC8FC;&#xACE0;&#xBC1B;&#xB3C4;&#xB85D; &#xC720;&#xB3C4;</strong>&#xD558;&#xB294; &#xC218;&#xBC95;&#xC785;&#xB2C8;&#xB2E4;. &#xC774;&#xB97C; &#xBC29;&#xC9C0;&#xD558;&#xB824;&#xBA74; TLS&#xC758; &#xCD5C;&#xC2E0; &#xBC84;&#xC804; &#xC0AC;&#xC6A9;&#xC744; &#xAC15;&#xC81C;&#xD558;&#xB294; &#xB4F1; &#xC8FC;&#xC758;&#xAC00; &#xD544;&#xC694;&#xD569;&#xB2C8;&#xB2E4;. <br>&#x2003;&#xACF5;&#xACA9;&#xC740; &#xC5B4;&#xB514;&#xC11C;&#xB098; &#xB4E4;&#xC5B4;&#xC62C; &#xC218; &#xC788;&#xAE30;&#xC5D0; &#xBCF4;&#xC548;&#xB3C4; &#xC5EC;&#xB7EC; &#xAD70;&#xB370;&#xC5D0;&#xC11C; &#xC218;&#xD589;&#xD569;&#xB2C8;&#xB2E4;. &#xC608;&#xB97C; &#xB4E4;&#xBA74; HSTS (HTTP Strict Transport Security,<strong>&quot;&#xD1B5;&#xC2E0;&#xC740; &#xBB34;&#xC870;&#xAC74; HTTPS&#xB85C; &#xD574;!&quot;</strong>)&#xB77C;&#xB294; &#xADDC;&#xCE59;&#xC744; &#xC801;&#xC6A9;&#xD558;&#xAE30;&#xB3C4; &#xD558;&#xACE0;, &#xBAA8;&#xB358; &#xBE0C;&#xB77C;&#xC6B0;&#xC800;&#xB4E4;&#xC740; TLS_FALLBACK_SCSV (Signaling Cipher Suite Value, <strong>&quot;&#xC5B5;&#xC9C0;&#xB85C; &#xB0AE;&#xC740; &#xBCF4;&#xC548; &#xC218;&#xC900;&#xC758; &#xD1B5;&#xC2E0;&#xC740; &#xC2DC;&#xB3C4; &#xAE08;&#xC9C0;&quot;</strong>)<strong> </strong>&#xB77C;&#xB294; &#xC124;&#xC815;&#xC744; &#xC9C0;&#xC6D0;&#xD569;&#xB2C8;&#xB2E4;. &#xB2E4;&#xC6B4;&#xADF8;&#xB808;&#xC774;&#xB4DC; &#xACF5;&#xACA9;&#xC774; &#xC2DC;&#xB3C4;&#xB420; &#xACBD;&#xC6B0;, &#xBE0C;&#xB77C;&#xC6B0;&#xC800; &#xCE21;&#xC5D0;&#xC11C; &#xC5F0;&#xACB0;&#xC744; &#xAC70;&#xBD80;&#xD558;&#xB294; &#xAC83;&#xC774;&#xC8E0;.<br>&#x2003;&#xBCF4;&#xC548;&#xC744; &#xB6AB;&#xB294; &#xCC3D;&#xACFC; &#xC774;&#xB97C; &#xB9C9;&#xB294; &#xBC29;&#xD328;&#xC758; &#xC2F8;&#xC6C0;&#xC740; &#xB05D;&#xC774; &#xC5C6;&#xC2B5;&#xB2C8;&#xB2E4;. &#xC6B0;&#xB9AC;&#xB294; &#xC5EC;&#xC804;&#xD788; &#xBCF4;&#xC548;&#xC774; &#xB6AB;&#xB838;&#xB2E4;&#xB294; &#xB274;&#xC2A4;&#xB97C; &#xB9CE;&#xC774; &#xC811;&#xD569;&#xB2C8;&#xB2E4;. &#xC65C;&#xC77C;&#xAE4C;&#xC694;?</p><h3 id="%EB%8F%85%EC%9D%BC-%EB%B3%B4%EC%95%88%EC%9D%B4-%EB%9A%AB%EB%A6%B0-%EC%9D%B4%EC%9C%A0">&#xB3C5;&#xC77C; &#xBCF4;&#xC548;&#xC774; &#xB6AB;&#xB9B0; &#xC774;&#xC720;</h3><p>&#x2003;&quot;&#xC5D0;&#xB2C8;&#xADF8;&#xB9C8;&quot;&#xB77C;&#xB294; &#xB2E8;&#xC5B4;&#xB97C; &#xD55C; &#xBC88;&#xCBE4;&#xC740; &#xB4E4;&#xC5B4;&#xBCF4;&#xC168;&#xC744; &#xB4EF;&#xD569;&#xB2C8;&#xB2E4;. &#xADF8;&#xB9AC;&#xC2A4;&#xC5B4;&#xB85C; &quot;&#xC218;&#xC218;&#xAED8;&#xB07C;&quot;&#xB77C;&#xB294; &#xB73B;&#xC744; &#xAC00;&#xC9C4; &#xC5D0;&#xB2C8;&#xADF8;&#xB9C8;&#xB294; 2&#xCC28; &#xC138;&#xACC4; &#xB300;&#xC804; &#xB3C5;&#xC77C;&#xAD70;&#xC774; &#xC4F0;&#xB358; &#xC554;&#xD638; &#xCCB4;&#xACC4;&#xC600;&#xC2B5;&#xB2C8;&#xB2E4;. </p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://blog.cinntiq.synology.me/content/images/2024/07/christian-lendl-ZyttGSu-o2E-unsplash.jpg" class="kg-image" alt loading="lazy" width="2000" height="1333" srcset="https://blog.cinntiq.synology.me/content/images/size/w600/2024/07/christian-lendl-ZyttGSu-o2E-unsplash.jpg 600w, https://blog.cinntiq.synology.me/content/images/size/w1000/2024/07/christian-lendl-ZyttGSu-o2E-unsplash.jpg 1000w, https://blog.cinntiq.synology.me/content/images/size/w1600/2024/07/christian-lendl-ZyttGSu-o2E-unsplash.jpg 1600w, https://blog.cinntiq.synology.me/content/images/size/w2400/2024/07/christian-lendl-ZyttGSu-o2E-unsplash.jpg 2400w" sizes="(min-width: 720px) 720px"><figcaption>&#xC774;&#xBBF8;&#xC9C0; &#xCD9C;&#xCC98;: https://unsplash.com/ko/%EC%82%AC%EC%A7%84/%EB%B2%84%ED%8A%BC%EC%9D%B4-%EB%A7%8E%EC%9D%80-%ED%83%80%EC%9E%90%EA%B8%B0-ZyttGSu-o2E?utm_content=creditShareLink&amp;utm_medium=referral&amp;utm_source=unsplash</figcaption></figure><p>&#x2003;&#xC5D0;&#xB2C8;&#xADF8;&#xB9C8;&#xB294; &#xC5B4;&#xC6D0;&#xC5D0; &#xC5B4;&#xC6B8;&#xB9B4; &#xB9CC;&#xD07C; &#xB9E4;&#xC6B0; &#xBCF5;&#xC7A1;&#xD558;&#xACE0; &#xC815;&#xAD50;&#xD588;&#xC2B5;&#xB2C8;&#xB2E4;. &#xC5D0;&#xB2C8;&#xADF8;&#xB9C8;&#xB97C; &#xD1B5;&#xD55C; &#xBA54;&#xC2DC;&#xC9C0;&#xB97C; &#xD574;&#xB3C5;&#xD558;&#xB824;&#xBA74; 150&#xC870; &#xAC00;&#xC9C0; &#xC774;&#xC0C1;&#xC758; &#xCF00;&#xC774;&#xC2A4;&#xB97C; &#xAC80;&#xC99D;&#xD574;&#xC57C; &#xD588;&#xC2B5;&#xB2C8;&#xB2E4;.<br>&#x2003;150&#xC870;&#xB294; 2&#xC758; 47&#xC81C;&#xACF1; &#xBBF8;&#xB9CC;&#xC73C;&#xB85C; &#xD604;&#xB300;&#xC5D0;&#xC120; &#xC131;&#xB2A5; &#xC88B;&#xC740; &#xCEF4;&#xD4E8;&#xD130;&#xB85C; &#xC218; &#xCD08;&#xB9CC;&#xC5D0; &#xACC4;&#xC0B0;&#xD558;&#xB294; &#xC815;&#xB3C4;&#xC785;&#xB2C8;&#xB2E4;. &#xADF8;&#xB7EC;&#xB098; &#xB2F9;&#xC2DC;&#xC5D4; &#xD574;&#xB3C5;&#xC774; &#xC808;&#xB300;&#xB85C; &#xBD88;&#xAC00;&#xB2A5;&#xD55C; &#xC218;&#xC900;&#xC774;&#xC5C8;&#xC2B5;&#xB2C8;&#xB2E4;. &#xADF8;&#xB7FC;&#xC5D0;&#xB3C4; &#xC5D0;&#xB2C8;&#xADF8;&#xB9C8;&#xB294; &#xACB0;&#xAD6D; &#xD574;&#xB3C5;&#xC774; &#xB410;&#xC2B5;&#xB2C8;&#xB2E4;. &#xC5B4;&#xC9F8;&#xC11C;&#xC600;&#xC744;&#xAE4C;&#xC694;?</p><ul><li>&#xCD08;&#xAE30; &#xC5D0;&#xB2C8;&#xADF8;&#xB9C8;&#xC758; <strong>&#xB9E4;&#xB274;&#xC5BC;</strong>&#xC774; &#xB4E4;&#xCF30;&#xC2B5;&#xB2C8;&#xB2E4;.</li><li>&#xC77C;&#xBD80; &#xC791;&#xC804;&#xAD00;&#xC740; <strong>&#xB9E4;&#xC6B0; &#xD5C8;&#xC220;&#xD55C; &#xC554;&#xD638; &#xD0A4;</strong>&#xB97C; &#xC0AC;&#xC6A9;&#xD588;&#xC2B5;&#xB2C8;&#xB2E4;. <strong>&#xAD70;&#xB300; &#xCEF4;&#xD4E8;&#xD130; &#xBE44;&#xBC00;&#xBC88;&#xD638;</strong>&#xCC98;&#xB7FC;&#xC694;.</li><li><strong>&#xC8FC;&#xAE30;&#xB9C8;&#xB2E4; &#xB611;&#xAC19;&#xC740; &#xC554;&#xD638; &#xD0A4;&#xB97C; &#xBC18;&#xBCF5; &#xC0AC;&#xC6A9;</strong>&#xD588;&#xC2B5;&#xB2C8;&#xB2E4;.</li><li>&#xB0A0;&#xC528; &#xAC19;&#xC740; <strong>&#xC7A1;&#xB2F4;</strong>&#xB3C4; &#xB9CE;&#xC774; &#xC8FC;&#xACE0; &#xBC1B;&#xB290;&#xB77C; &#xD78C;&#xD2B8;&#xAC00; &#xC0C8;&#xB098;&#xAC14;&#xC2B5;&#xB2C8;&#xB2E4;.</li><li>&#xB2E4;&#xB978; &#xC554;&#xD638; &#xCCB4;&#xACC4;&#xC600;&#xB358; METEO&#xC640;<strong> &#xB611;&#xAC19;&#xC740; &#xC124;&#xC815;</strong>&#xC744; &#xC0AC;&#xC6A9;&#xD588;&#xC2B5;&#xB2C8;&#xB2E4;.</li><li>&#xC2E4;&#xC81C;&#xB85C;&#xB294; &#xC808;&#xB300;&#xB85C; &#xC548; &#xC4F0;&#xC774;&#xB294; &#xD328;&#xD134;&#xB4E4;&#xC774; &#xB9CE;&#xC774; &#xBC1C;&#xACAC;&#xB3FC; &#xACBD;&#xC6B0;&#xC758; &#xC218;&#xAC00; &#xD655;&#xC5F0;&#xD788; &#xC904;&#xC5C8;&#xC2B5;&#xB2C8;&#xB2E4;.</li></ul><p>&#x2003;&#xADF8; &#xC678;&#xC5D0;&#xB3C4; &#xC218;&#xB9CE;&#xC740; &#xC2E4;&#xC218;&#xB4E4;&#xC774; &#xBC18;&#xBCF5;&#xB410;&#xACE0;, &#xC5D0;&#xB2C8;&#xADF8;&#xB9C8;&#xB294; &#xB05D;&#xB0B4; &#xD574;&#xB3C5;&#xB410;&#xC2B5;&#xB2C8;&#xB2E4;. &#xC704;&#xC758; &#xC6D0;&#xC778;&#xB4E4;&#xC740; &#xBAA8;&#xB450; &#xB2E8; &#xD558;&#xB098;&#xC758; &#xC0AC;&#xC2E4;&#xC744; &#xACF5;&#xC720;&#xD569;&#xB2C8;&#xB2E4;. &quot;&#xD5C8;&#xC220;&#xD55C; &#xC0AC;&#xC6A9;&quot;&#xC785;&#xB2C8;&#xB2E4;. &#xC544;&#xBB34;&#xB9AC; &#xD6CC;&#xB96D;&#xD55C; &#xBCF4;&#xC548; &#xCCB4;&#xACC4;&#xB97C; &#xAC16;&#xCDB0;&#xB3C4; &#xC0AC;&#xC6A9;&#xC790;&#xAC00; &#xBC29;&#xC2EC;&#xD558;&#xBA74; &#xBCF4;&#xC548;&#xC740; &#xBB34;&#xB108;&#xC9C4;&#xB2E4;&#xB294; &#xAD50;&#xD6C8;&#xC744; &#xC8FC;&#xB294; &#xC77C;&#xD654;&#xC785;&#xB2C8;&#xB2E4;. &#xADF8; &#xB54C;&#xBB38;&#xC5D0; &#xBCF4;&#xC548;&#xC740; &#xD55C; &#xC2DC;&#xB3C4; &#xAE34;&#xC7A5;&#xC744; &#xB2A6;&#xCD9C; &#xC218; &#xC5C6;&#xB294; &#xBB38;&#xC81C;&#xC785;&#xB2C8;&#xB2E4;.</p><h3 id="%EC%98%81%EA%B5%AD-%ED%95%AD%EA%B3%B5%EC%9D%98-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EC%9C%A0%EC%B6%9C">&#xC601;&#xAD6D; &#xD56D;&#xACF5;&#xC758; &#xB370;&#xC774;&#xD130; &#xC720;&#xCD9C;</h3><p>&#x2003;2018&#xB144; 8&#xC6D4; &#xACBD;, British Airways&#xB294; &#xB300;&#xB7C9;&#xC758; &#xACE0;&#xAC1D; &#xACB0;&#xC81C; &#xB370;&#xC774;&#xD130;&#xAC00; &#xC720;&#xCD9C;&#xB3FC; 2,700&#xC5B5;&#xC758; &#xBC8C;&#xAE08;&#xC744; &#xBD80;&#xACFC;&#xBC1B;&#xC558;&#xC2B5;&#xB2C8;&#xB2E4;. &#xD3FC; &#xC7AC;&#xD0B9;(formjacking)&#xC774;&#xB77C;&#xB294; &#xC218;&#xBC95;&#xC758; &#xBCF4;&#xC548; &#xACF5;&#xACA9;&#xC73C;&#xB85C; &#xB2F9;&#xD55C; &#xAC83;&#xC774;&#xC8E0;. </p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://blog.cinntiq.synology.me/content/images/2024/07/img.png" class="kg-image" alt loading="lazy" width="689" height="409" srcset="https://blog.cinntiq.synology.me/content/images/size/w600/2024/07/img.png 600w, https://blog.cinntiq.synology.me/content/images/2024/07/img.png 689w"><figcaption>&#xC774;&#xBBF8;&#xC9C0; &#xCD9C;&#xCC98;: https://www.sinsiway.com/kr/pr/blog/view/406/page/1</figcaption></figure><p>&#x2003;&#xC554;&#xD638;&#xB85C; &#xC8FC;&#xACE0;&#xBC1B;&#xB294; &#xAC83;&#xC774; &#xC548;&#xC804;&#xD558;&#xB2E4;&#xB294; &#xC598;&#xAE30;&#xB294; &#xADF8; &#xACFC;&#xC815;&#xC774; &#xC815;&#xC0C1;&#xC77C; &#xB54C;&#xC5D0;&#xB9CC; &#xAC00;&#xB2A5;&#xD569;&#xB2C8;&#xB2E4;. &#xC774; &#xACBD;&#xC6B0;&#xB294; &#xBCF4;&#xC548;&#xC774; &#xCDE8;&#xC57D;&#xD588;&#xB358; British Airways&#xAC00; &#xD574;&#xCEE4;&#xC5D0;&#xAC8C; &#xACE0;&#xAC1D; &#xC815;&#xBCF4;&#xB97C; &#xBC14;&#xCE5C; &#xC148;&#xC774;&#xC8E0;.</p><h3 id="%EC%BF%A0%ED%82%A4">&#xCFE0;&#xD0A4;</h3><p>&#x2003;&#xCFE0;&#xD0A4;&#xB294; &#xC11C;&#xBC84;&#xAC00; &#xC0AC;&#xC6A9;&#xC790;&#xB97C; &#xC2DD;&#xBCC4;&#xD558;&#xACE0; &#xD3B8;&#xB9AC;&#xD55C; &#xC11C;&#xBE44;&#xC2A4;&#xB97C; &#xC81C;&#xACF5;&#xD558;&#xB3C4;&#xB85D; &#xB3D5;&#xB294; &#xC778;&#xC2DD;&#xD45C;&#xC785;&#xB2C8;&#xB2E4;. </p><ol><li>&#xC11C;&#xBC84;&#xB294; &#xCD5C;&#xCD08;&#xB85C; &#xBC29;&#xBB38;&#xD55C; &#xC0AC;&#xC6A9;&#xC790;&#xC5D0;&#xAC8C; &#xCFE0;&#xD0A4;&#xB97C; &#xBC1C;&#xAE09;&#xD569;&#xB2C8;&#xB2E4;. &#xCFE0;&#xD0A4;&#xC5D0;&#xB294; &#xC0AC;&#xC6A9;&#xC790;&#xB97C; &#xC2DD;&#xBCC4;&#xD560; &#xC218; &#xC788;&#xB294; &#xACE0;&#xC720;&#xD55C; &#xC815;&#xBCF4;&#xC640; &#xC5EC;&#xB7EC; &#xC18D;&#xC131;&#xC774; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.</li><li>&#xC0AC;&#xC6A9;&#xC790;&#xB294; &#xCFE0;&#xD0A4;&#xB97C; &#xBC1B;&#xC544;&#xC11C; &#xC774;&#xD6C4;&#xC5D0; &#xC0AC;&#xC774;&#xD2B8;&#xB97C; &#xBC29;&#xBB38;&#xD558;&#xAC70;&#xB098; &#xC694;&#xCCAD;&#xD560; &#xB54C;&#xB9C8;&#xB2E4; &#xC11C;&#xBC84;&#xC5D0;&#xAC8C; &#xCFE0;&#xD0A4;&#xB97C; &#xBCF4;&#xB0C5;&#xB2C8;&#xB2E4;.</li><li>&#xC11C;&#xBC84;&#xB294; &#xCFE0;&#xD0A4;&#xB97C; &#xD1B5;&#xD574; &#xC0AC;&#xC6A9;&#xC790;&#xB97C; &#xC2DD;&#xBCC4;&#xD558;&#xACE0;, &#xD3B8;&#xB9AC;&#xD55C; &#xC11C;&#xBE44;&#xC2A4;&#xB97C; &#xC81C;&#xACF5;&#xD569;&#xB2C8;&#xB2E4;.</li></ol><p>&#x2003;&#xBCD1;&#xC6D0; &#xC11C;&#xBE44;&#xC2A4;&#xB97C; &#xB5A0;&#xC62C;&#xB824;&#xBD05;&#xC2DC;&#xB2E4;. &#xC6B0;&#xB9AC;&#xB294; &#xBCD1;&#xC6D0;&#xC5D0; &#xCD5C;&#xCD08;&#xB85C; &#xBC29;&#xBB38;&#xD588;&#xC744; &#xB54C; &#xAC1C;&#xC778; &#xC815;&#xBCF4;&#xB97C; &#xAE30;&#xC785;&#xD558;&#xACE0;, &#xC11C;&#xBE44;&#xC2A4;&#xB97C; &#xC774;&#xC6A9;&#xD569;&#xB2C8;&#xB2E4;. &#xADF8; &#xC774;&#xD6C4;&#xC758; &#xBC29;&#xBB38;&#xBD80;&#xD130; &#xB0B4; &#xC2E0;&#xBD84;&#xB9CC; &#xC778;&#xC99D;&#xD558;&#xBA74; &#xBCD1;&#xC6D0;&#xC5D0;&#xC11C; &#xB0B4; &#xC9C4;&#xB8CC;&#xAE30;&#xB85D;&#xACFC; &#xC815;&#xBCF4;&#xB97C; &#xCC3E;&#xC544;&#xC11C; &#xB0B4;&#xAC8C; &#xB9DE;&#xCDA4; &#xC11C;&#xBE44;&#xC2A4;&#xB97C; &#xC81C;&#xACF5;&#xD558;&#xC8E0;. &#xCFE0;&#xD0A4;&#xB294; &#xC774;&#xC640; &#xAC19;&#xC740; &#xAC1C;&#xB150;&#xC5D0;&#xC11C; &#xCD9C;&#xBC1C;&#xD55C; &#xC544;&#xC774;&#xB514;&#xC5B4;&#xC785;&#xB2C8;&#xB2E4;.<br>&#x2003;&#xC7AC;&#xBC29;&#xBB38;&#xD55C; &#xC0AC;&#xC6A9;&#xC790;&#xC758; &#xCFE0;&#xD0A4;&#xB97C; &#xC2DD;&#xBCC4;(&#xC138;&#xC158; id)&#xD574;&#xC11C; &#xC790;&#xB3D9; &#xB85C;&#xADF8;&#xC778;&#xC744; &#xB3D5;&#xAC70;&#xB098;, &#xC2A4;&#xD06C;&#xB9BD;&#xD2B8;&#xB85C; &#xCFE0;&#xD0A4;&#xAC00; &#xD0C8;&#xCDE8;&#xB418;&#xB294; &#xAC83;&#xC744; &#xBC29;&#xC9C0;&#xD558;&#xACE0; HTTP &#xD1B5;&#xC2E0;&#xC73C;&#xB85C;&#xB9CC; &#xCFE0;&#xD0A4;&#xB97C; &#xC774;&#xC6A9;&#xD558;&#xB3C4;&#xB85D; &#xC124;&#xC815;&#xD558;&#xAC70;&#xB098;(HttpOnly), HTTPS &#xD658;&#xACBD;&#xC5D0;&#xC11C;&#xB9CC; &#xCFE0;&#xD0A4;&#xB97C; &#xC774;&#xC6A9;&#xD558;&#xB3C4;&#xB85D; &#xC124;&#xC815;&#xD558;&#xAC70;&#xB098;(secure), &#xC11C;&#xB85C; &#xB2E4;&#xB978; &#xB3C4;&#xBA54;&#xC778;&#xC5D0;&#xC11C; &#xC694;&#xCCAD;&#xD558;&#xB294; &#xAC78; &#xBC29;&#xC9C0;(SameSite)&#xD558;&#xB294; &#xB4F1; &#xC5EC;&#xB7EC; &#xC18D;&#xC131;&#xC774; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.<br>&#x2003;&#xCFE0;&#xD0A4;&#xB294; &#xD0C8;&#xCDE8;&#xB420; &#xACBD;&#xC6B0; &#xC704;&#xD5D8;&#xD558;&#xB2E4;&#xB294; &#xC774;&#xC57C;&#xAE30;&#xAC00; &#xC790;&#xC8FC; &#xD68C;&#xC790;&#xB429;&#xB2C8;&#xB2E4;&#xB9CC;, &#xC2E4;&#xC81C;&#xB85C;&#xB294; &#xACF3;&#xACF3;&#xC5D0;&#xC11C; &#xCFE0;&#xD0A4;&#xB97C; &#xB9CE;&#xC774; &#xC4F0;&#xB294; &#xC2E4;&#xC815;&#xC785;&#xB2C8;&#xB2E4;. &#xC5B4;&#xCA0C;&#xB4E0; &#xB9E4;&#xC6B0; &#xD3B8;&#xB9AC;&#xD558;&#xAE30; &#xB54C;&#xBB38;&#xC774;&#xC8E0;. <br>&#x2003;&#xC704;&#xC5D0;&#xC11C; &#xC11C;&#xC220;&#xD588;&#xB4EF;, HTTPS&#xB97C; &#xD1B5;&#xD55C; &#xC18C;&#xD1B5;&#xC5D0;&#xC120; &#xCFE0;&#xD0A4;&#xB3C4; &#xC554;&#xD638;&#xD654;&#xB429;&#xB2C8;&#xB2E4;. &#xC774; &#xACBD;&#xC6B0;&#xC5D0;&#xB294; &#xCFE0;&#xD0A4;&#xAC00; &#xD0C8;&#xCDE8;&#xB418;&#xB354;&#xB77C;&#xB3C4; &#xD604;&#xC2E4;&#xC801;&#xC73C;&#xB85C; &#xCFE0;&#xD0A4; &#xD574;&#xB3C5;&#xC774; &#xBD88;&#xAC00;&#xB2A5;&#xD569;&#xB2C8;&#xB2E4;. &#xADF8;&#xB798;&#xC11C; &#xBCF4;&#xD1B5;&#xC740; &#xC554;&#xD638;&#xD654;&#xAC00; &#xC548; &#xB41C; &#xB85C;&#xCEEC; &#xCFE0;&#xD0A4;&#xB97C; &#xB178;&#xB9AC;&#xAC70;&#xB098;, &#xC0AC;&#xC6A9;&#xC790; &#xAD8C;&#xD55C;&#xC744; &#xC774;&#xC6A9;&#xD574;&#xC11C; &#xBAB0;&#xB798; &#xC694;&#xCCAD;&#xD558;&#xBBC0;&#xB85C; &#xC774;&#xC5D0; &#xB300;&#xD55C; &#xBCF4;&#xC548;&#xC744; &#xC2E0;&#xACBD;&#xC368;&#xC57C;&#xB9CC; &#xD569;&#xB2C8;&#xB2E4;.</p><h3 id="cors">CORS</h3><p>&#x2003;Cross-Origin Resource Sharing&#xC758; &#xC904;&#xC784;&#xB9D0;&#xB85C;, &#xC11C;&#xB85C; &#xB2E4;&#xB978; &#xCD9C;&#xCC98;(Cross-Origin)&#xC5D0;&#xC11C;&#xC758; &#xC790;&#xC6D0; &#xACF5;&#xC720;(Resource Sharing)&#xC5D0; &#xB300;&#xD55C; <strong>&#xBE0C;&#xB77C;&#xC6B0;&#xC800; &#xC815;&#xCC45;</strong>&#xC785;&#xB2C8;&#xB2E4;. &#xC608;&#xCEE8;&#xB300; &#xB124;&#xC774;&#xBC84;&#xC5D0;&#xC11C; &#xBBF8;&#xAD6D; &#xAD6D;&#xBC29;&#xBD80;&#xB85C; &#xBCF4;&#xC548; &#xC790;&#xB8CC;&#xB97C; &#xC694;&#xCCAD;&#xD560; &#xACBD;&#xC6B0;, &#xC774;&#xB7F0; &#xAC78; &#xD5C8;&#xC6A9;&#xD574;&#xC120; &#xC548; &#xB429;&#xB2C8;&#xB2E4;.<br>&#x2003;&#xBCF8;&#xB798; &#xC61B;&#xB0A0;&#xC5D4; Same-Origin Policy&#xC774;&#xB77C;&#xACE0; &#xD574;&#xC11C;, HTTP &#xC694;&#xCCAD;&#xC740; &#xAC19;&#xC740; &#xB3C4;&#xBA54;&#xC778;&#xC77C; &#xB54C;&#xC5D0;&#xB9CC; &#xD5C8;&#xC6A9;&#xD588;&#xC2B5;&#xB2C8;&#xB2E4;. &#xADF8;&#xAC83;&#xC774; &#xBCF4;&#xC548;&#xC5D0; &#xC88B;&#xC73C;&#xB2C8;&#xAE4C;&#xC694;. &#xADF8;&#xB7EC;&#xB098; &#xC6F9;&#xC774; &#xBC1C;&#xB2EC;&#xD558;&#xBA74;&#xC11C; &#xD55C; &#xD398;&#xC774;&#xC9C0; &#xB0B4;&#xC5D0; &#xC5EC;&#xB7EC; &#xD68C;&#xC0AC;&#xC758; &#xC11C;&#xBE44;&#xC2A4;&#xB4E4;(API &#xB4F1;)&#xC774; &#xD63C;&#xC7AC;&#xD558;&#xAC8C; &#xB429;&#xB2C8;&#xB2E4;. &#xC774;&#xC5D0; &#xB300;&#xD574; &#xC548;&#xC804;&#xD55C; &#xC0AC;&#xC6A9;&#xC744; &#xC704;&#xD574; CORS &#xC815;&#xCC45;&#xC774; &#xB098;&#xC635;&#xB2C8;&#xB2E4;.<br>&#x2003;&#xC694;&#xC57D;&#xD558;&#xC790;&#xBA74; <strong>&quot;&#xC548;&#xC804;&#xD55C; &#xCD9C;&#xCC98;&#xB07C;&#xB9AC;&#xB9CC; &#xC18C;&#xD1B5;&#xD574;&#xB77C;.&quot;</strong>&#xC785;&#xB2C8;&#xB2E4;. &#xC774;&#xB97C; &#xC704;&#xD55C; &#xD655;&#xC778;&#xC73C;&#xB85C; &#xD504;&#xB9AC;&#xD50C;&#xB77C;&#xC774;&#xD2B8;(preflight) &#xC694;&#xCCAD;&#xC774; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.<br>&#x2003;&#xBE0C;&#xB77C;&#xC6B0;&#xC800;&#xB294; &#xC11C;&#xBC84;&#xC5D0;&#xAC8C; HTTP &#xBA54;&#xC18C;&#xB4DC; &#xC911; &#xD558;&#xB098;&#xC778; OPTIONS &#xC18D;&#xC131;&#xC73C;&#xB85C; &#xC694;&#xCCAD;&#xC744; &#xBCF4;&#xB0C5;&#xB2C8;&#xB2E4;. &#xC790;&#xC2E0;&#xC758; Origin&#xC774; &#xC11C;&#xBC84;&#xC5D0; &#xC548;&#xC804;&#xD558;&#xB2E4;&#xACE0; &#xB4F1;&#xC7AC;&#xB410;&#xB294;&#xC9C0; &#xD655;&#xC778;&#xD558;&#xC8E0;. &#xC11C;&#xBC84; &#xCE21;&#xC5D0;&#xC11C; &#xC548;&#xC804;&#xD558;&#xB2E4;&#xACE0; &#xC751;&#xB2F5;&#xD558;&#xBA74; &#xBE0C;&#xB77C;&#xC6B0;&#xC800;&#xB294; &#xADF8;&#xC81C;&#xC11C;&#xC57C; &#xC9C4;&#xC9DC; &#xC694;&#xCCAD;&#xC744; &#xBCF4;&#xB0B4;&#xACE0; HTTP &#xC18C;&#xD1B5;&#xC744; &#xAC1C;&#xC2DC;&#xD569;&#xB2C8;&#xB2E4;. <br>&#x2003;&#xC774;&#xB97C; &#xD1B5;&#xD574; &#xC11C;&#xBC84;&#xB294; &#xB098;&#xC05C; &#xCF54;&#xB4DC;&#xAC00; &#xCE68;&#xC785;&#xD558;&#xB294; &#xAC83;&#xC744; &#xBC29;&#xC9C0;&#xD569;&#xB2C8;&#xB2E4;. &#xB610;&#xD55C; &#xD074;&#xB77C;&#xC774;&#xC5B8;&#xD2B8;&#xAC00; &#xBCF4;&#xC548;&#xC774; &#xB098;&#xC05C; &#xC0AC;&#xC774;&#xD2B8;&#xC5D0;&#xC11C; &#xC815;&#xBCF4;&#xB97C; &#xB3C4;&#xC6A9;&#xB2F9;&#xD574; &#xB2E4;&#xB978; &#xC0AC;&#xC774;&#xD2B8;&#xB85C; &#xC694;&#xCCAD;&#xC744; &#xBCF4;&#xB0B4;&#xB354;&#xB77C;&#xB3C4;, CORS &#xC815;&#xCC45;&#xC5D0; &#xC758;&#xD574; &#xCC28;&#xB2E8;&#xB418;&#xACA0;&#xC8E0;. CORS&#xB294; &#xAC1C;&#xBC1C;&#xC911;&#xC5D0; &#xB9CE;&#xC740; &#xC0AC;&#xB78C;&#xB4E4;&#xC744; &#xD53C;&#xACE4;&#xD558;&#xAC8C; &#xB9CC;&#xB4E4;&#xAE30;&#xB3C4; &#xD558;&#xC9C0;&#xB9CC; &#xD544;&#xC218;&#xBD88;&#xAC00;&#xACB0;&#xC778; &#xC815;&#xCC45;&#xC785;&#xB2C8;&#xB2E4;.</p><h3 id="xsrf-token">XSRF-TOKEN</h3><p>&#x2003;XSRF-TOKEN&#xC740; &#xCFE0;&#xD0A4;&#xC640; CORS&#xB97C; &#xACB0;&#xD569;&#xD55C; &#xBCF4;&#xC548; &#xC544;&#xC774;&#xB514;&#xC5B4;&#xC785;&#xB2C8;&#xB2E4;. CSRF(Cross-Site Request Forgery)&#xB294; &#xC0AC;&#xC6A9;&#xC790;&#xAC00; &#xC545;&#xC131; &#xC0AC;&#xC774;&#xD2B8;&#xC5D0; &#xC811;&#xC18D; &#xC2DC;, &#xC790;&#xAE30;&#xB3C4; &#xBAA8;&#xB974;&#xAC8C; &#xC815;&#xC0C1;&#xC801;&#xC778; &#xC0AC;&#xC774;&#xD2B8;&#xC5D0; &#xC694;&#xCCAD;&#xC744; &#xBCF4;&#xB0B4;&#xB294; &#xACF5;&#xACA9;&#xC785;&#xB2C8;&#xB2E4;.<br>&#x2003;XSRF-TOKEN&#xC740; &#xBE0C;&#xB77C;&#xC6B0;&#xC800; &#xCEE8;&#xD14D;&#xC2A4;&#xD2B8;(&#xC138;&#xC158; &#xD0ED;)&#xB9C8;&#xB2E4; &#xC77C;&#xC2DC;&#xC801;&#xC73C;&#xB85C; &#xC8FC;&#xC5B4;&#xC9C0;&#xB294; &#xCFE0;&#xD0A4;&#xB85C;, &#xC0AC;&#xC6A9;&#xC790;&#xB294; &#xC694;&#xCCAD;&#xB9C8;&#xB2E4; &#xC774; &#xCFE0;&#xD0A4;&#xB97C; &#xBCF4;&#xB0B4;&#xC11C; &quot;&#xC815;&#xC0C1;&#xC801;&#xC778; &#xCD9C;&#xCC98;&#xC5D0;&#xC11C;&#xC758; &#xC694;&#xCCAD;&quot;&#xC778;&#xC9C0; &#xC785;&#xC99D;&#xD558;&#xAC8C; &#xB429;&#xB2C8;&#xB2E4;. &#xD574;&#xCEE4;&#xAC00; &#xC545;&#xC131; &#xB3C4;&#xBA54;&#xC778;&#xC5D0;&#xC11C; &#xC0AC;&#xC6A9;&#xC790;&#xB85C; &#xD558;&#xC5EC;&#xAE08; &#xC694;&#xCCAD;&#xC744; &#xBCF4;&#xB0B4;&#xAC8C; &#xC2DC;&#xD0A4;&#xBA74;, XSRF-TOKEN&#xC774; &#xC5C6;&#xB294; &#xC694;&#xCCAD;&#xC774; &#xB420; &#xD14C;&#xACE0;, &#xC774;&#xB294; &#xC815;&#xC0C1;&#xC801;&#xC778; &#xCD9C;&#xCC98;&#xC5D0;&#xC11C;&#xC758; &#xC694;&#xCCAD;&#xC774; &#xC544;&#xB2C8;&#xB77C;&#xBA70; &#xAC70;&#xC808;&#xB2F9;&#xD558;&#xACA0;&#xC8E0;. </p><h3 id="%EC%B0%B8%EC%A1%B0">&#xCC38;&#xC870;</h3><ul><li>Wikipedia. Onavo. <a href="https://en.wikipedia.org/wiki/Onavo?ref=blog.cinntiq.synology.me">https://en.wikipedia.org/wiki/Onavo</a></li><li>haxlob(2024.04.14). How did Facebook intercept their competitor&apos;s encrypted mobile app traffic? <a href="https://doubleagent.net/onavo-facebook-ssl-mitm-technical-analysis/?ref=blog.cinntiq.synology.me">https://doubleagent.net/onavo-facebook-ssl-mitm-technical-analysis/</a></li></ul>]]></content:encoded></item><item><title><![CDATA[HTTP 공부]]></title><description><![CDATA[<h3 id="dns">DNS</h3><blockquote><em>amazon.com&#xC744; &#xC8FC;&#xC18C;&#xCC3D;&#xC5D0; &#xC785;&#xB825;&#xD558;&#xBA74; &#xBE0C;&#xB77C;&#xC6B0;&#xC800;&#xB294; &#xC5B4;&#xB5BB;&#xAC8C; &#xCC98;&#xB9AC;&#xD560;&#xAE4C;&#xC694;?</em></blockquote><p>&#x2003;https://www.amazon.com&#xC774;&#xB77C;&#xACE0; &#xC804;&#xCCB4; URL&#xC744; &#xC785;&#xB825;&#xD558;&#xC9C0; &#xC54A;&#xC544;&#xB3C4; &#xC54C;&#xACE0;&#xB9AC;&#xC998;&#xC744; &#xD1B5;</p>]]></description><link>https://blog.cinntiq.synology.me/http-2/</link><guid isPermaLink="false">65cc24ec0cf5c60001a88bfb</guid><dc:creator><![CDATA[Hameln]]></dc:creator><pubDate>Tue, 23 Jul 2024 07:02:24 GMT</pubDate><content:encoded><![CDATA[<h3 id="dns">DNS</h3><blockquote><em>amazon.com&#xC744; &#xC8FC;&#xC18C;&#xCC3D;&#xC5D0; &#xC785;&#xB825;&#xD558;&#xBA74; &#xBE0C;&#xB77C;&#xC6B0;&#xC800;&#xB294; &#xC5B4;&#xB5BB;&#xAC8C; &#xCC98;&#xB9AC;&#xD560;&#xAE4C;&#xC694;?</em></blockquote><p>&#x2003;https://www.amazon.com&#xC774;&#xB77C;&#xACE0; &#xC804;&#xCCB4; URL&#xC744; &#xC785;&#xB825;&#xD558;&#xC9C0; &#xC54A;&#xC544;&#xB3C4; &#xC54C;&#xACE0;&#xB9AC;&#xC998;&#xC744; &#xD1B5;&#xD574; &#xC628;&#xC804;&#xD55C; URI&#xB97C; &#xC720;&#xCD94;&#xD558;&#xACE0; DNS&#xC5D0;&#xC11C; &#xC801;&#xD569;&#xD55C; IP&#xB97C; &#xB9E4;&#xD551;&#xD558;&#xC5EC; &#xC811;&#xC18D;&#xD569;&#xB2C8;&#xB2E4;.<br>&#x2003;&#xBCF4;&#xC548; &#xC774;&#xC288;&#xB85C; &#xC694;&#xC998;&#xC740; HTTP(&#xD3EC;&#xD2B8; &#xBC88;&#xD638; 80)&#xC774; &#xAC70;&#xC758; &#xC5C6;&#xACE0; HTTPS(&#xD3EC;&#xD2B8; &#xBC88;&#xD638; 443)&#xC774; &#xD45C;&#xC900;&#xC774; &#xB410;&#xC2B5;&#xB2C8;&#xB2E4;. &#xD558;&#xC9C0;&#xB9CC; &#xADF8;&#xB807;&#xB2E4;&#xACE0; &#xBAA8;&#xB4E0; &#xC6F9;&#xC774; HTTPS&#xB97C; &#xAC15;&#xC81C;&#xD558;&#xC9C4; &#xC54A;&#xC73C;&#xBA70;, DNS&#xB294; IP&#xB9CC; &#xC751;&#xB2F5;&#xD569;&#xB2C8;&#xB2E4;. &#xADF8; &#xB54C;&#xBB38;&#xC5D0; &#xAC1C;&#xBC1C;&#xC790;&#xB294; &#xD074;&#xB77C;&#xC774;&#xC5B8;&#xD2B8;&#xAC00; HTTP&#xB85C; &#xC694;&#xCCAD;&#xC744; &#xBCF4;&#xB0B4;&#xB3C4; HTTPS&#xB85C; &#xB9AC;&#xB2E4;&#xC774;&#xB809;&#xD2B8;&#xD558;&#xB3C4;&#xB85D; &#xC124;&#xC815;&#xD569;&#xB2C8;&#xB2E4;.</p><h3 id="%EC%97%94%ED%8A%B8%EB%A6%AC">&#xC5D4;&#xD2B8;&#xB9AC;</h3><blockquote><em>&#xADF8;&#xB7EC;&#xBA74; </em><code><em>https://www.amazon.com</em></code><em>&#xB098;, &#xC815;&#xD655;&#xD55C; IP&#xB97C; &#xC785;&#xB825;&#xD558;&#xBA74; &#xBB34;&#xC2A8; &#xC751;&#xB2F5;&#xC774; &#xC62C;&#xAE4C;&#xC694;?</em></blockquote><p>&#x2003;&#xC6F9;&#xC740; &quot;&#xC694;&#xCCAD;&#xACFC; &#xC751;&#xB2F5;&#xC758; &#xC5F0;&#xC18D;&quot;&#xC785;&#xB2C8;&#xB2E4;. &#xB9AC;&#xC18C;&#xC2A4;&#xB97C; &#xC694;&#xCCAD;&#xD558;&#xBA74; &#xB9AC;&#xC18C;&#xC2A4;&#xB97C; &#xC751;&#xB2F5;&#xD569;&#xB2C8;&#xB2E4;. &#xC0AC;&#xC774;&#xD2B8;&#xB9C8;&#xB2E4; &#xC5D4;&#xD2B8;&#xB9AC;(&#xC9C4;&#xC785;&#xC810;)&#xC740; &#xB2E4;&#xB974;&#xC9C0;&#xB9CC;, &#xD754;&#xD788; <strong>index.html&#xACFC; main.js</strong>&#xB97C; &#xAC00;&#xC838;&#xC640;&#xC11C; &#xC2E4;&#xD589;&#xD569;&#xB2C8;&#xB2E4;. &#xC6F9;&#xC740; &#xACB0;&#xAD6D; HTML, CSS, JS&#xB85C; &#xC774;&#xB8E8;&#xC5B4;&#xC838; &#xC788;&#xAE30; &#xB54C;&#xBB38;&#xC785;&#xB2C8;&#xB2E4;. &#xC6F9;&#xC0AC;&#xC774;&#xD2B8;&#xC5D0; &#xC811;&#xC18D;&#xD55C;&#xB2E4;&#xB294; &#xAC83;&#xC740; CSS&#xB85C; &#xAFB8;&#xBA70;, JS&#xB85C; &#xB3D9;&#xC791;&#xD558;&#xB294; HTML&#xC744; &#xBCF4;&#xB294; &#xAC83;&#xC785;&#xB2C8;&#xB2E4;. <br>&#x2003;URI&#xB294; &#xC2A4;&#xD0B4;, &#xC0AC;&#xC6A9;&#xC790; &#xC774;&#xB984;, &#xBE44;&#xBC00;&#xBC88;&#xD638;, &#xD638;&#xC2A4;&#xD2B8;, &#xB9AC;&#xC18C;&#xC2A4; &#xACBD;&#xB85C;, &#xD30C;&#xB77C;&#xBBF8;&#xD130;, &#xCFFC;&#xB9AC; &#xB4F1;&#xC758; &#xAD6C;&#xC870;&#xB85C; &#xB098;&#xB258;&#xC9C0;&#xB9CC; &#xC77C;&#xBC18; &#xC0AC;&#xC6A9;&#xC790;&#xB294; &#xD638;&#xC2A4;&#xD2B8; &#xC815;&#xB3C4;&#xB9CC; &#xC0AC;&#xC6A9;&#xD569;&#xB2C8;&#xB2E4;. &#xC77C;&#xBC18; &#xC0AC;&#xC6A9;&#xC790;&#xAC00; &#xB9AC;&#xC18C;&#xC2A4; &#xACBD;&#xB85C;&#xB098; &#xCFFC;&#xB9AC;&#xB97C; &#xC54C;&#xAE30;&#xB294; &#xC5B4;&#xB824;&#xC6B8; &#xBFD0;&#xB354;&#xB7EC;, &#xC548;&#xB2E4;&#xACE0; &#xD574;&#xB3C4; &#xAE30;&#xC5B5;&#xD558;&#xAC70;&#xB098; &#xC785;&#xB825;&#xD558;&#xB294; &#xAC74; &#xBD88;&#xD3B8;&#xD558;&#xAE30; &#xB54C;&#xBB38;&#xC785;&#xB2C8;&#xB2E4;. <br>&#x2003;&#xB530;&#xB77C;&#xC11C; &#xD638;&#xC2A4;&#xD2B8;&#xB9CC; &#xC785;&#xB825;&#xD574;&#xB3C4; &#xC5F0;&#xACB0;&#xB418;&#xB294; &#xB9AC;&#xC18C;&#xC2A4;&#xB294; &#xD544;&#xC218;&#xC785;&#xB2C8;&#xB2E4;. &#xADF8;&#xB798;&#xC11C; amazon.com&#xB77C;&#xACE0; &#xC785;&#xB825;&#xD574;&#xB3C4; https://www.amazon.com/index.html&#xB85C; &#xC811;&#xC18D;&#xD558;&#xAC8C; &#xB429;&#xB2C8;&#xB2E4;.</p><h3 id="tcp">TCP</h3><blockquote>&#xC6F9;&#xC5D0;&#xC11C; &#xD14D;&#xC2A4;&#xD2B8;&#xB294; &#xC5B4;&#xB5BB;&#xAC8C; &#xC628;&#xC804;&#xD788; &#xC804;&#xB2EC;&#xB420;&#xAE4C;&#xC694;?</blockquote><h3 id="%EC%98%88%EC%8B%9C-1">&#xC608;&#xC2DC; 1</h3><p>&#x2003;&#xC11C;&#xBC84;&#xAC00; &quot;&#xC5B4;&#xC11C;&#xC624;&#xC138;&#xC694;!&quot; &#xB77C;&#xB294; &#xBA54;&#xC2DC;&#xC9C0;&#xB97C; &#xBCF4;&#xB0B8;&#xB2E4;&#xACE0; &#xAC00;&#xC815;&#xD569;&#xC2DC;&#xB2E4;. &#xC5B4;&#xB5A4; &#xC0C1;&#xD669;&#xC5D0;&#xC11C;&#xB3C4; &quot;&#xC5B4;&#xC11C;&#xC624;&#xC694;!&quot;&#xB77C;&#xB294; &#xAE68;&#xC9C4; &#xAE00;&#xC790;&#xB97C; &#xBC1B;&#xB294; &#xC77C;&#xC740; &#xC5C6;&#xC2B5;&#xB2C8;&#xB2E4;.</p><h3 id="%EC%98%88%EC%8B%9C-2">&#xC608;&#xC2DC; 2</h3><p>&#x2003;&#xB290;&#xB9B0; &#xC778;&#xD130;&#xB137;&#xC73C;&#xB85C; &#xBE14;&#xB85C;&#xADF8;&#xB97C; &#xBCF4;&#xB824;&#xBA74; &#xC2DC;&#xAC04;&#xC774; &#xC0C1;&#xB2F9;&#xD788; &#xAC78;&#xB9BD;&#xB2C8;&#xB2E4;. &#xC6B0;&#xB9AC;&#xB294; 4&#xCD08;&#xAC04; &#xD654;&#xBA74;&#xC774; &#xBA48;&#xCDC4;&#xB2E4;&#xAC00; &#xD55C; &#xBC88;&#xC5D0; &#xBD88;&#xB7EC;&#xC640;&#xC9C0;&#xB294; &#xAC83;&#xBCF4;&#xB2E4;, 7&#xCD08;&#xAC00; &#xAC78;&#xB9AC;&#xB354;&#xB77C;&#xB3C4; &#xC21C;&#xCC28;&#xC801;&#xC73C;&#xB85C; &#xD654;&#xBA74;&#xC774; &#xBD88;&#xB7EC;&#xC640;&#xC9C0;&#xB294; &#xC0AC;&#xC774;&#xD2B8;&#xB97C; &#xC120;&#xD638;&#xD569;&#xB2C8;&#xB2E4;. &#xC774;&#xB7EC;&#xD55C; &#xC0AC;&#xC6A9;&#xC790; &#xACBD;&#xD5D8;&#xC740; &#xC911;&#xC694;&#xD569;&#xB2C8;&#xB2E4;. <br>&#x2003;&#xADF8;&#xB7F0;&#xB370;, &#xCD08;&#xBC18;&#xC774;&#xB098; &#xC911;&#xAC04; &#xD654;&#xBA74;&#xC740; &#xC911;&#xAC04;&#xC911;&#xAC04; &#xAE68;&#xC9C0;&#xC9C0;&#xB9CC; &#xCD5C;&#xC885; &#xD654;&#xBA74;&#xC740; &#xC5B8;&#xC81C;&#xB098; &#xC77C;&#xC815;&#xD569;&#xB2C8;&#xB2E4;. &#xC5B4;&#xB5BB;&#xAC8C; &#xC774;&#xB7F0; &#xBB34;&#xACB0;&#xC131;&#xC744; &#xBCF4;&#xC7A5;&#xD560;&#xAE4C;&#xC694;?</p><h3 id="tcp-%EC%97%B0%EA%B2%B0">TCP &#xC5F0;&#xACB0;</h3><p>&#x2003;&#xC774;&#xCC98;&#xB7FC; &#xB370;&#xC774;&#xD130; &#xC548;&#xC815;&#xC131;&#xC740; &#xC911;&#xC694;&#xD55C; &#xBB38;&#xC81C;&#xC785;&#xB2C8;&#xB2E4;. &#xB530;&#xB77C;&#xC11C; &#xBE0C;&#xB77C;&#xC6B0;&#xC800;&#xB294; &#xC790;&#xC2E0;&#xACFC; &#xC11C;&#xBC84; &#xD3EC;&#xD2B8; &#xC0AC;&#xC774;&#xC5D0; &#xC5F0;&#xACB0; &#xD1B5;&#xB85C;&#xB97C; &#xAD6C;&#xCD95;&#xD574;&#xC11C; &#xB370;&#xC774;&#xD130;&#xB97C; &#xC8FC;&#xACE0;&#xBC1B;&#xACE0;, &#xCCB4;&#xD06C;&#xD569;&#xB2C8;&#xB2E4;. &#xC774;&#xB97C; <strong>TCP &#xC5F0;&#xACB0;</strong>&#xC774;&#xB77C; &#xBD80;&#xB985;&#xB2C8;&#xB2E4;.</p><ol><li>&#xC11C;&#xBC84;&#xAC00; &#xC18C;&#xCF13;&#xC744; &#xB9CC;&#xB4E4;&#xACE0; &#xD3EC;&#xD2B8;&#xC5D0; &#xBC14;&#xC778;&#xB529;.</li><li>&#xC18C;&#xCF13;&#xC5D0; &#xB300;&#xD574; &#xC5F0;&#xACB0;&#xC744; &#xD5C8;&#xC6A9;&#xD558;&#xACE0;, &#xC5F0;&#xACB0;&#xC744; &#xB300;&#xAE30;</li><li>&#xD074;&#xB77C;&#xC774;&#xC5B8;&#xD2B8;&#xAC00; IP&#xC640; &#xD3EC;&#xD2B8;&#xB97C; &#xC54C;&#xC544;&#xB0B4;&#xBA74; &#xC18C;&#xCF13;&#xC744; &#xB9CC;&#xB4E4;&#xACE0; &#xC11C;&#xBC84;&#xC640; &#xC5F0;&#xACB0; &#xC2DC;&#xB3C4;</li><li>&#xC11C;&#xBC84;&#xAC00; &#xC5F0;&#xACB0;&#xC744; &#xD5C8;&#xAC00;</li><li>&#xD074;&#xB77C;&#xC774;&#xC5B8;&#xD2B8;&#xB294; &#xC694;&#xCCAD;&#xC744; &#xBCF4;&#xB0B4;&#xACE0; &#xAE30;&#xB2E4;&#xB9AC;&#xB2E4;&#xAC00; &#xC11C;&#xBC84; &#xC751;&#xB2F5;&#xC744; &#xBC1B;&#xB294;&#xB2E4;</li></ol><h3 id="%EB%8D%B0%EC%9D%B4%ED%84%B0-%EC%88%9C%EC%84%9C-%EB%B3%B4%EC%9E%A5">&#xB370;&#xC774;&#xD130; &#xC21C;&#xC11C; &#xBCF4;&#xC7A5;</h3><p>&#x2003;&#xB370;&#xC774;&#xD130;&#xB294; &#xD55C; &#xBC88;&#xC5D0; &#xD06C;&#xAC8C; &#xC624;&#xAC00;&#xC9C0; &#xC54A;&#xACE0; &#xC544;&#xC8FC; &#xC791;&#xAC8C; &#xB098;&#xB258;&#xC5B4; &#xC218;&#xB9CE;&#xC740; &#xC870;&#xAC01;&#xC73C;&#xB85C; &#xC804;&#xC1A1;&#xB429;&#xB2C8;&#xB2E4;. &#xC774; &#xB54C; &#xD328;&#xD0B7;&#xC5D0; &#xB370;&#xC774;&#xD130; &#xC21C;&#xBC88;&#xACFC; &#xBB34;&#xACB0;&#xC131;&#xC774; &#xC801;&#xD600;&#xC788;&#xACE0;, &#xC218;&#xC2E0;&#xC790;&#xB294; &#xB370;&#xC774;&#xD130;&#xAC00; &#xC81C;&#xB300;&#xB85C; &#xC62C; &#xACBD;&#xC6B0; &#xC798; &#xBC1B;&#xC558;&#xB2E4;&#xACE0; &#xC751;&#xB2F5;&#xD558;&#xACE0;, &#xC548; &#xC624;&#xAC70;&#xB098; &#xC798;&#xBABB; &#xC628; &#xAC83;&#xC740; &#xC798;&#xBABB;&#xB410;&#xB2E4;&#xACE0; &#xC751;&#xB2F5;&#xD569;&#xB2C8;&#xB2E4;. &#xC774;&#xB97C; &#xD1B5;&#xD574; &#xC1A1;&#xC2E0;&#xC790;&#xB294; &#xADF8; &#xC751;&#xB2F5;&#xC744; &#xD1B5;&#xD574; &#xB370;&#xC774;&#xD130;&#xB97C; &#xC628;&#xC804;&#xD558;&#xAC8C; &#xBCF4;&#xB0C5;&#xB2C8;&#xB2E4;. </p><p>&#x2003;&#xC774; &#xBC29;&#xC2DD;&#xC740; &#xC5F0;&#xACB0;&#xC744; &#xB9CC;&#xB4DC;&#xB294; &#xC808;&#xCC28; &#xB54C;&#xBB38;&#xC5D0; &#xC2DC;&#xAC04;&#xC774; &#xAC78;&#xB9B0;&#xB2E4;&#xB294; &#xD2B9;&#xC9D5;&#xC774; &#xC788;&#xACE0;, &#xC9E4;&#xB9C9;&#xD55C; &#xC694;&#xCCAD;&#xC774; &#xC218; &#xBC31;, &#xC218; &#xCC9C; &#xAC1C;&#xAC00; &#xB420; &#xACBD;&#xC6B0; &#xC5F0;&#xACB0; &#xAD6C;&#xCD95;&#xC5D0; &#xC2DC;&#xAC04; &#xB0AD;&#xBE44;&#xB294; &#xC5C4;&#xCCAD;&#xB0A0; &#xAC83;&#xC785;&#xB2C8;&#xB2E4;. &#xADF8;&#xB7EC;&#xB098; &#xB370;&#xC774;&#xD130;&#xC758; &#xBB34;&#xACB0;&#xC131;, &#xB370;&#xC774;&#xD130;&#xC758; &#xC21C;&#xC11C;, &#xB370;&#xC774;&#xD130;&#xC758; &#xC7AC;&#xC804;&#xC1A1; &#xB4F1;&#xC744; &#xBCF4;&#xC7A5;&#xD55C;&#xB2E4;&#xB294; &#xAC15;&#xC810;&#xC774; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;. &#xC77C;&#xBD80; &#xC11C;&#xBE44;&#xC2A4;&#xC5D0;&#xC120; UDP&#xCC98;&#xB7FC; &#xC18D;&#xB3C4; &#xC6B0;&#xC120; &#xD504;&#xB85C;&#xD1A0;&#xCF5C;&#xC774; &#xC911;&#xC694;&#xD569;&#xB2C8;&#xB2E4;&#xB9CC;, &#xB300;&#xBD80;&#xBD84; &#xC11C;&#xBE44;&#xC2A4;&#xC5D0;&#xC11C;&#xB294; TCP&#xB97C; &#xC774;&#xC6A9;&#xD569;&#xB2C8;&#xB2E4;.</p><h3 id="%ED%83%80%EC%9E%85">&#xD0C0;&#xC785;</h3><p>&#x2003;&#xBAA8;&#xB4E0; &#xB370;&#xC774;&#xD130;&#xC5D0;&#xB294; &#xC544;&#xB798;&#xC640; &#xAC19;&#xC740; MIME(Multipurpose Internet Mail Extesions) &#xB77C;&#xBCA8;&#xC774; &#xBD99;&#xC2B5;&#xB2C8;&#xB2E4;.</p><p><code>Content-type: image/jpeg </code><br><code>Content-type: text/html</code></p><p>&#x2003;<strong>&#xBE0C;&#xB77C;&#xC6B0;&#xC800;&#xB294; MIME&#xC744; &#xBCF4;&#xACE0; &#xC790;&#xC2E0;&#xACFC; &#xD638;&#xD658;&#xB418;&#xB294;&#xC9C0; &#xD310;&#xB2E8;</strong>&#xD569;&#xB2C8;&#xB2E4;. &#xC608;&#xB97C; &#xB4E4;&#xBA74; IE &#xAD6C;&#xBC84;&#xC804;&#xC5D0;&#xC11C; AVIF&#xB97C; &#xBCF4;&#xB824;&#xACE0; &#xD558;&#xBA74; &#xBABB; &#xC77D;&#xB294; &#xAC83;&#xCC98;&#xB7FC;&#xC694;.</p><h3 id="%EC%9A%94%EC%B2%AD-%EB%A9%94%EC%8B%9C%EC%A7%80">&#xC694;&#xCCAD; &#xBA54;&#xC2DC;&#xC9C0;</h3><p>&#x2003;&#xC694;&#xCCAD; &#xBA54;&#xC2DC;&#xC9C0;&#xB294; &quot;&#xB204;&#xAD6C;&#xC5D0;&#xAC8C;&quot;, &quot;&#xBB34;&#xC5C7;&#xC744;&quot;, &quot;&#xC5B4;&#xB5BB;&#xAC8C;&quot; &#xD574;&#xB2EC;&#xB77C;&#xB294; &#xC694;&#xCCAD;&#xBB38;&#xC785;&#xB2C8;&#xB2E4;. </p><ul><li>&#xC694;&#xCCAD; &#xB77C;&#xC778;: <br>GET www.literal.com/index.html HTTP/2.0(&#xC694;&#xCCAD; &#xBA54;&#xC18C;&#xB4DC;, URI, &#xD1B5;&#xC2E0; &#xBC84;&#xC804;)</li><li>&#xD5E4;&#xB354;:<br>User-agent: Mozilla/....(&#xD074;&#xB77C;&#xC774;&#xC5B8;&#xD2B8;&#xC758; &#xC5B4;&#xD50C; &#xC815;&#xBCF4;)<br>Host: www.literal.com (&#xD638;&#xC2A4;&#xD2B8; &#xC774;&#xB984;)<br>Accept: text/html, image/gif, /image/jpeg...<br>Accept-Language: ko, en(&#xD55C;&#xAD6D;&#xC5B4; -&gt; &#xC601;&#xC5B4; &#xC21C;&#xC11C;&#xB85C; &#xC751;&#xB2F5;&#xD574;&#xB2EC;&#xB77C;)</li></ul><h3 id="%EC%9D%91%EB%8B%B5-%EB%A9%94%EC%8B%9C%EC%A7%80">&#xC751;&#xB2F5; &#xBA54;&#xC2DC;&#xC9C0;</h3><p>&#x2003;&#xC751;&#xB2F5; &#xBA54;&#xC2DC;&#xC9C0;&#xB294; &quot;&#xBB34;&#xC5C7;&#xC744;&quot;, &quot;&#xC5B4;&#xB5BB;&#xAC8C;&quot; &#xBCF4;&#xB0B4;&#xACA0;&#xB2E4;&#xB294; &#xC124;&#xBA85;&#xBB38;&#xC785;&#xB2C8;&#xB2E4;.</p><ul><li>&#xC751;&#xB2F5; &#xB77C;&#xC778;:<br>HTTP/2.0 200 OK</li><li>&#xD5E4;&#xB354;:<br>Date: 2024/02/02/15:22:32(&#xC11C;&#xBC84;&#xAC00; &#xC751;&#xB2F5;&#xD55C; &#xC2DC;&#xAC01;)<br>server: Apache/....(&#xC624;&#xB9AC;&#xC9C4; &#xC11C;&#xBC84;)<br>Content-type: text/html<br>Content-length: 1221(&#xBC14;&#xC774;&#xD2B8;)<br>Last-modified: 2024/01/01(&#xB9AC;&#xC18C;&#xC2A4;&#xAC00; &#xCD5C;&#xADFC;&#xC5D0; &#xC218;&#xC815;&#xB41C; &#xC2DC;&#xAC01;)</li><li>&#xBCF8;&#xBB38;:<br>&lt;HTML&gt;&lt;HEAD&gt;...&lt;/BODY&gt;&lt;/HTML&gt;</li></ul><h3 id="%ED%94%84%EB%A1%9D%EC%8B%9C">&#xD504;&#xB85D;&#xC2DC;</h3><p>&#x2003;&#xD504;&#xB85D;&#xC2DC;&#xB294; &#xC911;&#xAC1C;&#xC778;&#xC774;&#xB77C;&#xB294; &#xB73B;&#xC785;&#xB2C8;&#xB2E4;. &#xD074;&#xB77C;&#xC774;&#xC5B8;&#xD2B8;&#xC640; &#xC624;&#xB9AC;&#xC9C4; &#xC11C;&#xBC84; &#xC0AC;&#xC774;&#xC5D0;&#xC11C; &#xC694;&#xCCAD;&#xACFC; &#xC751;&#xB2F5;&#xC744; &#xC911;&#xAC1C;&#xD569;&#xB2C8;&#xB2E4;. &#xD544;&#xD130;&#xB9C1;, &#xCE90;&#xC2DC;, &#xBD84;&#xBC30; &#xB4F1; &#xC5EC;&#xB7EC; &#xC5ED;&#xD560;&#xC744; &#xC218;&#xD589;&#xD558;&#xB294; &#xC77C;&#xC885;&#xC758; &#xC11C;&#xBC84;&#xC785;&#xB2C8;&#xB2E4;.</p><h3 id="%EC%84%B8%EC%85%98">&#xC138;&#xC158;</h3><p>&#x2003;&#xC138;&#xC158;&#xC740; &#xBE0C;&#xB77C;&#xC6B0;&#xC800; &#xCEE8;&#xD14D;&#xC2A4;&#xD2B8;(&#xC0C8; &#xD0ED;&#xC73C;&#xB85C; &#xC5F4;&#xAE30; &#xD560; &#xB54C;&#xC758; &#xD0ED;)&#xB97C; &#xAC00;&#xB9AC;&#xD0A4;&#xAE30;&#xB3C4; &#xD558;&#xC9C0;&#xB9CC;, &#xC77C;&#xBC18;&#xC801;&#xC73C;&#xB85C; &#xC11C;&#xBC84;&#xC5D0; &#xBCF4;&#xAD00;&#xD558;&#xB294; &#xC784;&#xC2DC;&#xC801;&#xC778; &#xC0AC;&#xC6A9;&#xC790; &#xC815;&#xBCF4;&#xB97C; &#xC77C;&#xCEEB;&#xC2B5;&#xB2C8;&#xB2E4;. &#xC138;&#xC158;&#xC5D0;&#xB294; &#xCFE0;&#xD0A4;&#xBCF4;&#xB2E4; &#xBCF4;&#xC548;&#xC774; &#xB354; &#xC911;&#xC694;&#xD55C; &#xC0AC;&#xC6A9;&#xC790; &#xC815;&#xBCF4;&#xB97C; &#xBCF4;&#xAD00;&#xD569;&#xB2C8;&#xB2E4;. &#xC8FC;&#xB85C; &#xC7A5;&#xBC14;&#xAD6C;&#xB2C8;&#xB098; &#xB85C;&#xADF8;&#xC778; &#xC0C1;&#xD0DC; &#xB4F1; <strong>&#xC0AC;&#xC6A9;&#xC790;&#xC640;&#xC758; &#xC18C;&#xD1B5; &#xC0C1;&#xD0DC;</strong>&#xB97C; &#xD30C;&#xC545;&#xD558;&#xB294; &#xB3D9;&#xC801;&#xC774;&#xACE0; &#xC784;&#xC2DC;&#xC801;&#xC778; &#xC815;&#xBCF4;&#xB97C; &#xBCF4;&#xAD00;&#xD569;&#xB2C8;&#xB2E4;. &#xC601;&#xAD6C;&#xC801;&#xC774;&#xAC70;&#xB098; &#xBBFC;&#xAC10;&#xD55C; &#xAC1C;&#xC778; &#xC815;&#xBCF4; &#xB4F1;&#xC740; &#xC81C;&#xC678;&#xD569;&#xB2C8;&#xB2E4;. </p><h3 id="%EB%A1%9C%EC%BB%AC-%EC%8A%A4%ED%86%A0%EB%A6%AC%EC%A7%80-%EC%84%B8%EC%85%98-%EC%8A%A4%ED%86%A0%EB%A6%AC%EC%A7%80-indexeddb">&#xB85C;&#xCEEC; &#xC2A4;&#xD1A0;&#xB9AC;&#xC9C0;, &#xC138;&#xC158; &#xC2A4;&#xD1A0;&#xB9AC;&#xC9C0;, indexedDB</h3><p>&#x2003;&#xC138;&#xC158; &#xC2A4;&#xD1A0;&#xB9AC;&#xC9C0;&#xB294; &#xC784;&#xC2DC;&#xC801;&#xC778; &#xB370;&#xC774;&#xD130; &#xBCF4;&#xAD00;&#xC18C;&#xC785;&#xB2C8;&#xB2E4;. &#xCFE0;&#xD0A4;&#xB294; 4kb &#xC774;&#xD558;&#xC758; &#xAC04;&#xACB0;&#xD55C; &#xC815;&#xBCF4;&#xB9CC; &#xBCF4;&#xAD00;&#xD558;&#xACE0;, &#xC138;&#xC158; &#xC2A4;&#xD1A0;&#xB9AC;&#xC9C0;&#xB294; &#xB0B4;&#xAC00; &#xC791;&#xC131;&#xC911;&#xC774;&#xB358; &#xC591;&#xC2DD; &#xB0B4;&#xC6A9;, &#xC774;&#xC804; &#xD398;&#xC774;&#xC9C0; &#xC0C1;&#xD0DC;&#xB97C; &#xC800;&#xC7A5;&#xD558;&#xB294; &#xB4F1; &#xC880; &#xB354; &#xB9CE;&#xC740; &#xC6A9;&#xB7C9;&#xC774; &#xC694;&#xAD6C;&#xB418;&#xAC70;&#xB098; &#xB354;&#xC6B1; &#xC77C;&#xC2DC;&#xC801;&#xC778; &#xAC83;&#xB4E4;&#xC744; &#xC800;&#xC7A5;&#xD569;&#xB2C8;&#xB2E4;. &#xC138;&#xC158;(&#xD0ED;)&#xC744; &#xC885;&#xB8CC;&#xD560; &#xC2DC; &#xC0AC;&#xB77C;&#xC9D1;&#xB2C8;&#xB2E4;.<br>&#x2003;&#xB85C;&#xCEEC; &#xC2A4;&#xD1A0;&#xB9AC;&#xC9C0;&#xB294; &#xBE0C;&#xB77C;&#xC6B0;&#xC800;&#xB97C; &#xC885;&#xB8CC;&#xD574;&#xB3C4; &#xB370;&#xC774;&#xD130;&#xB97C; &#xACC4;&#xC18D; &#xBCF4;&#xAD00;&#xD558;&#xBA70;, &#xC0AC;&#xC6A9;&#xC790; &#xAC1C;&#xC778; &#xC124;&#xC815; &#xB4F1; &#xACC4;&#xC18D; &#xC0AC;&#xC6A9;&#xB418;&#xB294; &#xC815;&#xBCF4;&#xB4E4;&#xC744; &#xC800;&#xC7A5;&#xD569;&#xB2C8;&#xB2E4;.<br>&#x2003;indexedDB&#xB294; &#xC880; &#xB354; &#xB300;&#xC6A9;&#xB7C9;&#xC758; &#xC815;&#xBCF4;&#xB97C; &#xC800;&#xC7A5;&#xD560; &#xC218; &#xC788;&#xC73C;&#xBA70; &#xC2A4;&#xD1A0;&#xB9AC;&#xC9C0;&#xB4E4;&#xBCF4;&#xB2E4; &#xC880; &#xB354; &#xC790;&#xC720;&#xB85C;&#xC6B4; &#xD615;&#xD0DC;&#xC758; &#xB370;&#xC774;&#xD130;&#xB97C; &#xBCF4;&#xAD00;&#xD569;&#xB2C8;&#xB2E4;. &#xC2A4;&#xD1A0;&#xB9AC;&#xC9C0;&#xB294; &#xBB38;&#xC790;&#xC5F4; &#xD615;&#xD0DC;&#xC758; &#xD0A4;-&#xAC12;&#xB9CC; &#xC800;&#xC7A5;&#xD558;&#xAE30; &#xB54C;&#xBB38;&#xC5D0; &#xD30C;&#xC2F1;&#xACFC; &#xC9C1;&#xB82C;&#xD654;&#xAC00; &#xD544;&#xC694;&#xD558;&#xC9C0;&#xB9CC;, indexedDB&#xB294; &#xADF8;&#xB7F0; &#xACFC;&#xC815;&#xC744; &#xAC70;&#xCE58;&#xC9C0; &#xC54A;&#xACE0; &#xBC14;&#xB85C; &#xC800;&#xC7A5;&#xC774; &#xAC00;&#xB2A5;&#xD569;&#xB2C8;&#xB2E4;. <br>&#x2003;GPT&#xAC19;&#xC740; AI &#xCC44;&#xD305;&#xC5D0;&#xC120; &#xAC1C;&#xC778; &#xB9DE;&#xCDA4;&#xD654;&#xB97C; &#xC704;&#xD574; indexedDB&#xC5D0; 20&#xB9CC; &#xC790;&#xAC00; &#xB118;&#xB294; &#xAC1D;&#xCCB4;&#xB97C; &#xC800;&#xC7A5;&#xD558;&#xAE30;&#xB3C4; &#xD558;&#xB294;&#xB370;, &#xC774;&#xB7EC;&#xD55C; &#xB370;&#xC774;&#xD130;&#xB294; &#xC6A9;&#xB7C9; &#xC81C;&#xD55C;&#xC774; &#xC791;&#xC740; &#xACF3;&#xC5D0; &#xBCF4;&#xAD00;&#xD558;&#xAE30; &#xD798;&#xB4E4;&#xACA0;&#xC8E0;.</p><h3 id="%EC%BA%90%EC%8B%9C-%EC%8A%A4%ED%86%A0%EB%A6%AC%EC%A7%80">&#xCE90;&#xC2DC; &#xC2A4;&#xD1A0;&#xB9AC;&#xC9C0;</h3><p>&#x2003;&#xCE90;&#xC2DC; API &#xD639;&#xC740; &#xCE90;&#xC2DC; &#xC2A4;&#xD1A0;&#xB9AC;&#xC9C0;&#xB294; PWA(Progressive Web Application)&#xC744; &#xC704;&#xD574; &#xC790;&#xC8FC; &#xC0AC;&#xC6A9;&#xB418;&#xB294; &#xAC83;&#xC73C;&#xB85C;, &#xC624;&#xD504;&#xB77C;&#xC778; &#xC0C1;&#xD0DC;&#xC77C; &#xB54C;&#xC5D0;&#xB3C4; &#xC6F9;&#xD398;&#xC774;&#xC9C0;&#xB97C; &#xC628;&#xC804;&#xD788; &#xBCF4;&#xC5EC;&#xC8FC;&#xB3C4;&#xB85D; &#xAE30;&#xC5EC;&#xD569;&#xB2C8;&#xB2E4;. &#xC608;&#xB97C; &#xB4E4;&#xBA74; &#xC778;&#xC2A4;&#xD0C0;&#xADF8;&#xB7A8;&#xC740; &#xD53C;&#xB4DC;&#xB4E4;&#xC744; &#xBCF4;&#xB294; &#xC911;&#xC5D0; &#xC778;&#xD130;&#xB137; &#xC5F0;&#xACB0;&#xC774; &#xB04A;&#xAE30;&#xBA74; &#xCE90;&#xC2DC;&#xD55C; &#xD53C;&#xB4DC;&#xC640; &#xC0AC;&#xC9C4;&#xB4E4;&#xC744; &#xBCF4;&#xC5EC;&#xC90C;&#xC73C;&#xB85C;&#xC11C; &#xB9C8;&#xCE58; &#xC778;&#xD130;&#xB137;&#xC774; &#xC5EC;&#xC804;&#xD788; &#xC5F0;&#xACB0;&#xB41C; &#xAC83;&#xB9CC; &#xAC19;&#xC740; &#xC0AC;&#xC6A9;&#xC790; &#xACBD;&#xD5D8;&#xC744; &#xC81C;&#xACF5;&#xD569;&#xB2C8;&#xB2E4;.<br>&#x2003;PWA&#xB294; &#xB9D0; &#xADF8;&#xB300;&#xB85C; &#xC9C4;&#xBCF4;&#xC801;&#xC778; &#xC6F9; &#xC571;&#xC73C;&#xB85C;&#xC11C;, &#xC804;&#xC6A9; &#xC571;&#xC744; &#xC0AC;&#xC6A9;&#xD558;&#xB294; &#xB4EF;&#xD55C; &#xACBD;&#xD5D8;&#xC744; &#xC81C;&#xACF5;&#xD558;&#xB294; &#xC6F9; &#xC571;&#xC785;&#xB2C8;&#xB2E4;. &#xC571;&#xC740; &#xC0AC;&#xC6A9;&#xC774; &#xD3B8;&#xB9AC;&#xD558;&#xC9C0;&#xB9CC; &#xADFC;&#xB798;&#xC5D0;&#xB294; &#xC124;&#xCE58;&#xAC00; &#xADC0;&#xCC2E;&#xB2E4;&#xB294; &#xC778;&#xC2DD;&#xC774; &#xB9CE;&#xC544;&#xC84C;&#xC2B5;&#xB2C8;&#xB2E4;. &#xC774;&#xC5D0; &#xC11C;&#xBE44;&#xC2A4; &#xC81C;&#xACF5;&#xC790;&#xB4E4;&#xC740; &#xC6F9;&#xC73C;&#xB85C;&#xB3C4; &#xCDA9;&#xBD84;&#xD55C; UX&#xB97C; &#xC81C;&#xACF5;&#xD574;&#xC57C;&#xACA0;&#xB2E4;&#xB294; &#xC0DD;&#xAC01;&#xC73C;&#xB85C; &#xC6F9; &#xC571;&#xC744; &#xAC1C;&#xBC1C;&#xD569;&#xB2C8;&#xB2E4;.<br>&#x2003;&#xCE90;&#xC2DC; &#xC2A4;&#xD1A0;&#xB9AC;&#xC9C0;&#xB294; &#xC624;&#xD504;&#xB77C;&#xC778; &#xC0C1;&#xD669;&#xC5D0;&#xB9CC; &#xB300;&#xBE44;&#xD558;&#xB294; &#xAC83;&#xC740; &#xC544;&#xB2D9;&#xB2C8;&#xB2E4;. &#xD544;&#xC694;&#xD55C; &#xAC83;&#xB4E4;&#xC744; &#xCE90;&#xC2DC;&#xD574;&#xC11C; &#xC628;&#xB77C;&#xC778;&#xC5D0;&#xC11C; &#xC880; &#xB354; &#xBE60;&#xB978; &#xBC18;&#xC751;&#xC744; &#xD560; &#xC218; &#xC788;&#xB3C4;&#xB85D; &#xB3D5;&#xAE30;&#xB3C4; &#xD569;&#xB2C8;&#xB2E4;.</p><h3 id="%EB%A6%AC%EB%8B%A4%EC%9D%B4%EB%A0%89%EC%85%98">&#xB9AC;&#xB2E4;&#xC774;&#xB809;&#xC158;</h3><p>&#x2003;&#xB9AC;&#xB2E4;&#xC774;&#xB809;&#xC158;&#xC740; &#xC5EC;&#xB7EC; &#xC774;&#xC720;&#xB85C; &#xD544;&#xC5F0;&#xC801;&#xC785;&#xB2C8;&#xB2E4;. </p><ol><li>&#xC6F9; &#xC11C;&#xBE44;&#xC2A4;&#xB294; &#xC548;&#xC815;&#xC131; &amp; &#xC815;&#xD655;&#xC131; &#xD544;&#xC694;</li></ol><ul><li>&#xC6F9;&#xC0AC;&#xC774;&#xD2B8; &#xAD6C;&#xC870;&#xAC00; &#xBC14;&#xB00C;&#xC5B4;&#xB3C4; &#xC62C;&#xBC14;&#xB978; &#xD398;&#xC774;&#xC9C0;&#xB85C; &#xC548;&#xB0B4;&#xD569;&#xB2C8;&#xB2E4;.</li><li>HTTP&#xB85C; &#xC2DC;&#xB3C4;&#xD574;&#xB3C4; HTTPS&#xB85C; &#xC790;&#xB3D9; &#xC804;&#xD658;&#xD569;&#xB2C8;&#xB2E4;.</li><li>&#xC0AC;&#xC6A9;&#xC790; &#xC778;&#xC99D;&#xC774; &#xD544;&#xC694;&#xD558;&#xBA74; &#xC778;&#xC99D; &#xD398;&#xC774;&#xC9C0;&#xBD80;&#xD130; &#xC774;&#xB3D9;&#xC2DC;&#xD0B5;&#xB2C8;&#xB2E4;.</li></ul><p>2. &#xC6F9; &#xD398;&#xC774;&#xC9C0;&#xB294; &#xBE60;&#xB974;&#xAC8C; &#xB85C;&#xB4DC;&#xB3FC;&#xC57C; &#xD568;.</p><ul><li>&#xC0AC;&#xC6A9;&#xC790;&#xB97C; &#xAC00;&#xAE4C;&#xC6B4; &#xC11C;&#xBC84;&#xB85C; &#xC548;&#xB0B4;&#xD558;&#xC5EC; &#xB85C;&#xB529; &#xC2DC;&#xAC04;&#xC744; &#xC904;&#xC785;&#xB2C8;&#xB2E4;.</li><li>&#xCE90;&#xC2DC;&#xB41C; &#xCF58;&#xD150;&#xCE20;&#xB098; CDN&#xC73C;&#xB85C; &#xB9AC;&#xB2E4;&#xC774;&#xB809;&#xD2B8;&#xD558;&#xC5EC; &#xC751;&#xB2F5; &#xC18D;&#xB3C4;&#xB97C; &#xB192;&#xC785;&#xB2C8;&#xB2E4;.</li><li>&#xBAA8;&#xBC14;&#xC77C; &#xAE30;&#xAE30;&#xC6A9; &#xCD5C;&#xC801;&#xD654;&#xB41C; &#xD398;&#xC774;&#xC9C0;&#xB85C; &#xC790;&#xB3D9; &#xC804;&#xD658;&#xD558;&#xC5EC; &#xB85C;&#xB529; &#xC18D;&#xB3C4;&#xB97C; &#xAC1C;&#xC120;&#xD569;&#xB2C8;&#xB2E4;.</li></ul><p>3. &#xB370;&#xC774;&#xD130; &#xC804;&#xC1A1;&#xB7C9;&#xC740; &#xCD5C;&#xC18C;&#xD654;&#xD558;&#xC5EC; &#xD6A8;&#xC728;&#xC131; &#xC81C;&#xACE0;.</p><ul><li>&#xBD88;&#xD544;&#xC694;&#xD55C; &#xC911;&#xBCF5; &#xCF58;&#xD150;&#xCE20; &#xC694;&#xCCAD;&#xC744; &#xBC29;&#xC9C0;&#xD569;&#xB2C8;&#xB2E4;.</li><li>&#xCD5C;&#xC801;&#xD654;&#xB41C; &#xB9AC;&#xC18C;&#xC2A4;(&#xC608;: &#xC555;&#xCD95;&#xB41C; &#xC774;&#xBBF8;&#xC9C0;)&#xB85C; &#xB9AC;&#xB2E4;&#xC774;&#xB809;&#xD2B8;&#xD558;&#xC5EC; &#xB370;&#xC774;&#xD130; &#xC0AC;&#xC6A9;&#xB7C9;&#xC744; &#xC904;&#xC785;&#xB2C8;&#xB2E4;.</li><li>&#xB85C;&#xB4DC; &#xBC38;&#xB7F0;&#xC2F1;&#xC744; &#xD1B5;&#xD574; &#xC11C;&#xBC84; &#xBD80;&#xD558;&#xB97C; &#xBD84;&#xC0B0;&#xC2DC;&#xD0A4;&#xACE0; &#xC804;&#xCCB4;&#xC801;&#xC778; &#xB124;&#xD2B8;&#xC6CC;&#xD06C; &#xD6A8;&#xC728;&#xC131;&#xC744; &#xB192;&#xC785;&#xB2C8;&#xB2E4;.</li></ul>]]></content:encoded></item><item><title><![CDATA[타임아웃의 장단점]]></title><description><![CDATA[타임아웃이 야기할 수 있는 부작용을 알아봅니다.]]></description><link>https://blog.cinntiq.synology.me/timeout/</link><guid isPermaLink="false">65c0550f7073810001070491</guid><category><![CDATA[HTTP]]></category><category><![CDATA[journal]]></category><dc:creator><![CDATA[Hameln]]></dc:creator><pubDate>Mon, 05 Feb 2024 14:03:07 GMT</pubDate><content:encoded><![CDATA[<p>&#x2003;&#xC778;&#xD130;&#xB137;&#xC73C;&#xB85C; &#xC694;&#xCCAD;&#xC744; &#xBCF4;&#xB0BC; &#xB54C; &#xC751;&#xB2F5;&#xC774; &#xC5C6;&#xC73C;&#xBA74; &#xC5B4;&#xB5BB;&#xAC8C; &#xD574;&#xC57C; &#xD560;&#xAE4C;&#xC694;? <br>&#x2003;&#xC6B0;&#xB9AC;&#xC758; &#xC2DC;&#xAC04;&#xC740; &#xBB34;&#xD55C;&#xD558;&#xC9C0; &#xC54A;&#xC2B5;&#xB2C8;&#xB2E4;. &#xC7A0;&#xC2DC; &#xAE30;&#xB2E4;&#xB824;&#xBCF4;&#xACE0;, &#xB300;&#xAE30; &#xC2DC;&#xAC04;&#xC774; &#xAE38;&#xC5B4;&#xC9C0;&#xBA74; &#xC608;&#xC678; &#xCC98;&#xB9AC;&#xB97C; &#xD569;&#xB2C8;&#xB2E4;. &#xC608;&#xB97C; &#xB4E4;&#xC5B4; &#xC5B4;&#xB5A4; &#xD398;&#xC774;&#xC9C0;&#xC5D0; &#xC811;&#xC18D; &#xC2DC;&#xB3C4;&#xB97C; &#xD588;&#xB2E4;&#xAC00; 10&#xCD08; &#xC774;&#xB0B4;&#xC5D0; &#xC751;&#xB2F5;&#xC774; &#xC5C6;&#xC73C;&#xBA74; &#xC5D0;&#xB7EC; &#xD398;&#xC774;&#xC9C0;&#xB97C; &#xB744;&#xC6B0;&#xB294; &#xAC83;&#xCC98;&#xB7FC;&#xC694;. &#xC774;&#xAC83;&#xC774; &#xD0C0;&#xC784;&#xC544;&#xC6C3; &#xCC98;&#xB9AC;&#xC785;&#xB2C8;&#xB2E4;.<br>&#x2003;&#xD0C0;&#xC784;&#xC544;&#xC6C3;&#xC740; &#xD074;&#xB77C;&#xC774;&#xC5B8;&#xD2B8;&#xB85C; &#xD558;&#xC5EC;&#xAE08; &#xC790;&#xC2E0;&#xC758; &#xC694;&#xCCAD;&#xC774; &#xC815;&#xC0C1; &#xCC98;&#xB9AC;&#xB410;&#xB294;&#xC9C0;, &#xC5D0;&#xB7EC;&#xB0AC;&#xB294;&#xC9C0; &#xD310;&#xB2E8;&#xC744; &#xC27D;&#xB3C4;&#xB85D; &#xD569;&#xB2C8;&#xB2E4;. &#xD558;&#xC9C0;&#xB9CC; &#xD55C;&#xACC4;&#xC810;&#xC774; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;. </p><blockquote><em>&quot;&#xD0C0;&#xC784;&#xC544;&#xC6C3; &#xCC98;&#xB9AC;&#xB97C; &#xC5B8;&#xC81C; &#xD558;&#xC9C0;?&quot;</em></blockquote><p>&#x2003;&#xD0C0;&#xC784;&#xC544;&#xC6C3;&#xC740; &#xD558;&#xB298;&#xC758; &#xACC4;&#xC2DC;&#xB97C; &#xBC1B;&#xB294; &#xAC8C; &#xC544;&#xB2D9;&#xB2C8;&#xB2E4;. &#xAC1C;&#xBC1C;&#xC790;&#xAC00; &#xC9C0;&#xC815;&#xD55C; &#xC2DC;&#xC810;&#xC5D0;, &#xC9C0;&#xC815;&#xD55C; &#xC2DC;&#xAC04; &#xB3D9;&#xC548;&#xB9CC; &#xAE30;&#xB2E4;&#xB9BD;&#xB2C8;&#xB2E4;. &#xC774;&#xC81C; &#xC774;&#xB7EC;&#xD55C; &#xBC1C;&#xBB38;&#xC744; &#xB5A0;&#xC62C;&#xB824;&#xBCFC; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.</p><blockquote><em>&#x201C;&#xAC1C;&#xBC1C;&#xC790;&#xAC00; &#xC9C0;&#xC815;&#xD55C; &#xC2DC;&#xAC04;&#xC774; &#xC5EC;&#xB7EC; &#xBB38;&#xC81C;&#xC5D0; &#xCDA9;&#xBD84;&#xD788; &#xB300;&#xC751;&#xD560; &#xC218; &#xC788;&#xB294; &#xC2DC;&#xAC04;&#xC778;&#xAC00;?&#x201D;</em></blockquote><p>&#x2003;&#xC9C0;&#xC815; &#xC2DC;&#xAC04;&#xC774; &#xAE38;&#xBA74; &#xB290;&#xB9B0; &#xC778;&#xD130;&#xB137;&#xC5D0;&#xB3C4; &#xC815;&#xC0C1; &#xCC98;&#xB9AC;&#xB97C; &#xD558;&#xACA0;&#xC9C0;&#xB9CC; &#xD074;&#xB77C;&#xC774;&#xC5B8;&#xD2B8;&#xAC00; &#xC624;&#xB798; &#xAE30;&#xB2E4;&#xB824;&#xC57C; &#xD560; &#xC218; &#xC788;&#xACE0;, &#xC9C0;&#xC815; &#xC2DC;&#xAC04;&#xC774; &#xC9E7;&#xC73C;&#xBA74; <strong>&#xC815;&#xC0C1; &#xC694;&#xCCAD;&#xB3C4;</strong> <strong>&#xC608;&#xC678; &#xCC98;&#xB9AC;&#xB420; &#xD655;&#xB960;</strong>&#xC774; &#xB192;&#xC544;&#xC9D1;&#xB2C8;&#xB2E4;. </p><h3 id="%EC%99%9C-%EB%91%90-%EB%B2%88-%EC%98%88%EC%95%BD%EB%90%90%EC%A7%80">&#xC65C; &#xB450; &#xBC88; &#xC608;&#xC57D;&#xB410;&#xC9C0;?</h3><p>&#x2003;&#xCE74;&#xC774;&#xD2B8;&#xB294; &#xD56D;&#xACF5;&#xAD8C; &#xC608;&#xB9E4; &#xB4F1; &#xD56D;&#xACF5; &#xC11C;&#xBE44;&#xC2A4;&#xB97C; &#xC81C;&#xACF5;&#xD558;&#xB294; &#xC0AC;&#xC774;&#xD2B8;&#xC785;&#xB2C8;&#xB2E4;. 2023&#xB144; 6&#xC6D4;, &#xCE74;&#xC774;&#xD2B8;&#xB294; &#xC11C;&#xBE44;&#xC2A4;&#xB97C; &#xB9AC;&#xB274;&#xC5BC;&#xD558;&#xB358; &#xC911;, &#xD14C;&#xC2A4;&#xD2B8; &#xACFC;&#xC815;&#xC5D0;&#xC11C; <strong>&#xC608;&#xC57D;&#xC744; &#xD55C; &#xBC88; &#xB204;&#xB974;&#xBA74; &#xB450; &#xAC1C;&#xC758; &#xC608;&#xC57D;&#xC774; &#xC0DD;&#xAE30;&#xB294; &#xC5D0;&#xB7EC;</strong>&#xB97C; &#xB9C8;&#xC8FC;&#xD569;&#xB2C8;&#xB2E4;.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://blog.cinntiq.synology.me/content/images/2024/02/pngegg.png" class="kg-image" alt loading="lazy" width="635" height="524" srcset="https://blog.cinntiq.synology.me/content/images/size/w600/2024/02/pngegg.png 600w, https://blog.cinntiq.synology.me/content/images/2024/02/pngegg.png 635w"><figcaption>&#xC598; &#xC65C; &#xC774;&#xB798;?</figcaption></figure><p>&#x2003;&#xC774; &#xC5D0;&#xB7EC;&#xB294; <strong>&#xC8FC;&#xC5D0; &#xB2E4;&#xC12F; &#xAC74;</strong> &#xAC00;&#xB7C9; &#xBC1C;&#xC0DD;&#xD588;&#xC2B5;&#xB2C8;&#xB2E4;. &#xADF8; &#xC0C1;&#xD0DC;&#xB85C; &#xBC30;&#xD3EC;&#xD588;&#xB2E4;&#xAC04; &#xACE0;&#xAC1D;&#xC758; &#xBB34;&#xC218;&#xD55C; &#xCEF4;&#xD50C;&#xB808;&#xC778;&#xC774; &#xC2A4;&#xCF00;&#xC904;&#xC5D0; &#xB4E4;&#xC5B4;&#xAC00;&#xBBC0;&#xB85C; &#xAC00;&#xB9CC;&#xD788; &#xB458; &#xC218; &#xC5C6;&#xC5C8;&#xC2B5;&#xB2C8;&#xB2E4;.<br>&#x2003;&#xAC1C;&#xBC1C;&#xC790;&#xB294; &#xC989;&#xC2DC; &#xB85C;&#xADF8;&#xB97C; &#xBD84;&#xC11D;&#xD588;&#xC2B5;&#xB2C8;&#xB2E4;. <strong>&#xB300;&#xAE30; &#xC2DC;&#xAC04;&#xC774; 30&#xCD08;&#xAC00; &#xB118;&#xC5B4;&#xAC08; &#xC2DC;&#xC810;&#xC5D0; &#xC790;&#xB3D9;&#xC73C;&#xB85C; &#xC7AC;&#xC2DC;&#xB3C4; &#xC694;&#xCCAD;</strong>&#xC774; &#xC77C;&#xC5B4;&#xB098;&#xACE0;, <strong>&#xADF8;&#xB798;&#xC11C; &#xC911;&#xBCF5; &#xC608;&#xC57D;</strong>&#xC774; &#xB41C;&#xB2E4;&#xB294; &#xC0AC;&#xC2E4;&#xC744; &#xBC1C;&#xACAC;&#xD588;&#xC2B5;&#xB2C8;&#xB2E4;. &#xBB38;&#xC81C;&#xB294; &#xADF8; &#xD604;&#xC0C1;&#xC774; <strong>&#xC5B4;&#xB514;</strong>&#xC5D0;&#xC11C; &#xC77C;&#xC5B4;&#xB098;&#xB0D0;&#xB294; &#xAC83;&#xC774;&#xC5C8;&#xC2B5;&#xB2C8;&#xB2E4;.<br>&#x2003;<strong>&#xBE0C;&#xB77C;&#xC6B0;&#xC800;, axios &#xC124;&#xC815;, AWS, &#xB9AC;&#xBC84;&#xC2A4; &#xD504;&#xB85D;&#xC2DC;, &#xAC8C;&#xC774;&#xD2B8;&#xC6E8;&#xC774;, gRPC &#xC11C;&#xBC84;</strong>...&#xD074;&#xB77C;&#xC774;&#xC5B8;&#xD2B8; &#xB2E8;&#xBD80;&#xD130; &#xC624;&#xB9AC;&#xC9C4; &#xC11C;&#xBC84;&#xAE4C;&#xC9C0; &#xC21C;&#xC11C;&#xB300;&#xB85C;, &#xB2E8;&#xACC4;&#xB9C8;&#xB2E4; &#xAF3C;&#xAF3C;&#xD788; &#xC0B4;&#xD3C8;&#xC9C0;&#xB9CC; &#xC5B4;&#xB514;&#xC5D0;&#xC11C;&#xB3C4; &#xBB38;&#xC81C;&#xB97C; &#xCC3E;&#xC744; &#xC218; &#xC5C6;&#xC5C8;&#xC2B5;&#xB2C8;&#xB2E4;.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://blog.cinntiq.synology.me/content/images/2024/02/pngegg--5-.png" class="kg-image" alt loading="lazy" width="618" height="526" srcset="https://blog.cinntiq.synology.me/content/images/size/w600/2024/02/pngegg--5-.png 600w, https://blog.cinntiq.synology.me/content/images/2024/02/pngegg--5-.png 618w"><figcaption>&#xB300;&#xCCB4; &#xC65C; &#xC774;&#xB7EC;&#xB294; &#xAC74;&#xB370;...</figcaption></figure><p>&#x2003;&#xC0AC;&#xAC74;&#xC774; &#xBBF8;&#xAD81;&#xC5D0; &#xBE60;&#xC9C8; &#xBB34;&#xB835;, &#xAC1C;&#xBC1C;&#xC790;&#xB294; &#xB3D9;&#xB8CC;&#xC758; &#xB3C4;&#xC6C0;&#xC744; &#xBC1B;&#xC544; &#xAC04;&#xC2E0;&#xD788; &#xC9C4;&#xC2E4;&#xC744; &#xCC3E;&#xC544;&#xB0C8;&#xC2B5;&#xB2C8;&#xB2E4;. &#xC54C;&#xACE0; &#xBCF4;&#xB2C8; <strong>&#xC77C;&#xBD80; &#xC0AC;&#xBB34;&#xC2E4;&#xC758; &#xBCF4;&#xC548; &#xB124;&#xD2B8;&#xC6CC;&#xD06C; &#xC124;&#xC815;</strong>&#xC774; 30&#xCD08; &#xD0C0;&#xC784;&#xC544;&#xC6C3;&#xC73C;&#xB85C; &#xB3FC;&#xC788;&#xC5C8;&#xACE0;, &#xADF8; &#xB54C; <strong>&#xD06C;&#xB86C; &#xBE0C;&#xB77C;&#xC6B0;&#xC800;&#xAC00; &#xC7AC;&#xC2DC;&#xB3C4; &#xC694;&#xCCAD;</strong>&#xC744; &#xBCF4;&#xB0B4;&#xC11C; &#xC608;&#xC57D;&#xC774; &#xC911;&#xBCF5;&#xB410;&#xB358; &#xAC83;&#xC785;&#xB2C8;&#xB2E4;.<br>&#x2003;&#xAE4C;&#xB2E4;&#xB85C;&#xC6B4; &#xC804;&#xC81C;&#xB77C;&#xACE0; &#xBCF4;&#xC5EC;&#xB3C4;, &#xACE0;&#xAC1D;&#xC774; &#xB290;&#xB9B0; &#xC778;&#xD130;&#xB137;&#xC744; &#xC0AC;&#xC6A9;&#xD55C;&#xB2E4;&#xBA74; &#xC5BC;&#xB9C8;&#xB4E0;&#xC9C0; &#xBC1C;&#xC0DD;&#xD560; &#xC218; &#xC788;&#xB294; &#xC5D0;&#xB7EC;&#xC785;&#xB2C8;&#xB2E4;. &#xAC1C;&#xBC1C;&#xC790;&#xB294; &#xBCF8;&#xC9C8;&#xC801;&#xC778; &#xD574;&#xACB0;&#xC774; &#xD544;&#xC694;&#xD558;&#xB2E4;&#xACE0; &#xB290;&#xAF08;&#xACE0; &#xC544;&#xB798;&#xC640; &#xAC19;&#xC774; &#xCC98;&#xB9AC;&#xD588;&#xC2B5;&#xB2C8;&#xB2E4;.</p><ol><li>&#xC608;&#xC57D; &#xC0DD;&#xC131; &#xC804;&#xC5D0; &#xBBF8;&#xB9AC; &#xC608;&#xC57D; &#xD0A4;(key) &#xBC1C;&#xAE09; API&#xB97C; &#xD638;&#xCD9C;&#xD558;&#xC5EC; &#xC608;&#xC57D; &#xD0A4; &#xAC12;&#xC744; &#xBC1B;&#xC544;&#xC634;</li><li>&#xAE30;&#xC874; &#xC608;&#xC57D; &#xC0DD;&#xC131; API &#xD638;&#xCD9C;&#xC2DC; 1&#xBC88; &#xB2E8;&#xACC4;&#xC5D0;&#xC11C; &#xBC1B;&#xC544;&#xC628; &#xD0A4;&#xAC12;&#xC744; &#xD56D;&#xC0C1; &#xAC19;&#xC774; &#xB123;&#xC5B4;&#xC11C; &#xC804;&#xC1A1;</li></ol><p>&#x2003;&#xC774;&#xC640; &#xAC19;&#xC740; &#xCC98;&#xB9AC;&#xB97C; &#xD558;&#xBA74; n&#xBC88;&#xC758; &#xC694;&#xCCAD;&#xC744; &#xBCF4;&#xB0B4;&#xB3C4; 1&#xAC1C;&#xC758; &#xACB0;&#xACFC;&#xB9CC; &#xBC1C;&#xC0DD;&#xD569;&#xB2C8;&#xB2E4;. HTTP&#xC5D0;&#xC120; &#xC774;&#xB7EC;&#xD55C; &#xC131;&#xC9C8;&#xC744; <strong>&#xBA71;&#xB4F1;&#xC131;</strong>&#xC774;&#xB77C; &#xBD80;&#xB985;&#xB2C8;&#xB2E4;.</p><h3 id="%EA%B1%B0%EB%A6%AC%EA%B0%80-%EB%A9%80%EB%A9%B4-%EC%9D%B4%EB%A9%94%EC%9D%BC%EC%9D%B4-%EC%95%88-%EB%B3%B4%EB%82%B4%EC%A0%B8%EC%9A%94">&#xAC70;&#xB9AC;&#xAC00; &#xBA40;&#xBA74; &#xC774;&#xBA54;&#xC77C;&#xC774; &#xC548; &#xBCF4;&#xB0B4;&#xC838;&#xC694;</h3><p>&#x2003;&quot;&#xAC70;&#xB9AC;&#xAC00; &#xBA38;&#xB2C8;&#xAE4C; &#xC774;&#xBA54;&#xC77C;&#xC744; &#xBCF4;&#xB0BC; &#xC218; &#xC5C6;&#xB2E4;.&quot;&#xB780; &#xB9D0;&#xC744; &#xB4E4;&#xC73C;&#xBA74; &#xCF54;&#xC6C3;&#xC74C;&#xCE58;&#xAC70;&#xB098; &#xB2F9;&#xD669;&#xD560; &#xAC81;&#xB2C8;&#xB2E4;. &#xD558;&#xC9C0;&#xB9CC; &#xC2E4;&#xC81C; &#xC0C1;&#xD669;&#xC785;&#xB2C8;&#xB2E4;. &#xC544;&#xB798;&#xB294; <em>Trey Harris</em>&#xB77C;&#xB294; &#xC0AC;&#xB78C;&#xC758; &#xACBD;&#xD5D8;&#xB2F4;&#xC744; &#xBC88;&#xC5ED;&#xD588;&#xC2B5;&#xB2C8;&#xB2E4;. &#xAE30;&#xC220;&#xC801;&#xC778; &#xBB18;&#xC0AC;&#xAC00; &#xBD80;&#xC815;&#xD655;&#xD558;&#xB2E4;&#xB294; &#xC9C0;&#xC801;&#xB3C4; &#xC788;&#xC9C0;&#xB9CC; &#xC800;&#xC790;&#xB294; &#xC54C;&#xAE30; &#xC27D;&#xACE0; &#xC7AC;&#xBBF8;&#xC788;&#xAC8C; &#xC804;&#xB2EC;&#xD558;&#xAE30; &#xC704;&#xD574; &#xADF8;&#xB807;&#xAC8C; &#xCD95;&#xC57D;&#xD588;&#xB2E4;&#xACE0; &#xD569;&#xB2C8;&#xB2E4;. &#xD55C; &#xBC88; &#xBCF4;&#xC2DC;&#xC8E0;.</p><hr><p>&#x2003;<em>&#xBA87; &#xB144; &#xC804;, &#xB0B4;&#xAC00; &#xB300;&#xD559; &#xC774;&#xBA54;&#xC77C; &#xC2DC;&#xC2A4;&#xD15C; &#xC6B4;&#xC601; &#xC5C5;&#xBB34;&#xB97C; &#xD558;&#xB358; &#xB54C;&#xC600;&#xB2E4;. &#xD1B5;&#xACC4;&#xD559;&#xACFC; &#xD559;&#xACFC;&#xC7A5;&#xC73C;&#xB85C;&#xBD80;&#xD130; &#xC804;&#xD654;&#xAC00; &#xC654;&#xB2E4;.</em></p><p>&quot;&#xD559;&#xAD50; &#xBC16;&#xC73C;&#xB85C; &#xC774;&#xBA54;&#xC77C;&#xC744; &#xBCF4;&#xB0B4;&#xB824;&#xACE0; &#xD558;&#xBA74; &#xBB38;&#xC81C;&#xAC00; &#xC788;&#xC5B4;&#xC694;.&quot;<br>&quot;&#xBB34;&#xC2A8; &#xBB38;&#xC81C;&#xC8E0;?&quot;<br>&quot;500&#xB9C8;&#xC77C; &#xC774;&#xC0C1; &#xB5A8;&#xC5B4;&#xC9C4; &#xACF3;&#xC5D0; &#xBA54;&#xC77C;&#xC774; &#xC548; &#xBCF4;&#xB0B4;&#xC838;&#xC694;.&quot;<br>&#xB098;&#xB294; &#xB77C;&#xB5BC;&#xB97C; &#xB9C8;&#xC2DC;&#xB2E4;&#xAC00; &#xBAA9;&#xC774; &#xD131; &#xB9C9;&#xD614;&#xB2E4;.<br>&quot;&#xBB50;&#xB77C;&#xACE0;&#xC694;?&quot;<br>&quot;&#xC5EC;&#xAE30;&#xC11C; 500&#xB9C8;&#xC77C; &#xC774;&#xC0C1; &#xB5A8;&#xC5B4;&#xC9C4; &#xACF3;&#xC5D4; &#xBA54;&#xC77C;&#xC774; &#xBCF4;&#xB0B4;&#xC9C0;&#xC9C0; &#xC54A;&#xC544;&#xC694;.&quot; <br>&#xADF8;&#xAC00; &#xB2E4;&#xC2DC;&#xAE08; &#xB9D0;&#xD588;&#xB2E4;.<br>&quot;&#xC880; &#xB354; &#xC815;&#xD655;&#xD788;&#xB294; 520&#xB9C8;&#xC77C; &#xC815;&#xB3C4;&#xC608;&#xC694;. &#xADF8; &#xC774;&#xC0C1;&#xBD80;&#xD130; &#xC548; &#xBCF4;&#xB0B4;&#xC838;&#xC694;.&quot;<br>&quot;&#xC74C;...&#xC774;&#xBA54;&#xC77C; &#xC804;&#xC1A1; &#xBC29;&#xC2DD;&#xC740; &#xAC70;&#xB9AC;&#xD558;&#xACE4; &#xC0C1;&#xAD00;&#xC774; &#xC5C6;&#xC5B4;&#xC694;. &#xBCF4;&#xD1B5;&#xC740;&#xC694;.&quot; <br><br>&#x2003;&#xB098;&#xB294; &#xB2F9;&#xD669;&#xD558;&#xC9C0; &#xC54A;&#xC73C;&#xB824;&#xACE0; &#xC560;&#xC37C;&#xB2E4;. &#xD1B5;&#xACC4;&#xD559;&#xACFC;&#xCC98;&#xB7FC; &#xC57D;&#xC18C;&#xD55C; &#xD559;&#xACFC;&#xB77C;&#xB3C4;, &#xD559;&#xACFC;&#xC7A5;&#xCBE4; &#xB418;&#xB294; &#xC0AC;&#xB78C; &#xC55E;&#xC5D0;&#xC11C; &#xD328;&#xB2C9;&#xC5D0; &#xBE60;&#xC9C4; &#xBAA8;&#xC2B5;&#xC744; &#xBCF4;&#xC5EC;&#xC11C;&#xB294; &#xC548; &#xB410;&#xB2E4;.<br><br>&quot;&#xC5B4;&#xB5A4; &#xAC83; &#xB54C;&#xBB38;&#xC5D0; 500&#xB9C8;&#xC77C; &#xC774;&#xC0C1; &#xB5A8;&#xC5B4;&#xC9C4; &#xACF3;&#xC5D0; &#xBA54;&#xC77C;&#xC744; &#xBABB; &#xBCF4;&#xB0B8;&#xB2E4;&#xACE0; &#xC0DD;&#xAC01;&#xD558;&#xC2DC;&#xB098;&#xC694;?&quot;<br>&quot;&#xC81C; &#xC0DD;&#xAC01;&#xC774; &#xC544;&#xB2C8;&#xC5D0;&#xC694;. &#xC774; &#xBB38;&#xC81C;&#xB97C; &#xBA70;&#xCE60; &#xC804;&#xC5D0; &#xC54C;&#xACE0;&#xC11C;&quot;<br>&quot;&#xBA70;&#xCE60; &#xC804;&#xC694;?&quot; <br>&#xB098;&#xB294; &#xB180;&#xB790;&#xB2E4;.<br>&quot;&#xADF8; &#xB3D9;&#xC548; &#xBA54;&#xC77C;&#xC744; &#xBABB; &#xBCF4;&#xB0C8;&#xC5B4;&#xC694;?&quot;<br>&quot;&#xBCF4;&#xB0C8;&#xC5B4;&#xC694;. &#xADF8;&#xB7F0;&#xB370; &#xAC70;&#xB9AC;&#xAC00; &#xC5B4;&#xB290; &#xC815;&#xB3C4; &#xBA40;&#xC5B4;&#xC9C0;&#xBA74;&quot;<br>&quot;500&#xB9C8;&#xC77C; &#xC815;&#xB3C4;&#xB7AC;&#xC8E0;.&quot; <br>&#xB098;&#xB294; &#xADF8;&#xB97C; &#xC704;&#xD574; &#xAD6C;&#xCCB4;&#xC801;&#xC778; &#xC218;&#xCE58;&#xB85C; &#xB9DE;&#xC7A5;&#xAD6C;&#xCCE4;&#xB2E4;.<br>&quot;&#xADF8;&#xB7F0;&#xB370; &#xC65C; &#xC880; &#xB354; &#xC77C;&#xCC0D; &#xC804;&#xD654; &#xC548; &#xD558;&#xC168;&#xC5B4;&#xC694;?&quot;<br>&quot;&#xBD84;&#xC11D;&#xD560; &#xB370;&#xC774;&#xD130;&#xAC00; &#xCDA9;&#xBD84;&#xD558;&#xAC8C; &#xBAA8;&#xC774;&#xC9C8; &#xC54A;&#xC558;&#xC5C8;&#xC5B4;&#xC694;.&quot; <br>&#xC544;&#xCC28;, &#xC774; &#xC0AC;&#xB78C;&#xC740; &#xD1B5;&#xACC4;&#xD559;&#xACFC;&#xC600;&#xC9C0;. <br>&quot;&#xC5B4;&#xCA0C;&#xB4E0;, &#xC9C0;&#xAD6C;&#xD1B5;&#xACC4;&#xD559;&#xACFC;&#xC5D0; &#xC870;&#xC0AC;&#xB97C; &#xBD80;&#xD0C1;&#xD588;&#xC5B4;&#xC694;&quot;<br>&quot;&#xC9C0;&#xAD6C;&#xD1B5;&#xACC4;&#xD559;&#xACFC; &#xB9D0;&#xC774;&#xC8E0;...&quot;<br>&quot;&#xB124;. &#xADF8;&#xB9AC;&#xACE0; &#xADF8;&#xB140;&#xB294; &#xC9C0;&#xB3C4;&#xC5D0; &#xBA54;&#xC77C; &#xC1A1;&#xC2E0;&#xC774; &#xAC00;&#xB2A5;&#xD55C; &#xBC18;&#xACBD;&#xC744; &#xADF8;&#xB838;&#xC5B4;&#xC694;. &#xBC18;&#xACBD; &#xADFC;&#xCC98;&#xC5D0;&#xC120; &#xC1A1;&#xC2E0;&#xC774; &#xBD88;&#xD655;&#xC2E4;&#xD558;&#xC9C0;&#xB9CC; &#xBC14;&#xAE65;&#xC73C;&#xB85C; &#xBC97;&#xC5B4;&#xB098;&#xBA74; &#xD655;&#xC2E4;&#xD558;&#xAC8C; &#xC774;&#xBA54;&#xC77C;&#xC774; &#xC548; &#xBCF4;&#xB0B4;&#xC838;&#xC694;.&quot;<br>&quot;&#xC54C;&#xACA0;&#xC5B4;&#xC694;.&quot; <br>&#xB098;&#xB294; &#xB300;&#xB2F5;&#xD558;&#xACE4; &#xBA38;&#xB9AC;&#xB97C; &#xC9DA;&#xC5C8;&#xB2E4;. <br>&quot;&#xC5B8;&#xC81C;&#xBD80;&#xD130; &#xADF8;&#xB7AC;&#xB098;&#xC694;? &#xBA70;&#xCE60; &#xC804;&#xC774;&#xB77C;&#xACE0; &#xD588;&#xB294;&#xB370; &#xADF8;&#xB54C; &#xC2DC;&#xC2A4;&#xD15C;&#xC5D0; &#xBB34;&#xC2A8; &#xBCC0;&#xD654;&#xAC00; &#xC788;&#xC5C8;&#xB098;&#xC694;?&quot;<br>&quot;&#xC74C;, &#xCEE8;&#xC124;&#xD134;&#xD2B8;&#xAC00; &#xC640;&#xC11C; &#xC11C;&#xBC84;&#xB97C; &#xD328;&#xCE58;&#xD558;&#xACE0; &#xC7AC;&#xBD80;&#xD305;&#xD588;&#xC5B4;&#xC694;. &#xC804;&#xD654;&#xD588;&#xB294;&#xB370; &#xADF8;&#xB294; &#xBA54;&#xC77C; &#xC2DC;&#xC2A4;&#xD15C;&#xC740; &#xC548; &#xAC74;&#xB4DC;&#xB838;&#xB2E4;&#xB354;&#xAD70;&#xC694;.&quot;<br>&quot;&#xC54C;&#xACA0;&#xC2B5;&#xB2C8;&#xB2E4;. &#xC870;&#xC0AC;&#xD574;&#xBCF4;&#xACE0; &#xB2E4;&#xC2DC; &#xC804;&#xD654;&#xB4DC;&#xB9AC;&#xC8E0;.&quot; <br><br>&#x2003;&#xB098;&#xB294; &#xB0B4;&#xAC00; &#xCC98;&#xD55C; &#xC0C1;&#xD669;&#xC744; &#xBBFF;&#xC744; &#xC218; &#xC5C6;&#xC5C8;&#xB2E4;. &#xC801;&#xC5B4;&#xB3C4; &#xC624;&#xB298;&#xC774; &#xB9CC;&#xC6B0;&#xC808;&#xC740; &#xC544;&#xB2C8;&#xC5C8;&#xB2E4;. &#xB204;&#xAD70;&#xAC00; &#xB098;&#xD55C;&#xD14C; &#xC774;&#xB7F0; &#xC7A5;&#xB09C;&#xC744; &#xCE60;&#xB9CC;&#xD55C; &#xC0AC;&#xB78C;&#xC774; &#xC788;&#xB098; &#xACE0;&#xBBFC;&#xB3C4; &#xB4E4;&#xC5C8;&#xB2E4;.<br>&#x2003;&#xB098;&#xB294; &#xC11C;&#xBC84;&#xC5D0; &#xB85C;&#xADF8;&#xC778;&#xD574;&#xC11C; &#xD14C;&#xC2A4;&#xD2B8; &#xC774;&#xBA54;&#xC77C;&#xC744; &#xBA87; &#xAC1C; &#xBCF4;&#xB0C8;&#xB2E4;. &#xC11C;&#xBC84;&#xB294; &#xB178;&#xC2A4; &#xCE90;&#xB864;&#xB77C;&#xC774;&#xB098; &#xB9AC;&#xC11C;&#xCE58; &#xD2B8;&#xB77C;&#xC774;&#xC575;&#xAE00;&#xC5D0; &#xC704;&#xCE58;&#xD574;&#xC788;&#xACE0; &#xC2A4;&#xC2A4;&#xB85C;&#xC5D0;&#xAC8C; &#xBCF4;&#xB0B4;&#xB294; &#xAC74; &#xBB38;&#xC81C;&#xC5C6;&#xC5C8;&#xB2E4;. <br>&#x2003;&#xB9AC;&#xCE58;&#xBAAC;&#xB4DC;, &#xC560;&#xD2C0;&#xB79C;&#xD0C0;, &#xC6CC;&#xC2F1;&#xD134;, &#xD504;&#xB9B0;&#xC2A4;&#xD134;(400&#xB9C8;&#xC77C;)&#xB3C4; &#xC798; &#xB410;&#xB2E4;. &#xD558;&#xC9C0;&#xB9CC; &#xBA64;&#xD53C;&#xC2A4;(600&#xB9C8;&#xC77C;)&#xB85C; &#xBCF4;&#xB0B4;&#xB824;&#xB294; &#xC2DC;&#xB3C4;&#xB294; &#xC2E4;&#xD328;&#xD588;&#xB2E4;. &#xBCF4;&#xC2A4;&#xD134;, &#xB514;&#xD2B8;&#xB85C;&#xC774;&#xD2B8;&#xB3C4; &#xC2E4;&#xD328;. <br>&#x2003;&#xB098;&#xB294; &#xC8FC;&#xC18C;&#xB85D;&#xC744; &#xAEBC;&#xB0B4;&#xC5B4; &#xBC94;&#xC704;&#xB97C; &#xC881;&#xD600;&#xB098;&#xAC14;&#xB2E4;. &#xB274;&#xC695;(420&#xB9C8;&#xC77C;)&#xC740; &#xB418;&#xACE0; &#xD504;&#xB85C;&#xBE44;&#xB358;&#xC2A4;(580&#xB9C8;&#xC77C;)&#xB294; &#xC2E4;&#xD328;&#xD588;&#xB2E4;. &#xC815;&#xC2E0;&#xC744; &#xC783;&#xC744; &#xAC83;&#xB9CC; &#xAC19;&#xC558;&#xB2E4;. <strong>&#xB178;&#xC2A4; &#xCE90;&#xB864;&#xB77C;&#xC774;&#xB098;&#xC5D0; &#xAC70;&#xC8FC;</strong>&#xD558;&#xC9C0;&#xB9CC; <strong>ISP(&#xC778;&#xD130;&#xB137; &#xC11C;&#xBE44;&#xC2A4; &#xC81C;&#xACF5;&#xC790;, Internet service provider)&#xAC00; &#xC2DC;&#xC560;&#xD2C0;</strong>&#xC5D0; &#xC788;&#xB294; &#xCE5C;&#xAD6C;&#xC5D0;&#xAC8C; &#xC774;&#xBA54;&#xC77C;&#xC744; &#xBCF4;&#xB0B4;&#xBD24;&#xACE0;, &#xB2E4;&#xD589;&#xC2A4;&#xB7FD;&#xAC8C;&#xB3C4; <strong>&#xC2E4;&#xD328;</strong>&#xD588;&#xB2E4;. <br>&#x2003;&#xB9CC;&#xC57D; &#xBB38;&#xC81C; &#xC6D0;&#xC778;&#xC774; &#xC11C;&#xBC84;&#xAC00; &#xC544;&#xB2C8;&#xB77C; &#xC218;&#xC2E0;&#xC790;&#xAC00; &#xC0AC;&#xB294; &#xC9C0;&#xC5ED;&#xC774;&#xC5C8;&#xB2E4;&#xBA74; &#xD391;&#xD391; &#xC6B8;&#xC5C8;&#xC744; &#xAC83;&#xC774;&#xB2E4;. &#xBBFF;&#xC744; &#xC218; &#xC5C6;&#xAC8C;&#xB3C4;, &#xC774;&#xAC74; &#xC7AC;&#xBC1C; &#xAC00;&#xB2A5;&#xD55C; &#xBB38;&#xC81C;&#xB77C;&#xACE0; &#xD655;&#xC778;&#xB410;&#xAE30;&#xC5D0; sendmail.cf &#xD30C;&#xC77C;&#xC744; &#xD6D1;&#xC5B4;&#xBD24;&#xB2E4;. &#xB9E4;&#xC6B0; &#xC775;&#xC219;&#xD588;&#xACE0; &#xC544;&#xBB34; &#xBB38;&#xC81C; &#xC5C6;&#xC5B4;&#xBCF4;&#xC600;&#xB2E4;. &#xB0B4; &#xD648; &#xB514;&#xB809;&#xD1A0;&#xB9AC;&#xC758; sendmail.cf&#xC640; &#xBE44;&#xAD50;&#xD574;&#xB3C4; &#xB2E4;&#xB978; &#xAC8C; &#xC5C6;&#xC5C8;&#xB2E4;. &#xB0B4;&#xAC00; &#xC791;&#xC131;&#xD55C; sendmail.cf&#xC774; &#xB9DE;&#xACE0;, &#xD2B9;&#xBCC4;&#xD788; &#xB0B4;&#xAC00; &quot;500 &#xB9C8;&#xC77C; &#xB118;&#xB294; &#xACF3;&#xC5D0;&#xB294; &#xC804;&#xC1A1; &#xBABB;&#xD568;&quot; &#xC635;&#xC158;&#xC744; &#xBD99;&#xC774;&#xC9C0;&#xB294; &#xC54A;&#xC558;&#xC74C;&#xC774; &#xBD84;&#xBA85;&#xD588;&#xB2E4;. &#xB9C9;&#xB9C9;&#xD574;&#xC9C4; &#xB098;&#xB294; SMTP &#xD3EC;&#xD2B8;&#xB85C; &#xD154;&#xB137;&#xC5D0; &#xC811;&#xC18D;&#xD588;&#xACE0; &#xC11C;&#xBC84;&#xAC00; &#xC36C;OS &#xC13C;&#xB4DC;&#xBA54;&#xC77C; &#xBC30;&#xB108;&#xB85C; &#xB098;&#xB97C; &#xBC18;&#xACBC;&#xB2E4;.<br>&#x2003;&#xC7A0;&#xAE50;... &#xC36C;OS &#xC13C;&#xB4DC;&#xBA54;&#xC77C; &#xBC30;&#xB108;&#xB77C;? &#xB2F9;&#xC2DC; &#xC13C;&#xB4DC;&#xBA54;&#xC77C; 8&#xC740; &#xCDA9;&#xBD84;&#xD788; &#xC548;&#xC815;&#xB41C; &#xBC84;&#xC804;&#xC774;&#xC5C8;&#xC9C0;&#xB9CC;, &#xAD6C;&#xB2E5;&#xB2E4;&#xB9AC; 5 &#xBC84;&#xC804;&#xB3C4; &#xBC84;&#xC813;&#xC774; &#xBC30;&#xD3EC;&#xB418;&#xACE0; &#xC788;&#xC5C8;&#xB2E4;.<br>&#x2003;&#xB098;&#xB294; &#xC13C;&#xB4DC;&#xBA54;&#xC77C; 8&#xC744; &#xD45C;&#xC900;&#xC73C;&#xB85C; &#xCC44;&#xD0DD;&#xD558;&#xC5EC; &#xC554;&#xAD6C;&#xD638; &#xAC19;&#xC740; &#xAD6C;&#xBC84;&#xC804; &#xCF54;&#xB4DC; &#xB300;&#xC2E0; 8 &#xBC84;&#xC804;&#xC758; &#xC790;&#xAE30; &#xC124;&#xBA85;&#xC2DD; &#xC635;&#xC158;&#xACFC; &#xBCC0;&#xC218;&#xBA85;&#xC73C;&#xB85C; sendmail.cf&#xB97C; &#xC791;&#xC131;&#xD588;&#xB358; &#xC0AC;&#xC2E4;&#xC744; &#xB5A0;&#xC62C;&#xB838;&#xB2E4;. </p><p>&#x2003;<em>&#xBAA8;&#xB4E0; &#xC758;&#xBB38;&#xC774; &#xB2E8;&#xBC88;&#xC5D0; &#xD480;&#xB838;&#xACE0;, &#xB098;&#xB294; &#xC2DD;&#xC740; &#xB77C;&#xB5BC;&#xB97C; &#xB9C8;&#xC2DC;&#xBA70; &#xB2E4;&#xC2DC;&#xAE08; &#xBAA9;&#xC774; &#xD131; &#xB9C9;&#xD788;&#xB294; &#xAE30;&#xBD84;&#xC744; &#xB290;&#xAF08;&#xB2E4;. </em><br>&#x2003;&#xC544;&#xB9C8; &#xCEE8;&#xC124;&#xD134;&#xD2B8;&#xAC00; &#xC11C;&#xBC84; &#xD328;&#xCE58;&#xB97C; &#xD560; &#xB54C; &#xC36C;OS &#xBC84;&#xC804;&#xC774; &#xC5C5;&#xADF8;&#xB808;&#xC774;&#xB4DC;&#xB418;&#xBA74;&#xC11C; &#xC13C;&#xB4DC;&#xBA54;&#xC77C;&#xC774; &#xB2E4;&#xC6B4;&#xADF8;&#xB808;&#xC774;&#xB4DC;&#xB410;&#xC73C;&#xB9AC;&#xB77C;. &#xB2E4;&#xD589;&#xD788; sendmail.cf &#xD30C;&#xC77C;&#xAE4C;&#xC9C0; &#xAC74;&#xB4DC;&#xB9AC;&#xC9C4; &#xC54A;&#xC558;&#xC9C0;&#xB9CC;, &#xD604;&#xC7AC; &#xC0C1;&#xD669;&#xC5D0;&#xC120; &#xBA39;&#xD1B5;&#xC774;&#xC5C8;&#xB2E4;.</p><p>&#x2003;&#xC6B0;&#xC5F0;&#xD558;&#xAC8C;&#xB3C4;, &#xADF8; &#xB54C; &#xC36C;&#xC5D0;&#xC11C; &#xC81C;&#xACF5;&#xD55C; 5 &#xBC84;&#xC804;&#xC5D0;&#xC120; 8 &#xBC84;&#xC804; sendmail.cf &#xD30C;&#xC77C;&#xC744; &#xC77D;&#xC744; &#xC218;&#xB294; &#xC788;&#xC5C8;&#xB2E4;. &#xB9CE;&#xC740; &#xADDC;&#xCE59;&#xC774; &#xD070; &#xBCC0;&#xACBD;&#xC744; &#xAC70;&#xCE58;&#xC9C4; &#xC54A;&#xC558;&#xAE30; &#xB54C;&#xBB38;&#xC774;&#xB2E4;. &#xD558;&#xC9C0;&#xB9CC; 5 &#xBC84;&#xC804; &#xC774;&#xD6C4;&#xC5D0; &#xB3C4;&#xC785;&#xB41C; &#xC635;&#xC158;&#xB4E4;&#xC740; &#xBB34;&#xC2DC;&#xB410;&#xB2E4;. <br>&#x2003;&#xC13C;&#xB4DC;&#xBA54;&#xC77C; &#xBC14;&#xC774;&#xB108;&#xB9AC;&#xC5D0;&#xB294; &#xADF8; &#xC635;&#xC158;&#xB4E4;&#xC758; &#xAE30;&#xBCF8;&#xAC12;&#xC774; &#xCEF4;&#xD30C;&#xC77C;&#xB3FC;&#xC788;&#xC9C0; &#xC54A;&#xC558;&#xAE30; &#xB54C;&#xBB38;&#xC5D0; 0&#xC73C;&#xB85C; &#xC124;&#xC815;&#xB410;&#xB2E4;. <strong>0&#xC73C;&#xB85C; &#xBC14;&#xB010; &#xC124;&#xC815;</strong> &#xC911; &#xD558;&#xB098;&#xB294; <strong>&#xC6D0;&#xACA9; SMTP &#xC11C;&#xBC84;&#xC5D0; &#xC5F0;&#xACB0;&#xD558;&#xB294; &#xD0C0;&#xC784;&#xC544;&#xC6C3;</strong>&#xC774;&#xC5C8;&#xB2E4;. &#xBA87; &#xCC28;&#xB840; &#xC2E4;&#xD5D8;&#xC744; &#xD574;&#xBCF4;&#xB2C8; <strong>3ms &#xC815;&#xB3C4; &#xCBE4; &#xC9C0;&#xB098;&#xBA74; &#xC911;&#xB2E8;</strong>&#xB418;&#xB294; &#xD604;&#xC0C1;&#xC744; &#xD655;&#xC778;&#xD588;&#xB2E4;.</p><p>&#x2003;&#xB2F9;&#xC2DC; &#xADF8; &#xD559;&#xAD50; &#xB124;&#xD2B8;&#xC6CC;&#xD06C;&#xAC00; &#xD2B9;&#xC774;&#xD588;&#xB358; &#xC810;&#xC740; 100% &#xC2A4;&#xC704;&#xCE6D; &#xAD6C;&#xC870;&#xC600;&#xB2E4;&#xB294; &#xAC83;&#xC774;&#xB2E4;. &#xC1A1;&#xC2E0; &#xD328;&#xD0B7;&#xC774; &#xBA3C; PoP(Point-of-Presence)&#xC5D0; &#xB3C4;&#xB2EC;&#xD560; &#xB54C;&#xAE4C;&#xC9C0; &#xB77C;&#xC6B0;&#xD130; &#xC9C0;&#xC5F0;&#xC774; &#xBC1C;&#xC0DD;&#xD558;&#xC9C0; &#xC54A;&#xC558;&#xB2E4;. &#xC989;, &#xC6D0;&#xACA9; &#xD638;&#xC2A4;&#xD2B8;&#xB85C; &#xC5F0;&#xACB0;&#xD558;&#xB294; &#xB370;&#xC5D0; &#xAC78;&#xB9AC;&#xB294; &#xC2DC;&#xAC04;&#xC740; &#xB77C;&#xC6B0;&#xD130; &#xC9C0;&#xC5F0;&#xC774; &#xC544;&#xB2C8;&#xB77C; &#xC21C;&#xC804;&#xD788; &#xAD11;&#xC18D;&#xC5D0; &#xC601;&#xD5A5;&#xC744; &#xBC1B;&#xC558;&#xB2E4;&#xB294; &#xB73B;&#xC774;&#xB2E4;.</p><hr><h2 id="%EB%A7%88%EB%AC%B4%EB%A6%AC">&#xB9C8;&#xBB34;&#xB9AC;</h2><p>&#x2003;&#xB450; &#xCF00;&#xC774;&#xC2A4;&#xB294; &#xAC1C;&#xBC1C;&#xC790;&#xC758; &#xC2E4;&#xC218;&#xAC00; &#xC544;&#xB2D0; &#xBFD0;&#xB354;&#xB7EC;, &#xD0C0;&#xC784;&#xC544;&#xC6C3;&#xC774; &#xBC14;&#xB85C; &#xB5A0;&#xC624;&#xB974;&#xB294; &#xBB38;&#xC81C;&#xB3C4; &#xC544;&#xB2C8;&#xB2C8; &#xB09C;&#xCC98;&#xD560; &#xB530;&#xB984;&#xC785;&#xB2C8;&#xB2E4;. &#xADF8;&#xB7FC;&#xC5D0;&#xB3C4; &#xC774;&#xCC98;&#xB7FC; &#xD0C0;&#xC784; &#xC544;&#xC6C3;&#xC73C;&#xB85C; &#xC778;&#xD55C; &#xBD80;&#xC791;&#xC6A9;&#xC740; &#xC5EC;&#xB7EC; &#xACF3;&#xC5D0;&#xC11C;, &#xC5EC;&#xB7EC; &#xC774;&#xC720;&#xB85C; &#xBC1C;&#xC0DD; &#xAC00;&#xB2A5;&#xD569;&#xB2C8;&#xB2E4;. &#xC774; &#xAE00;&#xC774; &#xC5EC;&#xB7EC;&#xBD84;&#xC758; &#xD734;&#xB9AC;&#xC2A4;&#xD2F1;&#xC5D0; &#xC870;&#xAE08;&#xC774;&#xB098;&#xB9C8; &#xB3C4;&#xC6C0;&#xC774; &#xB418;&#xBA74; &#xC88B;&#xACA0;&#xC2B5;&#xB2C8;&#xB2E4;.</p><h2 id="%EC%B0%B8%EC%A1%B0">&#xCC38;&#xC870;</h2><ul><li><a href="https://squarelab.co/blog/who-did-retry-the-request/?ref=blog.cinntiq.synology.me">&#xAD8C;&#xC601;&#xC7AC;(2023.08). &#xB204;&#xAC00; &#xC7AC;&#xC2DC;&#xB3C4; &#xC694;&#xCCAD;&#xC744; &#xD558;&#xC600;&#xB294;&#xAC00;? &#xC2A4;&#xD018;&#xC5B4;&#xB7A9; &#xBE14;&#xB85C;&#xADF8;</a></li><li><a href="https://www.ibiblio.org/harris/500milemail.html?ref=blog.cinntiq.synology.me">Trey Harris(2002.11). The case of the 500-mile email</a></li><li><a href="https://www.ibiblio.org/harris/500milemail-faq.html?ref=blog.cinntiq.synology.me">Trey Harris(2002.11). FAQ with Answers about the 500-mile email</a></li></ul>]]></content:encoded></item><item><title><![CDATA[타입스크립트와 데코레이터]]></title><description><![CDATA[데코레이터(타입스크립트 5.0)은 무엇이고 어떻게 사용하는지 봅니다]]></description><link>https://blog.cinntiq.synology.me/decorator/</link><guid isPermaLink="false">659ce5c2707381000106fee9</guid><category><![CDATA[TypeScript]]></category><dc:creator><![CDATA[Hameln]]></dc:creator><pubDate>Tue, 09 Jan 2024 06:22:59 GMT</pubDate><media:content url="https://blog.cinntiq.synology.me/content/images/2024/01/ts-lettermark-blue.png" medium="image"/><content:encoded><![CDATA[<h3 id="%EB%8D%B0%EC%BD%94%EB%A0%88%EC%9D%B4%ED%84%B0-%ED%8C%A8%ED%84%B4">&#xB370;&#xCF54;&#xB808;&#xC774;&#xD130; &#xD328;&#xD134;</h3><img src="https://blog.cinntiq.synology.me/content/images/2024/01/ts-lettermark-blue.png" alt="&#xD0C0;&#xC785;&#xC2A4;&#xD06C;&#xB9BD;&#xD2B8;&#xC640; &#xB370;&#xCF54;&#xB808;&#xC774;&#xD130;"><p>&#x2003;&#xB370;&#xCF54;&#xB808;&#xC774;&#xD130;&#xB294; &#xD074;&#xB798;&#xC2A4;, &#xD544;&#xB4DC;, &#xBA54;&#xC18C;&#xB4DC;&#xC5D0; &#xB300;&#xD55C; &#xCC98;&#xB9AC;&#xB97C; &#xC720;&#xC5F0;&#xD558;&#xAC8C; &#xB3D5;&#xB294; &#xAE30;&#xB2A5;&#xC785;&#xB2C8;&#xB2E4;. <a href="https://github.com/tc39/proposal-decorators?ref=blog.cinntiq.synology.me">&#xC81C;&#xC548;&#xC11C;</a>&#xC5D0; &#xB530;&#xB974;&#xBA74; <em>&#xB370;&#xCF54;&#xB808;&#xC774;&#xD130;&#xB294; &#xAE30;&#xB2A5; &#xCD94;&#xAC00;, &#xBCC0;&#xACBD;, &#xC811;&#xADFC; &#xB4F1;&#xC758; &#xCC98;&#xB9AC;&#xC5D0; &#xB300;&#xD574; &#xC77C;&#xC77C;&#xC774; &#xCF54;&#xB4DC;&#xB97C; &#xC218;&#xC815;&#xD558;&#xB294; &#xB300;&#xC2E0; &#xBA54;&#xD0C0; &#xC815;&#xBCF4;&#xB97C; &#xC785;&#xB9DB;&#xC5D0; &#xB9DE;&#xAC8C; &#xCD94;&#xAC00;, &#xC870;&#xD569;&#xD574;&#xC11C; &#xAD6C;&#xD604;</em> &#xD558;&#xB824;&#xB294; &#xBAA9;&#xC801;&#xC774; &#xD07D;&#xB2C8;&#xB2E4;. &#xC774;&#xB294; SOLID &#xC6D0;&#xCE59;&#xC758; SRP&#xC640; OCP&#xC5D0;&#xB3C4; &#xC88B;&#xC2B5;&#xB2C8;&#xB2E4;.</p><p>&#xB2E8;&#xC77C; &#xCC45;&#xC784; &#xC6D0;&#xCE59; (Single Responsibility Principle, SRP)<br>&#x2003;&#xAC1D;&#xCCB4;&#xB294; &#xCC45;&#xC784;&#xC744; &#xD55C; &#xAC00;&#xC9C0;&#xB9CC; &#xAC00;&#xC838;&#xC57C; &#xD569;&#xB2C8;&#xB2E4;. &#xD55C; &#xAC1D;&#xCCB4;&#xAC00; &#xC5EC;&#xB7EC; &#xCC45;&#xC784;&#xC744; &#xAC00;&#xC9C0;&#xBA74; &#xCF54;&#xB4DC;&#xB294; &#xBC88;&#xC7A1;&#xD574;&#xC9D1;&#xB2C8;&#xB2E4;.</p><p>&#xAC1C;&#xBC29; &#xD3D0;&#xC1C4; &#xC6D0;&#xCE59; (Open-Closed Principle, OCP)<br>&#x2003;&#xAC1D;&#xCCB4;&#xB294; &#xD655;&#xC7A5;&#xC5D0; &#xB300;&#xD574;&#xC120; &#xAC1C;&#xBC29;&#xC801;&#xC774;&#xB418;, &#xC218;&#xC815;&#xC5D0;&#xB294; &#xD3D0;&#xC1C4;&#xC801;&#xC774;&#xC5B4;&#xC57C; &#xD569;&#xB2C8;&#xB2E4;.<br>&#xC989;, &#xC0C8; &#xAE30;&#xB2A5;&#xC744; &#xB3C4;&#xC785;&#xD560; &#xB550; &#xAC1D;&#xCCB4; &#xCF54;&#xB4DC;&#xB97C; &#xC218;&#xC815;&#xD558;&#xC9C0; &#xB9D0;&#xACE0; &#xC0C8; &#xCF54;&#xB4DC;&#xB97C; &#xCD94;&#xAC00;&#xD569;&#xB2C8;&#xB2E4;.</p><h3 id="%EC%9C%A0%EC%97%B0%EC%84%B1%EA%B3%BC-%ED%99%95%EC%9E%A5%EC%84%B1">&#xC720;&#xC5F0;&#xC131;&#xACFC; &#xD655;&#xC7A5;&#xC131;</h3><p>&#x2003;&#xC11C;&#xBE44;&#xC2A4;&#xC5D0;&#xC11C; &#xAC1D;&#xCCB4;&#xB4E4;&#xC740; &#xCC98;&#xC74C;&#xC5D4; &#xAC04;&#xB2E8;&#xD55C; &#xAE30;&#xB2A5;&#xB9CC; &#xC9C0;&#xC6D0;&#xD569;&#xB2C8;&#xB2E4;. &#xADF8;&#xB7EC;&#xB2E4; &#xC11C;&#xBE44;&#xC2A4;&#xAC00; &#xCEE4;&#xC9C8;&#xC218;&#xB85D; &#xAE30;&#xB2A5;&#xC740; &#xB9CE;&#xC544;&#xC9C0;&#xACE0; &#xACBD;&#xC6B0;&#xC758; &#xC218;&#xB294; &#xC5EC;&#xB7EC; &#xAC08;&#xB798;&#xB85C; &#xB298;&#xC5B4;&#xB0A9;&#xB2C8;&#xB2E4;. &#xC608;&#xB97C; &#xB4E4;&#xBA74; &#xC61B;&#xB0A0; &#xCEE4;&#xD53C; &#xC790;&#xD310;&#xAE30;&#xB294; &#xC804;&#xBD80; &#xBA54;&#xB274;, &#xB9DB;, &#xC591;&#xC774; &#xAC19;&#xC558;&#xC2B5;&#xB2C8;&#xB2E4;. &#xD558;&#xC9C0;&#xB9CC; &#xC624;&#xB298;&#xB0A0;&#xC5D4; &#xC5B4;&#xB5A4;&#xAC00;&#xC694;? &#xC544;&#xB798; &#xADF8;&#xB9BC;&#xC73C;&#xB85C; &#xAC10;&#xB2F9;&#xC774; &#xAC00;&#xB2A5;&#xD55C;&#xAC00;&#xC694;?</p><figure class="kg-card kg-image-card"><img src="https://blog.cinntiq.synology.me/content/images/2024/01/277325574-709b4402-dd57-40a6-abfa-c26f0fd020c7.jpg" class="kg-image" alt="&#xD0C0;&#xC785;&#xC2A4;&#xD06C;&#xB9BD;&#xD2B8;&#xC640; &#xB370;&#xCF54;&#xB808;&#xC774;&#xD130;" loading="lazy" width="683" height="434" srcset="https://blog.cinntiq.synology.me/content/images/size/w600/2024/01/277325574-709b4402-dd57-40a6-abfa-c26f0fd020c7.jpg 600w, https://blog.cinntiq.synology.me/content/images/2024/01/277325574-709b4402-dd57-40a6-abfa-c26f0fd020c7.jpg 683w"></figure><p><em><strong>&#xBB38;&#xC81C; 1. &#xBA54;&#xB274;&#xAC00; &#xB9CE;&#xC544;&#xC84C;&#xC2B5;&#xB2C8;&#xB2E4;.</strong></em></p><p>&#xB300;&#xC751;: &#xB9CE;&#xC740; &#xAC00;&#xAC8C;&#xAC00; &#xACE0;&#xAE09; &#xC6D0;&#xB450; &#xBA38;&#xC2E0;&#xC744; &#xC0AC;&#xC6A9;&#xD569;&#xB2C8;&#xB2E4;. &#xBA54;&#xC18C;&#xB4DC;&#xB97C; &#xB300;&#xD3ED; &#xC5C5;&#xB370;&#xC774;&#xD2B8;&#xD574;&#xC57C;&#xACA0;&#xAD70;&#xC694;.</p><figure class="kg-card kg-image-card"><img src="https://blog.cinntiq.synology.me/content/images/2024/01/277325633-0254564b-d3eb-43e4-b64f-15156ccb7878.jpg" class="kg-image" alt="&#xD0C0;&#xC785;&#xC2A4;&#xD06C;&#xB9BD;&#xD2B8;&#xC640; &#xB370;&#xCF54;&#xB808;&#xC774;&#xD130;" loading="lazy" width="1718" height="1153" srcset="https://blog.cinntiq.synology.me/content/images/size/w600/2024/01/277325633-0254564b-d3eb-43e4-b64f-15156ccb7878.jpg 600w, https://blog.cinntiq.synology.me/content/images/size/w1000/2024/01/277325633-0254564b-d3eb-43e4-b64f-15156ccb7878.jpg 1000w, https://blog.cinntiq.synology.me/content/images/size/w1600/2024/01/277325633-0254564b-d3eb-43e4-b64f-15156ccb7878.jpg 1600w, https://blog.cinntiq.synology.me/content/images/2024/01/277325633-0254564b-d3eb-43e4-b64f-15156ccb7878.jpg 1718w" sizes="(min-width: 720px) 720px"></figure><p><em><strong>&#xBB38;&#xC81C; 2. &#xBE0C;&#xB79C;&#xB4DC;&#xC640; &#xBA38;&#xC2E0; &#xC885;&#xB958;&#xAC00; &#xB9CE;&#xC2B5;&#xB2C8;&#xB2E4;.</strong></em></p><p>&#xB300;&#xC751;: &#xC778;&#xD130;&#xD398;&#xC774;&#xC2A4;&#xB85C; &#xD2C0;&#xC744; &#xB9CC;&#xB4E4;&#xACE0; &#xAC01; &#xAC1D;&#xCCB4;&#xB9C8;&#xB2E4; &#xAD6C;&#xD604;&#xC744; &#xB9E1;&#xAE41;&#xC2DC;&#xB2E4;.</p><figure class="kg-card kg-image-card"><img src="https://blog.cinntiq.synology.me/content/images/2024/01/277325902-f418b0f4-627b-48b1-b02f-77f44fbb60a1.jpg" class="kg-image" alt="&#xD0C0;&#xC785;&#xC2A4;&#xD06C;&#xB9BD;&#xD2B8;&#xC640; &#xB370;&#xCF54;&#xB808;&#xC774;&#xD130;" loading="lazy" width="1719" height="670" srcset="https://blog.cinntiq.synology.me/content/images/size/w600/2024/01/277325902-f418b0f4-627b-48b1-b02f-77f44fbb60a1.jpg 600w, https://blog.cinntiq.synology.me/content/images/size/w1000/2024/01/277325902-f418b0f4-627b-48b1-b02f-77f44fbb60a1.jpg 1000w, https://blog.cinntiq.synology.me/content/images/size/w1600/2024/01/277325902-f418b0f4-627b-48b1-b02f-77f44fbb60a1.jpg 1600w, https://blog.cinntiq.synology.me/content/images/2024/01/277325902-f418b0f4-627b-48b1-b02f-77f44fbb60a1.jpg 1719w" sizes="(min-width: 720px) 720px"></figure><p><em><strong>&#xBB38;&#xC81C; 3. &#xBE0C;&#xB79C;&#xB4DC;&#xB9C8;&#xB2E4; &#xB808;&#xC2DC;&#xD53C;&#xAC00; &#xB2E4;&#xB985;&#xB2C8;&#xB2E4;.</strong></em></p><p>&#x2003;&#xCE74;&#xD398;&#xB77C;&#xB5BC;&#xB97C; &#xC0DD;&#xAC01;&#xD574;&#xBD05;&#xC2DC;&#xB2E4;. &#xC5B4;&#xB514;&#xB294; &#xC2DC;&#xB098;&#xBAAC;, &#xD639;&#xC740; &#xC2DC;&#xB7FD;&#xC744; &#xB123;&#xACE0; &#xB4E4;&#xC5B4;&#xAC00;&#xB294; &#xC6D0;&#xB450;&#xC758; &#xC885;&#xB958;, &#xC591;, &#xC6B0;&#xC720;&#xC758; &#xC628;&#xB3C4;, &#xC591;&#xC774; &#xAC01;&#xC790; &#xB2E4;&#xB985;&#xB2C8;&#xB2E4;. &#xADF8;&#xB7EC;&#xB098; <strong>&#xB2E4;&#xB4E4; &#xC6D0;&#xB450;&#xB97C; &#xBD84;&#xC1C4;&#xD558;&#xACE0; &#xC5D0;&#xC2A4;&#xD504;&#xB808;&#xC18C;&#xB97C; &#xB9CC;&#xB4E4;&#xACE0; &#xB370;&#xC6B4; &#xC6B0;&#xC720;&#xB97C; &#xC0AC;&#xC6A9;&#xD569;&#xB2C8;&#xB2E4;.</strong> &#xC7AC;&#xC0AC;&#xC6A9;&#xC131;&#xC774; &#xC5FF;&#xBCF4;&#xC774;&#xB294; &#xB85C;&#xC9C1;&#xC740; <strong>&#xB370;&#xCF54;&#xB808;&#xC774;&#xD130;&#xB85C; &#xBD84;&#xB9AC;</strong>&#xD560; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.</p><p>&#x2003;&#xC544;&#xAE4C; &#xB9D0;&#xD588;&#xB4EF;&#xC774; &#xB370;&#xCF54;&#xB808;&#xC774;&#xD130;&#xB294; &#xB0B4;&#xBD80; &#xB85C;&#xC9C1;&#xC740; &#xC218;&#xC815;&#xD558;&#xC9C0; &#xC54A;&#xC73C;&#xBA74;&#xC11C; &#xCD94;&#xAC00; &#xC815;&#xBCF4;&#xB97C; &#xB367;&#xBD99;&#xC774;&#xACE0; &#xC870;&#xD569;&#xD558;&#xB294; &#xD615;&#xC2DD;&#xC73C;&#xB85C; &#xC5EC;&#xB7EC; &#xD615;&#xD0DC;&#xB97C; &#xAD6C;&#xD604;&#xD569;&#xB2C8;&#xB2E4;.</p><figure class="kg-card kg-image-card"><img src="https://blog.cinntiq.synology.me/content/images/2024/01/277329216-bec103af-956c-4e27-a57e-cde36bb44045.jpg" class="kg-image" alt="&#xD0C0;&#xC785;&#xC2A4;&#xD06C;&#xB9BD;&#xD2B8;&#xC640; &#xB370;&#xCF54;&#xB808;&#xC774;&#xD130;" loading="lazy" width="1474" height="799" srcset="https://blog.cinntiq.synology.me/content/images/size/w600/2024/01/277329216-bec103af-956c-4e27-a57e-cde36bb44045.jpg 600w, https://blog.cinntiq.synology.me/content/images/size/w1000/2024/01/277329216-bec103af-956c-4e27-a57e-cde36bb44045.jpg 1000w, https://blog.cinntiq.synology.me/content/images/2024/01/277329216-bec103af-956c-4e27-a57e-cde36bb44045.jpg 1474w" sizes="(min-width: 720px) 720px"></figure><pre><code class="language-typescript">class StarbucksMachine extends VarietyMachine {
  coffeeBeans = 1000; // &#xBA38;&#xC2E0;&#xC5D0; &#xC788;&#xB294; &#xC6D0;&#xB450;&#xC758; &#xC591;
  water = 1000; // &#xBA38;&#xC2E0;&#xC5D0; &#xC788;&#xB294; &#xBB3C;&#xC758; &#xC591;
  desiredMilkTemperature = 75; // &#xC6B0;&#xC720;&#xB97C; &#xB370;&#xC6B0;&#xB294; &#xC628;&#xB3C4;

  @grindCoffeeBeans(20) // &#xC6D0;&#xB450;&#xB97C; 20g &#xBD84;&#xC1C4;&#xD569;&#xB2C8;&#xB2E4;.
  @extractEspresso(50) // &#xC5D0;&#xC2A4;&#xD504;&#xB808;&#xC18C;&#xB97C; 50ml &#xCD94;&#xCD9C;&#xD569;&#xB2C8;&#xB2E4;.
  @heatMilk(140) // &#xC6B0;&#xC720;&#xB97C; 140ml &#xB370;&#xC6C1;&#xB2C8;&#xB2E4;.
  caffelatte() {
    console.log(`Starbucks&#xB9CC;&#xC758; &#xACE0;&#xC720; &#xC7AC;&#xB8CC;&#xC640; &#xBE44;&#xBC95; &#xB808;&#xC2DC;&#xD53C;&#xB97C; &#xC774;&#xC6A9;&#xD55C; &#xCE74;&#xD398;&#xB77C;&#xB5BC;&#xB97C; &#xB9CC;&#xB4ED;&#xB2C8;&#xB2E4;...`);
    console.log(`Starbucks &#xCE74;&#xD398;&#xB77C;&#xB5BC;&#xAC00; &#xB098;&#xC654;&#xC2B5;&#xB2C8;&#xB2E4;.`);
  }

  @grindCoffeeBeans(20) 
  @extractEspresso(40) 
  @heatMilk(80) 
  cappuccino() {
    console.log(`Starbucks&#xB9CC;&#xC758; &#xACE0;&#xC720; &#xC7AC;&#xB8CC;&#xC640; &#xBE44;&#xBC95; &#xB808;&#xC2DC;&#xD53C;&#xB97C; &#xC774;&#xC6A9;&#xD55C; &#xCE74;&#xD478;&#xCE58;&#xB178;&#xB97C; &#xB9CC;&#xB4ED;&#xB2C8;&#xB2E4;...`);
    console.log(`Starbucks &#xCE74;&#xD478;&#xCE58;&#xB178;&#xAC00; &#xB098;&#xC654;&#xC2B5;&#xB2C8;&#xB2E4;.`);
  }
}

function grindCoffeeBeans(beanGrams: number) {
  return &lt;Class extends VarietyMachine&gt;(
    target: Function,
    context: ClassMethodDecoratorContext
  ) =&gt;
    function &lt;Args extends any[]&gt;(this: Class, ...args: Args) {
      this.coffeeBeans -= beanGrams;
      console.log(`&#xC6D0;&#xB450;&#xB97C; ${beanGrams}g &#xBD84;&#xC1C4;&#xD569;&#xB2C8;&#xB2E4;.`);
      const originReturn = target.apply(this, args);
      console.log(`&#xBA38;&#xC2E0;&#xC5D0; &#xC6D0;&#xB450;&#xAC00; ${this.coffeeBeans}g &#xB0A8;&#xC544;&#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.`);
      return originReturn;
    };
}

function extractEspresso(water: number) {
  return &lt;Class extends VarietyMachine&gt;(
    target: Function,
    context: ClassMethodDecoratorContext
  ) =&gt;
    function &lt;Args extends any[]&gt;(this: Class, ...args: Args) {
      this.water -= water;
      console.log(`&#xBB3C;&#xC744; ${water}ml &#xC0AC;&#xC6A9;&#xD574;&#xC11C; &#xC5D0;&#xC2A4;&#xD504;&#xB808;&#xC18C;&#xB97C; &#xCD94;&#xCD9C;&#xD569;&#xB2C8;&#xB2E4;...`);
      target.apply(this, args);
      console.log(`&#xBA38;&#xC2E0;&#xC5D0; &#xBB3C;&#xC774; ${this.water}ml &#xB0A8;&#xC544;&#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.`);
    };
}

function heatMilk(milk: number) {
  return function &lt;Class extends VarietyMachine&gt;(
    target: Function,
    context: ClassMethodDecoratorContext
  ) {
    return function &lt;Args extends any[]&gt;(this: Class, ...args: Args) {
      while (this.milkTemperature &lt; this.desiredMilkTemperature) {
        this.milkTemperature++;
      }
      console.log(`${milk}ml&#xC758; &#xC6B0;&#xC720;&#xB97C; ${this.milkTemperature}&#xB3C4;&#xB85C; &#xB370;&#xC6E0;&#xC2B5;&#xB2C8;&#xB2E4;.`);
      target.apply(this, args);
    };
  };
}
</code></pre><p>&#x2003;&#xC6B0;&#xC720;&#xB97C; &#xC0AC;&#xC6A9;&#xD558;&#xB294; &#xBA54;&#xB274;&#xC5D0;&#xB9CC; <code>heatMilk</code>&#xB97C; &#xC120;&#xD0DD;&#xC801;&#xC73C;&#xB85C; &#xC4F0;&#xACE0; &#xC5D0;&#xC2A4;&#xD504;&#xB808;&#xC18C;, &#xC6B0;&#xC720; &#xC591;&#xB3C4; &#xC790;&#xC720;&#xB86D;&#xAC8C; &#xC870;&#xC815;&#xB429;&#xB2C8;&#xB2E4;. &#xD544;&#xC694;&#xD55C; &#xB54C;&#xC5D0; &#xD544;&#xC694;&#xD55C; &#xAC83;&#xB9CC; &#xAC00;&#xC838;&#xC640; <code>base</code>&#xB97C; &#xAFB8;&#xBBF8;&#xACE0;(decorate) &#xC5B4;&#xB290; &#xBE0C;&#xB79C;&#xB4DC;, &#xC5B4;&#xB290; &#xBA38;&#xC2E0;&#xC5D0;&#xB3C4; &#xC720;&#xC5F0;&#xD558;&#xAC8C; &#xB300;&#xCC98;&#xD560; &#xC900;&#xBE44;&#xAC00; &#xB410;&#xC2B5;&#xB2C8;&#xB2E4;. &#xC5B4;&#xB5A4;&#xAC00;&#xC694;?</p><h3 id="%ED%81%B4%EB%9E%98%EC%8A%A4-%EB%8D%B0%EC%BD%94%EB%A0%88%EC%9D%B4%ED%84%B0">&#xD074;&#xB798;&#xC2A4; &#xB370;&#xCF54;&#xB808;&#xC774;&#xD130;</h3><p>&#x2003;&#xC544;&#xB798;&#xC640; &#xAC19;&#xC774; &#xD074;&#xB798;&#xC2A4; &#xC790;&#xCCB4;&#xB97C; &#xB370;&#xCF54;&#xB808;&#xC774;&#xD2B8;&#xD560; &#xC218;&#xB3C4; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.</p><pre><code class="language-typescript">function withEmploymentDate&lt;Constructor extends { new (...args: any[]): {} }&gt;(
  baseClass: Constructor,
  context: ClassDecoratorContext
) {
  return class extends baseClass {
    employmentDate = new Date().toISOString();
    constructor(...args: any[]) {
      super(...args);
      console.log(`${baseClass.name}&#xC5D0; &#xC785;&#xC0AC;&#xC77C; &#xC18D;&#xC131;&#xC744; &#xCD94;&#xAC00;&#xD588;&#xC2B5;&#xB2C8;&#xB2E4;.`);
    }
  };
}

@withEmploymentDate
class Employee {
  calcPay() {}
}

const employee = new Employee(); // Employee&#xC5D0; &#xC785;&#xC0AC;&#xC77C; &#xC18D;&#xC131;&#xC744; &#xCD94;&#xAC00;&#xD588;&#xC2B5;&#xB2C8;&#xB2E4;.
</code></pre><h3 id="accessor-%EB%8D%B0%EC%BD%94%EB%A0%88%EC%9D%B4%ED%84%B0">accessor &#xB370;&#xCF54;&#xB808;&#xC774;&#xD130;</h3><p>&#x2003;accessor&#xB294; TS 4.9&#xC5D0; &#xCD94;&#xAC00;&#xB41C; &#xBB38;&#xBC95;&#xC73C;&#xB85C; &#xB0B4;&#xBD80;&#xC801;&#xC73C;&#xB85C; &#xD574;&#xB2F9; &#xC18D;&#xC131;&#xC744; &#xC740;&#xD3D0;&#xD558;&#xACE0; getter, setter&#xB85C; &#xC870;&#xD68C;&#xD558;&#xB294; &#xC811;&#xB450;&#xC0AC;&#xC785;&#xB2C8;&#xB2E4;.</p><pre><code class="language-typescript">// &#xAC1C;&#xBC1C;&#xC790;&#xAC00; &#xC791;&#xC131;&#xD55C; &#xCF54;&#xB4DC;
class Person {
    accessor name: string;
}

// &#xC2E4;&#xC81C;&#xB85C; &#xC791;&#xB3D9;&#xD558;&#xB294; &#xCF54;&#xB4DC;
class Person {
    #__name: string;
    get name() {
        return this.#__name;
    }
    set name(value: string) {
        this.#__name = name;
    }
}
</code></pre><p>&#x2003;getter, setter&#xB294; &#xADF8; &#xCC45;&#xC784;&#xC5D0;&#xB9CC; &#xCDA9;&#xC2E4;&#xD574;&#xC57C; &#xD569;&#xB2C8;&#xB2E4;. &#xADF8;&#xB807;&#xB2E4;&#xBA74; &#xC774;&#xB7F0; &#xBBFC;&#xAC10;&#xD55C; &#xC18D;&#xC131;&#xC758; &#xBCC0;&#xD654;&#xB294; &#xC5B4;&#xB5BB;&#xAC8C; &#xAD00;&#xCC30;&#xD558;&#xBA74; &#xC88B;&#xC744;&#xAE4C;&#xC694;? &#xB370;&#xCF54;&#xB808;&#xC774;&#xD130;&#xAC00; &#xC774;&#xB97C; &#xB3D5;&#xC2B5;&#xB2C8;&#xB2E4;.</p><pre><code class="language-typescript">class User {
  @watchChange accessor nickname: string = &quot;John Doe&quot;;
  @watchChange accessor password: string = &quot;1234&quot;;
}

const user = new User();
user.nickname = &quot;ilovecoffee&quot;;
user.password = &quot;22231&quot;;

function watchChange&lt;This, Value&gt;(
  accessor: {
    get: (this: This) =&gt; Value;
    set: (this: This, value: Value) =&gt; void;
  },
  { name }: ClassAccessorDecoratorContext&lt;This, Value&gt;
) {
  return {
    get: function (this: This) {
      return accessor.get.call(this);
    },
    set: function (this: This, value: Value) {
      console.log(
        `${String(name)}&#xC774; ${accessor.get.call(
          this
        )}&#xC5D0;&#xC11C; ${value}&#xB85C; &#xBCC0;&#xACBD;&#xB418;&#xC5C8;&#xC2B5;&#xB2C8;&#xB2E4;.`
      );
      accessor.set.call(this, value);
    },
  };
}
</code></pre><p>&#x2003;&#xC131;&#xB2A5; &#xCE21;&#xC815;&#xC774; &#xD544;&#xC694;&#xD55C; &#xBA54;&#xC18C;&#xB4DC;&#xAC00; &#xB9CE;&#xC73C;&#xBA74; &#xCE21;&#xC815;&#xC6A9; &#xB370;&#xCF54;&#xB808;&#xC774;&#xD130;&#xB97C; &#xB530;&#xB85C; &#xB450;&#xB294; &#xAC83;&#xB3C4; &#xAD1C;&#xCC2E;&#xC744; &#xB4EF;&#xD569;&#xB2C8;&#xB2E4;.</p><pre><code class="language-typescript">function measurePerformance&lt;Class&gt;(
  target: Function,
  { name }: ClassMethodDecoratorContext
) {
  return function &lt;Args extends any[]&gt;(this: Class, ...args: Args) {
    const t0 = performance.now();
    target.apply(this, args);
    const t1 = performance.now();
    console.log(`${String(name)}&#xC740; ${t1 - t0}ms&#xAC00; &#xAC78;&#xB838;&#xC2B5;&#xB2C8;&#xB2E4;.`);
  };
}

class HeavyWorker {
  @measurePerformance
  veryImportantWork() {
    let currentValue = Math.random();
    for (let i = 0; i &lt; 1000000; i++) {
      currentValue += i;
    }
  }
}

const worker = new HeavyWorker();
worker.veryImportantWork();
</code></pre><h2 id="%EB%A7%88%EC%B9%98%EB%A9%B0">&#xB9C8;&#xCE58;&#xBA70;</h2><blockquote>&#x2003;&#xB370;&#xCF54;&#xB808;&#xC774;&#xD130;&#xB294; &#xB354; &#xB2E4;&#xC591;&#xD558;&#xACE0; &#xBCF5;&#xC7A1;&#xD55C; &#xBB38;&#xC81C;&#xC5D0;&#xB3C4; &#xC801;&#xC6A9;&#xD558;&#xAE30; &#xC88B;&#xC2B5;&#xB2C8;&#xB2E4;. &#xB9CE;&#xC774; &#xC5F0;&#xC2B5;&#xD574;&#xC11C; &#xC775;&#xC219;&#xD574;&#xC9C0;&#xB3C4;&#xB85D; &#xD569;&#xC2DC;&#xB2E4;.</blockquote><h3 id="%EC%B0%B8%EC%A1%B0">&#xCC38;&#xC870;</h3><ul><li><a href="https://d2.naver.com/helloworld/3010710?ref=blog.cinntiq.synology.me">&#xC548;&#xD0DD;&#xC218;(2023.10). AOP in TypeScript. NAVER D2</a></li><li><a href="https://www.youtube.com/watch?v=1hq_tNPWASM&amp;ref=blog.cinntiq.synology.me">Concise Developer(2023.08). TypeScript 5 decorators - full course</a></li></ul>]]></content:encoded></item><item><title><![CDATA[타입스크립트의 satisfies]]></title><description><![CDATA[satisfies는 어떤 이유로 타입스크립트에 도입됐는지 분석해봅니다]]></description><link>https://blog.cinntiq.synology.me/satisfies/</link><guid isPermaLink="false">659cdf94707381000106fe42</guid><category><![CDATA[TypeScript]]></category><dc:creator><![CDATA[Hameln]]></dc:creator><pubDate>Tue, 09 Jan 2024 05:59:46 GMT</pubDate><media:content url="https://blog.cinntiq.synology.me/content/images/2024/01/ts-lettermark-blue-1.png" medium="image"/><content:encoded><![CDATA[<h1 id="%EB%AA%A9%ED%91%9C">&#xBAA9;&#xD45C;</h1><blockquote>satisfies&#xB97C; &#xC774;&#xC6A9;&#xD55C; &#xC548;&#xC804;&#xD55C; &#xD0C0;&#xC785; &#xCE90;&#xC2A4;&#xD305;&#xC744; &#xC774;&#xD574;&#xD558;&#xACE0; &#xC5F0;&#xC2B5;&#xD569;&#xB2C8;&#xB2E4;.</blockquote><img src="https://blog.cinntiq.synology.me/content/images/2024/01/ts-lettermark-blue-1.png" alt="&#xD0C0;&#xC785;&#xC2A4;&#xD06C;&#xB9BD;&#xD2B8;&#xC758; satisfies"><p>&#x2003;&#xAC1C;&#xBC1C;&#xC790;&#xB294; &#xBE60;&#xB978; &#xC624;&#xB958; &#xAC80;&#xC0AC;&#xB97C; &#xC704;&#xD574; &#xD0C0;&#xC785;&#xC2A4;&#xD06C;&#xB9BD;&#xD2B8;&#xB97C; &#xC0AC;&#xC6A9;&#xD569;&#xB2C8;&#xB2E4;. &#xADF8;&#xB7F0;&#xB370;, &#xD0C0;&#xC785;&#xC740; &#xD56D;&#xC0C1; &#xD3B8;&#xD558;&#xAE30;&#xB9CC; &#xD588;&#xB098;&#xC694;? &#xC6B0;&#xB9AC;&#xB97C; &#xD53C;&#xACE4;&#xD558;&#xAC8C; &#xB9CC;&#xB4E0; &#xC801;&#xC740; &#xC5C6;&#xC5C8;&#xB098;&#xC694;? &#xC544;&#xB798; &#xC0C1;&#xD669;&#xC744; &#xBD05;&#xC2DC;&#xB2E4;.</p><pre><code class="language-typescript">let bool = false; // &#x2753; boolean&#xC73C;&#xB85C; &#xCD94;&#xB860;&#xD558;&#xB294; &#xAC83; &#xAC19;&#xC9C0;&#xB9CC;...

function changeBool() {
  const someCondition = true;
  if (someCondition) bool = true;
}

changeBool();

bool === true; // &#x274C; ts2367 Error: false&#xC640; true&#xB294; &#xD0C0;&#xC785;&#xC774; &#xB2E4;&#xB985;&#xB2C8;&#xB2E4;. &#xC11C;&#xB85C; &#xB2E4;&#xB978; &#xD0C0;&#xC785;&#xB07C;&#xB9AC; &#xBE44;&#xAD50;&#xD558;&#xC9C0; &#xB9C8;&#xC138;&#xC694;.
bool = false as boolean; // &#x1F61E; as&#xB85C; &#xB2E8;&#xC5B8;
bool === true; // &#x1F613; &#xD1B5;&#xACFC;
</code></pre><p>&#x2003;&#xC704;&#xC640; &#xAC19;&#xC740; &#xC0C1;&#xD669;&#xC740; &#xC870;&#xAE08; &#xD2B9;&#xC218;&#xD55C;&#xAC00;&#xC694;? &#xB2E4;&#xC74C; &#xAC19;&#xC740; &#xC0C1;&#xD669;&#xB3C4; &#xC0DD;&#xAC01;&#xD574;&#xBD05;&#xC2DC;&#xB2E4;.</p><blockquote>&#x2003;&quot;&#xAE30;&#xAC04; &#xD55C;&#xC815; &#xD589;&#xC0AC; &#xC6F9;&#xC0AC;&#xC774;&#xD2B8;&#xB97C; &#xB9CC;&#xB4E4;&#xC5B4;&#xC8FC;&#xC138;&#xC694;. <strong>&#xAC01; &#xC694;&#xC18C;&#xB9C8;&#xB2E4; &#xB9C8;&#xC6B0;&#xC2A4; &#xD074;&#xB9AD; &#xC2DC;&#xC5D0; &#xACE0;&#xC720;&#xD55C; &#xC54C;&#xB9BC; &#xBA54;&#xC2DC;&#xC9C0;&#xB97C; &#xB744;&#xC6CC;&#xC8FC;&#xC138;&#xC694;.</strong>&quot;</blockquote><p>&#x2003;HTML &#xC5D8;&#xB9AC;&#xBA3C;&#xD2B8;&#xB294; &#xB9CE;&#xC740; &#xC885;&#xB958;&#xAC00; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;. &#xBAA8;&#xB4E0; &#xC694;&#xC18C;&#xC5D0; &#xB9C8;&#xC6B0;&#xC2A4; &#xD074;&#xB9AD; &#xC774;&#xBCA4;&#xD2B8;&#xB97C; &#xB4F1;&#xB85D;&#xD558;&#xB824;&#xBA74; &#xC544;&#xB798;&#xC640; &#xAC19;&#xC774; &#xC791;&#xC131;&#xD574;&#xC57C; &#xD569;&#xB2C8;&#xB2E4;.</p><pre><code class="language-typescript">function onClick1(event: MouseEvent&lt;HTMLAnchorElement&gt;) { printMessage(event...) }
function onClick2(event: MouseEvent&lt;HTMLBodyElement&gt;) { printMessage(event...) }
function onClick3(event: MouseEvent&lt;HTMLButtonElement&gt;) { printMessage(event...) }
function onClick4(event: MouseEvent&lt;HTMLInputElement&gt;) { printMessage(event...) }
</code></pre><p>&#x2003;&#xD558;&#xB294; &#xB0B4;&#xC6A9;&#xC740; &#xB611;&#xAC19;&#xC740;&#xB370; &#xC774;&#xBCA4;&#xD2B8; &#xD0C0;&#xC785;&#xC740; &#xB9E4;&#xBC88; &#xC77C;&#xC77C;&#xC774; &#xC9C0;&#xC815;&#xD569;&#xB2C8;&#xB2E4;. &#xACE0;&#xD1B5;&#xC2A4;&#xB7EC;&#xC6B4; &#xC77C;&#xC774;&#xB124;&#xC694;! (&#xB2E4;&#xD589;&#xD788;&#xB3C4; &#xC704;&#xC758; &#xCF54;&#xB4DC;&#xB294; extends&#xC640; &#xC81C;&#xB124;&#xB9AD;&#xC73C;&#xB85C; &#xD574;&#xACB0;&#xD560; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.)<br>&#x2003;&#xD0C0;&#xC785;&#xC774; &#xCD5C;&#xB300;&#xD55C; &#xC5C4;&#xACA9;&#xD55C; &#xAC8C; &#xC88B;&#xC9C0;&#xB9CC;&#xC740; &#xC54A;&#xB2E4;&#xB294; &#xC0AC;&#xC2E4;&#xC744; &#xD658;&#xAE30;&#xD588;&#xC73C;&#xB2C8; &#xBCF8;&#xB860;&#xC73C;&#xB85C; &#xB4E4;&#xC5B4;&#xAC00;&#xBD05;&#xC2DC;&#xB2E4;. satisfies&#xC758; &#xB4F1;&#xC7A5; &#xC804;&#xD6C4;&#xB85C; &#xBB34;&#xC5C7;&#xC774; &#xBCC0;&#xD588;&#xC744;&#xAE4C;&#xC694;?</p><h3 id="safe-downcasting">safe-downcasting</h3><p>&#x2003;&#xD0C0;&#xC774;&#xD551;&#xC740; &#xC5C4;&#xACA9;&#xD574;&#xC11C; &#xADC0;&#xCC2E;&#xC74C;&#xC744; &#xC720;&#xBC1C;&#xD558;&#xAE30;&#xB3C4; &#xD569;&#xB2C8;&#xB2E4;. &#xC544;&#xB798; &#xCF54;&#xB4DC;&#xB97C; &#xBCF4;&#xC8E0;.</p><pre><code class="language-typescript">type Colors = &quot;red&quot; | &quot;green&quot; | &quot;blue&quot;;
type RGB = [red: number, green: number, blue: number];

const palette1: Record&lt;Colors, string | RGB&gt; = {
  red: [255, 0, 0],
  green: &quot;#00ff00&quot;,
  blue: [0, 0, 255],
};

palette1.red.map(0); // &#x274C; Error(ts2339): &#xD0C0;&#xC785;&#xC774; &#xBC30;&#xC5F4;&#xB85C; &#xD655;&#xC815;&#xB418;&#xC9C0; &#xC54A;&#xC74C;. (string &#xAC00;&#xB2A5;&#xC131;)
palette1.green.toUpperCase(); // &#x274C; Error(ts2339): &#xD0C0;&#xC785;&#xC774; string&#xC73C;&#xB85C; &#xD655;&#xC815;&#xB418;&#xC9C0; &#xC54A;&#xC74C; (&#xBC30;&#xC5F4; &#xAC00;&#xB2A5;&#xC131;)
</code></pre><p>&#x2003;&#xD0C0;&#xC774;&#xD551;&#xC5D0; &#xB530;&#xB974;&#xBA74; &#xBAA8;&#xB4E0; key&#xC758; &#xAC12;&#xC740; &#xD29C;&#xD50C; | string &#xD0C0;&#xC785;&#xC785;&#xB2C8;&#xB2E4;. &#xB530;&#xB77C;&#xC11C; &#xD574;&#xB2F9; &#xAC12;&#xC5D0;&#xC11C; &#xBC30;&#xC5F4;&#xC774;&#xB098; string &#xBA54;&#xC18C;&#xB4DC;&#xB97C; &#xC4F0;&#xB824;&#xBA74; &#xD0C0;&#xC785;&#xC744; &#xC881;&#xD600;&#xC57C; &#xD569;&#xB2C8;&#xB2E4;.</p><pre><code class="language-typescript">if(typeof palette1.green === &quot;string&quot;) { 
  palette1.green.toUpperCase();
 }
</code></pre><p>&#x2003;&#xAC1C;&#xBC1C;&#xC790; &#xC785;&#xC7A5;&#xC5D0;&#xC120; &#xAC12;&#xC774; &#xBB34;&#xC2A8; &#xD0C0;&#xC785;&#xC778;&#xC9C0; &#xBED4;&#xD788; &#xBCF4;&#xC774;&#xAE30; &#xB54C;&#xBB38;&#xC5D0; &#xD0C0;&#xC785;&#xC744; &#xC881;&#xD788;&#xAE30; &#xADC0;&#xCC2E;&#xC2B5;&#xB2C8;&#xB2E4;!</p><pre><code class="language-typescript">const palette2 = {
  red: [255, 0, 0],
  green: &quot;#00ff00&quot;,
  blue: [0, 0, 255],
} satisfies Record&lt;Colors, string | RGB&gt;;

palette2.green.toUpperCase(); // &#x2705; OK: green&#xC740; string &#xD0C0;&#xC785;&#xC73C;&#xB85C; &#xB2E4;&#xC6B4;&#xCE90;&#xC2A4;&#xD305; &#xB410;&#xC73C;&#xBBC0;&#xB85C; &#xAC00;&#xB2A5;.
palette2.red = &quot;#00ff00&quot;; // &#x274C; Error(ts2322): red&#xC740; [number, number, number] &#xD0C0;&#xC785;&#xC73C;&#xB85C; &#xB2E4;&#xC6B4;&#xCE90;&#xC2A4;&#xD305;&#xB3FC;&#xC11C; &#xBD88;&#xAC00;&#xB2A5;.
</code></pre><p><strong>&#x2003;satisfies&#xB294; &#xBA85;&#xC2DC;&#xD55C; &#xD0C0;&#xC785;&#xC744; &#xB9CC;&#xC871;&#xD560; &#xACBD;&#xC6B0; &#xC790;&#xB3D9;&#xC73C;&#xB85C; &#xB2E4;&#xC6B4; &#xCE90;&#xC2A4;&#xD305;&#xC744; &#xD569;&#xB2C8;&#xB2E4;. &#xC989;, &#xD0C0;&#xC785;&#xC744; &#xC881;&#xD799;&#xB2C8;&#xB2E4;. </strong>red&#xB294; &#xC774;&#xBBF8; &#xD29C;&#xD50C; &#xD0C0;&#xC785;&#xC73C;&#xB85C; &#xC881;&#xD600;&#xC84C;&#xAE30; &#xB54C;&#xBB38;&#xC5D0; string &#xC7AC;&#xD560;&#xB2F9;&#xC774; &#xBD88;&#xAC00;&#xB2A5;&#xD569;&#xB2C8;&#xB2E4;.</p><h3 id="%EC%8B%A4%EC%9E%AC%ED%95%98%EB%8A%94-%EC%86%8D%EC%84%B1%EC%97%90%EB%A7%8C-%EC%A0%91%EA%B7%BC">&#xC2E4;&#xC7AC;&#xD558;&#xB294; &#xC18D;&#xC131;&#xC5D0;&#xB9CC; &#xC811;&#xADFC;</h3><p>&#x2003;&#xAC1D;&#xCCB4;&#xC758; key &#xD0C0;&#xC785;&#xC744; &#xC5C4;&#xACA9;&#xD558;&#xAC8C; &#xC124;&#xC815;&#xD558;&#xC9C0; &#xC54A;&#xC73C;&#xBA74; &#xC789;&#xC5EC; &#xC18D;&#xC131;&#xC774; &#xD5C8;&#xC6A9;&#xB429;&#xB2C8;&#xB2E4;. &#xC544;&#xB798; &#xCF54;&#xB4DC;&#xB97C; &#xBCF4;&#xC8E0;.</p><pre><code class="language-typescript">type Config = Record&lt;string, string&gt;;

const config: Config = {
  name: &quot;hamelln&quot;,
  version: &quot;1.0&quot;,
  service: &quot;portfolio&quot;,
};

config.name223 = &quot;asd&quot;; // &#x1F630; &#xD1B5;&#xACFC;. &#xD0C0;&#xC785; &#xBA85;&#xC138;&#xC5D0; &#xB530;&#xB974;&#xBA74; &#xBB38;&#xC81C;&#xB294; &#xC5C6;&#xB2E4;...&#xC774;&#xB798;&#xB3C4; &#xB418;&#xB098;?
</code></pre><p>&#x2003;name223 &#xC18D;&#xC131; &#xCD94;&#xAC00;&#xB294; &#xC81C;&#xAC00; &#xC6D0;&#xD558;&#xB294; &#xB3D9;&#xC791;&#xC774; &#xC544;&#xB2D9;&#xB2C8;&#xB2E4;. &#xADF8;&#xB7EC;&#xB098; &#xBAA8;&#xB4E0; &#xCF00;&#xC774;&#xC2A4;&#xB97C; &#xC644;&#xBCBD;&#xD558;&#xAC8C; &#xB300;&#xBE44;&#xD558;&#xAE30;&#xB294; &#xD604;&#xC2E4;&#xC801;&#xC73C;&#xB85C; &#xC5B4;&#xB835;&#xC2B5;&#xB2C8;&#xB2E4;. &#xC5B4;&#xB5BB;&#xAC8C; &#xD558;&#xBA74; &#xC88B;&#xC744;&#xAE4C;&#xC694;?</p><pre><code class="language-typescript">type Config = Record&lt;string, string&gt;;

const config2 = {
  name: &quot;hamelln&quot;,
  version: &quot;1.0&quot;,
  service: &quot;portfolio&quot;,
} satisfies Config;

config2.name223 = &quot;asd&quot;; // &#x274C; Error(ts2551): &#xC5C6;&#xB294; &#xC18D;&#xC131;&#xC5D0; &#xC811;&#xADFC; &#xAE08;&#xC9C0;.
</code></pre><h3 id="%EB%B6%80%EB%B6%84%EC%A0%81-%ED%83%80%EC%9D%B4%ED%95%91">&#xBD80;&#xBD84;&#xC801; &#xD0C0;&#xC774;&#xD551;</h3><p>&#x2003;&#xD0C0;&#xC774;&#xD551;&#xC740; &#xB9CC;&#xB2A5;&#xC774; &#xC544;&#xB2D9;&#xB2C8;&#xB2E4;. &#xD0C0;&#xC774;&#xD551;&#xC73C;&#xB85C; &#xD574;&#xACB0;&#xC774; &#xC27D;&#xC9C0; &#xC54A;&#xC740; &#xCF00;&#xC774;&#xC2A4; &#xC911; &#xD558;&#xB098;&#xB294; &#xBD80;&#xBD84;&#xC801; &#xD0C0;&#xC785;&#xC785;&#xB2C8;&#xB2E4;. &#xC544;&#xB798; &#xCF54;&#xB4DC;&#xB97C; &#xBCF4;&#xC8E0;.</p><pre><code class="language-typescript">interface Data {
  a: &quot;A&quot; | &quot;B&quot; | &quot;C&quot;;
  b: number;
  c: string;
  d: string[];
}

const baseData1: Partial&lt;Data&gt; = {
  a: &quot;A&quot;,
  b: 1,
};

const data1: Data = {
  ...baseData1, // &#x274C; Error(ts2322): &#xC785;&#xB825;&#xB41C; &#xAC12;&#xC774; &#xD0C0;&#xC785;&#xACFC; &#xC815;&#xD655;&#xD788; &#xBD80;&#xD569;&#xD558;&#xC9C0; &#xC54A;&#xB294;&#xB2E4;. (baseTata&#xC758; &#xD0C0;&#xC785;&#xC740; &#xC635;&#xC154;&#xB110;)
  c: &quot;foo&quot;,
  d: [&quot;asd&quot;],
};
</code></pre><p>&#x2003;baseData&#xB294; a&#xC18D;&#xC131;&#xACFC; b&#xC18D;&#xC131;&#xC774; &#xC788;&#xC9C0;&#xB9CC; &#xD0C0;&#xC785;&#xC2A4;&#xD06C;&#xB9BD;&#xD2B8;&#xB294; baseData&#xB97C; Partial &#xD0C0;&#xC785;&#xC73C;&#xB85C;&#xB9CC; &#xBCF4;&#xAE30; &#xB54C;&#xBB38;&#xC5D0; &#xAC12;&#xC758; &#xC720;&#xBB34;&#xB294; &#xD655;&#xC778;&#xD558;&#xC9C0; &#xC54A;&#xC2B5;&#xB2C8;&#xB2E4;.<br>&#x2003;baseData&#xC758; &#xD0C0;&#xC785;&#xC744; Pick&lt;Data, &quot;a&quot; | &quot;b&quot;&gt;&#xB85C; &#xC9C0;&#xC815;&#xD558;&#xBA74; &#xD574;&#xACB0;&#xD560; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;. &#xD558;&#xC9C0;&#xB9CC; Data &#xD0C0;&#xC785;&#xC774; &#xBCC0;&#xACBD;&#xB418;&#xBA74; &#xAC19;&#xC774; &#xBCC0;&#xACBD;&#xD574;&#xC57C; &#xD558;&#xB294; &#xBC88;&#xAC70;&#xB85C;&#xC6C0;&#xC774; &#xC788;&#xB124;&#xC694;. satisfies&#xB294; &#xC774; &#xBB38;&#xC81C;&#xB97C; &#xC880; &#xB354; &#xAC04;&#xACB0;&#xD558;&#xAC8C; &#xD574;&#xACB0;&#xD569;&#xB2C8;&#xB2E4;!</p><pre><code class="language-typescript">const baseData2 = {
  a: &quot;A&quot;,
  b: 1,
} satisfies Partial&lt;Data&gt;;

const data2: Data = {
  ...baseData2, // &#x2705; &#xD1B5;&#xACFC;! baseData: { a: &quot;A&quot;; b: number; }
  c: &quot;foo&quot;,
  d: [&quot;asd&quot;],
};
</code></pre><p>&#x2003;&#xC704;&#xC5D0;&#xC11C; &#xBD24;&#xB4EF;&#xC774; satisfies&#xB294; &#xD0C0;&#xC785;&#xC774; &#xC548;&#xC804;&#xD558;&#xB2E4;&#xACE0; &#xD655;&#xC778;&#xD558;&#xBA74; downcasting&#xD574;&#xC11C; &#xD0C0;&#xC785;&#xC744; &#xC881;&#xD799;&#xB2C8;&#xB2E4;. &#xC989;, baseData2&#xB294; Partial&#xAC00; &#xC544;&#xB2C8;&#xB77C; <code>{ a: &quot;A&quot;; b: number; }</code> &#xD0C0;&#xC785;&#xC73C;&#xB85C; &#xBCC0;&#xD658;&#xB429;&#xB2C8;&#xB2E4;. &#xB530;&#xB77C;&#xC11C; data2&#xC758; &#xD0C0;&#xC785; &#xCCB4;&#xD06C;&#xAC00; &#xD1B5;&#xACFC;&#xB429;&#xB2C8;&#xB2E4;.</p><h3 id="%EC%95%88%EC%A0%84%ED%95%9C-%ED%83%80%EC%9E%85-%EB%8B%A8%EC%96%B8">&#xC548;&#xC804;&#xD55C; &#xD0C0;&#xC785; &#xB2E8;&#xC5B8;</h3><p>&#x2003;<code>as</code>&#xB294; TypeScript &#xC0AC;&#xC6A9;&#xC790;&#xB4E4;&#xC774; &#xAE30;&#xD53C;&#xD558;&#xC9C0;&#xB9CC;, &#xC5B4;&#xCA54; &#xC218; &#xC5C6;&#xC774; &#xC0AC;&#xC6A9;&#xD560; &#xC0C1;&#xD669;&#xC774; &#xBC1C;&#xC0DD;&#xD560; &#xC218;&#xB3C4; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;. &#xC54C;&#xB2E4;&#xC2DC;&#xD53C; &#xAC1C;&#xBC1C;&#xC5D0; &#xC788;&#xC5B4; &apos;&#xC808;&#xB300;&apos;&#xB77C;&#xB294; &#xAC74; &#xC5C6;&#xC73C;&#xB2C8;&#xAE4C;&#xC694;.<br>&#x2003;&#xC678;&#xBD80;&#xC5D0;&#xC11C; &#xAC00;&#xC838;&#xC628; &#xB370;&#xC774;&#xD130;&#xAC00; <code>User</code> &#xD0C0;&#xC785;&#xC778;&#xC9C0; &#xC810;&#xAC80;&#xD558;&#xACE0;, <code>User</code> &#xD0C0;&#xC785;&#xC73C;&#xB85C;&#xC11C; <code>return</code>&#xD558;&#xB824;&#xBA74; &#xC5B4;&#xB5BB;&#xAC8C; &#xD574;&#xC57C; &#xD560;&#xAE4C;&#xC694;?<br>&#x2003;&#xBCF4;&#xD1B5;&#xC740; <code>is User</code>&#xB97C; &#xC0AC;&#xC6A9;&#xD558;&#xB294; &#xAC8C; &#xC548;&#xC804;&#xD569;&#xB2C8;&#xB2E4;. &#xD558;&#xC9C0;&#xB9CC; &#xADF8;&#xB9C8;&#xC800;&#xB3C4; &#xC5EC;&#xC758;&#xCE58; &#xC54A;&#xC73C;&#xBA74; <code>as User</code>&#xB77C;&#xACE0; &#xB2E8;&#xC5B8;&#xD574;&#xC11C; &#xBCF4;&#xB0B4;&#xC57C;&#xD560; &#xB54C;&#xAC00; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.</p><pre><code class="language-typescript">interface User {
  name: string;
  location: string;
}

const user1 = {
  name: &quot;&#xD0DC;&#xD604;&quot;,
  location: &quot;&#xACBD;&#xAE30;&quot;,
} as User;

// ...

return user1;
</code></pre><p>&#x2003;&#xD558;&#xC9C0;&#xB9CC; as&#xC758; &#xACE0;&#xC9C8;&#xC801;&#xC778; &#xBB38;&#xC81C;&#xB294; &apos;&#xD0C0;&#xC785; &#xC810;&#xAC80;&#xC744; &#xC804;&#xD600; &#xC548; &#xD55C;&#xB2E4;&#xB294; &#xAC83;&apos;&#xC785;&#xB2C8;&#xB2E4;. &#xC544;&#xB798; &#xCF00;&#xC774;&#xC2A4;&#xB294; &#xC2EC;&#xAC01;&#xD574;&#xC9C0;&#xACA0;&#xC8E0;.</p><pre><code class="language-typescript">// &#x2753; &#xC5B4;&#xB290; &#xB0A0; User&#xC5D0; major &#xC18D;&#xC131;&#xC774; &#xCD94;&#xAC00;&#xB410;&#xB2E4;&#xBA74;?
interface User {
  name: string;
  location: string;
  major: &quot;frontend&quot; | &quot;backend&quot;; // &#xC18D;&#xC131; &#xCD94;&#xAC00;.
}

// &#x2757; &#xC5D0;&#xB7EC;&#xAC00; &#xB0A0; &#xC0C1;&#xD669;&#xC778;&#xB370; as &#xB54C;&#xBB38;&#xC5D0; &#xADF8;&#xB0E5; &#xD1B5;&#xACFC;&#xC2DC;&#xCF1C;&#xBC84;&#xB9B0;&#xB2E4;!
const user2 = {
  name: &quot;&#xD0DC;&#xD604;&quot;,
  location: &quot;&#xACBD;&#xAE30;&quot;,
} as User;
</code></pre><p>&#x2003;satisfies&#xB294; &#xD0C0;&#xC785; &#xCCB4;&#xD06C;, as&#xB294; &#xD0C0;&#xC785; &#xB2E8;&#xC5B8;&#xC744; &#xD569;&#xB2C8;&#xB2E4;. &#xB458;&#xC744; &#xC11E;&#xC73C;&#xBA74; &#xC5B4;&#xB5BB;&#xAC8C; &#xB420;&#xAE4C;&#xC694;? &#xD0C0;&#xC785; &#xCCB4;&#xD06C; &#x27AD; &#xD0C0;&#xC785; &#xB2E8;&#xC5B8;&#xC744; &#xD569;&#xB2C8;&#xB2E4;!</p><pre><code class="language-typescript">const user = {
  name: &quot;&#xD0DC;&#xD604;&quot;,
  location: &quot;&#xACBD;&#xAE30;&quot;,
} satisfies User as User; // &#x274C; Error(ts1360): major &#xC18D;&#xC131;&#xC744; &#xC785;&#xB825;&#xD558;&#xC2DC;&#xC624;.
</code></pre><p>&#x2003;&#xD0C0;&#xC785; &#xBA85;&#xC2DC;&#xC640; &#xC77C;&#xCE58;&#xD558;&#xB294;&#xC9C0; &#xD655;&#xC778;&#xD55C; &#xB2E4;&#xC74C;&#xC5D0; &#xB2E8;&#xC5B8;&#xD558;&#xAE30; &#xB54C;&#xBB38;&#xC5D0; &#xC548;&#xC804;&#xD558;&#xAC8C; &#xD0C0;&#xC785;&#xC744; &#xB2E8;&#xC5B8;&#xD560; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;!</p><h3 id="%ED%83%80%EC%9E%85-%EC%97%85%EC%BA%90%EC%8A%A4%ED%8C%85">&#xD0C0;&#xC785; &#xC5C5;&#xCE90;&#xC2A4;&#xD305;</h3><p>&#x2003;&#xC5EC;&#xD0DC;&#xAE4C;&#xC9C0; satisfies&#xAC00; &#xD0C0;&#xC785; &#xB2E4;&#xC6B4; &#xCE90;&#xC2A4;&#xD305;&#xB9CC; &#xD588;&#xB294;&#xB370;&#xC694;. &#xD0C0;&#xC785; &#xC5C5;&#xCE90;&#xC2A4;&#xD305;&#xC73C;&#xB85C; &#xC0AC;&#xC6A9;&#xD560; &#xC218;&#xB3C4; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.</p><pre><code class="language-typescript">interface Gamer {
  id: string;
  name: string;
  nickname: string;
  joinDate: string;
  friends: string[];
  gameMoney: number;
  cash: number;
  totalUsedGameMoney: number;
  // &#xADF8; &#xC678; 40&#xAC1C;&#xAC00; &#xB118;&#xB294; &#xC815;&#xBCF4;&#xB4E4;.
}

const gamer281: Gamer = {
  id: &quot;1232-a281&quot;,
  name: &quot;&#xC774;&#xD0DC;&#xD604;&quot;,
  nickname: &quot;hamelln&quot;,
  joinDate: &quot;2023-03-23&quot;,
  friends: [&quot;id1&quot;, &quot;id2&quot;, &quot;id3&quot;],
  gameMoney: 203022,
  cash: 20000,
  totalUsedGameMoney: 2202200,
  // &#xADF8; &#xC678; 40&#xAC1C; &#xB118;&#xB294; &#xC815;&#xBCF4;&#xB4E4;.
};
</code></pre><p>&#x2003;&#xC704;&#xC758; &#xCF54;&#xB4DC;&#xB97C; &#xBD05;&#xC2DC;&#xB2E4;. &#xAC8C;&#xC774;&#xBA38;&#xC5D0;&#xAC8C;&#xB294; &#xB9CE;&#xC740; &#xC815;&#xBCF4;&#xAC00; &#xC788;&#xB294;&#xB370;&#xC694;. &#xAC8C;&#xC774;&#xBA38;&#xB4E4;&#xC744; &#xB300;&#xC0C1;&#xC73C;&#xB85C; &#xC774;&#xBCA4;&#xD2B8;&#xB97C; &#xC9C4;&#xD589;&#xD55C;&#xB2E4;&#xACE0; &#xAC00;&#xC815;&#xD569;&#xC2DC;&#xB2E4;. &#xB2F9;&#xCCA8;&#xC790;&#xB97C; &#xBC1C;&#xD45C;&#xD558;&#xAE30; &#xC704;&#xD574;&#xC11C; &#xCD5C;&#xC18C;&#xD55C;&#xC758; &#xC815;&#xBCF4;&#xB9CC; &#xC870;&#xD68C;&#xD558;&#xACE0; &#xADF8; &#xC678;&#xC5D0;&#xB294; &#xCC38;&#xC870;&#xD558;&#xC9C0; &#xC54A;&#xC544;&#xB3C4; &#xB418;&#xB294;&#xB370;&#xC694;. &#xC774;&#xB7F4; &#xB54C; &#xD0C0;&#xC785; &#xC5C5;&#xCE90;&#xC2A4;&#xD305;&#xC744; &#xC0AC;&#xC6A9;&#xD558;&#xBA74; &#xC88B;&#xC2B5;&#xB2C8;&#xB2E4;.</p><pre><code class="language-typescript">type EventParticipants = { id: string; name: string; nickname: string, phone: string };

function personalize(gamer: Gamer) {
  return gamer satisfies EventParticipants as EventParticipants;
}

const person = personalize(gamer281);
person.cash // &#x274C; Error(ts2339): EventParticipants &#xD0C0;&#xC785;&#xC5D0; &#xC5C6;&#xB294; &#xC18D;&#xC131;&#xC785;&#xB2C8;&#xB2E4;!
</code></pre><p>&#x2003;Gamer&#xB294; EventParticipants &#xD0C0;&#xC785;&#xC744; &#xB9CC;&#xC871;&#xD558;&#xAE30; &#xB54C;&#xBB38;&#xC5D0; satisfies EventParticipants&#xB97C; &#xD1B5;&#xACFC;&#xD569;&#xB2C8;&#xB2E4;. &#xD558;&#xC9C0;&#xB9CC; gamer&#xC5D0;&#xB294; EventParticipants &#xD0C0;&#xC785; &#xB9D0;&#xACE0;&#xB3C4; &#xC5EC;&#xB7EC; &#xAC12;&#xB4E4;&#xC774; &#xC2E4;&#xC7AC;&#xD558;&#xAE30; &#xB54C;&#xBB38;&#xC5D0; EventParticipants &#xD0C0;&#xC785;&#xC73C;&#xB85C; &#xBC14;&#xB00C;&#xC9C4; &#xC54A;&#xC2B5;&#xB2C8;&#xB2E4;.<br>&#x2003;&#xC774; &#xB54C; <code>satisfies EventParticipants as EventParticipants</code>&#xB97C; &#xC0AC;&#xC6A9;&#xD558;&#xBA74; Gamer &#xD0C0;&#xC785;&#xC740; EventParticipants &#xD0C0;&#xC785;&#xC73C;&#xB85C;&#xC11C; &#xCC38;&#xC870;&#xB429;&#xB2C8;&#xB2E4;. &#xD0C0;&#xC785;&#xC744; &#xCCB4;&#xD06C;&#xD558;&#xACE0; &#xC18D;&#xC131;&#xC744; &#xC801;&#xAC8C; &#xB9CC;&#xB4DC;&#xB294; &#xC548;&#xC804;&#xD55C; &#xD0C0;&#xC785; &#xC5C5;&#xCE90;&#xC2A4;&#xD305;&#xC774; &#xAD6C;&#xD604;&#xB410;&#xC2B5;&#xB2C8;&#xB2E4;!</p><p>&#x2003;&#xB2E4;&#xB978; &#xC0AC;&#xC6A9; &#xC608;&#xC2DC;&#xB97C; &#xC0DD;&#xAC01;&#xD574;&#xBD05;&#xC2DC;&#xB2E4;. Jest&#xC758; &#xD14C;&#xC2A4;&#xD2B8; &#xD658;&#xACBD;&#xC740; Node.js&#xB098; Jsdom&#xC785;&#xB2C8;&#xB2E4;. BOM&#xC744; &#xC644;&#xBCBD;&#xD558;&#xAC8C; &#xC9C0;&#xC6D0;&#xD558;&#xC9C0; &#xC54A;&#xAE30; &#xB54C;&#xBB38;&#xC5D0; &#xAD00;&#xB828; &#xAC1D;&#xCCB4;&#xB97C; &#xBAA8;&#xD0B9;&#xD574;&#xC57C; &#xD558;&#xB294;&#xB370;&#xC694;. &#xC774; &#xB54C; &#xD0C0;&#xC785; &#xC5C5;&#xCE90;&#xC2A4;&#xD305;&#xC744; &#xC0AC;&#xC6A9;&#xD574;&#xC11C; &quot;&#xD544;&#xC694;&#xD55C; &#xC18D;&#xC131;&#xB9CC; &#xBAA8;&#xD0B9;&quot;&#xD558;&#xB294; &#xC218;&#xB3C4; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.</p><h2 id="%EB%A7%88%EB%AC%B4%EB%A6%AC">&#xB9C8;&#xBB34;&#xB9AC;</h2><p>&#x2003;satisfies&#xB294; &#xBCF8;&#xB798; &#xC218; &#xB144; &#xC804;&#xC5D0; &apos;&#xD0C0;&#xC785; &#xD638;&#xD658;&#xC131;&#xC774; &#xC801;&#xC808;&#xD55C;&#xC9C0; &#xD310;&#xB2E8;&apos;&#xD558;&#xACE0; &#xC2F6;&#xC5B4;&#xC11C; &#xC81C;&#xC548;&#xC774; &#xB418;&#xC5C8;&#xC9C0;&#xB9CC; &#xC2A4;&#xD14C;&#xC774;&#xC9C0;&#xAC00; &#xC9C4;&#xD589;&#xB418;&#xBA74;&#xC11C; &#xCD94;&#xAC00;&#xC801;&#xC778; &#xBCC0;&#xD654;&#xB97C; &#xAC70;&#xCCE4;&#xC2B5;&#xB2C8;&#xB2E4;. &#xBA4B;&#xC9C4; &#xAE30;&#xB2A5;&#xC774;&#xB2C8; &#xC5F0;&#xC2B5;&#xD558;&#xBA74;&#xC11C; &#xC775;&#xC219;&#xD574;&#xC9D1;&#xC2DC;&#xB2E4;!</p>]]></content:encoded></item><item><title><![CDATA[타입스크립트의 템플릿 리터럴]]></title><description><![CDATA[타입스크립트 4.1에 도입된 템플릿 리터럴을 통해 대수적 타입과 문제해결 능력에 대해 고민해봅니다]]></description><link>https://blog.cinntiq.synology.me/template-literal-types/</link><guid isPermaLink="false">659cdb92707381000106fdda</guid><category><![CDATA[TypeScript]]></category><dc:creator><![CDATA[Hameln]]></dc:creator><pubDate>Tue, 09 Jan 2024 05:44:28 GMT</pubDate><media:content url="https://blog.cinntiq.synology.me/content/images/2024/01/typescript.png" medium="image"/><content:encoded><![CDATA[<h1 id="%EB%AA%A9%ED%91%9C">&#xBAA9;&#xD45C;</h1><blockquote>&#x2003;&#xD0C0;&#xC785;&#xC2A4;&#xD06C;&#xB9BD;&#xD2B8; 4.1&#xC5D0; &#xB3C4;&#xC785;&#xB41C; &#xD15C;&#xD50C;&#xB9BF; &#xB9AC;&#xD130;&#xB7F4; &#xD0C0;&#xC785;&#xC744; &#xC54C;&#xC544;&#xBCF4;&#xACE0; &#xB300;&#xC218;&#xC801; &#xD0C0;&#xC785;(Algebraic Data Types, &#xC774;&#xD6C4; ADTs)&#xC774; &#xC65C; &#xC815;&#xC801; &#xD0C0;&#xC785; &#xC5B8;&#xC5B4;&#xC5D0; &#xD544;&#xC694;&#xD55C;&#xC9C0; &#xC774;&#xD574;&#xD569;&#xB2C8;&#xB2E4;.</blockquote><img src="https://blog.cinntiq.synology.me/content/images/2024/01/typescript.png" alt="&#xD0C0;&#xC785;&#xC2A4;&#xD06C;&#xB9BD;&#xD2B8;&#xC758; &#xD15C;&#xD50C;&#xB9BF; &#xB9AC;&#xD130;&#xB7F4;"><p>&#x2003;&#xC815;&#xC801; &#xD0C0;&#xC785; &#xC5B8;&#xC5B4;&#xB294; &#xB7F0;&#xD0C0;&#xC784; &#xC804;&#xC5D0; &#xD0C0;&#xC785;&#xC744; &#xCCB4;&#xD06C;&#xD568;&#xC73C;&#xB85C; &#xC5D0;&#xB7EC;&#xB97C; &#xBBF8;&#xB9AC; &#xBC1C;&#xACAC;&#xD569;&#xB2C8;&#xB2E4;.<br>&#x2003;&#xC644;&#xBCBD;&#xD55C; &#xC5B8;&#xC5B4;&#xB294; &#xC5C6;&#xC2B5;&#xB2C8;&#xB2E4;. &#xB300;&#xBD80;&#xBD84; &#xC815;&#xC801; &#xD0C0;&#xC785; &#xC5B8;&#xC5B4;&#xC758; &#xD55C;&#xACC4;&#xC810;&#xC740; ad-hoc &#xD0C0;&#xC785; &#xC2DC;&#xC2A4;&#xD15C;&#xC785;&#xB2C8;&#xB2E4;. ad-hoc&#xC740; &quot;&#xC784;&#xC2DC;&#xC801;&#xC778;, &#xC804;&#xC6A9;&quot;&#xC774;&#xB77C;&#xB294; &#xB73B;&#xC785;&#xB2C8;&#xB2E4;. &#xC608;&#xB97C; &#xB4E4;&#xC5B4; &#xC720;&#xC800; &#xB370;&#xC774;&#xD130;&#xC758; &#xD0C0;&#xC785;&#xC744; &#xB2E4;&#xB8E8;&#xACE0; &#xC2F6;&#xC744; &#xB54C; &#xC6B0;&#xB9AC;&#xB294; User&#xB77C;&#xB294; &#xC804;&#xC6A9; &#xD0C0;&#xC785;&#xC744; &#xB9CC;&#xB4E4;&#xACE0; &#xAD00;&#xB9AC;&#xD569;&#xB2C8;&#xB2E4;. <br>&#x2003;&#xB9CC;&#xC57D; &#xC544;&#xBB34; &#xACF3;&#xC5D0;&#xB098; &#xC368;&#xB3C4; &#xD638;&#xD658;&#xC774; &#xB418;&#xB294; &#xB9CC;&#xB2A5; &#xD0C0;&#xC785;&#xC774; &#xC874;&#xC7AC;&#xD55C;&#xB2E4;&#xACE0; &#xAC00;&#xC815;&#xD574;&#xBD05;&#xC2DC;&#xB2E4;. &#xD558;&#xB098;&#xC758; &#xD0C0;&#xC785;&#xC73C;&#xB85C; &#xC720;&#xC800;, &#xAC8C;&#xC784;, &#xC74C;&#xC2DD;, &#xC560;&#xC644;&#xB3D9;&#xBB3C;, &#xAC8C;&#xC2DC;&#xBB3C; &#xB4F1; &#xBAA8;&#xB4E0; &#xB370;&#xC774;&#xD130;&#xB97C; &#xB2E4;&#xB8EC;&#xB2E4;&#xBA74; &#xC11C;&#xB85C; &#xC5B4;&#xB5BB;&#xAC8C; &#xAD6C;&#xBD84;&#xD560; &#xC218; &#xC788;&#xC744;&#xAE4C;&#xC694;? ad-hoc &#xD0C0;&#xC785; &#xC2DC;&#xC2A4;&#xD15C;&#xC740; &#xD53C;&#xD560; &#xC218; &#xC5C6;&#xB294; &#xC6B4;&#xBA85;&#xC785;&#xB2C8;&#xB2E4;. </p><h3 id="%EB%8B%B9%EC%97%B0%ED%95%9C-%EB%93%AF-%EB%B3%B4%EC%9E%85%EB%8B%88%EB%8B%A4-%EC%9D%B4%EA%B2%8C-%EC%99%9C-%EB%AC%B8%EC%A0%9C%EC%9D%BC%EA%B9%8C%EC%9A%94">&#xB2F9;&#xC5F0;&#xD55C; &#xB4EF; &#xBCF4;&#xC785;&#xB2C8;&#xB2E4;. &#xC774;&#xAC8C; &#xC65C; &#xBB38;&#xC81C;&#xC77C;&#xAE4C;&#xC694;?</h3><p>&#x2003;&#xC774;&#xB7EC;&#xD55C; &#xC2DC;&#xC2A4;&#xD15C;&#xC740; <strong>&#xACE0;&#xB3C4;&#xC758; &#xCD94;&#xC0C1;&#xD654;&#xC640; &#xBC94;&#xC704; &#xBAA8;&#xB378;&#xB9C1;&#xC744; &#xC5B4;&#xB835;&#xAC8C; &#xB9CC;&#xB4E4;&#xC5C8;&#xC2B5;&#xB2C8;&#xB2E4;.</strong> &#xD0C0;&#xC785;&#xC774; &#xC608;&#xCE21;&#xC5D0;&#xC11C; &#xC870;&#xAE08;&#xC774;&#xB77C;&#xB3C4; &#xBC97;&#xC5B4;&#xB0A0; &#xAC83; &#xAC19;&#xC73C;&#xBA74; &#xC815;&#xC9C0;&#xBD80;&#xD130; &#xD558;&#xB294; &#xC608;&#xBBFC;&#xD55C; &#xC2DC;&#xC2A4;&#xD15C;&#xC740; &#xBA4B;&#xC9C0;&#xC9C0; &#xC54A;&#xC2B5;&#xB2C8;&#xB2E4;. <strong>&#xC81C;&#xB124;&#xB9AD;, &#xC720;&#xB2C8;&#xC628;, &#xD29C;&#xD50C;&#xC774; &#xC5C6;&#xB294; &#xD0C0;&#xC785;&#xC2A4;&#xD06C;&#xB9BD;&#xD2B8;</strong>&#xB97C; &#xC0DD;&#xAC01;&#xD574;&#xBCF4;&#xC138;&#xC694;. <br>&#x2003;&#xC774;&#xB97C; &#xBCF4;&#xC644;&#xD558;&#xB294; &#xC5F0;&#xAD6C;&#xC640; &#xAC1C;&#xC120;&#xC774; &#xB9CE;&#xC2B5;&#xB2C8;&#xB2E4;. Martin-L&#xF6;f Type Theory, Generic, C++&#xC758; Dependent Types, Rust&#xC758; &#xB300;&#xC218;&#xC801; &#xD0C0;&#xC785;&#xC774; &#xC88B;&#xC740; &#xC608;&#xC2DC;&#xC785;&#xB2C8;&#xB2E4;.<br>&#x2003;&#xB300;&#xC218;&#xC801; &#xD0C0;&#xC785;&#xC740; &#xD0C0;&#xC785;&#xC744; &#xC218;&#xD559;&#xCC98;&#xB7FC; &#xB354;&#xD558;&#xACE0; &#xACF1;&#xD574;&#xC11C; <em><strong>&#xBB38;&#xC81C; &#xD574;&#xACB0;, &#xB300;&#xC751;&#xC5D0; &#xB3C4;&#xC6C0;&#xB418;&#xB294; &#xC720;&#xC5F0;&#xD55C; &#xD0C0;&#xC785;</strong></em>&#xC744; &#xB9CC;&#xB4E4;&#xC790;&#xB294; &#xC544;&#xC774;&#xB514;&#xC5B4;&#xC785;&#xB2C8;&#xB2E4;. &#xB354;&#xD558;&#xB294; &#xD0C0;&#xC785;&#xACFC; &#xACF1;&#xD558;&#xB294; &#xD0C0;&#xC785;&#xC774; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.</p><pre><code class="language-typescript">// &#xB354;&#xD558;&#xB294; &#xD0C0;&#xC785;
type Direction = &quot;up&quot; | &quot;down&quot; | &quot;right&quot; | &quot;left&quot;
type Params = string | number
// &#xACF1;&#xD558;&#xB294; &#xD0C0;&#xC785;
type Person = { name: string, age: number }
type Tuple = readonly [boolean, number, string]
</code></pre><p><strong>&#x2003;&#xB354;&#xD558;&#xB294; &#xD0C0;&#xC785;&#xC740; &#xC5EC;&#xB7EC; &#xC120;&#xD0DD;&#xC9C0;&#xAC00; &#xC788;&#xB294; &#xD0C0;&#xC785;&#xC774;&#xACE0;, &#xACF1;&#xD558;&#xB294; &#xD0C0;&#xC785;&#xC740; &#xD558;&#xB098; &#xC548;&#xC5D0; &#xC5EC;&#xB7EC; &#xD0C0;&#xC785;&#xC774; &#xACF5;&#xC874;&#xD569;&#xB2C8;&#xB2E4;.</strong> &#xADF8;&#xAC8C; &#xC804;&#xBD80;&#xC785;&#xB2C8;&#xB2E4;. &#xC9C0;&#xADF9;&#xD788; &#xAC04;&#xB2E8;&#xD55C; &#xC6D0;&#xB9AC;&#xC785;&#xB2C8;&#xB2E4;.</p><h3 id="%ED%85%9C%ED%94%8C%EB%A6%BF-%EB%A6%AC%ED%84%B0%EB%9F%B4-%ED%83%80%EC%9E%85">&#xD15C;&#xD50C;&#xB9BF; &#xB9AC;&#xD130;&#xB7F4; &#xD0C0;&#xC785;?</h3><p>&#x2003;&#xD15C;&#xD50C;&#xB9BF; &#xB9AC;&#xD130;&#xB7F4; &#xD0C0;&#xC785;&#xC740; &#xB300;&#xC218;&#xC801; &#xD0C0;&#xC785;&#xC758; &#xBC94;&#xC704; &#xBAA8;&#xB378;&#xB9C1;&#xC744; &#xAC15;&#xB825;&#xD558;&#xAC8C; &#xC9C0;&#xC6D0;&#xD569;&#xB2C8;&#xB2E4;. &#xD15C;&#xD50C;&#xB9BF; &#xB9AC;&#xD130;&#xB7F4; &#xD0C0;&#xC785;&#xC774; &#xB3C4;&#xC785;&#xB418;&#xAE30; &#xC804; &#xCF54;&#xB4DC;&#xB97C; &#xBD05;&#xC2DC;&#xB2E4;.</p><pre><code class="language-typescript">// case 1: &#xBC84;&#xD2BC; &#xD0C0;&#xC785;&#xC774; &#xCD94;&#xAC00;&#xB420; &#xB54C;&#xB9C8;&#xB2E4;...
type Buttons = &quot;a&quot; | &quot;b&quot; | &quot;x&quot; | &quot;y&quot; | &quot;home&quot; | &quot;zl&quot; | &quot;zr&quot;;

// &#x1F494; &#xBC84;&#xD2BC;&#xC5D0; &#xB300;&#xD55C; &#xBA54;&#xC18C;&#xB4DC; &#xD0C0;&#xC785;&#xB3C4; &#xC77C;&#xC77C;&#xC774; &#xCD94;&#xAC00;&#xD574;&#xC57C; &#xD55C;&#xB2E4;.
type ButtonsController = {
  onA: () =&gt; void;
  onB: () =&gt; void;
  onX: () =&gt; void;
  onY: () =&gt; void;
  onHome: () =&gt; void;
  onZl: () =&gt; void;
  onZr: () =&gt; void;
};

class Controller implements ButtonsController {
  // ... &#xBA54;&#xC18C;&#xB4DC; &#xAD6C;&#xD604;
}

// case 2: &#xD3EC;&#xCEE4;&#xC6A9; &#xCE74;&#xB4DC; &#xD0C0;&#xC785;&#xC744; &#xC5B4;&#xB5BB;&#xAC8C; &#xB9CC;&#xB4E4;&#xC9C0;?
type CardRank = 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | &quot;J&quot; | &quot;Q&quot; | &quot;K&quot; | &quot;A&quot;;
type CardSuit = &quot;&#x2665;&quot; | &quot;&#x2660;&quot; | &quot;&#x2663;&quot; | &quot;&#x25C6;&quot;;
type Card = [CardSuit, CardRank] | &quot;JOKER&quot;; // &#x1F647;&#x200D;&#x2642;&#xFE0F; &#xD760;...&#xBB54;&#xAC00; &#xBCC4;&#xB85C;&#xB2E4;.
</code></pre><p>&#x2003;case 1: &#xD0C0;&#xC785;&#xC774; &#xCD94;&#xAC00;&#xB418;&#xAC70;&#xB098; &#xD0C0;&#xC785; &#xC774;&#xB984;&#xC774; &#xBCC0;&#xACBD;&#xB420; &#xB54C;&#xB9C8;&#xB2E4; &#xBA54;&#xC18C;&#xB4DC; &#xD0C0;&#xC785;&#xC744; &#xC815;&#xC758;&#xD558;&#xB294; &#xCF54;&#xB4DC;&#xB3C4; &#xB9E4;&#xBC88; &#xACE0;&#xCCD0;&#xC57C; &#xD569;&#xB2C8;&#xB2E4;. &#xBC88;&#xAC70;&#xB85C;&#xC6B8; &#xBFD0;&#xB354;&#xB7EC; &#xC2E4;&#xC218;&#xD560; &#xC218;&#xB3C4; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.<br>&#x2003;case 2: &#xD29C;&#xD50C; | &quot;JOKER&quot; &#xD0C0;&#xC785;&#xC774;&#xB77C; &#xD1B5;&#xC77C;&#xAC10;&#xC774; &#xB5A8;&#xC5B4;&#xC9C0;&#xACE0; &#xBCF4;&#xAE30; &#xC548; &#xC88B;&#xC2B5;&#xB2C8;&#xB2E4;.</p><p>&#x2003;&#xC0C1;&#xC220;&#xD588;&#xB358; ad-hoc &#xD0C0;&#xC785; &#xC2DC;&#xC2A4;&#xD15C;&#xC758; &#xB2E8;&#xC810;&#xC744; &#xBA85;&#xD655;&#xD788; &#xBCF4;&#xC5EC;&#xC90D;&#xB2C8;&#xB2E4;. &#xD0C0;&#xC785;&#xC774; &#xB108;&#xBB34; &#xAD6C;&#xCCB4;&#xC801;&#xC774;&#xBA74; &#xBC14;&#xAFB8;&#xB824;&#xACE0; &#xD560; &#xB54C;&#xB9C8;&#xB2E4; &#xAD00;&#xB828;&#xB41C; &#xAC83;&#xB4E4;&#xC744; &#xC77C;&#xC77C;&#xC774; &#xACE0;&#xCCD0;&#xC57C; &#xD558;&#xACE0;, &#xBCF5;&#xC7A1;&#xD55C; &#xD0C0;&#xC785;&#xC5D0; &#xC801;&#xC6A9;&#xD558;&#xAE30;&#xB3C4; &#xD798;&#xB4ED;&#xB2C8;&#xB2E4;.</p><p>&#x2003;&#xD15C;&#xD50C;&#xB9BF; &#xB9AC;&#xD130;&#xB7F4; &#xD0C0;&#xC785;&#xC73C;&#xB85C; &#xC704; &#xCF54;&#xB4DC;&#xB97C; &#xAC1C;&#xC120;&#xD574;&#xBD05;&#xC2DC;&#xB2E4;.</p><pre><code class="language-typescript">// case 1: &#xBC84;&#xD2BC;&#xC5D0; &#xB300;&#xD55C; &#xD0C0;&#xC785;&#xB9CC; &#xCD94;&#xAC00;&#xD558;&#xAC70;&#xB098; &#xBCC0;&#xACBD;&#xD569;&#xB2C8;&#xB2E4;.
type Buttons = &quot;a&quot; | &quot;b&quot; | &quot;x&quot; | &quot;y&quot; | &quot;home&quot; | &quot;zl&quot; | &quot;zr&quot; 
type CapitalizedButtons = Capitalize&lt;Buttons&gt; // &#x1F4D8; Capitalize: TS 4.1&#xC5D0; &#xCD94;&#xAC00;&#xB41C; &#xD0C0;&#xC785;. string &#xB9AC;&#xD130;&#xB7F4; &#xD0C0;&#xC785;&#xC758; &#xCCAB; &#xAE00;&#xC790;&#xB97C; &#xB300;&#xBB38;&#xC790;&#xB85C; &#xBC14;&#xAFC9;&#xB2C8;&#xB2E4;.
type ButtonHandlers = `on${CapitalizedButtons}` // &quot;onA&quot; | &quot;onB&quot; | &quot;onX&quot; | &quot;onY&quot; | &quot;onHome&quot; | &quot;onZl&quot; | &quot;onZr&quot;

// &#x1F389; &#xBA54;&#xC18C;&#xB4DC; &#xD0C0;&#xC785;&#xC740; &#xBC84;&#xD2BC; &#xD0C0;&#xC785;&#xC5D0; &#xB9DE;&#xCDB0;&#xC11C; &#xC790;&#xB3D9;&#xC73C;&#xB85C; &#xC5C5;&#xB370;&#xC774;&#xD2B8;&#xB429;&#xB2C8;&#xB2E4;!
type ButtonsController = {
  [BH in ButtonHandlers]: () =&gt; void;
}

class Controller implements ButtonsController {
  // ... &#xBA54;&#xC18C;&#xB4DC; &#xAD6C;&#xD604;
}

// case 2: &#xD3EC;&#xCEE4; &#xCE74;&#xB4DC;
type CardRank = 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | &quot;J&quot; | &quot;Q&quot; | &quot;K&quot; | &quot;A&quot;;
type CardSuit = &quot;&#x2665;&quot; | &quot;&#x2660;&quot; | &quot;&#x2663;&quot; | &quot;&#x25C6;&quot;;
type Card = `${CardSuit}-${CardRank}` | &quot;JOKER&quot;; // 53&#xAC00;&#xC9C0;&#xC758; &#xBB38;&#xC790;&#xC5F4; &#xB9AC;&#xD130;&#xB7F4; &#xD0C0;&#xC785; &#xC0DD;&#xC131;
</code></pre><p>&#x2003;&#xD0C0;&#xC785;&#xC744; &#xC880; &#xB354; &#xC720;&#xC5F0;&#xD558;&#xAC8C; &#xC120;&#xC5B8;&#xD560; &#xC218; &#xC788;&#xACE0;, &#xC57D;&#xAC04;&#xC758; &#xC218;&#xC815; &#xC791;&#xC5C5;&#xB3C4; &#xB123;&#xC744; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;. &#xC774; &#xB355;&#xBD84;&#xC5D0; &#xAE30;&#xC874;&#xC5D0;&#xB294; &#xD560; &#xC218; &#xC5C6;&#xAC70;&#xB098;, &#xBC88;&#xAC70;&#xB85C;&#xC6E0;&#xB358; &#xD0C0;&#xC785; &#xC791;&#xC5C5;&#xC744; &#xD6E8;&#xC52C; &#xAC04;&#xD3B8;&#xD558;&#xAC8C; &#xAD6C;&#xD604;&#xD560; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.</p><h2 id="%EB%A7%88%EB%AC%B4%EB%A6%AC">&#xB9C8;&#xBB34;&#xB9AC;</h2><p>&#x2003;&#xB300;&#xC218;&#xC801; &#xD0C0;&#xC785;&#xC744; &#xD1B5;&#xD55C; &#xC0AC;&#xACE0;&#xBC29;&#xC2DD;&#xACFC; &#xBC29;&#xBC95;&#xC740; &#xBB38;&#xC81C;&#xD574;&#xACB0;&#xC5D0; &#xB3C4;&#xC6C0;&#xC744; &#xC90D;&#xB2C8;&#xB2E4;. &#xD15C;&#xD50C;&#xB9BF; &#xB9AC;&#xD130;&#xB7F4; &#xD0C0;&#xC785;&#xC73C;&#xB85C; &#xAC15;&#xD654;&#xB41C; &#xD0C0;&#xC785;&#xC2A4;&#xD06C;&#xB9BD;&#xD2B8;&#xB97C; &#xC990;&#xACA8;&#xBCF4;&#xC138;&#xC694;!</p>]]></content:encoded></item><item><title><![CDATA[프로젝트 빌드에 대해]]></title><description><![CDATA[프로젝트 빌드란 뭘까요? 번들링과 트랜스파일링, CI/CD 등이 왜 필요한지 이해해봅니다]]></description><link>https://blog.cinntiq.synology.me/build/</link><guid isPermaLink="false">65978393707381000106f80f</guid><category><![CDATA[JavaScript]]></category><category><![CDATA[TypeScript]]></category><category><![CDATA[react]]></category><dc:creator><![CDATA[Hameln]]></dc:creator><pubDate>Mon, 08 Jan 2024 09:06:37 GMT</pubDate><media:content url="https://blog.cinntiq.synology.me/content/images/2024/01/javascript.png" medium="image"/><content:encoded><![CDATA[<img src="https://blog.cinntiq.synology.me/content/images/2024/01/javascript.png" alt="&#xD504;&#xB85C;&#xC81D;&#xD2B8; &#xBE4C;&#xB4DC;&#xC5D0; &#xB300;&#xD574;"><p></p><h3 id="%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EB%B9%8C%EB%93%9C">&#xD504;&#xB85C;&#xC81D;&#xD2B8; &#xBE4C;&#xB4DC;</h3><p>&#x2003;&#xD504;&#xB85C;&#xC81D;&#xD2B8; &#xBE4C;&#xB4DC;&#xB294; &#xBC88;&#xB4E4;&#xB9C1;, &#xD2B8;&#xB79C;&#xC2A4;&#xD30C;&#xC77C;, &#xCD5C;&#xC801;&#xD654; &#xB4F1;&#xC744; &#xD558;&#xB294; &#xACFC;&#xC815;&#xC744; &#xB9D0;&#xD569;&#xB2C8;&#xB2E4;. &#xC65C; &#xC774;&#xB7EC;&#xD55C; &#xACFC;&#xC815;&#xC774; &#xD544;&#xC694;&#xD560;&#xAE4C;&#xC694;? &#xC61B;&#xB0A0; &#xC774;&#xC57C;&#xAE30;&#xB97C; &#xD558;&#xB098; &#xBCF4;&#xC8E0;.</p><figure class="kg-card kg-image-card"><img src="https://blog.cinntiq.synology.me/content/images/2024/01/8Ee8QIaHkeZlLUuZ8X4IqGl9m1zEaH_LKU2KLbReWPDjTs9jVClShdpxgjE1ZNSHkMQfXAAbGckZwE70xCqT8w.webp" class="kg-image" alt="&#xD504;&#xB85C;&#xC81D;&#xD2B8; &#xBE4C;&#xB4DC;&#xC5D0; &#xB300;&#xD574;" loading="lazy" width="540" height="720"></figure><p>&#x2003;&#xB864;&#xB7EC;&#xCF54;&#xC2A4;&#xD130; &#xD0C0;&#xC774;&#xCFE4;2&#xB294; &#xC5B4;&#xC148;&#xBE14;&#xB9AC;&#xC5B4;&#xB85C; &#xAC1C;&#xBC1C;&#xB41C; &#xAC8C;&#xC784;&#xC785;&#xB2C8;&#xB2E4;. &#xC5B4;&#xC148;&#xBE14;&#xB9AC;&#xC5B4;&#xB294; &#xAE30;&#xACC4;&#xC5B4;&#xC5D0; &#xB9E4;&#xC6B0; &#xAC00;&#xAE4C;&#xC6B4; &#xC800;&#xC218;&#xC900; &#xC5B8;&#xC5B4;&#xC785;&#xB2C8;&#xB2E4;. </p><figure class="kg-card kg-image-card"><img src="https://blog.cinntiq.synology.me/content/images/2024/01/Motorola_6800_Assembly_Language.png" class="kg-image" alt="&#xD504;&#xB85C;&#xC81D;&#xD2B8; &#xBE4C;&#xB4DC;&#xC5D0; &#xB300;&#xD574;" loading="lazy" width="800" height="1274" srcset="https://blog.cinntiq.synology.me/content/images/size/w600/2024/01/Motorola_6800_Assembly_Language.png 600w, https://blog.cinntiq.synology.me/content/images/2024/01/Motorola_6800_Assembly_Language.png 800w" sizes="(min-width: 720px) 720px"></figure><p>&#x2003;&#xADF8; &#xC2DC;&#xC808;&#xC5D0;&#xB3C4; &#xC5B4;&#xC148;&#xBE14;&#xB9AC;&#xC5B4;&#xB85C; &#xAC8C;&#xC784;&#xC744; &#xC81C;&#xC791;&#xD558;&#xB294; &#xC77C;&#xC740; &#xB4DC;&#xBB3C;&#xC5C8;&#xC2B5;&#xB2C8;&#xB2E4;. <strong>&#xC131;&#xB2A5;&#xC740; &#xC88B;&#xC9C0;&#xB9CC; &#xC0AC;&#xB78C;&#xC774; &#xC77D;&#xACE0; &#xC4F0;&#xAE30;&#xC5D4; &#xC5B4;&#xB835;&#xAE30; &#xB54C;&#xBB38;&#xC785;&#xB2C8;&#xB2E4;.</strong> &#xB864;&#xB7EC;&#xCF54;&#xC2A4;&#xD130; &#xD0C0;&#xC774;&#xCFE4;2 &#xAC1C;&#xBC1C;&#xC790;&#xAC00; &#xB300;&#xB2E8;&#xD558;&#xB2E4;&#xB294; &#xB9D0;&#xC744; &#xB4E3;&#xB294; &#xC774;&#xC720;&#xC785;&#xB2C8;&#xB2E4;. </p><blockquote>&#x2003;&#xACE0;&#xC218;&#xC900;&#xC77C;&#xC218;&#xB85D; &#xC0AC;&#xB78C;&#xC5D0; &#xCE5C;&#xD654;&#xC801;&#xC774;&#xACE0; &#xC800;&#xC218;&#xC900;&#xC77C;&#xC218;&#xB85D; &#xAE30;&#xACC4; &#xCE5C;&#xD654;&#xC801;&#xC785;&#xB2C8;&#xB2E4;. &#xC989;, <strong>&#xC0AC;&#xB78C;&#xC774; &#xC77D;&#xAE30; &#xC26C;&#xC6B8;&#xC218;&#xB85D; &#xAE30;&#xACC4;&#xB294; &#xC5B4;&#xB824;&#xC6CC;&#xD569;&#xB2C8;&#xB2E4;.</strong> </blockquote><h3 id="%EB%B2%88%EB%93%A4%EB%A7%81">&#xBC88;&#xB4E4;&#xB9C1;</h3><p>&#x2003;&#xC6B0;&#xB9AC;&#xAC00; &#xBCF4;&#xB294; &#xCF54;&#xB4DC;&#xB294; &#xC0AC;&#xB78C; &#xCE5C;&#xD654;&#xC801; &#xCF54;&#xB4DC;&#xC785;&#xB2C8;&#xB2E4;. &#xC758;&#xBBF8;&#xC788;&#xB294; &#xBCC0;&#xC218; &#xC774;&#xB984;, &#xAC00;&#xB3C5;&#xC131;&#xC744; &#xC704;&#xD55C; &#xB744;&#xC5B4;&#xC4F0;&#xAE30;, &#xC138;&#xC138;&#xD55C; &#xD3F4;&#xB354; &#xBD84;&#xB958;, &#xD074;&#xB9B0; &#xCF54;&#xB4DC;...&#xC911;&#xC694;&#xD569;&#xB2C8;&#xB2E4;. &#xD558;&#xC9C0;&#xB9CC; &#xBE0C;&#xB77C;&#xC6B0;&#xC800;&#xD55C;&#xD150; &#xC5B4;&#xB5A8;&#xAE4C;&#xC694;? </p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://blog.cinntiq.synology.me/content/images/2024/01/canvas_-240105_0534.webp" class="kg-image" alt="&#xD504;&#xB85C;&#xC81D;&#xD2B8; &#xBE4C;&#xB4DC;&#xC5D0; &#xB300;&#xD574;" loading="lazy" width="1660" height="1660" srcset="https://blog.cinntiq.synology.me/content/images/size/w600/2024/01/canvas_-240105_0534.webp 600w, https://blog.cinntiq.synology.me/content/images/size/w1000/2024/01/canvas_-240105_0534.webp 1000w, https://blog.cinntiq.synology.me/content/images/size/w1600/2024/01/canvas_-240105_0534.webp 1600w, https://blog.cinntiq.synology.me/content/images/2024/01/canvas_-240105_0534.webp 1660w" sizes="(min-width: 720px) 720px"><figcaption>&#xADF8;&#xB9BC; 1</figcaption></figure><p>&#x2003;&#xBE0C;&#xB77C;&#xC6B0;&#xC800; &#xC785;&#xC7A5;&#xC5D0;&#xC11C; &#xC704; &#xAD6C;&#xC870;&#xB294; &#xADF8;&#xC800; &#xB09C;&#xC7A1;&#xD569;&#xB2C8;&#xB2E4;. &#xC758;&#xC874;&#xC131;&#xC774; &#xC5EC;&#xAE30;&#xC800;&#xAE30; &#xC5EE;&#xC5EC;&#xC788;&#xC5B4; &#xBD88;&#xB7EC;&#xC624;&#xB294; &#xBE44;&#xC6A9;&#xC774; &#xB0AD;&#xBE44;&#xB420; &#xBFD0;&#xC785;&#xB2C8;&#xB2E4;. &#xADF8;&#xB798;&#xC11C; &#xBE0C;&#xB77C;&#xC6B0;&#xC800;&#xAC00; &#xC77D;&#xAE30; &#xD3B8;&#xD558;&#xB3C4;&#xB85D; &#xC7AC;&#xBD84;&#xB958;&#xD558;&#xB294; &#xBC88;&#xB4E4;&#xB9C1; &#xC791;&#xC5C5;&#xC774; &#xD544;&#xC694;&#xD569;&#xB2C8;&#xB2E4;.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://blog.cinntiq.synology.me/content/images/2024/01/canvas_-240105_0537.png" class="kg-image" alt="&#xD504;&#xB85C;&#xC81D;&#xD2B8; &#xBE4C;&#xB4DC;&#xC5D0; &#xB300;&#xD574;" loading="lazy" width="1052" height="972" srcset="https://blog.cinntiq.synology.me/content/images/size/w600/2024/01/canvas_-240105_0537.png 600w, https://blog.cinntiq.synology.me/content/images/size/w1000/2024/01/canvas_-240105_0537.png 1000w, https://blog.cinntiq.synology.me/content/images/2024/01/canvas_-240105_0537.png 1052w" sizes="(min-width: 720px) 720px"><figcaption>&#xADF8;&#xB9BC; 2</figcaption></figure><p>&#x2003;&#xC774;&#xB7F0; &#xAD6C;&#xC870;&#xB294; &#xC5B4;&#xB5A8;&#xAE4C;&#xC694;? &#xCF54;&#xB4DC;&#xB7C9;&#xACFC; &#xBCF5;&#xC7A1;&#xB3C4;&#xAC00; &#xB298;&#xC5B4; &#xAC1C;&#xBC1C;&#xC790;&#xB294; &#xC77D;&#xAE30; &#xC5B4;&#xB835;&#xACA0;&#xC9C0;&#xB9CC; &#xBE0C;&#xB77C;&#xC6B0;&#xC800;&#xC5D0;&#xAC90; &#xD3B8;&#xD569;&#xB2C8;&#xB2E4;.<br>&#x2003;&#xADF8;&#xB9BC; 1&#xC744; &#xADF8;&#xB9BC; 2&#xB85C; &#xC7AC;&#xBD84;&#xB958;&#xD558;&#xB294; &#xC791;&#xC5C5;&#xC774; &#xBC88;&#xB4E4;&#xB9C1;&#xC774;&#xBA70;, &#xC815;&#xB9AC;&#xB41C; &#xACB0;&#xACFC;&#xBB3C; &#xB2E8;&#xC704;&#xB97C; &#xBC88;&#xB4E4;&#xC774;&#xB77C;&#xACE0; &#xBD80;&#xB985;&#xB2C8;&#xB2E4;. <br>&#x2003;<strong>&#xB300;&#xBD80;&#xBD84;&#xC758; &#xBC88;&#xB4E4;&#xB9C1; &#xB3C4;&#xAD6C;&#xB294; &#xBC88;&#xB4E4;&#xB9C1;, &#xCD5C;&#xC801;&#xD654;, &#xACBD;&#xB7C9;&#xD654;, &#xD2B8;&#xB79C;&#xC2A4;&#xD30C;&#xC77C;&#xB9C1;, &#xCF54;&#xB4DC; &#xC2A4;&#xD50C;&#xB9AC;&#xD305; &#xB4F1;&#xC758; &#xC791;&#xC5C5;&#xC744; &#xAC19;&#xC774; &#xC218;&#xD589;</strong>&#xD569;&#xB2C8;&#xB2E4;.</p><h3 id="%EC%BD%94%EB%93%9C-%EC%8A%A4%ED%94%8C%EB%A6%AC%ED%8C%85">&#xCF54;&#xB4DC; &#xC2A4;&#xD50C;&#xB9AC;&#xD305;</h3><p>&#x2003;&#xADF8;&#xB807;&#xB2E4;&#xBA74; &#xBC88;&#xB4E4;&#xC740; &#xBA87; &#xAC1C;&#xB85C; &#xB9CC;&#xB4E4;&#xC5B4;&#xC57C; &#xC88B;&#xC744;&#xAE4C;&#xC694;? &#xC801;&#xC744;&#xC218;&#xB85D; &#xBE0C;&#xB77C;&#xC6B0;&#xC800;&#xAC00; &#xC77D;&#xAE30; &#xC26C;&#xC6B0;&#xB2C8; &#xC544;&#xB798; &#xADF8;&#xB9BC; &#xC624;&#xB978;&#xCABD;&#xCC98;&#xB7FC; &#xD55C; &#xAC1C;&#xBA74; &#xB420;&#xAE4C;&#xC694;? </p><figure class="kg-card kg-image-card"><img src="https://blog.cinntiq.synology.me/content/images/2024/01/canvas_-240108_0832.png" class="kg-image" alt="&#xD504;&#xB85C;&#xC81D;&#xD2B8; &#xBE4C;&#xB4DC;&#xC5D0; &#xB300;&#xD574;" loading="lazy" width="1372" height="924" srcset="https://blog.cinntiq.synology.me/content/images/size/w600/2024/01/canvas_-240108_0832.png 600w, https://blog.cinntiq.synology.me/content/images/size/w1000/2024/01/canvas_-240108_0832.png 1000w, https://blog.cinntiq.synology.me/content/images/2024/01/canvas_-240108_0832.png 1372w" sizes="(min-width: 720px) 720px"></figure><p>&#x2003;&#xBC88;&#xB4E4; &#xC218;&#xAC00; &#xC801;&#xC744;&#xC218;&#xB85D; &#xBC88;&#xB4E4; &#xB2F9; &#xC6A9;&#xB7C9;&#xC740; &#xCEE4;&#xC9D1;&#xB2C8;&#xB2E4;. &#xBE0C;&#xB77C;&#xC6B0;&#xC800;&#xC5D0;&#xAC8C; &#xC788;&#xC5B4; &#xC790;&#xBC14;&#xC2A4;&#xD06C;&#xB9BD;&#xD2B8;&#xB294; &#xB80C;&#xB354;&#xB9C1; &#xBC29;&#xD574; &#xC790;&#xC6D0;&#xC785;&#xB2C8;&#xB2E4;. &#xBC88;&#xB4E4; &#xC6A9;&#xB7C9;&#xC774; &#xD074;&#xC218;&#xB85D; <strong>&#xCD08;&#xAE30; &#xB85C;&#xB529; &#xC18D;&#xB3C4;</strong>&#xB294; &#xB290;&#xB824;&#xC9D1;&#xB2C8;&#xB2E4;. <br>&#x2003;&#xB530;&#xB77C;&#xC11C; <strong>&#xD544;&#xC694;&#xD55C; &#xAC83;&#xC744; &#xD544;&#xC694;&#xD560; &#xB54C;&#xC5D0;</strong> &#xBD88;&#xB7EC;&#xC57C; &#xD6A8;&#xACFC;&#xC801;&#xC785;&#xB2C8;&#xB2E4;. &#xBC88;&#xB4E4;&#xB9C1;&#xC740; &#xD30C;&#xC77C;&#xC744; &#xC904;&#xC774;&#xB418;, &#xC801;&#xC808;&#xD788; &#xC5EC;&#xB7EC; &#xAC1C;&#xB85C; &#xB098;&#xB20C; &#xD544;&#xC694;&#xAC00; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;. <br>&#x2003;&#xC608;&#xB97C; &#xB4E4;&#xBA74; &#xC1FC;&#xD551;&#xBAB0;&#xC5D0;&#xC11C; &quot;&#xAC70;&#xB798; &#xC644;&#xB8CC; &#xD398;&#xC774;&#xC9C0;&quot;&#xC640; &quot;&#xBA54;&#xC778; &#xD398;&#xC774;&#xC9C0;&quot;&#xB294; &#xCF54;&#xB4DC;&#xB97C; &#xAC19;&#xC774; &#xB458; &#xD544;&#xC694; &#xC5C6;&#xC73C;&#xB2C8; &#xB3C5;&#xB9BD;&#xB41C; &#xBC88;&#xB4E4;&#xB85C; &#xB098;&#xB215;&#xB2C8;&#xB2E4;. &#xADF8;&#xB9BC; &#xC67C;&#xCABD;&#xACFC; &#xAC19;&#xC774; &#xBC88;&#xB4E4;&#xC744; &#xC5EC;&#xB7EC; &#xAC1C;&#xB85C; &#xB098;&#xB204;&#xB294; &#xCC98;&#xB9AC;&#xB97C; <strong>&#xCF54;&#xB4DC; &#xC2A4;&#xD50C;&#xB9AC;&#xD305;</strong>&#xC774;&#xB77C;&#xACE0; &#xD569;&#xB2C8;&#xB2E4;.</p><h3 id="%EC%BD%94%EB%93%9C-%EC%8A%A4%ED%94%8C%EB%A6%AC%ED%8C%85-%EB%B0%A9%EB%B2%95">&#xCF54;&#xB4DC; &#xC2A4;&#xD50C;&#xB9AC;&#xD305; &#xBC29;&#xBC95;</h3><p>&#x2003;&#xC790;&#xBC14;&#xC2A4;&#xD06C;&#xB9BD;&#xD2B8; &#xD504;&#xB808;&#xC784;&#xC6CC;&#xD06C;&#xB4E4;&#xC740; &#xC790;&#xB3D9;&#xC73C;&#xB85C; &#xCF54;&#xB4DC; &#xC2A4;&#xD50C;&#xB9AC;&#xD305;&#xC744; &#xD569;&#xB2C8;&#xB2E4;. &#xC608;&#xB97C; &#xB4E4;&#xBA74; Next.js&#xB294; pages &#xD3F4;&#xB354;(14&#xBC84;&#xC804; &#xC774;&#xD6C4;&#xB294; app &#xD3F4;&#xB354;)&#xC5D0; &#xC791;&#xC131;&#xD55C; &#xCF54;&#xB4DC;&#xB4E4;&#xC744; &#xC790;&#xB3D9;&#xC73C;&#xB85C; &#xC2A4;&#xD50C;&#xB9AC;&#xD305;&#xD569;&#xB2C8;&#xB2E4;. pages&#xC758; &#xD30C;&#xC77C;&#xB4E4;&#xC740; &#xAC01;&#xAC01;&#xC758; URI&#xB85C; &#xB77C;&#xC6B0;&#xD305;&#xB418;&#xAE30; &#xB54C;&#xBB38;&#xC5D0; &#xAC19;&#xC740; &#xBC88;&#xB4E4;&#xC5D0; &#xBB36;&#xC744; &#xD544;&#xC694;&#xAC00; &#xC5C6;&#xAE30; &#xB54C;&#xBB38;&#xC785;&#xB2C8;&#xB2E4;. <br>&#x2003;&#xC704;&#xC5D0; &#xB4E0; &#xC608;&#xC2DC;&#xCC98;&#xB7FC; &#xAC70;&#xB798; &#xC644;&#xB8CC; &#xD398;&#xC774;&#xC9C0;&#xC640; &#xBA54;&#xC778; &#xD398;&#xC774;&#xC9C0;&#xB294; &#xC11C;&#xB85C; &#xB3C5;&#xB9BD;&#xC801;&#xC778; &#xD398;&#xC774;&#xC9C0;&#xC774;&#xBBC0;&#xB85C; &#xCF54;&#xB4DC; &#xC2A4;&#xD50C;&#xB9AC;&#xD305;&#xC744; &#xC790;&#xB3D9; &#xCC98;&#xB9AC;&#xD574;&#xC8FC;&#xB294; &#xAC8C; &#xB354; &#xD3B8;&#xB9AC;&#xD569;&#xB2C8;&#xB2E4;.<br>&#x2003;&#xCF54;&#xB4DC; &#xC2A4;&#xD50C;&#xB9AC;&#xD305;&#xC740; &#xC218;&#xB3D9;&#xC73C;&#xB85C; &#xC9C0;&#xC815;&#xD560; &#xC218;&#xB3C4; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;. &#xC608;&#xB97C; &#xB4E4;&#xBA74; <strong>&#xB3D9;&#xC801; import</strong>&#xB294; &#xCF54;&#xB4DC; &#xC2A4;&#xD50C;&#xB9AC;&#xD305; &#xB300;&#xC0C1;&#xC785;&#xB2C8;&#xB2E4;.<br>&#x2003;&#xB610;&#xD55C; &#xD130;&#xBBF8;&#xB110;&#xC5D0;&#xC11C; Next.js &#xCF54;&#xB4DC;&#xB97C; &#xC2E4;&#xD589;&#xD558;&#xBA74; &#xCF54;&#xB4DC; &#xC2A4;&#xD50C;&#xB9AC;&#xD305;&#xC744; &#xBCFC; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.</p><pre><code class="language-text">- ready started server on 0.0.0.0:3000, url: http://localhost:3000
- info Loaded env from /Users/projects/beermap-client/.env.development
- info Disabled SWC as replacement for Babel because of custom Babel configuration &quot;.babelrc.json&quot; https://nextjs.org/docs/messages/swc-disabled
- event compiled client and server successfully in 2.5s (26 modules)
- wait compiling...
- event compiled client and server successfully in 857 ms (20 modules)
- wait compiling /page (client and server)...
- info Using external babel configuration from /Users/projects/beermap-client/.babelrc.json
- event compiled client and server successfully in 11.7s (494 modules)</code></pre><ul><li>&#xB85C;&#xCEEC; url&#xB85C; &#xC11C;&#xBC84;&#xAC00; &#xC5F4;&#xB9AC;&#xACE0; 3000&#xBC88; &#xD3EC;&#xD2B8;&#xB85C; &#xC218;&#xC2E0;&#xD569;&#xB2C8;&#xB2E4;.</li><li>.env.development&#xC5D0;&#xC11C; &#xAC1C;&#xBC1C; &#xD658;&#xACBD; &#xBCC0;&#xC218;&#xB97C; &#xC77D;&#xC5B4;&#xC635;&#xB2C8;&#xB2E4;.</li><li>.babelrc.json &#xD30C;&#xC77C;&#xC774; &#xC788;&#xC73C;&#xBBC0;&#xB85C; &#xAE30;&#xBCF8; SWC &#xB300;&#xC2E0; &#xBC14;&#xBCA8;&#xB85C; &#xCEF4;&#xD30C;&#xC77C;&#xD569;&#xB2C8;&#xB2E4;.</li><li>&#xBC88;&#xB4E4;&#xC774; &#xBCF5;&#xC218;&#xC774;&#xBBC0;&#xB85C; &#xC5EC;&#xB7EC; &#xCC28;&#xB840;&#xC5D0; &#xB098;&#xB220; &#xCEF4;&#xD30C;&#xC77C;&#xC744; &#xC218;&#xD589;&#xD569;&#xB2C8;&#xB2E4;. &#xC774; &#xB54C; &#xC791;&#xC5C5;&#xC5D0; &#xC5F0;&#xAD00;&#xB418;&#xB294; &#xBAA8;&#xB4C8;&#xC758; &#xC218;&#xB294; &#xC81C;&#xAC01;&#xAC01;&#xC774;&#xBA70; &#xC791;&#xC5C5; &#xC2DC;&#xAC04;&#xB3C4; &#xAC01;&#xC790; &#xB2E4;&#xB985;&#xB2C8;&#xB2E4;. (&#xCF54;&#xB4DC; &#xC2A4;&#xD50C;&#xB9AC;&#xD305;)</li></ul><h3 id="%ED%8A%B8%EB%9E%9C%EC%8A%A4%ED%8C%8C%EC%9D%BC%EB%A7%81">&#xD2B8;&#xB79C;&#xC2A4;&#xD30C;&#xC77C;&#xB9C1;</h3><p>&#x2003;&#xBE0C;&#xB77C;&#xC6B0;&#xC800;&#xB294; &#xD0C0;&#xC785;&#xC2A4;&#xD06C;&#xB9BD;&#xD2B8;&#xB098; &#xB9AC;&#xC561;&#xD2B8;&#xAC00; &#xC544;&#xB2CC;, &#xC624;&#xB85C;&#xC9C0; HTML, CSS, JS&#xB9CC; &#xC2E4;&#xD589;&#xD558;&#xBBC0;&#xB85C; &#xD504;&#xB808;&#xC784;&#xC6CC;&#xD06C;, &#xB77C;&#xC774;&#xBE0C;&#xB7EC;&#xB9AC;&#xB85C; &#xB9CC;&#xB4E0; &#xCF54;&#xB4DC;&#xB294; HTML, CSS, JS&#xB85C; &#xD30C;&#xC77C; &#xBCC0;&#xD658;&#xD574;&#xC57C; &#xD569;&#xB2C8;&#xB2E4;. &#xC774;&#xAC83;&#xC774; <strong>&#xD2B8;&#xB79C;&#xC2A4;&#xD30C;&#xC77C;&#xB9C1;</strong>&#xC785;&#xB2C8;&#xB2E4;. &#xBCF4;&#xD1B5;&#xC740; &#xBE4C;&#xB4DC; &#xB54C; &#xBC88;&#xB4E4;&#xB9C1;&#xACFC; &#xD2B8;&#xB79C;&#xC2A4;&#xD30C;&#xC77C;&#xB9C1;&#xC774; &#xAC19;&#xC774; &#xCC98;&#xB9AC;&#xB429;&#xB2C8;&#xB2E4;.<br>&#x2003;&#xCD5C;&#xC2E0; &#xBB38;&#xBC95;&#xC740; &#xBE0C;&#xB77C;&#xC6B0;&#xC800;&#xB9C8;&#xB2E4; &#xC9C0;&#xC6D0; &#xD604;&#xD669;&#xC774; &#xB2E4;&#xB974;&#xAE30; &#xB54C;&#xBB38;&#xC5D0; &#xBAA8;&#xB450;&#xC640; &#xD638;&#xD658;&#xB418;&#xB294; &#xC774;&#xC804; &#xBC84;&#xC804;&#xC758; &#xBB38;&#xBC95;&#xC73C;&#xB85C; &#xBCC0;&#xD658;&#xD560;(&#xD544;&#xC694;&#xD558;&#xB2E4;&#xBA74; &#xD3F4;&#xB9AC;&#xD544;&#xC744; &#xB9CC;&#xB4E4;) &#xD544;&#xC694;&#xB3C4; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;. &#xC774;&#xB7EC;&#xD55C; &#xAC83;&#xB3C4; &#xD2B8;&#xB79C;&#xC2A4;&#xD30C;&#xC77C;&#xB9C1; &#xACFC;&#xC815;&#xC5D0;&#xC11C; &#xC218;&#xD589;&#xB429;&#xB2C8;&#xB2E4;.</p><h3 id="%ED%83%80%EC%9E%85%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EC%9D%98-%ED%8A%B8%EB%9E%9C%EC%8A%A4%ED%8C%8C%EC%9D%BC%EB%A7%81">&#xD0C0;&#xC785;&#xC2A4;&#xD06C;&#xB9BD;&#xD2B8;&#xC758; &#xD2B8;&#xB79C;&#xC2A4;&#xD30C;&#xC77C;&#xB9C1;</h3><p>&#x2003;tsconfig &#xD30C;&#xC77C;&#xC5D0;&#xC120; &#xCEF4;&#xD30C;&#xC77C; &#xC635;&#xC158;&#xC744; &#xC9C0;&#xC815;&#xD560; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;. &#xC774; &#xB54C; &#xCEF4;&#xD30C;&#xC77C;&#xC740; &#xD0C0;&#xC785;&#xC2A4;&#xD06C;&#xB9BD;&#xD2B8;&#xB97C; &#xC790;&#xBC14;&#xC2A4;&#xD06C;&#xB9BD;&#xD2B8;&#xB85C; &#xBC14;&#xAFB8;&#xB294; &#xD2B8;&#xB79C;&#xC2A4;&#xD30C;&#xC77C;&#xB9C1;&#xC785;&#xB2C8;&#xB2E4;.</p><pre><code class="language-javascript">&quot;compilerOptions&quot;: {
    &quot;target&quot;: &quot;es2016&quot;, // &#xACB0;&#xACFC;&#xBB3C;&#xB85C; &#xB9CC;&#xB4E4; &#xC790;&#xBC14;&#xC2A4;&#xD06C;&#xB9BD;&#xD2B8;&#xC758; ECMAScript &#xBC84;&#xC804;.
    &quot;module&quot;: &quot;CommonJS&quot;, // &#xBAA8;&#xB4C8; &#xC2DC;&#xC2A4;&#xD15C; &#xC9C0;&#xC815;.
    &quot;strict&quot;: true, // &#xBAA8;&#xB4E0; &#xD0C0;&#xC785; &#xCCB4;&#xD0B9; &#xC635;&#xC158; &#xD65C;&#xC131;&#xD654;.
    &quot;esModuleInterop&quot;: true, // ESM&#xACFC;&#xC758; &#xD638;&#xD658;&#xC131;&#xC744; &#xB192;&#xC774;&#xB294; &#xC635;&#xC158;. CommonJS &#xBAA8;&#xB4C8;&#xC744; ESM&#xCC98;&#xB7FC; &#xC0AC;&#xC6A9; &#xAC00;&#xB2A5;&#xD569;&#xB2C8;&#xB2E4;.
    &quot;forceConsistentCasingInFileNames&quot;: true, // &#xD30C;&#xC77C;&#xBA85;&#xC758; &#xB300;&#xC18C;&#xBB38;&#xC790;&#xAC00; &#xC77C;&#xCE58;&#xD558;&#xC9C0; &#xC54A;&#xC73C;&#xBA74; &#xC624;&#xB958;&#xB97C; &#xBC1C;&#xC0DD;&#xC2DC;&#xD0B5;&#xB2C8;&#xB2E4;.
    &quot;outDir&quot;: &quot;dist&quot;, // &#xCEF4;&#xD30C;&#xC77C; &#xACB0;&#xACFC;&#xBB3C; &#xC800;&#xC7A5; &#xD3F4;&#xB354;. dist&#xB294; distribution(&#xBC30;&#xD3EC;)&#xC758; &#xC904;&#xC784;&#xB9D0;&#xC785;&#xB2C8;&#xB2E4;. 
    &quot;declaration&quot;: true, // &#xCEF4;&#xD30C;&#xC77C; &#xD6C4; d.ts(&#xD0C0;&#xC785; &#xC815;&#xBCF4;&#xB97C; &#xB2F4;&#xC740; &#xD30C;&#xC77C;)&#xC744; &#xC0DD;&#xC131;&#xD569;&#xB2C8;&#xB2E4;. 
    &quot;declarationDir&quot;: &quot;types&quot;, // d.ts&#xB97C; &#xC800;&#xC7A5;&#xD560; &#xD3F4;&#xB354; &#xC774;&#xB984;.
    &quot;rootDir&quot;: &quot;.&quot; 
}
</code></pre><p>&#x2003;&#xBCF4;&#xD1B5; dist&#xD3F4;&#xB354;&#xC5D0; &#xCEF4;&#xD30C;&#xC77C; &#xACB0;&#xACFC;&#xB97C; &#xC800;&#xC7A5;&#xD569;&#xB2C8;&#xB2E4;. &#xB9CC;&#xC57D; &#xC704; &#xC635;&#xC158;&#xC744; &#xAC00;&#xC9C0;&#xACE0; <code>npx tsc</code>&#xB97C; &#xC2E4;&#xD589;&#xD558;&#xBA74; dist &#xD3F4;&#xB354;&#xC640; types &#xD3F4;&#xB354;&#xAC00; &#xC0DD;&#xC131;&#xB429;&#xB2C8;&#xB2E4;. <br>&#x2003;&#xAC1C;&#xBC1C;&#xC790;&#xB294; &#xD0C0;&#xC785;&#xC2A4;&#xD06C;&#xB9BD;&#xD2B8;&#xB85C; &#xAC1C;&#xBC1C;&#xD558;&#xACE0;, &#xBE0C;&#xB77C;&#xC6B0;&#xC800;&#xB294; &#xBC30;&#xD3EC; &#xD30C;&#xC77C;&#xC758; dist&#xC5D0;&#xC11C; &#xC790;&#xBC14;&#xC2A4;&#xD06C;&#xB9BD;&#xD2B8;&#xB97C; &#xC0AC;&#xC6A9;&#xD569;&#xB2C8;&#xB2E4;. &#xAC1C;&#xBC1C;&#xD560; &#xB550; dist&#xB77C;&#xB294; &#xD3F4;&#xB354;&#xC5D0;&#xC11C; import&#xD55C; &#xAC8C; &#xC5C6;&#xC73C;&#xBBC0;&#xB85C; package.json&#xC5D0;&#xC11C; &#xC2E4;&#xD589; &#xD30C;&#xC77C;&#xC744; &#xC9C0;&#xC815;&#xD569;&#xB2C8;&#xB2E4;.</p><pre><code class="language-javascript">// package.json
{
  &quot;name&quot;: &quot;project&quot;,
  &quot;version&quot;: &quot;1.0.0&quot;,
  &quot;main&quot;: &quot;dist/index.js&quot;,
  &quot;types&quot;: &quot;types/index.d.ts&quot;
}</code></pre><h3 id="%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EC%9D%98-%ED%8A%B8%EB%9E%9C%EC%8A%A4%ED%8C%8C%EC%9D%BC%EB%A7%81">&#xC790;&#xBC14;&#xC2A4;&#xD06C;&#xB9BD;&#xD2B8;&#xC758; &#xD2B8;&#xB79C;&#xC2A4;&#xD30C;&#xC77C;&#xB9C1;</h3><p>&#x2003;&#xD0C0;&#xC785;&#xC2A4;&#xD06C;&#xB9BD;&#xD2B8; -&gt; &#xC790;&#xBC14;&#xC2A4;&#xD06C;&#xB9BD;&#xD2B8; &#xCEF4;&#xD30C;&#xC77C;&#xC740; &#xD3C9;&#xBC94;&#xD55C; &#xC790;&#xBC14;&#xC2A4;&#xD06C;&#xB9BD;&#xD2B8;&#xB85C; &#xBC14;&#xAFB8;&#xC9C0; &#xC54A;&#xC2B5;&#xB2C8;&#xB2E4;. &#xC608;&#xB97C; &#xB4E4;&#xBA74; &#xC544;&#xB798; &#xCF54;&#xB4DC;&#xB294; &#xCF54;&#xB4DC;&#xB294; &#xC0AC;&#xB78C;&#xC774; &#xC77D;&#xAE30; &#xC26C;&#xC6B4; &#xC790;&#xBC14;&#xC2A4;&#xD06C;&#xB9BD;&#xD2B8;&#xC785;&#xB2C8;&#xB2E4;.</p><pre><code class="language-javascript">window.addEventListener(&quot;DOMContentLoaded&quot;, Selection);
window.addEventListener(&quot;load&quot;, () =&gt; {
  const settingButton = document.querySelector(&quot;.mode__setting&quot;);
  const themeButton = document.querySelector(&quot;.mode__theme&quot;);
  const muteButton = document.querySelector(&quot;.mode__mute&quot;);</code></pre><p>&#x2003;&#xC774;&#xB300;&#xB85C; &#xBC30;&#xD3EC;&#xD560; &#xACBD;&#xC6B0; &#xB2E4;&#xB978; &#xC0AC;&#xB78C;&#xB3C4; &#xC77D;&#xAE30; &#xC27D;&#xACE0;, &#xBCF4;&#xC548;&#xC5D0; &#xCDE8;&#xC57D;&#xD574;&#xC9D1;&#xB2C8;&#xB2E4;. &#xB610;&#xD55C; &#xC0AC;&#xB78C;&#xC774; &#xC77D;&#xAE30; &#xD3B8;&#xD55C; &#xAD6C;&#xC870;&#xC774;&#xBBC0;&#xB85C; &#xBE0C;&#xB77C;&#xC6B0;&#xC800;&#xAC00; &#xC77D;&#xAE30;&#xC5D4; &#xBD88;&#xD3B8;&#xD569;&#xB2C8;&#xB2E4;. &#xADF8;&#xB798;&#xC11C; &#xC2E4;&#xC81C; &#xD2B8;&#xB79C;&#xC2A4;&#xD30C;&#xC77C;&#xB9C1;&#xC744; &#xD558;&#xBA74; &#xC544;&#xB798;&#xC640; &#xAC19;&#xC774; &#xBCC0;&#xD658;&#xB429;&#xB2C8;&#xB2E4;.</p><pre><code class="language-javascript">(()=&gt;{&quot;use strict&quot;;var t,e,n=function(t){t.classList.add(&quot;focus&quot;),t.focus()},r=function(t){t.classList.remove(&quot;focus&quot;),t.blur()},o=document.getElementById(&quot;project&quot;),i=(t=o,e=window.innerHeight,t.offsetTop-(e-t.offsetHeight)/2);const a=function(t,e){switch(t){case&quot;about&quot;:scrollTo(0,0);break;case&quot;project&quot;:scrollTo(0,i),e&amp;&amp;function(t){n(t.querySelector(&quot;.focusable&quot;))}(o)}};function c(t){return function(e){for(var n=arguments.length,r=new Array(n&gt;1?n-1:0),o=1;o&lt;n;o++)r[o-1]=arguments[o];t.addEventListener(&quot;click&quot;,(function(t){t.preventDefault(),e.apply(void 0,r)})),t.addEventListener(&quot;keydown&quot;,(function(t){&quot;Enter&quot;===t.key&amp;&amp;(t.preventDefault(),e.apply(void 0,r))}))}}var s=!0,u=function(t){f(t),t.muted=s}</code></pre><p>&#x2003;&#xBE0C;&#xB77C;&#xC6B0;&#xC800;&#xAC00; &#xC77D;&#xB294; &#xAC83;&#xC5D0;&#xB9CC; &#xC9D1;&#xC911;&#xD558;&#xAE30; &#xB54C;&#xBB38;&#xC5D0; &#xAC1C;&#xBC1C;&#xC790;&#xAC00; &#xC77D;&#xAE30; &#xC5B4;&#xB835;&#xC2B5;&#xB2C8;&#xB2E4;. &#xB744;&#xC5B4;&#xC4F0;&#xAE30;&#xB3C4; &#xC5C6;&#xACE0; &#xBCC0;&#xC218;&#xBA85;&#xB3C4; &#xCD95;&#xC18C;, &#xB09C;&#xC218;&#xD654;&#xD558;&#xBA70; ECMAScript &#xBB38;&#xBC95;&#xB3C4; &#xAC1C;&#xBC1C;&#xC790;&#xAC00; &#xC124;&#xC815;&#xD55C; &#xBC84;&#xC804;&#xC5D0; &#xB9DE;&#xCDB0; &#xBC14;&#xAFC9;&#xB2C8;&#xB2E4;.</p><h3 id="%EB%B2%88%EB%93%A4%EB%A7%81-%EB%8F%84%EA%B5%AC">&#xBC88;&#xB4E4;&#xB9C1; &#xB3C4;&#xAD6C;</h3><p>&#x2003;&#xD754;&#xD788; <strong>&#xC6F9;&#xD329;</strong>&#xC774; &#xC4F0;&#xC600;&#xC2B5;&#xB2C8;&#xB2E4;&#xB9CC; &#xADFC;&#xB798;&#xC5D0; <strong>Vite</strong>&#xAC00; &#xC8FC;&#xBAA9;&#xC744; &#xBC1B;&#xC2B5;&#xB2C8;&#xB2E4;. &#xBE4C;&#xB4DC; &#xC18D;&#xB3C4;&#xAC00; &#xC6F9;&#xD329;&#xBCF4;&#xB2E4; &#xC555;&#xB3C4;&#xC801;&#xC73C;&#xB85C; &#xBE60;&#xB974;&#xAE30; &#xB54C;&#xBB38;&#xC5D0; &#xAC1C;&#xBC1C; &#xBE44;&#xC6A9;&#xC744; &#xC720;&#xC758;&#xBBF8;&#xD558;&#xAC8C; &#xAC1C;&#xC120;&#xD558;&#xAE30; &#xB54C;&#xBB38;&#xC785;&#xB2C8;&#xB2E4;. &#xACB0;&#xACFC;&#xBB3C;&#xC774; &#xBE44;&#xC2B7;&#xD558;&#xB2E4;&#xBA74; &#xD6E8;&#xC52C; &#xBE60;&#xB978; &#xCABD;&#xC744; &#xC4F0;&#xB294; &#xAC8C; &#xC774;&#xB4DD;&#xC774;&#xB2C8;&#xAE4C;&#xC694;.</p><h3 id="cicd">CI/CD</h3><p>&#x2003;&#xBE4C;&#xB4DC;&#xC5D0; &#xB300;&#xD574; &#xAC04;&#xB7B5;&#xD558;&#xAC8C; &#xC0B4;&#xD3B4;&#xBD24;&#xC73C;&#xB2C8; CI/CD&#xB3C4; &#xC0B4;&#xD3B4;&#xBCF4;&#xACA0;&#xC2B5;&#xB2C8;&#xB2E4;. <br>&#x2003;CI/CD&#xB294; &#xC5F0;&#xC18D;&#xB418;&#xB294; &#xD1B5;&#xD569;/&#xC5F0;&#xC18D;&#xB418;&#xB294; &#xBC30;&#xD3EC;(Continuous Integration/Continuous Deployment)&#xB77C;&#xB294; &#xB2E8;&#xC5B4;&#xC785;&#xB2C8;&#xB2E4;. <br>&#x2003;&#xBA3C; &#xC61B;&#xB0A0;&#xC5D0;&#xB294; <strong>&#xBCC0;&#xACBD; &#xC0AC;&#xD56D;&#xC774; &#xC77C;&#xC5B4;&#xB0A0; &#xB54C;&#xB9C8;&#xB2E4; &#xAC1C;&#xBC1C;&#xC790;&#xAC00; &#xC9C1;&#xC811; &#xBE4C;&#xB4DC;, &#xD14C;&#xC2A4;&#xD2B8;, &#xBC30;&#xD3EC;</strong>&#xD588;&#xC2B5;&#xB2C8;&#xB2E4;. &#xBC30;&#xD3EC; &#xC911;&#xC5D0; &#xC624;&#xB958;&#xB77C;&#xB3C4; &#xB098;&#xBA74; &#xC11C;&#xBE44;&#xC2A4;&#xB97C; &#xC815;&#xC9C0;&#xD558;&#xACE0; &#xB864;&#xBC31;&#xD574;&#xC57C; &#xD558;&#xB294; &#xC218;&#xB3C4; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;. &#xC774;&#xB294; &#xC11C;&#xBE44;&#xC2A4; &#xACF5;&#xAE09;&#xC790;&#xC640; &#xC18C;&#xBE44;&#xC790; &#xBAA8;&#xB450;&#xC758; &#xC0AC;&#xC6A9; &#xACBD;&#xD5D8;&#xC744; &#xC800;&#xD558;&#xC2DC;&#xCF30;&#xC2B5;&#xB2C8;&#xB2E4;.<br>&#x2003;CI/CD&#xB294; &#xBCC0;&#xACBD; &#xC0AC;&#xD56D;&#xC744; &#xD1B5;&#xD569;/&#xBC30;&#xD3EC;&#xD558;&#xB294; &#xACFC;&#xC815;&#xC5D0;&#xC11C; &#xC11C;&#xBE44;&#xC2A4; &#xC81C;&#xACF5;&#xC774; &#xC5F0;&#xC18D;&#xC801;&#xC774;&#xB780; &#xC598;&#xAE30;&#xC785;&#xB2C8;&#xB2E4;. &#xC131;&#xACF5;&#xD558;&#xBA74; &#xBC30;&#xD3EC;&#xD558;&#xACE0;, &#xC2E4;&#xD328;&#xD558;&#xBA74; &#xAE30;&#xC874; &#xBC84;&#xC804;&#xC73C;&#xB85C; &#xC720;&#xC9C0;&#xD569;&#xB2C8;&#xB2E4;. &#xAC1C;&#xBC1C;&#xC790;&#xB294; &#xC2E4;&#xD328;&#xC5D0; &#xB300;&#xD55C; &#xBC30;&#xD3EC; &#xB9AC;&#xC2A4;&#xD06C;&#xB97C; &#xC9C0;&#xC9C0; &#xC54A;&#xC544;&#xB3C4; &#xB429;&#xB2C8;&#xB2E4;.<br>&#x2003;&#xC774;&#xB7EC;&#xD55C; CI/CD&#xB294; &#xB3C4;&#xAD6C;&#xB97C; &#xD1B5;&#xD574; &#xC124;&#xC815;&#xACFC; &#xD30C;&#xC774;&#xD504;&#xB77C;&#xC778;&#xC744; &#xB9CC;&#xB4E4;&#xAE30;&#xB9CC; &#xD558;&#xBA74; &#xB429;&#xB2C8;&#xB2E4;. &#xBCC0;&#xACBD; &#xC0AC;&#xD56D;&#xC744; &#xB4F1;&#xB85D;&#xD558;&#xBA74; &#xC790;&#xB3D9;&#xC73C;&#xB85C; &#xBE4C;&#xB4DC;, &#xD14C;&#xC2A4;&#xD2B8;, &#xBC30;&#xD3EC;, &#xC5D0;&#xB7EC; &#xCC98;&#xB9AC;&#xB97C; &#xD558;&#xAE30; &#xB54C;&#xBB38;&#xC5D0; &#xAC1C;&#xBC1C;&#xC790;&#xAC00; &#xC218;&#xB3D9;&#xC73C;&#xB85C; &#xCC98;&#xB9AC;&#xD558;&#xB358; &#xBE44;&#xC6A9;&#xC774; &#xD68D;&#xAE30;&#xC801;&#xC73C;&#xB85C; &#xAC10;&#xCD95;&#xB429;&#xB2C8;&#xB2E4;.</p><pre><code class="language-yaml">name: Node.js CI

on:
  push:
    branches: [&quot;main&quot;, &quot;develop&quot;]
  pull_request:
    branches: [&quot;main&quot;, &quot;develop&quot;]

jobs:
  build-and-test:
    runs-on: ${{ matrix.os }}

    strategy:
      matrix:
        node-version: [18.x]
        os: [ubuntu-latest, windows-latest, macOS-latest]

    steps:
      - uses: actions/checkout@v3
        with:
          fetch-depth: 0
      - uses: actions/cache@v3
        id: npm-cache
        with:
          path: ~/.npm
          key: ${{ runner.os }}-node-${{ hashFiles(&apos;**/package-lock.json&apos;) }}
      - if: steps.npm-cache.outputs.cache-hit == &apos;true&apos;
        run: echo &apos;npm cache hit!&apos;
      - if: steps.npm-cache.outputs.cache-hit != &apos;true&apos;
        run: echo &apos;npm cache missed!&apos;
      - name: Use Node.js ${{ matrix.node-version }}
        uses: actions/setup-node@v3
        with:
          node-version: ${{ matrix.node-version }}
          cache: &quot;npm&quot;
      - name: Update NPM
        run: npm install -g npm@latest
      - run: npm ci
      - run: npm run build --if-present
      - run: npm run test:ci
      - name: Publish to Chromatic
        uses: chromaui/action-next@v1
        with:
          projectToken: ${{ secrets.CHROMATIC_PROJECT_TOKEN }}</code></pre><p>&#x2003;&#xC704;&#xC640; &#xAC19;&#xC740; yaml &#xD30C;&#xC77C;&#xC744; &#xD504;&#xB85C;&#xC81D;&#xD2B8;&#xC5D0; &#xC124;&#xC815;&#xD558;&#xACE0; &#xC791;&#xC5C5; &#xBCC0;&#xACBD;&#xC744; &#xC2DC;&#xD589;&#xD558;&#xBA74; &#xBC84;&#xC804; &#xAD00;&#xB9AC; &#xB3C4;&#xAD6C;&#xB294; &#xC8FC;&#xC5B4;&#xC9C4; &#xD658;&#xACBD;&#xC5D0; &#xB9DE;&#xCDB0;&#xC11C; &#xBE4C;&#xB4DC;, &#xD14C;&#xC2A4;&#xD2B8;&#xD55C; &#xB2E4;&#xC74C;&#xC5D0; &#xBAA8;&#xB450; &#xC131;&#xACF5;&#xD560; &#xB54C;&#xC5D0;&#xB9CC; &#xBCC0;&#xACBD; &#xC0AC;&#xD56D;&#xC744; &#xC11C;&#xBE44;&#xC2A4;&#xC5D0; &#xC801;&#xC6A9;&#xD569;&#xB2C8;&#xB2E4;. <br>&#x2003;&#xC704; &#xC608;&#xC81C;&#xB294; GitHub Actions&#xC758; CI &#xC124;&#xC815;&#xC785;&#xB2C8;&#xB2E4;. &#xBC30;&#xD3EC;&#xB294; Vercel&#xB85C; &#xD588;&#xAE30; &#xB54C;&#xBB38;&#xC5D0; CD &#xC124;&#xC815;&#xC740; Vercel&#xC5D0;&#xC11C; &#xD560; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;. </p><h3 id="%EA%B2%B0%EB%A1%A0">&#xACB0;&#xB860;</h3><p>&#x2003;&#xC77C;&#xBC18;&#xC801;&#xC778; &#xAC1C;&#xBC1C;&#xC790;&#xAC00; &#xD68C;&#xC0AC;&#xC5D0; &#xB4E4;&#xC5B4;&#xAC00;&#xC11C; CI/CD &#xD30C;&#xC774;&#xD504;&#xB77C;&#xC778; &#xC870;&#xC815;, &#xBE4C;&#xB4DC;, &#xD2B8;&#xB79C;&#xC2A4;&#xD30C;&#xC77C;&#xB9C1; &#xB4F1;&#xC5D0; &#xB300;&#xD574; &#xC791;&#xC5C5;&#xD560; &#xC77C;&#xC740; &#xBCC4;&#xB85C; &#xC5C6;&#xACA0;&#xC2B5;&#xB2C8;&#xB2E4;&#xB9CC;, &#xC800;&#xCC98;&#xB7FC; &#xC0AC;&#xC774;&#xB4DC; &#xD504;&#xB85C;&#xC81D;&#xD2B8;&#xB098; &#xAC1C;&#xC778; &#xD504;&#xB85C;&#xC81D;&#xD2B8;&#xB97C; &#xC9C4;&#xD589;&#xD560; &#xB550; &#xAE30;&#xBCF8;&#xC801;&#xC778; &#xB0B4;&#xC6A9; &#xC815;&#xB3C4;&#xB294; &#xC54C;&#xACE0; &#xD55C;&#xB2E4;&#xBA74; &#xC88B;&#xC2B5;&#xB2C8;&#xB2E4;.</p><h3 id="%EC%B0%B8%EC%A1%B0">&#xCC38;&#xC870;</h3><ul><li><a href="https://toss.tech/article/commonjs-esm-exports-field?ref=blog.cinntiq.synology.me">&#xC7A5;&#xD638;&#xC2B9;(2022.10). CommonJS&#xC640; ESM&#xC5D0; &#xBAA8;&#xB450; &#xB300;&#xC751;&#xD558;&#xB294; &#xB77C;&#xC774;&#xBE0C;&#xB7EC;&#xB9AC; &#xAC1C;&#xBC1C;&#xD558;&#xAE30;: exports field. toss tech</a></li><li><a href="https://dev.to/iggredible/what-the-heck-are-cjs-amd-umd-and-esm-ikm?ref=blog.cinntiq.synology.me">Igor Irianto(2019.07). What the heck are CJS, AMD, UMD, and ESM in Javascript?</a></li></ul>]]></content:encoded></item><item><title><![CDATA[클래스]]></title><description><![CDATA[클래스와 프로토타입에 대해 이해합니다]]></description><link>https://blog.cinntiq.synology.me/class/</link><guid isPermaLink="false">6554998c9122eb0001cfb679</guid><category><![CDATA[JavaScript]]></category><dc:creator><![CDATA[Hameln]]></dc:creator><pubDate>Fri, 05 Jan 2024 03:47:52 GMT</pubDate><media:content url="https://blog.cinntiq.synology.me/content/images/2024/01/javascript-1.png" medium="image"/><content:encoded><![CDATA[<h2 id="%EB%AA%A9%ED%91%9C">&#xBAA9;&#xD45C;</h2><blockquote>&#x2003;&#xD504;&#xB85C;&#xD1A0;&#xD0C0;&#xC785;&#xACFC; &#xD074;&#xB798;&#xC2A4;&#xB97C; &#xC774;&#xD574;&#xD569;&#xB2C8;&#xB2E4;.</blockquote><h3 id="%ED%94%84%EB%A1%9C%ED%86%A0%ED%83%80%EC%9E%85">&#xD504;&#xB85C;&#xD1A0;&#xD0C0;&#xC785;</h3><img src="https://blog.cinntiq.synology.me/content/images/2024/01/javascript-1.png" alt="&#xD074;&#xB798;&#xC2A4;"><p>&#x2003;&#xAC1D;&#xCCB4; &#xC9C0;&#xD5A5;&#xC740; &#xD074;&#xB798;&#xC2A4; &#xC0C1;&#xC18D;&#xC744; &#xC774;&#xC6A9;&#xD569;&#xB2C8;&#xB2E4;. &#xC790;&#xBC14;&#xC2A4;&#xD06C;&#xB9BD;&#xD2B8;&#xB3C4; &#xBE44;&#xC2B7;&#xD569;&#xB2C8;&#xB2E4;. &#xB2E4;&#xB9CC; &#xD504;&#xB85C;&#xD1A0;&#xD0C0;&#xC785;&#xC774;&#xB780; &#xBC29;&#xC2DD;&#xC73C;&#xB85C; &#xB0B4;&#xBD80;&#xC801; &#xAD6C;&#xD604;&#xC744; &#xD569;&#xB2C8;&#xB2E4;.</p><pre><code class="language-javascript">const arr = [1,2,3];
arr.map((num) =&gt; console.log(num));</code></pre><p>&#x2003;<code>.</code>&#xC740; &#xAC1D;&#xCCB4;&#xC758; &#xC18D;&#xC131;&#xACFC; &#xBA54;&#xC18C;&#xB4DC;&#xB97C; &#xCC38;&#xC870;&#xD558;&#xB294; &#xBB38;&#xBC95;&#xC785;&#xB2C8;&#xB2E4;. &#xC989;, arr&#xB294; &#xAC1D;&#xCCB4;&#xC785;&#xB2C8;&#xB2E4;. <code>map</code>&#xC774;&#xB77C;&#xB294; &#xBA54;&#xC18C;&#xB4DC;&#xB97C; &#xB530;&#xB85C; &#xBA85;&#xC2DC;&#xD558;&#xC9C0; &#xC54A;&#xC544;&#xB3C4; Array&#xC758; &#xD504;&#xB85C;&#xD1A0;&#xD0C0;&#xC785;&#xC744; &#xC0C1;&#xC18D;&#xBC1B;&#xC558;&#xC73C;&#xBBC0;&#xB85C; <code>Array.prototype.map</code> &#xBA54;&#xC18C;&#xB4DC;&#xB97C; &#xC0AC;&#xC6A9;&#xD560; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.<br>&#x2003;&#xC790;&#xBC14;&#xC2A4;&#xD06C;&#xB9BD;&#xD2B8;&#xB294; &#xB0B4;&#xBD80;&#xC801;&#xC73C;&#xB85C; &#xBAA8;&#xB4E0; &#xBE44;&#xC6D0;&#xC2DC; &#xD0C0;&#xC785;(&#xBC30;&#xC5F4;, &#xD568;&#xC218;, &#xD074;&#xB798;&#xC2A4; &#xB4F1;)&#xC5D0; &#xD504;&#xB85C;&#xD1A0;&#xD0C0;&#xC785;&#xC744; &#xC0C1;&#xC18D;&#xC2DC;&#xD0B5;&#xB2C8;&#xB2E4;. &#xC544;&#xB798;&#xC640; &#xAC19;&#xC740; &#xB290;&#xB08C;&#xC73C;&#xB85C; &#xBCF4;&#xBA74; &#xB429;&#xB2C8;&#xB2E4;.</p><pre><code class="language-javascript">class Array {
	map(){...}
}
    
const arr = [1,2,3]; // Array&#xC758; &#xC778;&#xC2A4;&#xD134;&#xC2A4;
Object.getPrototypeOf(arr) // arr&#xC758; &#xD504;&#xB85C;&#xD1A0;&#xD0C0;&#xC785;&#xC740; Array
arr.map() // Array&#xC758; map</code></pre><h3 id="%EC%9B%90%EC%8B%9C-%ED%83%80%EC%9E%85%EA%B3%BC-%ED%94%84%EB%A1%9C%ED%86%A0%ED%83%80%EC%9E%85">&#xC6D0;&#xC2DC; &#xD0C0;&#xC785;&#xACFC; &#xD504;&#xB85C;&#xD1A0;&#xD0C0;&#xC785;</h3><pre><code class="language-javascript">// &#xBB38;&#xC790;&#xC5F4;&#xC740; &#xC6D0;&#xC2DC; &#xD0C0;&#xC785;&#xC774;&#xC9C0;&#xB9CC; &#xAC1D;&#xCCB4;&#xCC98;&#xB7FC; &#xBA54;&#xC18C;&#xB4DC;&#xB97C; &#xC0AC;&#xC6A9;&#xD560; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.
&quot;string&quot;.charAt(&quot;s&quot;); </code></pre><p>&#x2003;&#xBB38;&#xC790;&#xC5F4;&#xC740; &#xC6D0;&#xC2DC;&#xAC12;&#xC774;&#xC9C0;&#xB9CC; &#xAC1D;&#xCCB4;&#xCC98;&#xB7FC; &#xBA54;&#xC18C;&#xB4DC;&#xB97C; &#xCC38;&#xC870;&#xD560; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;. &#xC790;&#xBC14;&#xC2A4;&#xD06C;&#xB9BD;&#xD2B8;&#xB294; &#xBB38;&#xC790;&#xC5F4;&#xC5D0;&#xC11C; &#xBA54;&#xC18C;&#xB4DC;&#xB97C; &#xC0AC;&#xC6A9;&#xD560; &#xACBD;&#xC6B0; &#xC77C;&#xC2DC;&#xC801;&#xC73C;&#xB85C; String&#xC758; &#xC778;&#xC2A4;&#xD134;&#xC2A4;&#xB85C; &#xBCC0;&#xD658;&#xD569;&#xB2C8;&#xB2E4;. &#xC774;&#xB97C; &#xB798;&#xD37C; &#xAC1D;&#xCCB4;&#xB77C;&#xACE0;&#xB3C4; &#xBD80;&#xB985;&#xB2C8;&#xB2E4;. &#xBB38;&#xC790;&#xC5F4;&#xC740; &#xB7F0;&#xD0C0;&#xC784;&#xC5D0;&#xB9CC; &#xAC1D;&#xCCB4;&#xB85C;&#xC11C; &#xD3C9;&#xAC00;&#xB418;&#xC5B4; &#xBA54;&#xC18C;&#xB4DC;&#xB97C; &#xCC38;&#xC870;&#xD558;&#xACE0;, &#xCF54;&#xB4DC; &#xD3C9;&#xAC00;&#xAC00; &#xB05D;&#xB098;&#xBA74; &#xB2E4;&#xC2DC; &#xBB38;&#xC790;&#xC5F4;&#xB85C; &#xB3CC;&#xC544;&#xAC11;&#xB2C8;&#xB2E4;.</p><h3 id="%ED%94%84%EB%A1%9C%ED%86%A0%ED%83%80%EC%9E%85-%EC%B2%B4%EC%9D%B8">&#xD504;&#xB85C;&#xD1A0;&#xD0C0;&#xC785; &#xCCB4;&#xC778;</h3><p>&#x2003;&#xC0DD;&#xC131;&#xC790; &#xD568;&#xC218;&#xB294; &#xC790;&#xC2E0;&#xC774; &#xC0C1;&#xC18D;&#xBC1B;&#xC740; &#xD504;&#xB85C;&#xD1A0;&#xD0C0;&#xC785;&#xC5D0; &#xD504;&#xB85C;&#xD37C;&#xD2F0;&#xC640; &#xBA54;&#xC18C;&#xB4DC;&#xB97C; &#xCD94;&#xAC00;&#xD560; &#xC218;&#xB3C4; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;. &#xC608;&#xB97C; &#xB4E4;&#xBA74; &#xC77C;&#xBC18; &#xBC30;&#xC5F4;&#xC740; Array&#xC758; &#xD504;&#xB85C;&#xD1A0;&#xD0C0;&#xC785;&#xC744; &#xC0C1;&#xC18D;&#xBC1B;&#xACE0;, Array&#xB294; Object&#xC758; &#xD504;&#xB85C;&#xD1A0;&#xD0C0;&#xC785;&#xC744; &#xC0C1;&#xC18D;&#xBC1B;&#xC2B5;&#xB2C8;&#xB2E4;. &#xC774;&#xCC98;&#xB7FC; &#xD504;&#xB85C;&#xD1A0;&#xD0C0;&#xC785; &#xC0C1;&#xC18D;&#xC740; &#xC5EC;&#xB7EC; &#xB2E8;&#xACC4;&#xB85C; &#xC0C1;&#xC18D;&#xB429;&#xB2C8;&#xB2E4;. &#xC774;&#xB97C; &#xD504;&#xB85C;&#xD1A0;&#xD0C0;&#xC785; &#xCCB4;&#xC778;&#xC774;&#xB77C; &#xD569;&#xB2C8;&#xB2E4;. &#xCC38;&#xACE0;&#xB85C; &#xBAA8;&#xB4E0; &#xD504;&#xB85C;&#xD1A0;&#xD0C0;&#xC785;&#xC758; &#xCD5C;&#xC885;&#xC801;&#xC778; &#xBD80;&#xBAA8;&#xB294; Object&#xC774;&#xACE0;, &#xC774; &#xAE4C;&#xB2ED;&#xC5D0; &#xC790;&#xBC14;&#xC2A4;&#xD06C;&#xB9BD;&#xD2B8;&#xB294; &#xC6D0;&#xC2DC;&#xAC12;&#xC744; &#xC81C;&#xC678;&#xD55C; &#xBAA8;&#xB4E0; &#xAC8C; &#xAC1D;&#xCCB4;&#xB77C;&#xB294; &#xB9D0;&#xC744; &#xD569;&#xB2C8;&#xB2E4;.</p><pre><code class="language-javascript">Object &#xD504;&#xB85C;&#xD1A0;&#xD0C0;&#xC785; { ... }
Array &#xD504;&#xB85C;&#xD1A0;&#xD0C0;&#xC785; { ... } // Object &#xD504;&#xB85C;&#xD1A0;&#xD0C0;&#xC785;&#xC744; &#xC0C1;&#xC18D;&#xBC1B;&#xC2B5;&#xB2C8;&#xB2E4;.
const array = [1,2,3]; // Array &#xD504;&#xB85C;&#xD1A0;&#xD0C0;&#xC785;&#xC744; &#xC0C1;&#xC18D;&#xBC1B;&#xC2B5;&#xB2C8;&#xB2E4;.</code></pre><p>&#x2003;<code>__proto__</code> &#xD504;&#xB85C;&#xD37C;&#xD2F0;&#xB098;, &#xD639;&#xC740; <code>Object.getPrototypeOf</code> &#xB85C; &#xD574;&#xB2F9; &#xAC1D;&#xCCB4;&#xC758; &#xBD80;&#xBAA8; &#xD504;&#xB85C;&#xD1A0;&#xD0C0;&#xC785;&#xC744; &#xD655;&#xC778;&#xD560; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.</p><pre><code class="language-javascript">class Person { ... }

const person = new Person();
const proto = Object.getPrototypeOf(person); // Person.prototype
const proto2 = person.__proto__; </code></pre><h3 id="%EC%83%9D%EC%84%B1%EC%9E%90-%ED%95%A8%EC%88%98">&#xC0DD;&#xC131;&#xC790; &#xD568;&#xC218;</h3><p>&#x2003;&#xC790;&#xBC14;&#xC2A4;&#xD06C;&#xB9BD;&#xD2B8;&#xC5D0;&#xC120; &#xAC1D;&#xCCB4;&#xB97C; &#xB9CE;&#xC774; &#xC501;&#xB2C8;&#xB2E4;. &#xBE44;&#xC2B7;&#xD55C; &#xC5ED;&#xD560;&#xC744; &#xAC00;&#xC9C4; &#xAC1D;&#xCCB4;&#xB97C; &#xB300;&#xB7C9; &#xB9CC;&#xB4E4;&#xAC70;&#xB098;, &#xD2B9;&#xC218;&#xD55C; &#xBAA9;&#xC801;&#xC744; &#xAC00;&#xC9C4; &#xAC1D;&#xCCB4;&#xB97C; &#xB9CC;&#xB4E4;&#xC5B4;&#xC57C; &#xD560; &#xB54C;&#xB3C4; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;. </p><pre><code class="language-javascript">function greet(name) {
  console.log(`Hello ${name}`);
}

const user = { name: &quot;user1&quot; };
greet(user.name);</code></pre><p>&#x2003;&#xC704;&#xCC98;&#xB7FC; &#xB2E8;&#xC21C;&#xD55C; &#xCF00;&#xC774;&#xC2A4;&#xB294; &#xD568;&#xC218;&#xC640; &#xAC1D;&#xCCB4;&#xB97C; &#xBD84;&#xB9AC;&#xC2DC;&#xCF1C;&#xB3C4; &#xBB34;&#xAD00;&#xD569;&#xB2C8;&#xB2E4;. &#xD558;&#xC9C0;&#xB9CC; &#xC720;&#xC800; &#xC815;&#xBCF4;&#xC640; &#xAD00;&#xB828; &#xD568;&#xC218;&#xAC00; &#xB9CE;&#xC544;&#xC9C0;&#xBA74; &#xC911;&#xBCF5;&#xACFC; &#xBCF5;&#xC7A1;&#xB3C4;&#xAC00; &#xB298;&#xC5B4;&#xB0A9;&#xB2C8;&#xB2E4;. &#xADF8;&#xB798;&#xC11C; &#xC544;&#xB798;&#xC640; &#xAC19;&#xC774; &#xC0DD;&#xC131;&#xC790; &#xD568;&#xC218;&#xB97C; &#xC0AC;&#xC6A9;&#xD569;&#xB2C8;&#xB2E4;.</p><pre><code class="language-javascript">function User(name) {
  this.name = name;
  this.greet = function() { ... }; // &#xC778;&#xC2A4;&#xD134;&#xC2A4;&#xB9C8;&#xB2E4; &#xC81C;&#xAC01;&#xAC01; &#xC0DD;&#xC131;&#xD569;&#xB2C8;&#xB2E4;.
}
User.prototype.greet = function () { ... }; // &#xBAA8;&#xB4E0; &#xC778;&#xC2A4;&#xD134;&#xC2A4;&#xAC00; &#xACF5;&#xC720;&#xD569;&#xB2C8;&#xB2E4;.

const user1 = new User(&quot;Lee&quot;);
const user2 = new User(&quot;Kim&quot;);
console.log(user1.greet === user2.greet); // true
</code></pre><p>&#x2003;greet &#xD568;&#xC218;&#xB294; &#xD56D;&#xC0C1; &#xAE30;&#xB2A5;&#xC774; &#xC77C;&#xC815;&#xD558;&#xAE30; &#xB54C;&#xBB38;&#xC5D0; &#xC5EC;&#xB7EC; &#xBC88; &#xC0DD;&#xC131;&#xD560; &#xD544;&#xC694;&#xC5C6;&#xC2B5;&#xB2C8;&#xB2E4;. &#xBAA8;&#xB4E0; &#xC720;&#xC800;&#xAC00; &#xB611;&#xAC19;&#xC740; greet &#xD568;&#xC218;&#xB97C; &#xC0AC;&#xC6A9;&#xD574;&#xC57C; &#xD6A8;&#xC728;&#xC801;&#xC785;&#xB2C8;&#xB2E4;. &#xC704;&#xC640; &#xAC19;&#xC774; &#xD504;&#xB85C;&#xD1A0;&#xD0C0;&#xC785;&#xC744; &#xD1B5;&#xD574; &#xD568;&#xC218;&#xB97C; &#xB4F1;&#xB85D;&#xD558;&#xBA74; &#xBAA8;&#xB4E0; &#xC778;&#xC2A4;&#xD134;&#xC2A4;&#xAC00; &#xD558;&#xB098;&#xC758; greet &#xD568;&#xC218;&#xB97C; &#xACF5;&#xC720;&#xD569;&#xB2C8;&#xB2E4;. <br>&#x2003;&#xC694;&#xC998;&#xC740; &#xC704;&#xC640; &#xAC19;&#xC774; &#xD504;&#xB85C;&#xD1A0;&#xD0C0;&#xC785;&#xC744; &#xC791;&#xC131;&#xD558;&#xB294; &#xB300;&#xC2E0; &#xD074;&#xB798;&#xC2A4;&#xB97C; &#xC774;&#xC6A9;&#xD569;&#xB2C8;&#xB2E4;. &#xD074;&#xB798;&#xC2A4;&#xB294; &#xB0B4;&#xBD80;&#xC801;&#xC73C;&#xB85C; &#xD504;&#xB85C;&#xD1A0;&#xD0C0;&#xC785;&#xC744; &#xC4F0;&#xAE30; &#xB54C;&#xBB38;&#xC5D0; &#xCF54;&#xB4DC;&#xAC00; &#xAC04;&#xACB0;&#xD558;&#xACE0; &#xC77C;&#xBC18; &#xC0DD;&#xC131;&#xC790; &#xD568;&#xC218;&#xBCF4;&#xB2E4; &#xB9CE;&#xC740; &#xAE30;&#xB2A5;&#xC744; &#xC9C0;&#xC6D0;&#xD569;&#xB2C8;&#xB2E4;.</p><h3 id="%ED%81%B4%EB%9E%98%EC%8A%A4">&#xD074;&#xB798;&#xC2A4;</h3><pre><code class="language-javascript">class User {
  constructor(name) {
    this.name = name;
    // return this;
  }

  greet() {
    console.log(this.name);
  }
}

const user = new User(&quot;user1&quot;);
// ...
const user = new User(&quot;user9547272&quot;);
</code></pre><p>&#x2003;&#xD074;&#xB798;&#xC2A4;&#xB3C4; &#xC0DD;&#xC131;&#xC790; &#xD568;&#xC218;&#xC785;&#xB2C8;&#xB2E4;. new &#xC811;&#xB450;&#xC0AC;&#xB97C; &#xBD99;&#xC5EC; &#xC2E4;&#xD589; &#xC2DC; constructor&#xAC00; &#xC2E4;&#xD589;&#xB418;&#xC5B4; &#xC778;&#xC2A4;&#xD134;&#xC2A4;&#xB97C; &#xBC18;&#xD658;&#xD569;&#xB2C8;&#xB2E4;. (constructor&#xB294; &#xC554;&#xBB35;&#xC801;&#xC73C;&#xB85C; this&#xB97C; &#xBC18;&#xD658;&#xD569;&#xB2C8;&#xB2E4;.) constructor&#xC5D0;&#xC11C; &#xC120;&#xC5B8;&#xD558;&#xB294; <code>this.name</code> &#xB530;&#xC704;&#xB294; &#xAC01; &#xC778;&#xC2A4;&#xD134;&#xC2A4;&#xB4E4;&#xC774; &#xAC1C;&#xBCC4;&#xC801;&#xC73C;&#xB85C; &#xAC00;&#xC9C8; &#xC18D;&#xC131;&#xC785;&#xB2C8;&#xB2E4;. <br>&#x2003;constructor &#xBC14;&#xAE65;&#xC5D0; &#xC801;&#xB294; &#xBA54;&#xC18C;&#xB4DC;&#xB294; &#xD504;&#xB85C;&#xD1A0;&#xD0C0;&#xC785;&#xC5D0; &#xB4F1;&#xB85D;&#xB418;&#xC5B4; &#xBAA8;&#xB4E0; &#xC778;&#xC2A4;&#xD134;&#xC2A4;&#xAC00; &#xACF5;&#xC720;&#xD569;&#xB2C8;&#xB2E4;. &#xB610;&#xD55C; constructor&#xB3C4; &#xBA54;&#xC18C;&#xB4DC;&#xCC98;&#xB7FC; &#xD504;&#xB85C;&#xD1A0;&#xD0C0;&#xC785;&#xC5D0; &#xB4F1;&#xB85D;&#xB429;&#xB2C8;&#xB2E4;.</p><pre><code class="language-js">class User {
    constructor(name) {
        this.name = name
    }
    // User&#xC758; &#xD504;&#xB85C;&#xD1A0;&#xD0C0;&#xC785;&#xC5D0; greet &#xBA54;&#xC18C;&#xB4DC; &#xB4F1;&#xB85D;
	greet() {
        console.log(this.name)
    }
    // User&#xC758; &#xC778;&#xC2A4;&#xD134;&#xC2A4;&#xB9C8;&#xB2E4; greet &#xD568;&#xC218; &#xC0DD;&#xC131;
    greet2 = () =&gt; {
        console.log(this.name)
    }
}

const user1 = new User(&quot;A&quot;);
const user2 = new User(&quot;B&quot;);
console.log(user1.greet === user2.greet) // true
console.log(user1.greet2 === user2.greet2) // false</code></pre><p>&#x2003;&#xB2E8;, <strong>&#xBA54;&#xC18C;&#xB4DC;&#xB97C; &#xD654;&#xC0B4;&#xD45C; &#xD568;&#xC218;&#xB85C; &#xC791;&#xC131;&#xD558;&#xBA74; &#xD504;&#xB85C;&#xD37C;&#xD2F0;&#xB85C;&#xC11C; &#xD3C9;&#xAC00;</strong>&#xB429;&#xB2C8;&#xB2E4;.</p><figure class="kg-card kg-image-card"><img src="https://blog.cinntiq.synology.me/content/images/2023/11/image.png" class="kg-image" alt="&#xD074;&#xB798;&#xC2A4;" loading="lazy" width="336" height="125"></figure><p>&#x2003;</p><pre><code class="language-javascript">const user = {
  greet() { ... }
};
</code></pre><p>&#x2003;&#xAC1D;&#xCCB4; &#xB9AC;&#xD130;&#xB7F4;&#xC5D0;&#xC11C; &#xC791;&#xC131;&#xD55C; &#xD568;&#xC218;&#xB3C4; &#xBA54;&#xC18C;&#xB4DC;&#xAC00; &#xC544;&#xB2CC; &#xD504;&#xB85C;&#xD37C;&#xD2F0;&#xB85C; &#xD3C9;&#xAC00;&#xB429;&#xB2C8;&#xB2E4;. <strong>&#xAC1D;&#xCCB4; &#xB9AC;&#xD130;&#xB7F4;&#xC744; &#xC0DD;&#xC131;&#xC790; &#xD568;&#xC218;&#xB85C; &#xC4F8; &#xC77C;&#xC774; &#xC5C6;&#xAE30; &#xB54C;&#xBB38;</strong>&#xC785;&#xB2C8;&#xB2E4;. <br>&#x2003;&#xBA54;&#xC18C;&#xB4DC;&#xC640; &#xD568;&#xC218;&#xC758; &#xCC28;&#xC774;&#xB97C; &#xBB3B;&#xB294; &#xC9C8;&#xBB38;&#xC774; &#xB9CE;&#xC740;&#xB370; &#xC790;&#xBC14;&#xC2A4;&#xD06C;&#xB9BD;&#xD2B8;&#xC5D0; &#xD55C;&#xC815;&#xD558;&#xBA74;, &#xBA54;&#xC18C;&#xB4DC; &#xCD95;&#xC57D;&#xBC95;(method shorthand)&#xC73C;&#xB85C; &#xC815;&#xC758;&#xD574; &#xD504;&#xB85C;&#xD1A0;&#xD0C0;&#xC785;&#xC5D0; &#xB4F1;&#xB85D;&#xB41C; &#xD568;&#xC218;&#xB97C; &#xB73B;&#xD560; &#xB54C;&#xAC00; &#xB9CE;&#xC2B5;&#xB2C8;&#xB2E4;. </p><h3 id="%ED%81%B4%EB%9E%98%EC%8A%A4%EC%9D%98-%EC%A0%95%EC%A0%81-%EC%9A%94%EC%86%8C">&#xD074;&#xB798;&#xC2A4;&#xC758; &#xC815;&#xC801; &#xC694;&#xC18C;</h3><p>&#x2003;&#xC77C;&#xBC18;&#xC801;&#xC73C;&#xB85C; &#xC18D;&#xC131;&#xACFC; &#xBA54;&#xC18C;&#xB4DC;&#xB294; &#xC778;&#xC2A4;&#xD134;&#xC2A4;&#xB97C; &#xC0DD;&#xC131;&#xD574;&#xC57C;&#xB9CC; &#xCC38;&#xC870;&#xD560; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;. &#xD558;&#xC9C0;&#xB9CC; &#xA0;<code>static</code>&#xC744; &#xC4F0;&#xBA74; &#xC778;&#xC2A4;&#xD134;&#xC2A4; &#xC5C6;&#xC774; &#xD074;&#xB798;&#xC2A4; &#xC790;&#xCCB4;&#xC5D0;&#xC11C; &#xCC38;&#xC870;&#xD569;&#xB2C8;&#xB2E4;.</p><pre><code class="language-javascript">class User {
  static greet() {
    console.log(&quot;hi&quot;);
  }
  greet2() {
    console.log(&quot;hello&quot;);
  }
}

const user = new User();
user.greet2(); // &#xC77C;&#xBC18; &#xBA54;&#xC18C;&#xB4DC;
User.greet(); // &#xC815;&#xC801; &#xBA54;&#xC18C;&#xB4DC;</code></pre><p>&#x2003;&#xC778;&#xC2A4;&#xD134;&#xC2A4;&#xC5D0;&#xC11C; &#xC815;&#xC801; &#xC694;&#xC18C;&#xC5D0; &#xC811;&#xADFC;&#xD560; &#xC77C;&#xC740; &#xC5C6;&#xC9C0;&#xB9CC; &#xBD88;&#xAC00;&#xB2A5;&#xD558;&#xC9C4; &#xC54A;&#xC2B5;&#xB2C8;&#xB2E4;. &#xD504;&#xB85C;&#xD1A0;&#xD0C0;&#xC785;&#xC744; &#xD1B5;&#xD574; &#xBD80;&#xBAA8;&#xC758; &#xC815;&#xC801; &#xC694;&#xC18C;&#xB97C; &#xCC38;&#xC870;&#xD560; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.</p><pre><code class="language-javascript">class Person {
  static greet() {
    console.log(&quot;hi&quot;);
  }
}

const person = new Person();
const proto = Object.getPrototypeOf(person); // Person.prototype
const proto2 = person.__proto__; // Person.prototype
const proto3 = Person.prototype; // Person.prototype
const proto4 = Person.__proto__; // Function.prototype
proto.constructor.greet(); // hi
proto2.constructor.greet(); // hi
console.log(proto === proto2); // true
console.log(proto2 === proto3); // true
console.log(proto2 === proto4); // false
</code></pre><h2 id="%EC%B0%B8%EC%A1%B0">&#xCC38;&#xC870;</h2><ul><li>&#xC774;&#xC6C5;&#xBAA8;(2020.09). <strong>&#xBAA8;&#xB358; &#xC790;&#xBC14;&#xC2A4;&#xD06C;&#xB9BD;&#xD2B8; Deep Dive: &#xC790;&#xBC14;&#xC2A4;&#xD06C;&#xB9BD;&#xD2B8;&#xC758; &#xAE30;&#xBCF8; &#xAC1C;&#xB150;&#xACFC; &#xB3D9;&#xC791; &#xC6D0;&#xB9AC;.</strong> &#xC704;&#xD0A4;&#xBD81;&#xC2A4;</li><li><a href="https://tc39.es/ecma262/multipage/executable-code-and-execution-contexts.html?ref=blog.cinntiq.synology.me#sec-environment-records">ECMAScript&#xAE; 2023 Language Specification</a></li><li><a href="https://www.w3schools.com/js/js_this.asp?ref=blog.cinntiq.synology.me">The JavaScript this Keyword</a></li><li><a href="https://www.tutorialsteacher.com/javascript/this-keyword-in-javascript?ref=blog.cinntiq.synology.me">JavaScript - this Keyword</a></li><li><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/Arrow_functions?ref=blog.cinntiq.synology.me">Arrow function expressions</a></li></ul>]]></content:encoded></item><item><title><![CDATA[타입스크립트와 구조적 타입 시스템]]></title><description><![CDATA[타입스크립트가 왜 구조적 타입 시스템을 도입했는지, 이를 어떻게 해석하고 사용할지 배웁니다]]></description><link>https://blog.cinntiq.synology.me/structural-type-system/</link><guid isPermaLink="false">6565a2a2707381000106f44b</guid><category><![CDATA[TypeScript]]></category><dc:creator><![CDATA[Hameln]]></dc:creator><pubDate>Tue, 28 Nov 2023 08:41:27 GMT</pubDate><media:content url="https://blog.cinntiq.synology.me/content/images/2024/01/typescript-1.png" medium="image"/><content:encoded><![CDATA[<h1 id="%EB%AA%A9%ED%91%9C">&#xBAA9;&#xD45C;</h1><blockquote>&#x2003;&#xD0C0;&#xC785;&#xC2A4;&#xD06C;&#xB9BD;&#xD2B8;&#xC758; &#xAD6C;&#xC870;&#xC801; &#xD0C0;&#xC785; &#xC2DC;&#xC2A4;&#xD15C; &#xD2B9;&#xC131;&#xC744; &#xC774;&#xD574;&#xD558;&#xACE0; &#xD0C0;&#xC785; &#xD638;&#xD658;&#xACFC; &#xD0C0;&#xC785; &#xCCB4;&#xD06C;&#xB97C; &#xC5F0;&#xC2B5;&#xD569;&#xB2C8;&#xB2E4;.</blockquote><img src="https://blog.cinntiq.synology.me/content/images/2024/01/typescript-1.png" alt="&#xD0C0;&#xC785;&#xC2A4;&#xD06C;&#xB9BD;&#xD2B8;&#xC640; &#xAD6C;&#xC870;&#xC801; &#xD0C0;&#xC785; &#xC2DC;&#xC2A4;&#xD15C;"><p>&#xC815;&#xC801; &#xD0C0;&#xC785; &#xC5B8;&#xC5B4;&#xC758; &#xD0C0;&#xC785; &#xC2DC;&#xC2A4;&#xD15C;&#xC740; &#xD06C;&#xAC8C; &#xB450; &#xAC00;&#xC9C0; &#xBC29;&#xC2DD;&#xC774; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.</p><ol><li>&#xBA85;&#xBAA9;&#xC801; &#xD0C0;&#xC774;&#xD551;. (&#xD639;&#xC740; &#xC774;&#xB984; &#xAE30;&#xBC18; &#xD0C0;&#xC785; &#xC2DC;&#xC2A4;&#xD15C;)</li><li>&#xAD6C;&#xC870;&#xC801; &#xD0C0;&#xC774;&#xD551;. (&#xD639;&#xC740; &#xB355; &#xD0C0;&#xC774;&#xD551;, &#xD504;&#xB85C;&#xD37C;&#xD2F0; &#xBA85; &#xAE30;&#xBC18; &#xD0C0;&#xC785; &#xC2DC;&#xC2A4;&#xD15C;)</li></ol><p>&#x2003;&#xB458;&#xC758; &#xCC28;&#xC774;&#xB294; &#xC544;&#xB798;&#xC640; &#xAC19;&#xC2B5;&#xB2C8;&#xB2E4;.</p><figure class="kg-card kg-image-card"><img src="https://blog.cinntiq.synology.me/content/images/2024/01/274931800-6061de9f-003b-4164-ac8f-f05d98bf560b.jpg" class="kg-image" alt="&#xD0C0;&#xC785;&#xC2A4;&#xD06C;&#xB9BD;&#xD2B8;&#xC640; &#xAD6C;&#xC870;&#xC801; &#xD0C0;&#xC785; &#xC2DC;&#xC2A4;&#xD15C;" loading="lazy" width="830" height="270" srcset="https://blog.cinntiq.synology.me/content/images/size/w600/2024/01/274931800-6061de9f-003b-4164-ac8f-f05d98bf560b.jpg 600w, https://blog.cinntiq.synology.me/content/images/2024/01/274931800-6061de9f-003b-4164-ac8f-f05d98bf560b.jpg 830w" sizes="(min-width: 720px) 720px"></figure><ul><li>&#xBA85;&#xBAA9;&#xC801; &#xD0C0;&#xC774;&#xD551;&#xC740; &apos;&#xC774;&#xB984;, &#xB2E8;&#xC704;&apos;&#xB97C; &#xBE44;&#xAD50;&#xD569;&#xB2C8;&#xB2E4;. <strong><code>L</code>&#xC640; <code>m</code>&#xB294; &#xB2E8;&#xC704;&#xAC00; &#xB2E4;&#xB974;&#xBBC0;&#xB85C; &#xB458;&#xC740; &#xB2E4;&#xB974;&#xB2E4;</strong>&#xACE0; &#xD310;&#xB2E8;&#xD569;&#xB2C8;&#xB2E4;.</li><li>&#xAD6C;&#xC870;&#xC801; &#xD0C0;&#xC774;&#xD551;&#xC740; &apos;&#xC18D;&#xC131;, &#xAD6C;&#xC870;&apos;&#xB97C; &#xBE44;&#xAD50;&#xD569;&#xB2C8;&#xB2E4;. <strong>&#xB458; &#xB2E4; <code>number</code>&#xC18D;&#xC131;&#xC744; &#xAC00;&#xC9C0;&#xBBC0;&#xB85C; &#xB458;&#xC740; &#xB611;&#xAC19;&#xB2E4;</strong>&#xACE0; &#xD310;&#xB2E8;&#xD569;&#xB2C8;&#xB2E4;.</li></ul><p>&#x2003;&#xBC8C;&#xC368;&#xBD80;&#xD130; &apos;&#xAD6C;&#xC870;&#xC801; &#xD0C0;&#xC785;&#xC774; &#xBC14;&#xBCF4;&#xCC98;&#xB7FC;&apos; &#xBCF4;&#xC785;&#xB2C8;&#xB2E4;. &#xAC1D;&#xCCB4; &#xD0C0;&#xC785;&#xC5D0;&#xC120; &#xC5B4;&#xB5A8;&#xAE4C;&#xC694;?</p><pre><code class="language-typescript">// &#xBA85;&#xBAA9;&#xC801; &#xD0C0;&#xC774;&#xD551;(&#xC774;&#xB984; &#xAE30;&#xBC18; &#xD0C0;&#xC774;&#xD551;): Java, Swift...
type Game = { name: string }
type Animal = { name: string }
let zelda: Game = { name: &quot;zelda&quot; }
let duck: Animal = { name: &quot;gooose&quot; }
zelda = duck; // &#x274C; Error: zelda&#xB294; Game &#xD0C0;&#xC785;&#xC785;&#xB2C8;&#xB2E4;! Animal &#xD0C0;&#xC785;&#xC744; &#xD560;&#xB2F9;&#xD558;&#xC9C0; &#xB9C8;&#xC138;&#xC694;!
</code></pre><pre><code class="language-typescript">// &#xAD6C;&#xC870;&#xC801; &#xD0C0;&#xC774;&#xD551;(&#xC18D;&#xC131; &#xAE30;&#xBC18; &#xD0C0;&#xC774;&#xD551;): TypeScript...
type Game = { name: string }
type Animal = { name: string }
let zelda: Game = { name: &quot;zelda&quot; }
let duck: Animal = { name: &quot;gooose&quot; }
zelda = duck; // &#x2705; OK: &quot;name&quot; &#xC18D;&#xC131;&#xC744; &#xB9CC;&#xC871;&#xD558;&#xB2C8;&#xAE4C; &#xD560;&#xB2F9; &#xAC00;&#xB2A5;&#xD569;&#xB2C8;&#xB2E4;!
</code></pre><p>&#x2003;&quot;&#xAC8C;&#xC784;&quot;&#xACFC; &quot;&#xB3D9;&#xBB3C;&quot;&#xC740; &#xC5C4;&#xC5F0;&#xD788; &#xB2E4;&#xB985;&#xB2C8;&#xB2E4;. &#xD558;&#xC9C0;&#xB9CC; &#xB458; &#xB2E4; <code>name</code> &#xC18D;&#xC131;&#xC744; &#xAC00;&#xC84C;&#xB2E8; &#xC774;&#xC720;&#xB9CC;&#xC73C;&#xB85C; &#xC11C;&#xB85C; &#xD638;&#xD658;&#xB429;&#xB2C8;&#xB2E4;. &#xC774;&#xB7F0; &#xD2B9;&#xC131; &#xB54C;&#xBB38;&#xC5D0; &#xAD6C;&#xC870;&#xC801; &#xD0C0;&#xC774;&#xD551;&#xC740; <strong>&#xB355; &#xD0C0;&#xC774;&#xD551;</strong>&#xC774;&#xB780; &#xC774;&#xB984;&#xC73C;&#xB85C; &#xB9CE;&#xC774; &#xBD88;&#xB9BD;&#xB2C8;&#xB2E4;.</p><p>Q) <strong>&#x201C;&#xC624;&#xB9AC;&#xB780; &#xBB34;&#xC5C7;&#xC778;&#xAC00;?&#x201D;</strong></p><ol><li>&#xC624;&#xB9AC; &#xAC19;&#xC740; &#xBD80;&#xB9AC;&#xB97C; &#xAC00;&#xC84C;&#xB2E4;.</li><li>&#xC624;&#xB9AC; &#xAC19;&#xC740; &#xB208;&#xC744; &#xAC00;&#xC84C;&#xB2E4;.</li></ol><p>&#x2003;&#xB3D9;&#xBB3C; &#xD611;&#xD68C;&#xC5D0;&#xC11C; &#xC704; &#xB450; &#xC870;&#xAC74;&#xC744; &#xB9CC;&#xC871;&#xD558;&#xAE30;&#xB9CC; &#xD558;&#xBA74; &#xC624;&#xB9AC;&#xB85C; &#xACF5;&#xC778;&#xD588;&#xB2E4;&#xACE0; &#xAC00;&#xC815;&#xD574;&#xBD05;&#xC2DC;&#xB2E4;. &#xADF8;&#xB7FC; &#xC544;&#xB798;&#xC758; &#xC0AC;&#xC9C4;&#xC740; &quot;&#xD569;&#xC131;&#xC774; &#xC544;&#xB2CC; &#xC9C4;&#xC9DC; &#xC624;&#xB9AC;&quot;&#xB77C;&#xACE0; &#xC778;&#xC815;&#xB429;&#xB2C8;&#xB2E4;.</p><figure class="kg-card kg-image-card"><img src="https://blog.cinntiq.synology.me/content/images/2024/01/268497812-1b280fe5-0bc6-4c4c-bd15-2b34dd8baeaa.jpg" class="kg-image" alt="&#xD0C0;&#xC785;&#xC2A4;&#xD06C;&#xB9BD;&#xD2B8;&#xC640; &#xAD6C;&#xC870;&#xC801; &#xD0C0;&#xC785; &#xC2DC;&#xC2A4;&#xD15C;" loading="lazy" width="582" height="429"></figure><h3 id="%EC%99%9C-%ED%83%80%EC%9E%85%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EB%8A%94-%EA%B5%AC%EC%A1%B0%EC%A0%81-%ED%83%80%EC%9E%85-%EC%8B%9C%EC%8A%A4%ED%85%9C%EC%9D%84-%EC%82%AC%EC%9A%A9%ED%95%A0%EA%B9%8C%EC%9A%94">&#xC65C; &#xD0C0;&#xC785;&#xC2A4;&#xD06C;&#xB9BD;&#xD2B8;&#xB294; &#xAD6C;&#xC870;&#xC801; &#xD0C0;&#xC785; &#xC2DC;&#xC2A4;&#xD15C;&#xC744; &#xC0AC;&#xC6A9;&#xD560;&#xAE4C;&#xC694;?</h3><p>&#x2003;&#xAD6C;&#xC870;&#xC801; &#xD0C0;&#xC774;&#xD551;&#xC740; &#xD5C8;&#xC220;&#xD558;&#xAE30;&#xB9CC; &#xD560;&#xAE4C;&#xC694;? &#xC65C; &#xC774;&#xB7F0; &#xC2DC;&#xC2A4;&#xD15C;&#xC744; &#xD5C8;&#xC6A9;&#xD560;&#xAE4C;&#xC694;? &#xB2E4;&#xC74C; &#xC0C1;&#xD669;&#xC744; &#xBD05;&#xC2DC;&#xB2E4;.</p><pre><code class="language-typescript">type Food = { carbohydrates: number; protein: number; fat: number };
type Burger = Food &amp; { burgerBrand: string };

// &#xBA85;&#xBAA9;&#xC801; &#xD0C0;&#xC785; &#xC2DC;&#xC2A4;&#xD15C;&#xC5D0;&#xC11C; &#xC774; &#xD568;&#xC218;&#xB294; Food &#xD0C0;&#xC785;&#xB9CC; &#xCC98;&#xB9AC;&#xD569;&#xB2C8;&#xB2E4;.
function calculateCalorie({ carbohydrates, protein, fat }: Food) {
  return carbohydrates * 4 + protein * 4 + fat * 9;
}

const thighBurger: Burger = {
  carbohydrates: 60,
  protein: 28,
  fat: 27,
  burgerBrand: &quot;Mom&apos;s Touch&quot;,
};

// Swift&#xB294; &#xC774;&#xB7F4; &#xB54C; `Foodable protocol`&#xC744; `extension`&#xC73C;&#xB85C; &#xD655;&#xC7A5;&#xD574;&#xC11C; &#xC0AC;&#xC6A9;&#xD569;&#xB2C8;&#xB2E4;.  
calculateCalorie(thighBurger); // &#xD0C0;&#xC785;&#xC2A4;&#xD06C;&#xB9BD;&#xD2B8;&#xB294; &#xC5B4;&#xB5A8;&#xAE4C;&#xC694;? &#xD568;&#xC218;&#xAC00; &#xBC84;&#xAC70; &#xCE7C;&#xB85C;&#xB9AC; &#xACC4;&#xC0B0;&#xC744; &#xBABB;&#xD558;&#xAC8C; &#xB9C9;&#xB294; &#xAC8C; &#xC88B;&#xC744;&#xAE4C;&#xC694;?
</code></pre><p>&#x2003;&#xC9C1;&#xAD00;&#xC801;&#xC73C;&#xB85C;, &#xD584;&#xBC84;&#xAC70;&#xAC00; <code>Food</code> &#xD0C0;&#xC785;&#xC740; &#xC544;&#xB2D0;&#xC9C0;&#xC5B8;&#xC815; &#xD0C4;&#xC218;&#xD654;&#xBB3C;, &#xB2E8;&#xBC31;&#xC9C8;, &#xC9C0;&#xBC29; &#xC815;&#xBCF4;&#xAC00; &#xC788;&#xC73C;&#xB2C8; <strong>&#xCE7C;&#xB85C;&#xB9AC; &#xACC4;&#xC0B0;&#xC774; &#xB41C;&#xB2E4;&#xBA74;</strong> &#xBA4B;&#xC9C0;&#xC9C0; &#xC54A;&#xC744;&#xAE4C;&#xC694;? &#xC2E4;&#xC81C;&#xB85C; &#xD0C0;&#xC785;&#xC2A4;&#xD06C;&#xB9BD;&#xD2B8;&#xB294; &#xBCC4;&#xB3C4;&#xC758; &#xCC98;&#xB9AC; &#xC5C6;&#xC774; &#xCE7C;&#xB85C;&#xB9AC; &#xACC4;&#xC0B0;&#xC744; &#xD5C8;&#xC6A9;&#xD569;&#xB2C8;&#xB2E4;. &#xD584;&#xBC84;&#xAC70;&#xAC00; &#xD0C4;&#xC218;&#xD654;&#xBB3C;, &#xB2E8;&#xBC31;&#xC9C8;, &#xC9C0;&#xBC29;&#xC774;&#xB77C;&#xB294; Food&#xC758; &apos;&#xC18D;&#xC131;&apos;&#xC744; &#xC804;&#xBD80; &#xAC16;&#xCDC4;&#xAE30; &#xB54C;&#xBB38;&#xC785;&#xB2C8;&#xB2E4;. <br>&#x2003;&#xC2EC;&#xC9C0;&#xC5B4; &#xBC84;&#xAC70; &#xBE0C;&#xB79C;&#xB4DC;&#xB77C;&#xB294; <strong>&#xC789;&#xC5EC; &#xC18D;&#xC131;&#xB3C4; &#xD5C8;&#xC6A9;</strong>&#xD569;&#xB2C8;&#xB2E4;. &#xD5C8;&#xC220;&#xD574;&#xBCF4;&#xC774;&#xB358; &#xB2E8;&#xC810;&#xC744; &#xC720;&#xC5F0;&#xD568;&#xC774;&#xB77C;&#xB294; &#xC7A5;&#xC810;&#xC73C;&#xB85C; &#xC2B9;&#xD654;&#xC2DC;&#xD0B5;&#xB2C8;&#xB2E4;. &#xC774;&#xB7F0; &#xD2B9;&#xC9D5;&#xC740; &#xB2E4;&#xD615;&#xC131;&#xACFC; &#xC5F0;&#xACC4;&#xB429;&#xB2C8;&#xB2E4;.</p><ul><li>&#xBA85;&#xBAA9;&#xC801; &#xD0C0;&#xC774;&#xD551;: &#xC815;&#xBC00;&#xD55C; &#xD0C0;&#xC785; &#xCCB4;&#xD06C;&#xB85C; &#xC5D0;&#xB7EC; &#xBC29;&#xC9C0;. &#xC720;&#xC5F0;&#xC131;, &#xD638;&#xD658;&#xC131;&#xC774; &#xBD80;&#xC871;</li><li>&#xAD6C;&#xC870;&#xC801; &#xD0C0;&#xC774;&#xD551;: &#xD0C0;&#xC785; &#xCCB4;&#xD06C;&#xAC00; &#xD5C8;&#xC220;&#xD558;&#xC9C0;&#xB9CC;, &#xADF8;&#xB798;&#xC11C; &#xC720;&#xC5F0;&#xD55C; &#xC0AC;&#xC6A9;&#xC774; &#xAC00;&#xB2A5;</li></ul><p>&#x2003;&#xAD6C;&#xC870;&#xC801; &#xD0C0;&#xC774;&#xD551;&#xC740; &#xC720;&#xC5F0;&#xD568;&#xACFC; &#xD5C8;&#xC220;&#xD568;&#xC774; &#xACF5;&#xC874;&#xD569;&#xB2C8;&#xB2E4;. &#xD0C0;&#xC785;&#xC2A4;&#xD06C;&#xB9BD;&#xD2B8;&#xC5D0;&#xB294; &#xD5C8;&#xC220;&#xD568;&#xC744; &#xC870;&#xC2EC;&#xD558;&#xB294; &#xAE30;&#xC220;&#xC774; &#xBA87; &#xAC00;&#xC9C0; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;. &#xADF8; &#xC911; &#xD558;&#xB098;&#xB294; &#xAC1D;&#xCCB4; &#xB9AC;&#xD130;&#xB7F4;&#xC785;&#xB2C8;&#xB2E4;.<br>&#x2003;&#xBA3C;&#xC813;&#xBC88; &#xCF54;&#xB4DC;&#xC5D0;&#xC120; &#xBC84;&#xAC70; &#xBE0C;&#xB79C;&#xB4DC; &#xC18D;&#xC131;&#xC744; &#xD5C8;&#xC6A9;&#xD588;&#xC9C0;&#xB9CC; &#xAC1D;&#xCCB4; &#xB9AC;&#xD130;&#xB7F4;&#xC744; &#xBC14;&#xB85C; &#xC785;&#xB825;&#xD558;&#xBA74; &#xC5D0;&#xB7EC;&#xAC00; &#xBC1C;&#xC0DD;&#xD569;&#xB2C8;&#xB2E4;. &#xD0C0;&#xC785;&#xC2A4;&#xD06C;&#xB9BD;&#xD2B8;&#xB294;<strong> </strong>&#xD0C0;&#xC785;&#xC774; &#xACB0;&#xC815;&#xB418;&#xAC70;&#xB098; &#xCD94;&#xB860;&#xB41C;(&#xBCC0;&#xC218;&#xC5D0; &#xD560;&#xB2F9;&#xB418;&#xAC70;&#xB098; as&#xB85C; &#xD0C0;&#xC785; &#xB2E8;&#xC5B8;&#xD55C;) &#xAC1D;&#xCCB4;&#xB9CC; &#xC789;&#xC5EC; &#xC18D;&#xC131;&#xC744; &#xD5C8;&#xC6A9;&#xD558;&#xAE30; &#xB54C;&#xBB38;&#xC785;&#xB2C8;&#xB2E4;.<br>&#x2003;&#xD0C0;&#xC785;&#xC2A4;&#xD06C;&#xB9BD;&#xD2B8;&#xB294; &#xAC1D;&#xCCB4; &#xB9AC;&#xD130;&#xB7F4;&#xC744; &#xC2E0;&#xC120;(fresh)&#xD55C; &#xAC1D;&#xCCB4;&#xB77C;&#xACE0; &#xBD84;&#xB958;&#xD558;&#xBA70;, &#xD0C0;&#xC785;&#xC5D0; &#xAE30;&#xC7AC;&#xB418;&#xC9C0; &#xC54A;&#xC740; &#xC18D;&#xC131;&#xC744; &#xBC1C;&#xACAC;&#xB418;&#xBA74; &#xC5D0;&#xB7EC;&#xB97C; &#xB358;&#xC9D1;&#xB2C8;&#xB2E4;. &#xC774;&#xB7F0; &#xCF00;&#xC774;&#xC2A4;&#xB97C; &#xD5C8;&#xC6A9;&#xD588;&#xB2E4;&#xAC04;<strong> </strong>&#xAC1C;&#xBC1C;&#xC790;&#xC758; &#xC2E4;&#xC218;&#xB85C; &#xBC84;&#xADF8;&#xAC00; &#xBC1C;&#xC0DD;&#xD560; &#xD655;&#xB960;&#xC774; &#xB192;&#xAE30; &#xB54C;&#xBB38;&#xC785;&#xB2C8;&#xB2E4;.</p><pre><code class="language-typescript">// &#x1F4D2; &#xB9CC;&#xC57D; &#xAC1D;&#xCCB4; &#xB9AC;&#xD130;&#xB7F4;&#xC5D0;&#xC11C; &#xC789;&#xC5EC; &#xC18D;&#xC131;&#xB3C4; &#xD5C8;&#xC6A9;&#xD55C;&#xB2E4;&#xBA74;?
// &#x1F621; &#xBD80;&#xC791;&#xC6A9; 1: &#xB2E4;&#xB978; &#xAC1C;&#xBC1C;&#xC790;&#xB294; burgerBrand&#xAC00; &#xD544;&#xC218; &#xC18D;&#xC131;&#xC774;&#xB77C;&#xACE0; &#xC624;&#xD574;&#xD560; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.
const calorie1 = calculateCalorie({
  protein: 29,
  carbohydrates: 48,
  fat: 13,
  burgerBrand: &quot;&#xBC84;&#xAC70;&#xD0B9;&quot;, // &#x274C; Error: &#xC789;&#xC5EC; &#xC18D;&#xC131;&#xC774; &#xC874;&#xC7AC;&#xD568;.
});

// &#x1F92C; &#xBD80;&#xC791;&#xC6A9; 2: &#xC789;&#xC5EC; &#xC18D;&#xC131;&#xC5D0; &#xC624;&#xD0C0;&#xAC00; &#xC788;&#xC5B4;&#xB3C4; TypeScript&#xB294; &#xC774;&#xB97C; &#xBC1C;&#xACAC;&#xD560; &#xC218; &#xC5C6;&#xC2B5;&#xB2C8;&#xB2E4;!
const calorie2 = calculateCalorie({
  protein: 29,
  carbohydrates: 48,
  fat: 13,
  birgerBrand: &quot;&#xBC84;&#xAC70;&#xD0B9;&quot;, // &#x274C; Error: &#xC789;&#xC5EC; &#xC18D;&#xC131;&#xC774; &#xC874;&#xC7AC;&#xD568;.
});
</code></pre><h3 id="%EC%95%84%EA%B9%8C-%EB%B4%A4%EB%8D%98-l%EA%B3%BC-m%EC%9D%84-%EB%B9%84%EA%B5%90%ED%95%98%EB%A0%A4%EB%A9%B4-%EC%96%B4%EB%96%BB%EA%B2%8C-%ED%95%A0%EA%B9%8C%EC%9A%94">&#xC544;&#xAE4C; &#xBD24;&#xB358; L&#xACFC; m&#xC744; &#xBE44;&#xAD50;&#xD558;&#xB824;&#xBA74; &#xC5B4;&#xB5BB;&#xAC8C; &#xD560;&#xAE4C;&#xC694;?</h3><p>&#x2003;<code>1000L</code>&#xC640; <code>1000m</code>&#xB294; &#xB458; &#xB2E4; <code>number</code> &#xD0C0;&#xC785;&#xC774;&#xAE30; &#xB54C;&#xBB38;&#xC5D0; &#xC18D;&#xC131; &#xBE44;&#xAD50;&#xB9CC; &#xD558;&#xB294; &#xAD6C;&#xC870;&#xC801; &#xD0C0;&#xC774;&#xD551;&#xC73C;&#xB860; &#xBC29;&#xBC95;&#xC774; &#xC5C6;&#xC2B5;&#xB2C8;&#xB2E4;. &#xC774;&#xB7F4; &#xB54C; &#xAC1C;&#xBC1C;&#xC790;&#xB4E4;&#xC740; &#xBE0C;&#xB79C;&#xB529;&#xC744; &#xC0AC;&#xC6A9;&#xD569;&#xB2C8;&#xB2E4;. &#xBE0C;&#xB79C;&#xB529; &#xAE30;&#xBC95;&#xC740; &#xBA85;&#xBAA9;&#xC801; &#xD0C0;&#xC785; &#xC2DC;&#xC2A4;&#xD15C;&#xC744; &#xAD6C;&#xD604;&#xD558;&#xB294; &#xBB18;&#xAE30;&#xC785;&#xB2C8;&#xB2E4;. &#xB2E4;&#xC2DC;&#xAE08; &#xAD6C;&#xC870;&#xC801; &#xD0C0;&#xC785; &#xC2DC;&#xC2A4;&#xD15C;&#xC758; &#xD55C;&#xACC4;&#xC810;&#xC744; &#xD655;&#xC778;&#xD574;&#xBD05;&#xC2DC;&#xB2E4;.</p><pre><code class="language-typescript">// Nominal Type System
type USD = { value: number };
type EUR = { value: number };

let dollors: USD = { value: 10; }
let euros: EUR = { value: 15; }
dollors = euros; // &#x274C; Error: USD&#xC640; EUR &#xD0C0;&#xC785;&#xC740; &#xB2E4;&#xB985;&#xB2C8;&#xB2E4;!

// Structural Type System
type USD = { value: number };
type EUR = { value: number };

let dollors: USD = { value: 10; }
let euros: EUR = { value: 15; }
dollors = euros; // &#x2705; OK: &quot;value&quot;&#xB77C;&#xB294; &#xC18D;&#xC131;&#xC744; &#xAC00;&#xC9C0;&#xACE0; &#xC788;&#xC73C;&#xB2C8; &#xD5C8;&#xC6A9;&#xD569;&#xB2C8;&#xB2E4;...&#xC774;&#xB7EC;&#xBA74; &#xC548; &#xB418;&#xB294;&#xB370;?
</code></pre><p>&#x2003;&#xBA85;&#xBAA9;&#xC801; &#xD0C0;&#xC785; &#xC2DC;&#xC2A4;&#xD15C;&#xC5D0;&#xC120; &#xC774;&#xB7F0; &#xCF00;&#xC774;&#xC2A4;&#xAC00; &#xBB38;&#xC81C;&#xB420; &#xC77C;&#xC774; &#xC5C6;&#xC9C0;&#xB9CC; &#xAD6C;&#xC870;&#xC801; &#xD0C0;&#xC785;&#xB9CC;&#xC73C;&#xB860; &#xC774; &#xBB38;&#xC81C;&#xB97C; &#xB2E4;&#xB8E8;&#xAE30; &#xC27D;&#xC9C0; &#xC54A;&#xC2B5;&#xB2C8;&#xB2E4;. &#xADF8;&#xB798;&#xC11C; &#xD0C0;&#xC785;&#xC2A4;&#xD06C;&#xB9BD;&#xD2B8;&#xB294; <strong>&#xBE0C;&#xB79C;&#xB529;</strong>&#xC774;&#xB77C;&#xB294; &#xBA85;&#xBAA9;&#xC801; &#xD0C0;&#xC785;&#xC744; &#xD749;&#xB0B4;&#xB0B4;&#xB294; &#xAE30;&#xBC95;&#xC744; &#xC0AC;&#xC6A9;&#xD569;&#xB2C8;&#xB2E4;.</p><pre><code class="language-typescript">type Brand&lt;K, T&gt; = K &amp; { __brand: T };
type USD = Brand&lt;number, &quot;dollors&quot;&gt;;
type EUR = Brand&lt;number, &quot;euros&quot;&gt;;

let dollors = 10 as USD; // number&#xAC00; &#xC544;&#xB2CC; USD &#xD0C0;&#xC785;&#xC73C;&#xB85C; &#xCDE8;&#xAE09;&#xD569;&#xB2C8;&#xB2E4;.
dollors.__brand; // undefined. &#xC22B;&#xC790;&#xBA74;&#xC11C; __brand &#xC18D;&#xC131;&#xB3C4; &#xAC00;&#xC9C4; &#xD2B9;&#xC774;&#xD55C; &#xD0C0;&#xC785;.
dollors = 20; // &#x274C; Error: &#xC77C;&#xBC18; &#xC22B;&#xC790;&#xB294; &#xD560;&#xB2F9; &#xBD88;&#xAC00;&#xB2A5;.
dollors = 1 as EUR; // &#x274C; Error: &#xC774;&#xB984;&#xC774; &#xB2E4;&#xB978; &#xD0C0;&#xC785;&#xC744; USD &#xD0C0;&#xC785;&#xC5D0; &#xD560;&#xB2F9;&#xD560; &#xC218; &#xC5C6;&#xC2B5;&#xB2C8;&#xB2E4;.
dollors = 100 as USD; // &#x2705; OK: USD &#xD0C0;&#xC785;&#xB9CC; &#xC7AC;&#xD560;&#xB2F9; &#xAC00;&#xB2A5;
</code></pre><p>&#x2003;USD&#xC640; EUR&#xC740; &#xC2E4;&#xC81C; &#xAC12;&#xC740; &#xC22B;&#xC790;&#xC774;&#xBA74;&#xC11C; as&#xB85C; EUR, USD&#xB77C;&#xACE0; &#xB2E8;&#xC5B8;&#xD55C; &#xD0C0;&#xC785;&#xB9CC; &#xD560;&#xB2F9;&#xC744; &#xD5C8;&#xC6A9;&#xD569;&#xB2C8;&#xB2E4;. <a href="https://www.typescriptlang.org/play?ssl=56&amp;ssc=18&amp;pln=42&amp;pc=1&amp;ref=blog.cinntiq.synology.me#code/PTAEEFQOwewWwJZQIYBtQBcCeAHApqAM5aEZ5yhx7JSGYAWyGo1AxvZrgQnQK5QIAjrzwAoEKBoATFgDc8UUAgBmnfHUbyGBQsiqgpTZKCwxeoVjVjNkhQggDmUcWGSsATjDtq8hAHSiLqAAKlwAyh4IOBgA5HTY+EQkZBQ8RBjuvKwYvO5oADSgAO70COyU1LRBKto+SnSEjPgyqAgA1gTGUllthQixdF09fqAAkqrIQQ4wXgSMg6joGPQ6ep0YGQgARrxkg4MGPYXLCko2qIQw1QfdrG0jAJpmFjSgqNTuinAw7nN4vwAuFgADz0OHeANImWyuTQAFoEkgHIEJMFSnRLIpNAQpHkils3G1CIVlD8QWD3tpfpJqZZCL4giV-p10u4kaAyVBeHAtv8XljkFpCPhWAg0BYYFAyMCbFAZKZeEEpJKYswijRmBgYHI+XBkB1arI0CJ4nlaMp-nktu8RgAxH5BPCguDgvAAlxBOGgUAAVXp7jGUBwu1AYU2UAcdAAFPxdBaAJSe73BM2EVBMBCS0PhyNJ33+sZSBQYFRlDNZgBy3N57kIefArFYvjowRgHSqQQA6gRMaAHHhmN9SBzVCdQEbUCJQMpPBRjLBECgllwgsRSORiv0OMZWhtKVt+iOQRljKwYEWAl28DFqdN2VrQLx6ZJFEgyLW8NlM0ufIUilvJEfARhDECQz1oE83yURQx1JdwKBgCZQBwTx8HcbAXkWPAZAAfRwrYzRkKNlh4a4JSgeQpW-eNilKco9Q6OhDwQF0vHsa0CAfWx7CcSQglgeDxShe9tWMAA1NAEEMMgpFGINdjDNkI0vBICAk1ppOwuTgwwRT2QAXlZdkADJQAAb1APCCOkIEACI-T5bSQwABS8Zh1Kk8soFs0AAF8AG4UTAbtN0WR9n2MZR+C-LMHxPc0fjnIyI0wK4JHEyTNNk+TdJzUAvR2TUVmQmAoKKH5lmgGASwjMjliYYpr2pAArJ9mBwshFiRHCQnCSJogYBr+jiTBMjwS9wOHCdPLIBz3Cc5hDKjJAdKBYSIxo-SAD5zNEb1JuYewXXeDysoW0BDJW3Y-F+cE3DwKNgAAHQAHmABxClswATIls+NAu9X4ck+IgWNdU6mC0nLJDocGZIWvSI0CgKgtACsYCKRr+QsX4IenaKS0lOgSjKDh-zCyVUCwSRGzwaIgjMAMoDwDGFyQcVVMKaQqqKgh+yZvJ0HWhwfAmwnmBQt8KzWC7QCjFAqCBWHIZ0hGHE2nazL28jLhtVAYAcOW1j+0RkaCe0AydCk8EKFZfhGy59FjZALWgnTp1nQCn3+Qo71qiRlk8XgHA4MdpukskuZORReXZNA9aKbDUtAXlkKUmT3VEA7XZDQzbLQf4MCjGIthgLYtipjBkA4wgYnjWzAqzsOIeyt3DKb2b-QW5acuNiWpSlqgo3b5XdmNoIAHkYOK6rbdARg5UKHBuPvYr+DhYeZCF1Kgj7jAB4IMn0DyHgWTPF0EHeC33E8dwM93-fu50seJCecxexxmRT3gFC8BWWgEC0DAeQ7hZAIGZkeE4SoVAWl+FKYoyASBJw8NQMgVVFzsy4MSF8MgTgIHcEEE8RY4SIWUExKeaQAAsAAGKhEo4BUDgXrFKABxfoAAJXgWx6iEBEO6EAQR6AbBwIQAEIAHBbk4X4M+wAACyZRPCXGUBgYAoR8ARDZNEYAPAeG+GAAAJioXoj06U5QMDSDgNy9RAIOBxodbkep3BYD4cAARQiREgEQOwNAAAvfOdwEBSPgMAVmS4ES4CRHCJAYT1D9WUaIIAA">TypeScript 5.2.2 playground</a>&#xC5D0;&#xC11C;&#xB294; &#xBCF4;&#xC548; &#xC704;&#xD5D8;&#xC774; &#xC788;&#xB294; &#xBB38;&#xC790;&#xC5F4; &#xC785;&#xB825; &#xB4F1; &quot;&#xD2B9;&#xBCC4;&#xD55C; &#xBB38;&#xC790;&#xC5F4;, &#xC22B;&#xC790;&#xAC12;&#xC744; &#xADF8;&#xB0E5; &#xCC98;&#xB9AC;&#xD558;&#xBA74; &#xC548; &#xB420; &#xB54C;&quot; &#xC4F0;&#xBA74; &#xC720;&#xC6A9;&#xD558;&#xB2E4;&#xACE0; &#xC11C;&#xC220;&#xD569;&#xB2C8;&#xB2E4;.<br>&#x2003;&#xC544;&#xB798;&#xB294; &#xBE0C;&#xB79C;&#xB529; &#xAE30;&#xBC95;&#xC744; &#xD65C;&#xC6A9;&#xD574;&#xC11C; XSS(Cross-Site Scripting) &#xCC98;&#xB9AC;&#xB97C; &#xD558;&#xB294; &#xAC04;&#xB2E8;&#xD55C; &#xC608;&#xC2DC;&#xC785;&#xB2C8;&#xB2E4;. </p><pre><code class="language-typescript">type ValidatedInputString = string &amp; { __brand: &quot;User Input Post Validation&quot; };

// &#xC785;&#xB825; &#xAE00;&#xC790;&#xC5D0; &#xCF54;&#xB4DC; &#xC2E4;&#xD589;&#xBB38;&#xC774; &#xC788;&#xB2E4;&#xBA74; &#xD544;&#xD130;&#xB9C1;&#xD558;&#xACE0;, branding &#xCC98;&#xB9AC;&#xD55C; string&#xC744; return&#xD569;&#xB2C8;&#xB2E4;.
const validateUserInput = (input: string) =&gt; {
  const simpleValidatedInput = input.replace(/\&lt;/g, &quot;&#x2264;&quot;);
  return simpleValidatedInput as ValidatedInputString;
};

// &#xAC80;&#xC99D;&#xB41C; branding &#xBB38;&#xC790;&#xC5F4;&#xB9CC; &#xBC1B;&#xC544;&#xC11C; &#xCD9C;&#xB825;&#xD569;&#xB2C8;&#xB2E4;.
const printName = (name: ValidatedInputString) =&gt; {
  console.log(name);
};

// &#xCF54;&#xB4DC; &#xC2E4;&#xD589;&#xD558;&#xB294; &#xBB38;&#xC790;&#xC5F4; 
const input = &quot;alert(&apos;bobby tables&apos;)&quot;;

// &#xAC80;&#xC99D;&#xC744; &#xAC70;&#xCE5C; &#xBB38;&#xC790;&#xC5F4;
const validatedInput = validateUserInput(input);

printName(validatedInput); // &#x2705; OK: &#xAC80;&#xC99D; &#xD6C4; &#xBE0C;&#xB79C;&#xB529; &#xCC98;&#xB9AC;&#xB41C; string&#xC774;&#xBBC0;&#xB85C; &#xC815;&#xC0C1; &#xCC98;&#xB9AC;
printName(input); // &#x274C; Error: &#xAC80;&#xC99D; &#xC548; &#xB41C;(&#xBE0C;&#xB79C;&#xB529;&#xC774; &#xC548; &#xB41C;) &#xC77C;&#xBC18; string&#xC740; &#xC2E4;&#xD589; &#xAC70;&#xBD80;
</code></pre><h2 id="%EB%A7%88%EB%AC%B4%EB%A6%AC">&#xB9C8;&#xBB34;&#xB9AC;</h2><blockquote>&#x2003;&#xD0C0;&#xC785;&#xC2A4;&#xD06C;&#xB9BD;&#xD2B8;&#xC758; &#xAD6C;&#xC870;&#xC801; &#xD0C0;&#xC785; &#xC2DC;&#xC2A4;&#xD15C;&#xC740; &#xC720;&#xC5F0;&#xD55C; &#xCF54;&#xB4DC;&#xB97C; &#xB3D5;&#xC9C0;&#xB9CC; &#xAC1C;&#xBC1C;&#xC790;&#xC758; &#xC8FC;&#xC758;&#xB97C; &#xC804;&#xC81C;&#xD569;&#xB2C8;&#xB2E4;. &#xB9CE;&#xC774; &#xC0AC;&#xC6A9;&#xD558;&#xBA74;&#xC11C; &#xC775;&#xC219;&#xD574;&#xC9D1;&#xC2DC;&#xB2E4;.</blockquote><h3 id="%EC%B0%B8%EC%A1%B0">&#xCC38;&#xC870;</h3><ul><li>&#xC870;&#xD604;&#xC601;(2023.08). &#xD0C0;&#xC785;&#xC2A4;&#xD06C;&#xB9BD;&#xD2B8; &#xAD50;&#xACFC;&#xC11C;. &#xAE38;&#xBC97;</li><li><a href="https://toss.tech/article/typescript-type-compatibility?ref=blog.cinntiq.synology.me">&#xAE40;&#xBCD1;&#xBB35;(2022.10). TypeScript &#xD0C0;&#xC785; &#xC2DC;&#xC2A4;&#xD15C; &#xB72F;&#xC5B4;&#xBCF4;&#xAE30;: &#xD0C0;&#xC785; &#xD638;&#xD658;&#xC131;. toss tech</a></li><li><a href="https://www.typescriptlang.org/?ref=blog.cinntiq.synology.me">TypeScript &#xACF5;&#xC2DD;</a></li></ul>]]></content:encoded></item><item><title><![CDATA[테마, 캔버스, 애니메이션]]></title><description><![CDATA[캔버스로 애니메이션을 만들어서 사용해봅니다]]></description><link>https://blog.cinntiq.synology.me/canvas/</link><guid isPermaLink="false">640822c563bc770001336932</guid><category><![CDATA[JavaScript]]></category><category><![CDATA[code]]></category><dc:creator><![CDATA[Hameln]]></dc:creator><pubDate>Thu, 09 Mar 2023 10:14:37 GMT</pubDate><media:content url="https://blog.cinntiq.synology.me/content/images/2024/01/javascript-2.png" medium="image"/><content:encoded><![CDATA[<img src="https://blog.cinntiq.synology.me/content/images/2024/01/javascript-2.png" alt="&#xD14C;&#xB9C8;, &#xCE94;&#xBC84;&#xC2A4;, &#xC560;&#xB2C8;&#xBA54;&#xC774;&#xC158;"><p>&#x2003;HTML&#xC5D0;&#xC11C; &#xCE94;&#xBC84;&#xC2A4;&#xB294; &#xC560;&#xB2C8;&#xBA54;&#xC774;&#xC158;, &#xADF8;&#xB9BC; &#xAD6C;&#xD604;&#xC5D0; &#xD2B9;&#xD654;&#xB41C; &#xAC15;&#xB825;&#xD55C; &#xB3C4;&#xAD6C;&#xC785;&#xB2C8;&#xB2E4;.</p><ol><li>&#xD14C;&#xB9C8; &#xBC84;&#xD2BC; &#xAD6C;&#xC0C1;<br>a. &#xB514;&#xC790;&#xC778;</li><li>&#xAD6C;&#xD604;<br>a. &#xAE30;&#xBCF8; &#xC0C1;&#xD0DC;, hover<br>b. &#xC560;&#xB2C8;&#xBA54;&#xC774;&#xC158; &#xC900;&#xBE44;<br>c. &#xC560;&#xB2C8;&#xBA54;&#xC774;&#xC158; &#xC2E4;&#xD589;<br>d. &#xACB0;&#xACFC;</li><li>&#xD14C;&#xB9C8; &#xBCC0;&#xACBD;</li><li>&#xD30C;&#xC77C; &#xAD6C;&#xC870;</li><li>&#xB9C8;&#xBB34;&#xB9AC;</li><li>&#xC5F0;&#xAD00; &#xD3EC;&#xC2A4;&#xD305;</li></ol><h2 id="1-%ED%85%8C%EB%A7%88-%EB%B2%84%ED%8A%BC-%EA%B5%AC%EC%83%81">1. &#xD14C;&#xB9C8; &#xBC84;&#xD2BC; &#xAD6C;&#xC0C1;</h2><blockquote><em>&#x201C;&#xBC84;&#xD2BC;&#xC744; &#xD074;&#xB9AD;&#xD558;&#xBA74; &#xD14C;&#xB9C8;&#xAC00; &#xB2E4;&#xD06C; &#xBAA8;&#xB4DC;, &#xB77C;&#xC774;&#xD2B8; &#xBAA8;&#xB4DC;&#xB85C; &#xBC14;&#xB00C;&#xACE0;, &#xC560;&#xB2C8;&#xBA54;&#xC774;&#xC158;&#xC744; &#xBCF4;&#xC5EC;&#xC8FC;&#xACE0; &#xC2F6;&#xB2E4;.&#x201D;</em></blockquote><h3 id="a-%EB%94%94%EC%9E%90%EC%9D%B8">a. &#xB514;&#xC790;&#xC778;</h3><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://blog.cinntiq.synology.me/content/images/2023/03/20230309001.jpg" class="kg-image" alt="&#xD14C;&#xB9C8;, &#xCE94;&#xBC84;&#xC2A4;, &#xC560;&#xB2C8;&#xBA54;&#xC774;&#xC158;" loading="lazy" width="374" height="328"><figcaption>1&#xCC28; &#xAD6C;&#xC0C1;</figcaption></figure><p>&#x2003;&#xBC84;&#xD2BC;&#xC744; &#xB204;&#xB974;&#xBA74; &#xB9D0;&#xD48D;&#xC120;&#xC774; &#xD280;&#xC5B4;&#xB098;&#xC624;&#xBA74;&#xC11C; &#xB2E4;&#xD06C; &#xBAA8;&#xB4DC; &#xC560;&#xB2C8;&#xBA54;&#xC774;&#xC158;&#xACFC; &#xD0C0;&#xC774;&#xD3EC;&#xADF8;&#xB798;&#xD53C;&#xB97C; &#xBCF4;&#xC5EC;&#xC8FC;&#xB294; &#xAC74; &#xC5B4;&#xB5A8;&#xAE4C;? <br>&#x2003;&#x2192; &#xB9D0;&#xD48D;&#xC120;&#xC740; &#xB300;&#xD654;&#xD615; &#xC0C1;&#xD638; &#xC791;&#xC6A9;&#xC5D0; &#xC801;&#xD569;&#xD558;&#xC9C0; &#xC54A;&#xC744;&#xAE4C;? &#xC0AC;&#xC6A9;&#xC790;&#xAC00; &#xBAA8;&#xB4DC; &#xBC84;&#xD2BC;&#xC744; &#xD1B5;&#xD574; &#xB300;&#xD654;, &#xD639;&#xC740; &#xBE44;&#xC2B7;&#xD55C; &#xC0C1;&#xD638; &#xC791;&#xC6A9;&#xC744; &#xD560; &#xC77C;&#xC740; &#xC5C6;&#xB2E4;. &#xB2E4;&#xB978; &#xAC78; &#xD574;&#xBCF4;&#xC790;.</p><figure class="kg-card kg-image-card"><img src="https://blog.cinntiq.synology.me/content/images/2023/03/20230310001.jpg" class="kg-image" alt="&#xD14C;&#xB9C8;, &#xCE94;&#xBC84;&#xC2A4;, &#xC560;&#xB2C8;&#xBA54;&#xC774;&#xC158;" loading="lazy" width="953" height="347" srcset="https://blog.cinntiq.synology.me/content/images/size/w600/2023/03/20230310001.jpg 600w, https://blog.cinntiq.synology.me/content/images/2023/03/20230310001.jpg 953w" sizes="(min-width: 720px) 720px"></figure><p>&#x2003;&#xBC84;&#xD2BC;&#xC744; hover&#xD558;&#xBA74; &#xD654;&#xBA74;&#xC744; &#xCF1C;&#xB294; &#xB4EF;&#xD55C; &#xD6A8;&#xACFC;&#xB97C; &#xB098;&#xD0C0;&#xB0B4;&#xACE0; &#xD074;&#xB9AD;&#xD558;&#xBA74; &#xC2DC;&#xAC04;&#xC774; &#xD750;&#xB974;&#xB4EF; &#xC560;&#xB2C8;&#xBA54;&#xC774;&#xC158;&#xC744; &#xB098;&#xD0C0;&#xB0B4;&#xBCF4;&#xC790;. &#xBCF5;&#xACE0;&#xD48D; &#xAC8C;&#xC784; &#xC0AC;&#xC6A9;&#xAC10;&#xC744; &#xC8FC;&#xACE0; &#xC2F6;&#xB2E4;.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://blog.cinntiq.synology.me/content/images/2023/03/20230310002-1.webp" class="kg-image" alt="&#xD14C;&#xB9C8;, &#xCE94;&#xBC84;&#xC2A4;, &#xC560;&#xB2C8;&#xBA54;&#xC774;&#xC158;" loading="lazy" width="180" height="212"><figcaption>hover &#xD50C;&#xB85C;&#xC6B0; (figma)</figcaption></figure><h2 id="2-%EA%B5%AC%ED%98%84">2. &#xAD6C;&#xD604;</h2><h3 id="a-%EA%B8%B0%EB%B3%B8-%EC%83%81%ED%83%9C-hover">a. &#xAE30;&#xBCF8; &#xC0C1;&#xD0DC;, hover</h3><figure class="kg-card kg-image-card"><img src="https://blog.cinntiq.synology.me/content/images/2023/03/20230314001.webp" class="kg-image" alt="&#xD14C;&#xB9C8;, &#xCE94;&#xBC84;&#xC2A4;, &#xC560;&#xB2C8;&#xBA54;&#xC774;&#xC158;" loading="lazy" width="357" height="308"></figure><p>&#x2003;&#xBA3C;&#xC800; moon&#xC744; &#xADF8;&#xB824;&#xC11C; &#xC815;&#xBCF4;&#xB9CC; &#xAC00;&#xC838;&#xC628; &#xB4A4;, &#xBC14;&#xB85C; sun&#xC744; &#xADF8;&#xB9B0;&#xB2E4;. &#xB9E4;&#xC6B0; &#xBE60;&#xB974;&#xAC8C; &#xC9C4;&#xD589;&#xD558;&#xAE30; &#xB54C;&#xBB38;&#xC5D0; &#xC0AC;&#xC6A9;&#xC790;&#xAC00; moon&#xC744; &#xBCFC; &#xC77C;&#xC740; &#xC5C6;&#xB2E4;. &#xC774;&#xB807;&#xAC8C; &#xD574;&#xC11C; &#xCD08;&#xAE30; &#xD654;&#xBA74;&#xC774; &#xAD6C;&#xC131;&#xB410;&#xB2E4;. &#xC774;&#xC81C; &#xC560;&#xB2C8;&#xBA54;&#xC774;&#xC158;&#xC744; &#xAD6C;&#xD604;&#xD574;&#xBCF4;&#xC790;.</p><h3 id="b-%EC%95%A0%EB%8B%88%EB%A9%94%EC%9D%B4%EC%85%98-%EC%A4%80%EB%B9%84">b. &#xC560;&#xB2C8;&#xBA54;&#xC774;&#xC158; &#xC900;&#xBE44;</h3><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://blog.cinntiq.synology.me/content/images/2023/03/20230309004.jpg" class="kg-image" alt="&#xD14C;&#xB9C8;, &#xCE94;&#xBC84;&#xC2A4;, &#xC560;&#xB2C8;&#xBA54;&#xC774;&#xC158;" loading="lazy" width="560" height="231"><figcaption>&#xCE94;&#xBC84;&#xC2A4;&#xB294; &#xC5EC;&#xB7EC; &#xD53D;&#xC140;&#xB4E4;&#xC744; &#xC870;&#xC791;&#xD574;&#xC11C; &#xADF8;&#xB824;&#xB0B8;&#xB2E4;.</figcaption></figure><p>&#x2003;&#xAC00;&#xB85C; 140, &#xC138;&#xB85C; 80&#xB9CC; &#xD574;&#xB3C4; &#xD53D;&#xC140;&#xC774; 11,200&#xB2E4;. &#xC6D0;&#xD558;&#xB294; &#xC560;&#xB2C8;&#xBA54;&#xC774;&#xC158;&#xC744; &#xAD6C;&#xD604;&#xD558;&#xB824;&#xBA74; &#xC785;&#xC790;&#xB4E4;&#xC774; &#xC774; &#xACF5;&#xAC04;&#xC744; &#xC804;&#xBD80; &#xCE60;&#xD560; &#xC218; &#xC788;&#xB3C4;&#xB85D; &#xAD6C;&#xC0C1;&#xD574;&#xC57C; &#xD55C;&#xB2E4;. 1&#xAC1C;&#xC758; &#xC785;&#xC790;&#xB9CC;&#xC73C;&#xB85C;&#xB3C4; &#xAD6C;&#xD604;&#xD560; &#xC218; &#xC788;&#xC9C0;&#xB9CC;, &#xC5EC;&#xB7EC; &#xAC1C;&#xC758; &#xC785;&#xC790;&#xB4E4;&#xB85C; &#xCE94;&#xBC84;&#xC2A4;&#xB97C; &#xCE60;&#xD558;&#xACE0; &#xC2F6;&#xB2E4;. &#xC774;&#xB7F4; &#xB54C;&#xC5D0;&#xB294; &#xB3D9;&#xC77C;&#xD55C; &#xB85C;&#xC9C1;&#xC744; &#xAC00;&#xC9C4; &#xAC1D;&#xCCB4;&#xB97C; &#xC5EC;&#xB7FF; &#xB9CC;&#xB4E4;&#xC5B4;&#xC57C; &#xD558;&#xBBC0;&#xB85C; &#xD074;&#xB798;&#xC2A4;&#xAC00; &#xC801;&#xD569;&#xD558;&#xB2E4;.</p><ul><li>&#xC0C1;&#xD0DC;: &#xCE94;&#xBC84;&#xC2A4; &#xCEE8;&#xD14D;&#xC2A4;&#xD2B8;, &#xCE94;&#xBC84;&#xC2A4; &#xAC00;&#xB85C;, &#xC138;&#xB85C;, &#xC785;&#xC790;&#xB97C; &#xCE60;&#xD560; &#xAC01;&#xB3C4;, &#xC88C;&#xD45C;, &#xC0C9;, &#xC18D;&#xB3C4;, &#xBC29;&#xD5A5;, &#xBC18;&#xC9C0;&#xB984;</li><li>&#xC561;&#xC158;: &#xC0C1;&#xD0DC; &#xBCC0;&#xACBD;(update), &#xCE94;&#xBC84;&#xC2A4;&#xC5D0; &#xADF8;&#xB9AC;&#xAE30;(draw)</li></ul><pre><code class="language-js">class Particle {
  constructor(ctx, WIDTH, HEIGHT) {
    this.ctx = ctx;
    this.WIDTH = WIDTH;
    this.HEIGHT = HEIGHT;
    this.fullAngle = Math.PI * 2;
    this.x = Math.random() * this.WIDTH;
    this.y = Math.random() * this.HEIGHT;
    this.r = 5;
    this.speed = 1;
    this.direction = this.x &gt; 63 ? 1 : -1;
    this.px = Math.floor(this.x);
    this.py = Math.floor(this.y);
  }

  update(phaseSign) {
    this.speed = this.speed &lt;= 0.1 ? 0.1 : this.speed - 0.004;
    this.x += this.direction * this.speed;
    this.r = this.r &lt;= 1 ? 1 : this.r - 0.04;

    if (this.x &lt;= 0 || this.x &gt; this.WIDTH) {
      this.x = Math.random() * this.WIDTH;
      this.y = Math.random() * this.HEIGHT;
      this.direction *= -1;
      if (this.speed &lt; 0.2 &amp;&amp; phaseSign &gt; 0) {
        this.y = this.HEIGHT / 2 + this.y / 2;
        this.r = 2;
      }
    }
    this.px = Math.floor(this.x);
    this.py = Math.floor(this.y);
  }

  draw(phase) {
    this.ctx.beginPath();
    this.ctx.fillStyle = phase[this.py][this.px];
    this.ctx.arc(this.x, this.y, this.r, 0, this.fullAngle);
    this.ctx.fill();
  }
}</code></pre><p>&#x2003;&#xCE94;&#xBC84;&#xC2A4; &#xCEE8;&#xD14D;&#xC2A4;&#xD2B8;&#xC5D0;&#xC11C; &#xC9C0;&#xC6D0;&#xD558;&#xB294; getImageData API&#xB97C; &#xC4F0;&#xBA74; &#xC774;&#xBBF8;&#xC9C0;&#xB97C; &#xAD6C;&#xC131;&#xD558;&#xB294; &#xAC01; &#xD53D;&#xC140;&#xB4E4;&#xC758; rgba &#xC815;&#xBCF4;&#xB97C; &#xC54C; &#xC218; &#xC788;&#xB2E4;.</p><figure class="kg-card kg-image-card"><img src="https://blog.cinntiq.synology.me/content/images/2023/03/20230309003.jpg" class="kg-image" alt="&#xD14C;&#xB9C8;, &#xCE94;&#xBC84;&#xC2A4;, &#xC560;&#xB2C8;&#xBA54;&#xC774;&#xC158;" loading="lazy" width="560" height="463"></figure><pre><code class="language-js">    const getRgbsFromImageData = (imageArray, WIDTH, HEIGHT) =&gt; {
      const colorMap = [];
      for (let y = 0; y &lt; HEIGHT; y++) {
        const row = [];
        for (let x = 0; x &lt; WIDTH; x++) {
          const r = imageArray.data[y * 4 * imageArray.width + x * 4];
          const g = imageArray.data[y * 4 * imageArray.width + x * 4 + 1];
          const b = imageArray.data[y * 4 * imageArray.width + x * 4 + 2];
          const color = `rgb(${r},${g},${b})`;
          row.push(color);
        }
        colorMap.push(row);
      }
      return colorMap;
    };</code></pre><p>&#x2003;&#xC774;&#xC81C; &#xC560;&#xB2C8;&#xBA54;&#xC774;&#xC158;&#xC744; &#xC2E4;&#xD589;&#xD560; &#xC785;&#xC790;&#xB97C; &#xBA87; &#xAC1C; &#xB9CC;&#xB4E4;&#xC9C0; &#xC815;&#xD55C;&#xB2E4;.</p><figure class="kg-card kg-code-card"><pre><code class="language-js">  const init = (ctx, WIDTH, HEIGHT) =&gt; {
    return Array.from(
      { length: WIDTH },
      () =&gt; new Particle(ctx, WIDTH, HEIGHT)
    );
  };</code></pre><figcaption>&#xAC00;&#xB85C; &#xAE38;&#xC774; &#xB9CC;&#xD07C;&#xB9CC; &#xC0DD;&#xC131;&#xD558;&#xB3C4;&#xB85D; &#xC124;&#xC815;.</figcaption></figure><p>&#x2003;&#xC900;&#xBE44;&#xAC00; &#xB05D;&#xB0AC;&#xB2E4;. &#xC560;&#xB2C8;&#xBA54;&#xC774;&#xC158;&#xC744; &#xAD6C;&#xD604;&#xD574;&#xBCF4;&#xC790;.</p><h3 id="c-%EC%95%A0%EB%8B%88%EB%A9%94%EC%9D%B4%EC%85%98-%EC%8B%A4%ED%96%89">c. &#xC560;&#xB2C8;&#xBA54;&#xC774;&#xC158; &#xC2E4;&#xD589;</h3><pre><code class="language-js">  const animate = () =&gt; {
    if (!onAnimate) return;
    particles.map(setParticle);
    requestAnimationFrame(animate);
  };

  const setParticle = (particle) =&gt; {
    particle.update(phaseSign);
    particle.draw(phase);
  };</code></pre><ol><li>onAnimate&#xAC00; false&#xC774;&#xBA74; &#xC560;&#xB2C8;&#xBA54;&#xC774;&#xC158;&#xC744; &#xBA48;&#xCD98;&#xB2E4;.</li><li>true&#xC774;&#xBA74; &#xD504;&#xB808;&#xC784;&#xB9C8;&#xB2E4; &#xC560;&#xB2C8;&#xBA54;&#xC774;&#xC158;&#xC744; &#xC9C4;&#xD589;&#xD55C;&#xB2E4;.</li></ol><h3 id="d-%EA%B2%B0%EA%B3%BC">d. &#xACB0;&#xACFC;</h3><figure class="kg-card kg-image-card"><img src="https://blog.cinntiq.synology.me/content/images/2023/03/20230315002-1.webp" class="kg-image" alt="&#xD14C;&#xB9C8;, &#xCE94;&#xBC84;&#xC2A4;, &#xC560;&#xB2C8;&#xBA54;&#xC774;&#xC158;" loading="lazy" width="302" height="281"></figure><p>&#x2003; &#xC774; &#xACB0;&#xACFC;&#xB97C; &#xC5BB;&#xAE30;&#xAE4C;&#xC9C0; &#xACFC;&#xC815;&#xC774; &#xC21C;&#xD0C4;&#xD558;&#xC9C0;&#xB9CC;&#xC740; &#xC54A;&#xC558;&#xB294;&#xB370; &#xC911;&#xAC04;&#xC5D0; &#xC5D0;&#xB7EC;&#xAC00; &#xBC1C;&#xC0DD;&#xD588;&#xB2E4;. &#xD074;&#xB9AD;&#xD560;&#xC218;&#xB85D; &#xC560;&#xB2C8;&#xBA54;&#xC774;&#xC158;&#xC774; &#xB108;&#xBB34; &#xBE68;&#xB77C;&#xC9C0;&#xB294; &#xD604;&#xC0C1;&#xC774;&#xC5C8;&#xACE0;, &#xBB50;&#xAC00; &#xC6D0;&#xC778;&#xC778;&#xC9C0; &#xBAB0;&#xB77C;&#xC11C; &#xC774;&#xD2C0;&#xC744; &#xD5E4;&#xB9E4;&#xB2E4;&#xAC00; &#xC790;&#xB824;&#xACE0; &#xB204;&#xC6E0;&#xC744; &#xB54C; &#xC5B4;&#xB5A4; &#xC0DD;&#xAC01;&#xC774; &#xB1CC;&#xB9AC;&#xB97C; &#xC2A4;&#xCCE4;&#xB2E4;. <br>&#x2003;&#x2018;&#xC774;&#xBCA4;&#xD2B8; &#xB8E8;&#xD504; &#xBB38;&#xC81C;&#xC77C; &#xC218; &#xC788;&#xACA0;&#xB2E4;.&#x2019; <br>&#x2003;&#xC815;&#xB9D0;&#xB85C; &#xADF8;&#xB7F0; &#xBB38;&#xC81C;&#xC600;&#xACE0;, &#xD574;&#xACB0;&#xD55C; &#xB0B4;&#xC6A9;&#xC740; <a href="https://blog.cinntiq.synology.me/event-loop/">&#xC774;&#xBCA4;&#xD2B8; &#xB8E8;&#xD504;(&#xC2A4;&#xD0DD;, &#xD050;, &#xB80C;&#xB354;)</a> &#xD3EC;&#xC2A4;&#xD305; rAF &#xBAA9;&#xCC28;&#xC5D0; &#xC791;&#xC131;&#xD588;&#xB2E4;.</p><h2 id="3-%ED%85%8C%EB%A7%88-%EB%B3%80%EA%B2%BD">3. &#xD14C;&#xB9C8; &#xBCC0;&#xACBD;</h2><p>&#x2003;&#xB0B4;&#xAC00; &#xC544;&#xB294; &#xBC29;&#xBC95;&#xC740; &#xBC84;&#xD2BC;&#xC744; &#xD074;&#xB9AD;&#xD560; &#xB54C; &#xAC01; &#xC5D8;&#xB9AC;&#xBA3C;&#xD2B8;&#xB4E4;&#xC774; &#xD074;&#xB798;&#xC2A4;&#xAC00; &#xBC14;&#xB00C;&#xBA74;&#xC11C; CSS&#xAC00; &#xBCC0;&#xACBD;&#xB418;&#xB294; &#xAC83; &#xBFD0;&#xC774;&#xC5C8;&#xB2E4;. &#xD558;&#xC9C0;&#xB9CC; &#xB2E4;&#xD06C; &#xBAA8;&#xB4DC;, &#xB77C;&#xC774;&#xD2B8; &#xBAA8;&#xB4DC;&#xB294; &#xC5EC;&#xB7EC; &#xC5D8;&#xB9AC;&#xBA3C;&#xD2B8; CSS&#xAC00; &#xBC14;&#xB00C;&#xAE30; &#xB54C;&#xBB38;&#xC5D0; &#xADF8;&#xB7F0; &#xAC78; &#xC77C;&#xC77C;&#xC774; &#xB2E4;&#xD06C; &#xBAA8;&#xB4DC;&#xB85C; &#xC9C0;&#xC815;&#xD558;&#xAE30;&#xC5D4; &#xC190;&#xC774; &#xB9CE;&#xC774; &#xAC04;&#xB2E4;. <br>&#x2003;&#xD504;&#xB85C;&#xADF8;&#xB798;&#xBC0D;&#xC5D0;&#xB294; &#xC5EC;&#xB7EC; &#xC6D0;&#xCE59;&#xC774; &#xC788;&#xC9C0;&#xB9CC; &#xC694;&#xC998; &#xD2B9;&#xD788; &#xB9C8;&#xC74C;&#xC5D0; &#xB4DC;&#xB294; &#xC6D0;&#xCE59;&#xC740; ETC(Easy To Change) &#xC6D0;&#xCE59;&#xC774;&#xB2E4;. &#xBB54;&#xAC00;&#xB97C; &#xBC14;&#xAFD4;&#xC57C;&#xD560; &#xB550; &#xB178;&#xAC00;&#xB2E4;&#xAC00; &#xB418;&#xC5B4;&#xC120; &#xC548; &#xB41C;&#xB2E4;. <br>&#x2003;Styled-Components&#xC5D0;&#xC11C; &#xAE00;&#xB85C;&#xBC8C; theme&#xC744; &#xC801;&#xC6A9;&#xD558;&#xBA74; &#xD574;&#xACB0; &#xAC00;&#xB2A5;&#xD558;&#xB4EF;, &#xC77C;&#xBC18; CSS&#xB85C;&#xB3C4; &#xAC19;&#xC740; &#xBC29;&#xBC95;&#xC774; &#xAC00;&#xB2A5;&#xD558;&#xB2E4;. &#xC544;&#xB798;&#xC640; &#xAC19;&#xC774; &#xC791;&#xC131;&#xD588;&#xB2E4;.</p><pre><code class="language-css">:root,
[data-theme=&quot;default&quot;] {
  --pale-black: #2d2d2d;
  --pale-gray: #ccc;
  --pale-white: #f8f8f8;
  --font-size-xs: 14px;
  --font-size-s: 16px;
  --font-size-m: 18px;
  --font-size-l: 20px;
  --font-size-xl: 24px;
  --title-size-xl: 32px;
  --title-size-l: 30px;
  --title-size-m: 28px;
  --title-size-s: 26px;
  --border-radius-s: 4px;
  --border-radius-m: 6px;
  --border-radius-l: 8px;
  --border-radius-full: 50%;
  --body-bg-color: #fff;
  --text-color: #333;
  --button-shadow: 2px 2px 4px rgba(20, 20, 20, 0.6);
  --button-background-color: var(--pale-white);
  --button-change-background-color: white;
}

[data-theme=&quot;dark&quot;] {
  --body-bg-color: #444352;
  --text-color: #efefef;
  --button-shadow: 2px 2px 4px rgba(233, 230, 59, 0.6);
  --button-background-color: var(--pale-gray);
  --button-change-background-color: rgba(27, 27, 27, 0.4);
}</code></pre><pre><code class="language-css">.mode__frame {
  position: absolute;
  display: flex;
  justify-content: center;
  align-items: center;
  width: 148px;
  height: 92px;
  padding: 4px;
  background-color: var(--body-bg-color);
  border: 2px solid var(--text-color);
  border-radius: var(--border-radius-m);
  animation: display-frame 0.6s ease-in-out;
  transition: background-color 0.4s, border-color 0.4s;
}</code></pre><p>&#x2003;transition-property&#xB294; &#xAD6C;&#xCCB4;&#xC801;&#xC73C;&#xB85C; &#xC9C0;&#xC815;&#xD558;&#xB294; &#xAC8C; &#xC88B;&#xB2E4;. &#xD6A8;&#xC728;&#xB3C4; &#xD6A8;&#xC728;&#xC774;&#xACE0; &#xC758;&#xB3C4;&#xD558;&#xC9C0; &#xC54A;&#xC740; &#xD6A8;&#xACFC;&#xAC00; &#xB098;&#xD0C0;&#xB0A0; &#xC218;&#xB3C4; &#xC788;&#xB2E4;. (&#xC774;&#xBC88;&#xC5D0; &#xC798; &#xAE68;&#xB2EC;&#xC558;&#xB2E4;.)</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://blog.cinntiq.synology.me/content/images/2023/03/20230315009.jpg" class="kg-image" alt="&#xD14C;&#xB9C8;, &#xCE94;&#xBC84;&#xC2A4;, &#xC560;&#xB2C8;&#xBA54;&#xC774;&#xC158;" loading="lazy" width="326" height="122"><figcaption>&#xD604;&#xC7AC; &#xD504;&#xB85C;&#xC81D;&#xD2B8; &#xC5B8;&#xC5B4;&#xBCC4; &#xBE44;&#xC911;</figcaption></figure><p>&#x2003;JS&#xB294; &#xBB3C;&#xB860; &#xC88B;&#xB2E4;. &#xD558;&#xC9C0;&#xB9CC; HTML, CSS&#xB3C4; &#xC0AC;&#xC6A9;&#xD558;&#xAE30;&#xC5D0; &#xB530;&#xB77C;&#xC11C;&#xB294; &#xB6F0;&#xC5B4;&#xB09C; &#xB3C4;&#xAD6C;&#xC774;&#xAE30; &#xB54C;&#xBB38;&#xC5D0; &#xC774;&#xBC88; &#xD504;&#xB85C;&#xC81D;&#xD2B8;&#xC5D0;&#xC11C;&#xB294; HTML &#xD0DC;&#xADF8;, CSS &#xD6A8;&#xACFC;&#xB3C4; &#xC801;&#xADF9; &#xD65C;&#xC6A9;&#xD558;&#xB294; &#xBC29;&#xD5A5;&#xC744; &#xC9C0;&#xD5A5;&#xD55C;&#xB2E4;.</p><pre><code class="language-js">  const setup = () =&gt; {
    const light = () =&gt; {
      const body = document.querySelector(&quot;body&quot;);
      body.removeAttribute(&quot;data-theme&quot;);
    };

    const dark = () =&gt; {
      const body = document.querySelector(&quot;body&quot;);
      body.setAttribute(&quot;data-theme&quot;, &quot;dark&quot;);
    };

    const sunImage = &quot;./public/img/sun.png&quot;;
    const moonImage = &quot;./public/img/moon.png&quot;;
    const phaseMap = new Map();
    phaseMap.set(1, [sunImage, light]);
    phaseMap.set(-1, [moonImage, dark]);
    return phaseMap;
  };

  const changeTheme = (themeSign) =&gt; {
    phaseMap.get(themeSign)[1]();
  };  

  const setThemeSign = (newThemeSign) =&gt; {
    if (themeSign !== newThemeSign) {
      themeSign = newThemeSign;
      changeTheme(themeSign);
      changeButtonImage(themeSign);
    }
  };

  const handleThemeSign = () =&gt; {
    setThemeSign(-themeSign);
  };</code></pre><p>&#x2003;theme &#xBCC0;&#xACBD;&#xD558;&#xB294; &#xD568;&#xC218;&#xB294; map&#xC758; &#xD504;&#xB85C;&#xD37C;&#xD2F0;&#xB85C; &#xBCF4;&#xAD00;&#xD588;&#xB2E4;. map&#xC740; key&#xB97C; &#xC5EC;&#xB7EC; &#xD0C0;&#xC785;&#xC73C;&#xB85C; &#xC9C0;&#xC815;&#xD560; &#xC218; &#xC788;&#xB2E4;. &#xC6D0;&#xB798;&#xB294; &#xC77C;&#xBC18; &#xAC1D;&#xCCB4;&#xB97C; &#xC4F0;&#xB824;&#xACE0; &#xD588;&#xB294;&#xB370; &#xAC1D;&#xCCB4;&#xB294; key &#xAC12;&#xC774; &#xBB38;&#xC790;&#xC5F4;&#xC774;&#xB77C;&#xC11C; &#xC870;&#xD68C;&#xAC00; &#xBD88;&#xD3B8;&#xD558;&#xB2E4;&#xB294; &#xC0DD;&#xAC01;&#xC774; &#xB4E4;&#xC5C8;&#xACE0;, map&#xC774; &#xAD1C;&#xCC2E;&#xACA0;&#xB2E4; &#xC2F6;&#xC5B4;&#xC11C; &#xC120;&#xD0DD;&#xD588;&#xB2E4;.<br>&#x2003;&#xBC84;&#xD2BC;&#xC774; &#xB20C;&#xB9B4; &#xB54C;&#xB9C8;&#xB2E4; sign&#xC740; -1&#xC774; &#xACF1;&#xD574;&#xC9C0;&#xACE0;, sign&#xC774; &#xBC14;&#xB00C;&#xBA74; map&#xC5D0;&#xC11C; sign&#xC5D0; &#xB9DE;&#xB294; theme &#xBCC0;&#xACBD; &#xD568;&#xC218;&#xB97C; &#xD638;&#xCD9C;&#xD55C;&#xB2E4;. </p><h2 id="4-%ED%8C%8C%EC%9D%BC-%EA%B5%AC%EC%A1%B0">4. &#xD30C;&#xC77C; &#xAD6C;&#xC870;</h2><figure class="kg-card kg-image-card"><img src="https://blog.cinntiq.synology.me/content/images/2023/03/20230315008.jpg" class="kg-image" alt="&#xD14C;&#xB9C8;, &#xCE94;&#xBC84;&#xC2A4;, &#xC560;&#xB2C8;&#xBA54;&#xC774;&#xC158;" loading="lazy" width="426" height="359"></figure><pre><code class="language-js">// &#xBA54;&#xC778; js

window.addEventListener(&quot;load&quot;, () =&gt; {
  themeButtonSetup();
  const op = document.querySelector(&quot;.opening&quot;);
  setTimeout(() =&gt; op.remove(), 6000);
});

// theme-button &#xBA54;&#xC778; js

const themeButtonSetup = () =&gt; {
  const handleClick = () =&gt; {
    handleAnimation();
    handleThemeSign();
  };

  const clearCanvas = () =&gt; {
    setTimeout(stopAnimation, 300);
    foldCanvas();
  };

  const button = document.querySelector(&quot;.mode__button&quot;);
  button.addEventListener(&quot;click&quot;, handleClick);
  button.addEventListener(&quot;mouseenter&quot;, displayCanvas);
  button.addEventListener(&quot;mouseleave&quot;, clearCanvas);
};</code></pre><p>&#x2003;&#xC120;&#xC5B8;&#xC801;&#xC73C;&#xB85C; &#xC54C;&#xAE30; &#xC27D;&#xB3C4;&#xB85D; &#xC791;&#xC131;&#xD588;&#xB2E4;. &#xC790;&#xCCB4;&#xC801;&#xC73C;&#xB85C; &#xC4F0;&#xB294; &#xC0C1;&#xD0DC;&#xB098; &#xD568;&#xC218;&#xB294; &#xD074;&#xB798;&#xC2A4;&#xC640; &#xD074;&#xB85C;&#xC800;&#xB97C; &#xC774;&#xC6A9;&#xD574;&#xC11C; &#xBD84;&#xB9AC;&#xD588;&#xB2E4;. &#xC6D0;&#xB798;&#xB294; &#xD55C; &#xBC88;&#xC5D0; &#xC791;&#xC131;&#xD588;&#xACE0;, &#xBA85;&#xB839;&#xD615;&#xB3C4; &#xC11E;&#xC5EC;&#xC788;&#xC5B4;&#xC11C; &#xAC00;&#xB3C5;&#xC131;&#xC774; &#xC5C9;&#xB9DD;&#xC774;&#xC5C8;&#xAE30; &#xB54C;&#xBB38;&#xC5D0; &#xC815;&#xB9AC;&#xD588;&#xB2E4;.</p><h2 id="5-%EB%A7%88%EB%AC%B4%EB%A6%AC">5. &#xB9C8;&#xBB34;&#xB9AC;</h2><p>&#x2003;&#xD14C;&#xB9C8; &#xBC84;&#xD2BC; &#xD558;&#xB098; &#xC791;&#xC131;&#xD560; &#xBFD0;&#xC774;&#xC9C0;&#xB9CC; &#xD074;&#xB798;&#xC2A4;, &#xD074;&#xB85C;&#xC800;, &#xCE94;&#xBC84;&#xC2A4;, &#xC774;&#xBCA4;&#xD2B8; &#xB8E8;&#xD504;, &#xD504;&#xB85C;&#xADF8;&#xB798;&#xBC0D; &#xC6D0;&#xCE59;, &#xB514;&#xC790;&#xC778;, CSS, &#xC124;&#xACC4;, &#xC790;&#xB8CC;&#xAD6C;&#xC870;...&#xC5EC;&#xB7EC; &#xAC00;&#xC9C0;&#xB97C; &#xB418;&#xC9DA;&#xACE0; &#xC0DD;&#xAC01;&#xD558;&#xB294; &#xC2DC;&#xAC04;&#xC774;&#xC5C8;&#xB2E4;. </p><h2 id="6-%EC%97%B0%EA%B4%80-%ED%8F%AC%EC%8A%A4%ED%8C%85">6. &#xC5F0;&#xAD00; &#xD3EC;&#xC2A4;&#xD305;</h2><ul><li><a href="https://blog.cinntiq.synology.me/event-loop/">&#xC774;&#xBCA4;&#xD2B8; &#xB8E8;&#xD504;(&#xC2A4;&#xD0DD;, &#xD050;, &#xB80C;&#xB354;)</a></li></ul>]]></content:encoded></item><item><title><![CDATA[객체 지향과 프로그래밍]]></title><description><![CDATA[객체 지향 프로그래밍과 함수형 프로그래밍, 선언적 프로그래밍]]></description><link>https://blog.cinntiq.synology.me/oop/</link><guid isPermaLink="false">63f0b05963bc770001335f7e</guid><category><![CDATA[journal]]></category><dc:creator><![CDATA[Hameln]]></dc:creator><pubDate>Sat, 18 Feb 2023 12:50:57 GMT</pubDate><media:content url="https://blog.cinntiq.synology.me/content/images/2024/01/javascript-3.png" medium="image"/><content:encoded><![CDATA[<blockquote><strong><em>&#x2003;&#xC774; &#xAE00;&#xC740; &#xC678;&#xAD6D; &#xD3EC;&#xC2A4;&#xD305;&#xACFC; &#xC568;&#xB7F0; &#xCF00;&#xC774;&#xC758; Quora &#xC9C8;&#xC758; &#xC751;&#xB2F5; &#xBC88;&#xC5ED;&#xC744; &#xD3EC;&#xD568;&#xD569;&#xB2C8;&#xB2E4;.</em></strong></blockquote><img src="https://blog.cinntiq.synology.me/content/images/2024/01/javascript-3.png" alt="&#xAC1D;&#xCCB4; &#xC9C0;&#xD5A5;&#xACFC; &#xD504;&#xB85C;&#xADF8;&#xB798;&#xBC0D;"><p>&#x2003;OOP&#xC758; &#xCC3D;&#xC2DC;&#xC790; &#xC568;&#xB7F0; &#xCF00;&#xC774;&#xB294; &#xC0DD;&#xBB3C;&#xD559;&#xC744; &#xC804;&#xACF5;&#xD588;&#xB2E4;. &#xADF8;&#xB294; &#xC5EC;&#xB7EC; &#xC138;&#xD3EC;&#xB4E4;&#xC774; &#xC0C1;&#xD638;&#xC791;&#xC6A9;&#xD574; &#xD070; &#xC720;&#xAE30;&#xCCB4;&#xB97C; &#xB9CC;&#xB4E4;&#xACE0;, &#xC720;&#xC9C0;&#xD558;&#xACE0;, &#xD655;&#xC7A5;&#xD558;&#xB4EF; &#xD504;&#xB85C;&#xADF8;&#xB7A8;&#xB3C4; &#xADF8;&#xB7F4; &#xC21C; &#xC5C6;&#xC744;&#xAE4C; &#xACE0;&#xBBFC;&#xD588;&#xB2E4;. &#xADF8;&#xB294; &#xD504;&#xB85C;&#xADF8;&#xB7A8;&#xC758; &#xAC1C;&#xCCB4;(Entity)&#xB4E4;&#xC774; &#xC544;&#xB798;&#xC640; &#xAC19;&#xC774; &#xAD6C;&#xC131;&#xB418;&#xAE38; &#xBC14;&#xB7AC;&#xB2E4;.</p><ol><li><strong>&#xC11C;&#xB85C; &#xB0B4;&#xBD80; &#xAD6C;&#xC870;&#xB294; &#xBAA8;&#xB974;&#xACE0;, &#xC11C;&#xB85C;&#xC758; &#xC6D0;&#xB9AC;&#xB97C; &#xD568;&#xBD80;&#xB85C; &#xBC14;&#xAFC0; &#xC218; &#xC5C6;&#xACE0;, &#xAC01;&#xC790;&#xAC00; &#xB9E1;&#xC740; &#xC5ED;&#xD560;&#xC5D0;&#xB9CC; &#xCDA9;&#xC2E4;&#xD558;&#xB418;, </strong></li><li><strong>&#xBB34;&#xC2A8; &#xC77C;&#xC774; &#xC0DD;&#xAE30;&#xBA74; &#xC11C;&#xB85C; &#xC18C;&#xD1B5;&#xD558;&#xACE0; &#xC694;&#xCCAD;&#xD558;&#xBA74;&#xC11C; &#xBCF5;&#xD569;&#xC801;&#xC778; &#xBC18;&#xC751;&#xC744; &#xC77C;&#xC73C;&#xD0A4;&#xACE0;,</strong></li><li><strong>&#xADF8;&#xB7EC;&#xBA74;&#xC11C; &#xC5EC;&#xB7EC; &#xC694;&#xC778;, &#xC5EC;&#xB7EC; &#xC0C1;&#xD669;&#xC5D0;&#xC11C; &#xC2E4;&#xC2DC;&#xAC04;&#xC73C;&#xB85C; &#xC801;&#xC808;&#xD55C; &#xD310;&#xB2E8;&#xC744; &#xD560; &#xAC83;.</strong></li></ol><p>&#x2003;&#xCF00;&#xC774; &#xBC15;&#xC0AC;&#xB294; 3&#xBC88;&#xC758; &#xC2E4;&#xD604;&#xC744; &#xC704;&#xD574;&#xC11C;&#xB294; &#xB3D9;&#xC801; &#xC5B8;&#xC5B4;&#xAC00; &#xC801;&#xD569;&#xD558;&#xB2E4;&#xACE0; &#xC0DD;&#xAC01;&#xD588;&#xC9C0;&#xB9CC;, &#xC815;&#xC791; &#xAC1D;&#xCCB4; &#xC9C0;&#xD5A5;&#xC73C;&#xB85C; &#xC815;&#xB9D0; &#xC720;&#xBA85;&#xD55C; Java&#xB294; &#xC815;&#xC801; &#xC5B8;&#xC5B4;&#xB2E4;. &#xADF8;&#xB294; &#xC5B4;&#xB5A4; &#xAC78; &#xC0DD;&#xAC01;&#xD558;&#xBA74;&#xC11C; OOP&#xB97C; &#xBC1C;&#xC548;&#xD588;&#xC744;&#xAE4C;? &#xC544;&#xB798; &#xC678;&#xAD6D; &#xC800;&#xC790;&#xC758; &#xD3EC;&#xC2A4;&#xD305;&#xACFC; &#xC694; &#xBA87; &#xB144; &#xAC04; &#xCF00;&#xC774; &#xBC15;&#xC0AC;&#xAC00; Quora&#xC5D0;&#xC11C; &#xB2F5;&#xBCC0;&#xD55C; &#xB0B4;&#xC6A9;&#xB4E4;&#xC744; &#xBCF4;&#xBA70; &#xB2E4;&#xC2DC;&#xAE08; &#xC0DD;&#xAC01;&#xD574;&#xBCF4;&#xC790;.</p><hr><p>&#x2003;&#xC568;&#xB7F0; &#xCF00;&#xC774; &#xBC15;&#xC0AC;&#xB294; 60&#xB144; &#xB300;&#xC5D0; &quot;&#xAC1D;&#xCCB4;&quot;&#xB77C;&#xB294; &#xB9D0;&#xC744; &#xAEBC;&#xB0C8;&#xC2B5;&#xB2C8;&#xB2E4;. <br>&#x2003;&#xADF8;&#xB294; &#xD504;&#xB85C;&#xADF8;&#xB798;&#xBC0D; &#xACC4;&#xC5D0;&#xC11C; &#xB9CE;&#xC740; &#xAC78; &#xBCF4;&#xACE0;, &#xB9CE;&#xC740; &#xAE30;&#xC5EC;&#xB97C; &#xD588;&#xACE0;, &#xC801;&#xC808;&#xD55C; &#xD45C;&#xD604;&#xC744; &#xC704;&#xD574; &#xADF8; &#xB2E8;&#xC5B4;&#xB97C; &#xBC49;&#xC5C8;&#xC2B5;&#xB2C8;&#xB2E4;. &#xADF8;&#xB9AC;&#xACE0; &#xADF8;&#xB294; &#xB2E8;&#xC5B4;&#xAC00; &#xC798;&#xBABB;&#xB410;&#xB2E4;&#xACE0; &#xC501;&#xC4F8;&#xD574; &#xD569;&#xB2C8;&#xB2E4;. <br>&#x2003;&quot;&#xAC1D;&#xCCB4;&quot;&#xB780; &#xB2E8;&#xC5B4;&#xB294; &#xC0AC;&#xB78C;&#xB4E4;&#xB85C; &#xD558;&#xC5EC;&#xAE08; &quot;&#xD589;&#xB3D9;(behavior)&quot;&#xC774; &#xC544;&#xB2CC; &quot;&#xAD6C;&#xD604;(implementation)&quot;&#xC5D0; &#xC9D1;&#xC911;&#xD558;&#xAC8C; &#xB9CC;&#xB4E4;&#xC5B4;&#xBC84;&#xB838;&#xACE0;, &#xADF8;&#xAC83;&#xC774; &#xB0B4;&#xB9AC;&#xB9C9;&#xAE38;&#xC758; &#xC2DC;&#xC791;&#xC774;&#xC5C8;&#xC2B5;&#xB2C8;&#xB2E4;. </p><p>&#x2003;&#xC624;&#xB298;&#xB0A0; &#xB9CE;&#xC740; &#xAC1C;&#xBC1C;&#xC790;&#xB4E4;&#xC774; OOP&#xB97C; &#xD074;&#xB798;&#xC2A4;, &#xC0C1;&#xC18D;&#xC774;&#xB77C;&#xACE0; &#xB9D0;&#xD569;&#xB2C8;&#xB2E4;. &#xC880; &#xB354; &#xB098;&#xC544;&#xAC00;&#xBA74; &#xCEA1;&#xC290;&#xD654;, &#xB2E4;&#xD615;&#xC131;&#xC744; &#xC598;&#xAE30;&#xD558;&#xC8E0;. &#xD558;&#xC9C0;&#xB9CC; &#xADF8; &#xBFD0;&#xC785;&#xB2C8;&#xB2E4;. </p><p>&#x2003;&#xCF00;&#xC774; &#xBC15;&#xC0AC;&#xB294; OOP&#xC758; &#xC804;&#xB9D0;&#xC774; &#xC544;&#xB798;&#xC640; &#xAC19;&#xB2E4;&#xACE0; &#xB9D0;&#xD569;&#xB2C8;&#xB2E4;.</p><ol><li>&#xBA54;&#xC2DC;&#xC9D5;</li><li>&#xC0C1;&#xD0DC;&#xB97C; &#xC9C0;&#xC5ED;&#xC801;&#xC73C;&#xB85C; &#xBCF4;&#xAD00;, &#xBCF4;&#xD638;, &#xC228;&#xAE40;</li><li>&#xCD5C;&#xB300;&#xD55C; &#xB290;&#xB9B0; &#xBC14;&#xC778;&#xB529;</li></ol><p>&#x2003;&#xC65C; &#xC774;&#xB807;&#xAC8C; &#xB9D0;&#xD588;&#xC744;&#xAE4C;&#xC694;? <br>&#x2003;&#xADF8;&#xB294; &#xC138;&#xD3EC; &#xC0DD;&#xBB3C;&#xD559;&#xC744; &#xC804;&#xACF5;&#xD588;&#xC2B5;&#xB2C8;&#xB2E4;. &#xC18C;&#xD504;&#xD2B8;&#xC6E8;&#xC5B4;&#xAC00; &#xD655;&#xC7A5;&#xC131;&#xC774; &#xC548; &#xC88B;&#xC740; &#xB370;&#xC5D0; &#xBE44;&#xD574; &#xC138;&#xD3EC;&#xB294; &#xC27D;&#xAC8C; &#xACC4;&#xC0B0;&#xD558;&#xACE0;, &#xD655;&#xC7A5;&#xD558;&#xACE0;, &#xBCF5;&#xC7A1;&#xD55C; &#xAC83;&#xC744; &#xB9CC;&#xB4E4;&#xC5B4;&#xB0B4;&#xBA70; &#xC2A4;&#xC2A4;&#xB85C;&#xB97C; &#xC218;&#xC815;&#xD55C;&#xB2E4;&#xB294; &#xC0AC;&#xC2E4;&#xC744; &#xB208;&#xC5EC;&#xACA8;&#xBD24;&#xC2B5;&#xB2C8;&#xB2E4;. &#xB9E4;&#xC6B0; &#xC815;&#xAD50;&#xD558;&#xB2E4;&#xB294; &#xCEF4;&#xD4E8;&#xD130; &#xC18C;&#xD504;&#xD2B8;&#xC6E8;&#xC5B4; &#xD504;&#xB85C;&#xADF8;&#xB7A8;&#xC740; &#xB290;&#xB9AC;&#xACE0;, &#xC791;&#xACE0;, &#xBC84;&#xADF8; &#xD22C;&#xC131;&#xC774;&#xC778;&#xB370; &#xB9D0;&#xC774;&#xC8E0;. &#xADF8;&#xC758; &#xACE0;&#xBBFC;&#xC740; &#xC5EC;&#xAE30;&#xC11C; &#xBE44;&#xB86F;&#xD569;&#xB2C8;&#xB2E4;. </p><blockquote><em><strong>&#x201C;&#xC5B4;&#xB5BB;&#xAC8C; &#xD574;&#xC57C; &#xC18C;&#xD504;&#xD2B8;&#xC6E8;&#xC5B4;&#xAC00; &#xC774;&#xB7F0; &#xD655;&#xC7A5;&#xC131;&#xC744; &#xAC00;&#xC9C8;&#xAE4C;?&#x201D;</strong></em></blockquote><h2 id="%EB%8F%85%EB%A6%BD%EC%84%B1">&#xB3C5;&#xB9BD;&#xC131;</h2><p>&#x2003;&#xBA3C;&#xC800; &#xB3C5;&#xB9BD;&#xC131;&#xC744; &#xB9D0;&#xD574;&#xBCF4;&#xC8E0;. &quot;&#xC0C1;&#xD0DC;&#xB97C; &#xC9C0;&#xC5ED;&#xC801;&#xC73C;&#xB85C; &#xBCF4;&#xAD00;, &#xBCF4;&#xD638;, &#xC228;&#xAE40;&quot;&#xC744; &#xC9E7;&#xAC8C; &#xC904;&#xC778;&#xB2E4;&#xBA74; &#xB3C5;&#xB9BD;&#xC131;&#xC774;&#xB77C;&#xACE0; &#xD558;&#xACA0;&#xC2B5;&#xB2C8;&#xB2E4;.<br>&#x2003;&#xC138;&#xD3EC; &#xC548;&#xCABD;&#xC740; &#xC5B4;&#xC9C0;&#xB7FD;&#xACE0; &#xBCF5;&#xC7A1;&#xD558;&#xC9C0;&#xB9CC; &#xC138;&#xD3EC;&#xB9C9;&#xC774; &#xC774;&#xB97C; &#xAE54;&#xB054;&#xD558;&#xAC8C; &#xD3EC;&#xC7A5;&#xD574;&#xC11C; &#xB0B4;&#xBD80;&#xB97C; &#xC228;&#xAE41;&#xB2C8;&#xB2E4;. &#xC6B0;&#xB9AC; &#xBAB8;&#xC740; &#xB9E4;&#xC77C; 500~700&#xC5B5;&#xC758; &#xC138;&#xD3EC;&#xAC00; &#xC8FD;&#xC2B5;&#xB2C8;&#xB2E4;. &#xD558;&#xC9C0;&#xB9CC; &#xC6B0;&#xB9AC;&#xB294; &#xC544;&#xB2D9;&#xB2C8;&#xB2E4;. &#xC138;&#xD3EC;&#xAC00; &#xC8FD;&#xB294;&#xB2E4;&#xACE0; &#xC6B0;&#xB9AC;&#xAC00; &#xC8FD;&#xB098;&#xC694;? &#xC544;&#xB2D9;&#xB2C8;&#xB2E4;. &#xC138;&#xD3EC;&#xAC00; &#xC8FD;&#xC744; &#xB54C; &#xC5EC;&#xB7EC;&#xBD84;&#xC774; &#xC548; &#xC8FD;&#xB294; &#xAC74; &#xCEA1;&#xC290;&#xD654; &#xB54C;&#xBB38;&#xC774; &#xC544;&#xB2D9;&#xB2C8;&#xB2E4;. &#xB3C5;&#xB9BD;&#xC131; &#xB54C;&#xBB38;&#xC774;&#xC8E0;. &#xB2E4;&#xC74C;&#xC758; (&#xB054;&#xCC0D;&#xD55C;) &#xC608;&#xC2DC;&#xB97C; &#xBCF4;&#xC8E0;.</p><pre><code class="language-js">class MyExample:
    def reciprocal(self, num):
        return  1.0/num

example = MyExample()
print example.reciprocal(4);
print example.reciprocal(0);</code></pre><p>&#x2003;&#xC704; &#xCF54;&#xB4DC;&#xB294; &#xD074;&#xB798;&#xC2A4;&#xC5D0;&#xC11C; reciprocal&#xC744; &#xCEA1;&#xC290;&#xD654;&#xD569;&#xB2C8;&#xB2E4;. &#xD558;&#xC9C0;&#xB9CC;...</p><pre><code class="language-text">0.25
Traceback (most recent call last):
  File &quot;class.py&quot;, line 7, in &lt;module&gt;
    print example.reciprocal(0);
  File &quot;class.py&quot;, line 3, in reciprocal
    return  1.0/num
ZeroDivisionError: float division by zero</code></pre><p>&#x2003;&#xAC1D;&#xCCB4;&#xB3C4; &#xC8FD;&#xACE0;, &#xAC1D;&#xCCB4;&#xB97C; &#xC18C;&#xC720;&#xD558;&#xB294; &#xCF54;&#xB4DC;&#xB3C4; &#xC8FD;&#xC2B5;&#xB2C8;&#xB2E4;. &#xC774;&#xAC74; &#xADF8;&#xAC00; &#xC6B0;&#xB9AC;&#xC5D0;&#xAC8C; &#xC804;&#xB2EC;&#xD558;&#xACE0;&#xC790; &#xD55C; &#xC758;&#xB3C4;&#xC640; &#xC815;&#xBC18;&#xB300;&#xC785;&#xB2C8;&#xB2E4;.<br>&#x2003;&#xADF8;&#xAC00; &#xB9D0;&#xD558;&#xACE0;&#xC790; &#xD558;&#xB294; &#xBC14;&#xB294; &#xBE0C;&#xB77C;&#xC6B0;&#xC800; - &#xC11C;&#xBC84;&#xB97C; &#xC0DD;&#xAC01;&#xD558;&#xBA74; &#xC88B;&#xC2B5;&#xB2C8;&#xB2E4;. &#xC11C;&#xBC84;(&#xAC1D;&#xCCB4; 1)&#xAC00; &#xBA39;&#xD1B5;&#xB41C;&#xB2E4;&#xACE0; &#xBE0C;&#xB77C;&#xC6B0;&#xC800;(&#xAC1D;&#xCCB4; 2)&#xAE4C;&#xC9C0; &#xD568;&#xAED8; &#xBA39;&#xD1B5;&#xC774; &#xB41C;&#xB2E4;&#xBA74; MS IIS&#xB294; 2.0 &#xBC84;&#xC804;&#xAE4C;&#xC9C0;&#xB3C4; &#xBABB; &#xAC00;&#xACE0; &#xB9DD;&#xD588;&#xACA0;&#xC8E0;.<br>&#x2003;&#xC544;&#xD30C;&#xB137;(Arpanet)&#xC740; 30&#xB144; &#xB9CC;&#xC5D0; &#xADDC;&#xBAA8;&#xAC00; 1&#xC5B5; &#xBC30; &#xCEE4;&#xC84C;&#xC2B5;&#xB2C8;&#xB2E4;. (&#xAC8C;&#xB2E4;&#xAC00; &#xD655;&#xC7A5;&#xD560; &#xB54C;&#xB9C8;&#xB2E4; &#xC720;&#xC9C0;&#xBCF4;&#xC218;&#xB97C; &#xC704;&#xD574; &#xB2E4;&#xC6B4;&#xC2DC;&#xD0AC; &#xD544;&#xC694;&#xB3C4; &#xC5C6;&#xC5C8;&#xC8E0;.) &#xC624;&#xB298;&#xB0A0; &#xC778;&#xD130;&#xB137;&#xC740; &#xCF00;&#xC774; &#xBC15;&#xC0AC;&#xAC00; &quot;&#xC790;&#xC2E0;&#xC774; &#xC81C;&#xC2DC;&#xD55C; OO &#xBAA8;&#xB378;&#xC758; &#xC720;&#xC77C;&#xD55C; &#xC131;&#xACF5; &#xC0AC;&#xB840;&quot;&#xB77C;&#xACE0; &#xB9D0;&#xD569;&#xB2C8;&#xB2E4;.</p><h2 id="%EC%B5%9C%EB%8C%80%ED%95%9C-%EB%8A%90%EB%A6%B0-%EB%B0%94%EC%9D%B8%EB%94%A9">&#xCD5C;&#xB300;&#xD55C; &#xB290;&#xB9B0; &#xBC14;&#xC778;&#xB529;</h2><p>&#x2003;&#xADF8;&#xC758; &#xB610; &#xB2E4;&#xB978; &#xD575;&#xC2EC; &#xC8FC;&#xC7A5;&#xC740; &#xB9E4;&#xC6B0; &#xB290;&#xB9B0; &#xBC14;&#xC778;&#xB529;&#xC785;&#xB2C8;&#xB2E4;. &#xBB34;&#xC2A8; &#xB9D0;&#xC77C;&#xAE4C;&#xC694;? &#xCF54;&#xB4DC;&#xB97C; &#xBD05;&#xC2DC;&#xB2E4;.</p><pre><code class="language-js">my $order = OrderFactory-&gt;fetch(%order_args);
my $invoice = $order-&gt;invoice;</code></pre><p>&#x2003;&quot;order&quot; &#xD074;&#xB798;&#xC2A4;&#xAC00; &#xC5EC;&#xB7FF; &#xC788;&#xB2E4;&#xBA74; &#xC5B4;&#xB5A4; &#xD074;&#xB798;&#xC2A4;&#xB97C; &#xD638;&#xCD9C;&#xD558;&#xACE0; &#xCEF4;&#xD30C;&#xC77C; &#xB54C; &#xC5B4;&#xB5A4; invoice &#xBA54;&#xC18C;&#xB4DC;&#xB97C; &#xD638;&#xCD9C;&#xD558;&#xAC8C; &#xB420;&#xAE4C;&#xC694;? <br>&#x2003;OOP &#xC5B8;&#xC5B4;&#xB294; &#xB2E4;&#xD615;&#xC131;&#xC744; &#xC704;&#xD574; &#xB7F0;&#xD0C0;&#xC784; &#xC804;&#xC5D0; &#xD638;&#xCD9C;&#xC790;($order)&#xC5D0; &#xB300;&#xD55C; &#xBA54;&#xC18C;&#xB4DC;(invoice)&#xB97C; &#xBC14;&#xC778;&#xB529;&#xD558;&#xC9C0; &#xC54A;&#xC2B5;&#xB2C8;&#xB2E4;.<br><br>&#x2003;&#xB290;&#xB9B0; &#xBC14;&#xC778;&#xB529;&#xC774;&#xB780; &#xBB58;&#xAE4C;&#xC694;? invoice &#xBA54;&#xC18C;&#xB4DC;&#xC758; &apos;&#xC874;&#xC7AC; &#xC5EC;&#xBD80;&apos;&#xB97C; &#xD55C; &#xBC88; &#xBCFC;&#xAE4C;&#xC694;? Java&#xAC19;&#xC740; &#xC5B8;&#xC5B4;&#xB294; &#xBA54;&#xC18C;&#xB4DC;&#xAC00; &#xC874;&#xC7AC;&#xD558;&#xC9C0; &#xC54A;&#xC73C;&#xBA74; &#xCEF4;&#xD30C;&#xC77C;&#xC870;&#xCC28; &#xC548; &#xD569;&#xB2C8;&#xB2E4;. &#xCD5C;&#xC18C;&#xD55C; &#xBA54;&#xC18C;&#xB4DC;&#xAC00; &#xC874;&#xC7AC;&#xD574;&#xC57C; &#xD558;&#xACE0;, &#xD638;&#xCD9C;&#xD560; &#xC218; &#xC788;&#xB294;&#xC9C0; &#xD655;&#xC778;&#xD569;&#xB2C8;&#xB2E4;.</p><p>&#x2003;&#xB9CE;&#xC740; &#xB3D9;&#xC801; &#xC5B8;&#xC5B4;, &#xC608;&#xB97C; &#xB4E4;&#xBA74; Perl&#xAC19;&#xC740; &#xACBD;&#xC6B0; &#xCF54;&#xB4DC;&#xB97C; &#xC2E4;&#xD589;&#xD560; &#xB54C;&#xAE4C;&#xC9C0; &#xBA54;&#xC18C;&#xB4DC;&#xB97C; &#xD638;&#xCD9C;&#xC790;&#xC5D0; &#xBC14;&#xC778;&#xB529;&#xD558;&#xC9C0; &#xC54A;&#xC73C;&#xBBC0;&#xB85C; &#xCEF4;&#xD30C;&#xC77C; &#xBB38;&#xC81C;&#xAC00; &#xC548; &#xB0A9;&#xB2C8;&#xB2E4;.<br>&#x2003;&#xB2F9;&#xC2E0;&#xC740; &#xC0C8;&#xBCBD; 2&#xC2DC; &#xACBD;&#xC5D0; &#xBC30;&#xCE58; &#xD504;&#xB85C;&#xC138;&#xC2A4;&#xAC00; &#xC2E4;&#xD328;&#xD588;&#xB2E4;&#xB294; &#xB2F9;&#xD639;&#xC2A4;&#xB7EC;&#xC6B4; &#xC804;&#xD654;&#xB97C; &#xBC1B;&#xC2B5;&#xB2C8;&#xB2E4;. &#xC544;&#xAE4C; &#xD68C;&#xC0AC;&#xC5D0;&#xC11C; &#xCEA1;&#xC290;&#xD654;&#xB294; &#xD574;&#xB480;&#xB294;&#xB370; &#xB3C5;&#xB9BD;&#xC131; &#xCC98;&#xB9AC;&#xB97C; &#xBABB;&#xD588;&#xC744;&#xC9C0;&#xB3C4;&#xC694;.<br>&#x2003;&#xC774;&#xB7F0;! &#xC774;&#xB7F0; &#xAC8C; &#xBC14;&#xB85C; &#xAC80;&#xC0AC;&#xB97C; &#xAC70;&#xC758; &#xAC70;&#xCE58;&#xC9C0; &#xC54A;&#xB294; &quot;&#xB9E4;&#xC6B0;&quot; &#xB290;&#xB9B0; &#xBC14;&#xC778;&#xB529;&#xC785;&#xB2C8;&#xB2E4;.</p><p>&#x2003;Java&#xAC19;&#xC740; &#xC815;&#xC801; &#xC5B8;&#xC5B4;&#xB294; &apos;<strong>&#xD0C0;&#xC785;&#xC744; &#xC2DD;&#xBCC4;&#xC790;&#xC5D0; &#xBC14;&#xC778;&#xB529;&apos;</strong>&#xD558;&#xAE30; &#xB54C;&#xBB38;&#xC5D0; &#xB2E4;&#xB978; &#xD0C0;&#xC785;&#xC758; &#xAC12;&#xC744; &#xD560;&#xB2F9;&#xD560; &#xC218; &#xC5C6;&#xC2B5;&#xB2C8;&#xB2E4;.<br>&#x2003;&#xD558;&#xC9C0;&#xB9CC; Perl, JavaScript &#xAC19;&#xC740; &#xB3D9;&#xC801; &#xC5B8;&#xC5B4;&#xB294; <strong>&apos;&#xAC12; &#xC790;&#xCCB4;&#xC5D0; &#xD0C0;&#xC785;&#xC744; &#xBC14;&#xC778;&#xB529;&apos;</strong>&#xD569;&#xB2C8;&#xB2E4;. &#xAC12;&#xC740; &#xD0C0;&#xC785;&#xC744; &#xC54C;&#xC9C0;&#xB9CC; &#xBCC0;&#xC218;&#xB294; &#xD0C0;&#xC785;&#xC744; &#xBAA8;&#xB985;&#xB2C8;&#xB2E4;. &#xC774;&#xAC83;&#xC774; &quot;&#xB290;&#xB9B0; &#xBC14;&#xC778;&#xB529;&quot;&#xC785;&#xB2C8;&#xB2E4;.</p><pre><code class="language-javascript">// JavaScript
const str = &quot;hello&quot; // str &#xC2DD;&#xBCC4;&#xC790;&#xC5D0;&#xB294; &#xD0C0;&#xC785;&#xC5D0; &#xB300;&#xD55C; &#xC815;&#xBCF4;&#xAC00; &#xC5C6;&#xACE0; &quot;hello&quot; &#xAC12;&#xC744; &#xD1B5;&#xD574; &#xD0C0;&#xC785;&#xC744; &#xD310;&#xB2E8;&#xD569;&#xB2C8;&#xB2E4;.

// Java
int num = 1; // &#xC120;&#xC5B8;&#xBD80;&#xC5D0; int&#xB77C;&#xACE0; &#xC801;&#xC74C;&#xC73C;&#xB85C;&#xC11C; num &#xC2DD;&#xBCC4;&#xC790; &#xC790;&#xCCB4;&#xC5D0; &#xD0C0;&#xC785;&#xC774; &#xBC14;&#xC778;&#xB529;&#xB429;&#xB2C8;&#xB2E4;. &#xC774;&#xB97C; &#xD1B5;&#xD574; &#xCEF4;&#xD30C;&#xC77C;&#xC774; &#xC815;&#xAD50;&#xD569;&#xB2C8;&#xB2E4;.</code></pre><p>&#x2003;&#xADF8;&#xB294; &#xB290;&#xB9B0; &#xBC14;&#xC778;&#xB529;&#xC774; &#xC788;&#xC73C;&#xBA74; &#xBB38;&#xC81C; &#xD574;&#xACB0;&#xC744; &#xC704;&#xD55C; &quot;&#xC720;&#xC77C;&#xD55C; &#xAE38;&quot;&#xC744; &#xBBF8;&#xB9AC; &#xD655;&#xC815;&#xD558;&#xC9C0; &#xC54A;&#xACE0; &#xC2E4;&#xD589; &#xC911;&#xAC04;&#xC5D0; &#xBCC0;&#xC218;&#xAC00; &#xBC1C;&#xC0DD;&#xD574;&#xB3C4; &#xC2DC;&#xC2A4;&#xD15C;&#xC774; &#xC2A4;&#xC2A4;&#xB85C; &#xD310;&#xB2E8;, &#xC815;&#xC815;&#xD558;&#xAE30; &#xB54C;&#xBB38;&#xC5D0; &#xC88B;&#xB2E4;&#xACE0; &#xB9D0;&#xD569;&#xB2C8;&#xB2E4;. &#xD504;&#xB85C;&#xADF8;&#xB7A8;&#xC744; &#xBCC0;&#xACBD;&#xD558;&#xBA74; &#xC2E4;&#xD589;&#xC744; &#xC815;&#xC9C0;&#xD558;&#xACE0; &#xC7AC;&#xC2DC;&#xC791;&#xD558;&#xACE0;, &#xBCF5;&#xC7A1;&#xD55C; &#xCEF4;&#xD30C;&#xC77C;&#xC744; &#xB2E4;&#xC2DC; &#xAE30;&#xB2E4;&#xB9AC;&#xB290;&#xB77C; &#xBA87; &#xC2DC;&#xAC04;&#xC744; &#xD5C8;&#xBE44;&#xD558;&#xB358; &#xC2DC;&#xC808;&#xC774; &#xAE30;&#xC5B5;&#xB098;&#xB098;&#xC694;?</p><h2 id="%EB%A9%94%EC%8B%9C%EC%A7%95">&#xBA54;&#xC2DC;&#xC9D5;</h2><p>&#x2003;&#xB3C5;&#xB9BD;&#xC131;&#xACFC; &#xB290;&#xB9B0; &#xBC14;&#xC778;&#xB529;&#xC740; &#xC774;&#xC81C; &#xC54C; &#xB4EF;&#xD569;&#xB2C8;&#xB2E4;. &#xC774;&#xC81C; &#xCF00;&#xC774;&#xAC00; &#xAC00;&#xC7A5; &#xC911;&#xC694;&#xD558;&#xB2E4;&#xACE0; &#xAC15;&#xC870;&#xD588;&#xC73C;&#xBA70;, &#xC5EC;&#xC804;&#xD788; &#xB9CE;&#xC740; &#xC0AC;&#xB78C;&#xB4E4;&#xC774; &#xAC04;&#xACFC;&#xD558;&#xB294; &quot;&#xBA54;&#xC2DC;&#xC9D5;&quot;&#xC744; &#xBD05;&#xC2DC;&#xB2E4;.<br>&#x2003;&#xAC1D;&#xCCB4;&#xB294; &#xC790;&#xC2E0;&#xC774; &#xC5B4;&#xB5A4; &#xC791;&#xC5C5;&#xC744; &#xD588;&#xB294;&#xC9C0; &#xC54C;&#xB9AC;&#xACE0;, &#xB2E4;&#xB978; &#xAC1D;&#xCCB4;&#xB294; &#xC774;&#xB97C; &#xBB34;&#xC2DC;&#xD558;&#xAC70;&#xB098; &quot;&#xC544;&#xC8FC; &#xC88B;&#xC544;.&quot;&#xB77C;&#xACE0; &#xB9DE;&#xC7A5;&#xAD6C;&#xCCD0;&#xC57C; &#xD569;&#xB2C8;&#xB2E4;.</p><p>&#x2003;&#xB9CE;&#xC740; &#xAC1C;&#xBC1C;&#xC790;&#xB4E4;&#xC774; &#xACF5;&#xAC10;&#xC740; &#xD569;&#xB2C8;&#xB2E4;. &#xD558;&#xC9C0;&#xB9CC; &#xC774;&#xB860;&#xB9CC; &#xC54C;&#xAE30;&#xBCF4;&#xB2E8; &#xAD6C;&#xCCB4;&#xC801;&#xC778; &#xC99D;&#xBA85;&#xB3C4; &#xBD10;&#xC57C; &#xACF5;&#xAC10;&#xC744; &#xC0AC;&#xAE30; &#xC88B;&#xC2B5;&#xB2C8;&#xB2E4;. &#xADF8;&#xB798;&#xC11C; &#xC800;&#xB294; &#xCF00;&#xC774; &#xBC15;&#xC0AC;&#xAC00; &#xC870;&#xAE08; &#xBAA8;&#xD638;&#xD558;&#xAC8C; &#xB9D0;&#xD588;&#xB2E4;&#xACE0; &#xC0DD;&#xAC01;&#xD569;&#xB2C8;&#xB2E4;. &#xADF8;&#xAC00; &#xB9D0;&#xD558;&#xB294; &#xAC1D;&#xCCB4; &#xC9C0;&#xD5A5;&#xC740; &apos;&#xBAA8;&#xB4E0; &#xAC1D;&#xCCB4;&#xAC00; &#xCEF4;&#xD4E8;&#xD130; &#xADF8; &#xC790;&#xCCB4;&apos; &#xAC19;&#xC2B5;&#xB2C8;&#xB2E4;. &#xAC01; &#xAC1D;&#xCCB4;&#xB9C8;&#xB2E4; &#xBA54;&#xC2DC;&#xC9C0;&#xB97C; &#xC218;&#xC2E0;&#xD558;&#xACE0;, &#xC774;&#xD574;&#xD558;&#xACE0;, &#xC2A4;&#xB9C8;&#xD2B8;&#xD558;&#xAC8C; &#xCC98;&#xB9AC;&#xD569;&#xB2C8;&#xB2E4;.</p><p>&#x2003;&#xB2E4;&#xC2DC; &#xB9D0;&#xD574;&#xC11C;, &#xC774;&#xB984;&#xC744; &#xBD80;&#xB974;&#xBA74; &#xC815;&#xD574;&#xC9C4; &#xC5ED;&#xD560;&#xB9CC; &#xC2E4;&#xD589;&#xD558;&#xB294; &#xAC8C; &#xC544;&#xB2C8;&#xB77C; &#xAC1D;&#xCCB4;&#xC5D0; &#xBA54;&#xC2DC;&#xC9C0;&#xB97C; &#xBCF4;&#xB0B4;&#xBA74;, &#xAC1D;&#xCCB4;&#xB294; &#xC5B4;&#xB5BB;&#xAC8C; &#xBC18;&#xC751;&#xD560;&#xC9C0; &#xACE0;&#xBBFC;, &#xD310;&#xB2E8;&#xD569;&#xB2C8;&#xB2E4;. &#xC774;&#xB7EC;&#xD55C; &#xC54C;&#xACE0;&#xB9AC;&#xC998;&#xC740; &#xB3C5;&#xB9BD;&#xC131;&#xC744; &#xAC15;&#xD654;&#xD569;&#xB2C8;&#xB2E4;. &#xC218;&#xC2E0;&#xD558;&#xB294; &#xCE21;&#xC758; &#xAC1D;&#xCCB4;&#xB294; &#xBABB; &#xC54C;&#xC544;&#xB4E4;&#xC744; &#xBA54;&#xC2DC;&#xC9C0;&#xB294; &#xBB34;&#xC2DC;&#xD558;&#xAE30; &#xB54C;&#xBB38;&#xC785;&#xB2C8;&#xB2E4;. &#xB9CE;&#xC740; &#xC0AC;&#xB78C;&#xB4E4;&#xC5D0;&#xAC90; &#xC775;&#xC219;&#xD558;&#xC9C0; &#xC54A;&#xC740; &#xD328;&#xB7EC;&#xB2E4;&#xC784;&#xC774;&#xC9C0;&#xB9CC;, &#xAC15;&#xB825;&#xD569;&#xB2C8;&#xB2E4;.</p><hr><p>&#x2003;&#x201C;&#xC911;&#xC694;&#xD55C; &#xAC74; &#xBA54;&#xC2DC;&#xC9D5;&#xC77C;&#xC138;. &#xD6CC;&#xB96D;&#xD558;&#xACE0;, &#xC131;&#xC7A5;&#xD558;&#xB294; &#xC2DC;&#xC2A4;&#xD15C;&#xC744; &#xB9CC;&#xB4E4;&#xB824;&#xBA74; &#xBAA8;&#xB4C8;&#xC774; &#xBB34;&#xC2A8; &#xC790;&#xC6D0;&#xACFC; &#xB3D9;&#xC791;&#xC744; &#xAC00;&#xC9C8;&#xC9C0;&#xBCF4;&#xB2E4;, &#xBAA8;&#xB4C8;&#xB4E4;&#xC774; &#xC5B4;&#xB5BB;&#xAC8C; &#xC18C;&#xD1B5;&#xD558;&#xB0D0;&#xB97C; &#xC124;&#xACC4;&#xD558;&#xB294; &#xAC8C; &#xD575;&#xC2EC;&#xC774;&#xC57C;.<br>&#x2003;&#xC778;&#xD130;&#xB137;&#xC774; &#xC0B4;&#xC544;&#xC788;&#xC73C;&#xB824;&#xBA74; &#xB450; &#xAC00;&#xC9C0;&#xAC00; &#xD544;&#xC694;&#xD574;.</p><ol><li>&#xD45C;&#xC900;&#xC744; &#xB118;&#xC5B4;&#xC11C;&#xC11C; &#xC5EC;&#xB7EC; &#xC885;&#xB958;&#xC758; &#xC544;&#xC774;&#xB514;&#xC5B4;&#xC640; &#xAD6C;&#xD604;&#xC744; &#xD5C8;&#xC6A9;.</li><li>&#xC544;&#xC774;&#xB514;&#xC5B4; &#xAC04; &#xC5EC;&#xB7EC; &#xC218;&#xC900;&#xC758; &#xC548;&#xC804; &#xC0C1;&#xD638; &#xC6B4;&#xC6A9;&#xC131; &#xD5C8;&#xC6A9;.</li></ol><p>&#x2003;&#xC790;&#xB124;&#xAC00; &#xBA54;&#xC2DC;&#xC9D5;&#xC5D0;&#xB9CC; &#xC9D1;&#xC911;&#xD55C;&#xB2E4;&#xBA74; (&#xADF8;&#xB9AC;&#xACE0; &#xC88B;&#xC740; &#xBA54;&#xD0C0;&#xC2DC;&#xC2A4;&#xD15C;&#xC774; &#xAC1D;&#xCCB4;&#xC5D0;&#xC11C; &#xC4F0;&#xB294; 2nd level &#xC544;&#xD0A4;&#xD14D;&#xCCD0;&#xB97C; &#xB290;&#xB9AC;&#xAC8C; &#xBC14;&#xC778;&#xB529;&#xD560; &#xC218; &#xC788;&#xB2E4;&#xB294; &#xC810;&#xC744; &#xC774;&#xD574;&#xD55C;&#xB2E4;&#xBA74;) &#xC774; &#xC2A4;&#xB808;&#xB4DC;&#xC5D0;&#xC11C; &#xC5EC;&#xB7EC; &#xC5B8;&#xC5B4;, UI, OS&#xC5D0; &#xAE30;&#xBC18;&#xD55C; &#xB17C;&#xC758;&#xB294; &#xBB34;&#xC758;&#xBBF8;&#xD560; &#xAC70;&#xC57C;.&#x201D;</p><p>&#x2003;- &#xC568;&#xB7F0; &#xCF00;&#xC774;&#xAC00; -</p><blockquote>&#xC544;&#xB798;&#xBD80;&#xD130;&#xB294; Quora&#xC5D0; &#xC62C;&#xB77C;&#xC628; &#xC9C8;&#xBB38;&#xC5D0; &#xC568;&#xB7F0; &#xCF00;&#xC774;&#xAC00; &#xB300;&#xB2F5;&#xD55C; &#xAC83;&#xC785;&#xB2C8;&#xB2E4;.</blockquote><hr><p>&#x2003;&#x201C;66&#xB144; &#xB9D0; &#xB300;&#xD559;&#xC6D0; &#xCCAB; &#xC8FC;&#xC5D0;, &#xC800;&#xB294; &#xC6B0;&#xC5F0;&#xD788; Sketchpad&#xC640; Simula&#xB97C; &#xC811;&#xD588;&#xACE0; &#xC0DD;&#xBB3C;&#xD559;&#xC801; &#xAD6C;&#xC870;&#xC640; &#xB124;&#xD2B8;&#xC6CC;&#xD06C; &#xC0C1;&#xC758; &#xCEF4;&#xD4E8;&#xD130;, &#xAC19;&#xC740; &#xC2DC;&#xAC04;&#xC744; &#xACF5;&#xC720;&#xD558;&#xB294; &#xD504;&#xB85C;&#xC138;&#xC2A4;&#xB4E4;, &#xC2DC;&#xC2A4;&#xD15C;&#xC758; &#xAC01; &#xBD80;&#xBD84;&#xB4E4;&#xC774; &#xC0C1;&#xD638;&#xC791;&#xC6A9;&#xD558;&#xB294; &#xBAA8;&#xC2B5;&#xB4E4;&#xC744; &#xBCF4;&#xBA74;&#xC11C;&#x300C;<strong>&#xAE30;&#xBCF8;&#xC801;&#xC774;&#xACE0;, &#xBCF4;&#xD3B8;&#xC801;&#xC778; &#xB2E8;&#xC704;&#xB85C;&#xC11C;&#xC758; &#xCEF4;&#xD4E8;&#xD130;</strong>&#x300D;&#xC5D0; &#xB300;&#xD55C; &#xC2E4;&#xB9C8;&#xB9AC;&#xB97C; &#xC5BB;&#xC5C8;&#xC2B5;&#xB2C8;&#xB2E4;. <strong>&#xADF8;&#xB85C;&#xBD80;&#xD130; &#xB3D9;&#xC801; &#xC5B8;&#xC5B4;&#xB97C; &#xACE0;&#xB824;</strong>&#xD588;&#xACE0;, <strong>&#xC5B4;&#xB5BB;&#xAC8C; &#xD574;&#xC57C; &#xD6A8;&#xC728;&#xC801;&#xC774;&#xACE0;, &#xAC04;&#xACB0;&#xD558;&#xACE0;, &#xBCF4;&#xD3B8;&#xC801;&#xC73C;&#xB85C;</strong> <strong>&#xD504;&#xB85C;&#xADF8;&#xB798;&#xBC0D;</strong>&#xD560; &#xC218; &#xC788;&#xC744;&#xC9C0; &#xACE0;&#xBBFC;&#xD588;&#xC2B5;&#xB2C8;&#xB2E4;.</p><p>&#x2003;1960&#xB144; &#xB300;&#xC5D0;&#xB294; &#xBC30;&#xC5F4;&#xBCF4;&#xB2E4; &#xBCF5;&#xC7A1;&#xD55C; &#xC18C;&#xD504;&#xD2B8;&#xC6E8;&#xC5B4; &#xBCF5;&#xD569;&#xCCB4;&#xB97C; &#xC885;&#xC885; &apos;&#xAC1D;&#xCCB4;&apos;&#xB77C;&#xACE0; &#xBD88;&#xB800;&#xC2B5;&#xB2C8;&#xB2E4;. &#xC5B4;&#xB290;&#xB0A0; &#xB204;&#xAC00; &#xBB50;&#xD558;&#xB0D0;&#xACE0; &#xBB3C;&#xC5C8;&#xACE0;, &#xC804; &#xBCC4; &#xC0DD;&#xAC01; &#xC5C6;&#xC774;<strong>&#x300C;&#xAC1D;&#xCCB4; &#xC9C0;&#xD5A5; &#xD504;&#xB85C;&#xADF8;&#xB798;&#xBC0D;&#x300D;</strong>&#xC774;&#xB77C; &#xB300;&#xB2F5;&#xD574;&#xBC84;&#xB838;&#xC2B5;&#xB2C8;&#xB2E4;. (&#xC5EC;&#xB7EC; &#xC774;&#xC720;&#xB85C; &#xB9E4;&#xC6B0; &#xB098;&#xC05C; &#xB2E8;&#xC5B4; &#xC120;&#xD0DD;&#xC774;&#xC5C8;&#xC9C0;&#xB9CC;, &#xC774;&#xBBF8; &#xBC30;&#xB294; &#xB5A0;&#xB098;&#xBC84;&#xB838;&#xC2B5;&#xB2C8;&#xB2E4;.)</p><p>&#x2003;<strong>&apos;&#xAC1D;&#xCCB4;&apos;</strong>&#xB294; <strong>&#xC81C; &#xC758;&#xB3C4;</strong>&#xC640;&#xB294; &#xB2E4;&#xB974;&#xAC8C; <strong>&#xD65C;&#xC131;&#xC801;</strong>&#xC774;&#xC9C0; &#xBABB;&#xD588;&#xACE0; &apos;&#xB370;&#xC774;&#xD130;&apos;&#xB97C; &#xC5F0;&#xC0C1;&#xC2DC;&#xD0A4;&#xB294; &#xB098;&#xC05C; &#xB2E8;&#xC5B4;&#xC600;&#xC2B5;&#xB2C8;&#xB2E4;. Simula&#xB294; &#xC778;&#xC2A4;&#xD134;&#xC2A4;&#xB97C; &apos;&#xD504;&#xB85C;&#xC138;&#xC2A4;&apos;&#xB77C; &#xBD88;&#xB800;&#xB294;&#xB370; &#xADF8;&#xAC8C; &#xCC28;&#xB77C;&#xB9AC; &#xB0AB;&#xB354;&#xAD70;&#xC694;. &quot;&#xD504;&#xB85C;&#xC138;&#xC2A4; &#xC9C0;&#xD5A5; &#xD504;&#xB85C;&#xADF8;&#xB798;&#xBC0D;, &#xBA54;&#xC2DC;&#xC9C0; &#xC9C0;&#xD5A5; &#xD504;&#xB85C;&#xADF8;&#xB798;&#xBC0D;, &#xC11C;&#xBC84; &#xC9C0;&#xD5A5; &#xD504;&#xB85C;&#xADF8;&#xB798;&#xBC0D;&quot;&#xC774;&#xB77C;&#xACE0; &#xC774;&#xB984; &#xBD99;&#xC774;&#xB294; &#xAC8C; &#xC88B;&#xC558;&#xC744; &#xAC83; &#xAC19;&#xC2B5;&#xB2C8;&#xB2E4;.</p><p>&#x2003;&#xC800;&#xB294; <strong>&#xD504;&#xB85C;&#xC138;&#xC2A4; &#xB0B4;&#xBD80;&#xC5D0;&#xC11C; &#xC0C1;&#xD0DC; &#xCC98;&#xB9AC; &#xBC29;&#xC2DD;&#xC744; &#xC740;&#xD3D0;&#xD558;&#xB418;, &#xAC01; &#xD504;&#xB85C;&#xC138;&#xC2A4;&#xB4E4;&#xC744; &#xC11C;&#xB85C;&#xB97C; &#xC704;&#xD55C; &apos;&#xC11C;&#xBC84;&apos;&#xCC98;&#xB7FC; &#xCDE8;&#xAE09;&#xD558;&#xACE0; &#xC2F6;&#xC5C8;&#xC5B4;&#xC694;.</strong> &#xC800;&#xB294; &#xADF8;&#xB7F0; &#xC758;&#xB3C4;&#xB97C; &#xC804;&#xB2EC;&#xD558;&#xACE0; &#xC2F6;&#xC5C8;&#xC2B5;&#xB2C8;&#xB2E4;.&#x201D;</p><hr><p>&#x2003;&#x201C;&quot;&#xAC1D;&#xCCB4;&quot;&#xB97C; &#xC774;&#xD574;&#xD558;&#xB824;&#xBA74; &#xAC01; &#xAC1D;&#xCCB4;&#xAC00; &#xC544;&#xC774;&#xB514;&#xC5B4;&#xB77C;&#xACE0; &#xC0DD;&#xAC01;&#xD574;&#xBCF4;&#xC138;&#xC694;. &#xC694;&#xCCAD;(&#xBA85;&#xB839; X)&#xC5D0; &#xB300;&#xD574; &#xC720;&#xC758;&#xBBF8;&#xD55C; &#xBC18;&#xC751;&#xB4E4;&#xC744; &#xAC00;&#xC9C4; &#xC544;&#xC774;&#xB514;&#xC5B4;&#xC694;. &#xCC28;&#xB4F1; &#xAD8C;&#xD55C;&#xC744; &#xAC00;&#xC9C4; &#xC11C;&#xBC84;&#xCC98;&#xB7FC;&#xC694;.<br>&#x2003;&#xC774;&#xB807;&#xAC8C; &#xD558;&#xBA74; &#xD070; &#xC2DC;&#xC2A4;&#xD15C;&#xC744; &#xC2E4;&#xD589;&#xD558;&#xB294; &#xC911;&#xC5D0;&#xB3C4; &#xC548;&#xC804;&#xD558;&#xACE0; &#xB2E4;&#xC591;&#xD558;&#xAC8C; &#xD655;&#xC7A5;&#xD558;&#xACE0;, &#xC7AC;&#xAD6C;&#xC131;&#xC744; &#xD560; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.(&#xBB38;&#xC81C;&#xB97C; &#xD574;&#xACB0;&#xD558;&#xAC70;&#xB098; &#xBCC0;&#xACBD;&#xD558;&#xAE30; &#xC704;&#xD574; &#xC2DC;&#xC2A4;&#xD15C;&#xC744; &#xC911;&#xB2E8;&#xD574;&#xC57C; &#xD55C;&#xB2E4;&#xBA74;, &#xC2DC;&#xC2A4;&#xD15C; &#xC124;&#xACC4;&#xAC00; &#xC798;&#xBABB;&#xB41C; &#xAC81;&#xB2C8;&#xB2E4;.)&#x201D;</p><hr><p>&#x2003;&#x201C;&#xC88B;&#xB4E0; &#xB098;&#xC058;&#xB4E0;, &#xC5EC;&#xB7EC; &#xC774;&#xC720;&#xB85C; C++&#xC740; &#xD070; &#xC778;&#xAE30;&#xB97C; &#xC5BB;&#xC5C8;&#xC2B5;&#xB2C8;&#xB2E4;. C++&#xC740; &quot;&#xAC1D;&#xCCB4; &#xC9C0;&#xD5A5; &#xC5B8;&#xC5B4;&quot;&#xB77C;&#xB294; &#xD3C9;&#xAC00;&#xB97C; &#xBC1B;&#xC558;&#xACE0;, &#xB9CE;&#xC740; &#xC0AC;&#xB78C;&#xB4E4;&#xC774; &#xADF8;&#xB807;&#xAC8C; &#xC598;&#xAE30;&#xD569;&#xB2C8;&#xB2E4;. &#xD558;&#xC9C0;&#xB9CC; &#xC81C;&#xAC00; &#xC0DD;&#xAC01;&#xD55C; OOP&#xC640;&#xB294; &#xB9CE;&#xC774; &#xB3D9;&#xB5A8;&#xC5B4;&#xC838; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;. <br>&#x2003;&#xC774;&#xB294; &quot;&#xAC1D;&#xCCB4; &#xC9C0;&#xD5A5;&quot;&#xC758; &quot;&#xC2DD;&#xBBFC;&#xC9C0;&#xD654;&quot; &#xC911; &#xD558;&#xB098;&#xC600;&#xC2B5;&#xB2C8;&#xB2E4;. 80&#xB144;&#xB300; &#xB9D0;&#xC5D0; &quot;&#xAC1D;&#xCCB4; &#xC9C0;&#xD5A5;&quot;&#xC740; &#xC77C;&#xC885;&#xC758; &#xC720;&#xD589;&#xC774;&#xC5C8;&#xC2B5;&#xB2C8;&#xB2E4;. &#xC628;&#xAC16; &#xBD84;&#xC57C;&#xC5D0;&#xC11C; &#xB108;&#xBB34; &#xC4F0;&#xB294; &#xBC14;&#xB78C;&#xC5D0; Parc&#xC758; &#xC18C;&#xD504;&#xD2B8;&#xC6E8;&#xC5B4;&#xB294; &quot;&#xAC1D;&#xCCB4; &#xC9C0;&#xD5A5;&quot;&#xC774;&#xB77C;&#xB294; &#xB9D0;&#xB85C; &#xC124;&#xBA85;&#xD560; &#xC218; &#xC5C6;&#xC5B4;&#xC84C;&#xACE0;, &quot;&#xC9C4;&#xC9DC; &#xAC1D;&#xCCB4; &#xC9C0;&#xD5A5;&quot;&#xC774;&#xB77C;&#xB294; &#xB9D0;&#xAE4C;&#xC9C0; &#xC368;&#xC57C; &#xD588;&#xC2B5;&#xB2C8;&#xB2E4;.&#x201D;</p><hr><p>&#x2003;&#x201C;(&#xC801;&#xC5B4;&#xB3C4; &#xC81C; &#xC0DD;&#xAC01;&#xC5D0;&#xB294;) OOP&#xB294; &#xD328;&#xB7EC;&#xB2E4;&#xC784;&#xC5D0; &#xAD6D;&#xD55C;&#xD560; &#xAC8C; &#xC544;&#xB2CC;, &#xADF8;&#xBCF4;&#xB2E4;&#xB3C4; &#xB354;&#xC6B1; &#xC2E4;&#xD589;&#xC131;&#xC774; &#xC88B;&#xC740; &apos;&#xBCF4;&#xD3B8;&#xC801; &#xC815;&#xC758;&apos; &#xCCB4;&#xACC4;&#xC774;&#xACE0;, &#xB300;&#xADDC;&#xBAA8; &#xC2DC;&#xC2A4;&#xD15C;&#xC744; &#xC815;&#xC758;&#xD560; &#xB54C; &#xC801;&#xD569;&#xD569;&#xB2C8;&#xB2E4;. &#x201D;</p><hr><ol><li>&apos;&#xB204;&#xAD70;&#xAC00;&#xD55C;&#xD14C;&apos; &#xBA54;&#xC2DC;&#xC9C0;&#xB97C; &#xBCF4;&#xB0BC; &#xB54C;, &#xADF8; &#xBA54;&#xC2DC;&#xC9C0;&#xB294; &#xC5B4;&#xB5A4; &#xAC74;&#xC9C0; &#xC0DD;&#xAC01;&#xD574;&#xBCF4;&#xC138;&#xC694;. &#xBA85;&#xB839;&#xC778;&#xC9C0;, &#xC694;&#xCCAD;&#xC778;&#xC9C0;, &#xC81C;&#xC548;&#xC778;&#xC9C0;, &#xD611;&#xC0C1;&#xC778;&#xC9C0;.</li><li>&apos;&#xB204;&#xAD70;&#xAC00;&#xD55C;&#xD14C;&apos; &#xBA54;&#xC2DC;&#xC9C0;&#xB97C; &#xBCF4;&#xB0BC; &#xC218;&#xB294; &#xC788;&#xC9C0;&#xB9CC;, &#xB3C4;&#xC911;&#xC5D0; &#xC218;&#xC2E0;&#xC790;&#xB098; &#xC1A1;&#xC2E0;&#xC790;&#xC758; &#xB9C8;&#xC74C;&#xC774; &#xBC14;&#xB014; &#xC218;&#xB3C4; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.</li><li>&#xBA54;&#xC2DC;&#xC9C0;&#xB97C; &#xBCF4;&#xB0BC; &#xB54C;, &#xC815;&#xB9D0;&#xB85C; &#xD2B9;&#xC815; &#xB300;&#xC0C1;&#xC5D0;&#xAC8C;&#xB9CC; &#xBCF4;&#xB0B4;&#xACE0; &#xC2F6;&#xC740;&#xC9C0; &#xB2E4;&#xC2DC; &#xC0DD;&#xAC01;&#xD574;&#xBCF4;&#xC138;&#xC694;. &#xD544;&#xC694;&#xC5D0; &#xB530;&#xB77C;&#xC11C;&#xB294; &apos;&#xC694;&#xCCAD;&apos;&#xC744; &#xBCF4;&#xB0B4;&#xAC70;&#xB098;, &#xACF5;&#xB3D9;&#xCCB4;&#xC5D0; x,y,z&#xB97C; &#xACF5;&#xAE09;&#xD560; &#xC218; &#xC788;&#xB2E4;&#xACE0; &#xC2DC;&#xC2A4;&#xD15C;&#xC5D0;&#xAC8C; &#xC54C;&#xB9AC;&#xB294; &#xAC8C; &#xB098;&#xC744; &#xC218;&#xB3C4; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.</li></ol><hr><p>&#x2003;&#x201C;<strong>&#xBCF4;&#xD638;&#xB418;&#xB294; &#xBAA8;&#xB4C8;, &#xBA85;&#xB839;&#xC774; &#xC544;&#xB2CC; &#xBA54;&#xC2DC;&#xC9C0;, &#xD568;&#xC218;&#xD615; &#xAD00;&#xACC4;</strong>. &#xC774; &#xAC1C;&#xB150;&#xB4E4; &#xC0AC;&#xC774;&#xC5D0;&#xC120; &#xCDA9;&#xB3CC;&#xC774; &#xC804;&#xD600; &#xC5C6;&#xC5B4;&#xC57C; &#xD568;&#xC744; &#xC720;&#xB150;&#xD558;&#xC138;&#xC694;. <br>&#x2003;&#xAC1C;&#xC778;&#xC801;&#xC73C;&#xB85C; &#xCD94;&#xCC9C;&#xD558;&#xB294; &#xD734;&#xB9AC;&#xC2A4;&#xD2F1;&#xC740;&#x300C;&#xC2DC;&#xC2A4;&#xD15C;&#xC744; &#xC0DD;&#xAC01;&#x300D;&#xD558;&#xC9C0; &#xB9D0;&#xACE0;&#x300C;&#xC0DD;&#xBB3C;&#xD559;&#xC801;&#xC73C;&#xB85C; &#xC0DD;&#xAC01;&#x300D;&#xD574;&#xBCF4;&#xC138;&#xC694;. &#xC138;&#xD3EC;&#xB97C; &#xAC1D;&#xCCB4;&#xB77C;&#xACE0; &#xC0DD;&#xAC01;&#xD558;&#xBA74; &#xC911;&#xC694;&#xD55C; &#xC6D0;&#xB9AC;&#xB4E4;&#xC774; &#xB9CE;&#xC774;, &#xAE08;&#xBC29; &#xB5A0;&#xC624;&#xB985;&#xB2C8;&#xB2E4;.&#x201D;</p><hr><p>&#x2003;&#x201C;<strong>&#xAC1D;&#xCCB4;&#xB4E4;&#xC774; &#xC11C;&#xB85C; &#xC5B4;&#xB5BB;&#xAC8C; &#xD1B5;&#xC2E0;</strong>&#xD560;&#xC9C0; &#xC0DD;&#xAC01;&#xD574;&#xBCF4;&#xC138;&#xC694;. &#xC804;&#xC1A1;&#xD560; <strong>&#xBA54;&#xC2DC;&#xC9C0;&#xC758; &#xB2E8;&#xC21C;&#xD568;, &#xD48D;&#xBD80;&#xD568;, &#xBAA8;&#xB4C8;&#xC758; &#xBB34;&#xACB0;&#xC131;, &#xD22C;&#xBA85;&#xC131;</strong>...&#xC774;&#xAC83;&#xB4E4;&#xC744; &#xC5B4;&#xB5BB;&#xAC8C; &#xD504;&#xB85C;&#xADF8;&#xB798;&#xBC0D;&#xD574;&#xC57C; &#xD55C;&#xACC4;&#xB97C; &#xB6F0;&#xC5B4;&#xB118;&#xC744; &#xC218; &#xC788;&#xC744;&#xC9C0; &#xACE0;&#xBBFC;&#xD574;&#xBCF4;&#xC138;&#xC694;.&#x201D;</p><hr><p>&#x2003;&#x201C;<strong>&#xB290;&#xB9B0; &#xBC14;&#xC778;&#xB529;&#xC740; &#xC720;&#xC5F0;&#xC131;&#xACFC; &#xC548;&#xC804;&#xC131;&#xC744; &#xC720;&#xC9C0;&#xD558;&#xB294; &#xC120;&#xC5D0;&#xC11C; &#xCD5C;&#xB300;&#xD55C; &#xB2E4;&#xC591;&#xD55C; &#xBC29;&#xC548;</strong>&#xC744; &#xB9C8;&#xB828;&#xD558;&#xC794; &#xC758;&#xB3C4;&#xC785;&#xB2C8;&#xB2E4;. &#xCEA1;&#xC290;&#xD654;&#xB41C; &#xAC1D;&#xCCB4;&#xB294; &quot;&#xC5B4;&#xB5BB;&#xAC8C;(&#xBA54;&#xC18C;&#xB4DC;)&quot;&#xB97C; &#xB290;&#xB9AC;&#xAC8C; &#xBC14;&#xC778;&#xB529;&#xD558;&#xACE0; &quot;&#xBB34;&#xC5C7;(&#xC758;&#xBBF8;)&quot;&#xC744; &#xC0AC;&#xC6A9;&#xD568;&#xC73C;&#xB85C;&#xC11C; &#xB2E4;&#xC591;&#xD55C; &#xB300;&#xC548;&#xACFC; &#xD22C;&#xBA85;&#xC131;&#xC744; &#xAD6C;&#xD604;&#xD569;&#xB2C8;&#xB2E4;. &#x201D;</p><hr><p>&#x2003;&#x201C;&#xC62C;&#xD574;&#xB294; &#xC81C;&#xAC00; &quot;&#xBE44; &#xBA85;&#xB839;&#xD615; &#xBA54;&#xC2DC;&#xC9C0;&#xB85C; &#xC18C;&#xD1B5;&#xD558;&#xB294; &#xCEA1;&#xC290;&#xD654;&#xB41C; &#xC11C;&#xBC84;&quot;&#xB4E4;&#xB85C; &#xBB34;&#xC5C7;&#xC774;&#xB4E0; &#xB9CC;&#xB4E4;&#xC5B4;&#xB0BC; &#xC218; &#xC788;&#xB2E4;&#xB294; &#xB2E8;&#xC21C;&#xD55C; &#xC0DD;&#xAC01;&#xC758; &#xD798;&#xC744; &quot;&#xC778;&#xC2DD;&quot;&#xD55C;&#xC9C0; 50&#xC8FC;&#xB144;&#xC774; &#xB418;&#xB294; &#xD574;&#xC785;&#xB2C8;&#xB2E4;.</p><hr><p>&#x2003;&#x201C;&#xC120;&#xC5B8;&#xC801; &#xD504;&#xB85C;&#xADF8;&#xB798;&#xBC0D;&#xC744; &#xC0DD;&#xAC01;&#xD560; &#xAD00;&#xC810; &#xC911; &#xD558;&#xB098;&#xB294; &quot;&#xC5B4;&#xB5BB;&#xAC8C;&quot;&#xC640; &quot;&#xBB34;&#xC5C7;&quot;&#xC744; &#xAD6C;&#xBD84;&#xD558;&#xB294; &#xAC83;&#xC785;&#xB2C8;&#xB2E4;. &#xC5ED;&#xC0AC;&#xC801;&#xC73C;&#xB85C; &#xD504;&#xB85C;&#xADF8;&#xB798;&#xBC0D;&#xC740; &quot;&#xC5B4;&#xB5BB;&#xAC8C;&quot;&#xC5D0;&#xC11C; &#xC2DC;&#xC791;&#xD588;&#xACE0;, &#xD504;&#xB85C;&#xADF8;&#xB7A8;&#xC740; &#xC8FC;&#xC5B4;&#xC9C4; &#xC790;&#xC6D0;&#xACFC; &#xB3C4;&#xAD6C;&#xB85C; &#xC6D0;&#xD558;&#xB294; &#xACB0;&#xACFC;&#xB97C; &#xB3C4;&#xCD9C;&#xD558;&#xAE30; &#xC704;&#xD55C; &#xC804;&#xC220;&#xC774;&#xC5C8;&#xC2B5;&#xB2C8;&#xB2E4;. &#xC124;&#xACC4;&#xB3C4; &#xC5C6;&#xC774; &#xC21C;&#xC11C;&#xB300;&#xB85C; &#xC9D1;&#xC744; &#xC9D3;&#xB294; &#xACA9;&#xC774;&#xC5C8;&#xC8E0;.</p><p>&#x2003;&#xAC74;&#xCD95; &#xD604;&#xC7A5;&#xC5D0;&#xC120; &#xAC70;&#xC758; &#xD56D;&#xC0C1; &quot;&#xBB34;&#xC5C7;&quot;&#xC744; &#xC5FC;&#xB450;&#xC5D0; &#xB461;&#xB2C8;&#xB2E4;. &#xBCF8; &#xC791;&#xC5C5;&#xC744; &#xD558;&#xAE30; &#xC804;&#xC5D0; &#xAD6C;&#xD604;&#xC744; &#xBA3C;&#xC800; &#xD558;&#xC8E0;. &#xC608;&#xB97C; &#xB4E4;&#xBA74; &#xC9D1; &#xC124;&#xACC4;&#xB3C4;&#xB098;, &#xC12C;&#xC138;&#xD55C; &#xBBF8;&#xB2C8; &#xBAA8;&#xD615;&#xC774;&#xC694;. &#xADF8;&#xB7F0; &#xAC83;&#xC774; &quot;&#xC120;&#xC5B8;&#xC801;&#xC778; &#xB0B4;&#xC6A9;&quot;&#xC785;&#xB2C8;&#xB2E4;. &#xC0AC;&#xB78C;&#xC740; &#xADF8;&#xAC78; &#xBCF4;&#xBA74;&#xC11C; &#xBAA9;&#xD45C;&#xB97C; &#xC704;&#xD55C; &#xC804;&#xC220;&#xC744; &#xAD6C;&#xC131;&#xD558;&#xACE0;&#xC694;. &#xADF8;&#xB807;&#xAC8C; &#xD574;&#xC11C; &#xC804;&#xC220;/&#xBC29;&#xBC95;&#xC740; &#xC804;&#xB7B5;/&#xACC4;&#xD68D;&#xC744; &#xCC38;&#xC870;&#xD558;&#xACE0;, &#xBE44;&#xAD50;&#xD558;&#xACE0;, &#xC0C1;&#xD669;&#xC744; &#xD310;&#xB2E8;&#xD569;&#xB2C8;&#xB2E4;.&#x201D;</p><hr><h2 id="%ED%99%95%EC%9E%A5%EC%84%B1">&#xD655;&#xC7A5;&#xC131;</h2><p>&#x2003;&#xC18C;&#xADDC;&#xBAA8; &#xD504;&#xB85C;&#xC81D;&#xD2B8;&#xC5D0;&#xB3C4; &#xC790;&#xC8FC; &#xB9C8;&#xC8FC;&#xCE60; &#xC218; &#xC788;&#xB294; &#xBB38;&#xC81C; &#xC911; &#xD558;&#xB098;&#xB294; &#xD655;&#xC7A5;&#xC131;&#xC774;&#xB2E4;. &#xAC70;&#xC758; &#xBE44;&#xC2B7;&#xD558;&#xAC70;&#xB098; &#xD750;&#xB984;&#xC740; &#xAC19;&#xC740;&#xB370;&#xB3C4;, &#xC644;&#xC804;&#xD788; &#xB3D9;&#xC77C;&#xD558;&#xC9C0; &#xC54A;&#xC73C;&#xBA74; &#xC7AC;&#xC0AC;&#xC6A9;&#xC774; &#xC5B4;&#xB824;&#xC6B4; &#xCF54;&#xB4DC;&#xAC00; &#xB9CE;&#xB2E4;. &#xAD6C;&#xD604; &#xC0AC;&#xD56D; &#xC790;&#xCCB4;&#xB294; &#xAC19;&#xC740;&#xB370;&#xB3C4; UI&#xAC00; &#xB2E4;&#xB974;&#xB2E4;&#xB294; &#xC774;&#xC720;&#xB9CC;&#xC73C;&#xB85C; &#xCF54;&#xB4DC;&#xB97C; &#xC0C8;&#xB85C;&#xC774; &#xC791;&#xC131;&#xD574;&#xC57C; &#xD558;&#xBA74; &#xC785;&#xB9DB;&#xC774; &#xC501;&#xC4F8;&#xD558;&#xB2E4;. </p><p>&#x2003;&#xC774;&#xB7EC;&#xD55C; &#xACBD;&#xC6B0;, &#xAD6C;&#xD604; &#xC0AC;&#xD56D;&#xC774; &#xB611;&#xAC19;&#xAE30; &#xB54C;&#xBB38;&#xC5D0; &#xBCC0;&#xACBD;&#xB3C4; &#xB611;&#xAC19;&#xC774; &#xC2DC;&#xD589;&#xD574;&#xC57C; &#xD558;&#xB294;&#xB370; &#xC2E4;&#xC218; &#xD655;&#xB960;&#xC774; &#xB192;&#xC544;&#xC9C4;&#xB2E4;. UI&#xC640; &#xB85C;&#xC9C1;&#xC744; &#xB3C5;&#xB9BD;&#xC801;&#xC73C;&#xB85C; &#xAD6C;&#xBD84;&#xD558;&#xB418;, &#xC7AC;&#xC0AC;&#xC6A9;&#xC744; &#xACE0;&#xB824;&#xD574;&#xC11C; &#xC124;&#xACC4;&#xD574;&#xC57C; &#xD560; &#xB54C;&#xAC00; &#xC788;&#xB2E4;. &#xC544;&#xD1A0;&#xBBF9; &#xB514;&#xC790;&#xC778; &#xD328;&#xD134;&#xC73C;&#xB85C; UI&#xB97C; &#xC798;&#xAC8C; &#xB098;&#xB220; &#xC7AC;&#xC0AC;&#xC6A9;&#xD560; &#xC218; &#xC788;&#xACE0;, &#xB808;&#xC774;&#xC5B4;&#xC5D0; &#xB530;&#xB85C; &#xD568;&#xC218;&#xB97C; API&#xCC98;&#xB7FC; &#xBAA8;&#xC544;&#xB458; &#xC218;&#xB3C4; &#xC788;&#xB2E4;. HoC&#xB85C; &#xAC10;&#xC2F8;&#xC11C; &#xACBD;&#xC6B0;&#xC5D0; &#xB530;&#xB77C; &#xC120;&#xD0DD;&#xC801;&#xC73C;&#xB85C; &#xCEF4;&#xD3EC;&#xB10C;&#xD2B8;&#xB97C; &#xD45C;&#xC2DC;&#xD558;&#xB3C4;&#xB85D; &#xC124;&#xC815;&#xD558;&#xB294; &#xBC29;&#xBC95;&#xB3C4; &#xC788;&#xB2E4;.<br>&#x2003;&#xBC29;&#xBC95;&#xC740; &#xAC00;&#xC9C0;&#xAC01;&#xC0C9;&#xC774;&#xC9C0;&#xB9CC;, &#xC774;&#xB7EC;&#xD55C; &#xACE0;&#xBBFC;&#xACFC; &#xD574;&#xACB0;&#xB4E4; &#xC18D;&#xC5D0;&#xB3C4; &#xAC1D;&#xCCB4; &#xC9C0;&#xD5A5;&#xC758; &#xC815;&#xC2E0;&#xC774; &#xD3EC;&#xD568;&#xB3FC;&#xC788;&#xB2E4;&#xACE0; &#xC0DD;&#xAC01;&#xD55C;&#xB2E4;.</p><h2 id="%EB%A7%88%EB%AC%B4%EB%A6%AC">&#xB9C8;&#xBB34;&#xB9AC;</h2><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://blog.cinntiq.synology.me/content/images/2023/02/202302200001.jpg" class="kg-image" alt="&#xAC1D;&#xCCB4; &#xC9C0;&#xD5A5;&#xACFC; &#xD504;&#xB85C;&#xADF8;&#xB798;&#xBC0D;" loading="lazy" width="2000" height="929" srcset="https://blog.cinntiq.synology.me/content/images/size/w600/2023/02/202302200001.jpg 600w, https://blog.cinntiq.synology.me/content/images/size/w1000/2023/02/202302200001.jpg 1000w, https://blog.cinntiq.synology.me/content/images/size/w1600/2023/02/202302200001.jpg 1600w, https://blog.cinntiq.synology.me/content/images/size/w2400/2023/02/202302200001.jpg 2400w" sizes="(min-width: 720px) 720px"><figcaption>&#xBA54;&#xC2DC;&#xC9C0;&#xB294; &#xAC04;&#xACB0;&#xD558;&#xAC8C;, &#xAC01; &#xAC1D;&#xCCB4;&#xB4E4;&#xC740; &#xB3C5;&#xB9BD;&#xC801;&#xC774;&#xACE0;, &#xC790;&#xCCB4; &#xD310;&#xB2E8;&#xC744;.</figcaption></figure><p>&#x2003;&#xC758;&#xC0AC;, &#xC57D;&#xC0AC;&#xAC00; &#xAC01;&#xAC01; &#xD55C; &#xBA85; &#xBFD0;&#xC774;&#xB77C;&#xBA74;, &#xADF8;&#xB9AC;&#xACE0; &#xC758;&#xC0AC;&#xB098; &#xC57D;&#xC0AC;&#xC5D0;&#xAC8C; &#xBB34;&#xC2A8; &#xC77C;&#xC774; &#xC0DD;&#xACA8;&#xC11C; &#xC81C; &#xC77C;&#xC744; &#xBABB;&#xD558;&#xAC8C; &#xB41C;&#xB2E4;&#xBA74; &#xC804;&#xCCB4;&#xC801;&#xC778; &#xC791;&#xC5C5; &#xD750;&#xB984;&#xC774; &#xB04A;&#xAE38; &#xAC83;&#xC774;&#xB2E4;. &#xADF8;&#xB807;&#xAE30; &#xB54C;&#xBB38;&#xC5D0; &#xC758;&#xC0AC; B, &#xC57D;&#xC0AC; B, C&#xC5D0;&#xAC8C; &#xCC3E;&#xC544;&#xAC08; &#xC218; &#xC788;&#xB3C4;&#xB85D; &#xADF8;&#xB54C;&#xADF8;&#xB54C; &#xC0C1;&#xD669;&#xC5D0; &#xB9DE;&#xCD9C; &#xC218; &#xC788;&#xB3C4;&#xB85D; &#xB290;&#xB9B0; &#xBC14;&#xC778;&#xB529;, &#xC5EC;&#xB7EC; &#xB300;&#xC548;&#xC774; &#xD544;&#xC694;&#xD558;&#xB2E4;.</p><p>&#x2003;&#xC18C;&#xC2A4; &#xCF54;&#xB4DC;&#xB294; &#xC704;&#xC5D0;&#xC11C; &#xC544;&#xB798;&#xB85C; &#xC21C;&#xCC28;&#xC801;&#xC73C;&#xB85C; &#xD750;&#xB978;&#xB2E4;. &#xACE0;&#xC218;&#xC900;&#xC5D0;&#xC11C; &#xACB0;&#xC815;&#xC744; &#xB0B4;&#xB9AC;&#xACE0;, &#xC800;&#xC218;&#xC900;&#xC5D0;&#xC11C;&#xB294; &#xC138;&#xBD80;&#xC801;&#xC778; &#xCC98;&#xB9AC;&#xB97C; &#xD55C;&#xB2E4;. <br>&#x2003;&#xC568;&#xB7F0; &#xCF00;&#xC774;&#xB294; &#xD504;&#xB85C;&#xADF8;&#xB7A8;&#xC774; &#xBCC0;&#xD654;&#xC5D0;&#xB3C4; &#xBD80;&#xB4DC;&#xB7FD;&#xACE0; &#xC27D;&#xAC8C; &#xC801;&#xC6A9;, &#xD655;&#xC7A5;&#xB418;&#xAE38; &#xBC14;&#xB7AC;&#xACE0; &#xADF8;&#xC758; &#xC815;&#xC2E0;&#xC740; &#xB85C;&#xBC84;&#xD2B8; &#xB9C8;&#xD2F4;&#xC774; &#xC81C;&#xC548;&#xD55C; SOLID &#xC6D0;&#xCE59;&#xC5D0;&#xC11C;&#xB3C4; &#xC870;&#xAE08;&#xC774;&#xB098;&#xB9C8; &#xACC4;&#xC2B9;&#xB410;&#xB2E4;&#xACE0; &#xC0DD;&#xAC01;&#xD55C;&#xB2E4;.</p><ol><li>[&#xB2E8;&#xC77C; &#xCC45;&#xC784;]: &#xAC01;&#xC790;&#xAC00; &#xC790;&#xAE30;&#xB9CC;&#xC758; &#xC720;&#xC77C;&#xD55C; &#xCC45;&#xC784;&#xC744; &#xAC00;&#xC9C0;&#xACE0;,</li><li>[&#xAC1C;&#xBC29; - &#xD3D0;&#xC1C4;]: &#xD655;&#xC7A5;&#xC774; &#xC77C;&#xC5B4;&#xB0A0; &#xB54C;&#xC5D0;&#xB294; &#xBCC0;&#xC9C8; &#xC5C6;&#xC774; &#xC591;&#xB9CC; &#xB298;&#xC5B4;&#xB098;&#xACE0;,</li><li>[&#xB9AC;&#xC2A4;&#xCF54;&#xD504; &#xCE58;&#xD658;]: &#xB300;&#xCCB4;&#xAC00; &#xAC00;&#xB2A5;&#xD55C; &#xAC1C;&#xCCB4;&#xB4E4;&#xC740; &#xC11C;&#xB85C;&#xAC00; &#xB531; &#xB9DE;&#xAC8C; &#xCE58;&#xD658;&#xC774; &#xB418;&#xACE0;,</li><li>[&#xC778;&#xD130;&#xD398;&#xC774;&#xC2A4; &#xBD84;&#xB9AC;]: &#xBD88;&#xD544;&#xC694;&#xD55C; &#xAC83; &#xC5C6;&#xC774;, &#xC815;&#xB9D0; &#xD544;&#xC694;&#xD55C; &#xAC83;&#xB9CC; &#xC694;&#xCCAD;&#xD574;&#xC11C; &#xD611;&#xB825;&#xD558;&#xACE0;,</li><li>[&#xC758;&#xC874;&#xC131; &#xC5ED;&#xC804;]: &#xC791;&#xC740; &#xAC1C;&#xCCB4; &#xB54C;&#xBB38;&#xC5D0; &#xC804;&#xCCB4;, &#xC0C1;&#xC704;&#xAC00; &#xD718;&#xB458;&#xB9AC;&#xB294; &#xC77C; &#xC5C6;&#xC774;, &#xC0C1;&#xC704; &#xAC1C;&#xCCB4;, &#xC0C1;&#xC704; &#xBA54;&#xC2DC;&#xC9C0;&#xB97C; &#xC911;&#xC2EC;&#xC73C;&#xB85C; &#xC5EC;&#xB7EC; &#xAC1C;&#xCCB4;&#xB4E4;&#xC774; &#xC6C0;&#xC9C1;&#xC774;&#xACE0; &#xC18C;&#xD1B5;&#xD55C;&#xB2E4;.</li></ol><h2 id="%EC%B0%B8%EC%A1%B0">&#xCC38;&#xC870;</h2><ul><li><a href="https://ovid.github.io/articles/alan-kay-and-oo-programming.html?ref=blog.cinntiq.synology.me">Alan Kay and OO Programming</a></li><li><a href="https://wiki.c2.com/?AlanKayOnMessaging=&amp;ref=blog.cinntiq.synology.me">Alan Kay On Messaging</a></li><li><a href="https://www.quora.com/What-did-Alan-Kay-mean-by-I-made-up-the-term-object-oriented-and-I-can-tell-you-I-did-not-have-C++-in-mind?ref=blog.cinntiq.synology.me">What did Alan Kay mean by, &quot;I made up the term object-oriented, and I can tell you I did not have C++ in mind.&quot;?</a></li><li><a href="https://www.quora.com/Why-is-object-oriented-programming-more-about-messaging-than-objects?ref=blog.cinntiq.synology.me">Why is object-oriented programming more about messaging than objects?</a></li><li><a href="https://www.quora.com/I-read-somewhere-that-object-oriented-programming-was-coined-by-Alan-Kay-circa-1966-or-1967-while-he-was-at-grad-school-Has-anyone-influenced-contributed-Alan-to-coin-such-a-term?ref=blog.cinntiq.synology.me">I read somewhere that object-oriented programming was coined by Alan Kay circa 1966 or 1967 while he was at grad school. Has anyone influenced/contributed Alan to coin such a term?</a></li><li><a href="https://www.quora.com/What-does-Alan-Kay-think-about-inheritance-in-object-oriented-programming?ref=blog.cinntiq.synology.me">What does Alan Kay think about inheritance in object-oriented programming?</a></li><li><a href="https://www.quora.com/In-object-oriented-programming-why-is-it-bad-practice-to-make-data-members-public-when-the-get-set-public-members-modify-it-anyway?ref=blog.cinntiq.synology.me">In object-oriented programming, why is it bad practice to make data members public when the get() &amp; set() public members modify it anyway?</a></li><li><a href="https://www.quora.com/What-is-the-significance-of-late-binding?ref=blog.cinntiq.synology.me">What is the significance of late binding?</a></li><li><a href="https://www.quora.com/If-one-starts-with-a-state-of-the-art-object-oriented-programming-from-the-late-80s-and-early-90s-Smalltalk-Self-CLOS-what-could-have-been-the-next-breakthrough-in-that-style-of-programming-but-never-happened?ref=blog.cinntiq.synology.me">If one starts with a state of the art object-oriented programming from the late 80s and early 90s (Smalltalk, Self, CLOS), what could have been the next breakthrough in that style of programming, but never happened?</a></li><li><a href="https://www.quora.com/Whats-the-best-way-of-combining-functional-and-OO-programming-in-practice?ref=blog.cinntiq.synology.me">What&apos;s the best way of combining functional and OO programming in practice?</a></li><li><a href="https://www.quora.com/What-is-Alan-Kays-definition-of-Object-Oriented?ref=blog.cinntiq.synology.me">What is Alan Kay&apos;s definition of Object Oriented?</a></li></ul>]]></content:encoded></item><item><title><![CDATA[2023년 2월]]></title><description><![CDATA[바닐라 JS로 페이지네이션]]></description><link>https://blog.cinntiq.synology.me/journal-1/</link><guid isPermaLink="false">63ed915363bc770001335df8</guid><category><![CDATA[code]]></category><category><![CDATA[JavaScript]]></category><category><![CDATA[journal]]></category><dc:creator><![CDATA[Hameln]]></dc:creator><pubDate>Fri, 17 Feb 2023 07:50:21 GMT</pubDate><media:content url="https://blog.cinntiq.synology.me/content/images/2023/02/journal1-003.jpg" medium="image"/><content:encoded><![CDATA[<h2 id="%ED%8E%98%EC%9D%B4%EC%A7%80%EB%84%A4%EC%9D%B4%EC%85%98">&#xD398;&#xC774;&#xC9C0;&#xB124;&#xC774;&#xC158;</h2><img src="https://blog.cinntiq.synology.me/content/images/2023/02/journal1-003.jpg" alt="2023&#xB144; 2&#xC6D4;"><p>HTML, CSS, JavaScript&#xB9CC;&#xC73C;&#xB85C; &#xAC04;&#xB2E8;&#xD55C; &#xD398;&#xC774;&#xC9C0;&#xB124;&#xC774;&#xC158;&#xC744; &#xAD6C;&#xD604;&#xD55C;&#xB2E4;.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://blog.cinntiq.synology.me/content/images/2023/02/202302160001.jpg" class="kg-image" alt="2023&#xB144; 2&#xC6D4;" loading="lazy" width="498" height="187"><figcaption>CSS&#xB294; &#xBD10;&#xB2EC;&#xB77C;. &#xAE30;&#xB2A5; &#xAD6C;&#xD604;&#xC5D0; &#xC9D1;&#xC911;&#xD558;&#xACA0;&#xB2E4;.</figcaption></figure><p>&#xD398;&#xC774;&#xC9C0;&#xB124;&#xC774;&#xC158;&#xC744; &#xD558;&#xB824;&#xBA74; &#xBB34;&#xC2A8; &#xAE30;&#xB2A5;&#xB4E4;&#xC774; &#xD544;&#xC694;&#xD560;&#xAE4C;?</p><ul><li>&#xD14C;&#xC774;&#xBE14;&#xC5D0; &#xD3BC;&#xCE60; &#xB370;&#xC774;&#xD130; fetch.</li><li>2&#xBC88; &#xBC84;&#xD2BC; &#xD074;&#xB9AD; &#xC2DC;:<br>2&#xBC88; &#xBC84;&#xD2BC; &#xC0C9; &#xBCC0;&#xACBD;. 1&#xBC88; &#xBC84;&#xD2BC; &#xC0C9; &#xC6D0;&#xB798;&#xB300;&#xB85C;.<br>2&#xBC88; &#xBC84;&#xD2BC;&#xC5D0; &#xC801;&#xD569;&#xD55C; &#xD14C;&#xC774;&#xBE14; &#xB370;&#xC774;&#xD130; &#xD638;&#xCD9C;.</li><li>&#xB4DC;&#xB86D;&#xB2E4;&#xC6B4; &#xD074;&#xB9AD; &#xC2DC;:<br>15&#xB97C; &#xD074;&#xB9AD; &#xC2DC; &#xB370;&#xC774;&#xD130;&#xAC00; 15&#xAC1C;&#xC529; &#xBCF4;&#xC774;&#xB3C4;&#xB85D; &#xBCC0;&#xACBD;<br>5&#xB97C; &#xD074;&#xB9AD; &#xC2DC; &#xB370;&#xC774;&#xD130;&#xAC00; 5&#xAC1C;&#xC529; &#xBCF4;&#xC774;&#xB3C4;&#xB85D; &#xBCC0;&#xACBD;<br>&#xBCF4;&#xB358; index&#xC5D0; &#xB9DE;&#xCDB0;&#xC11C; active index &#xBCC0;&#xACBD;</li></ul><p>&#x2003;&#xC774; &#xD398;&#xC774;&#xC9C0;&#xB124;&#xC774;&#xC158;&#xC740; &#xD504;&#xB85C;&#xADF8;&#xB798;&#xBA38;&#xC2A4;&#xC5D0;&#xC11C; &#xC81C;&#xC2DC;&#xD55C; &#xC81C;&#xD55C;&#xC2DC;&#xAC04; 4&#xC2DC;&#xAC04;&#xC9DC;&#xB9AC; &#xC5F0;&#xC2B5; &#xBB38;&#xC81C;&#xB2E4;. &#xC694;&#xAD6C;&#xC0AC;&#xD56D;&#xC5D0; &#xB9DE;&#xCDB0;&#xC11C; &#xAD6C;&#xD604; &#xC911;, &#xACE0;&#xBBFC;&#xC774; &#xB4E4;&#xC5C8;&#xB2E4;.</p><p>&#x2003;&#x2018;&#xC774;&#xB798;&#xB3C4; &#xB418;&#xB098;?&#x2019;</p><p>&#x2003;&#xBB3C;&#xB860; &#xC2E4;&#xC804;&#xC5D0;&#xC120; &#xC2DC;&#xAC04; &#xB0B4; &#xC694;&#xAD6C; &#xC0AC;&#xD56D; &#xCDA9;&#xC871;&#xC774; &#xCD5C;&#xC6B0;&#xC120;&#xC774;&#xB2E4;. &#xADF8;&#xB7EC;&#xB098; &#xADF8;&#xAC74; &#xAE30;&#xCD9C; &#xBB38;&#xC81C;&#xC77C; &#xBFD0;&#xC774;&#xACE0;, &#xB098;&#xB294; &#xACF5;&#xBD80;&#xAC00; &#xD544;&#xC694;&#xD588;&#xB2E4;. <br>&#x2003;&#xB098;&#xB294; &#xBC14;&#xB2D0;&#xB77C; &#xC790;&#xBC14;&#xC2A4;&#xD06C;&#xB9BD;&#xD2B8;&#xB85C; &#xC88B;&#xC740; &#xCF54;&#xB4DC;&#xB97C; &#xC9E4; &#xC218; &#xC788;&#xC744;&#xAE4C;? &#xB0B4;&#xAC00; &#xC544;&#xB294; &#xC9C0;&#xC2DD;&#xC73C;&#xB85C; &#xC88B;&#xC740; &#xD398;&#xC774;&#xC9C0;&#xB124;&#xC774;&#xC158;&#xC744; &#xAD6C;&#xD604;&#xD560; &#xC218; &#xC788;&#xC744;&#xAE4C;?</p><p>&#x2003;&#xCF54;&#xB4DC;&#xB97C; &#xB2E4;&#xC2DC; &#xBCF4;&#xB2C8; &#xC9C0;&#xC2DD;&#xC744; &#xC5B4;&#xC124;&#xD504;&#xAC8C; &#xD65C;&#xC6A9;&#xD558;&#xB294;&#xB370;&#xB2E4;, &#xAC01; &#xD568;&#xC218;&#xAC00; &#xC11C;&#xB85C; &#xC5BD;&#xD600;&#xC11C; &#xD568;&#xC218; &#xC774;&#xB984;&#xC5D0; &#xAC78;&#xB9DE;&#xC9C0; &#xC54A;&#xB294; &#xC0AC;&#xC774;&#xB4DC; &#xC774;&#xD399;&#xD2B8;&#xAC00; &#xC5EC;&#xAE30;&#xC800;&#xAE30; &#xB4A4;&#xC11E;&#xC5EC; &#xC788;&#xC5C8;&#xB2E4;. <br>&#x2003;&#xD654;&#xBA74;&#xB9CC; &#xBCF4;&#xBA74; &#xC801;&#xB2F9;&#xD788; &#xC791;&#xB3D9;&#xD558;&#xC9C0;&#xB9CC;, &#xCF54;&#xB4DC;&#xAC00; &#xC4F8;&#xB370;&#xC5C6;&#xC774; &#xBCF5;&#xC7A1;&#xD588;&#xB2E4;. &#xACC4;&#xD68D;&#xACFC; &#xC815;&#xB9AC;&#xAC00; &#xBD80;&#xC871;&#xD55C; &#xCC44; &#xC11C;&#xB450;&#xB974;&#xACE0; &#xC788;&#xC5C8;&#xB2E4;.</p><figure class="kg-card kg-image-card"><img src="https://blog.cinntiq.synology.me/content/images/2023/02/Group-26.jpg" class="kg-image" alt="2023&#xB144; 2&#xC6D4;" loading="lazy" width="1581" height="1561" srcset="https://blog.cinntiq.synology.me/content/images/size/w600/2023/02/Group-26.jpg 600w, https://blog.cinntiq.synology.me/content/images/size/w1000/2023/02/Group-26.jpg 1000w, https://blog.cinntiq.synology.me/content/images/2023/02/Group-26.jpg 1581w" sizes="(min-width: 720px) 720px"></figure><p>&#x2003;&#xB4A4;&#xC8FD;&#xBC15;&#xC8FD;&#xC774;&#xB2E4;. &#xCF54;&#xB4DC;&#xB97C; &#xC218;&#xC815;&#xD560; &#xB54C;&#xB9C8;&#xB2E4; &#xC5D0;&#xB7EC;&#xAC00; &#xB098;&#xAE30; &#xC77C;&#xC464;&#xC600;&#xB2E4;. &#xC124;&#xB839; &#xB9C8;&#xC9C0;&#xB9C9;&#xC5D0; &#xC798; &#xB3D9;&#xC791;&#xC774; &#xB418;&#xB354;&#xB77C;&#xB3C4;, &#xC774;&#xB807;&#xAC8C; &#xD558;&#xBA74; &#xC548; &#xB41C;&#xB2E8; &#xC0DD;&#xAC01;&#xC774; &#xB4E4;&#xC5C8;&#xB2E4;. &#xC815;&#xB9AC;&#xD574;&#xC11C; &#xB2E4;&#xC2DC; &#xC9DC;&#xBCF4;&#xAE30;&#xB85C; &#xD588;&#xB2E4;.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://blog.cinntiq.synology.me/content/images/2023/02/Group-47.jpg" class="kg-image" alt="2023&#xB144; 2&#xC6D4;" loading="lazy" width="1729" height="1288" srcset="https://blog.cinntiq.synology.me/content/images/size/w600/2023/02/Group-47.jpg 600w, https://blog.cinntiq.synology.me/content/images/size/w1000/2023/02/Group-47.jpg 1000w, https://blog.cinntiq.synology.me/content/images/size/w1600/2023/02/Group-47.jpg 1600w, https://blog.cinntiq.synology.me/content/images/2023/02/Group-47.jpg 1729w" sizes="(min-width: 720px) 720px"><figcaption>&#xBCC0;&#xACBD; &#xD6C4; &#xAD6C;&#xC870;</figcaption></figure><p>&#x2003;handleClick &#xC774;&#xBCA4;&#xD2B8; &#xB4F1;&#xB85D;&#xC740; &#xBCC0;&#xACBD;&#xB420; &#xC77C;&#xC774; &#xC5C6;&#xB294; &#xBD80;&#xBAA8; &#xB178;&#xB4DC;&#xC5D0; &#xB4F1;&#xB85D;&#xD588;&#xB2E4;. </p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://blog.cinntiq.synology.me/content/images/2023/02/Group-44.jpg" class="kg-image" alt="2023&#xB144; 2&#xC6D4;" loading="lazy" width="761" height="437" srcset="https://blog.cinntiq.synology.me/content/images/size/w600/2023/02/Group-44.jpg 600w, https://blog.cinntiq.synology.me/content/images/2023/02/Group-44.jpg 761w" sizes="(min-width: 720px) 720px"><figcaption>&#xD074;&#xB9AD; &#xC2DC; &#xAC01; &#xC774;&#xBCA4;&#xD2B8;&#xC5D0; &#xBC18;&#xC751;&#xC744; &#xCC98;&#xB9AC;&#xD574;&#xC57C; &#xD55C;&#xB2E4;.</figcaption></figure><ul><li>case 1: &#xC22B;&#xC790; &#xBC84;&#xD2BC;&#xB3C4; &#xC544;&#xB2C8;&#xACE0;, &#xD654;&#xC0B4;&#xD45C; &#xBC84;&#xD2BC;&#xB3C4; &#xC544;&#xB2C8;&#xB77C;&#xC11C; &#xC544;&#xBB34; &#xBC18;&#xC751;&#xB3C4; &#xD574;&#xC120; &#xC548; &#xB41C;&#xB2E4;.</li><li>case 2: &#xC22B;&#xC790; &#xBC84;&#xD2BC;&#xC5D0; &#xB9DE;&#xAC8C; index&#xB97C; &#xBCC0;&#xACBD;&#xD55C;&#xB2E4;.</li><li>case 3: &#xCCAB; &#xBC84;&#xD2BC;&#xC774; &#xB20C;&#xB9AC;&#xBA74; index&#xB97C; 0&#xC73C;&#xB85C;, &#xB9C8;&#xC9C0;&#xB9C9; &#xBC84;&#xD2BC;&#xC774; &#xB20C;&#xB9AC;&#xBA74; &#xB9C8;&#xC9C0;&#xB9C9; index&#xB85C; &#xBCC0;&#xACBD;.</li></ul><p>&#x2003;case 1&#xC744; &#xAC10;&#xC218;&#xD558;&#xBA74;&#xC11C; &#xBD80;&#xBAA8; &#xB178;&#xB4DC;&#xC5D0; &#xC774;&#xBCA4;&#xD2B8;&#xB97C; &#xB4F1;&#xB85D;&#xD55C; &#xC774;&#xC720;&#xB294; &#xADF8;&#xAC8C; &#xD3B8;&#xD588;&#xAE30; &#xB54C;&#xBB38;&#xC774;&#xB2E4;. &#xB0B4;&#xBD80; &#xC22B;&#xC790; &#xBC84;&#xD2BC;&#xB4E4;&#xC740; per&#xAC00; &#xBC14;&#xB014; &#xB54C;&#xB9C8;&#xB2E4; &#xC0DD;&#xC131;&#xD574;&#xC57C; &#xD558;&#xACE0;, &#xADF8; &#xB54C;&#xB9C8;&#xB2E4; &#xC774;&#xBCA4;&#xD2B8;&#xB97C; &#xC7AC;&#xB4F1;&#xB85D;&#xD558;&#xB294; &#xCF54;&#xB4DC;&#xB97C; &#xB123;&#xACE0; &#xC2F6;&#xC9C4; &#xC54A;&#xC558;&#xB2E4;.<br>&#x2003;&#xC774;&#xC640; &#xAC19;&#xC740; &#xCF54;&#xB4DC;&#xB294; &#xC774;&#xBCA4;&#xD2B8; &#xBC84;&#xBE14;&#xB9C1; &#xB355;&#xBD84;&#xC5D0; &#xAD6C;&#xD604;&#xD560; &#xC218; &#xC788;&#xB2E4;. </p><figure class="kg-card kg-image-card"><img src="https://blog.cinntiq.synology.me/content/images/2023/02/Group-46.jpg" class="kg-image" alt="2023&#xB144; 2&#xC6D4;" loading="lazy" width="562" height="387"></figure><p>&#x2003;&#xC2E4;&#xC81C; &#xC774;&#xBCA4;&#xD2B8;&#xB294; &#xBC84;&#xD2BC;&#xC5D0;&#xC11C; &#xC77C;&#xC5B4;&#xB098;&#xC9C0;&#xB9CC; &#xBC84;&#xD2BC; &#xC790;&#xCCB4;&#xC5D0;&#xB294; &#xC544;&#xBB34;&#xB7F0; &#xAE30;&#xB2A5;&#xC774; &#xC5C6;&#xB2E4;. &#xD558;&#xC9C0;&#xB9CC; &#xC774;&#xBCA4;&#xD2B8; &#xBC84;&#xBE14;&#xB9C1;&#xC744; &#xD1B5;&#xD574; &#xD074;&#xB9AD; &#xC774;&#xBCA4;&#xD2B8;&#xAC00; &#xC0C1;&#xC704; &#xB178;&#xB4DC;&#xB85C; &#xC62C;&#xB77C;&#xAC00;&#xAE30; &#xB54C;&#xBB38;&#xC5D0; &#xBD80;&#xBAA8; &#xB178;&#xB4DC;&#xAC00; &#xC774;&#xBCA4;&#xD2B8; &#xD578;&#xB4E4;&#xB9C1; &#xD568;&#xC218;&#xB97C; &#xC2E4;&#xD589;&#xD55C;&#xB2E4;.</p><figure class="kg-card kg-code-card"><pre><code class="language-js">(async () =&gt; {
  fetch(&quot;./src/data.json&quot;)
    .then((res) =&gt; res.json())
    .then((result) =&gt; {
      data = result;
      setIndex(0);
    });

  let data;
  let index = 0;
  let per = 5;
  const tbody = document.querySelector(&quot;tbody&quot;);
  const btnBox = document.querySelector(&quot;.pagination&quot;);
  const select = document.querySelector(&quot;#dropdown&quot;);

  const lastIndex = () =&gt; Math.ceil(data.length / per) - 1;

  //? index&#xC5D0; &#xB9DE;&#xB294; &#xB370;&#xC774;&#xD130;, &#xB370;&#xC774;&#xD130; &#xAE38;&#xC774; &#xBC18;&#xD658;
  const getDataAndLength = () =&gt; {
    let next = (index + 1) * per;
    if (next &gt; data.length) next = data.length;
    const newData = data.slice(index * per, next);
    return [newData, newData.length];
  };

  //? index &#xBCC0;&#xACBD; =&gt; active, table &#xBCC0;&#xACBD;.
  const setIndex = (newIndex) =&gt; {
    index = newIndex;
    const [data, length] = getDataAndLength();
    resetTable(length);
    setActive(index);
    setTable(data);
  };

  //? per &#xBE44;&#xAD50; &#xBCC0;&#xACBD; =&gt; &#xBC84;&#xD2BC; &#xCEE8;&#xD14C;&#xC774;&#xB108;, &#xD14C;&#xC774;&#xBE14; reset
  const setPer = (newPer) =&gt; {
    if (per === newPer) return;
    const newIndex = Math.ceil((per * index + 1) / newPer) - 1;
    per = newPer;
    resetButtons(lastIndex() + 1);
    setIndex(newIndex);
  };

  //? active &#xBC84;&#xD2BC; &#xAD50;&#xCCB4;
  const setActive = (index) =&gt; {
    document.querySelector(&quot;.active&quot;)?.classList.remove(&quot;active&quot;);
    const target = document.querySelectorAll(&quot;.button&quot;)[index];
    target.classList.add(&quot;active&quot;);
  };

  //? &#xD14C;&#xC774;&#xBE14; &#xB0B4;&#xC6A9; &#xC8FC;&#xC785;, &#xBCC0;&#xACBD;.
  const setTable = (data) =&gt; {
    const trs = tbody.querySelectorAll(&quot;tr&quot;);
    for (let i = 0; i &lt; trs.length; i++) {
      const tds = trs[i].querySelectorAll(&quot;td&quot;);
      const props = Object.values(data[i]);
      for (let j = 0; j &lt; tds.length; j++) {
        tds[j].textContent = props[j];
      }
    }
  };

  //? &#xD14C;&#xC774;&#xBE14; HTML &#xC0DD;&#xC131;.
  const resetTable = (length) =&gt; {
    const tr = &quot;&lt;tr&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&quot;;
    const newHTML = tr.repeat(length);
    tbody.innerHTML = newHTML;
  };

  //? &#xBC84;&#xD2BC; &#xCEE8;&#xD14C;&#xC774;&#xB108; HTML &#xC0DD;&#xC131;.
  const resetButtons = (last) =&gt; {
    let buttons = &quot;&quot;;

    for (let i = 1; i &lt;= last; i++) {
      buttons += `&lt;button class=&quot;button&quot;&gt;${i}&lt;/button&gt;`;
    }

    const newHTML = `&lt;button class=&quot;start&quot;&gt;&lt;&lt;&lt;/button&gt;
  ${buttons}
  &lt;button class=&quot;last&quot;&gt;&gt;&gt;&lt;/button&gt;`;

    btnBox.innerHTML = newHTML;
  };

  const handleSelect = (event) =&gt; {
    const newPer = Number(event.target.value);
    setPer(newPer);
  };

  //? target&#xC774; &#xBC84;&#xD2BC;&#xC774;&#xBA74; setIndex
  const handleClick = (event) =&gt; {
    const target = event.target.classList.value;
    if (target === &quot;pagination&quot;) return;

    switch (target) {
      case &quot;start&quot;:
        setIndex(0);
        break;
      case &quot;button&quot;:
        const targetIndex = Number(event.target.innerHTML) - 1;
        setIndex(targetIndex);
        break;
      case &quot;last&quot;:
        setIndex(lastIndex());
        break;
      default:
        break;
    }
  };

  btnBox.addEventListener(&quot;click&quot;, handleClick);
  select.addEventListener(&quot;click&quot;, handleSelect);
})();
</code></pre><figcaption>1&#xCC28; &#xCF54;&#xB4DC;</figcaption></figure><p>&#x2003;&#xADF8;&#xB7EC;&#xB098; setIndex, setPer&#xC5D0; &#xC5EC;&#xB7EC; &#xD568;&#xC218;&#xB4E4;&#xC744; &#xBD99;&#xC5EC;&#xC11C; &#xB9AC;&#xB80C;&#xB354;&#xB9C1;&#xD558;&#xB294; &#xBAA8;&#xC2B5;&#xC774; &#xC0AC;&#xC774;&#xB4DC; &#xC774;&#xD399;&#xD2B8;&#xC640; &#xB2E4;&#xB984;&#xC774; &#xC5C6;&#xB2E4;. &#xAC8C;&#xB2E4;&#xAC00; index, per&#xB97C; &#xC5EC;&#xAE30;&#xC800;&#xAE30;&#xC11C; &#xB108;&#xBB34; &#xD3B8;&#xD558;&#xAC8C; &#xAC00;&#xC838;&#xB2E4; &#xC4F4;&#xB2E4;. &#xB0B4; &#xC758;&#xB3C4;&#xC640;&#xB294; &#xAC70;&#xB9AC;&#xAC00; &#xC788;&#xB2E4;.</p><figure class="kg-card kg-code-card"><pre><code class="language-js">(async () =&gt; {
  let data;

  fetch(&quot;./src/data.json&quot;)
    .then((res) =&gt; res.json())
    .then((result) =&gt; {
      data = result;
      render(data);
    });

  const { getIndex, setIndex, getPer, setPer, isStateUpdated } = (() =&gt; {
    let prevState = {
      index: undefined,
      per: undefined,
    };

    let currentState = {
      index: 0,
      per: 5,
    };

    const getIndex = () =&gt; currentState.index;
    const setIndex = (newIndex) =&gt; {
      setState(newIndex, currentState.per);
    };

    const getPer = () =&gt; currentState.per;
    const setPer = (newPer) =&gt; {
      setState(currentState.index, newPer);
    };

    const setState = (index, per) =&gt; {
      if (currentState.index === index &amp;&amp; currentState.per === per) {
        return;
      }

      if (currentState.per !== per) {
        prevState = { ...currentState };
        currentState = { index: 0, per };
      } else {
        prevState = { ...currentState };
        currentState = { index, per };
      }
      render();
    };

    const isStateUpdated = () =&gt; {
      if (
        (prevState.index !== currentState.index) |
        (prevState.per !== currentState.per)
      ) {
        return true;
      } else {
        return false;
      }
    };

    return { getIndex, setIndex, getPer, setPer, isStateUpdated };
  })();

  const render = () =&gt; {
    if (isStateUpdated()) {
      const [index, per] = [getIndex(), getPer()];
      const [tableData, tableSize] = getTableDataAndSize(index, per, data);
      const buttonIndexes = Math.ceil(data.length / per);
      resetButtons(buttonIndexes);
      resetTable(tableSize);
      setTable(tableData);
      setActive(index);
    } else {
      return;
    }
  };

  //? index&#xC5D0; &#xB9DE;&#xB294; &#xD14C;&#xC774;&#xBE14; &#xCEE8;&#xD150;&#xCE20;
  const getTableDataAndSize = (index, per, data) =&gt; {
    let next = (index + 1) * per;
    if (next &gt; data.length) next = data.length;
    const newData = data.slice(index * per, next);
    return [newData, newData.length];
  };

  //? &#xBC84;&#xD2BC; active &#xC5C5;&#xB370;&#xC774;&#xD2B8;
  const setActive = (index) =&gt; {
    document.querySelector(&quot;.active&quot;)?.classList.remove(&quot;active&quot;);
    const target = document.querySelectorAll(&quot;.button&quot;)[index];
    target.classList.add(&quot;active&quot;);
  };

  //? &#xD14C;&#xC774;&#xBE14; &#xC5C5;&#xB370;&#xC774;&#xD2B8;
  const setTable = (tableData) =&gt; {
    const tbody = document.querySelector(&quot;tbody&quot;);
    const trs = tbody.querySelectorAll(&quot;tr&quot;);
    for (let i = 0; i &lt; trs.length; i++) {
      const tds = trs[i].querySelectorAll(&quot;td&quot;);
      const props = Object.values(tableData[i]);
      for (let j = 0; j &lt; tds.length; j++) {
        tds[j].textContent = props[j];
      }
    }
  };

  //? &#xD14C;&#xC774;&#xBE14; HTML &#xC0DD;&#xC131;.
  const resetTable = (tableSize) =&gt; {
    const tr = &quot;&lt;tr&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&quot;;
    const newHTML = tr.repeat(tableSize);
    document.querySelector(&quot;tbody&quot;).innerHTML = newHTML;
  };

  //? &#xBC84;&#xD2BC; &#xCEE8;&#xD14C;&#xC774;&#xB108; HTML &#xC0DD;&#xC131;.
  const resetButtons = (buttonIndexes) =&gt; {
    let buttons = &quot;&quot;;

    for (let i = 1; i &lt;= buttonIndexes; i++) {
      buttons += `&lt;button class=&quot;button&quot;&gt;${i}&lt;/button&gt;`;
    }

    const newHTML = `&lt;button class=&quot;start&quot;&gt;&lt;&lt;&lt;/button&gt;
  ${buttons}
  &lt;button class=&quot;last&quot;&gt;&gt;&gt;&lt;/button&gt;`;

    btnBox.innerHTML = newHTML;
  };

  const handleSelect = (event) =&gt; {
    const newPer = Number(event.target.value);
    setPer(newPer);
  };

  //? target&#xC774; &#xBC84;&#xD2BC;&#xC774;&#xBA74; setIndex
  const handleClick = (event) =&gt; {
    const target = event.target.classList.value;
    if (target === &quot;pagination&quot;) return;

    switch (target) {
      case &quot;start&quot;:
        setIndex(0);
        break;
      case &quot;button&quot;:
        const targetIndex = Number(event.target.innerHTML) - 1;
        setIndex(targetIndex);
        break;
      case &quot;last&quot;:
        const lastIndex = document.querySelectorAll(&quot;button&quot;).length - 3;
        setIndex(lastIndex);
        break;
      default:
        break;
    }
  };

  const btnBox = document.querySelector(&quot;.pagination&quot;);
  const select = document.querySelector(&quot;#dropdown&quot;);
  btnBox.addEventListener(&quot;click&quot;, handleClick);
  select.addEventListener(&quot;click&quot;, handleSelect);
})();</code></pre><figcaption>2&#xCC28; &#xCF54;&#xB4DC;</figcaption></figure><p>&#x2003;&#xCF54;&#xB4DC; &#xC218;&#xB294; &#xB298;&#xC5B4;&#xB0AC;&#xC9C0;&#xB9CC; &#xC6D0;&#xD558;&#xB294; &#xBAA8;&#xC2B5;&#xC5D0; &#xB9CE;&#xC774; &#xAC00;&#xAE4C;&#xC6CC;&#xC84C;&#xB2E4;. &#xAC01; &#xD568;&#xC218;&#xB4E4;&#xC774; &#xC8FC;&#xC11D;&#xACFC; &#xC774;&#xB984;&#xC5D0; &#xB9DE;&#xCDB0;&#xC11C; &#xC5ED;&#xD560;&#xC5D0; &#xC9D1;&#xC911;&#xD55C;&#xB2E4;. <br>&#x2003;&#xC774;&#xAC8C; &#xCD5C;&#xACE0;&#xB77C;&#xB294; &#xC0DD;&#xAC01;&#xC740; &#xC548; &#xD55C;&#xB2E4;. &#xD558;&#xC9C0;&#xB9CC; &#xB0B4; &#xC218;&#xC900;&#xC5D0;&#xC120; &#xC815;&#xC131;&#xACFC; &#xACE0;&#xBBFC;&#xC744; &#xB4E4;&#xC600;&#xB2E4;.</p><ul><li>index, per &#xB294; &#xAC01; &#xD568;&#xC218;&#xB4E4;&#xC774; &#xACF5;&#xC6A9;&#xC73C;&#xB85C; &#xC0AC;&#xC6A9;. &#xADF8;&#xB7EC;&#xB098; &#xD568;&#xBD80;&#xB85C; &#xC218;&#xC815; &#xBD88;&#xAC00;&#xB2A5;.</li><li>&#xC2E4;&#xC2DC;&#xAC04; &#xB370;&#xC774;&#xD130; &#xC5C5;&#xB370;&#xC774;&#xD2B8;&#xAC00; &#xBC1C;&#xC0DD;&#xD560; &#xC77C;&#xC740; &#xC5C6;&#xC73C;&#xBBC0;&#xB85C; data&#xB294; &#xCC98;&#xC74C;&#xC5D0; &#xD55C; &#xBC88;&#xB9CC; &#xBC1B;&#xB294;&#xB2E4;.</li><li>&#xC0AC;&#xC774;&#xB4DC; &#xC774;&#xD399;&#xD2B8; &#xC9C0;&#xC591;, &#xC758;&#xC874;&#xC131; &#xC8FC;&#xC785;, &#xD568;&#xC218; &#xC678;&#xBD80;&#xC5D0; &#xBCC0;&#xC218; &#xC120;&#xC5B8; &#xCD5C;&#xC18C;&#xD654;</li><li>&#xD568;&#xC218;&#xB294; &#xC81C; &#xD560; &#xC77C;&#xC5D0; &#xC9D1;&#xC911;. <br>(&#xC5D0;&#xB7EC;&#xAC00; &#xB098;&#xB354;&#xB77C;&#xB3C4; &#xD574;&#xB2F9; &#xC601;&#xC5ED;&#xC5D0;&#xC11C;&#xB9CC; &#xC5D0;&#xB7EC;. &#xB2E4;&#xB978; &#xACF3;&#xAE4C;&#xC9C0; &#xC5EC;&#xD30C;&#xAC00; &#xC548; &#xBBF8;&#xCE68;)</li><li>&#xCD5C;&#xC801;&#xD654;&#xB294; &#xC2E0;&#xACBD;&#xC744; &#xB35C; &#xC500;.<br>(&#xC123;&#xBD80;&#xB978; &#xCD5C;&#xC801;&#xD654;&#xB294; &#xB3C5;&#xB9CC; &#xB41C;&#xB2E4;. &#xC815;&#xC0C1; &#xC791;&#xB3D9;&#xACFC; &#xAD1C;&#xCC2E;&#xC740; &#xAC00;&#xB3C5;&#xC131;&#xC5D0; &#xCD08;&#xC810;&#xC744; &#xB9DE;&#xCDC4;&#xB2E4;.)</li></ul><p>&#x2003;&#xC791;&#xB144;&#xC5D0; &#xD398;&#xC774;&#xC9C0;&#xB124;&#xC774;&#xC158;&#xC744; &#xAD6C;&#xD604;&#xD560; &#xB550; &#xB3C4;&#xC800;&#xD788; &#xBAA8;&#xB974;&#xACA0;&#xC5B4;&#xC11C; &#xB0A8;&#xB4E4;&#xC774; &#xAD6C;&#xD604;&#xD55C; &#xD398;&#xC774;&#xC9C0;&#xB124;&#xC774;&#xC158; &#xCF54;&#xB4DC;&#xB97C; &#xB530;&#xB77C;&#xD574;&#xC57C;&#xB9CC; &#xD588;&#xB2E4;. &#xC774;&#xBC88;&#xC5D4; &#xAC80;&#xC0C9; &#xC5C6;&#xC774; &#xC21C;&#xC804;&#xD788; &#xB0B4; &#xC9C0;&#xC2DD;&#xACFC; &#xC0DD;&#xAC01;&#xC73C;&#xB85C;&#xB9CC; &#xAD6C;&#xD604;&#xD588;&#xB2E4;.<br>&#x2003;&#xD504;&#xB85C;&#xADF8;&#xB798;&#xBA38;&#xC2A4;&#xC5D0;&#xC120; &#xB9AC;&#xC561;&#xD2B8; &#xBE44;&#xC2A4;&#xBB34;&#xB9AC;&#xD558;&#xAC8C; &#xB9CC;&#xB4DC;&#xB294; &#xAC83;&#xC744; &#xC720;&#xB3C4;&#xD558;&#xB294; &#xB4EF;&#xD558;&#xB2E4;. index.js&#xC640; App.js, &#xADF8;&#xB9AC;&#xACE0; &#xAC01; &#xCEF4;&#xD3EC;&#xB10C;&#xD2B8; &#xD30C;&#xC77C;&#xB4E4;&#xC744; &#xD1B5;&#xD574; &#xC0C8;&#xB85C; &#xB80C;&#xB354;&#xB9C1;&#xD558;&#xB294; &#xCF54;&#xB4DC;&#xB97C; &#xD574;&#xC124;&#xB85C; &#xC81C;&#xACF5;&#xD55C;&#xB2E4;.</p><h2 id="%EB%A7%88%EB%AC%B4%EB%A6%AC">&#xB9C8;&#xBB34;&#xB9AC;</h2><p>&#x2003;&#xBC30;&#xC6C0;&#xC740; &#xC758;&#xBB38;&#xC5D0;&#xC11C; &#xBE44;&#xB86F;&#xD55C;&#xB2E4;. &#xD2B9;&#xC815; &#xD328;&#xB7EC;&#xB2E4;&#xC784;&#xC744; &#xC5FC;&#xB450;&#xD55C; &#xAC74; &#xC544;&#xB2C8;&#xC9C0;&#xB9CC; &quot;&#xC5B4;&#xB5BB;&#xAC8C; &#xD574;&#xC57C; &#xC774; &#xD504;&#xB85C;&#xADF8;&#xB7A8;&#xC774; &#xB354; &#xC6D0;&#xD65C;&#xD558;&#xAC8C; &#xC791;&#xB3D9;&#xD558;&#xACE0;, &#xC27D;&#xAC8C; &#xCD94;&#xAC00;&#xD558;&#xACE0;, &#xC27D;&#xAC8C; &#xACE0;&#xCE60; &#xC218; &#xC788;&#xC744;&#xAE4C;?&quot;&#xB97C; &#xACE0;&#xBBFC;&#xD558;&#xACE0;, &#xBA38;&#xB9BF;&#xC18D;&#xC73C;&#xB85C; &#xADF8;&#xB824;&#xBCF4;&#xBA74;&#xC11C; &#xAD6C;&#xD604;&#xB3C4; &#xAD6C;&#xD604;&#xC774;&#xC9C0;&#xB9CC; &#xC124;&#xACC4;&#xAC00; &#xC911;&#xC694;&#xD558;&#xB2E8; &#xB290;&#xB08C;&#xC744; &#xB9CE;&#xC774; &#xBC1B;&#xC558;&#xB2E4;. &#xD328;&#xB7EC;&#xB2E4;&#xC784;, &#xB514;&#xC790;&#xC778; &#xD328;&#xD134; &#xB4F1;&#xC740; &#xC774;&#xB7EC;&#xD55C; &#xACE0;&#xBBFC;&#xC5D0;&#xC11C; &#xC2DC;&#xC791;&#xD588;&#xACE0;, &#xC9C0;&#xAE08;&#xB3C4; &#xAFB8;&#xC900;&#xD788; &#xD0DC;&#xC5B4;&#xB098;&#xACE0;, &#xC5F0;&#xAD6C;&#xB41C;&#xB2E4;.</p><p>&#x2003;&#xC65C; &#xC124;&#xACC4;&#xB97C; &#xC54C;&#xC544;&#xC57C; &#xD558;&#xACE0; &#xB9CE;&#xC774; &#xACE0;&#xBBFC;&#xD574;&#xC57C; &#xD560;&#xAE4C;? &#xC608;&#xC804;&#xBD80;&#xD130; &#xC911;&#xC694;&#xD558;&#xB2E4;&#xB294; &#xC774;&#xC57C;&#xAE30;&#xB294; &#xB9CE;&#xC774; &#xB4E4;&#xC5C8;&#xC9C0;&#xB9CC; &#xADF8;&#xAC78; &quot;&#xC81C;&#xB300;&#xB85C;&quot; &#xC2E4;&#xAC10;&#xD558;&#xC9C4; &#xBABB;&#xD588;&#xB2E4;.<br>&#x2003;&#xC774;&#xBC88; &#xC5F0;&#xC2B5; &#xBB38;&#xC81C;&#xB294; &#xB9E4;&#xC6B0; &#xAC04;&#xB2E8;&#xD55C; &#xAD6C;&#xD604;&#xC744; &#xD560; &#xBFD0;&#xC778;&#xB370; &#xAC00;&#xC7A5; &#xB9CE;&#xC774; &#xB4E0; &#xC0DD;&#xAC01;&#xC740; &#xC774;&#xB7AC;&#xB2E4;.</p><p>&#x2003;<em>&#x2018;&#xC774;&#xAC70; &#xC815;&#xB9D0;, &#xC124;&#xACC4;&#xAC00; &#xD544;&#xC694;&#xD55C;&#xB370;.&#x2019; </em></p><p>&#x2003;&#xB2E8;&#xC21C;&#xD788; &#xAD6C;&#xD604;&#xB9CC; &#xD574;&#xB193;&#xACE0; &#xB05D;&#xB0BC; &#xAC83;&#xC774;&#xBA74; &#xBAA8;&#xB974;&#xACA0;&#xC73C;&#xB098; &#xADF8; &#xAD6C;&#xD604;&#xCCB4;&#xB97C; &#xACC4;&#xC18D; &#xAD00;&#xB9AC;&#xD558;&#xACE0;, &#xB0A8;&#xC5D0;&#xAC8C; &#xC11C;&#xBE44;&#xC2A4;&#xD558;&#xACE0;, &#xADDC;&#xBAA8;&#xB97C; &#xB113;&#xD790; &#xC608;&#xC815;&#xC774; &#xC788;&#xB2E4;&#xBA74; &#xC598;&#xAE30;&#xB294; &#xB2EC;&#xB77C;&#xC9C4;&#xB2E4;. </p><p>&#x2003;&#xD559;&#xC6D0;&#xC5D0;&#xC11C; &#xD300; &#xD504;&#xB85C;&#xC81D;&#xD2B8;&#xB97C; &#xD560; &#xB54C;, &#xC6B0;&#xB9AC;&#xC5D0;&#xAC8C; &#xC8FC;&#xC5B4;&#xC9C4; &#xC2DC;&#xAC04;&#xC740; &#xC801;&#xC5C8;&#xACE0;, &#xC6B0;&#xB9AC;&#xB294; &#xAE09;&#xD55C; &#xB098;&#xBA38;&#xC9C0; &#xAE30;&#xD68D;&#xACFC; &#xC124;&#xACC4;&#xB97C; &#xC5BC;&#xB801;&#xB6B1;&#xB545; &#xC5BC;&#xBC84;&#xBB34;&#xB9B0; &#xCC44; &#xCF54;&#xB4DC; &#xB354;&#xBBF8;&#xB97C; &#xC3DF;&#xC544;&#xB0C8;&#xB2E4;. &#xC9C4;&#xCC99;&#xC740; &#xB290;&#xB838;&#xACE0; &#xBD84;&#xC704;&#xAE30;&#xB294; &#xD63C;&#xB780;&#xC2A4;&#xB7EC;&#xC6E0;&#xB2E4;. <br>&#x2003;&#xCF54;&#xCE58;&#xB294; &#xC6B0;&#xB9AC;&#xAC00; &#xC815;&#xB9D0;&#xB85C; &#xCDA9;&#xBD84;&#xD788; &#xC774;&#xC57C;&#xAE30;&#xB97C; &#xB098;&#xB234;&#xB294;&#xC9C0;, &#xBAA8;&#xB450;&#xAC00; &#xACF5;&#xAC10;&#xD588;&#xB294;&#xC9C0;, &#xBC11;&#xC900;&#xBE44;&#xB97C; &#xD588;&#xB294;&#xC9C0; &#xB3CC;&#xC544;&#xBCF4;&#xAC8C;&#xB054; &#xC870;&#xC5B8;&#xC744; &#xC92C;&#xB2E4;. &#xC6B0;&#xB9AC;&#xB294; &#xC815;&#xC2E0;&#xC744; &#xCC28;&#xB9AC;&#xACE0; &#xCC98;&#xC74C;&#xBD80;&#xD130; &#xB2E4;&#xC2DC; &#xAE30;&#xD68D;&#xD558;&#xACE0; &#xC900;&#xBE44;&#xB97C; &#xD574;&#xC11C; &#xC9E7;&#xC740; &#xAE30;&#xAC04;&#xC5D0; (&#xB098;&#xB984;&#xB300;&#xB85C;&#xB294;) &#xB9CC;&#xC871;&#xC2A4;&#xB7EC;&#xC6B4; &#xACB0;&#xACFC;&#xBB3C;&#xC744; &#xB9CC;&#xB4E4;&#xC5B4;&#xB0C8;&#xB2E4;.</p><p>&#x2003;&#xD14C;&#xC2A4;&#xD2B8;&#xB3C4; &#xADF8;&#xB807;&#xB2E4;. &#xD14C;&#xC2A4;&#xD2B8;&#xB294; &quot;&#xB0B4;&#xAC00; &#xAD6C;&#xD604;&#xD574;&#xB454; &#xAC8C; &#xC758;&#xB3C4;&#xB300;&#xB85C; &#xC791;&#xB3D9;&#xD558;&#xB294;&#xC9C0; &#xC7AC;&#xD655;&#xC778;&quot;&#xD558;&#xB294; &#xAC8C; &#xC544;&#xB2C8;&#xB2E4;. &quot;&#xBB34;&#xC5C7;&quot;&#xC744; &#xD560; &#xB54C;&#xB9C8;&#xB2E4; &#xD14C;&#xC2A4;&#xD2B8;&#xB294; &#xB0B4; &#xC124;&#xACC4;&#xB97C; &#xAC80;&#xC99D;&#xD55C;&#xB2E4;. &#xB0B4; &#xC124;&#xACC4;&#xB3C4;&#xB97C; &#xB3CC;&#xC544;&#xBCF4;&#xACE0;, &#xB354; &#xB098;&#xC740; &#xC124;&#xACC4;&#xB97C; &#xACE0;&#xBBFC;&#xD558;&#xAC8C; &#xB9CC;&#xB4E0;&#xB2E4;. &#xADF8;&#xB798;&#xC11C; &#xD14C;&#xC2A4;&#xD2B8;&#xB97C; &#xC791;&#xC131;&#xD558;&#xBA70; &#xD504;&#xB85C;&#xADF8;&#xB798;&#xBC0D;&#xD558;&#xAE38; &#xAD8C;&#xC7A5;&#xD558;&#xB294; &#xAC83;&#xC774;&#xACE0;, &#xADF8;&#xB798;&#xC11C; TDD&#xAC00; &#xC8FC;&#xBAA9;&#xBC1B;&#xC558;&#xB2E4;.</p><p>&#x2003;&#xD504;&#xB85C;&#xADF8;&#xB798;&#xBC0D;&#xC740; &#xC124;&#xACC4;&#xAC00; &#xB9E4;&#xC6B0; &#xC911;&#xC694;&#xD558;&#xB2E4;. &#xCDA9;&#xBD84;&#xD55C; &#xC124;&#xACC4;&#xB97C; &#xD558;&#xACE0; &#xC313;&#xC544; &#xC62C;&#xB9AC;&#xB294; &#xB2E8;&#xACC4;&#xC5D0;&#xC11C;&#xB3C4; &#xC218;&#xC2DC;&#xB85C; &#xC124;&#xACC4;&#xB97C; &#xD655;&#xC778;&#xD558;&#xBA70; &#xC0C1;&#xD669;&#xC5D0; &#xB9DE;&#xB294; &#xD310;&#xB2E8;&#xC744; &#xB0B4;&#xB824;&#xC57C; &#xD55C;&#xB2E4;. HTML, CSS, JS&#xB9CC;&#xC73C;&#xB85C; &#xBB34;&#xC5B8;&#xAC00;&#xB97C; &#xB9CC;&#xB4E4; &#xC77C;&#xC774; &#xC5BC;&#xB9C8;&#xB098; &#xC788;&#xACA0;&#xB0D0;&#xB9C8;&#xB294;, &#xC774;&#xBC88; &#xC5F0;&#xC2B5; &#xBB38;&#xC81C;&#xB97C; &#xD1B5;&#xD574;&#xC11C; &#xC5EC;&#xB7EC; &#xACE0;&#xBBFC;&#xC744; &#xBA38;&#xB9BF;&#xC18D;&#xC5D0; &#xB2F4;&#xC544;&#xBCF8;&#xB2E4;.</p>]]></content:encoded></item><item><title><![CDATA[리액트 훅]]></title><description><![CDATA[함수 컴포넌트와 훅의 등장]]></description><link>https://blog.cinntiq.synology.me/react-hook/</link><guid isPermaLink="false">63e5a41cccd3f70001bd2a97</guid><category><![CDATA[react]]></category><dc:creator><![CDATA[Hameln]]></dc:creator><pubDate>Mon, 13 Feb 2023 13:30:56 GMT</pubDate><media:content url="https://blog.cinntiq.synology.me/content/images/2023/02/EQ7K2vh-.png" medium="image"/><content:encoded><![CDATA[<h2 id="1-%EB%A8%B8%EB%A6%BF%EB%A7%90">1. &#xBA38;&#xB9BF;&#xB9D0;</h2><img src="https://blog.cinntiq.synology.me/content/images/2023/02/EQ7K2vh-.png" alt="&#xB9AC;&#xC561;&#xD2B8; &#xD6C5;"><p>&#x2003;&#xC774; &#xAE00;&#xC740; &#xD568;&#xC218; &#xCEF4;&#xD3EC;&#xB10C;&#xD2B8;&#xC640; &#xD6C5;&#xC744; &#xB2E4;&#xB8F9;&#xB2C8;&#xB2E4;.</p><p>&#x2003;&#xD398;&#xC774;&#xC2A4;&#xBD81;&#xC740; &#xC2EC;&#xAC01;&#xD574;&#xC9C0;&#xB294; &#xC0AC;&#xC6A9;&#xC790; &#xACBD;&#xD5D8;&#xACFC; &#xAC1C;&#xBC1C;&#xC790; &#xACBD;&#xD5D8;&#xC744; &#xD574;&#xC18C;&#xD558;&#xB290;&#xB77C; &#xB9AC;&#xC561;&#xD2B8;&#xB97C; &#xB9CC;&#xB4E4;&#xC5C8;&#xC9C0;&#xB9CC; &#xADF8; &#xB4A4;&#xC5D0;&#xB3C4; &#xBB38;&#xC81C;&#xAC00; &#xC0DD;&#xACBC;&#xC2B5;&#xB2C8;&#xB2E4;. &#xBC14;&#xB85C; &#xD074;&#xB798;&#xC2A4; &#xCEF4;&#xD3EC;&#xB10C;&#xD2B8;&#xC785;&#xB2C8;&#xB2E4;.</p><blockquote><em>&#x2003;&#xD074;&#xB798;&#xC2A4; &#xCEF4;&#xD3EC;&#xB10C;&#xD2B8;&#xB97C; &#xB9CC;&#xB4E4;&#xB824;&#xBA74; &#xB9CE;&#xC740; &#xBCF4;&#xC77C;&#xB7EC; &#xD50C;&#xB808;&#xC774;&#xD2B8; &#xCF54;&#xB4DC;&#xB97C; &#xC368;&#xC57C; &#xD569;&#xB2C8;&#xB2E4;. &#xC2E0;&#xADDC;, &#xC911;&#xACAC; &#xAC1C;&#xBC1C;&#xC790;&#xB4E4;&#xC774; &#xD074;&#xB798;&#xC2A4; &#xCEF4;&#xD3EC;&#xB10C;&#xD2B8;&#xB294; &#xBCF5;&#xC7A1;&#xD558;&#xACE0; &#xC9DC;&#xC99D;&#xB09C;&#xB2E4;&#xB294; &#xB9D0;&#xC744; &#xB9CE;&#xC774; &#xD574;&#xC694;. <br>...<br>&#x2003;&#xD074;&#xB798;&#xC2A4; &#xCEF4;&#xD3EC;&#xB10C;&#xD2B8;&#xB294; &#xC0AC;&#xB78C;&#xB4E4;&#xD55C;&#xD14C;&#xB9CC; &#xC5B4;&#xB824;&#xC6B4; &#xAC8C; &#xC544;&#xB2C8;&#xB77C; &#xAE30;&#xACC4;&#xB4E4;&#xB3C4; &#xC5B4;&#xB824;&#xC6CC;&#xD574;&#xC694;. &#xCEF4;&#xD30C;&#xC77C;&#xB3C4; &#xAE38;&#xC5B4;&#xC9C0;&#xACE0; &#xBCF5;&#xC7A1;&#xD574;&#xC9C0;&#xAC70;&#xB4E0;&#xC694;.<br>...<br>&#x2003;(&#xD074;&#xB798;&#xC2A4; &#xCEF4;&#xD3EC;&#xB10C;&#xD2B8;&#xC758;) &#xBB38;&#xC81C;&#xB294; &#xC0C1;&#xD0DC;&#xB098; &#xC0DD;&#xBA85; &#xC8FC;&#xAE30; &#xCF54;&#xB4DC;&#xB97C; &#xCD94;&#xAC00;&#xD560; &#xB54C; &#xC4F8;&#xB9CC;&#xD55C; &#xC27D;&#xACE0; &#xAC00;&#xBCBC;&#xC6B4; &#xC6D0;&#xB9AC;&#xAC00; &#xC5C6;&#xC5C8;&#xC5B4;&#xC694;.<br>&#x2003;- 2018 &#xB9AC;&#xC561;&#xD2B8; &#xCEE8;&#xD37C;&#xB7F0;&#xC2A4; -</em></blockquote><p>&#x2003;&#xD568;&#xC218; &#xCEF4;&#xD3EC;&#xB10C;&#xD2B8;&#xB294; &#xCD08;&#xBCF4; &#xAC1C;&#xBC1C;&#xC790;&#xB4E4;&#xC744; &#xC704;&#xD55C;&#x300E;&#xC635;&#xC158;&#x300F;&#xC774; &#xC544;&#xB2C8;&#xB77C; &#xAC1C;&#xC120; &#xBAA9;&#xC801;&#xC73C;&#xB85C; &#xB098;&#xC654;&#xC2B5;&#xB2C8;&#xB2E4;.</p><h2 id="2-usestate">2. useState</h2><blockquote><em>&#x201C;useState&#xB294; &#xD074;&#xB85C;&#xC800;&#xB97C; &#xD65C;&#xC6A9;&#xD558;&#xACE0; setState&#xB294; &#xBE44;&#xB3D9;&#xAE30; &#xC2E4;&#xD589;&#xC774;&#xB2E4;.&#x201D;</em></blockquote><p>&#x2003;&#xD074;&#xB798;&#xC2A4; &#x2192; &#xD568;&#xC218;&#xD615;&#xC73C;&#xB85C; &#xBC14;&#xB010; &#xAC8C; &#xC5BC;&#xB9C8;&#xB098; &#xB2E4;&#xD589;&#xC778;&#xC9C0; &#xC7A0;&#xC2DC; &#xBCF4;&#xACA0;&#xC2B5;&#xB2C8;&#xB2E4;.</p><figure class="kg-card kg-code-card"><pre><code class="language-jsx">class Counter extends Component {
  constructor(props) {
    super(props);
    this.state = {
      count: 0,
    };
    this.handleClick = this.handleClick.bind(this);
  }

  handleClick() {
    this.setState({ count: this.state.count + 1 });
  }

  render() {
    return (
      &lt;&gt;
        &lt;span&gt;{this.state.count}&lt;/span&gt;
        &lt;button onClick={this.handleClick}&gt;Click me&lt;/button&gt;
      &lt;/&gt;
    );
  }
}</code></pre><figcaption>&#xC804;&#xD1B5;&#xC801;&#xC778; &#xD074;&#xB798;&#xC2A4; &#xCEF4;&#xD3EC;&#xB10C;&#xD2B8;</figcaption></figure><figure class="kg-card kg-code-card"><pre><code class="language-jsx">class Counter extends Component {
  state = { count: 0 };

  handleClick = () =&gt; {
    this.setState({ count: this.state.count + 1 });
  };

  render() {
    return (
      &lt;&gt;
        &lt;span&gt;{this.state.count}&lt;/span&gt;
        &lt;button onClick={this.handleClick}&gt;Click me&lt;/button&gt;
      &lt;/&gt;
    );
  }
}</code></pre><figcaption>&#xAC1C;&#xC120; &#xD6C4; &#xD074;&#xB798;&#xC2A4; &#xCEF4;&#xD3EC;&#xB10C;&#xD2B8;</figcaption></figure><figure class="kg-card kg-code-card"><pre><code class="language-jsx">const Counter = () =&gt; {
  const [count, setCount] = useState(0);
  const handleClick = () =&gt; {
      setCount(count + 1);
  }

  return (
      &lt;&gt;
        &lt;span&gt;{count}&lt;/span&gt;
        &lt;button onClick={handleClick}&gt;Click me&lt;/button&gt;
      &lt;/&gt;
  );
}</code></pre><figcaption>&#xD568;&#xC218; &#xCEF4;&#xD3EC;&#xB10C;&#xD2B8;&#xC640; &#xD6C5;</figcaption></figure><h3 id="2-1-%EC%83%81%ED%83%9C%EB%A1%9C-%EC%97%85%EB%8D%B0%EC%9D%B4%ED%8A%B8">2-1. &#xC0C1;&#xD0DC;&#xB85C; &#xC5C5;&#xB370;&#xC774;&#xD2B8;.</h3><p>&#x2003;&#xD074;&#xB798;&#xC2A4;&#xD615;&#xC758; render, &#xD568;&#xC218;&#xD615;&#xC758; return&#xC740; &#xCEF4;&#xD3EC;&#xB10C;&#xD2B8;&#xB97C; &#xB80C;&#xB354;&#xB9C1;&#xD569;&#xB2C8;&#xB2E4;.<br>&#x2003;&#xAC00;&#xC0C1; DOM&#xC740; &#xBB34;&#xC2A8; &#xC77C;&#xC774; &#xBC1C;&#xC0DD;&#xD558;&#xBA74; <strong>&#xC0C1;&#xD0DC; &#xBCC0;&#xACBD;&#xC744; &#xAE30;&#xC900;</strong>&#xC73C;&#xB85C; &#xC804;&#xD6C4; &#xAC1D;&#xCCB4;&#xB97C; &#xC595;&#xAC8C; &#xBE44;&#xAD50;&#xD558;&#xACE0; &#xC5C5;&#xB370;&#xC774;&#xD2B8;&#xB97C; &#xACB0;&#xC815;&#xD558;&#xB294;&#xB370;, &#xADF8; &#xB54C;&#xBB38;&#xC5D0; &#xC0C1;&#xD0DC; &#xAC12;&#xC774; &#xAC1D;&#xCCB4;&#xB77C;&#xBA74; &#xC8FC;&#xC758;&#xAC00; &#xD544;&#xC694;&#xD569;&#xB2C8;&#xB2E4;.</p><figure class="kg-card kg-code-card"><pre><code class="language-jsx">  const [obj, setObj] = useState({ name: &quot;React&quot;, like: 1299 });
  const handleClick = () =&gt; {
    obj.name = &quot;hahaha&quot;;
    setObj(obj);
    console.log(obj);
  };

  return (
    &lt;&gt;
      &lt;button onClick={handleClick}&gt;{obj.name}&lt;/button&gt;
    &lt;/&gt;
  );</code></pre><figcaption>&#xC704; &#xCF54;&#xB4DC;&#xB294; &#xC758;&#xB3C4;&#xB300;&#xB85C; &#xC791;&#xB3D9;&#xD558;&#xC9C0; &#xC54A;&#xB294;&#xB2E4;.</figcaption></figure><p>&#xAC1D;&#xCCB4;&#xB294; &#xAC00;&#xBCC0;&#xC131;&#xC774;&#xC5B4;&#xC11C; &#xAC12;&#xB9CC; &#xBC14;&#xAFB8;&#xBA74; &#xCC38;&#xC870;&#xAC12;&#xC774; &#xC720;&#xC9C0;&#xB41C;&#xB2E4;. <br>&#x2192; &#xAC00;&#xC0C1; DOM&#xC740; &#xC0C1;&#xD0DC;&#xC5D0; &#xBCC0;&#xD654;&#xAC00; &#xC5C6;&#xB2E4;&#xACE0; &#xC0DD;&#xAC01;&#xD558;&#xACE0; &#xBB34;&#xC2DC;&#xD55C;&#xB2E4;. <br>&#x2192; &#xC774;&#xB7F4; &#xB550; &#xC0C8; &#xAC1D;&#xCCB4;&#xB97C; &#xB9CC;&#xB4E4;&#xC5B4;&#xC11C; &#xD560;&#xB2F9;&#xD55C;&#xB2E4;.</p><figure class="kg-card kg-code-card"><pre><code class="language-jsx">  const [obj, setObj] = useState({ name: &quot;React&quot;, like: 1299 });
  const handleClick = () =&gt; {
    const name = &quot;hahaha&quot;;
    const newObj = { ...obj, name };
    setObj(newObj);
    console.log(obj);
  };

  return (
    &lt;&gt;
      &lt;button onClick={handleClick}&gt;{obj.name}&lt;/button&gt;
    &lt;/&gt;
  );</code></pre><figcaption>&#xC704;&#xC640; &#xAC19;&#xC774; &#xC791;&#xC131;&#xD558;&#xBA74; &#xD574;&#xACB0;&#xB41C;&#xB2E4;.</figcaption></figure><h2 id="3-useeffect">3. useEffect</h2><blockquote><em>&#x201C;&#xBE44;&#xB3D9;&#xAE30;&#xB77C;&#xC11C; &#xB9CE;&#xC774; &#xC4F0;&#xB294; &#xC774;&#xD399;&#xD2B8; &#xD6C5;.&#x201D;</em></blockquote><figure class="kg-card kg-code-card"><pre><code class="language-jsx">  componentDidMount() {
    document.title = `You clicked ${this.state.count} times`;
  }
  componentDidUpdate() {
    document.title = `You clicked ${this.state.count} times`;
  }</code></pre><figcaption>&#xD074;&#xB798;&#xC2A4; &#xCEF4;&#xD3EC;&#xB10C;&#xD2B8;&#xC77C; &#xB54C; &#xC4F0;&#xB358; &#xCF54;&#xB4DC;. &#xB611;&#xAC19;&#xC740; &#xCF54;&#xB4DC;&#xB97C; &#xBCF5;&#xBD99;&#xD588;&#xB2E4;.</figcaption></figure><figure class="kg-card kg-code-card"><pre><code class="language-jsx">  useEffect(() =&gt; {
    document.title = `You clicked ${count} times`;
  });</code></pre><figcaption>&#xB611;&#xAC19;&#xC774; &#xC791;&#xB3D9;&#xD558;&#xB294; &#xD568;&#xC218; &#xCEF4;&#xD3EC;&#xB10C;&#xD2B8;. &#xAE54;&#xB054;&#xD574;&#xC84C;&#xB2E4;.</figcaption></figure><h3 id="3-1-%EC%9D%98%EC%A1%B4%EC%84%B1-%EB%B0%B0%EC%97%B4">3-1. &#xC758;&#xC874;&#xC131; &#xBC30;&#xC5F4;</h3><figure class="kg-card kg-code-card"><pre><code class="language-jsx">  useEffect(() =&gt; {
    document.title = `You clicked ${count} times`;
  },[]);</code></pre><figcaption>&#xBE48; &#xBC30;&#xC5F4;&#xC740; &#xB9C8;&#xC6B4;&#xD2B8; &#xC774;&#xD6C4; &#xD55C; &#xBC88;&#xB9CC; &#xC2E4;&#xD589;</figcaption></figure><figure class="kg-card kg-code-card"><pre><code class="language-jsx">  useEffect(() =&gt; {
    document.title = `You clicked ${count} times`;
  },[count]);</code></pre><figcaption>&#xB9C8;&#xC6B4;&#xD2B8; &#xC774;&#xD6C4; + count &#xC5C5;&#xB370;&#xC774;&#xD2B8;&#xB9C8;&#xB2E4; &#xC2E4;&#xD589;</figcaption></figure><h3 id="3-2-%EC%9D%B4%EB%B2%A4%ED%8A%B8-%EB%93%B1%EB%A1%9D-%EB%B0%8F-%ED%9A%8C%EC%88%98">3-2. &#xC774;&#xBCA4;&#xD2B8; &#xB4F1;&#xB85D; &#xBC0F; &#xD68C;&#xC218;</h3><figure class="kg-card kg-code-card"><pre><code class="language-jsx">useEffect(() =&gt; {
  function &#xB9C8;&#xC6B0;&#xC2A4;&#xAC10;&#xC9C0;(e) {..}
  window.addEventListener(&quot;scroll&quot;, &#xB9C8;&#xC6B0;&#xC2A4;&#xAC10;&#xC9C0;);
    return function cleanup() {
      window.removeEventListener(&quot;scroll&quot;, &#xB9C8;&#xC6B0;&#xC2A4;&#xAC10;&#xC9C0;);
    };
}, []);</code></pre><figcaption>&#xB9C8;&#xC6B4;&#xD2B8; &#xC774;&#xD6C4;&#xC5D0; &#xC774;&#xBCA4;&#xD2B8; &#xB4F1;&#xB85D;, &#xC5B8;&#xB9C8;&#xC6B4;&#xD2B8; &#xB54C; &#xD68C;&#xC218;.</figcaption></figure><figure class="kg-card kg-code-card"><pre><code class="language-jsx">useEffect(() =&gt; {
  function &#xB9C8;&#xC6B0;&#xC2A4;&#xAC10;&#xC9C0;(e) {..}
  window.addEventListener(&quot;scroll&quot;, &#xB9C8;&#xC6B0;&#xC2A4;&#xAC10;&#xC9C0;);
    return () =&gt; {
      window.removeEventListener(&quot;scroll&quot;, &#xB9C8;&#xC6B0;&#xC2A4;&#xAC10;&#xC9C0;);
    };
}, []);</code></pre><figcaption>&#xC775;&#xBA85; &#xCF5C;&#xBC31; &#xD568;&#xC218;&#xB85C; &#xC791;&#xC131;&#xD574;&#xB3C4; &#xB611;&#xAC19;&#xC774; &#xC791;&#xB3D9;&#xD55C;&#xB2E4;.</figcaption></figure><h3 id="3-3-%EC%8B%A4%ED%96%89-%ED%83%80%EC%9D%B4%EB%B0%8D">3-3. &#xC2E4;&#xD589; &#xD0C0;&#xC774;&#xBC0D;</h3><blockquote>&#x2003;&#x201C;useEffect&#xB294; layout, paint&#xAC00; &#xB05D;&#xB098;&#xACE0; &#xC9C0;&#xC5F0;&#xB41C; &#xC774;&#xBCA4;&#xD2B8;&#xB4E4;&#xC744; &#xCC98;&#xB9AC;&#xD560; &#xB54C; &#xC2E4;&#xD589;&#xD569;&#xB2C8;&#xB2E4;.&#x201D;</blockquote><p>&#x2003;useEffect&#xB294; &#xB300;&#xCCB4;&#xB85C; &#xC544;&#xB798; &#xD0C0;&#xC774;&#xBC0D;&#xC5D0; &#xC2E4;&#xD589;&#xD569;&#xB2C8;&#xB2E4;.</p><ul><li>&#xCCAB; &#xB80C;&#xB354;&#xB9C1;(&#xB9C8;&#xC6B4;&#xD2B8;) &#xC774;&#xD6C4;</li><li>&#xB9AC;&#xB80C;&#xB354;&#xB9C1; &#xC774;&#xD6C4;</li><li>&#xCEF4;&#xD3EC;&#xB10C;&#xD2B8; &#xC81C;&#xAC70; &#xD6C4;</li></ul><p>&#x2003;&#xCEF4;&#xD3EC;&#xB10C;&#xD2B8;&#xB294; &#xB9C8;&#xC6B4;&#xD2B8; &#xC9C1;&#xD6C4; paint&#xB3C4; &#xC21C;&#xC2DD;&#xAC04;&#xC5D0; &#xD574;&#xC11C; &#xD654;&#xBA74;&#xC5D0; &#xB098;&#xC635;&#xB2C8;&#xB2E4;. &#xADF8; &#xD6C4;&#xB85C; useEffect&#xAC00; &#xBE44;&#xB3D9;&#xAE30; &#xC2E4;&#xD589;&#xB429;&#xB2C8;&#xB2E4;.</p><p>&#x2003;useEffect&#xC640; useLayoutEffect&#xB294; &#xBE44;&#xC2B7;&#xD558;&#xC9C0;&#xB9CC; &#xBBF8;&#xBB18;&#xD55C; &#xCC28;&#xC774;&#xAC00; &#xC788;&#xB294;&#xB370; &#xC544;&#xB798;&#xC5D0;&#xC11C; &#xC790;&#xC138;&#xD788; &#xC4F0;&#xACA0;&#xC2B5;&#xB2C8;&#xB2E4;.</p><h2 id="4-uselayouteffect">4. useLayoutEffect</h2><blockquote><em>&#x2003;&#x201C;&#xBAA8;&#xB4E0; DOM &#xBCC0;&#xD654;&#xAC00; &#xB05D;&#xB098;&#xBA74; &#xB3D9;&#xAE30;&#xC801;&#xC73C;&#xB85C; &#xC2E4;&#xD589;&#xD569;&#xB2C8;&#xB2E4;. DOM&#xC5D0;&#xC11C; &#xB808;&#xC774;&#xC544;&#xC6C3;&#xC744; &#xC77D;&#xC5B4;&#xB0B4; &#xB9AC;&#xB80C;&#xB354;&#xB9C1;&#xD558;&#xACE0; &#xC2F6;&#xC744; &#xB54C;&#xB9CC; &#xC4F0;&#xC138;&#xC694;. componentDidMount(&#xCEF4;&#xD3EC;&#xB10C;&#xD2B8;&#xAC00; DOM &#xD2B8;&#xB9AC;&#xC5D0; &#xC0BD;&#xC785;&#xB41C; &#xC9C1;&#xD6C4;), componentDidUpdate(&#xBE0C;&#xB77C;&#xC6B0;&#xC800;&#xAC00; repaint&#xD558;&#xAE30; &#xC804;)&#xACFC; &#xB3D9;&#xC77C;&#xD55C; &#xC2DC;&#xC810;&#xC5D0; &#xBC1C;&#xC0DD;&#xD569;&#xB2C8;&#xB2E4;.&#x201D;<br><br>&#x201C;useLayoutEffect&#xB294; &#xC815;&#xB9D0; &#xD544;&#xC694;&#xD560; &#xB54C; &#xC4F0;&#xC138;&#xC694;.&#x201D;<br>- React -<br>&#x201C;SSR, SSG&#xC5D0;&#xC120; useLayoutEffect &#xC0AC;&#xC6A9;&#xC5D0; &#xC8FC;&#xC758;&#xD558;&#xC138;&#xC694;.&#x201D;<br>- Next.js -</em></blockquote><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://blog.cinntiq.synology.me/content/images/2023/02/202302100002.jpg" class="kg-image" alt="&#xB9AC;&#xC561;&#xD2B8; &#xD6C5;" loading="lazy" width="1122" height="675" srcset="https://blog.cinntiq.synology.me/content/images/size/w600/2023/02/202302100002.jpg 600w, https://blog.cinntiq.synology.me/content/images/size/w1000/2023/02/202302100002.jpg 1000w, https://blog.cinntiq.synology.me/content/images/2023/02/202302100002.jpg 1122w" sizes="(min-width: 720px) 720px"><figcaption>&#xB9AC;&#xC561;&#xD2B8;&#xC5D0;&#xC11C; &#xC81C;&#xACF5;&#xD558;&#xB294; &#xC0DD;&#xBA85; &#xC8FC;&#xAE30; &#xADF8;&#xB9BC;. render&#xB294; &#xD074;&#xB798;&#xC2A4; &#xCEF4;&#xD3EC;&#xB10C;&#xD2B8;&#xC758; render &#xBA54;&#xC18C;&#xB4DC;&#xB97C; &#xC368;&#xC11C; &#xAC1D;&#xCCB4;&#xB97C; &#xB9CC;&#xB4E0;&#xB2E8; &#xB73B;&#xC774;&#xB2E4;.</figcaption></figure><p>&#x2003;useEffect&#xC640; useLayoutEffect&#xB294; &#xAC70;&#xC758; &#xBE44;&#xC2B7;&#xD558;&#xBA74;&#xC11C; &#xB2E4;&#xB985;&#xB2C8;&#xB2E4;.</p><pre><code class="language-jsx">window.addEventListener(&quot;DOMContentLoaded&quot;, () =&gt; {
  console.log(&quot;DOM &#xD2B8;&#xB9AC; &#xC0DD;&#xC131;&quot;);
  console.log(window.document.documentElement);
});

window.addEventListener(&quot;load&quot;, () =&gt; {
  console.log(&quot;&#xC790;&#xC6D0; &#xB85C;&#xB4DC;&quot;);
  console.log(window.document.documentElement);
});

root.render(&lt;App /&gt;);</code></pre><pre><code class="language-jsx">function App() {
  const [effect, setEffect] = useState(&quot;App&quot;);
  const [layout, setLayout] = useState(&quot;App layout&quot;);
  console.log(`App &#xC77D;&#xB294; &#xC911;...\n effect: ${effect},\n layout: ${layout}`);

  useLayoutEffect(() =&gt; {
    setLayout(&quot;App layout effect&quot;);
    console.log(
      `App useLayoutEffect &#xC2E4;&#xD589; \n effect: ${effect},\n layout: ${layout}`
    );
  }, []);

  useEffect(() =&gt; {
    setEffect(&quot;App side effect&quot;);
    console.log(`App useEffect &#xC2E4;&#xD589; \n effect: ${effect},\n layout: ${layout}`);
  }, []);

  return (
    &lt;&gt;
      &lt;Child /&gt;
      {effect}
    &lt;/&gt;
  );
}</code></pre><figure class="kg-card kg-code-card"><pre><code class="language-jsx">const Child = () =&gt; {
  const [effect, setEffect] = useState(&quot;Child&quot;);
  const [layout, setLayout] = useState(&quot;Child layout&quot;);
  console.log(`Child &#xC77D;&#xB294; &#xC911;... \n effect: ${effect},\n layout: ${layout}`);

  useLayoutEffect(() =&gt; {
    setLayout(&quot;Child layout effect&quot;);
    console.log(
      `Child useLayoutEffect &#xC2E4;&#xD589; \n effect: ${effect},\n layout: ${layout}`
    );
  }, []);

  useEffect(() =&gt; {
    setEffect(&quot;Child side effect&quot;);
    console.log(
      `Child useEffect &#xC2E4;&#xD589; \n effect: ${effect},\n layout: ${layout}`
    );
  }, []);

  return &lt;div&gt;{effect}&lt;/div&gt;;
};</code></pre><figcaption>.</figcaption></figure><figure class="kg-card kg-image-card"><img src="https://blog.cinntiq.synology.me/content/images/2023/02/202302510007.jpg" class="kg-image" alt="&#xB9AC;&#xC561;&#xD2B8; &#xD6C5;" loading="lazy" width="758" height="628" srcset="https://blog.cinntiq.synology.me/content/images/size/w600/2023/02/202302510007.jpg 600w, https://blog.cinntiq.synology.me/content/images/2023/02/202302510007.jpg 758w" sizes="(min-width: 720px) 720px"></figure><ol><li>window, document&#xC5D0; &#xC774;&#xBCA4;&#xD2B8; &#xB4F1;&#xB85D;</li><li>DOMContentLoaded &#xC2E4;&#xD589;</li><li>root.render &#xC2E4;&#xD589;</li><li>App &#x2192; Child &#xC21C;&#xC73C;&#xB85C; &#xC774;&#xD399;&#xD2B8; &#xD6C5;&#xC740; &#xB4F1;&#xB85D;&#xB9CC; &#xD558;&#xACE0; &#xB098;&#xBA38;&#xC9C4; &#xC77D;&#xC5B4;&#xB0B8;&#xB2E4;.</li><li>&#xB2E4; &#xC77D;&#xC740; &#xC78E; &#xB178;&#xB4DC;(Child)&#xB294; <strong>&#xB9C8;&#xC6B4;&#xD2B8;</strong>, paint.<br>&#xC78E; &#xB178;&#xB4DC;: &#xC544;&#xB798;&#xB85C; &#xB354; &#xB0B4;&#xB824;&#xAC08; &#xAC8C; &#xC5C6;&#xB294; &#xCD5C;&#xD558;&#xCE35; &#xB178;&#xB4DC;.</li><li>&#xBAA8;&#xB4E0; paint&#xAC00; &#xB05D;&#xB098;&#xBA74; useLayoutEffect &#xC2E4;&#xD589;(&#xC790;&#xC2DD; &#x2192; &#xBD80;&#xBAA8;)</li><li>&#xBAA8;&#xB4E0; useLayoutEffect&#xAC00; &#xB05D;&#xB098;&#xBA74; useEffect &#xC2E4;&#xD589;(&#xC790;&#xC2DD; &#x2192; &#xBD80;&#xBAA8;)</li><li>useLayoutEffect&#xC5D0;&#xC11C; &#xB4F1;&#xB85D;&#xD588;&#xB358; setState&#xB4E4; &#xC801;&#xC6A9;(&#xBD80;&#xBAA8; &#x2192; &#xC790;&#xC2DD;)</li><li>useEffect&#xC5D0;&#xC11C; &#xB4F1;&#xB85D;&#xD588;&#xB358; setState&#xB4E4; &#xC801;&#xC6A9;(&#xBD80;&#xBAA8; &#x2192; &#xC790;&#xC2DD;)</li><li>load &#xC774;&#xBCA4;&#xD2B8; fire</li></ol><!--kg-card-begin: html--><table style="background-color: #2d2d2d ; color: #ccc">
<thead>
<tr>
<th style="text-align: center; border-bottom: 1px solid #ccc"></th>
<th style="text-align: center; border-bottom: 1px solid #ccc; border-left: 1px solid #ccc">useEffect</th>
<th style="text-align: center; border-bottom: 1px solid #ccc; border-left: 1px solid #ccc">useLayoutEffect</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: center; border-bottom: 1px solid #ccc">&#xC2E4;&#xD589; &#xBC29;&#xC2DD;</td>
<td style="text-align: center; border-bottom: 1px solid #ccc; border-left: 1px solid #ccc">&#xBE44;&#xB3D9;&#xAE30;</td>
<td style="text-align: center; border-bottom: 1px solid #ccc; border-left: 1px solid #ccc">&#xB3D9;&#xAE30;</td>
</tr>
<tr>
<td style="text-align: center; border-bottom: 1px solid #ccc">&#xC6A9;&#xB3C4;</td>
<td style="text-align: center; border-bottom: 1px solid #ccc; border-left: 1px solid #ccc">&#xC0AC;&#xC774;&#xB4DC; &#xC774;&#xD399;&#xD2B8;</td>
<td style="text-align: center; border-bottom: 1px solid #ccc; border-left: 1px solid #ccc">&#xB808;&#xC774;&#xC544;&#xC6C3; &#xC0AC;&#xC6A9;</td>
</tr>
<tr>
<td style="text-align: center; border-bottom: 1px solid #ccc">&#xC2E4;&#xD589; &#xC2DC;&#xC810;</td>
<td style="text-align: center; border-bottom: 1px solid #ccc; border-left: 1px solid #ccc">&#xBAA8;&#xB450; paint<br> 
&#x2192; &#xBAA8;&#xB4E0; layout effect <br>
&#x2192; &#xC720;&#xB3D9;&#xC801;&#xC73C;&#xB85C; &#xC2E4;&#xD589;</td>
<td style="text-align: center; border-bottom: 1px solid #ccc; border-left: 1px solid #ccc">&#xBAA8;&#xB450; &#xB9C8;&#xC6B4;&#xD2B8;<br>&#x2192; &#xBAA8;&#xB450; paint<br>&#x2192; &#xC2E4;&#xD589;
    </td>
</tr>
<tr>
<td style="text-align: center; border-bottom: 1px solid #ccc">&#xC2E4;&#xD589; &#xC21C;&#xC11C;</td>
<td style="text-align: center; border-bottom: 1px solid #ccc; border-left: 1px solid #ccc">(&#xBA3C;&#xC800; &#xB05D;&#xB09C;)&#xC78E; &#xB178;&#xB4DC;<br>&#x2192; ... <br>&#x2192; &#xBD80;&#xBAA8; 
</td><td style="text-align: center; border-bottom: 1px solid #ccc; border-left: 1px solid #ccc">(&#xBA3C;&#xC800; &#xB05D;&#xB09C;)&#xC78E; &#xB178;&#xB4DC;<br>&#x2192; ... <br>&#x2192; &#xBD80;&#xBAA8;
</td></tr>
    <tr>
<td style="text-align: center;  border-bottom: 1px solid #ccc; border-bottom: 1px solid #ccc">&#xC0C1;&#xD0DC; &#xBCC0;&#xACBD; &#xC2DC;&#xC810;</td>
<td style="text-align: center;  border-bottom: 1px solid #ccc; border-left: 1px solid #ccc">layout effect&#xC5D0;&#xC11C; <br>&#xB4F1;&#xB85D;&#xD55C; &#xC0C1;&#xD0DC; &#xBCC0;&#xACBD;&#xB4E4; &#xB05D;&#xB09C; &#xD6C4;</td>
<td style="text-align: center;  border-bottom: 1px solid #ccc; border-left: 1px solid #ccc"></td>
</tr>
<tr>
<td style="text-align: center; border-bottom: 1px solid #ccc">&#xC8FC;&#xC758;&#xC810;</td>
<td style="text-align: center; border-bottom: 1px solid #ccc; border-left: 1px solid #ccc">&#xD575;&#xC2EC;&#xB9CC; &#xC791;&#xC131;<br>
    (&#xB0A8;&#xC6A9; X)
    </td>
<td style="text-align: center; border-bottom: 1px solid #ccc; border-left: 1px solid #ccc">&#xD575;&#xC2EC;&#xB9CC; &#xC791;&#xC131;<br>
    (&#xB0A8;&#xC6A9; X)
    </td>
</tr>
<tr>
<td style="text-align: center">&#xD2B9;&#xC9D5;</td>
<td style="text-align: center; border-left: 1px solid #ccc">UI &#xBCC0;&#xACBD; &#xC2DC; &#xAE5C;&#xBE61;&#xC77C; &#xC218; &#xC788;&#xC74C;</td>
<td style="text-align: center; border-left: 1px solid #ccc">&#xB80C;&#xB354; &#xC9C0;&#xC5F0;</td>
</tr>
</tbody>
</table><!--kg-card-end: html--><p><strong>useEffect&#xB294; &#xBE44;&#xB3D9;&#xAE30; &#xC2E4;&#xD589;&#xC774;&#xB77C; &#xD0C0;&#xC774;&#xBC0D;&#xC774; &#xC720;&#xB3D9;&#xC801;&#xC784;&#xC744; &#xC5FC;&#xB450;&#xD569;&#xB2C8;&#xB2E4;.</strong><br>&#x2516; useEffect&#xB85C; UI &#xBCC0;&#xACBD;&#xD55C;&#xB2E4;&#xACE0; &#xBB34;&#xC870;&#xAC74; &#xAE5C;&#xBE61;&#xC774;&#xC9C4; &#xC54A;&#xB294;&#xB2E4;.<br>&#x2516; &#xC6B0;&#xC120; &#xC791;&#xC5C5; &#xB9CE;&#xC73C;&#xBA74; useEffect&#xAC00; &#xB2A6;&#xAC8C; &#xC2E4;&#xD589;&#xB41C;&#xB2E4;.</p><figure class="kg-card kg-code-card"><pre><code class="language-jsx">const Colorful = () =&gt; {
  const [isMount, setIsMount] = useState(true);
  useEffect(() =&gt; {
    setIsMount(false);
  }, []);

  return (
    &lt;div className={isMount ? styles.red : styles.green}&gt;&#xC548;&#xB155;&#xD558;&#xC138;&#xC694;&lt;/div&gt;
  );
};</code></pre><figcaption>&#xC704;&#xC640; &#xAC19;&#xC774; &#xAC04;&#xB2E8;&#xD558;&#xBA74; &#xBE60;&#xB974;&#xAC8C; &#xCC98;&#xB9AC;&#xB41C;&#xB2E4;.</figcaption></figure><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://blog.cinntiq.synology.me/content/images/2023/02/202302140001.gif" class="kg-image" alt="&#xB9AC;&#xC561;&#xD2B8; &#xD6C5;" loading="lazy" width="500" height="329"><figcaption>&#xBE68;&#xAC04; &#xD654;&#xBA74;&#xC774; &#xC804;&#xD600; &#xC548; &#xBCF4;&#xC778;&#xB2E4;.</figcaption></figure><p>&#x2003;useEffect&#xB85C; UI &#xBCC0;&#xACBD;&#xD574;&#xB3C4; &#xBB38;&#xC81C; &#xC5C6;&#xC774; &#xC791;&#xB3D9;&#xD560; &#xB54C;&#xB294; &#xB9CE;&#xC2B5;&#xB2C8;&#xB2E4;.</p><figure class="kg-card kg-code-card"><pre><code class="language-jsx">const Colorful = () =&gt; {
  const [isMount, setIsMount] = useState(true);

  useLayoutEffect(() =&gt; {
    queueMicrotask(() =&gt; {
      for (let i = 0; i &lt; 20000; i++) {
        console.log(i);
      }
    });
  }, []);

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

  return &lt;div className={isMount ? styles.red : styles.green}&gt;&#xC548;&#xB155;&#xD558;&#xC138;&#xC694;&lt;/div&gt;;
};</code></pre><figcaption>&#xBE44;&#xB3D9;&#xAE30; &#xC791;&#xC5C5;&#xC744; &#xB9CE;&#xC774; &#xCD94;&#xAC00;&#xD574;&#xBCF4;&#xACA0;&#xB2E4;.</figcaption></figure><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://blog.cinntiq.synology.me/content/images/2023/02/202302140002.gif" class="kg-image" alt="&#xB9AC;&#xC561;&#xD2B8; &#xD6C5;" loading="lazy" width="508" height="329"><figcaption>&#xC120;&#xD589; &#xC791;&#xC5C5;&#xC774; &#xB9CE;&#xC73C;&#xBA74; useEffect&#xB294; &#xAE5C;&#xBE61;&#xC784;&#xC744; &#xBC1C;&#xC0DD;&#xC2DC;&#xD0A8;&#xB2E4;.</figcaption></figure><p>&#x2003;&#xC774;&#xB807;&#xAC8C; useEffect&#xB85C;&#xB294; &#xB3C4;&#xC800;&#xD788; &#xBC29;&#xBC95;&#xC774; &#xC5C6;&#xC744; &#xB54C;&#xC5D0;&#xB9CC; useLayoutEffect&#xB97C; &#xC501;&#xB2C8;&#xB2E4;.</p><figure class="kg-card kg-code-card"><pre><code class="language-jsx">const Colorful = () =&gt; {
  const [isMount, setIsMount] = useState(true);

  useLayoutEffect(() =&gt; {
    for (let i = 0; i &lt; 20000; i++) {
      console.log(i);
    }
  }, []);

  useLayoutEffect(() =&gt; {
    setIsMount(false);
  }, []);

  return &lt;div className={isMount ? styles.red : styles.green}&gt;&#xC548;&#xB155;&#xD558;&#xC138;&#xC694;&lt;/div&gt;;
};</code></pre><figcaption>layout effect&#xB85C; &#xBCC0;&#xACBD;.</figcaption></figure><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://blog.cinntiq.synology.me/content/images/2023/02/202302140005.jpg" class="kg-image" alt="&#xB9AC;&#xC561;&#xD2B8; &#xD6C5;" loading="lazy" width="508" height="329"><figcaption>&#xB514;&#xBC84;&#xAE45;&#xC5D0;&#xC120; &#xCEF4;&#xD3EC;&#xB10C;&#xD2B8; &#xCD08;&#xAE30; paint&#xB97C; &#xD655;&#xC778;&#xD560; &#xC218; &#xC788;&#xB2E4;.</figcaption></figure><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://blog.cinntiq.synology.me/content/images/2023/02/202302140003.gif" class="kg-image" alt="&#xB9AC;&#xC561;&#xD2B8; &#xD6C5;" loading="lazy" width="508" height="329"><figcaption>&#xC2E4;&#xC81C;&#xB85C;&#xB294; &#xBABB; &#xBCF8;&#xB2E4;</figcaption></figure><p>&#x2003;&#xB80C;&#xB354;&#xB294; &#xBE44;&#xB3D9;&#xAE30; &#xC791;&#xC5C5;&#xC774;&#xBBC0;&#xB85C; &#xB3D9;&#xAE30;&#xC801; &#xCF54;&#xB4DC;&#xAC00; &#xC788;&#xC73C;&#xBA74; &#xB80C;&#xB354;&#xB97C; &#xBB34;&#xC2DC;&#xD558;&#xACE0; &#xCF54;&#xB4DC;&#xB97C; &#xC2E4;&#xD589;&#xD569;&#xB2C8;&#xB2E4;.</p><p>&#x2003;<em><strong>mount &#x2192; paint &#x2192; useLayoutEffect &#x2192; update, repaint</strong></em></p><p>&#x2003;&#xBE0C;&#xB77C;&#xC6B0;&#xC800;&#xB294; &#xC2F1;&#xAE00; &#xC2A4;&#xB808;&#xB4DC;&#xC774;&#xBA70; &#xB80C;&#xB354;&#xB9C1; &#xACFC;&#xC815;&#xC5D0;&#xC11C; &#xB3D9;&#xAE30;&#xC801; &#xCF54;&#xB4DC;&#xB97C; &#xB9CC;&#xB098;&#xBA74; &#xD654;&#xBA74;&#xC744; &#xBA48;&#xCD94;&#xACE0; &#xCF54;&#xB4DC; &#xC2E4;&#xD589;&#xC5D0; &#xC9D1;&#xC911;&#xD569;&#xB2C8;&#xB2E4;. <br>&#x2003;&#xBE44;&#xB85D; &#xCEF4;&#xD3EC;&#xB10C;&#xD2B8;&#xB97C; &#xB9C8;&#xC6B4;&#xD2B8;&#xD558;&#xACE0; &#xBE68;&#xAC04;&#xC0C9;&#xC73C;&#xB85C; &#xCD08;&#xAE30; paint&#xB97C; &#xD588;&#xC5B4;&#xB3C4; &#xB4A4;&#xC5D0; &#xB3D9;&#xAE30;&#xC801;&#xC73C;&#xB85C; &#xCC98;&#xB9AC;&#xD560; &#xCF54;&#xB4DC;&#xB4E4;&#xC774; &#xB300;&#xAE30;&#xC911;&#xC774;&#xBA74; &#xBE0C;&#xB77C;&#xC6B0;&#xC800;&#xB294; &#xD310;&#xB2E8;&#xC744; &#xD569;&#xB2C8;&#xB2E4;.</p><hr><p><strong><em>&#x2003;&#x2192;&#xCF54;&#xB4DC;&#xB97C; &#xC2E4;&#xD589;&#xD558;&#xC790;. O</em></strong><em><strong><br></strong></em><strong><em>&#x2003;&#xD654;&#xBA74;&#xC5D0; &#xCEF4;&#xD3EC;&#xB10C;&#xD2B8;&#xB97C; &#xB744;&#xC6B0;&#xC790;. X</em></strong></p><hr><p>&#x2003;&#xC608;&#xB97C; &#xB4E4;&#xBA74; paint - composite &#xC0AC;&#xC774;&#xC5D0; &#xD654;&#xBA74; &#xC0C9;&#xC774; 100&#xB9CC; &#xBC88; &#xBC14;&#xB010;&#xB2E4;&#xACE0; &#xAC00;&#xC815;&#xD574;&#xBD05;&#xC2DC;&#xB2E4;. &#xC77C;&#xC77C;&#xC774; &#xB80C;&#xB354;&#xD558;&#xBA74;&#xC11C; &#xC0AC;&#xC6A9;&#xC790;&#xC5D0;&#xAC8C; &#xACFC;&#xC815;&#xC744; &#xB2E4; &#xBCF4;&#xC5EC;&#xC904; &#xD544;&#xC694;&#xAC00; &#xC788;&#xC744;&#xAE4C;&#xC694;? &#xCC28;&#xB77C;&#xB9AC; &#xCD5C;&#xC885; &#xD654;&#xBA74;&#xB9CC; &#xC0AC;&#xC6A9;&#xC790;&#xC5D0;&#xAC8C; &#xD45C;&#xC2DC;&#xD558;&#xB294; &#xAC8C; &#xD569;&#xB9AC;&#xC801;&#xC785;&#xB2C8;&#xB2E4;. <br>&#x2003;&#xC774;&#xB7F0; &#xC774;&#xC720;&#xB85C; useLayoutEffect&#xB294; &#xC0AC;&#xC6A9;&#xC790;&#xC5D0;&#xAC8C; &#xCD08;&#xAE30; &#xCEF4;&#xD3EC;&#xB10C;&#xD2B8;&#xB97C; &#xC228;&#xAE41;&#xB2C8;&#xB2E4;.</p><ul><li>&#xB9AC;&#xC561;&#xD2B8;: &#xB9C8;&#xC6B4;&#xD305; &#xC2DC; &#xBAA8;&#xB4E0; &#xCF54;&#xB4DC;&#xB97C; &#xC77D;&#xACE0; &#xCC98;&#xB9AC;&#xD558;&#xB290;&#xB77C; &#xCD08;&#xAE30; &#xB85C;&#xB529;&#xC774; &#xB2A6;&#xB2E4;.</li><li>Next.js: &#xAC01; &#xCEF4;&#xD3EC;&#xB10C;&#xD2B8;&#xB97C; &#xC21C;&#xD68C;&#xD558;&#xBA74;&#xC11C; &#xCEF4;&#xD3EC;&#xB10C;&#xD2B8; &#xC774;&#xB984;&#xC73C;&#xB85C; &#xC870;&#xD68C;&#xD558;&#xC5EC; &#xC11C;&#xBC84;&#xC5D0;&#xC11C; &#xB9CC;&#xB4E4;&#xC5B4;&#xB454; HTML&#xC744; &#xBE60;&#xB974;&#xAC8C; &#xAC00;&#xC838;&#xC628;&#xB2E4;. &#xC774;&#xD6C4; &#xB2E4;&#xC2DC; &#xC21C;&#xD68C;&#xD558;&#xBA74;&#xC11C; &#xD074;&#xB77C;&#xC774;&#xC5B8;&#xD2B8; &#xCF54;&#xB4DC; &#xC2E4;&#xD589;.</li></ul><h2 id="5-useinsertioneffect">5. useInsertionEffect</h2><blockquote>&#x2003;&#x201C;useInsertionEffect&#xB294; &#xB9AC;&#xC561;&#xD2B8;&#xAC00; DOM&#xC744; &#xBC14;&#xAFB8;&#xAE30; &#xC804;&#xC5D0; &#xBC1C;&#xC0DD;&#xD569;&#xB2C8;&#xB2E4;. CSS-in-JS &#xB77C;&#xC774;&#xBE0C;&#xB7EC;&#xB9AC;&#xB85C; &#xB3D9;&#xC801; CSS&#xB97C; &#xD560;&#xB2F9;&#xD569;&#xB2C8;&#xB2E4;.&#x201D;</blockquote><p>&#x2003;&#xB3D9;&#xC801;&#xC73C;&#xB85C; CSS&#xB97C; &#xD560;&#xB2F9;&#xD560; &#xC77C;&#xC740; &#xB9CE;&#xC9C0; &#xC54A;&#xC744; &#xBFD0;&#xB354;&#xB7EC;, &#xACF5;&#xC2DD; &#xBB38;&#xC11C;&#xC5D0;&#xC11C;&#xB3C4; &#xC0AC;&#xC6A9;&#xC5D0; &#xC2E0;&#xC911;&#xC744; &#xAE30;&#xD558;&#xB77C;&#xACE0; &#xC8FC;&#xC758;&#xB97C; &#xD569;&#xB2C8;&#xB2E4;. &#xB80C;&#xB354;&#xB9C1;&#xC744; &#xC9C0;&#xC5F0;&#xC2DC;&#xD0A4;&#xAE30; &#xB54C;&#xBB38;&#xC785;&#xB2C8;&#xB2E4;.</p><h2 id="6-useref">6. useRef</h2><p>&#x2003;&#xBC14;&#xB2D0;&#xB77C; JS&#xB85C; DOM &#xB178;&#xB4DC;&#xB97C; &#xC870;&#xC791;&#xD560; &#xB550; &#xC544;&#xB798;&#xC640; &#xAC19;&#xC774; &#xC791;&#xC131;&#xD569;&#xB2C8;&#xB2E4;.</p><pre><code class="language-js">const button = document.querySelector(&quot;button&quot;);
button.addEventListener(&quot;click&quot;, ()=&gt;{..});</code></pre><p>&#x2003;&#xAC00;&#xB054; &#xB9AC;&#xC561;&#xD2B8;&#xB85C;&#xB3C4; &#xC5D8;&#xB9AC;&#xBA3C;&#xD2B8;&#xB97C; &#xAC00;&#xC838;&#xC62C; &#xC77C;&#xC774; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;. (&#xC5D8;&#xB9AC;&#xBA3C;&#xD2B8; &#xD06C;&#xAE30;&#xB97C; &#xC7B0;&#xB2E4;&#xB358;&#xC9C0;) <br>&#x2003;querySelector &#xB300;&#xC2E0; useRef&#xB97C; &#xC4F0;&#xBA74; &#xC5D8;&#xB9AC;&#xBA3C;&#xD2B8;&#xB97C; &#xAC00;&#xC838;&#xC62C; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.</p><figure class="kg-card kg-code-card"><pre><code class="language-jsx">  const target = useRef&lt;HTMLDivElement&gt;(null);

  useEffect(() =&gt; {

// &apos;target.current&apos; is possibly &apos;null&apos;.
    const width = target.current.offsetHeight; 

// &#xC815;&#xC0C1; &#xC791;&#xB3D9;.
    if(target.current){
      const width = target.current.offsetHeight; 
    }
  });

  return (
    &lt;&gt;
      &lt;div ref={target}&gt;this is div box&lt;/div&gt;
    &lt;/&gt;
  );</code></pre><figcaption>&#xB300;&#xCDA9; &#xC774;&#xB7F0; &#xC2DD;.</figcaption></figure><p>&#x2003;useRef&#xB97C; &#xC4F0;&#xACE0;, &#xC5D8;&#xB9AC;&#xBA3C;&#xD2B8;&#xC5D0; ref&#xB97C; &#xB4F1;&#xB85D;&#xD558;&#xBA74; &#xB429;&#xB2C8;&#xB2E4;.<br>&#x2003;ref&#xB294; null&#xC774;&#xC5C8;&#xB2E4;&#xAC00; &#xCF54;&#xB4DC; &#xC2E4;&#xD589;&#xC911;, &#xB9C8;&#xC6B4;&#xD2B8; &#xC804;&#xC5D0; &#xC5C5;&#xB370;&#xC774;&#xD2B8;&#xB429;&#xB2C8;&#xB2E4;.(&#xC0DD;&#xBA85; &#xC8FC;&#xAE30; &#xADF8;&#xB9BC; &#xCC38;&#xACE0;)<br>&#x2003;&#xD0C0;&#xC785;&#xC2A4;&#xD06C;&#xB9BD;&#xD2B8; &#xAC1C;&#xBC1C; &#xCF54;&#xB4DC;&#xC5D0;&#xC120; ref&#xAC00; null&#xB85C;&#xC11C; &#xC778;&#xC2DD;&#xB429;&#xB2C8;&#xB2E4;. (&#xB7F0;&#xD0C0;&#xC784; &#xC804;&#xC5D0;&#xB294; &#xCC38;&#xC870;&#xB41C; &#xAC8C; &#xC5C6;&#xAE30; &#xB54C;&#xBB38;) &#xADF8;&#xB798;&#xC11C; if&#xBB38; &#xB4F1;&#xC73C;&#xB85C; ref.current&#xAC00; &#xC788;&#xB2E4;&#xACE0; &#xAC00;&#xC815;&#xD574;&#xC57C; &#xACBD;&#xACE0;&#xAC00; &#xC548; &#xB739;&#xB2C8;&#xB2E4;.</p><h3 id="6-1-%EB%8B%A4%EB%A5%B8-%EC%9A%A9%EB%8F%84">6-1. &#xB2E4;&#xB978; &#xC6A9;&#xB3C4;</h3><p>&#x2003;useRef&#xB294; &#xBCC0;&#xC218; &#xB2F4;&#xC744; &#xB54C;&#xC5D0;&#xB3C4; &#xC501;&#xB2C8;&#xB2E4;. <br>&#xD2B9;&#xC9D5;: &#xAC12;&#xC744; &#xBC14;&#xAFBC;&#xB2E4;&#xACE0; &#xB9AC;&#xB80C;&#xB354;&#xB9C1; X, &#xB9AC;&#xB80C;&#xB354;&#xB9C1; &#xB54C; &#xAC12;&#xC744; &#xB2E4;&#xC2DC; &#xD560;&#xB2F9; X.<br>&#xC6D0;&#xB9AC;: &#xB0B4;&#xBD80;&#xC801;&#xC73C;&#xB85C; &#xCC38;&#xC870;&#xAC12;&#xC744; &#xC720;&#xC9C0;&#xD558;&#xB294; &#xAC1D;&#xCCB4;&#xB97C; &#xC4F0;&#xAE30; &#xB54C;&#xBB38;.</p><p>&#x2003;&apos;&#xB9AC;&#xB80C;&#xB354;&#xB9C1;&#xB9C8;&#xB2E4; &#xD560;&#xB2F9;&#xD558;&#xAE34; &#xC880; &#xADF8;&#xB7F0; &#xBCC0;&#xC218;.&apos;&#xC5D0; &#xC501;&#xB2C8;&#xB2E4;. &#xC774;&#xBBF8; &#xBE44;&#xC6A9;&#xC774; &#xB4DC;&#xB294; &#xAC12;&#xC744; &#xCE90;&#xC2DC;&#xD558;&#xB294; &#xD6C5; useMemo&#xAC00; &#xC788;&#xC73C;&#xBBC0;&#xB85C; &#xAD6C;&#xBD84;&#xD574;&#xC11C; &#xC501;&#xC2DC;&#xB2E4;.</p><h2 id="7-%EC%B0%B8%EC%A1%B0">7. &#xCC38;&#xC870;</h2><ul><li><a href="https://beta.reactjs.org/?ref=blog.cinntiq.synology.me">React Docs Beta</a></li><li><a href="https://reactjs.org/?ref=blog.cinntiq.synology.me">React</a></li><li><a href="https://www.youtube.com/watch?v=dpw9EHDh2bM&amp;ref=blog.cinntiq.synology.me">React Today and Tomorrow and 90% Cleaner React With Hooks</a></li></ul>]]></content:encoded></item><item><title><![CDATA[HTTP 되짚기]]></title><description><![CDATA[우리는 어떻게 서버와 통신하고 있을까?]]></description><link>https://blog.cinntiq.synology.me/http/</link><guid isPermaLink="false">63e2632dccd3f70001bd1eaf</guid><category><![CDATA[HTTP]]></category><dc:creator><![CDATA[Hameln]]></dc:creator><pubDate>Wed, 08 Feb 2023 06:54:10 GMT</pubDate><media:content url="https://blog.cinntiq.synology.me/content/images/2024/01/http.png" medium="image"/><content:encoded><![CDATA[<img src="https://blog.cinntiq.synology.me/content/images/2024/01/http.png" alt="HTTP &#xB418;&#xC9DA;&#xAE30;"><p>&#x2003;&#xC6B0;&#xB9AC;&#xAC00; &#xC0AC;&#xC774;&#xD2B8;&#xC5D0;&#xC11C; &#xD68C;&#xC6D0; &#xAC00;&#xC785; &#xBC84;&#xD2BC;&#xC744; &#xB204;&#xB974;&#xBA74; &#xBE0C;&#xB77C;&#xC6B0;&#xC800;&#xB294; &#xC11C;&#xBC84;&#xC5D0;&#xAC8C; &#xBCF4;&#xB0B4;&#xAE30; &#xC704;&#xD55C; &#xD68C;&#xC6D0; &#xC815;&#xBCF4;&#xB97C; &#xD3EC;&#xC7A5;&#xD569;&#xB2C8;&#xB2E4;.</p><p><strong><em>&#x2003;&quot;&#xB370;&#xC774;&#xD130; &#xD3EC;&#xC7A5;&#xC740; &#xC65C; &#xD558;&#xC9C0;?&quot;</em></strong><br><br>&#x2003;&#xCE5C;&#xAD6C;&#xC5D0;&#xAC8C; &#xD0DD;&#xBC30; &#xBCF4;&#xB0B4;&#xB294; &#xC0C1;&#xD669;&#xC744; &#xB5A0;&#xC62C;&#xB824;&#xBCF4;&#xBA74; &#xC27D;&#xC2B5;&#xB2C8;&#xB2E4;. &#xCC45;&#xC744; &#xD798;&#xAECF; &#xB358;&#xC838;&#xC11C; &#xCE5C;&#xAD6C; &#xC9D1; &#xCC3D;&#xBB38; &#xD2C8;&#xC0C8;&#xB85C; &#xC808;&#xBB18;&#xD558;&#xAC8C; &#xB5A8;&#xC5B4;&#xC9C0;&#xBA74; &#xC88B;&#xACA0;&#xC9C0;&#xB9CC;, &#xB204;&#xAD6C;&#xB3C4; &#xADF8;&#xB807;&#xAC8C; &#xD560; &#xCD08;&#xB2A5;&#xB825;&#xC740; &#xC5C6;&#xC2B5;&#xB2C8;&#xB2E4;. &#xADF8;&#xB798;&#xC11C; &#xC6B0;&#xB9AC;&#xB294; &#xD0DD;&#xBC30;&#xB97C; &#xC774;&#xC6A9;&#xD569;&#xB2C8;&#xB2E4;.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://blog.cinntiq.synology.me/content/images/2023/02/202302080004.jpg" class="kg-image" alt="HTTP &#xB418;&#xC9DA;&#xAE30;" loading="lazy" width="1450" height="480" srcset="https://blog.cinntiq.synology.me/content/images/size/w600/2023/02/202302080004.jpg 600w, https://blog.cinntiq.synology.me/content/images/size/w1000/2023/02/202302080004.jpg 1000w, https://blog.cinntiq.synology.me/content/images/2023/02/202302080004.jpg 1450w" sizes="(min-width: 720px) 720px"><figcaption>&#xC774;&#xB7F0; &#xB290;&#xB08C;&#xC73C;&#xB85C; &#xC9C4;&#xD589;&#xB420; &#xAC83;&#xC774;&#xB2E4;.</figcaption></figure><p>&#x2003;&#xB370;&#xC774;&#xD130;&#xB3C4; &#xB9C8;&#xCC2C;&#xAC00;&#xC9C0;&#xC785;&#xB2C8;&#xB2E4;. &#xC5EC;&#xB7EC; &#xD3EC;&#xC7A5;&#xC744; &#xC50C;&#xC6CC;&#xC57C; &#xC815;&#xC0C1;&#xC801;&#xC73C;&#xB85C; &#xBCF4;&#xB0BC; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;. &#xC774;&#xB7F0; &#xD3EC;&#xC7A5;&#xC744; &#xD328;&#xD0B7;&#xC774;&#xB77C; &#xBD80;&#xB974;&#xACE0;, &#xD328;&#xD0B7;&#xC740; &#xC5EC;&#xB7EC; &#xAC00;&#xC9C0;&#xAC00; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.<br>&#x2003;&#xC61B;&#xB0A0;&#xC5D4; &#xC5C5;&#xCCB4;&#xB4E4;&#xC774; &#xC790;&#xAE30;&#xB4E4;&#xB9CC;&#xC758; &#xD1B5;&#xC2E0;&#xBC95;&#xC744; &#xC368;&#xC11C; &#xD0C0;&#xC0AC;, &#xD0C0;&#xAE30;&#xC885; &#xAC04; &#xD1B5;&#xC2E0; &#xD638;&#xD658;&#xC774; &#xC5C9;&#xB9DD;&#xC774;&#xC5C8;&#xC2B5;&#xB2C8;&#xB2E4;. &#xADF8;&#xB798;&#xC11C; &#xAD6D;&#xC81C; &#xD45C;&#xC900; &#xD611;&#xD68C;&#xC5D0;&#xC11C; &#xD45C;&#xC900; &#xD1B5;&#xC2E0; &#xADDC;&#xC57D; (OSI &#xCC38;&#xC870; &#xBAA8;&#xB378; 7&#xACC4;&#xCE35;)&#xC744; &#xB9CC;&#xB4E4;&#xC5C8;&#xACE0;, &#xC694;&#xC998;&#xC740; &#xAC04;&#xC18C;&#xD654;&#xD55C; TCP / IP 4&#xACC4;&#xCE35; &#xD45C;&#xC900;&#xC744; &#xB9CE;&#xC774; &#xC501;&#xB2C8;&#xB2E4;.<br>&#x2003;&#xC774;&#xB984;&#xC740; TCP/IP 4&#xACC4;&#xCE35; &#xBAA8;&#xB378;&#xC774;&#xC9C0;&#xB9CC; FTP, SMTP &#xB4F1; &#xC5EC;&#xB7EC; &#xD504;&#xB85C;&#xD1A0;&#xCF5C;&#xB3C4; &#xD3EC;&#xD568;&#xB429;&#xB2C8;&#xB2E4;. (TCP, IP&#xB294; &#xB370;&#xC774;&#xD130;&#xB97C; &#xCC98;&#xB9AC; &#xC808;&#xCC28;&#xC9C0;&#xB9CC; &#xD328;&#xD0B7;&#xC744; &#xAC00;&#xB9AC;&#xD0AC; &#xC218;&#xB3C4; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.)</p><h3 id="tcp">TCP</h3><p>&#x2003;TCP&#xC5D0;&#xC120; &#xB370;&#xC774;&#xD130; &#xD750;&#xB984;(&#xC21C;&#xC11C;)&#xB97C; &#xC81C;&#xC5B4;&#xD558;&#xBA70; &#xC815;&#xD655;&#xC131;&#xC744; &#xAC80;&#xC0AC;&#xD569;&#xB2C8;&#xB2E4;. </p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://blog.cinntiq.synology.me/content/images/2023/02/202302070004.png" class="kg-image" alt="HTTP &#xB418;&#xC9DA;&#xAE30;" loading="lazy" width="885" height="318" srcset="https://blog.cinntiq.synology.me/content/images/size/w600/2023/02/202302070004.png 600w, https://blog.cinntiq.synology.me/content/images/2023/02/202302070004.png 885w" sizes="(min-width: 720px) 720px"><figcaption>TCP&#xB294; 3 way handshake&#xB77C;&#xB294; &#xBC29;&#xC2DD;&#xC744; &#xC4F4;&#xB2E4;.</figcaption></figure><ol><li>&#xC811;&#xC18D;&#xB418;&#xB294;&#xC9C0; &#xD655;&#xC778;(SYN)</li><li>&#xC811;&#xC18D; &#xAC00;&#xB2A5;&#xD558;&#xBA74; &#xC11C;&#xBC84;&#xB294; &#xC751;&#xB2F5; &amp; &#xC815;&#xBCF4; &#xBCF4;&#xB0B4;&#xB77C;&#xACE0; &#xC694;&#xCCAD;&#xD55C;&#xB2E4;.(ACK, SYN)</li><li>&#xD074;&#xB77C;&#xC774;&#xC5B8;&#xD2B8;&#xB294; &#xC694;&#xCCAD;&#xC744; &#xC218;&#xB77D;&#xD558;&#xACE0;, &#xC815;&#xBCF4;&#xB97C; &#xBCF4;&#xB0B8;&#xB2E4;.</li></ol><p>&#x2003;&#xB9CC;&#xC57D; &#xB370;&#xC774;&#xD130;&#xC5D0; &#xC624;&#xB958;&#xAC00; &#xC788;&#xC73C;&#xBA74; &#xC0C1;&#xD638; &#xC18C;&#xD1B5;&#xD574;&#xC11C; &#xB370;&#xC774;&#xD130;&#xB97C; &#xC7AC;&#xC804;&#xC1A1;, &#xC7AC;&#xACB0;&#xD569;&#xD55C;&#xB2E4;. <br>&#x2003;TCP&#xB294; &#xB370;&#xC774;&#xD130; &#xC2E0;&#xB8B0;&#xB97C; &#xBCF4;&#xC7A5;&#xD558;&#xB294; &#xC808;&#xCC28;&#xB2E4;. &#xB2E8;&#xC810;&#xC740; &#xD655;&#xC778; &#xC808;&#xCC28; &#xB54C;&#xBB38;&#xC5D0; &#xC2DC;&#xAC04;&#xC774; &#xC870;&#xAE08; &#xAC78;&#xB9B0;&#xB2E4;.</p><h3 id="3-2-tcpip-4%EA%B3%84%EC%B8%B5">3-2. TCP/IP 4&#xACC4;&#xCE35;</h3><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://blog.cinntiq.synology.me/content/images/2023/02/202302080003.jpg" class="kg-image" alt="HTTP &#xB418;&#xC9DA;&#xAE30;" loading="lazy" width="1450" height="480" srcset="https://blog.cinntiq.synology.me/content/images/size/w600/2023/02/202302080003.jpg 600w, https://blog.cinntiq.synology.me/content/images/size/w1000/2023/02/202302080003.jpg 1000w, https://blog.cinntiq.synology.me/content/images/2023/02/202302080003.jpg 1450w" sizes="(min-width: 720px) 720px"><figcaption>TCP / IP 4&#xACC4;&#xCE35; &#xAD6C;&#xC870;</figcaption></figure><ol><li>&#xB370;&#xC774;&#xD130; &#xC0DD;&#xC131;(&#xC5B4;&#xD50C;&#xB9AC;&#xCF00;&#xC774;&#xC158; &#xACC4;&#xCE35;)<br>&#xC608;: &#xC1FC;&#xD551;&#xBAB0;(&#xC5B4;&#xD50C;&#xB9AC;&#xCF00;&#xC774;&#xC158;)&#xC5D0;&#xC11C; &#xD68C;&#xC6D0; &#xC815;&#xBCF4;(&#xB370;&#xC774;&#xD130;)&#xB97C; &#xC785;&#xB825;</li><li>TCP, &#xD639;&#xC740; UDP&#xB85C; &#xD3EC;&#xC7A5;(&#xC804;&#xC1A1; &#xACC4;&#xCE35;)<br>TCP: &#xC815;&#xD655;&#xD55C; &#xC804;&#xC1A1;&#xACFC; &#xD53C;&#xB4DC;&#xBC31;. <strong>&#xB370;&#xC774;&#xD130; &#xC2E0;&#xB8B0;</strong> &#xBD80;&#xC5EC;.<br>UDP: <strong>&#xBE60;&#xB978; &#xC804;&#xC1A1;</strong>. &#xBBF8;&#xB514;&#xC5B4; &#xD1B5;&#xC2E0; &#xB4F1; &#xBE60;&#xB974;&#xAC8C; &#xC804;&#xC1A1;&#xD558;&#xAE30;&#xB9CC; &#xD558;&#xBA74; &#xB418;&#xB294; &#xACF3;&#xC5D0; &#xC0AC;&#xC6A9;.</li><li>IP &#xD5E4;&#xB354; &#xCD94;&#xAC00;. IP &#xC8FC;&#xC18C;&#xAC00; &#xC788;&#xACE0; &#xB370;&#xC774;&#xD130; &#xBCF4;&#xB0B4;&#xB294;&#xB370; &#xC911;&#xC810;. (&#xC778;&#xD130;&#xB137; &#xACC4;&#xCE35;)</li><li>&#xB124;&#xD2B8;&#xC6CC;&#xD06C; &#xC811;&#xC18D; &#xACC4;&#xCE35;&#xC5D0;&#xC120; &#xBB3C;&#xB9AC;&#xC801; &#xC8FC;&#xC18C;(Media Access Control &#xC8FC;&#xC18C;)&#xB97C; &#xB2F4;&#xB294;&#xB2E4;. MAC &#xC8FC;&#xC18C;&#xB294; &#xD68C;&#xC0AC;&#xC5D0;&#xC11C; &#xD638;&#xC2A4;&#xD2B8;&#xB97C; &#xAD6C;&#xBCC4;&#xD558;&#xB824;&#xACE0; &#xAC1C;&#xBCC4;&#xC801;&#xC73C;&#xB85C; &#xD560;&#xB2F9;&#xD558;&#xB294; &#xACE0;&#xC720;&#xD55C; &#xC2DD;&#xBCC4; &#xBC88;&#xD638;&#xB2E4;. &#xC774;&#xB354;&#xB137;&#xCC98;&#xB7FC; <strong>&#xBB3C;&#xB9AC;&#xC801;&#xC778; &#xC8FC;&#xC18C;&#xB85C; &#xD1B5;&#xC2E0;</strong>&#xD560; &#xB54C; &#xC4F0;&#xAE30; &#xB54C;&#xBB38;&#xC5D0; &#xC77C;&#xBC18;&#xC801;&#xC73C;&#xB85C; MAC &#xC8FC;&#xC18C;&#xB97C; &#xC4F0;&#xB294; &#xACBD;&#xC6B0;&#xB294; &#xB9CE;&#xC9C0; &#xC54A;&#xC544;&#xC11C; <strong>&#xC0DD;&#xB7B5;</strong>&#xB418;&#xB294; &#xB2E8;&#xACC4;&#xC774;&#xAE30;&#xB3C4; &#xD558;&#xB2E4;.</li></ol><p>&#x2003;&#xC11C;&#xBC84;&#xC758; &#xC778;&#xD130;&#xB137; &#xACC4;&#xCE35;&#xC740; IP &#xD328;&#xD0B7;&#xC744; &#xAC80;&#xC0AC;&#xD558;&#xACE0; &#xC804;&#xC1A1; &#xACC4;&#xCE35;&#xC5D0; &#xBCF4;&#xB0B8;&#xB2E4;. <br>&#x2003;&#xC804;&#xC1A1; &#xACC4;&#xCE35;&#xC740; &#xB370;&#xC774;&#xD130; &#xC815;&#xD655;&#xC131; &#xB4F1;&#xC744; &#xCCB4;&#xD06C;(TCP)</p><h3 id="3-3-ip%EC%99%80-port">3-3. IP&#xC640; PORT</h3><p>&#x2003;IP&#xB294; &#xD55C; &#xAC1C; &#xBFD0;&#xC774;&#xB77C;&#xC11C; &#xC5EC;&#xB7EC; &#xC11C;&#xBE44;&#xC2A4;&#xB97C; &#xC774;&#xC6A9;&#xD558;&#xAE30; &#xD798;&#xB4E4;&#xB2E4;. &#xADF8;&#xB798;&#xC11C; port&#xB97C; &#xCD94;&#xAC00;<br>&#x2003;&#xC720;&#xBA85;&#xD55C; &#xD3EC;&#xD2B8; &#xBC88;&#xD638;&#xB294; 443(https, &#xBCF4;&#xC548;)<br>&#x2003;IP&#xAC00; &#xB3C4;&#xC2DC;&#xB77C;&#xBA74; port&#xB294; &#xD56D;&#xAD6C;&#xB2E4;. &#xB3C4;&#xC2DC;&#xC5D0;&#xC11C; &#xAD50;&#xC5ED;&#xC744; &#xD558;&#xB824;&#xBA74; 1&#xBC88; &#xD56D;&#xAD6C;&#xB85C; &#xAC00;&#xACE0;, &#xBC30;&#xB97C; &#xC218;&#xB9AC;&#xD558;&#xB824;&#xBA74; 2&#xBC88; &#xD56D;&#xAD6C;&#xB85C; &#xAC00;&#xB294; &#xC2DD;&#xC774;&#xB2E4;.</p><h3 id="3-4-%EB%8F%84%EB%A9%94%EC%9D%B8">3-4. &#xB3C4;&#xBA54;&#xC778;</h3><p>&#x2003;IP&#xB294; 123.100.001.211 &#xC774;&#xB7F0; &#xC2DD;&#xC73C;&#xB85C; &#xAD6C;&#xC131;&#xB418;&#xC5B4;&#xC788;&#xB294;&#xB370; &#xC800;&#xB807;&#xAC8C; &#xC8FC;&#xC18C;&#xB97C; &#xC785;&#xB825;&#xD574;&#xC11C; &#xC811;&#xC18D;&#xD558;&#xB824;&#xBA74; &#xC77C;&#xC77C;&#xC774; &#xAE30;&#xC5B5;&#xD558;&#xAE30;&#xAC00; &#xD798;&#xB4E4;&#xB2E4;.<br>&#x2003;DNS(Domain Name System)&#xB97C; &#xC774;&#xC6A9;&#xD558;&#xBA74; &#xB3C4;&#xBA54;&#xC778;&#xC774; IP &#xC8FC;&#xC18C;&#xB85C; &#xBCC0;&#xD658;&#xB418;&#xC5B4;&#xC11C; &#xC811;&#xC18D;&#xD55C;&#xB2E4;.<br>&#x2003;1. &#xD074;&#xB77C;&#xC774;&#xC5B8;&#xD2B8;&#xAC00; &#xB3C4;&#xBA54;&#xC778;&#xC744; &#xC785;&#xB825;&#xD558;&#xBA74; &#xB85C;&#xCEEC; DNS&#xC5D0; &#xCE90;&#xC2DC;&#xB97C; &#xD655;&#xC778;<br>&#x2003;2. &#xC5C6;&#xC73C;&#xBA74; Root &#xC11C;&#xBC84;&#xC5D0; &#xD655;&#xC778;<br>&#x2003;3. TLD &#xC11C;&#xBC84; &#xB4F1; &#xC5EC;&#xB7EC; &#xC11C;&#xBC84;&#xB97C; &#xAC70;&#xCCD0;&#xC11C; &#xB3C4;&#xBA54;&#xC778;&#xC5D0; &#xB9E4;&#xD551;&#xB418;&#xB294; IP &#xC218;&#xB839;<br>&#x2003;4. &#xD574;&#xB2F9; IP&#xC5D0; &#xC811;&#xC18D;</p><h3 id="3-5-uri">3-5. URI</h3><p>Uniform: &#xAD6C;&#xBD84;&#xD55C;&#xB2E4;.<br>Resource: &#xC790;&#xC6D0;&#xC744;,<br>Identifier: &#xC2DD;&#xBCC4;&#xC790;&#xB85C;.</p><p>&#x2003;URI&#xB294; &#xBCF4;&#xD1B5; &#xC544;&#xB798;&#xC640; &#xAC19;&#xC740; &#xD615;&#xC2DD;&#xC744; &#xAC00;&#xC9C4;&#xB2E4;.(port&#xB77C;&#xB358;&#xC9C0;, &#xC0DD;&#xB7B5;&#xB418;&#xB294; &#xBD80;&#xBD84;&#xB3C4; &#xC788;&#xB2E4;.)<br>schema://host/path?query=...<br>&#x2003;&#x2003;coffee png&#xB77C;&#xACE0; &#xAC80;&#xC0C9;&#xD558;&#xBA74; &#xAD6C;&#xAE00;&#xC740; &#xC544;&#xB798;&#xC640; &#xAC19;&#xC740; URI&#xB85C; &#xAC80;&#xC0C9;&#xD55C;&#xB2E4;.</p><p><a href="https://www.google.com/search?q=coffee+png&amp;tbm=isch&amp;ved=2ahUKEwj69szC3Zj2AhUEJqYKHfzXCPEQ2-cCegQIABAA&amp;oq=coffee+png&amp;gs_lcp=CgNpbWcQAzIICAAQgAQQsQMyBQgAEIAEMgUIABCABDIFCAAQgAQyBQgAEIAEMgUIABCABDIFCAAQgAQyBQgAEIAEMgUIABCABDIFCAAQgAQ6BwgAELEDEEM6BAgAEEM6CggAELEDEIMBEENQ_gNY5Qxg2w1oAXAAeACAAdYBiAGJCJIBAzItNZgBAKABAaoBC2d3cy13aXotaW1nwAEB&amp;sclient=img&amp;ei=Xa4XYrrUAoTMmAX8r6OIDw&amp;bih=856&amp;biw=1381&amp;hl=en&amp;ref=blog.cinntiq.synology.me">https://www.google.com/search?q=coffee+png&amp;tbm=isch&amp;ved=2ahUKEwj69szC3Zj2AhUEJqYKHfzXCPEQ2-cCegQIABAA&amp;oq=coffee+png&amp;gs_lcp=CgNpbWcQAzIICAAQgAQQsQMyBQgAEIAEMgUIABCABDIFCAAQgAQyBQgAEIAEMgUIABCABDIFCAAQgAQyBQgAEIAEMgUIABCABDIFCAAQgAQ6BwgAELEDEEM6BAgAEEM6CggAELEDEIMBEENQ_gNY5Qxg2w1oAXAAeACAAdYBiAGJCJIBAzItNZgBAKABAaoBC2d3cy13aXotaW1nwAEB&amp;sclient=img&amp;ei=Xa4XYrrUAoTMmAX8r6OIDw&amp;bih=856&amp;biw=1381&amp;hl=en</a></p><p>&#x2003;&#xB9CC;&#xC57D; &#xAC1C;&#xBC1C;&#xD558;&#xB2E4;&#xAC00; URI&#xB97C; &#xC791;&#xBA85;&#xD55C;&#xB2E4;&#xACE0; &#xD558;&#xBA74; &#xB9AC;&#xC18C;&#xC2A4;&#xB97C; &#xAE30;&#xC900;&#xC73C;&#xB85C; &#xD558;&#xBA74; &#xC88B;&#xB2E4;.</p><ul><li>/create/user... [X]</li><li>/user [O]</li></ul><p>&#x2003;&#xBAA8;&#xB4E0; URI&#xB97C; &#xB9AC;&#xC18C;&#xC2A4; &#xAE30;&#xC900;&#xC73C;&#xB85C;&#xB9CC; &#xB9CC;&#xB4E4;&#xAE30;&#xB780; &#xC0DD;&#xAC01;&#xBCF4;&#xB2E4; &#xC27D;&#xC9C4; &#xC54A;&#xB2E4;. &#xC704;&#xC758; &#xAD6C;&#xAE00; &#xC608;&#xC2DC;&#xB3C4; &#xADF8;&#xB807;&#xB2E4;. /search&#xAC19;&#xC740; &#xAC74; &#xCEE8;&#xD2B8;&#xB864; URI&#xB2E4;. &#xB3D9;&#xC0AC;&#xB85C; &#xB9CC;&#xB4DC;&#xB294; &#xD3B8;.<br>&#x2003;&#xB611;&#xAC19;&#xC740; URI&#xC5D0;&#xC11C; &#xD68C;&#xC6D0; &#xAC00;&#xC785;&#xB3C4; &#xD558;&#xACE0;, &#xD68C;&#xC6D0; &#xC870;&#xD68C;&#xB3C4; &#xD558;&#xAE38; &#xC6D0;&#xD558;&#xBA74; HTTP &#xBA54;&#xC18C;&#xB4DC;(GET,POST &#xB4F1;)&#xB97C; &#xC0AC;&#xC6A9;&#xD55C;&#xB2E4;.</p><h2 id="4-http-%EB%A9%94%EC%86%8C%EB%93%9C">4. HTTP &#xBA54;&#xC18C;&#xB4DC;</h2><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://blog.cinntiq.synology.me/content/images/2023/02/202302080001.png" class="kg-image" alt="HTTP &#xB418;&#xC9DA;&#xAE30;" loading="lazy" width="921" height="335" srcset="https://blog.cinntiq.synology.me/content/images/size/w600/2023/02/202302080001.png 600w, https://blog.cinntiq.synology.me/content/images/2023/02/202302080001.png 921w" sizes="(min-width: 720px) 720px"><figcaption>HTTP &#xBA54;&#xC18C;&#xB4DC; &#xBA85;&#xC138;</figcaption></figure><p>&#xC548;&#xC804;&#xC131;(Safe) : &#xD574;&#xB2F9; &#xBA54;&#xC18C;&#xB4DC;&#xB97C; &#xD638;&#xCD9C;&#xD574;&#xB3C4; &#xB9AC;&#xC18C;&#xC2A4;&#xB294; &#xBCC0;&#xD558;&#xC9C0; &#xC54A;&#xB294;&#xB2E4;.<br>&#xBA71;&#xB4F1;&#xC131;(Idempotent) : &#xD574;&#xB2F9; &#xBA54;&#xC18C;&#xB4DC;&#xB97C; &#xBA87; &#xBC88; &#xD638;&#xCD9C;&#xD574;&#xB3C4; &#xACB0;&#xACFC;&#xB294; &#xB3D9;&#xC77C;&#xD558;&#xB2E4;.<br>&#xCE90;&#xC2DC; &#xAC00;&#xB2A5;(Cacheable) : &#xD574;&#xB2F9; &#xBA54;&#xC18C;&#xB4DC;&#xB294; &#xD638;&#xCD9C;&#xD588;&#xC744; &#xB54C; &#xCE90;&#xC2F1; &#xAC00;&#xB2A5;&#xD558;&#xB2E4;.</p><ul><li>GET : &#xB370;&#xC774;&#xD130; &#xC870;&#xD68C;&#xD560; &#xB54C; &#xC0AC;&#xC6A9;.</li><li>POST : &#xB9AC;&#xC18C;&#xC2A4; &#xC2E0;&#xADDC; &#xB4F1;&#xB85D;(URI &#xBAB0;&#xB77C;&#xB3C4; &#xB428;. &#xC11C;&#xBC84;&#xAC00; &#xC54C;&#xC544;&#xC11C; URI &#xB4F1;&#xB85D;), &#xC815;&#xBCF4;&#xB97C; &#xAC00;&#xC9C0;&#xACE0; &#xC791;&#xC5C5;&#xD558;&#xAC70;&#xB098; &#xCC98;&#xB9AC;, &#xC870;&#xD68C;, &#xC218;&#xC815;&#xD560; &#xB54C; &#xB4F1; &#xB2E4;&#xC6A9;&#xB3C4;</li><li>PUT : &#xB9AC;&#xC18C;&#xC2A4; &#xC2E0;&#xADDC; &#xB4F1;&#xB85D;(&#xD074;&#xB77C;&#xC774;&#xC5B8;&#xD2B8;&#xAC00; URI&#xB97C; &#xC54C;&#xACE0; &#xC785;&#xB825;&#xD574;&#xC57C; &#xB428;), &#xC815;&#xBCF4; &#xC218;&#xC815;(&#xC77C;&#xBD80; &#xB0B4;&#xC6A9; &#xBCC0;&#xACBD;&#xD560; &#xB54C;&#xC5D4; PATCH&#xAC00; &#xB354; &#xCDE8;&#xC9C0;&#xC5D0; &#xB9DE;&#xC74C;. PUT&#xC740; &#xAE30;&#xC874;&#xC758; &#xB370;&#xC774;&#xD130;&#xB97C; &#xB2E4; &#xB0A0;&#xB824;&#xBA39;&#xAE30; &#xB54C;&#xBB38;.)</li></ul><p>POST&#xCC98;&#xB7FC; &#xC11C;&#xBC84;&#xAC00; URI&#xB97C; &#xB9CC;&#xB4E4;&#xACE0; &#xAD00;&#xB9AC;&#xD558;&#xB294; &#xB514;&#xB809;&#xD1A0;&#xB9AC;&#xB294; Collection,<br>PUT&#xCC98;&#xB7FC; &#xD074;&#xB77C;&#xC774;&#xC5B8;&#xD2B8;&#xAC00; URI&#xB97C; &#xC54C;&#xACE0; &#xAD00;&#xB9AC;&#xD558;&#xB294; &#xB514;&#xB809;&#xD1A0;&#xB9AC;&#xB294; Store&#xB77C; &#xBD80;&#xB978;&#xB2E4;.</p><h3 id="4-1-rest-api-restful-api">4-1. REST API, RESTful API</h3><p>&#x2003;REST&#xB294; REpresentational State Transfer&#xC758; &#xC904;&#xC784;&#xB9D0;&#xB85C; &#xAC1C;&#xBC1C;&#xC790;&#xAC00; HTTP &#xD1B5;&#xC2E0; &#xAE30;&#xBC18;&#xC73C;&#xB85C; API&#xB97C; &#xB9CC;&#xB4E4; &#xB54C; &#xC5FC;&#xB450;&#xD558;&#xAE38; &#xAD8C;&#xC7A5;&#xD558;&#xB294; &#xADDC;&#xCE59;&#xC774;&#xB2E4;. IBM&#xC5D0;&#xC120; &#xC544;&#xB798;&#xC640; &#xAC19;&#xC774; &#xC54C;&#xB824;&#xC900;&#xB2E4;.</p><hr><ol><li><strong>&#xADE0;&#xC77C;&#xD55C; &#xC778;&#xD130;&#xD398;&#xC774;&#xC2A4;. </strong>&#xC694;&#xCCAD;&#xC774; &#xC5B4;&#xB514;&#xC5D0;&#xC11C; &#xC624;&#xB294;&#xC9C0;&#xC640; &#xBB34;&#xAD00;&#xD558;&#xAC8C;, &#xB3D9;&#xC77C;&#xD55C; &#xB9AC;&#xC18C;&#xC2A4;&#xC5D0; &#xB300;&#xD55C; &#xBAA8;&#xB4E0; API &#xC694;&#xCCAD;&#xC740; &#xB3D9;&#xC77C;&#xD558;&#xAC8C; &#xBCF4;&#xC5EC;&#xC57C; &#xD569;&#xB2C8;&#xB2E4;. REST API&#xB294; &#xC0AC;&#xC6A9;&#xC790;&#xC758; &#xC774;&#xB984;&#xC774;&#xB098; &#xC774;&#xBA54;&#xC77C; &#xC8FC;&#xC18C; &#xB4F1;&#xC758; &#xB3D9;&#xC77C;&#xD55C; &#xB370;&#xC774;&#xD130; &#xC870;&#xAC01;&#xC774; &#xC624;&#xC9C1; &#xD558;&#xB098;&#xC758; URI(Uniform Resource Identifier)&#xC5D0; &#xC18D;&#xD568;&#xC744; &#xBCF4;&#xC7A5;&#xD574;&#xC57C; &#xD569;&#xB2C8;&#xB2E4;. &#xB9AC;&#xC18C;&#xC2A4;&#xAC00; &#xB108;&#xBB34; &#xD074; &#xD544;&#xC694;&#xB294; &#xC5C6;&#xC9C0;&#xB9CC;, &#xC774;&#xB294; &#xD074;&#xB77C;&#xC774;&#xC5B8;&#xD2B8;&#xAC00; &#xD544;&#xC694;&#xB85C; &#xD558;&#xB294; &#xBAA8;&#xB4E0; &#xC815;&#xBCF4;&#xB97C; &#xD3EC;&#xD568;&#xD574;&#xC57C; &#xD569;&#xB2C8;&#xB2E4;.</li><li><strong>&#xD074;&#xB77C;&#xC774;&#xC5B8;&#xD2B8;-&#xC11C;&#xBC84; &#xB514;&#xCEE4;&#xD50C;&#xB9C1;. </strong>REST API &#xB514;&#xC790;&#xC778;&#xC5D0;&#xC11C;, &#xD074;&#xB77C;&#xC774;&#xC5B8;&#xD2B8;&#xC640; &#xC11C;&#xBC84; &#xC560;&#xD50C;&#xB9AC;&#xCF00;&#xC774;&#xC158;&#xC740; &#xC11C;&#xB85C; &#xAC04;&#xC5D0; &#xC644;&#xC804;&#xD788; &#xB3C5;&#xB9BD;&#xC801;&#xC774;&#xC5B4;&#xC57C; &#xD569;&#xB2C8;&#xB2E4;. &#xD074;&#xB77C;&#xC774;&#xC5B8;&#xD2B8; &#xC560;&#xD50C;&#xB9AC;&#xCF00;&#xC774;&#xC158;&#xC774; &#xC54C;&#xC544;&#xC57C; &#xD558;&#xB294; &#xC720;&#xC77C;&#xD55C; &#xC815;&#xBCF4;&#xB294; &#xC694;&#xCCAD;&#xB41C; &#xB9AC;&#xC18C;&#xC2A4;&#xC758; URI&#xC774;&#xBA70;, &#xC774;&#xB294; &#xB2E4;&#xB978; &#xBC29;&#xBC95;&#xC73C;&#xB85C; &#xC11C;&#xBC84; &#xC560;&#xD50C;&#xB9AC;&#xCF00;&#xC774;&#xC158;&#xACFC; &#xC0C1;&#xD638;&#xC791;&#xC6A9;&#xD560; &#xC218; &#xC5C6;&#xC2B5;&#xB2C8;&#xB2E4;. &#xC774;&#xC640; &#xC720;&#xC0AC;&#xD558;&#xAC8C;, &#xC11C;&#xBC84; &#xC560;&#xD50C;&#xB9AC;&#xCF00;&#xC774;&#xC158;&#xC740; HTTP&#xB97C; &#xD1B5;&#xD574; &#xC694;&#xCCAD;&#xB41C; &#xB370;&#xC774;&#xD130;&#xC5D0; &#xC804;&#xB2EC;&#xD558;&#xB294; &#xAC83; &#xB9D0;&#xACE0;&#xB294; &#xD074;&#xB77C;&#xC774;&#xC5B8;&#xD2B8; &#xC560;&#xD50C;&#xB9AC;&#xCF00;&#xC774;&#xC158;&#xC744; &#xC218;&#xC815;&#xD558;&#xC9C0; &#xC54A;&#xC544;&#xC57C; &#xD569;&#xB2C8;&#xB2E4;.</li><li><strong>Stateless. </strong>REST API&#xB294; stateless&#xC785;&#xB2C8;&#xB2E4;. &#xC774;&#xB294; &#xAC01; &#xC694;&#xCCAD;&#xC5D0;&#xC11C; &#xC774;&#xC758; &#xCC98;&#xB9AC;&#xC5D0; &#xD544;&#xC694;&#xD55C; &#xBAA8;&#xB4E0; &#xC815;&#xBCF4;&#xB97C; &#xD3EC;&#xD568;&#xD574;&#xC57C; &#xD568;&#xC744; &#xC758;&#xBBF8;&#xD569;&#xB2C8;&#xB2E4;. &#xC989;, REST API&#xB294; &#xC11C;&#xBC84;&#xCE21; &#xC138;&#xC158;&#xC744; &#xD544;&#xC694;&#xB85C; &#xD558;&#xC9C0; &#xC54A;&#xC2B5;&#xB2C8;&#xB2E4;. &#xC11C;&#xBC84; &#xC560;&#xD50C;&#xB9AC;&#xCF00;&#xC774;&#xC158;&#xC740; &#xD074;&#xB77C;&#xC774;&#xC5B8;&#xD2B8; &#xC694;&#xCCAD;&#xACFC; &#xAD00;&#xB828;&#xB41C; &#xB370;&#xC774;&#xD130;&#xB97C; &#xC800;&#xC7A5;&#xD560; &#xC218; &#xC5C6;&#xC2B5;&#xB2C8;&#xB2E4;.</li><li><strong>&#xCE90;&#xC2F1; &#xAC00;&#xB2A5;&#xC131;. </strong>&#xAC00;&#xAE09;&#xC801;&#xC774;&#xBA74;, &#xB9AC;&#xC18C;&#xC2A4;&#xB97C; &#xD074;&#xB77C;&#xC774;&#xC5B8;&#xD2B8; &#xB610;&#xB294; &#xC11C;&#xBC84;&#xCE21;&#xC5D0;&#xC11C; &#xCE90;&#xC2F1;&#xD560; &#xC218; &#xC788;&#xC5B4;&#xC57C; &#xD569;&#xB2C8;&#xB2E4;. &#xB610;&#xD55C; &#xC11C;&#xBC84; &#xC751;&#xB2F5;&#xC5D0;&#xB294; &#xC804;&#xB2EC;&#xB41C; &#xB9AC;&#xC18C;&#xC2A4;&#xC5D0; &#xB300;&#xD574; &#xCE90;&#xC2F1;&#xC774; &#xD5C8;&#xC6A9;&#xB418;&#xB294;&#xC9C0; &#xC5EC;&#xBD80;&#xC5D0; &#xB300;&#xD55C; &#xC815;&#xBCF4;&#xB3C4; &#xD3EC;&#xD568;&#xB418;&#xC5B4;&#xC57C; &#xD569;&#xB2C8;&#xB2E4;. &#xC774;&#xC758; &#xBAA9;&#xC801;&#xC740; &#xC11C;&#xBC84;&#xCE21;&#xC758; &#xD655;&#xC7A5;&#xC131; &#xC99D;&#xAC00;&#xC640; &#xD568;&#xAED8; &#xD074;&#xB77C;&#xC774;&#xC5B8;&#xD2B8;&#xCE21;&#xC758; &#xC131;&#xB2A5; &#xD5A5;&#xC0C1;&#xC744; &#xB3D9;&#xC2DC;&#xC5D0; &#xC5BB;&#xB294; &#xAC83;&#xC785;&#xB2C8;&#xB2E4;.</li><li><strong>&#xACC4;&#xCE35; &#xAD6C;&#xC870; &#xC544;&#xD0A4;&#xD14D;&#xCC98;. </strong>REST API&#xC5D0;&#xC11C;&#xB294; &#xD638;&#xCD9C;&#xACFC; &#xC751;&#xB2F5;&#xC774; &#xC11C;&#xB85C; &#xB2E4;&#xB978; &#xACC4;&#xCE35;&#xC744; &#xD1B5;&#xACFC;&#xD569;&#xB2C8;&#xB2E4;. &#xC77C;&#xBC18;&#xC801;&#xC73C;&#xB85C;&#xB294;, &#xD074;&#xB77C;&#xC774;&#xC5B8;&#xD2B8;&#xC640; &#xC11C;&#xBC84; &#xC560;&#xD50C;&#xB9AC;&#xCF00;&#xC774;&#xC158;&#xC774; &#xC11C;&#xB85C; &#xAC04;&#xC5D0; &#xC9C1;&#xC811; &#xC5F0;&#xACB0;&#xB41C;&#xB2E4;&#xACE0; &#xAC00;&#xC815;&#xD558;&#xC9C0; &#xB9C8;&#xC138;&#xC694;. &#xD1B5;&#xC2E0; &#xB8E8;&#xD504;&#xC5D0;&#xB294; &#xB2E4;&#xC218;&#xC758; &#xC11C;&#xB85C; &#xB2E4;&#xB978; &#xC911;&#xAC1C;&#xC790;&#xAC00; &#xC788;&#xC744; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;. REST API&#xB294; &#xC5D4;&#xB4DC; &#xC560;&#xD50C;&#xB9AC;&#xCF00;&#xC774;&#xC158; &#xB610;&#xB294; &#xC911;&#xAC1C;&#xC790;&#xC640; &#xD1B5;&#xC2E0;&#xD558;&#xB294;&#xC9C0; &#xC5EC;&#xBD80;&#xB97C; &#xD074;&#xB77C;&#xC774;&#xC5B8;&#xD2B8;&#xB098; &#xC11C;&#xBC84;&#xAC00; &#xC54C; &#xC218; &#xC5C6;&#xB3C4;&#xB85D; &#xC124;&#xACC4;&#xB418;&#xC5B4;&#xC57C; &#xD569;&#xB2C8;&#xB2E4;.</li><li><strong>&#xCF54;&#xB4DC; &#xC628;&#xB514;&#xB9E8;&#xB4DC;(&#xC635;&#xC158;). </strong>REST API&#xB294; &#xC77C;&#xBC18;&#xC801;&#xC73C;&#xB85C; &#xC815;&#xC801; &#xB9AC;&#xC18C;&#xC2A4;&#xB97C; &#xC804;&#xC1A1;&#xD558;&#xC9C0;&#xB9CC;, &#xD2B9;&#xC815;&#xD55C; &#xACBD;&#xC6B0;&#xC5D0;&#xB294; &#xC751;&#xB2F5;&#xC5D0; &#xC2E4;&#xD589; &#xCF54;&#xB4DC;(&#xC608;: Java &#xC560;&#xD50C;&#xB9BF;)&#xB97C; &#xD3EC;&#xD568;&#xD560; &#xC218;&#xB3C4; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;. &#xC774;&#xB7EC;&#xD55C; &#xACBD;&#xC6B0;&#xC5D0;, &#xCF54;&#xB4DC;&#xB294; &#xC694;&#xCCAD; &#xC2DC;&#xC5D0;&#xB9CC; &#xC2E4;&#xD589;&#xB418;&#xC5B4;&#xC57C; &#xD569;&#xB2C8;&#xB2E4;.</li></ol><hr><p>&#x2003;REST &#xC6D0;&#xCE59;&#xC744; &#xC798; &#xC9C0;&#xD0A4;&#xC9C0; &#xC54A;&#xB354;&#xB77C;&#xB3C4; HTTP &#xD1B5;&#xC2E0; &#xAE30;&#xBC18;&#xC73C;&#xB85C; &#xC791;&#xC131;&#xD55C; API&#xB294; REST API&#xB77C;&#xACE0; &#xBD80;&#xB974;&#xACE4; &#xD55C;&#xB2E4;. &#xD55C; &#xD3B8;&#xC73C;&#xB85C;, REST &#xC6D0;&#xCE59;&#xC744; &#xC900;&#xC218;&#xD574;&#xC11C; &#xC791;&#xC131;&#xD55C; API&#xB294; RESTful API&#xB77C;&#xACE0; &#xAD6C;&#xBD84;&#xD574;&#xC11C; &#xBD80;&#xB978;&#xB2E4;. </p><p>&#x2003;RESTful API&#xB294; &#xC27D;&#xACE0; &#xD504;&#xB860;&#xD2B8;&#xC5D4;&#xB4DC;&#xC640; &#xBC31;&#xC5D4;&#xB4DC;&#xB97C; &#xBD84;&#xB9AC;&#xD558;&#xAE30; &#xB54C;&#xBB38;&#xC5D0; &#xD3B8;&#xB9AC;&#xD558;&#xACE0; &#xC0C8; &#xAE30;&#xB2A5;&#xC744; &#xCD94;&#xAC00;&#xD560; &#xB54C;&#xC5D0;&#xB3C4; &#xD655;&#xC7A5;&#xD558;&#xAE30; &#xC27D;&#xB2E4;. &#xADF8;&#xB9AC;&#xACE0; URI &#xC989;, &#xB9AC;&#xC18C;&#xC2A4;&#xC5D0; &#xCD08;&#xC810;&#xC744; &#xB9DE;&#xCDB0;&#xC11C; &#xCC98;&#xB9AC;&#xD558;&#xAE30; &#xB54C;&#xBB38;&#xC5D0; &#xD2B9;&#xC815; &#xC5B8;&#xC5B4;&#xB098; &#xAE30;&#xAE30; &#xB4F1;&#xC758; &#xD658;&#xACBD; &#xBCC0;&#xD654;&#xC5D0; &#xACB0;&#xACFC;&#xAC00; &#xC601;&#xD5A5;&#xC744; &#xBC1B;&#xC9C0; &#xC54A;&#xB294; &#xB4F1; &#xC7A5;&#xC810;&#xC774; &#xB9CE;&#xB2E4;.</p><p>&#x2003;&#xADF8;&#xB7EC;&#xB098; CRUD&#xC5D0;&#xB9CC; &#xC9D1;&#xC911;&#xD558;&#xB294; &#xC810;, &#xBCF4;&#xC548;&#xC740; &#xACE0;&#xB824; &#xC54A;&#xB294; &#xC810;, &#xC790;&#xC720;&#xB3C4;&#xAC00; &#xB108;&#xBB34; &#xB192;&#xACE0;, &#xBD88;&#xD3B8;&#xD55C; &#xBB38;&#xC11C; &#xAD00;&#xB9AC;&#xB85C; &#xC778;&#xD55C; &#xBB38;&#xC11C; &#xC2E0;&#xB8B0; &#xD558;&#xB77D; &#xB4F1; &#xD55C;&#xACC4;&#xC810;&#xB3C4; &#xC5EC;&#xB7FF; &#xC788;&#xB2E4;. &#xADF8;&#xB807;&#xAE30;&#xC5D0; GraphQL &#xAC19;&#xC740; IDL &#xC989;, &#xC778;&#xD130;&#xD398;&#xC774;&#xC2A4; &#xC815;&#xC758; &#xC5B8;&#xC5B4;&#xB4E4;&#xB3C4; &#xAD00;&#xC2EC;&#xC744; &#xB9CE;&#xC774; &#xBC1B;&#xACE0; &#xC788;&#xB2E4;.</p><p>&#x2003;&#xC5B4;&#xB5A4; &#xAC1C;&#xBC1C;&#xC744; &#xD558;&#xB4E0; &#xC808;&#xB300;&#xC801; &#xC655;&#xB3C4;&#xB294; &#xC5C6;&#xB2E4;. &#xC0C1;&#xD669;&#xB9C8;&#xB2E4; &#xC801;&#xC6A9;&#xD560; &#xAE30;&#xC220;, &#xB514;&#xC790;&#xC778; &#xD328;&#xD134;, &#xAE30;&#xC220;&#xC740; &#xC81C;&#xAC01;&#xAC01;&#xC774;&#xBA70;, REST API&#xB294; &#xC5EC;&#xC804;&#xD788; &#xC911;&#xC694;&#xD55C; &#xAC1C;&#xB150; &#xC911; &#xD558;&#xB098;&#xB2E4;.</p><h2 id="5-http-%EC%83%81%ED%83%9C">5. HTTP &#xC0C1;&#xD0DC;</h2><p>&#x2003;HTTP &#xC694;&#xCCAD;&#xC744; &#xBCF4;&#xB0B4;&#xBA74; &#xC5EC;&#xB7EC; &#xC751;&#xB2F5;&#xC774; &#xBC1C;&#xC0DD;&#xD55C;&#xB2E4;. &#xC0C1;&#xD0DC;&#xB97C; &#xD45C;&#xD604;&#xD558;&#xB294; &#xCF54;&#xB4DC;&#xB3C4; &#xB9CE;&#xB2E4;.</p><hr><blockquote>200&#xBC88;&#xB300;: &#xC815;&#xC0C1; &#xCC98;&#xB9AC;</blockquote><ul><li>200 : &#xC815;&#xC0C1; &#xCC98;&#xB9AC;&#xB428;.</li><li>201 : &#xC815;&#xC0C1;&#xCC98;&#xB9AC;&#xAC00; &#xB410;&#xACE0;, &#xC11C;&#xBC84;&#xC5D0;&#xC11C; &#xB9AC;&#xC18C;&#xC2A4;&#xB97C; &#xB9CC;&#xB4E6;.</li><li>202 : &#xC694;&#xCCAD; &#xC811;&#xC218;&#xB294; &#xB410;&#xB294;&#xB370; &#xCC98;&#xB9AC;&#xB294; &#xC548; &#xB428;.</li><li>204 : &#xC694;&#xCCAD;&#xC740; &#xC815;&#xC0C1;&#xCC98;&#xB9AC;&#xB410;&#xB294;&#xB370; payload&#xAC00; &#xBE44;&#xC5B4;&#xC788;&#xC74C;.</li></ul><hr><blockquote>300&#xBC88;&#xB300;: &#xB9AC;&#xB514;&#xB809;&#xC158; &#xAD00;&#xB828;</blockquote><ul><li>300 : &#xC694;&#xCCAD;&#xC744; &#xC644;&#xB8CC;&#xD558;&#xB824;&#xBA74; &#xC6F9; &#xBE0C;&#xB77C;&#xC6B0;&#xC800;&#xC5D0;&#xC11C; &#xCD94;&#xAC00; &#xC870;&#xCE58;&#xAC00; &#xD544;&#xC694;.</li><li>301 : &#xC601;&#xAD6C;&#xC801;&#xC778; &#xB9AC;&#xB2E4;&#xC774;&#xB809;&#xD2B8;. &#xC11C;&#xBC84;&#xAC00; URI &#xC8FC;&#xC18C;&#xB97C; &#xBC14;&#xAFE8;&#xC744; &#xB54C; &#xB9AC;&#xB2E4;&#xC774;&#xB809;&#xD2B8;&#xC2DC;&#xD0B4;.(HTTP &#xBA54;&#xC18C;&#xB4DC;&#xB97C; GET&#xC73C;&#xB85C; &#xBC14;&#xAFB8;&#xB294; &#xD3B8;&#xC774;&#xACE0;, &#xB0B4;&#xAC00; &#xC791;&#xC131;&#xD55C; &#xAC83;&#xB4E4;&#xC774; &#xB0A0;&#xC544;&#xAC10;)</li><li>308 : 301&#xC774;&#xB791; &#xBE44;&#xC2B7;. <br>(HTTP &#xBA54;&#xC18C;&#xB4DC; &#xC720;&#xC9C0;, &#xB0B4;&#xAC00; &#xC791;&#xC131;&#xD55C; &#xAC83;&#xB4E4; &#xC720;&#xC9C0;. &#xD558;&#xC9C0;&#xB9CC; &#xC4F8; &#xC77C;&#xC740; &#xBCC4;&#xB85C; &#xC5C6;&#xC74C;)</li><li>302 : &#xC77C;&#xC2DC;&#xC801; &#xB9AC;&#xB2E4;&#xC774;&#xB809;&#xD2B8;. HTTP &#xBA54;&#xC18C;&#xB4DC;&#xAC00; GET&#xC73C;&#xB85C; &#xBCC0;&#xD560; &#xC218; &#xC788;&#xC74C;.</li><li>303 : &#xC77C;&#xC2DC;&#xC801; &#xB9AC;&#xB2E4;&#xC774;&#xB809;&#xD2B8;. HTTP &#xBA54;&#xC18C;&#xB4DC;&#xAC00; GET&#xC73C;&#xB85C; &#xBCC0;&#xD568;.</li><li>307 : &#xC77C;&#xC2DC;&#xC801; &#xB9AC;&#xB2E4;&#xC774;&#xB809;&#xD2B8;. HTTP &#xBA54;&#xC18C;&#xB4DC;&#xC5D0; &#xBCC0;&#xACBD; &#xC5C6;&#xC74C;.</li><li>304 : &#xCE90;&#xC2DC; &#xBAA9;&#xC801; &#xB9AC;&#xB2E4;&#xC774;&#xB809;&#xD2B8;.</li></ul><hr><blockquote>400&#xBC88;&#xB300;: &#xD074;&#xB77C;&#xC774;&#xC5B8;&#xD2B8; &#xC798;&#xBABB;</blockquote><ul><li>400 : &#xC694;&#xCCAD; &#xAD6C;&#xBB38;, &#xBA54;&#xC2DC;&#xC9C0; &#xB4F1;&#xC758; &#xC624;&#xB958;. (&#xD30C;&#xB77C;&#xBBF8;&#xD130;&#xAC00; &#xC798;&#xBABB;&#xB410;&#xAC70;&#xB098; API &#xC2A4;&#xD399;&#xC5D0; &#xC548; &#xB9DE;&#xC74C;. &#xC22B;&#xC790;&#xB97C; &#xBCF4;&#xB0B4;&#xC57C; &#xD558;&#xB294;&#xB370; &#xBB38;&#xC790;&#xB97C; &#xBCF4;&#xB0B4;&#xB294; &#xB4F1;)</li><li>401 : &#xC778;&#xC99D; &#xC5D0;&#xB7EC;. &#xC751;&#xB2F5;&#xC5D0; www-Authenticate &#xD5E4;&#xB354;&#xC640; &#xD568;&#xAED8; &#xC778;&#xC99D;&#xBC95;&#xC744; &#xC918;&#xC57C;&#xD568;.<br>&#xC778;&#xC99D;: Authentication. &#xBCF8;&#xC778; &#xD655;&#xC778;.<br>&#xC778;&#xAC00;: Authorization. &#xD574;&#xB2F9; &#xC720;&#xC800;&#xC758; &#xAD8C;&#xD55C; &#xD655;&#xC778;.</li><li>403 : &#xC694;&#xCCAD;&#xC740; &#xB9DE;&#xB294;&#xB370;, &#xAD8C;&#xD55C;&#xC774; &#xC548; &#xB9DE;&#xC74C;.<br>&#xC608;: &#xC77C;&#xBC18; &#xC0AC;&#xC6A9;&#xC790;&#xAC00; &#xAD00;&#xB9AC;&#xC790; &#xAD8C;&#xD55C;&#xC73C;&#xB85C; &#xC694;&#xCCAD;</li><li>404 : &#xD574;&#xB2F9; &#xB9AC;&#xC18C;&#xC2A4;&#xB97C; &#xBABB; &#xCC3E;&#xC74C;.<br>&#xC608;: &#xC5C6;&#xB294; &#xC8FC;&#xC18C;&#xB97C; &#xC785;&#xB825;&#xD568;. &#xD639;&#xC740; &#xD574;&#xB2F9; &#xB9AC;&#xC18C;&#xC2A4;&#xAC00; &#xC228;&#xACA8;&#xC9C4; &#xC0C1;&#xD0DC;.</li></ul><hr><blockquote>500&#xBC88;&#xB300;: &#xC11C;&#xBC84; &#xC798;&#xBABB;</blockquote><p>&#xC11C;&#xBC84; &#xC798;&#xBABB;&#xC774;&#xB77C;&#xC11C; &#xC694;&#xCCAD;&#xC744; &#xC7AC;&#xC2DC;&#xB3C4;&#xD558;&#xBA74; &#xC131;&#xACF5;&#xD560; &#xAC00;&#xB2A5;&#xC131;&#xC774; &#xC788;&#xB2E4;.</p><ul><li>500 : &#xC11C;&#xBC84; &#xB0B4;&#xBD80; &#xBB38;&#xC81C;. &#xC560;&#xB9E4;&#xD560; &#xB550; 500</li><li>503 : &#xC11C;&#xBC84;&#xC758; &#xC77C;&#xC2DC;&#xC801; &#xACFC;&#xBD80;&#xD558;, &#xD639;&#xC740; &#xC810;&#xAC80;&#xC6A9; &#xC11C;&#xBC84; &#xB2E4;&#xC6B4; &#xB4F1;.<br>(Retry-After&#xB85C; &#xC5B8;&#xC81C; &#xBCF5;&#xAD6C;&#xB420; &#xC9C0; &#xC791;&#xC131;&#xD560; &#xC218;&#xB3C4; &#xC788;&#xC74C;.)</li></ul><hr><h2 id="6-http-%ED%97%A4%EB%8D%94">6. HTTP &#xD5E4;&#xB354;</h2><p> &#x2003;HTTP &#xD5E4;&#xB354;&#xB294; &#xC694;&#xC57D;&#xBB38;&#xC774;&#xB2E4;</p><ul><li>Content-Type : payload&#xC758; &#xD0C0;&#xC785;.<br>text/html<br>charset=UTF-8<br>application/json<br>image/png....</li><li>Content-Language : &#xD45C;&#xAE30;&#xD560; &#xC5B8;&#xC5B4;.<br>ko(&#xD55C;&#xAD6D;&#xC5B4;)<br>en(&#xC601;&#xC5B4;)</li><li>referer : &#xB0B4;&#xAC00; &#xC5B4;&#xB5A4; URI&#xC5D0;&#xC11C; &#xB4E4;&#xC5B4;&#xC654;&#xB294;&#xC9C0; &#xD45C;&#xC2DC;(&#xB4A4;&#xB85C; &#xAC00;&#xAE30; &#xB204;&#xB974;&#xBA74; &#xBCF4;&#xC774;&#xB294; &#xC0AC;&#xC774;&#xD2B8;)</li><li>user-agent : &#xD074;&#xB77C;&#xC774;&#xC5B8;&#xD2B8;&#xC758; &#xC571; &#xC815;&#xBCF4;(&#xBE0C;&#xB77C;&#xC6B0;&#xC800; &#xB4F1;)</li><li>server : origin &#xC11C;&#xBC84;&#xC758; &#xC815;&#xBCF4;<br>origin &#xC11C;&#xBC84;&#xB780; &#xCD5C;&#xC885;&#xC801;&#xC73C;&#xB85C; &#xC751;&#xB2F5;&#xC744; &#xC8FC;&#xB294; &#xC9C4;&#xC9DC; &#xC11C;&#xBC84;&#xB97C; &#xB9D0;&#xD55C;&#xB2E4;. <br>HTTP&#xB85C; &#xC694;&#xCCAD;&#xACFC; &#xC751;&#xB2F5;&#xC744; &#xC8FC;&#xACE0;&#xBC1B;&#xC744; &#xB54C;&#xC5D4; &#xC911;&#xAC04;&#xC5D0; &#xC5EC;&#xB7EC; &#xC11C;&#xBC84;&#xB97C; &#xACBD;&#xC720;&#xD55C;&#xB2E4;.</li><li>location : &#xB9AC;&#xB2E4;&#xC774;&#xB809;&#xD2B8; &#xC8FC;&#xC18C;</li><li>HTTP &#xB124;&#xACE0;: Accept~: ~~ &#xC694;&#xCCAD;&#xC744; &#xBCF4;&#xB0B4;&#xBA74; &#xC11C;&#xBC84;&#xB294; &#xADF8; &#xC694;&#xCCAD;&#xC5D0; &#xCD5C;&#xB300;&#xD55C; &#xC751;&#xD55C;&#xB2E4;.<br>&#xC608;: Accept-Language: ko-KR, ko;q=0.9, en-US,en;q=0.7, ja;q=0.6<br>&#xD55C;&#xAD6D;&#xC5B4;&#xB85C; &#xC0AC;&#xC774;&#xD2B8;&#xB97C; &#xD45C;&#xAE30;&#xD574;&#xB2EC;&#xB77C;&#xB294; &#xC694;&#xCCAD;. &#xC548; &#xB418;&#xBA74; &#xC601;&#xC5B4;, &#xC77C;&#xBCF8;&#xC5B4;&#xB85C; &#xD45C;&#xAE30;&#xD574;&#xB2EC;&#xB77C;&#xB294; &#xAC83;.</li><li>&#xCFE0;&#xD0A4;: &#xB530;&#xB85C; &#xC11C;&#xC220;</li><li>&#xCE90;&#xC2DC;: &#xB530;&#xB85C; &#xC11C;&#xC220;</li></ul><h3 id="6-1-%EC%BF%A0%ED%82%A4">6-1. &#xCFE0;&#xD0A4;</h3><p>&#x2003;HTTP&#xB294; &#xBB34;&#xC0C1;&#xD0DC;(Stateless) &#xD504;&#xB85C;&#xD1A0;&#xCF5C;. &#xC694;&#xCCAD;, &#xC751;&#xB2F5;&#xB9CC; &#xD558;&#xBA74; &#xB428;. <br>&#xC790;&#xCCB4;&#xC801;&#xC73C;&#xB85C; &#xC815;&#xBCF4; &#xAE30;&#xC5B5;&#xD558;&#xC9C4; &#xBABB;&#xD574;&#xC11C; &#xCFE0;&#xD0A4; &#xD65C;&#xC6A9;</p><pre><code class="language-js">Set-Cookie: sessionID=abc123; Expires=Thu, 30 Jun 2023 12:00:00 GMT; Path=/; Domain=.example.com; Secure
Set-Cookie: userID=12345; Expires=Thu, 30 Jun 2023 12:00:00 GMT; Path=/; Domain=.example.com; Secure
Set-Cookie: theme=dark; Expires=Thu, 30 Jun 2023 12:00:00 GMT; Path=/; Domain=.example.com; Secure
Set-Cookie: language=en; Expires=Thu, 30 Jun 2023 12:00:00 GMT; Path=/; Domain=.example.com; Secure</code></pre><ul><li>&#xCFE0;&#xD0A4;&#xB294; &#xC11C;&#xBC84;&#xAC00; &#xBC1C;&#xAE09;. </li><li>&#xD074;&#xB77C;&#xC774;&#xC5B8;&#xD2B8;&#xB294; &#xCFE0;&#xD0A4; &#xC800;&#xC7A5;&#xD558;&#xACE0; &#xC694;&#xCCAD;&#xB9C8;&#xB2E4; &#xC804;&#xC1A1;</li><li>&#xCFE0;&#xD0A4;&#xC5D0; &#xC138;&#xC158;ID &#xB4F1;&#xC774; &#xC801;&#xD600;&#xC788;&#xC74C;</li><li>&#xC0AC;&#xC6A9;&#xC790;&#xB294; &#xCFE0;&#xD0A4; &#xC8FC;&#xACE0;, &#xC11C;&#xBC84;&#xB294; &#xCFE0;&#xD0A4;&#xB85C; &#xC0AC;&#xC6A9;&#xC790; &#xC2DD;&#xBCC4;</li></ul><p>&#xB300;&#xCDA9; &#xCFE0;&#xD0A4; &#xD50C;&#xB85C;&#xC6B0; &#xC694;&#xC57D;<br>1. &#xC544;&#xC774;&#xB514;, &#xBE44;&#xBC88;&#xC73C;&#xB85C; &#xC811;&#xC18D;<br>2. &#xC11C;&#xBC84;&#xAC00; ID &#xB2F4;&#xC740; &#xCFE0;&#xD0A4; &#xC0DD;&#xC131;, &#xBC1C;&#xAE09;<br>3. &#xC694;&#xCCAD;&#xB9C8;&#xB2E4; &#xCFE0;&#xD0A4; &#xC804;&#xC1A1;<br>4. &#xC11C;&#xBC84;&#xB294; &#xCFE0;&#xD0A4;&#xC758; ID &#xC815;&#xBCF4;&#xB85C; &#xC720;&#xC800; &#xC2DD;&#xBCC4;, &#xB85C;&#xADF8;&#xC778; &#xC720;&#xC9C0;, &#xC815;&#xBCF4; &#xC800;&#xC7A5;<br>&#xADF8; &#xC678;) &#xC138;&#xC158;ID&#xB294; &#xC138;&#xC158; &#xC885;&#xB8CC;&#xD558;&#xBA74; &#xC18C;&#xBA78;, &#xC77C;&#xBC18; &#xCFE0;&#xD0A4;&#xB294; &#xC800;&#xC7A5;&#xB418;&#xAE30;&#xC5D0; &#xC790;&#xB3D9; &#xB85C;&#xADF8;&#xC778; &#xAC00;&#xB2A5;</p><ul><li>&#xC61B;&#xB0A0;&#xC5D4; &#xCFE0;&#xD0A4;&#xC5D0; &#xC544;&#xC774;&#xB514;&#xB791; &#xBE44;&#xBC88; &#xC815;&#xBCF4;&#xAC00; &#xC788;&#xC5C8;&#xC74C;<br>+ &#xADFC;&#xB370; &#xCFE0;&#xD0A4; &#xD6D4;&#xCCD0;&#xBCF4;&#xB294; &#xAC70; &#xB108;&#xBB34; &#xC26C;&#xC6C0;<br>-&gt; &#xD574;&#xD0B9; &#xB108;&#xBB34; &#xC26C;&#xC6C0;<br>-&gt; &#xCFE0;&#xD0A4;&#xC5D0; &#xC544;&#xB514;, &#xBE44;&#xBC88; &#xB300;&#xC2E0; &#xC138;&#xC158; ID&#xB9CC; &#xB2F4;&#xAE30;&#xB85C; &#xBCC0;&#xACBD;<br>-&gt; &#xC138;&#xC158; &#xD558;&#xC774;&#xC7AC;&#xD0B9;(&#xB85C;&#xADF8;&#xC778;&#xB41C; &#xC0C1;&#xD0DC; &#xD6D4;&#xCE58;&#xAE30;) &#xC720;&#xD589;<br>-&gt; &#xBCF4;&#xC548; &#xB300;&#xC751;&#xC740; &#xD544;&#xC218;</li></ul><p>&#xCFE0;&#xD0A4; &#xC635;&#xC158; &#xC694;&#xC57D;: &#xB3C4;&#xBA54;&#xC778;, &#xACBD;&#xB85C;, &#xAE30;&#xD55C;, &#xBCF4;&#xC548;</p><ul><li>Domain : &#xC9C0;&#xC815; &#xB3C4;&#xBA54;&#xC778;&#xC758; &#xC11C;&#xBE0C; &#xB3C4;&#xBA54;&#xC778;&#xC5D0;&#xC11C;&#xB3C4; &#xCFE0;&#xD0A4; &#xC0AC;&#xC6A9; &#xAC00;&#xB2A5;<br>&#xC548; &#xD558;&#xBA74; &#xC624;&#xB85C;&#xC9C0; &#xC815;&#xD655;&#xD55C; &#xB3C4;&#xBA54;&#xC778;&#xC5D0;&#xC11C;&#xB9CC; &#xCFE0;&#xD0A4; &#xC0AC;&#xC6A9; &#xAC00;&#xB2A5;</li><li>Path : &#xC9C0;&#xC815; &#xACBD;&#xB85C;&#xC758; &#xD558;&#xC704; &#xACBD;&#xB85C;&#xC5D0;&#xC11C;&#xB3C4; &#xCFE0;&#xD0A4; &#xC0AC;&#xC6A9; &#xAC00;&#xB2A5;</li><li>expires : xxxx&#xB144; xx&#xC6D4; xx&#xC77C; xx&#xC2DC; xx&#xBD84; xx&#xCD08;&#xAE4C;&#xC9C0; &#xC720;&#xD6A8;</li><li>Max-Age : &#xBC1C;&#xAE09;&#xC77C;&#xB85C;&#xBD80;&#xD130; xx&#xCD08; &#xB3D9;&#xC548; &#xC720;&#xD6A8;</li><li>secure : https&#xB9CC; &#xCFE0;&#xD0A4; &#xC804;&#xC1A1;</li><li>HttpOnly : <a href="https://owasp.org/www-community/HttpOnly?ref=blog.cinntiq.synology.me#:~:text=If%20a%20browser%20that%20supports,data%20to%20an%20attacker&apos;s%20website.">XSS &#xACF5;&#xACA9; &#xBC29;&#xC9C0;</a>. JS&#xB85C; &#xCFE0;&#xD0A4; &#xC811;&#xADFC; &#xBD88;&#xAC00;&#xB2A5;</li><li>SameSite : <a href="https://portswigger.net/web-security/csrf/samesite-cookies?ref=blog.cinntiq.synology.me">XSRF &#xACF5;&#xACA9; &#xBC29;&#xC9C0;</a>. &#xC694;&#xCCAD; &#xB3C4;&#xBA54;&#xC778; = &#xCFE0;&#xD0A4; &#xB3C4;&#xBA54;&#xC778;&#xC77C; &#xB54C;&#xB9CC; &#xCFE0;&#xD0A4; &#xC804;&#xC1A1;</li></ul><h3 id="6-2-%EC%BA%90%EC%8B%9C">6-2. &#xCE90;&#xC2DC;</h3><p>&#x2003;3mb &#xC774;&#xBBF8;&#xC9C0;&#xB97C; &#xC694;&#xCCAD;&#xD558;&#xACE0;, 10&#xCD08;&#xB9C8;&#xB2E4; &#xAC19;&#xC740; &#xC774;&#xBBF8;&#xC9C0;&#xB97C; &#xC7AC;&#xC694;&#xCCAD;&#xD558;&#xBA74; &#xC5B4;&#xB5BB;&#xAC8C; &#xB420;&#xAE4C;?<br>&#xC6D0;&#xB798;&#xB294; &#xB9E4;&#xBC88; &#xB2E4;&#xC6B4;&#xB85C;&#xB4DC;. <br>&#xCE90;&#xC2DC; &#xC4F0;&#xBA74;? &#xC800;&#xC7A5;&#xD588;&#xB2E4;&#xAC00; &#xC7AC;&#xC0AC;&#xC6A9;.</p><p>&#xC7A5;&#xC810;</p><ul><li>&#xC131;&#xB2A5;: &#xC7AC;&#xC694;&#xCCAD; &#xB54C; &#xC2DC;&#xAC04;, &#xC790;&#xC6D0; &#xC808;&#xC57D;(&#xAC00;&#xC7A5; &#xC911;&#xC694;)</li><li>&#xC624;&#xD504;&#xB77C;&#xC778; &#xC791;&#xC5C5; : &#xC778;&#xD130;&#xB137; &#xB04A;&#xACA8;&#xB3C4; &#xCE90;&#xC2DC;&#xB294; &#xBCFC; &#xC218; &#xC788;&#xC74C;</li><li>&#xBB3C;&#xB9AC;&#xC801; &#xD6A8;&#xC728; : &#xBC30;&#xD130;&#xB9AC; &#xC808;&#xC57D; &#xB4F1;</li></ul><p>&#xB2E8;&#xC810;</p><ul><li>&#xC131;&#xB2A5;: &#xB9CE;&#xC774; &#xC313;&#xC774;&#xBA74; &#xC6A9;&#xB7C9; &#xBD80;&#xB2F4;</li><li>&#xC190;&#xC0C1;&#xB41C; &#xCE90;&#xC2DC; : &#xCE90;&#xC2DC;&#xC5D0; &#xC190;&#xC0C1; &#xC0DD;&#xAE30;&#xBA74; &#xC5D0;&#xB7EC;</li><li>&#xC624;&#xB798;&#xB41C; &#xCE90;&#xC2DC; : &#xCD5C;&#xC2E0; &#xBC84;&#xC804; &#xB098;&#xC640;&#xB3C4; &#xCE90;&#xC2DC; &#xB54C;&#xBB38;&#xC5D0; &#xAD6C;&#xBC84;&#xC804; &#xBCFC; &#xC218; &#xC788;&#xC74C;</li></ul><blockquote>&#xCE90;&#xC2DC; &#xAE30;&#xD55C; &#xB05D;&#xB098;&#xBA74;?</blockquote><ol><li>last-modified<br>&#xCD5C;&#xADFC; &#xC5C5;&#xB370;&#xC774;&#xD2B8; &#xC77C;&#xC790;&#xB85C; &#xD310;&#xB2E8;<br>&#xC5C5;&#xB370;&#xC774;&#xD2B8;&#xAC00; &#xC5C6;&#xC5C8;&#xC73C;&#xBA74; &#xC11C;&#xBC84;&#xB294; &#xCE90;&#xC2DC; &#xC7AC;&#xC0AC;&#xC6A9;&#xD558;&#xB77C;&#xACE0; 304 &#xC751;&#xB2F5;(&#xBE48; body)<br>&#xC694;&#xCCAD;&#xD558;&#xB824;&#xBA74; if-modified-since: &#xB97C; &#xC0AC;&#xC6A9;&#xD55C;&#xB2E4;<br>&#xD55C;&#xACC4;: &#xAC00;&#xBCCD;&#xAC8C; &#xC5C5;&#xB370;&#xC774;&#xD2B8;&#xD574;&#xB3C4; &#xC7AC;&#xB2E4;&#xC6B4;&#xB85C;&#xB4DC;&#xD574;&#xC57C; &#xD568;</li><li>ETag(Entity Tag)<br>&#xCE90;&#xC2DC;&#xC5D0; &#xBD99;&#xC778; etag&#xB9CC; &#xBE44;&#xAD50;&#xD574;&#xBCF4;&#xACE0; &#xD310;&#xB2E8;<br>&#xC694;&#xCCAD;&#xD560; &#xB550; if-none-match &#xC0AC;&#xC6A9;</li></ol><p>&#xCE90;&#xC2DC; &#xC4F0;&#xAE30; &#xC2EB;&#xC73C;&#xBA74;?<br>&#x2003;&#xC548; &#xC4F0;&#xACA0;&#xB2E4;&#xACE0; &#xBA85;&#xC2DC;. &#xC548; &#xADF8;&#xB7EC;&#xBA74; &#xBE0C;&#xB77C;&#xC6B0;&#xC800;&#xAC00; &#xC790;&#xB3D9;&#xC73C;&#xB85C; &#xCE90;&#xC2DC;&#xD568;.</p><ul><li>no-cache : &#xB9E4; &#xC694;&#xCCAD;&#xB9C8;&#xB2E4; &#xCE90;&#xC2DC; &#xAC80;&#xC99D;&#xBC1B;&#xACE0; &#xAC31;&#xC2E0; or &#xC77C;&#xD68C;&#xC131; &#xC7AC;&#xC0AC;&#xC6A9;</li><li>no-store : &#xCE90;&#xC2DC; &#xC790;&#xCCB4;&#xB97C; &#xAE08;&#xC9C0;</li><li>must-revalidate : &#xAE30;&#xD55C; &#xB05D;&#xB0AC;&#xC73C;&#xBA74; &#xAC80;&#xC99D;<br>&#xC811;&#xADFC; &#xC2E4;&#xD328; &#xC2DC; &#xBC18;&#xB4DC;&#xC2DC; &#xC624;&#xB958; &#xBC1C;&#xC0DD;&#xC2DC;&#xCF1C;&#xC57C; &#xD568;</li><li>no-cache &amp; must-revalidate: &#xD504;&#xB85D;&#xC2DC;&#xC5D0;&#xC11C; &#xAC80;&#xC99D;</li><li>&#xC11C;&#xBC84; &#xC5F0;&#xACB0;&#xC774; &#xACE0;&#xC7A5;&#xB098;&#xBA74;?<br>no-cache: &#xC61B;&#xB0A0; &#xCE90;&#xC2DC; &#xBC18;&#xD658;. (2&#xC6D4; 25&#xC77C; &#xC694;&#xCCAD;&#xC778;&#xB370; 1&#xC6D4; 11&#xC77C; &#xACB0;&#xACFC;&#xB85C; &#xC751;&#xB2F5;)<br>must-revalidate: 504 &#xC5D0;&#xB7EC;</li></ul><p>&#xC6F9; &#xCE90;&#xC2DC;(&#xD504;&#xB85D;&#xC2DC; &#xC11C;&#xBC84;)?<br>&#x2003;&#xC678;&#xAD6D; &#xC11C;&#xBE44;&#xC2A4; &#xBE60;&#xB974;&#xAC8C; &#xC774;&#xC6A9; &#xAC00;&#xB2A5;&#xD55C; &#xC774;&#xC720;: <br>&#x2003;&#xAC01;&#xC9C0;&#xC5D0; &#xD504;&#xB85D;&#xC2DC;&#xAC00; &#xC694;&#xCCAD;&#xC744; &#xCE90;&#xCE58;&#xD558;&#xACE0; &#xC0AC;&#xC6A9;&#xC790;&#xB4E4;&#xD55C;&#xD14C; &#xCE90;&#xC2DC;&#xB97C; &#xC90C;.</p><p>&#xB9AC;&#xBC84;&#xC2A4; &#xD504;&#xB85D;&#xC2DC;?<br>&#x2003;&#xD504;&#xB85D;&#xC2DC;: &#xD074;&#xB77C;&#xC774;&#xC5B8;&#xD2B8; &#xB300;&#xC2E0; &#xC694;&#xCCAD;, &#xD074;&#xB77C;&#xC774;&#xC5B8;&#xD2B8;&#xB97C; &#xC775;&#xBA85;&#xD654;.<br>&#x2003;&#xB9AC;&#xBC84;&#xC2A4; &#xD504;&#xB85D;&#xC2DC;: &#xC11C;&#xBC84; &#xB300;&#xC2E0; &#xC218;&#xC2E0;, &#xC624;&#xB9AC;&#xC9C4; &#xC11C;&#xBC84;&#xB97C; &#xC775;&#xBA85;&#xD654;, &#xB85C;&#xB4DC; &#xBC38;&#xB7F0;&#xC2F1;(&#xD2B8;&#xB798;&#xD53D; &#xACE0;&#xB8E8; &#xBD84;&#xC0B0;), &#xC2E4;&#xD5D8; &#xAE30;&#xB2A5; &#xD14C;&#xC2A4;&#xD2B8; &#xB4F1;&#xB4F1;</p><p>CDN(Content Delivery Network)?<br>&#x2003;&#xD504;&#xB85D;&#xC2DC;&#xB85C; &#xC0AC;&#xC6A9;&#xC790;&#xB4E4;&#xC5D0;&#xAC8C; &#xCEE8;&#xD150;&#xCE20;&#xB97C; &#xBE60;&#xB974;&#xAC8C; &#xC81C;&#xACF5;&#xD558;&#xB294; &#xC11C;&#xBE44;&#xC2A4;</p><h2 id="7-%EB%A7%88%EB%AC%B4%EB%A6%AC">7. &#xB9C8;&#xBB34;&#xB9AC;</h2><p>&#x2003;HTTP &#xD1B5;&#xC2E0;&#xC5D0; &#xB300;&#xD574; &#xAC00;&#xBCCD;&#xAC8C; &#xC54C;&#xC544;&#xBD24;&#xB2E4;.</p><h2 id="8-%EC%B0%B8%EC%A1%B0">8. &#xCC38;&#xC870;</h2><ul><li><a href="https://ko.wikipedia.org/wiki/HTTP?ref=blog.cinntiq.synology.me">HTTP &#xC704;&#xD0A4;&#xD53C;&#xB514;&#xC544; &#xBB38;&#xC11C;</a></li><li><a href="https://developer.mozilla.org/en-US/docs/Glossary/Representation_header?ref=blog.cinntiq.synology.me">MDN representation &#xD5E4;&#xB354;</a></li><li><a href="https://developer.mozilla.org/en-US/docs/Glossary/HTTP_header?ref=blog.cinntiq.synology.me">MDN HTTP &#xD5E4;&#xB354;</a></li><li><a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers?ref=blog.cinntiq.synology.me">MDN HTTP &#xD5E4;&#xB354;&#xC5D0; &#xB4E4;&#xC5B4;&#xAC00;&#xB294; &#xAC83;&#xB4E4;</a></li><li><a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Content_negotiation?ref=blog.cinntiq.synology.me">MDN &#xCEE8;&#xD150;&#xCE20; &#xB124;&#xACE0;</a></li><li><a href="https://blog.detectify.com/2020/07/28/do-you-trust-your-cache-web-cache-poisoning-explained/?ref=blog.cinntiq.synology.me">&#xC6F9; &#xCE90;&#xC2DC;&#xC5D0; &#xAD00;&#xD55C; &#xC774;&#xC57C;&#xAE30;</a></li><li><a href="https://owasp.org/www-community/HttpOnly?ref=blog.cinntiq.synology.me#:~:text=If%20a%20browser%20that%20supports,data%20to%20an%20attackers%20website.">XSS &#xACF5;&#xACA9;&#xACFC; HttpOnly</a></li><li><a href="https://portswigger.net/web-security/csrf/samesite-cookies?ref=blog.cinntiq.synology.me">XSRF &#xACF5;&#xACA9;&#xACFC; SameSite</a></li><li><a href="https://www.youtube.com/watch?v=NxFJ-mJdVNQ&amp;ref=blog.cinntiq.synology.me">10&#xBD84; &#xD14C;&#xCF54;&#xD1A1; - cache</a></li><li><a href="https://www.techtarget.com/searchstorage/definition/cache?ref=blog.cinntiq.synology.me">&#xCE90;&#xC2DC;</a></li><li><a href="https://carnival.tistory.com/58?ref=blog.cinntiq.synology.me">OSI 7&#xACC4;&#xCE35;&#xACFC; TCP/IP 4&#xACC4;&#xCE35;</a></li><li><a href="https://www.ibm.com/kr-ko/cloud/learn/rest-apis?ref=blog.cinntiq.synology.me">REST API&#xB780;?</a></li><li><a href="https://velog.io/@somday/RESTful-API-%EC%9D%B4%EB%9E%80?ref=blog.cinntiq.synology.me">RESTful API &#xC774;&#xB780;</a></li><li><a href="https://www.youtube.com/watch?v=6C9zyLioTOU&amp;ref=blog.cinntiq.synology.me">[B4] &#xD504;&#xB7F0;&#xD2B8;&#xC5D4;&#xB4DC;&#xB97C; &#xC704;&#xD55C; API &#xD504;&#xB85C;&#xD1A0;&#xCF5C;, REST&#xB9CC;&#xC774; &#xB2F5;&#xC740; &#xC544;&#xB2C8;&#xB2E4;. (with. gRPC, GraphQL)</a></li></ul>]]></content:encoded></item><item><title><![CDATA[JS와 프로미스]]></title><description><![CDATA[비동기의 꽃. Promise와 async / await]]></description><link>https://blog.cinntiq.synology.me/promise/</link><guid isPermaLink="false">63e226a4ccd3f70001bd1bb1</guid><category><![CDATA[JavaScript]]></category><dc:creator><![CDATA[Hameln]]></dc:creator><pubDate>Tue, 07 Feb 2023 14:28:20 GMT</pubDate><media:content url="https://blog.cinntiq.synology.me/content/images/2024/01/javascript-4.png" medium="image"/><content:encoded><![CDATA[<blockquote>&#xC61B;&#xB0A0;&#xC5D0;&#xB294; &#xBE44;&#xB3D9;&#xAE30; &#xC791;&#xC5C5;&#xC744; &#xCF5C;&#xBC31; &#xD568;&#xC218;&#xB85C; &#xCC98;&#xB9AC;&#xD588;&#xC2B5;&#xB2C8;&#xB2E4;.</blockquote><pre><code class="language-text">A&#xB77C;&#xB294; &#xCC98;&#xB9AC; &#xACB0;&#xACFC;&#xC5D0; &#xB300;&#xD55C;...
    B&#xB77C;&#xB294; &#xCC98;&#xB9AC; &#xACB0;&#xACFC;&#xC5D0; &#xB300;&#xD55C;...
        C&#xB77C;&#xB294; &#xCC98;&#xB9AC; &#xACB0;&#xACFC;&#xC5D0; &#xB300;&#xD55C;...
            D&#xB77C;&#xB294; &#xCC98;&#xB9AC; &#xACB0;&#xACFC;&#xC5D0; &#xB300;&#xD574;
        &#xCF54;&#xB4DC;&#xB97C; &#xC791;&#xC131;&#xD558;&#xBA74;...
    &#xCF5C;&#xBC31; &#xC9C0;&#xC625;&#xC774;...
&#xD0C4;&#xC0DD;&#xD55C;&#xB2E4;...</code></pre><pre><code class="language-js">doSomething(function(result) {
  doSomethingElse(result, function(newResult) {
    doThirdThing(newResult, function(finalResult) {
      console.log(&apos;Got the final result: &apos; + finalResult);
	// &#xC5D0;&#xB7EC;&#xC6A9; failureCallback &#xCF5C;&#xBC31; &#xD568;&#xC218;&#xB97C; &#xC5EC;&#xB7EC; &#xCC28;&#xB840; &#xBD99;&#xC774;&#xB294; &#xBAA8;&#xC2B5;.
    }, failureCallback);
  }, failureCallback);
}, failureCallback);</code></pre><img src="https://blog.cinntiq.synology.me/content/images/2024/01/javascript-4.png" alt="JS&#xC640; &#xD504;&#xB85C;&#xBBF8;&#xC2A4;"><p>&#xCF5C;&#xBC31; &#xC9C0;&#xC625;&#xC758; &#xBB38;&#xC81C;&#xC810;.</p><ul><li>&#xAC00;&#xB3C5;&#xC131; bad</li><li>&#xC2E4;&#xD589; &#xC21C;&#xC11C; &#xBCF4;&#xC7A5; X<br>&#xC790;&#xC6D0;&#xC744; &#xBC1B;&#xC544;&#xC624;&#xB294; &#xC2DC;&#xAC04;&#xC774; 3&#xCD08;, &#xC790;&#xC6D0;&#xC744; &#xD65C;&#xC6A9;&#xD558;&#xB294; &#xCF5C;&#xBC31; &#xD568;&#xC218;&#xB97C; &#xC2E4;&#xD589;&#xD558;&#xB294; &#xCF54;&#xB4DC;&#xAE4C;&#xC9C0; &#xB3C4;&#xB2EC;&#xD558;&#xB294;&#xB370; 1&#xCD08; &#xAC78;&#xB9B0;&#xB2E4;&#xACE0; &#xD558;&#xBA74;?</li><li>&#xC885;&#xC18D;&#xC131;<br>&#xCF5C;&#xBC31; &#xD568;&#xC218;&#xB4E4;&#xC774; &#xC5BD;&#xD788;&#xACE0;&#xC124;&#xD0A4;&#xBA74; &#xD558;&#xB098; &#xACE0;&#xCE60; &#xB54C; &#xC5EC;&#xB7FF; &#xACE0;&#xCE5C;&#xB2E4;.</li><li>&#xC5D0;&#xB7EC; &#xCC98;&#xB9AC; &#xB09C;&#xD574;<br>&#xC5D0;&#xB7EC; &#xCC98;&#xB9AC;&#xB97C; &#xAF2C;&#xBC15;&#xAF2C;&#xBC15; &#xBD99;&#xC5EC;&#xC57C; &#xD55C;&#xB2E4;.</li></ul><p>&#x2003;&#xADF8;&#xB7EC;&#xBA74; &#xBAA8;&#xB450;&#xAC00; &#xC800;&#xB807;&#xAC8C; &#xAD34;&#xB85C;&#xC6B4; &#xCF54;&#xB4DC;&#xB97C; &#xC37C;&#xC744;&#xAE4C;&#xC694;? &#xC77C;&#xB2E8;, &#xC5EC;&#xB7EC; &#xB178;&#xB825;&#xC774; &#xC788;&#xC5C8;&#xC2B5;&#xB2C8;&#xB2E4;.</p><figure class="kg-card kg-code-card"><pre><code class="language-js">document.querySelector(&apos;form&apos;).onsubmit = formSubmit

function formSubmit (submitEvent) {
  var name = document.querySelector(&apos;input&apos;).value
  request({
    uri: &quot;http://example.com/upload&quot;,
    body: name,
    method: &quot;POST&quot;
  }, postResponse)
}

function postResponse (err, response, body) {
  var statusMessage = document.querySelector(&apos;.status&apos;)
  if (err) return statusMessage.value = err
  statusMessage.value = body
}</code></pre><figcaption>&#xC798;&#xAC8C; &#xB098;&#xB204;&#xAE30;&#xB3C4; &#xD558;&#xACE0;</figcaption></figure><figure class="kg-card kg-code-card"><pre><code class="language-js">module.exports.submit = formSubmit

function formSubmit (submitEvent) {
  var name = document.querySelector(&apos;input&apos;).value
  request({
    uri: &quot;http://example.com/upload&quot;,
    body: name,
    method: &quot;POST&quot;
  }, postResponse)
}

function postResponse (err, response, body) {
  var statusMessage = document.querySelector(&apos;.status&apos;)
  if (err) return statusMessage.value = err
  statusMessage.value = body
}</code></pre><figcaption>&#xBAA8;&#xB4C8;&#xD654; &#xCC98;&#xB9AC;&#xB3C4; &#xD574;&#xBCF4;&#xACE0;</figcaption></figure><figure class="kg-card kg-code-card"><pre><code class="language-js"> var fs = require(&apos;fs&apos;)

 fs.readFile(&apos;/Does/not/exist&apos;, handleFile)

 function handleFile (error, file) {
   if (error) return console.error(&apos;Uhoh, there was an error&apos;, error)
   // otherwise, continue on and use `file` in your code
 }</code></pre><figcaption>&#xCF5C;&#xBC31;&#xB9C8;&#xB2E4; &#xB2E8;&#xC77C; &#xCC98;&#xB9AC;&#xB97C; &#xBD99;&#xC5EC;&#xBCF4;&#xAE30;&#xB3C4; &#xD588;&#xB2E4;.</figcaption></figure><p>&#x2003;&#xADF8;&#xB7EC;&#xB098; &#xC774; &#xB178;&#xB825;&#xB4E4;&#xB3C4; &#xADFC;&#xBCF8;&#xC801;&#xC778; &#xD574;&#xACB0;&#xCC45;&#xC740; &#xC544;&#xB2D9;&#xB2C8;&#xB2E4;. &#xCF54;&#xB4DC;&#xB7C9;&#xC740; &#xB9CE;&#xC544;&#xC9C0;&#xACE0; &#xC2E0;&#xACBD; &#xC368;&#xC57C;&#xD560; &#xBD80;&#xBD84;&#xC740; &#xB9CE;&#xC558;&#xC2B5;&#xB2C8;&#xB2E4;. &#xADF8;&#xB798;&#xC11C; &#xB098;&#xC628; &#xD574;&#xACB0;&#xCC45;&#xC774; &#xD504;&#xB85C;&#xBBF8;&#xC2A4;&#xC785;&#xB2C8;&#xB2E4;.</p><h2 id="promise">Promise</h2><blockquote><em>&#x2003;&#xD504;&#xB85C;&#xBBF8;&#xC2A4;&#xB294; &#xC120;&#xC5B8; &#xB2F9;&#xC2DC; &#xD655;&#xC815; &#xBABB;&#xD55C; &#xAC12;&#xC5D0; &#xB300;&#xD55C; &#xC911;&#xAC1C;&#xC778;&#xC73C;&#xB85C;&#xC11C; &#xC131;&#xACF5;, &#xC2E4;&#xD328;&#xC5D0; &#xB300;&#xD55C; &#xCC98;&#xB9AC;&#xB97C; &#xD569;&#xB2C8;&#xB2E4;. &#xC77C;&#xBC18; &#xD568;&#xC218;&#xCC98;&#xB7FC; &#xCD5C;&#xC885;&#xAC12;&#xC744; &#xC989;&#xC2DC; &#xBC18;&#xD658;&#xD558;&#xC9C0; &#xC54A;&#xACE0; &#xB098;&#xC911;&#xC5D0; &#xC8FC;&#xACA0;&#xB2E4;&#xB294; &#xC57D;&#xC18D;&#xC744; &#xBC18;&#xD658;&#xD569;&#xB2C8;&#xB2E4;.</em></blockquote><p>&#xC704; &#xCF5C;&#xBC31; &#xC9C0;&#xC625; &#xCF54;&#xB4DC;&#xB97C; &#xD504;&#xB85C;&#xBBF8;&#xC2A4;&#xB85C; &#xBC14;&#xAFD4;&#xBCF4;&#xACA0;&#xC2B5;&#xB2C8;&#xB2E4;.</p><figure class="kg-card kg-code-card"><pre><code class="language-js">// before
doSomething(function(result) {
  doSomethingElse(result, function(newResult) {
    doThirdThing(newResult, function(finalResult) {
      console.log(&apos;Got the final result: &apos; + finalResult);
    }, failureCallback);
  }, failureCallback);
}, failureCallback);

// after
doSomething()
.then(result =&gt; doSomethingElse(result))
.then(newResult =&gt; doThirdThing(newResult))
.then(finalResult =&gt; {
  console.log(`Got the final result: ${finalResult}`);
})
.catch(failureCallback);</code></pre><figcaption>&#xD6E8;&#xC52C; &#xB098;&#xC544;&#xC84C;&#xB2E4;.</figcaption></figure><ul><li>then&#xC758; &#xCF5C;&#xBC31; &#xD568;&#xC218;&#xB294; &#xC774;&#xBCA4;&#xD2B8; &#xB8E8;&#xD504;&#xAC00; &#xCF5C; &#xC2A4;&#xD0DD; &#xC791;&#xC5C5;&#xC744; &#xB9C8;&#xCE58;&#xAE30; &#xC804;&#xAE4C;&#xC9C0;&#xB294; &#xC808;&#xB300; &#xD638;&#xCD9C;&#xB418;&#xC9C0; &#xC54A;&#xC2B5;&#xB2C8;&#xB2E4;.</li><li>then&#xC744; &#xC5EC;&#xB7EC; &#xBC88; &#xC368;&#xC11C; &#xCF5C;&#xBC31; &#xD568;&#xC218;&#xB97C; &#xACC4;&#xC18D; &#xCD94;&#xAC00;&#xD560; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;. &#xAC01; &#xCF5C;&#xBC31; &#xD568;&#xC218;&#xB294; <strong>&#xC21C;&#xC11C;&#xB300;&#xB85C; &#xC2E4;&#xD589;</strong>&#xB429;&#xB2C8;&#xB2E4;.</li></ul><h2 id="%EC%83%81%ED%83%9C%EC%99%80-%EC%9A%B4%EB%AA%85">&#xC0C1;&#xD0DC;&#xC640; &#xC6B4;&#xBA85;</h2><p>&#x2003;&#xD504;&#xB85C;&#xBBF8;&#xC2A4;&#xB294; 3&#xAC00;&#xC9C0; &#xC0C1;&#xD0DC;(state)&#xC640; 2&#xAC00;&#xC9C0; &#xC6B4;&#xBA85;(fate)&#xB97C; &#xAC00;&#xC9D1;&#xB2C8;&#xB2E4;. &#xBC88;&#xC678;&#xB85C; &#xD655;&#xC815;(settled)&#xC774;&#xB77C;&#xB294; &#xD45C;&#xD604;&#xB3C4; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.</p><blockquote><em>&#x2003;&#xB300;&#xAE30;&#xC911;(pending)&#xB9CC; &#xC544;&#xB2C8;&#xBA74; &#xD655;&#xC815;&#xC785;&#xB2C8;&#xB2E4;. &#xD655;&#xC815;&#xC740; &#xC0C1;&#xD0DC;(state)&#xB97C; &#xB73B;&#xD558;&#xC9C4; &#xC54A;&#xACE0; &#xD3B8;&#xC758;&#xC0C1;&#xC758; &#xD45C;&#xD604;&#xC785;&#xB2C8;&#xB2E4;.</em></blockquote><ul><li>&#xC0C1;&#xD0DC;<br>fulfilled : &#xC131;&#xACF5; (then &#xCF5C;&#xBC31;&#xC744; <strong>&#xB2F9;&#xC7A5;</strong> &#xC791;&#xC5C5; &#xD050;&#xC5D0; &#xC9D1;&#xC5B4;&#xB123;&#xC744; &#xC218; &#xC788;&#xB294; &#xC0C1;&#xD0DC;)<br>rejected : &#xC2E4;&#xD328; (catch &#xCF5C;&#xBC31;&#xC744; <strong>&#xB2F9;&#xC7A5;</strong> &#xC791;&#xC5C5; &#xD050;&#xC5D0; &#xC9D1;&#xC5B4;&#xB123;&#xC744; &#xC218; &#xC788;&#xB294; &#xC0C1;&#xD0DC;)<br>pending : &#xB300;&#xAE30; (&#xC131;&#xACF5;&#xB3C4; &#xC2E4;&#xD328;&#xB3C4; &#xC544;&#xB2CC; &#xC0C1;&#xD0DC;)</li><li>&#xC6B4;&#xBA85;<br>resolved : &#xD574;&#xACB0; (&#xC131;&#xACF5;, &#xC2E4;&#xD328;&#xB97C; &#xB2E4;&#xB8E8;&#xB294; &#xD568;&#xC218;&#xB97C; &#xC0AC;&#xC6A9;&#xD568;)<br>unresolved : &#xBBF8;&#xD574;&#xACB0; (&#xD574;&#xACB0;&#xC744; &#xC548; &#xD568;)</li></ul><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://blog.cinntiq.synology.me/content/images/2023/02/202302070003.png" class="kg-image" alt="JS&#xC640; &#xD504;&#xB85C;&#xBBF8;&#xC2A4;" loading="lazy" width="801" height="297" srcset="https://blog.cinntiq.synology.me/content/images/size/w600/2023/02/202302070003.png 600w, https://blog.cinntiq.synology.me/content/images/2023/02/202302070003.png 801w" sizes="(min-width: 720px) 720px"><figcaption>&#xD504;&#xB85C;&#xBBF8;&#xC2A4; &#xC804;&#xAC1C; &#xC591;&#xC0C1;</figcaption></figure><ol><li>&#xCF54;&#xB4DC;&#xB97C; &#xC2E4;&#xD589;&#xD558;&#xACE0; pending &#xD504;&#xB85C;&#xBBF8;&#xC2A4;&#xB97C; &#xCD08;&#xAE30;&#xD654;&#xD55C;&#xB2E4;.</li><li>&#xD504;&#xB85C;&#xBBF8;&#xC2A4;&#xAC00; &#xD655;&#xC815;(&#xC131;&#xACF5; or &#xC2E4;&#xD328;)&#xB41C;&#xB2E4;.</li><li>&#xC131;&#xACF5;: &#xACB0;&#xACFC;&#xB97C; &#xCE90;&#xC2DC;&#xD558;&#xACE0;(&#xB098;&#xC911;&#xC5D0; &#xC7AC;&#xC0AC;&#xC6A9;&#xD558;&#xAE30; &#xC704;&#xD568;) then &#xCF5C;&#xBC31;&#xC744; &#xC2E4;&#xD589;. <br>&#xC2E4;&#xD328;: catch&#xC5D0;&#xC11C; &#xC5D0;&#xB7EC; &#xCC98;&#xB9AC;.</li><li>&#xC0C8;&#xB85C;&#xC6B4; pending &#xD504;&#xB85C;&#xBBF8;&#xC2A4; &#xAC1D;&#xCCB4;&#xB97C; &#xCD08;&#xAE30;&#xD654;&#xD55C;&#xB2E4;.</li><li>&#xCD94;&#xAC00; &#xC791;&#xC5C5;&#xC2DC; &#xC704;&#xC758; &#xC54C;&#xACE0;&#xB9AC;&#xC998;&#xC744; &#xBC18;&#xBCF5;&#xD55C;&#xB2E4;.</li></ol><h3 id="%EB%AF%B8%ED%95%B4%EA%B2%B0%EA%B3%BC-%EB%AF%B8%ED%99%95%EC%A0%95">&#xBBF8;&#xD574;&#xACB0;&#xACFC; &#xBBF8;&#xD655;&#xC815;</h3><blockquote><em>&#x2003;&#xD574;&#xACB0; &#xC548; &#xB41C; &#xD504;&#xB85C;&#xBBF8;&#xC2A4;&#xB294; &#xACC4;&#xC18D; &#xB300;&#xAE30; &#xC0C1;&#xD0DC;&#xC785;&#xB2C8;&#xB2E4;. &#xD574;&#xACB0;&#xB41C; &#xD504;&#xB85C;&#xBBF8;&#xC2A4;&#xB294; &#xB300;&#xAE30;, &#xC131;&#xACF5;, &#xC2E4;&#xD328; &#xC911; &#xD558;&#xB098;&#xC785;&#xB2C8;&#xB2E4;.</em><br>&#x2003;<em>&#xD504;&#xB85C;&#xBBF8;&#xC2A4;&#xB294; &#xC131;&#xACF5;&#xC6A9; &#xD568;&#xC218;, &#xC2E4;&#xD328;&#xC6A9; &#xD568;&#xC218;&#xB97C; &#xD638;&#xCD9C;&#xD558;&#xBA74; &#xD574;&#xACB0;(resolved)&#xD588;&#xB2E4;&#xACE0; &#xB9D0;&#xD569;&#xB2C8;&#xB2E4;. &#xC131;&#xACF5;&#xC6A9;, &#xC2E4;&#xD328;&#xC6A9; &#xD568;&#xC218;&#xC5D0; &#xB610;&#xB2E4;&#xB978; &#xD504;&#xB85C;&#xBBF8;&#xC2A4;&#xB97C; &#xC804;&#xB2EC;&#xD574;&#xB3C4; &#xD574;&#xACB0;&#xB429;&#xB2C8;&#xB2E4;. &#xD558;&#xC9C0;&#xB9CC; <strong>&apos;&#xC544;&#xC9C1;&#xC740;&apos;</strong> &#xD655;&#xC815;&#xB410;&#xB2E4;&#xACE0; &#xB9D0;&#xD560; &#xC218; &#xC5C6;&#xC2B5;&#xB2C8;&#xB2E4;.</em></blockquote><figure class="kg-card kg-code-card"><pre><code class="language-js">let p0 = new Promise((resolve, reject) =&gt; {
  resolve(123);
});

let p1 = p0.then((result) =&gt; {
  return result + 1;
});

console.log(p1); // pending

setTimeout(() =&gt; {
  console.log(p1); // fulfilled 124
}, 10);</code></pre><figcaption>&#xAC1C;&#xBC1C;&#xC790; &#xB3C4;&#xAD6C; &#xCF58;&#xC194;&#xCC3D;&#xC5D0;&#xC11C; &#xC704; &#xCF54;&#xB4DC;&#xB97C; &#xC2E4;&#xD589;&#xD574;&#xBCF4;&#xC790;.</figcaption></figure><p>&#x2003;&#xBE44;&#xB3D9;&#xAE30; &#xC791;&#xC5C5;&#xC740; &#xC751;&#xB2F5;&#xC774; &#xC5B8;&#xC81C; &#xC62C; &#xC9C0;&#xB294; &#xC608;&#xCE21;&#xD560; &#xC218; &#xC5C6;&#xC2B5;&#xB2C8;&#xB2E4;. </p><h3 id="%EC%9D%98%EB%8F%84%EB%8C%80%EB%A1%9C-%EC%95%88-%EB%82%98%EC%98%A4%EB%8A%94-%EA%B2%B0%EA%B3%BC">&#xC758;&#xB3C4;&#xB300;&#xB85C; &#xC548; &#xB098;&#xC624;&#xB294; &#xACB0;&#xACFC;</h3><figure class="kg-card kg-code-card"><pre><code class="language-js">let p0 = new Promise((resolve, reject) =&gt; {
  resolve(123);
});

let p1 = p0.then((result) =&gt; {
  setTimeout(() =&gt; {
    console.log(&quot;this callback returns undefined, not 404&quot;);
    return 404;
  }, 1000);
});

setTimeout(() =&gt; {
  console.log(p1); // undefined
}, 10);</code></pre><figcaption>p1&#xC740; 404 &#xD504;&#xB85C;&#xBBF8;&#xC2A4;&#xB97C; return&#xD558;&#xC9C0; &#xC54A;&#xACE0; undefined &#xD504;&#xB85C;&#xBBF8;&#xC2A4;&#xB97C; return&#xD55C;&#xB2E4;.&#xA0;</figcaption></figure><p>&#x2003;then&#xC740; &#xCF5C;&#xBC31; &#xD568;&#xC218; &#xC2E4;&#xD589; &#xC9C1;&#xD6C4; &#xBC14;&#xB85C; &#xD504;&#xB85C;&#xBBF8;&#xC2A4;&#xB97C; &#xBC18;&#xD658;&#xD569;&#xB2C8;&#xB2E4;. &#xC77C;&#xBC18; &#xD568;&#xC218;&#xCC98;&#xB7FC;, return &#xBB38;&#xC774; &#xC5C6;&#xC73C;&#xBA74; undefined (&#xD504;&#xB85C;&#xBBF8;&#xC2A4;)&#xB97C; &#xBC18;&#xD658;&#xD569;&#xB2C8;&#xB2E4;. &#xC774;&#xB294; &#xC131;&#xACF5;&#xB410;&#xB2E4;&#xACE0; &#xAC04;&#xC8FC;&#xD569;&#xB2C8;&#xB2E4;.<br>&#x2003;&#xC704; &#xCF54;&#xB4DC;&#xB294; setTimeout &#xB0B4;&#xBD80;&#xC5D0; return&#xC744; &#xC791;&#xC131;&#xD588;&#xC73C;&#xBBC0;&#xB85C; &#xC758;&#xB3C4;&#xD558;&#xB294; 404 &#xB300;&#xC2E0; undefined&#xAC00; return&#xB429;&#xB2C8;&#xB2E4;.</p><h3 id="%EB%B6%80%EC%8B%A4%ED%95%9C-%EC%97%90%EB%9F%AC-%EC%B2%98%EB%A6%AC">&#xBD80;&#xC2E4;&#xD55C; &#xC5D0;&#xB7EC; &#xCC98;&#xB9AC;</h3><figure class="kg-card kg-code-card"><pre><code class="language-js">promise1
  .then(
    (value) =&gt; {
      console.log(value);
    },
    (reason) =&gt; {
      console.log(reason);
    }
  )
  .catch((reason) =&gt; {
    console.log(reason);
  });</code></pre><figcaption>then&#xC5D0;&#xC11C;&#xB3C4; &#xC5D0;&#xB7EC;&#xB97C; &#xCC98;&#xB9AC;&#xD560; &#xC218; &#xC788;&#xC9C0;&#xB9CC; &#xAD8C;&#xC7A5;&#xD558;&#xC9C0; &#xC54A;&#xB294;&#xB2E4;.</figcaption></figure><p>&#x2003;then&#xC5D0;&#xB294; &#xB450; &#xAC1C;&#xC758; &#xCF5C;&#xBC31;&#xC744; &#xC791;&#xC131;&#xD560; &#xC218; &#xC788;&#xB294;&#xB370; &#xCCAB; &#xBC88;&#xC9F8;&#xB294; &#xC131;&#xACF5;&#xC5D0; &#xB300;&#xD55C; &#xCC98;&#xB9AC;, &#xB450; &#xBC88;&#xC9F8;&#xB294; &#xC2E4;&#xD328;&#xC5D0; &#xB300;&#xD55C; &#xC774;&#xC720;(reason)&#xB97C; &#xC791;&#xC131;&#xD569;&#xB2C8;&#xB2E4;. &#xD558;&#xC9C0;&#xB9CC; &#xBCF4;&#xD1B5;&#xC740; catch&#xBB38;&#xC73C;&#xB85C; &#xCC98;&#xB9AC;&#xD558;&#xAE38; &#xAD8C;&#xD569;&#xB2C8;&#xB2E4;. &#xAC00;&#xB3C5;&#xC131;&#xB3C4; &#xB354; &#xB098;&#xC744; &#xBFD0;&#xB354;&#xB7EC;, then(reason)&#xC740; then(value)&#xC5D0;&#xC11C; &#xBC1C;&#xC0DD;&#xD558;&#xB294; &#xC5D0;&#xB7EC;&#xB97C; &#xCC98;&#xB9AC; &#xBABB;&#xD558;&#xC9C0;&#xB9CC; catch&#xB294; &#xADF8;&#xAC83;&#xAE4C;&#xC9C0; &#xCC98;&#xB9AC;&#xD558;&#xAE30; &#xB54C;&#xBB38;&#xC785;&#xB2C8;&#xB2E4;.</p><h3 id="%ED%94%84%EB%A1%9C%EB%AF%B8%EC%8A%A4-%EC%A7%80%EC%98%A5">&#xD504;&#xB85C;&#xBBF8;&#xC2A4; &#xC9C0;&#xC625;</h3><figure class="kg-card kg-code-card"><pre><code class="language-js">loadSomething()
.then(something =&gt; {
  loadAnotherthing()
  .then(another =&gt; {
    DoSomethingOnThem(something, another);
  });
});</code></pre><figcaption>&#xD2B9;&#xC815; &#xC791;&#xC5C5;&#xC744; &#xC704;&#xD574; &#xC5EC;&#xB7EC; &#xAC00;&#xC9C0;&#xB97C; &#xBD88;&#xB7EC;&#xC624;&#xB294; &#xCF54;&#xB4DC;</figcaption></figure><p>&#x2003;&#xC774;&#xB7F0; &#xCF54;&#xB4DC;&#xB294; &#xAC00;&#xB3C5;&#xC131;&#xC774; &#xB098;&#xC058;&#xAE30;&#xC5D0; &#xBCF4;&#xD1B5;&#xC740; Promise.all&#xB85C; &#xD574;&#xACB0;&#xD569;&#xB2C8;&#xB2E4;. Promise.all&#xC740; &#xBAA8;&#xB4E0; &#xD504;&#xB85C;&#xBBF8;&#xC2A4;&#xAC00; &#xC131;&#xACF5;&#xD558;&#xBA74; &#xBC30;&#xC5F4;&#xC744; &#xBC18;&#xD658;&#xD569;&#xB2C8;&#xB2E4;.</p><figure class="kg-card kg-code-card"><pre><code class="language-js">Promise.all([loadSomething, loadAnotherThing])
    .then(values =&gt; {
        DoSomethingOnThem(values);
});</code></pre><figcaption>&#xB3C5;&#xB9BD;&#xC801;&#xC778; &#xC5EC;&#xB7EC; &#xC815;&#xBCF4;&#xB97C; &#xAC00;&#xC838;&#xC62C; &#xB550; Promise.all&#xC744; &#xC4F0;&#xBA74; &#xB41C;&#xB2E4;.</figcaption></figure><figure class="kg-card kg-code-card"><pre><code class="language-js">function promised() {
  return new Promise(resolve =&gt; {
    getOtherPromise().then(result =&gt; {
      getAnotherPromise(result).then(result2 =&gt; {
        resolve(result2);
      });
    });
  });
}</code></pre><figcaption>&#xC5F0;&#xC1C4; &#xCC98;&#xB9AC; &#xB54C;&#xBB38;&#xC5D0; &#xC0DD;&#xAE30;&#xB294; promise &#xC9C0;&#xC625;&#xC740; &#xB09C;&#xCC98;&#xD558;&#xB2E4;.</figcaption></figure><p> &#x2003;&#xD558;&#xC9C0;&#xB9CC; &#xC5F0;&#xC1C4;&#xC801;&#xC73C;&#xB85C; &#xD504;&#xB85C;&#xBBF8;&#xC2A4;&#xB97C; &#xCC98;&#xB9AC;&#xD574;&#xC57C; &#xD558;&#xB294; &#xACBD;&#xC6B0;&#xB294; &#xD504;&#xB85C;&#xBBF8;&#xC2A4; &#xC9C0;&#xC625;&#xC744; &#xD574;&#xC18C;&#xD560; &#xC218; &#xC5C6;&#xC2B5;&#xB2C8;&#xB2E4;. &#xC774; &#xACBD;&#xC6B0; async / await&#xB97C; &#xC0AC;&#xC6A9;&#xD569;&#xB2C8;&#xB2E4;.</p><h2 id="async-await">async / await</h2><figure class="kg-card kg-code-card"><pre><code class="language-js">async function promised() {
   const result =  await getOtherPromise();
   const result2 = await getAnotherPromise(result);
   return result2;
}</code></pre><figcaption>&#xAC04;&#xACB0;&#xD574;&#xC84C;&#xB2E4;.</figcaption></figure><ul><li>&#xAC04;&#xACB0;&#xD55C; &#xAC00;&#xB3C5;&#xC131;</li><li>then / catch &#xB300;&#xC2E0; try / catch &#xC0AC;&#xC6A9;</li><li>&#xC5D0;&#xB7EC;&#xAC00; &#xBC1C;&#xC0DD;&#xD55C; &#xC704;&#xCE58;&#xB97C; &#xAD6C;&#xCCB4;&#xC801;&#xC73C;&#xB85C; &#xC54C;&#xB824;&#xC90C; (&#xD3B8;&#xD55C; &#xB514;&#xBC84;&#xAE45;)</li><li>&#xD504;&#xB85C;&#xBBF8;&#xC2A4; &#xC9C0;&#xC625; &#xD574;&#xC18C;</li></ul><p>&#x2003;async &amp; await&#xB97C; &#xC4F8; &#xB550; &#xC544;&#xB798; &#xD2B9;&#xC9D5;&#xC744; &#xC5FC;&#xB450;&#xD569;&#xB2C8;&#xB2E4;.</p><ul><li>async&#xAC00; &#xBC18;&#xD658;&#xD558;&#xB294; &#xAC83;&#xC740; &#xD504;&#xB85C;&#xBBF8;&#xC2A4;.</li><li>await&#xB85C; &#xC751;&#xB2F5;&#xC744; &#xBC1B;&#xC73C;&#xBA74; &#xC774;&#xD6C4; &#xCF54;&#xB4DC;&#xB294; then&#xC758; &#xCF5C;&#xBC31; &#xD568;&#xC218;&#xCC98;&#xB7FC; &#xB9C8;&#xC774;&#xD06C;&#xB85C;&#xD0DC;&#xC2A4;&#xD06C;&#xB85C; &#xCC98;&#xB9AC;&#xB41C;&#xB2E4;.</li></ul><h3 id="async-%ED%95%A8%EC%88%98">async &#xD568;&#xC218;</h3><p>&#x2003;async&#xB294; promise&#xBCF4;&#xB2E4; &#xC9E7;&#xACE0; &#xC27D;&#xC2B5;&#xB2C8;&#xB2E4;.</p><figure class="kg-card kg-code-card"><pre><code class="language-js">async function foo() {
   return 1
}

function foo() {
   return Promise.resolve(1)
}</code></pre><figcaption>&#xB458;&#xC740; &#xB611;&#xAC19;&#xC740; &#xACB0;&#xACFC;&#xB97C; &#xBC18;&#xD658;&#xD55C;&#xB2E4;.</figcaption></figure><p>&#x2003;&#xB2E8;, async&#xC640; Promise&#xB294; &#xC18C;&#xC18C;&#xD55C; &#xCC28;&#xC774;&#xAC00; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.</p><pre><code class="language-js">const p = new Promise((res, rej) =&gt; {
  res(1);
})

const asyncReturn = async () =&gt; p;
const basicReturn = () =&gt; Promise.resolve(p);

console.log(p === basicReturn()); // true
console.log(p === asyncReturn()); // false</code></pre><h3 id="await">await</h3><figure class="kg-card kg-code-card"><pre><code class="language-js">function wait() {
  return new Promise((res) =&gt; {
    setTimeout(() =&gt; {
      res(10);
    }, 10);
  });
}

function foo() {
  return Promise.resolve(wait()).then((result) =&gt; result);
}

async function foo() {
  const result = await wait();
  return result;
}</code></pre><figcaption>&#xB450; foo &#xD568;&#xC218;&#xB294; &#xAC19;&#xC740; &#xACB0;&#xACFC;&#xB97C; &#xBC18;&#xD658;&#xD55C;&#xB2E4;.</figcaption></figure><p>&#x2003;&#xC704; &#xCF54;&#xB4DC;&#xC640; &#xC774;&#xBCA4;&#xD2B8; &#xB8E8;&#xD504;&#xB97C; &#xC0DD;&#xAC01;&#xD574;&#xC11C; &#xC544;&#xB798; &#xCF54;&#xB4DC;&#xC758; &#xCD9C;&#xB825; &#xC21C;&#xC11C;&#xB97C; &#xB9DE;&#xD600;&#xBD05;&#xC2DC;&#xB2E4;.</p><figure class="kg-card kg-code-card"><pre><code class="language-js">const fetchData = async (url) =&gt; {
  console.log(&quot;&#xB370;&#xC774;&#xD130; &#xAC00;&#xC838;&#xC624;&#xB294; &#xC911;...&quot;);
  const data = await fetch(url);
  return data;
};

const doSomething = async () =&gt; {
  console.log(&quot;&#xB370;&#xC774;&#xD130;&#xB97C; &#xAC00;&#xC838;&#xC635;&#xB2C8;&#xB2E4;.&quot;);
  const url = &quot;https://jsonplaceholder.typicode.com/posts/1&quot;;
  const data = await fetchData(url);
  console.log(&quot;&#xB370;&#xC774;&#xD130;&#xB97C; &#xAC00;&#xC838;&#xC654;&#xC2B5;&#xB2C8;&#xB2E4;.&quot;);
  return data;
};

queueMicrotask(() =&gt; {
  console.log(&quot;microtask 1&quot;);
});

doSomething();

queueMicrotask(() =&gt; {
  console.log(&quot;microtask 2&quot;);
});

console.log(&quot;stack&quot;);
</code></pre><figcaption>&#xACB0;&#xACFC; &#xD655;&#xC778;&#xC740; &#xAC1C;&#xBC1C;&#xC790; &#xB3C4;&#xAD6C;&#xC5D0;&#xC11C; &#xCF58;&#xC194;&#xCC3D;&#xC5D0; &#xC785;&#xB825;&#xD574;&#xBCF4;&#xC790;.</figcaption></figure><h3 id="%EB%AF%B8%ED%95%B4%EA%B2%B0%EB%90%9C-%ED%94%84%EB%A1%9C%EB%AF%B8%EC%8A%A4-timeout">&#xBBF8;&#xD574;&#xACB0;&#xB41C; &#xD504;&#xB85C;&#xBBF8;&#xC2A4;, timeout</h3><p>&#x2003;&#xBBF8;&#xD574;&#xACB0; &#xD504;&#xB85C;&#xBBF8;&#xC2A4;&#xB294; &#xC548;&#xD2F0; &#xD328;&#xD134; &#xC911; &#xD558;&#xB098;&#xC785;&#xB2C8;&#xB2E4;.</p><figure class="kg-card kg-code-card"><pre><code class="language-js">async function createUnresolvedPromise() {
  return new Promise((resolve, reject) =&gt; null);
}

async function notWorking() {
  let p0 = await createUnresolvedPromise();
  // &#xC2E4;&#xD589; &#xC548; &#xB428;
  p0 = resolvedPromise;
  console.log(`this promise is ${p0}`);
}

notWorking();</code></pre><figcaption>&#xC704; &#xCF54;&#xB4DC;&#xB294; &#xC2E4;&#xD589;&#xD560; &#xC218; &#xC5C6;&#xB2E4;.</figcaption></figure><p>&#x2003;createUnresolvedPromise &#xD568;&#xC218;&#xB294; &#xC131;&#xACF5;&#xB3C4;, &#xC2E4;&#xD328;&#xB3C4; &#xC544;&#xB2CC; &#xD504;&#xB85C;&#xBBF8;&#xC2A4;&#xB97C; &#xB9CC;&#xB4ED;&#xB2C8;&#xB2E4;. &#xC544;&#xBB34; &#xBC18;&#xC751;&#xC774; &#xC5C6;&#xAE30; &#xB54C;&#xBB38;&#xC5D0; &#xACC4;&#xC18D; &#xB300;&#xAE30;&#xD569;&#xB2C8;&#xB2E4;. &#xC77C;&#xBD80;&#xB7EC; &#xC800;&#xB807;&#xAC8C; &#xC791;&#xC131;&#xD560; &#xC77C;&#xC740; &#xC5C6;&#xC9C0;&#xB9CC;, &#xC544;&#xB798;&#xCC98;&#xB7FC; &#xBE44;&#xC2B7;&#xD55C; &#xCF00;&#xC774;&#xC2A4;&#xB97C; &#xACBD;&#xD5D8;&#xD560; &#xC218;&#xB294; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.</p><figure class="kg-card kg-code-card"><pre><code class="language-js">const timeout = (ms = 6000) =&gt; {
  return new Promise((reject) =&gt; {
    setTimeout(
      () =&gt; reject(new Error(`&#xB370;&#xC774;&#xD130; &#xC694;&#xCCAD; &#xD6C4; ${time / 1000}&#xCD08;&#xAC00; &#xC9C0;&#xB0AC;&#xC2B5;&#xB2C8;&#xB2E4;.`)),
      ms
    );
  });
};

const data = Promise.race([
  fetch(&quot;https://jsonplaceholder.typicode.com/posts&quot;),
  timeout(1),
])
  .then(console.log)
  .catch((error) =&gt; {
    console.error(&quot;&#xB370;&#xC774;&#xD130;&#xB97C; &#xAC00;&#xC838;&#xC62C; &#xC218; &#xC5C6;&#xC2B5;&#xB2C8;&#xB2E4;.&quot;, error);
  });</code></pre><figcaption>promise&#xB85C; &#xC791;&#xC131;&#xD55C; &#xCF54;&#xB4DC;</figcaption></figure><figure class="kg-card kg-code-card"><pre><code class="language-js">const timeout = (ms = 6000) =&gt; {
  return new Promise((reject) =&gt; {
    setTimeout(
      () =&gt; reject(new Error(`&#xB370;&#xC774;&#xD130; &#xC694;&#xCCAD; &#xD6C4; ${time / 1000}&#xCD08;&#xAC00; &#xC9C0;&#xB0AC;&#xC2B5;&#xB2C8;&#xB2E4;.`)),
      ms
    );
  });
};

const fetchData = async () =&gt; {
  try {
    const data = await Promise.race([
      fetch(&quot;https://jsonplaceholder.typicode.com/posts&quot;),
      timeout(1),
    ]);
    return data;
  } catch (error) {
    console.error(&quot;&#xB370;&#xC774;&#xD130;&#xB97C; &#xAC00;&#xC838;&#xC62C; &#xC218; &#xC5C6;&#xC2B5;&#xB2C8;&#xB2E4;.&quot;, error);
  }
};

const data = await fetchData();
console.log(data);</code></pre><figcaption>async / await&#xB85C; &#xC791;&#xC131;&#xD55C; &#xCF54;&#xB4DC;</figcaption></figure><p>&#x2003;&#xB370;&#xC774;&#xD130;&#xB97C; &#xAC00;&#xC838;&#xC624;&#xB294; &#xC2DC;&#xAC04;&#xC774; &#xB108;&#xBB34; &#xC624;&#xB798; &#xAC78;&#xB9AC;&#xAC70;&#xB098; &#xBB34;&#xC751;&#xB2F5;&#xC77C; &#xACBD;&#xC6B0;&#xB97C; &#xB300;&#xBE44;&#xD574; timeout&#xC744; &#xCC98;&#xB9AC;&#xD560; &#xD544;&#xC694;&#xAC00; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.</p><ul><li>Promise.all : &#xBAA8;&#xB4E0; &#xD504;&#xB85C;&#xBBF8;&#xC2A4;&#xAC00; &apos;&#xC131;&#xACF5;&apos;&#xD558;&#xBA74; &#xBC30;&#xC5F4; &#xBC18;&#xD658;. &#xD558;&#xB098;&#xB77C;&#xB3C4; &#xC2E4;&#xD328;&#xD558;&#xBA74; &#xC5D0;&#xB7EC;.</li><li>Promise.allSettled : &#xBAA8;&#xB4E0; &#xD504;&#xB85C;&#xBBF8;&#xC2A4;&#xAC00; &apos;&#xD655;&#xC815;&apos;&#xB418;&#xBA74; &#xBC30;&#xC5F4; &#xBC18;&#xD658;.</li><li>Promise.race : &#xAC00;&#xC7A5; &#xBE68;&#xB9AC; &apos;&#xD655;&#xC815;&apos;&#xB41C; &#xD504;&#xB85C;&#xBBF8;&#xC2A4; &#xBC18;&#xD658;.</li><li>Promise.any : &#xAC00;&#xC7A5; &#xBE68;&#xB9AC; &apos;&#xC131;&#xACF5;&apos;&#xD55C; &#xD504;&#xB85C;&#xBBF8;&#xC2A4; &#xBC18;&#xD658;.</li></ul><h2 id="%EB%A7%88%EB%AC%B4%EB%A6%AC">&#xB9C8;&#xBB34;&#xB9AC;</h2><p>&#x2003;async / await&#xB294; &#xD504;&#xB85C;&#xBBF8;&#xC2A4;&#xBCF4;&#xB2E4; &#xB098;&#xC911;&#xC5D0; &#xB098;&#xC654;&#xC9C0;&#xB9CC; &#xBB34;&#xC870;&#xAC74; &#xC5B4;&#xB290; &#xCABD;&#xC774; &#xB354; &#xC88B;&#xB2E4;&#xACE0; &#xD560; &#xC21C; &#xC5C6;&#xAE30;&#xC5D0; &#xC0C1;&#xD669;&#xC5D0; &#xB530;&#xB77C; &#xC801;&#xC808;&#xD788; &#xC4F0;&#xBA74; &#xC88B;&#xC2B5;&#xB2C8;&#xB2E4;.</p><h2 id="6-%EC%B0%B8%EC%A1%B0">6. &#xCC38;&#xC870;</h2><ul><li><a href="http://callbackhell.com/?ref=blog.cinntiq.synology.me">Callback Hell</a></li><li><a href="https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Promise?ref=blog.cinntiq.synology.me">Promise - JavaScript | MDN</a></li><li><a href="https://developer.mozilla.org/ko/docs/Web/JavaScript/Guide/Using_promises?ref=blog.cinntiq.synology.me">Using promises - JavaScript | MDN</a></li><li><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/Promise?ref=blog.cinntiq.synology.me">Promise() constructor - JavaScript | MDN</a></li><li><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/all?ref=blog.cinntiq.synology.me">Promise.all() - JavaScript | MDN</a></li><li><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/race?ref=blog.cinntiq.synology.me">Promise.race() - JavaScript | MDN</a></li><li><a href="https://github.com/domenic/promises-unwrapping/blob/master/docs/states-and-fates.md?ref=blog.cinntiq.synology.me">promises-unwrapping</a></li><li><a href="https://swizec.com/blog/finding-unresolved-promises-in-javascript/?ref=blog.cinntiq.synology.me">Finding unresolved promises in JavaScript</a></li><li><a href="https://poiemaweb.com/es6-promise?ref=blog.cinntiq.synology.me">Promise | PoiemaWeb</a></li><li><a href="https://m.blog.naver.com/sbshw1/221177121327?ref=blog.cinntiq.synology.me">The JavaScript Promise Anti-patterns</a></li><li><a href="https://medium.com/@constell99/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EC%9D%98-async-await-%EA%B0%80-promises%EB%A5%BC-%EC%82%AC%EB%9D%BC%EC%A7%80%EA%B2%8C-%EB%A7%8C%EB%93%A4-%EC%88%98-%EC%9E%88%EB%8A%94-6%EA%B0%80%EC%A7%80-%EC%9D%B4%EC%9C%A0-c5fe0add656c?ref=blog.cinntiq.synology.me">&#xC790;&#xBC14;&#xC2A4;&#xD06C;&#xB9BD;&#xD2B8;&#xC758; Async/Await &#xAC00; Promises&#xB97C; &#xC0AC;&#xB77C;&#xC9C0;&#xAC8C; &#xB9CC;&#xB4E4; &#xC218; &#xC788;&#xB294; 6&#xAC00;&#xC9C0; &#xC774;&#xC720;</a></li><li><a href="https://v8.dev/features/top-level-await?ref=blog.cinntiq.synology.me">Top-level await</a></li><li><a href="https://www.ecma-international.org/wp-content/uploads/ECMA-262_12th_edition_june_2021.pdf?ref=blog.cinntiq.synology.me">ECMA-262, 12th edition</a></li></ul>]]></content:encoded></item></channel></rss>