<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>dev-mish-mash.log</title>
        <link>https://velog.io/</link>
        <description>Front-End developer</description>
        <lastBuildDate>Sun, 14 Mar 2021 16:14:37 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>dev-mish-mash.log</title>
            <url>https://images.velog.io/images/dev-mish-mash/profile/d26f3a4a-b9a1-4ec2-9172-dfca2c7fd383/social.jpeg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. dev-mish-mash.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/dev-mish-mash" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[Callback queue, task queue, event loop 헷갈리는 개념 정리 ]]></title>
            <link>https://velog.io/@dev-mish-mash/Task-queue%EC%97%90-%EB%8C%80%ED%95%9C-%EC%98%A4%ED%95%B4-%EC%A0%95%EB%A6%AC</link>
            <guid>https://velog.io/@dev-mish-mash/Task-queue%EC%97%90-%EB%8C%80%ED%95%9C-%EC%98%A4%ED%95%B4-%EC%A0%95%EB%A6%AC</guid>
            <pubDate>Sun, 14 Mar 2021 16:14:37 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>많은 블로그에서 브라우저의 Task Queue에 대해 다루고 있는데 이에 대해 상반된 내용이 많아서, 저 나름대로 정리하기 위해 작성되었습니다. 잘못된 내용이 있을 수 있으니 피드백 부탁드립니다.</p>
</blockquote>
<h2 id="1-task-queue는-callback-queue와-같은-개념이다">1. Task queue는 callback queue와 같은 개념이다?</h2>
<ul>
<li>** Callback queue는 Task queue 의 한 종류일 수 있음.**</li>
<li>Task queue는 <a href="https://html.spec.whatwg.org/multipage/webappapis.html#task-queue">html standard</a>에서 사용되는 정식 명칭임.</li>
<li>Callback queue는, 아무리 찾아봐도 정식 명칭은 아님. html standard에도 그 개념을 찾을 수 없으며, callback queue에 대해 정리해놓은 블로그들을 찾아가 보면 결국, 이 <a href="https://www.youtube.com/watch?v=8aGhZQkoFbQ&amp;t=956s">영상</a>과 이 <a href="https://blog.sessionstack.com/how-does-javascript-actually-work-part-1-b0bacc073cf">글</a>이 그 출처였음.</li>
<li>이 영상과 글은 javascript의 이벤트 루프에 대해 직관적으로 잘 설명되어 있어서 개념 잡기에 좋으나, 문제의 callback queue와 task queue를 혼용해서 사용하고 있으며, callback queue에 대한 어떤 reference도 제공해 주지 않음.</li>
<li><a href="https://html.spec.whatwg.org/multipage/webappapis.html#task-queue">html standard</a>을 기반으로 callback queue를 분석해 본다면, callback queue는 사용자 이벤트와 같은 비동기 작업들의 task source에 대응되는 task queue의 한 종류 일 수 있으며, *<em>실제로 있는지는 확실하지 않음. *</em></li>
<li>확실하지 않은 이유는 html standard 자체가 task source를 느슨하게 정의해 놓았기 때문에, 실제 구현은 각자 브라우저에서 서로 다른 명칭으로 구현 되어 있을 수 있기 때문임.</li>
<li><strong>따라서, 결론적으로 callback queue는 브라우저가 가지는 여러 task queue 중 하나일 수 있으나, 확실히 있는 지 없는지는 V8 엔진이나 다른 엔진을 까보기 전에는 확신하지 못함. (구현체의 실제 내부 명칭이나 기능 또한 다를 수 있음)</strong></li>
</ul>
<h2 id="2-task-queue에서-task는-javascript를-실행하여-처리한다">2. Task queue에서 task는 javascript를 실행하여 처리한다?</h2>
<ul>
<li><p>** 반은 맞고 반은 틀림**</p>
</li>
<li><p>Task는 기본적으로 event loop의 task queue에서 처리되는 일의 단위이며, <a href="https://html.spec.whatwg.org/multipage/webappapis.html#task-source">task source</a>로부터 생성됨</p>
</li>
<li><p>Task의 <a href="https://html.spec.whatwg.org/multipage/webappapis.html#concept-task">종류</a>에는 </p>
<ul>
<li><a href='https://blog.javarouka.me/2016/11/12/javascript-async-promise-3/#Task'>Script</a></li> 
<li>Event</li>
<li>HTML parse</li>
<li>Callback</li>
<li>Resource (비동기로 요청되는 컨텐트들이 도착했을 때 처리할 일)</li>
<li>Reacting to DOM manipulation (javascript로 DOM을 조작할 경우, 실제 javascript 실행이 끝나고 DOM을 조작하는 task)</li>
</ul>

<p>등이 있음</p>
<ul>
<li>위에서 HTML parse, Resource, Reacting to DOM manipulation은 <strong>javascript로 동작하는 task들이 아님</strong></li>
<li>*<em>Callback이나 Event, Script를 처리할 때만 V8과 같은 엔진을 통해 javascript를 실행하는 것임 *</em></li>
<li>*<em>이렇기 때문에 task queue나 event loop는 V8 엔진 내부에 있는 것이 아닌, 외부에 존재하며 필요할 때만 V8 엔진을 통해 작업을 함 *</em></li>
</ul>
</li>
</ul>
<h2 id="3-rendering의-우선순위가-일반적인-task보다-높다">3. Rendering의 우선순위가 일반적인 task보다 높다?</h2>
<ul>
<li>** 맞음.** </li>
<li>우선순위의 정도는** microtask = rendering &gt; task 순서임 - 더 자세히는, 브라우저마다 다를 수 있음**</li>
<li>참고 : <a href="https://html.spec.whatwg.org/multipage/webappapis.html#event-loop-processing-model">이벤트 루프 동작 과정 - event loop proceeding model</a><ol>
<li>먼저 task queue에서 runnable task를 <strong>하나만</strong> 꺼내 실행함</li>
<li>그 후 microtask queue가 <strong>전부 비워질 때까지 microtask를 모두 실행함</strong></li>
<li>그 후 렌더링 할 게 있는지 <strong>확인하고</strong>(Rendering Opportunity) <strong>있으면 렌더링을 함</strong> </li>
<li>다시 첫번째로 돌아가서 무한히 반복하며, 일할 게 없으면 휴면 상태에 들어감 </li>
</ol>


