{"componentChunkName":"component---src-templates-docs-js","path":"/docs/codebase-overview.html","result":{"data":{"markdownRemark":{"html":"<p>이 섹션은 React 코드베이스 구조와 관례, 그리고 구현에 대한 개요를 설명하고 있습니다.</p>\n<p><a href=\"/docs/how-to-contribute.html\">React에 기여</a>하고자 한다면, 이 문서를 참고하여 프로젝트를 수정하길 바랍니다.</p>\n<p>React 앱을 개발하는데 있어서 아래 관례들의 사용을 반드시 추천하지는 않습니다. 대부분의 관례들은 이전에 많이 사용된 것들이며, 차차 수정될 것입니다.</p>\n<h3 id=\"top-level-folders\"><a href=\"#top-level-folders\" aria-hidden class=\"anchor\"><svg aria-hidden=\"true\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>최상위 폴더 </h3>\n<p><a href=\"https://github.com/facebook/react\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">React 저장소</a>를 클론하게 되면, 다음과 같은 몇 개의 최상위 폴더를 볼 수 있습니다.</p>\n<ul>\n<li><a href=\"https://github.com/facebook/react/tree/main/packages\" target=\"_blank\" rel=\"nofollow noopener noreferrer\"><code class=\"gatsby-code-text\">packages</code></a> 폴더는 React 저장소에 있는 모든 패키지들에 대해 <code class=\"gatsby-code-text\">package.json</code>과 같은 메타데이터와 <code class=\"gatsby-code-text\">src</code> 폴더를 포함하고 있습니다. <strong>변경하고자 하는 부분이 코드와 관련되어 있다면, <code class=\"gatsby-code-text\">src</code> 폴더에 대부분을 할애하게 될 것입니다.</strong></li>\n<li><a href=\"https://github.com/facebook/react/tree/main/fixtures\" target=\"_blank\" rel=\"nofollow noopener noreferrer\"><code class=\"gatsby-code-text\">fixtures</code></a>에는 기여자들을 위한 몇 가지 React 테스트 애플리케이션이 존재합니다.</li>\n<li><code class=\"gatsby-code-text\">build</code> 폴더에는 React의 빌드 결과가 생성됩니다. 저장소에는 존재하지 않지만, React를 클론하고 처음 <a href=\"/docs/how-to-contribute.html#development-workflow\">빌드</a>할 시 생성됩니다.</li>\n</ul>\n<p>설명 문서는 React로부터 <a href=\"https://github.com/reactjs/reactjs.org\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">분리된 저장소</a>에 존재합니다.</p>\n<p>위에서 언급한 것 외에 별도의 최상위 폴더가 존재하지만, 대부분 기여하는데 있어서 사용되지 않을 것입니다.</p>\n<h3 id=\"colocated-tests\"><a href=\"#colocated-tests\" aria-hidden class=\"anchor\"><svg aria-hidden=\"true\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Colocated 테스트 </h3>\n<p>해당 프로젝트에는 유닛 테스트를 위한 상위 디렉토리가 존재하지 않습니다. 대신 소스 코드와 함께 <code class=\"gatsby-code-text\">__tests__</code> 디렉토리 내부에 테스트 코드를 함께 넣어뒀습니다.</p>\n<p>예를 들어, <a href=\"https://github.com/facebook/react/blob/87724bd87506325fcaf2648c70fc1f43411a87be/src/renderers/dom/client/utils/setInnerHTML.js\" target=\"_blank\" rel=\"nofollow noopener noreferrer\"><code class=\"gatsby-code-text\">setInnerHTML.js</code></a>에 대한 테스트 코드는 <a href=\"https://github.com/facebook/react/blob/87724bd87506325fcaf2648c70fc1f43411a87be/src/renderers/dom/client/utils/__tests__/setInnerHTML-test.js\" target=\"_blank\" rel=\"nofollow noopener noreferrer\"><code class=\"gatsby-code-text\">__tests__/setInnerHTML-test.js</code></a>에 존재합니다.</p>\n<h3 id=\"warnings-and-invariants\"><a href=\"#warnings-and-invariants\" aria-hidden class=\"anchor\"><svg aria-hidden=\"true\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>경고와 불변식 </h3>\n<p>React 코드베이스에서는 <code class=\"gatsby-code-text\">console.error</code>를 사용해 경고를\u001d 표시합니다.</p>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"gatsby-code-jsx\"><code class=\"gatsby-code-jsx\"><span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>__DEV__<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  console<span class=\"token punctuation\">.</span><span class=\"token function\">error</span><span class=\"token punctuation\">(</span><span class=\"token string\">'Something is wrong.'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>경고는 개발 시에만 표시되며 배포 시에는 완전히 무시됩니다. 실행 시에 몇 가지 코드를 무시하기 위해서, 다음과 같이 <code class=\"gatsby-code-text\">invariant</code> 모듈을 활용할 수 있습니다.</p>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"gatsby-code-jsx\"><code class=\"gatsby-code-jsx\"><span class=\"token keyword\">var</span> invariant <span class=\"token operator\">=</span> <span class=\"token function\">require</span><span class=\"token punctuation\">(</span><span class=\"token string\">'invariant'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token function\">invariant</span><span class=\"token punctuation\">(</span>\n  <span class=\"token number\">2</span> <span class=\"token operator\">+</span> <span class=\"token number\">2</span> <span class=\"token operator\">===</span> <span class=\"token number\">4</span><span class=\"token punctuation\">,</span>\n  <span class=\"token string\">'You shall not pass!'</span>\n<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p><strong><code class=\"gatsby-code-text\">invariant</code>의 대상 조건식이 <code class=\"gatsby-code-text\">false</code>일 때 예외가 발생합니다.</strong></p>\n<p>‘불변식’은 ‘해당 조건식이 항상 참일 경우’를 의미합니다. 코드의 동작을 확실하게 하기 위한 요소라고 생각할 수 있습니다.</p>\n<p>개발용과 배포용 프로그램이 서로 유사하게 동작하는 것은 중요합니다. 따라서 <code class=\"gatsby-code-text\">invariant</code> 예외는 개발용과 배포용 프로그램에서 동시에 발생합니다. 오류 메시지는 배포용 프로그램에서 오류 코드로 자동 변환됩니다.</p>\n<h3 id=\"development-and-production\"><a href=\"#development-and-production\" aria-hidden class=\"anchor\"><svg aria-hidden=\"true\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>개발과 배포 </h3>\n<p>의사 전역 변수 <code class=\"gatsby-code-text\">__DEV__</code>를 사용하여 개발 시에만 작동하는 코드를 작성할 수 있습니다.</p>\n<p>해당 변수는 컴파일 단계에서 한번에 처리되며, CommonJS 빌드 시에 <code class=\"gatsby-code-text\">process.env.NODE_ENV !== 'production'</code>로 변환됩니다.</p>\n<p>스탠드얼론 빌드의 경우, 해당 변수는 압축하지 않을 시 <code class=\"gatsby-code-text\">true</code>로 취급되며 압축 시 <code class=\"gatsby-code-text\">if</code> 블록을 포함하여 전부 제거됩니다.</p>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"gatsby-code-jsx\"><code class=\"gatsby-code-jsx\"><span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>__DEV__<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">// This code will only run in development.</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<h3 id=\"flow\"><a href=\"#flow\" aria-hidden class=\"anchor\"><svg aria-hidden=\"true\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Flow </h3>\n<p>React는 최근 <a href=\"https://flow.org/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Flow</a> 검사를 도입하기 시작했습니다. 라이센스 주석에 <code class=\"gatsby-code-text\">@flow</code> 표시가 포함된 파일은 자료형 검사를 받게 됩니다.</p>\n<p>해당 프로젝트는 <a href=\"https://github.com/facebook/react/pull/7600/files\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">이미 존재하는 코드에 대한 Flow 형식 추가</a>에 대한 풀 리퀘스트를 허용하고 있습니다. Flow 검사 형식은 다음과 같이 구성되어 있습니다.</p>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"gatsby-code-jsx\"><code class=\"gatsby-code-jsx\">ReactRef<span class=\"token punctuation\">.</span><span class=\"token function-variable function\">detachRefs</span> <span class=\"token operator\">=</span> <span class=\"token keyword\">function</span><span class=\"token punctuation\">(</span>\n  <span class=\"token parameter\"><span class=\"token literal-property property\">instance</span><span class=\"token operator\">:</span> ReactInstance<span class=\"token punctuation\">,</span>\n  <span class=\"token literal-property property\">element</span><span class=\"token operator\">:</span> ReactElement <span class=\"token operator\">|</span> string <span class=\"token operator\">|</span> number <span class=\"token operator\">|</span> <span class=\"token keyword\">null</span> <span class=\"token operator\">|</span> <span class=\"token boolean\">false</span><span class=\"token punctuation\">,</span></span>\n<span class=\"token punctuation\">)</span><span class=\"token operator\">:</span> <span class=\"token keyword\">void</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">// ...</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>가능하면 새로 작성하는 코드에 Flow 검사 형식을 포함해 주길 바랍니다.\n<code class=\"gatsby-code-text\">yarn flow</code> 명령어를 통해 Flow에 대한 형식 검사를 직접 수행해 볼 수 있습니다.</p>\n<h3 id=\"multiple-packages\"><a href=\"#multiple-packages\" aria-hidden class=\"anchor\"><svg aria-hidden=\"true\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>다양한 패키지 </h3>\n<p>React는 <a href=\"https://danluu.com/monorepo/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">monorepo</a>입니다. 해당 저장소는 여러 분리된 패키지를 포함하고 있으며, 각 변경점들은 함께 반영되고 모든 이슈는 한 곳에서 관리됩니다.</p>\n<h3 id=\"react-core\"><a href=\"#react-core\" aria-hidden class=\"anchor\"><svg aria-hidden=\"true\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>React 코어 </h3>\n<p>React의 ‘코어’는 모든 <a href=\"/docs/react-api.html#react\">최상위 <code class=\"gatsby-code-text\">React</code> API</a>를 포함합니다. 예를 들면 다음과 같습니다.</p>\n<ul>\n<li><code class=\"gatsby-code-text\">React.createElement()</code></li>\n<li><code class=\"gatsby-code-text\">React.Component</code></li>\n<li><code class=\"gatsby-code-text\">React.Children</code></li>\n</ul>\n<p><strong>React 코어는 컴포넌트를 정의하는 데에 필요한 API만 포함하고 있습니다.</strong> React 코어는 <a href=\"/docs/reconciliation.html\">재조정</a> 알고리즘과 플랫폼 전용 코드를 포함하고 있지 않습니다. 해당 코어는 React DOM과 React 네이티브의 컴포넌트에서 동시에 사용됩니다.</p>\n<p>React 코어의 소스 코드는 <a href=\"https://github.com/facebook/react/tree/main/packages/react\" target=\"_blank\" rel=\"nofollow noopener noreferrer\"><code class=\"gatsby-code-text\">packages/react</code></a>에 위치하고 있습니다. 해당 코드는 npm에서 <a href=\"https://www.npmjs.com/package/react\" target=\"_blank\" rel=\"nofollow noopener noreferrer\"><code class=\"gatsby-code-text\">react</code></a> 패키지로 받을 수 있습니다. 관련된 스탠드얼론 브라우저 빌드는 <code class=\"gatsby-code-text\">react.js</code>이며, 전역에서 <code class=\"gatsby-code-text\">React</code> 키워드를 통해 접근할 수 있습니다.</p>\n<h3 id=\"renderers\"><a href=\"#renderers\" aria-hidden class=\"anchor\"><svg aria-hidden=\"true\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>렌더러 </h3>\n<p>React는 원래 DOM을 대상으로 하여 개발됐지만, 이후 <a href=\"https://reactnative.dev/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">React 네이티브</a>를 통해 네이티브 플랫폼 또한 지원하게 되었습니다. 본 문단은 React 내부의 ‘렌더러’에 대해 간략히 소개합니다.</p>\n<p><strong>렌더러는 React 트리의 플랫폼 종속적인 변환 방법을 관리합니다.</strong></p>\n<p>렌더러는 <a href=\"https://github.com/facebook/react/tree/main/packages/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\"><code class=\"gatsby-code-text\">packages/</code></a> 폴더 안에 다음과 같이 존재합니다.</p>\n<ul>\n<li><a href=\"https://github.com/facebook/react/tree/main/packages/react-dom\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">React DOM Renderer</a>는 React 컴포넌트를 DOM으로 렌더링합니다. 해당 렌더러는 <a href=\"/docs/react-dom.html\">최상위 레벨 <code class=\"gatsby-code-text\">ReactDOM</code> API</a>에 구현되어 있으며 npm에서 <a href=\"https://www.npmjs.com/package/react-dom\" target=\"_blank\" rel=\"nofollow noopener noreferrer\"><code class=\"gatsby-code-text\">react-dom</code></a> 패키지로 받을 수 있습니다. 또한 스탠드얼론 브라우저에서 <code class=\"gatsby-code-text\">react-dom.js</code>를 통해 전역 <code class=\"gatsby-code-text\">ReactDOM</code> 키워드로 접근할 수 있습니다.</li>\n<li><a href=\"https://github.com/facebook/react/tree/main/packages/react-native-renderer\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">React Native Renderer</a>는 React 컴포넌트를 네이티브 뷰로 렌더링합니다. 해당 렌더러는 React 네이티브 내부에서 사용됩니다.</li>\n<li><a href=\"https://github.com/facebook/react/tree/main/packages/react-test-renderer\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">React Test Renderer</a>는 React 컴포넌트를 JSON 형식으로 렌더링합니다. 해당 렌더러는 <a href=\"https://facebook.github.io/jest\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Jest</a>의 <a href=\"https://facebook.github.io/jest/blog/2016/07/27/jest-14.html\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Snapshot 테스트</a>에 사용되며, npm에서 <a href=\"https://www.npmjs.com/package/react-test-renderer\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">react-test-renderer</a> 패키지로 받을 수 있습니다.</li>\n</ul>\n<p>언급한 것 외에 공식적으로 지원하는 렌더러는 <a href=\"https://github.com/facebook/react/tree/main/packages/react-art\" target=\"_blank\" rel=\"nofollow noopener noreferrer\"><code class=\"gatsby-code-text\">react-art</code></a>로 유일합니다. <a href=\"https://github.com/reactjs/react-art\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">GitHub 저장소</a>에서 분리되어 있었지만, 현재는 메인 소스 트리로 옮겨졌습니다.</p>\n<blockquote>\n<p><strong>주의</strong></p>\n<p><a href=\"https://github.com/facebook/react/tree/main/packages/react-native-renderer\" target=\"_blank\" rel=\"nofollow noopener noreferrer\"><code class=\"gatsby-code-text\">react-native-renderer</code></a>는 React 네이티브 구현체와 상호작용하는 매우 얇은 레이어입니다. 네이티브 뷰를 관리하는 실제 플랫폼 관련 코드는 <a href=\"https://github.com/facebook/react-native\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">React 네이티브 저장소</a>에 존재합니다.</p>\n</blockquote>\n<h3 id=\"reconcilers\"><a href=\"#reconcilers\" aria-hidden class=\"anchor\"><svg aria-hidden=\"true\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>재조정자 </h3>\n<p>React DOM과 React 네이티브 같은 매우 다른 경우를 포함하여, 렌더러들은 상당 부분 동작 방식을 서로 공유해야 합니다. 특히 <a href=\"/docs/reconciliation.html\">재조정</a> 알고리즘의 경우는 더욱 그렇습니다. 이를 통해 렌더링, 사용자 정의 컴포넌트, 상태, 생명주기 메서드, 레퍼런스가 플랫폼에 상관없이 일관적으로 작동해야 합니다.</p>\n<p>이를 해결하기 위해 서로 다른 렌더러들은 몇 가지의 코드를 공유하며, 해당 부분을 ‘재조정자’라고 부릅니다. <code class=\"gatsby-code-text\">setState()</code>와 같은 함수가 수정되어야 할 때, 재조정자는 트리에 있는 컴포넌트의 <code class=\"gatsby-code-text\">render()</code> 함수를 호출한 후 마운트나 업데이트, 혹은 마운트해제를 실시합니다.</p>\n<p>재조정자는 현재로서는 어떠한 public API도 존재하지 않기 때문에 개별적인 패키지로서 존재하지 않습니다. 대신 React DOM과 React 네이티브 같은 렌더러에 개별적으로 사용됩니다.</p>\n<h3 id=\"stack-reconciler\"><a href=\"#stack-reconciler\" aria-hidden class=\"anchor\"><svg aria-hidden=\"true\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>스택 재조정자 </h3>\n<p>‘스택’ 재조정자는 React 15 이하에서 구현되었습니다. 현재는 더 이상 지원하지 않지만, <a href=\"/docs/implementation-notes.html\">다음 섹션</a>에서 자세한 사항을 살펴볼 수 있습니다.</p>\n<h3 id=\"fiber-reconciler\"><a href=\"#fiber-reconciler\" aria-hidden class=\"anchor\"><svg aria-hidden=\"true\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>파이버 재조정자 </h3>\n<p>‘파이버’ 재조정자는 스택 재조정자에서 발생한 문제를 해결하고 몇 가지 오래된 오류를 고치는 데에 중점을 두기 위해 고안되었습니다. 해당 재조정자는 React 16부터 기본적으로 사용됩니다.</p>\n<p>해당 재조정자의 목표는 다음과 같습니다.</p>\n<ul>\n<li>중단 불가능한 작업을 청크로 분할하는 기능</li>\n<li>진행 중인 작업의 우선 순위 지정, 재배치 및 재사용에 관한 기능</li>\n<li>React의 레이아웃을 지원하기 위한 계층별 배치 순서 처리 기능</li>\n<li><code class=\"gatsby-code-text\">render()</code> 함수로부터의 다중 요소 반환 기능</li>\n<li>에러 경계에 대한 향상된 지원</li>\n</ul>\n<p>React 파이버 구조에 대해 <a href=\"https://github.com/acdlite/react-fiber-architecture\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">여기</a>와 <a href=\"https://medium.com/react-in-depth/inside-fiber-in-depth-overview-of-the-new-reconciliation-algorithm-in-react-e1c04700ef6e\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">여기</a>를 통해 더 자세히 확인할 수 있습니다. 파이버 재조정자는 React 16과 함께 제공되지만, 비동기 기능은 아직 기본적으로 활성화되지 않습니다.</p>\n<p>해당 소스 코드는 <a href=\"https://github.com/facebook/react/tree/main/packages/react-reconciler\" target=\"_blank\" rel=\"nofollow noopener noreferrer\"><code class=\"gatsby-code-text\">packages/react-reconciler</code></a>에서 확인할 수 있습니다.</p>\n<h3 id=\"event-system\"><a href=\"#event-system\" aria-hidden class=\"anchor\"><svg aria-hidden=\"true\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>이벤트 시스템 </h3>\n<p>React는 네이티브 이벤트 위에 레이어를 구현하여 크로스 브라우저 차이를 제거했습니다. 해당 코드는 <a href=\"https://github.com/facebook/react/tree/main/packages/react-dom/src/events\" target=\"_blank\" rel=\"nofollow noopener noreferrer\"><code class=\"gatsby-code-text\">packages/react-dom/src/events</code></a>에서 확인할 수 있습니다.</p>\n<p>해당 코드에 대한 상세한 설명은 다음의 <a href=\"https://www.youtube.com/watch?v=dRo_egw7tBc\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">영상</a> (66분)을 참고하세요.</p>\n<h3 id=\"what-next\"><a href=\"#what-next\" aria-hidden class=\"anchor\"><svg aria-hidden=\"true\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>다음 내용은? </h3>\n<p><a href=\"/docs/implementation-notes.html\">다음 섹션</a>을 읽고 재조정자에 대한 pre-React 16 구현에 대해 더 자세하게 배워보세요. 새로운 재조정자에 대한 설명은 아직 작성되지 않았습니다.</p>","frontmatter":{"title":"Codebase Overview","next":"implementation-notes.html","prev":"how-to-contribute.html"},"fields":{"path":"content/docs/codebase-overview.md","slug":"docs/codebase-overview.html"}}},"pageContext":{"slug":"docs/codebase-overview.html"}},"staticQueryHashes":[]}