</li>
</ul>
<h2 id="4-task-queue는-실제-자료구조는-queue이다">4. Task queue는 실제 자료구조는 queue이다?</h2>
<ul>
<li><strong>아님.</strong> </li>
<li>실제로는 <strong>Set</strong>으로 <strong>구현</strong>되어 있으며, 대기하고 있는 task 중 <a href="https://html.spec.whatwg.org/multipage/webappapis.html#task-queue">runnable task</a>를 뽑아내기 위해 이러한 구조를 가짐</li>
</ul>
<h2 id="더-찾아볼-만한-레퍼런스">더 찾아볼 만한 레퍼런스</h2>
<p><a href="https://stackoverflow.com/questions/53627773/which-types-of-queues-are-in-event-loop">Which types of queues are in event loop?</a>
<a href="https://ko.javascript.info/event-loop#ref-495">이벤트 루프, 매크로태스크, 마이크로태스크, 렌더링</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[브라우저에서 이벤트 루프와 V8 엔진의 관계]]></title>
            <link>https://velog.io/@dev-mish-mash/%EB%B8%8C%EB%9D%BC%EC%9A%B0%EC%A0%80%EC%97%90%EC%84%9C-%EC%9D%B4%EB%B2%A4%ED%8A%B8-%EB%A3%A8%ED%94%84%EC%99%80-V8-%EC%97%94%EC%A7%84%EC%9D%98-%EA%B4%80%EA%B3%84</link>
            <guid>https://velog.io/@dev-mish-mash/%EB%B8%8C%EB%9D%BC%EC%9A%B0%EC%A0%80%EC%97%90%EC%84%9C-%EC%9D%B4%EB%B2%A4%ED%8A%B8-%EB%A3%A8%ED%94%84%EC%99%80-V8-%EC%97%94%EC%A7%84%EC%9D%98-%EA%B4%80%EA%B3%84</guid>
            <pubDate>Sun, 14 Mar 2021 14:18:47 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>브라우저의 동작 원리를 공부하다가, 이벤트 루프와 v8 엔진의 관계에 대해 명확히 정리하기 위해 작성되었습니다.</p>
</blockquote>
<h2 id="이벤트-루프와-v8-engine의-관계">이벤트 루프와 V8 Engine의 관계</h2>
<ul>
<li><strong>이벤트 루프는 V8 엔진을 포함하는 관계임 (이벤트 루프 ⊃ V8 engine)</strong></li>
<li>이벤트 루프는 task queue를 가지고 있으며, 만약 task가 javascript를 실행해야 하는 일이면 그 경우 V8과 같은 자바스크립트 엔진을 가져다 사용함</li>
</ul>
<hr>
<h2 id="v8-엔진-내부에-있는-개념들">V8 엔진 내부에 있는 개념들</h2>
<ul>
<li><strong>자바스크립트를 실행하는데 필요한 것들이 존재한다고 보면 됨</strong></li>
<li>javascript call stack</li>
<li>Execution context</li>
<li>Heap - Garbage Collection</li>
<li>Memory allocation (for javascript objects)</li>
</ul>
<h2 id="v8-엔진-외부에-있는-개념들">V8 엔진 외부에 있는 개념들</h2>
<ul>
<li>event loop</li>
<li>task queue, 다른 이름으로는 macrotask queue</li>
<li>microtask queue, 다른 이름으로는 <a href="https://ko.javascript.info/microtask-queue">PromiseJobs</a></li>
<li>web APIs - setTimeout(), fetch(), DOM 조작 ... (전부 javascript 안에서 부를 수 있지만, 실제 실행은 V8 엔진 외부에서 다른 언어로 브라우저에서 실행됨. web APIs 는 단지 연결 통로라고 생각하면 됨) </li>
<li>추가 - setTimeout 같은 몇몇 api는 이제 [V8 자체에서 지원하기 시작하였음] (<a href="https://stackoverflow.com/questions/12335222/settimeout-and-v8">https://stackoverflow.com/questions/12335222/settimeout-and-v8</a>) (2020년 12월 기준)</li>
</ul>
<h2 id="reference">reference</h2>
<p><a href="https://medium.com/hackernoon/javascript-v8-engine-explained-3f940148d4ef">v8 engine</a>
<a href="https://html.spec.whatwg.org/multipage/webappapis.html#event-loops">event loop의 html standard</a>
<a href="https://evan-moon.github.io/2019/08/01/nodejs-event-loop-workflow/#%EC%9D%B4%EB%B2%A4%ED%8A%B8-%EB%A3%A8%ED%94%84%EB%8A%94-%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EC%97%94%EC%A7%84-%EB%82%B4%EB%B6%80%EC%97%90-%EC%9E%88%EB%8B%A4">이벤트 루프는 자바스크립트 엔진 내부에 있는 것이 아니다</a>
<a href="https://stackoverflow.com/questions/50115031/does-v8-have-an-event-loop">Does V8 have an event loop?</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[리액트의 조화(Reconciliation) 과정 정리]]></title>
            <link>https://velog.io/@dev-mish-mash/%EB%A6%AC%EC%95%A1%ED%8A%B8%EC%9D%98-%EC%A1%B0%ED%99%94Reconciliation-%EA%B3%BC%EC%A0%95-%EC%A0%95%EB%A6%AC</link>
            <guid>https://velog.io/@dev-mish-mash/%EB%A6%AC%EC%95%A1%ED%8A%B8%EC%9D%98-%EC%A1%B0%ED%99%94Reconciliation-%EA%B3%BC%EC%A0%95-%EC%A0%95%EB%A6%AC</guid>
            <pubDate>Fri, 15 Jan 2021 09:11:06 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>이 글은 Max Koretskyi 가 리버스 엔지니어링으로 React의 Source Code를 보고, 렌더링 과정을 분석해 놓은 블로그를 참고하여 작성되었습니다. 원본 내용을 더 간소화시키고 제가 정리한 내용을 추가하여서 틀린 부분이 있을 수 있으므로, 피드백 환영합니다</p>
</blockquote>
<h2 id="이해를-돕기-위한-배경-지식">이해를 돕기 위한 배경 지식</h2>
<ul>
<li>이 글은 v16.0 버전 이후의 내용들을 다룸</li>
<li>사용자가 만든 리액트 컴포넌트는 리액트 조화 과정 내에서 fiber에 대응됨 (component =&gt; react element =&gt; fiber)</li>
<li>리액트는 브라우저 런타임에서 이 fiber 들을 활용하여 virtual DOM을 만듬</li>
</ul>
<hr>
<h1 id="리액트-조화-과정-세부-구성요소">리액트 조화 과정 세부 구성요소</h1>
<h2 id="render-phase">Render Phase</h2>
<ul>
<li>변화된 사항을 감지하여 새로운 virtual DOM을 생성하는 과정</li>
<li>변경사항들이 반영된 <strong>alternate virtual DOM tree</strong>를 생성하며, <strong>diffing algorithm</strong>을 이용하여 변화된 사항을 빠르게 적용하기 위한 <strong>effects list</strong>를 생성함<h2 id="commit-phase">Commit Phase</h2>
</li>
<li>Render phase에서 생성된 alternate tree와 effects list 를 활용하여 real DOM에 반영하는 과정 <h2 id="effects-list">effects list</h2>
</li>
<li>Render phase에서 생성된 real DOM 변경사항들을 가지고 있는 list</li>
</ul>
<hr>
<h1 id="렌더-과정-정리-gif">렌더 과정 정리 GIF</h1>
<p><img src="https://images.velog.io/images/dev-mish-mash/post/56804715-f8f5-4742-a9f7-27d9f4702c1a/%EB%A6%AC%EC%95%A1%ED%8A%B8%20%EB%A0%8C%EB%8D%94%20%EA%B3%BC%EC%A0%95.gif" alt=""></p>
<hr>
<h1 id="step-by-step-조화-과정">Step by Step 조화 과정</h1>
<h2 id="초기-상태">초기 상태</h2>
<ul>
<li>처음 virtual DOM tree가 다음과 같이 구성되었다고 가정
<img src="https://images.velog.io/images/dev-mish-mash/post/90d2309e-eb89-4d22-af79-5651567df1a0/image.png" alt=""></li>
</ul>
<h2 id="외부-변화-사항이-일어남">외부 변화 사항이 일어남</h2>
<ul>
<li>앱 사용자의 입력에 의해 B component의 state의 변경 혹은 props의 변화가 일어남
<img src="https://images.velog.io/images/dev-mish-mash/post/0ae8e75f-dfea-44f9-8b4e-11986f804c78/image.png" alt=""></li>
</ul>
<h2 id="변화-사항이-일어난-fiber에-대해-flagdirty-check-진행">변화 사항이 일어난 fiber에 대해 flag(dirty check) 진행</h2>
<ul>
<li>B component에 대응되는 B Fiber에 dirty check 수행
<img src="https://images.velog.io/images/dev-mish-mash/post/f102c501-aeeb-4906-8210-d362bf069c9f/image.png" alt=""></li>
</ul>
<h2 id="render-phase-시작">Render phase 시작</h2>
<ul>
<li>renderRoot 함수가 실행되어 root로부터 렌더가 필요한 Fiber인 B를 빠르게 탐색함
<img src="https://images.velog.io/images/dev-mish-mash/post/7581af0c-f8a8-424c-8602-93b64d6cd508/image.png" alt=""></li>
</ul>
<h2 id="render-phase-진행">Render phase 진행</h2>
<ul>
<li>렌더가 필요한 Fiber부터 순차적으로 beginWork() 함수가 실행되며, 새로운 virtual DOM  Fiber를 만드는 작업을 완료하면서 completeWork()을 호출함</li>
<li>처음 dirty가 생긴 B Fiber의 completeWork() 호출이 끝나면 commit phase로 넘어감</li>
<li>또한 Render phase에서 diffing algorithm을 이용하여 effect list를 만듬
<img src="https://images.velog.io/images/dev-mish-mash/post/3187b10f-e6f7-4710-a9f4-38bc55597ce8/image.png" alt=""></li>
</ul>
<h2 id="render-phase---memoized-component의-경우">Render phase - memoized component의 경우</h2>
<ul>
<li>메모된 경우, 사용자가 입력한 compare function을 바탕으로 비교하거나 자체적인 shallow compare를 수행하여 새로 Component를 부를지 말지를 판단함</li>
<li>비교 결과 True이면, 기존에 만들어놨던 Fiber를 다시 이용함 
<a href="https://github.com/facebook/react/blob/efc57e5cbbd618f3c98d941c48eec859026c2dcb/packages/react-reconciler/src/ReactFiberBeginWork.new.js#L402-L498">updateMemoComponent</a>
<a href="https://github.com/facebook/react/blob/efc57e5cbbd618f3c98d941c48eec859026c2dcb/packages/react-reconciler/src/ReactFiberBeginWork.new.js#L500-L585">updateSimpleMemoComponent</a>
<a href="https://github.com/facebook/react/blob/efc57e5cbbd618f3c98d941c48eec859026c2dcb/packages/react-reconciler/src/ReactFiberBeginWork.new.js#L3115-L3144">bailoutOnAlreadyFinishedWork</a></li>
<li>비교 결과 False이면, 새로 Component Function이나 Class를 호출하여 Fiber를 다시 만듬
<img src="https://images.velog.io/images/dev-mish-mash/post/3f58e2e4-547b-432e-aadb-d86c01f2dc82/image.png" alt=""></li>
</ul>
<h2 id="commit-phase-시작">Commit phase 시작</h2>
<ul>
<li>effect list에 있는 변경 사항들을 real DOM에 반영함
<img src="https://images.velog.io/images/dev-mish-mash/post/5220877d-b4a8-4920-aa8b-a9332a208936/image.png" alt=""></li>
</ul>
<h2 id="commit-phase---변경사항이-없는-fiber의-경우">Commit phase - 변경사항이 없는 fiber의 경우</h2>
<ul>
<li>E Fiber의 경우, effect list에 추가되지 않음 </li>
<li>다만, 변경 사항이 없다고 하더라도 current와 alternate에 있는 fiber는 다른 객체임
<img src="https://images.velog.io/images/dev-mish-mash/post/522e466a-3ff9-4a9a-892b-63e143ed5832/image.png" alt=""></li>
</ul>
<h2 id="commit-phase---memoized-component의-경우">Commit phase - memoized component의 경우</h2>
<ul>
<li>G Fiber는 current와 alternate가 같은 pointer를 공유하므로, 실제로는 같은 객체임
<img src="https://images.velog.io/images/dev-mish-mash/post/4a8dbec6-4550-45f0-abb8-63d75648167e/image.png" alt=""></li>
</ul>
<h2 id="commit-phase-진행">Commit phase 진행</h2>
<ul>
<li>effect list에 있는 변경 사항들을 모두 진행함</li>
<li>useEffect의 경우도 이때 실행됨 
<a href="https://codethrasher.com/post/2019-06-12-the-useeffect-hook-a-brief-clarification-on-its-usage/">The useEffect hook: a brief clarification on its usage</a></li>
<li>참고: <a href="https://github.com/facebook/react/blob/9198a5cec0936a21a5ba194a22fcbac03eba5d1d/packages/react-dom/src/client/DOMPropertyOperations.js#L156">real DOM의 attribute를 변경하는 source code </a> </li>
</ul>
<p><img src="https://images.velog.io/images/dev-mish-mash/post/e42dbc41-7667-49bc-a4df-ce5be9cba47a/image.png" alt=""></p>
<h2 id="렌더-완료">렌더 완료</h2>
<ul>
<li>변경사항 반영이 끝나고 새로운 vitual DOM Tree를 current tree로 가지고 있음
<img src="https://images.velog.io/images/dev-mish-mash/post/0858e713-05cb-4330-9f7a-02a04caf7014/image.png" alt=""></li>
</ul>
<hr>
<h1 id="추가-참고-사항">추가 참고 사항</h1>
<h3 id="fiber는-엄밀히-말하면-트리-구조가-아닌-linked-list로-연결되어-있다">Fiber는 엄밀히 말하면 트리 구조가 아닌 linked list로 연결되어 있다</h3>
<ul>
<li>Fiber node들은 child 및 sibling 포인터를 가지며, 이로 인해 linked list 형태로 연결되어 있음
<img src="https://images.velog.io/images/dev-mish-mash/post/2449ec10-2b85-4c8e-89a3-a910464897b9/image.png" alt=""></li>
</ul>
<h3 id="fiber는-비동기적인-call-stack-frame을-자체적으로-구현한-것이다">Fiber는 비동기적인 call stack frame을 자체적으로 구현한 것이다</h3>
<ul>
<li>리액트는 virtual DOM tree traversal을 수행할 때 DFS 방식의 recursion 순서로 진행한다고 보여짐</li>
<li>다만, 브라우저의 built-in call stack을 그대로 이용하여 구현하면, 변경해야 할 node들이 너무 많을 경우에 멈추지 못하고 call stack이 빌 때까지 작업을 계속하게 되어 다른 작업이 지연될 수 있음</li>
<li>따라서, 리액트 팀은 call stack을 중간에 interrupt하여 순서를 조작할 수 있는 비동기적인 가상의 stack frame model을 만들었으며, 그것이 Fiber 임<blockquote>
<p>원문 : If you rely only on the [built-in] call stack, it will keep doing work until the stack is empty…Wouldn’t it be great if we could interrupt the call stack at will and manipulate stack frames manually? That’s the purpose of React Fiber. Fiber is re-implementation of the stack, specialized for React components. You can think of a single fiber as a virtual stack frame.</p>
</blockquote>
<h2 id="reference">Reference</h2>
<a href="https://indepth.dev/posts/1008/inside-fiber-in-depth-overview-of-the-new-reconciliation-algorithm-in-react">Inside Fiber: in-depth overview of the new reconciliation algorithm in React</a>
<a href="https://indepth.dev/posts/1007/the-how-and-why-on-reacts-usage-of-linked-list-in-fiber-to-walk-the-components-tree">The how and why on React’s usage of linked list in Fiber to walk the component’s tree</a>
<a href="https://codethrasher.com/post/2019-06-12-the-useeffect-hook-a-brief-clarification-on-its-usage/">The useEffect hook: a brief clarification on its usage</a></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[리덕스 dispatch와 render의 관계]]></title>
            <link>https://velog.io/@dev-mish-mash/%EB%A6%AC%EB%8D%95%EC%8A%A4-dispatch%EC%99%80-render%EC%9D%98-%EA%B4%80%EA%B3%84</link>
            <guid>https://velog.io/@dev-mish-mash/%EB%A6%AC%EB%8D%95%EC%8A%A4-dispatch%EC%99%80-render%EC%9D%98-%EA%B4%80%EA%B3%84</guid>
            <pubDate>Tue, 12 Jan 2021 03:58:19 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>피드백 환영합니다</p>
</blockquote>
<h2 id="one-dispatch-one-virtual-dom-render">One dispatch, one virtual DOM render</h2>
<ul>
<li>(dispatch가 store의 상태 변경을 유발하였을 경우) <strong>리덕스는 모든 dispatch에 대해 모든 subscriber를 업데이트함</strong> </li>
<li>상태를 각자 다른 reducer로 분리하는것과는 상관없음</li>
<li><em>e.g. 만약 store의 A field가 바뀌어도, B field를 구독하고 있는 컴포넌트에게도 기본적으로 noti가 가해짐</em></li>
<li>하나의 리덕스 앱은 결과적으로 하나의 root reducer function만을 가지기 때문임</li>
</ul>
<blockquote>
<p><strong>Redux app really only has one reducer function</strong>: the &quot;root reducer&quot; function that you will pass to createStore later on. That one root reducer function is responsible for handling all of the actions that are dispatched, and calculating what the <strong>entire new state</strong> result should be every time. 
 <em>source: <a href="https://redux.js.org/tutorials/fundamentals/part-3-state-actions-reducers#writing-reducers">https://redux.js.org/tutorials/fundamentals/part-3-state-actions-reducers#writing-reducers</a></em></p>
</blockquote>
<ul>
<li>또한, 여러 번의 dispatch가 실행될 경우 virtual dom render도 그 횟수만큼 실행</li>
<li>다만, dispatch 하였을 때 <strong>store를 구독하고 있는 컴포넌트가 하나도 없다면 virtual DOM render 또한 일어나지 않음</strong></li>
</ul>
<h2 id="connect-useselector의-차이점">Connect, useSelector의 차이점</h2>
<ul>
<li><strong>모든 컴포넌트에게 noti를 하는 것은 맞으나,</strong> 내부적으로 connect를 사용하여 props를 전달하였을 경우에는 shallow compare를 통해 그 값이 바뀌었을 때만 re-render를 유발함</li>
<li>useSelector 훅을 사용하였을 경우에는 이전 값과 비교하지만, <code>===</code> operator로 reference 비교를 하기 때문에 주의해야 할 사항이 있음. 아래 참조<h4 id="useselector로-object가-아닌-값을-return-하는-경우">useSelector로 object가 아닌 값을 return 하는 경우</h4>
<pre><code class="language-js">import React from &#39;react&#39;
import { useSelector } from &#39;react-redux&#39;
</code></pre>
</li>
</ul>
<p>export const CounterComponent = () =&gt; {
  const counter = useSelector(state =&gt; state.counter)
  return <div>{counter}</div>
}</p>
<pre><code>* 이 경우에 counter는 number 값이며, state.counter의  값이 바뀌지 않았다고 하면 ```===``` operator로 비교했을 때 ```true``` 일 것이므로, 리렌더링 되지 않음.

#### useSelector로 object를 return 하는 경우
```js
import React from &#39;react&#39;
import { useSelector } from &#39;react-redux&#39;

export const CounterComponent = () =&gt; {
  const {counter} = useSelector(state =&gt; ({counter : state.counter}))
  return &lt;div&gt;{counter}&lt;/div&gt;
}</code></pre><ul>
<li>이 경우에 useSelector의 인자로 들어간 함수가 반환하는 값은 항상 새로운 object이며, 이 경우 <code>===</code> operator로 비교했을 때 <code>false</code> 일 것이므로 state.counter가 변경되지 않았다고 할지라도 리렌더링을 유발함</li>
</ul>
<h2 id="one-dispatch-do-not-induce-one-ui-render">One dispatch <em>do not</em> induce one UI render</h2>
<ul>
<li>최종적으로 여러번의 dispatch가 끝난 다음, state가 마지막 상태로 동기화가 되면 그때 batched_update를 통해 한꺼번에 fiber에 변화를 반영하여 UI 렌더가 일어남</li>
</ul>
<h2 id="dispatch-최적화에-대해">dispatch 최적화에 대해</h2>
<ul>
<li>한 dispatch에 여러 액션이 동시에 수행되도록 batching 하기</li>
<li>다만, 간단한 CRUD 앱의 경우 굳이 이런 공수를 들여 최적화할 필요는 없음</li>
<li>실시간으로 많은 양의 데이터를 주고받는 앱의 경우에 필요함</li>
<li>e.g. 코인 거래소(실시간 호가 렌더), 채팅앱(실시간 동시다발적 채팅) </li>
</ul>
<h2 id="reference">reference</h2>
<p><a href="https://react-redux.js.org/next/api/hooks#performance">https://react-redux.js.org/next/api/hooks#performance</a>
<a href="https://blog.isquaredsoftware.com/2017/01/idiomatic-redux-thoughts-on-thunks-sagas-abstraction-and-reusability/">idiomatic-redux-thoughts-on-thunks-sagas-abstraction-and-reusability</a>
<a href="https://medium.com/tapjoykorea/react-batched-update-%EA%B7%B8%EB%A6%AC%EA%B3%A0-react-redux-connect-%ED%95%A8%EC%88%98-c9779e8db1fe">React batched update 그리고 react-redux</a>
<a href="https://github.com/reduxjs/react-redux/issues/291">dispatch &amp; actual render relations</a> </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Promise 이해하기 ]]></title>
            <link>https://velog.io/@dev-mish-mash/Promise%EB%8A%94-%EB%B9%84%EB%8F%99%EA%B8%B0-%EC%9E%91%EC%97%85%EC%9D%84-%EB%8F%84%EC%99%80%EC%A3%BC%EB%8A%94-%EB%8F%84%EA%B5%AC%EC%9D%B4%EB%8B%A4</link>
            <guid>https://velog.io/@dev-mish-mash/Promise%EB%8A%94-%EB%B9%84%EB%8F%99%EA%B8%B0-%EC%9E%91%EC%97%85%EC%9D%84-%EB%8F%84%EC%99%80%EC%A3%BC%EB%8A%94-%EB%8F%84%EA%B5%AC%EC%9D%B4%EB%8B%A4</guid>
            <pubDate>Mon, 11 Jan 2021 08:14:36 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>이 포스트는 순수하게 필자의 생각을 정리한 것이므로 잘못된 내용이 있을 수 있습니다. 피드백 환영합니다.</p>
</blockquote>
<h2 id="브라우저의-비동기-작업">브라우저의 비동기 작업</h2>
<ul>
<li>브라우저의 비동기 작업은 내장되어있는 Asynchronous Web APIs를 통해 진행됨</li>
<li>e.g. SPA를 가능하게 해 주는 XMLHttpRequest</li>
<li>e.g. 원활한 animation이 가능하게 해 주는 requestAnimationFrame</li>
<li>비동기로 일어날 작업을 주로 콜백 함수를 통해 등록하도록 되어 있음</li>
</ul>
<h2 id="promise-자체는-비동기가-아니다">Promise 자체는 비동기가 아니다</h2>
<ul>
<li>Promise 패턴이 생겨난 가장 중요한 원인은 &#39;콜백 지옥&#39;을 해결하기 위해서임</li>
<li>비동기 작업을 도와주는 synthetic sugar라고 볼 수 있음</li>
<li><strong>따라서 Promise 객체 자체는 비동기 / 동기 동작을 나누는 기준이 되지 않음</strong></li>
<li>다음과 같은 코드에서 A는 Promise 객체이지만 resolve 혹은 reject가 동기적으로 처리됨</li>
</ul>
<pre><code class="language-js">function doSyncWork () {
    return !!Math.round(Math.random());
    // true, false를 랜덤으로 반환함
}

let A = new Promise((resolve, reject) =&gt; {
    let work = doSyncWork();
    if (work) resolve(work);
    else reject(&#39;invalid work&#39;);
})

console.log(A);
// 이미 fullfilled 혹은 reject 처리가 되어 있다 </code></pre>
<ul>
<li>resolve나 reject를 <strong>다른 비동기 API의 콜백 내부</strong> 에 집어넣어야 <strong>비동기</strong>로 동작함</li>
<li>e.g. resolve를 setTimeout 콜백 함수에 집어넣는 경우</li>
</ul>
<h2 id="예시-axios에서-promise를-어떻게-사용하고-있는가">예시: Axios에서 Promise를 어떻게 사용하고 있는가</h2>
<ul>
<li>Axios는 XMLHttpRequest를 Promise 객체로 감싸서 사용자에게 제공하고 있음</li>
<li>Axios 에 get / post 등 요청이 들어오면, 새로운 XMLHttpRequest 객체를 Promise 객체 내부에 생성함 =&gt; <a href="https://github.com/axios/axios/blob/9a78465a9268dcd360d7663de686709a68560d3d/lib/adapters/xhr.js#L21">관련 코드</a> </li>
<li>XMLHttpRequest 객체의 onreadystatechange 메서드 콜백 함수 안에 resolve 및 reject 등록 =&gt; <a href="https://github.com/axios/axios/blob/9a78465a9268dcd360d7663de686709a68560d3d/lib/adapters/xhr.js#L37-L62">관련 코드</a></li>
</ul>
<h2 id="주의-then--catch-핸들러는-비동기로-동작한다">주의: then / catch 핸들러는 비동기로 동작한다</h2>
<pre><code class="language-js">function doSyncWork () {
    return !!Math.round(Math.random());
    // true, false를 랜덤으로 반환함
}

let A = new Promise((resolve, reject) =&gt; {
    let work = doSyncWork();
    if (work) resolve(work);
    else reject(&#39;invalid work&#39;);
})

A.then(() =&gt; console.log(&#39;async&#39;)).catch(() =&gt; console.log(&#39;async&#39;));
console.log(A);

결과 : 
Promise &lt;Fullfilled&gt; or &lt;rejected&gt;
&#39;async&#39;

// then과 catch는 먼저 작성되었음에도 불구하고, console.log(A) 가 먼저 실행되었다</code></pre>
<ul>
<li>Promise의 Resolve와 Reject는 microtask queue에 담기기 때문에 콜 스택에 담긴 자바스크립트가 전부 실행되고 나서 바로 실행됨</li>
</ul>
<h2 id="왜-microtask-queue-에서-실행될까">왜 Microtask queue 에서 실행될까?</h2>
<h3 id="microtask-간-동일한-환경-보장">microtask 간 동일한 환경 보장</h3>
<ul>
<li>microtask 에서는 좀 더 높은 우선순위를 가지는 일들이 실행됨</li>
<li>e.g) Mutation Observer, Intersection Observer, Promise-(then/catch handler)</li>
<li>마우스 좌표 변경이나 통신에 의한 데이터 변경 없이 모든 <a href="https://ko.javascript.info/event-loop#ref-495">마이크로태스크를 동일한 환경에서 처리할 수 있음</a></li>
</ul>
<h3 id="비동기의-더-빠른-처리">비동기의 더 빠른 처리</h3>
<pre><code class="language-js">doReallyAsyncWork1() //프로미스를 리턴하는 비동기 api
  .then(result =&gt; syncWork1(result)) // 만약 SyncWork이 반환하는 것이 promise가 아니면,
  .then(result =&gt; syncWork2(result)) // then 안에서는 Promise.resolve()로 감싸서 
  .then(result =&gt; syncWork3(result)) // 강제로 promise resolve 처리를 해서 내보낸다. 
  .then(result =&gt; doReallyAsyncWork2()) 
  .catch(err =&gt; alert(err))</code></pre>
<ul>
<li>위와 같은 코드에서, 비동기 동작을 요구하는것은 오직 2번 뿐인데, then 핸들러를 수행할때마다 똑같이 task queue에 담아놓으면 불필요하게 작업이 밀려 실행될 수 있음</li>
<li>Microtask queue에서 실행되면 task 보다 우선적으로 처리 가능하므로, syncWork1, syncWork2, syncWork3는 main thread가 microtask를 수행할 때 전부 실행되어, task queue에 있는 task보다 더 우선되어 처리됨</li>
<li>따라서 더 빠른 처리가 가능함</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[CSS-in-JS 가 좋은 이유]]></title>
            <link>https://velog.io/@dev-mish-mash/CSS-in-JS-%EA%B0%80-%EC%A2%8B%EC%9D%80-%EC%9D%B4%EC%9C%A0</link>
            <guid>https://velog.io/@dev-mish-mash/CSS-in-JS-%EA%B0%80-%EC%A2%8B%EC%9D%80-%EC%9D%B4%EC%9C%A0</guid>
            <pubDate>Sun, 10 Jan 2021 12:30:45 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>이 글은 ReactConf AU 에서 CSS-in-JS 에 대한 Max Stoiber의 강연을 참조하여 제 생각을 정리한 것입니다.</p>
</blockquote>
<h2 id="css-in-js가-등장하게-된-배경">CSS-in-JS가 등장하게 된 배경</h2>
<h3 id="mvc-혹은-mv-구조를-가진-프레임워크는-개발하기-피곤함">MVC 혹은 MV* 구조를 가진 프레임워크는 개발하기 피곤함</h3>
<ul>
<li>하나의 컴포넌트를 만드려면 model, view, controller 뿐만 아니라 CSS 또한 분할된 개념으로 나누어 구현해야 함</li>
<li>때문에 코드가 분산되어 가독성이 떨어지고 복잡하며, 많은 코딩이 필요함</li>
<li>아이러니하게, MVC가 나온 이유는 각 부분의 역할에 따라 코드를 분할하여 가독성과 효율을 높이고 디펜던시를 줄이기 위함이었지만, 반대로 시간이 지나면서 최근에는 하나의 개념(컴포넌트)을 만드는데 파일을 3개나 만들어야 한다는게 피곤해지는 원인이 됨. css까지 포함하면 4개임<h3 id="컴포넌트-기반-프레임워크의-등장">컴포넌트 기반 프레임워크의 등장</h3>
</li>
<li>React / Vue와 같은 프레임워크는 컴포넌트라는 개념 단위를 도입함</li>
<li>컴포넌트는 model, view, controller를 개념적으로 포함하고 있으며 가상 돔 렌더의 단위가 됨<ul>
<li>model: component안의 state / props</li>
<li>view : jsx (실제 돔 객체를 그리는 것은 리액트에서 알아서 함)</li>
<li>controller: event handlers (callbacks) - 모델 정보를 변경</li>
</ul></li>
<li>개념이 단일화되어 좀 더 직관적이고 단순하게 이해할 수 있음</li>
<li>하지만 여전히, CSS는 컴포넌트와 별개로 작성해야 하는 한계가 있으며 그 개념도 분할되어 있음</li>
</ul>
<h3 id="css-in-js를-도입하면-컴포넌트와-css를-통합할-수-있음">CSS-in-JS를 도입하면 컴포넌트와 CSS를 통합할 수 있음</h3>
<ul>
<li><strong>CSS-in-JS로 CSS마저 컴포넌트의 구성 요소로 종속시킬 수 있음</strong></li>
</ul>
<h2 id="그래서-이렇게-컴포넌트에-종속시키면-무엇이-좋은가">그래서, 이렇게 컴포넌트에 종속시키면 무엇이 좋은가?</h2>
<h3 id="1-오직-해당-컴포넌트에만-영향을-준다">1. 오직 해당 컴포넌트에만 영향을 준다</h3>
<ul>
<li>기존 CSS 혹은 SCSS 방식처럼 classname을 수동으로 지정하여 스타일링 하는 것이 아님</li>
<li>다른 컴포넌트에 영향을 주지 않기 때문에 생성, 수정, 삭제가 자유로움 (디펜던시가 없음)</li>
</ul>
<h3 id="2-css-유지-보수가-쉽다">2. CSS 유지 보수가 쉽다</h3>
<ul>
<li>만약 협업을 하면서 운이 나쁘게 classname이 겹치게 되면, 어디서 문제가 생겼을지 몰라 수십개의 스타일시트를 전부 뒤져야함  </li>
<li>따라서 CSS 작업을 할 때, 규모가 커지면 커질수록 십중팔구는 그 안의 CSS를 고쳐서 어떤 고장이 날 지 몰라 그냥 밑에 덧붙이는 경우가 대다수임</li>
<li>이럴 경우 유지 보수가 안되기 딱 좋음</li>
<li>하지만 CSS-in-JS 방식은 CSS가 특정 컴포넌트에 종속되기 때문에 다른 부작용에 대한 부담 없이, 마음대로 수정이 가능함</li>
</ul>
<h3 id="3-협업하기-쉽다">3. 협업하기 쉽다</h3>
<ul>
<li>기존 CSS를 사용하여 협업할 경우, classname 충돌이나 cascade styling override에 따른 문제가 발생하기 매우 쉬움</li>
<li>CSS-in-JS 방식은 이러한 문제가 없으므로 CSS를 잘 모르는 사람들과의 협업도 원활하게 해 줌</li>
</ul>
<h3 id="4-성능이-빠르다">4. 성능이 빠르다</h3>
<ul>
<li>기존 방식들은 전체 페이지에 필요한 CSS를 처음부터 전부 로딩하여 style 태그를 생성함</li>
<li>CSS-in-JS는 그때 그때 필요한 만큼만 style 태그를 최소한으로 생성함</li>
</ul>
<h3 id="5-향상된-동적-스타일링">5. 향상된 동적 스타일링</h3>
<ul>
<li>CSS-in-JS는 컴포넌트 라이프사이클에 맞추어 CSS를 변경할 수 있으므로, 좀 더 자유로운 동적 스타일링이 가능함</li>
<li>e.g. 컴포넌트의 상태를 style에 적용할 수 있음 (props 전달)</li>
</ul>
<h2 id="css-in-js-는-어떻게-동작하는가">CSS-in-JS 는 어떻게 동작하는가?</h2>
<h3 id="1-classname-동적-생성">1. classname 동적 생성</h3>
<ul>
<li>CSS-in-JS 사용자가 스타일에 classname을 사용하지 않더라도, 결국 브라우저는 webkit 엔진에서 스타일링을 수행할 때 classname을 기반으로 하고 있기 때문에 브라우저 런타임에서는 각 CSS 와 컴포넌트를 이어주는 classname이 필요함</li>
<li>CSS-in-JS 에서는 각 컴포넌트를 hashing하여 동적인 classname을 만듬</li>
<li>e.g. &quot;sc-cMWNzn&quot;</li>
<li>컴포넌트가 생성될 때 head tag에 style tag로 같이 생성되며, 사라질때도 같이 사라짐 (라이프사이클이 같음)</li>
<li>styled-components의 경우, 같은 컴포넌트가 여러개 생성될 때는 하나의 css만 사용됨 =&gt; 최적화가 되어 있음</li>
</ul>
<h3 id="2-css-parser">2. css parser</h3>
<ul>
<li>각 CSS-in-JS 엔진은 style html tag를 만드는 CSS parser를 내장하고 있음</li>
<li>styled-components는 <a href="https://github.com/thysultan/stylis.js">stylis</a>라는 CSS preprocessor를 이용함</li>
<li>material-ui의 경우도 <a href="https://material-ui.com/styles/basics/#why-use-material-uis-styling-solution">비슷한 방식</a>으로 동적 생성을 지원함</li>
</ul>
<h2 id="동작-원리-요약">동작 원리 요약</h2>
<p><img src="https://images.velog.io/images/dev-mish-mash/post/415179d7-7b1e-4ed4-8dc2-071545e4f3d8/image.png" alt=""></p>
<h1 id="reference">reference</h1>
<p><strong><a href="https://www.youtube.com/watch?v=ufPCITfUQnQ&amp;t=261s">https://www.youtube.com/watch?v=ufPCITfUQnQ&amp;t=261s</a></strong></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[React에서 이벤트 위임을 통한 이벤트 리스너 최적화]]></title>
            <link>https://velog.io/@dev-mish-mash/React%EC%97%90%EC%84%9C-%EC%9D%B4%EB%B2%A4%ED%8A%B8-%EC%9C%84%EC%9E%84%EC%9D%84-%ED%86%B5%ED%95%9C-%EC%9D%B4%EB%B2%A4%ED%8A%B8-%EB%A6%AC%EC%8A%A4%EB%84%88-%EC%B5%9C%EC%A0%81%ED%99%94</link>
            <guid>https://velog.io/@dev-mish-mash/React%EC%97%90%EC%84%9C-%EC%9D%B4%EB%B2%A4%ED%8A%B8-%EC%9C%84%EC%9E%84%EC%9D%84-%ED%86%B5%ED%95%9C-%EC%9D%B4%EB%B2%A4%ED%8A%B8-%EB%A6%AC%EC%8A%A4%EB%84%88-%EC%B5%9C%EC%A0%81%ED%99%94</guid>
            <pubDate>Sun, 18 Oct 2020 14:53:28 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>결론만 말하자면, 이벤트 위임을 통해서 이벤트 리스너의 개수를 줄이려 하더라도 의미 없고, 성능 향상도 없다.</p>
</blockquote>
<h2 id="성능-향상을-목적으로-하는-native-js-에서의-이벤트-위임event-delegation">성능 향상을 목적으로 하는 Native JS 에서의 이벤트 위임(Event Delegation)</h2>
<li> DOM 객체가 매우 많을 경우 이벤트 리스너를 각 객체마다 부착하게 되면 메모리 누수와 성능 저하가 문제가 된다.</li>
<li> 따라서 이벤트 버블링을 응용하여 부모 엘리먼트에 리스너를 위임하여 부착하면, 리스너의 개수를 1개로 줄여 최적화할 수 있다.</li>

<h2 id="리액트에서의-이벤트-위임">리액트에서의 이벤트 위임</h2>
<li>리액트에서는 자체 이벤트 시스템을 갖고 있어서, 이미 document 최상단에서 이벤트를 잡아 자체적으로 처리한다.(리액트 v16.0)</li>
<li>참고: 리액트 v17.0에서, 이벤트 리스너를 document에 붙이는 것이 아니라 리액트가 관리하기 시작하는 div에 붙이는 것으로 바뀌었다.</li>
<li>따라서 이벤트 위임을 통한 성능상의 이득은 없다고 봐도 무방하다. (이미 그렇게 되어 있으므로)</li>
<li>각 돔 노드에 빈 이벤트 리스너가 달려있기는 하지만, iOS 와 사파리 브라우저를 호환하기 위한 대비책이라고 한다. (실제로 확인해보니 동작하지 않는 no-op 함수가 똑같이 바인딩되어 있다)</li>

<h2 id="reference">Reference</h2>
<p><a href="https://github.com/facebook/react/issues/13635">Event delegation in React</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[함수형 프로그래밍에 대한 개념 잡기]]></title>
            <link>https://velog.io/@dev-mish-mash/%ED%95%A8%EC%88%98%ED%98%95-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D%EC%97%90-%EB%8C%80%ED%95%9C-%EA%B0%9C%EB%85%90-%EC%9E%A1%EA%B8%B0</link>
            <guid>https://velog.io/@dev-mish-mash/%ED%95%A8%EC%88%98%ED%98%95-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D%EC%97%90-%EB%8C%80%ED%95%9C-%EA%B0%9C%EB%85%90-%EC%9E%A1%EA%B8%B0</guid>
            <pubDate>Sun, 11 Oct 2020 15:42:41 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>본 글은 2018년 GOTO conference에서 Russ Olsen이 발표한 &#39;Functional Programming in 40 Minutes&#39; 의 강연 내용을 제가 이해한 내용을 바탕으로 정리한 것입니다.</p>
</blockquote>
<blockquote>
<p>객체지향과 비교하여 강의가 진행되기 때문에, 객체지향에 대한 이해가 조금 있으면 이 강의를 듣는데 도움이 됩니다.</p>
</blockquote>
<h2 id="객체지향-프로그래밍의-한계점">객체지향 프로그래밍의 한계점</h2>
<li>객체 지향 프로그래밍은 현재 가장 유명한 프로그래밍 패러다임이다</li>
<li>우리가 세상 사물을 보는 방식 그대로 프로그래밍 하는 방식이다(클래스로부터 인스턴스를 찍어내고 각 인스턴스에는 속성과 메서드가 존재하고, 인터페이스가 존재하는걸 보면 그렇다)</li>
<li>하지만 아무리 잘 짜더라도, 설계의 변경과 유지 보수를 하다 보면 필연적으로 이상적이지 않은 디펜던시가 생기기 마련이고, 이것이 추가 기능의 삽입이나 디버그를 굉장히 힘들게 한다.</li>
<li> => 개인적인 생각으로는, 각각의 인스턴스가 속성을 가지고 있기 때문에 이 상태에 따라 같은 메서드나 로직이 수행되더라도 결과가 달라져서 그런 것 같다.</li>

<p><strong>=&gt; 근본적으로, 시간에 따라 변하는 속성을 제대로 파악하지 못하는 지경이 되는 것이 문제같은데, 이걸 해결할 방법이 마땅치 않아 보인다.</strong></p>
<h2 id="대체제가-있을까">대체제가 있을까?</h2>
<li>많은 부분을 대체할 필요는 없다. 객체지향을 이루는 부분들만 다른 구성 요소로 바꾸면 된다</li>
<li>클래스 /  인터페이스 /  메서드를 => 어떤 다른 요소?</li>
<li>함수형 프로그래밍을 생각해 본다면 어떨까?</li>
<li>순수 함수 / 불변성 자료 구조 / 사이드 이펙트 브릿지 가 해답이 될 수 있다.</li>

<p><strong>=&gt; 객체지향을 이루는 요소들 대신, 함수형 구성 요소인 순수 함수 / 불변성 자료 구조 / 사이드 이펙트 브릿지를 활용하면 더 좋은 프로그래밍이 가능할 수 있다.</strong></p>
<h2 id="함수형-구성-요소">함수형 구성 요소</h2>
<h3 id="1-순수-함수">1. 순수 함수</h3>
  <li> 같은 입력에 대해 항상 똑같이 출력함</li>
  <li> 외부에 영향을 주거나 받지 않음</li>

<h4 id="사이드-이펙트">사이드 이펙트</h4>
  <li>함수를 순수하지 않게 만드는 모든 효과</li>


<h4 id="순수-함수가-왜-중요한가">순수 함수가 왜 중요한가?</h4>
<li> 어디에서 호출이 되든, 어떤 시점에서 호출이 되든 입력값이 정상이면 출력값도 정상이기 때문</li>
<li> 순수 함수로만 로직을 구현한다면 로직 덩어리 전체가 순수하므로 유지 보수나 기능의 추가가 매우 용이함</li>

<p><strong>=&gt; 디펀덴시가 최소화됨</strong></p>
<h3 id="2-불변성immutable-자료-구조">2. 불변성(Immutable) 자료 구조</h3>
<li> 순수 함수를 사용해서 로직을 구성할 경우, 함수 인자나 외부 변수를 직접 바꾸면 안 되며 항상 새로운 변수를 만들어서 값을 전달해야 함. </li>

<p>** =&gt; 왜 그럴까? 불변하지 않으면 사이드 이펙트가 발생하는 것과 동일함. =&gt; 따라서 순수 함수를 사용하는 이점이 의미가 없어짐**</p>
<li>이렇게 되면 문제가 한 가지 있는데, 같은 값을 매번 복사해야 함</li>
<li>만약 엄청 큰 배열을 복사해야 한다면 그 오버헤드는 어마어마함.</li>
<li>이럴 경우를 방지하기 위한 persistent data structure가 존재함. 변하는 요소의 node만 부분적으로 복사함</li>

<h3 id="3-사이드-이펙트-브릿지---closure클로져-방식">3. 사이드 이펙트 브릿지 - closure(클로져) 방식</h3>
<li>하지만, 궁극적으로 우리가 원하는 것은 사이드 이펙트임</li>
<li>쉽게 말해서, 서버에 데이터를 요청하거나, 데이터베이스를 업데이트하는 등의 실질적인 생산 활동 자체가 사이드 이펙트임</li>
<li>따라서, 필요한 부분에만 사이드 이펙트를 유발할 수 있도록 순수 함수 로직 안에서 그 경로를 뚫어주어야 함</li>
<li>강연자는 이것을 'messy outside world' 와 'lovely functional world'의 브릿지라고 표현함</li>

<h4 id="예시-atoms">예시: Atoms</h4>
<li>A container for mutable state</li>
<li>함수를 atom에 던지면 그 함수 결과 값으로 변수값을 다시 설정</li>

<pre><code class="language-js">function funcA() {
... 연산 후
return someValue
}

Atom(funcA()) // function 자체를 인자로 받아 다시 atom 안의 변수 값에 someValue를 다시 반영</code></pre>
<h4 id="예시-atom은-mutable-variable를-그냥-하나를-두는-것과-무엇이-다른가">예시: atom은 mutable variable를 그냥 하나를 두는 것과 무엇이 다른가?</h4>
<li>여러 개의 쓰레드가 동시에 mutable variable 하나를 변경하려고 시도하면 업데이트가 누락되는 등의 문제가 생긴다</li>
<li>Atom은 상태값을 변경하는 순수함수가 들어오면 <strong>그걸 queue에 가지고 있다가, 자체적으로 순서대로 돌려 처리</strong>하므로 이런 문제가 없다.</li>
<li>또한 코드 상으로 비교해 봤을 때, mutable variable은 함수 문 내부에서 접근해야 되는 것과 달리,</li>
<li>atom은 순수함수를 인자로 받아 <strong>코드 상에서도</strong> 철저히 messy outside world와 lovely functional world를 분리시킬 수 있으므로 구조상에서도 큰 이득이다 </li>

<p><strong>=&gt; 바닐라 자바스크립트에서는 이런 구조를 만들 수 있을까? 한번 시도해 봐야겠다. 그 후 업데이트 예정</strong></p>
<h4 id="예시-agentsactors">예시: agents/actors</h4>
<li>atom과 비슷하게, 순수함수를 인자로 받아 side effect를 수행하는 어떤 장치</li>
<li><strong>특히 웹서버에 요청, 데이터베이스 업데이트, 파일 삭제 및 추가 같은 비동기 작업 같은 경우에 순차적으로 처리할 수 있도록 queue를 가지고 있어서</strong> messy outside world와 lovely functional world를 분리할 수 있는 bridge 역할을 성공적으로 수행한다 </li>

<p><strong>=&gt; 이것도 바닐라 자바스크립트에서 만들 수 있을까? 해보고 업데이트 예정</strong></p>
<h2 id="함수형만이-갖는-압도적-장점--여러-쓰레드를-활용할-경우">함수형만이 갖는 압도적 장점 =&gt; 여러 쓰레드를 활용할 경우</h2>
<li>순수함수 + Immutable data structure가 합쳐지면, 적어도 연산 과정에서 이미 있는 data structure를 mutate하여 다른 쓰레드가 엉뚱한 연산 결과를 내뱉는 것을 <strong>근본적으로 방지할 수 있다.</strong></li>
<li>따라서 다중 쓰레드 작업에 유리하다.</li>

<h2 id="함수형-프로그래밍을-시도해보자">함수형 프로그래밍을 시도해보자</h2>
<li>변수를 모두 immutable 하게 만들고, 함수로 무조건 무언가를 return하게 만들어야 하니 처음 시도하게 되면 이런 규칙들이 족쇄처럼 느껴질 것이다. </li>
<li>하지만 조금 익숙해지면 더욱 가독성이 좋고, 디펜던시가 최소화 되기 때문에 생산성의 향상을 경험할 수 있을 것이다.
</li>

<h4 id="출처--httpswwwyoutubecomwatchv0if71hoyvjy">출처 : <a href="https://www.youtube.com/watch?v=0if71HOyVjY">https://www.youtube.com/watch?v=0if71HOyVjY</a></h4>
]]></description>
        </item>
    </channel>
</rss>