2023.02.06
컴포넌트는 리액트의 핵심 빌딩 블록 중 하나이다. 리액트에서 개발할 모든 애플리케이션은 컴포넌트라는 조각으로 구성되고, UI 구축 작업을 훨씬 쉽게 만들어준다.
리액트 컴포넌트는 선언형 프로그램 이다. 리액트의 컴포넌트기반 개발 이전에는 브라우저에서 동적으로 변하는 UI를 표현하기 위해 직접 DOM 객체를 조작하는 명령형 프로그래밍 방식으로 구현했는데, 이 명령형 프로그래밍에서의 단점을 알아보고 선언형 프로그래밍으로 넘어가게된 이유를 알아보자.
명령형
선언형
명령형으로 작성된 코드의 경우 Hello, World!를 출력하기 위해 컴퓨터가 수행하는 절차를 일일히 코드로 작성해주어야 한다.
// Hello, World! 화면에 출력하기
// 순수 javaScript 명령형 코드
const root = document.getElementById('root');
const header = document.createElement('h1');
const headerContent = document.createTextNode(
'Hello, World!'
);
header.appendChild(headerContent);
root.appendChild(header);
React 코드의 경우 내가 UI을 선언하고 render 함수를 호출하면 React가 알아서 절차를 수행해 화면에 출력해준다. 즉, 화면에 어떻게 그려야할지는 React 내부에 잘 숨겨져 추상화되어 있다.
// React 코드 (선언적인)
const header = <h1>Hello World</h1>; // jsx
ReactDOM.render(header, document.getElementById('root'));
이와같이
격리된 공간에서는 리액트와 같은 UI 라이브러리를 사용하지 않고 만드는게 더 빠르고 전체적인 번들 사이즈 측면에서도 더 효율적인 방법일수 있지만, 더 복잡한 UI 시스템에서는 관리하기가 기하급수적으로 어려워지기 때문에 선언형 프로그래밍이 관리에 용이해진다.
리액트에서 렌더링이란, 컴포넌트가 현재 props와 state의 상태에 기초하여 UI를 어떻게 구성할지 컴포넌트에게 요청하는 작업을 의미한다.
예시를 사용해 설명하자면,
렌더링이 일어나는 프로세스는 아래와 같다.

렌더링이 발생하는 경우는
리액트 앱이 실행되고 첫 렌더링이 일어나면 리액트는 컴포넌트의 루트에서 시작하여 아래쪽으로 쭉 훑으며 컴포넌트가 반환하는 JSX 결과물을 DOM 요소에 반영한다.
첫 렌더링은 자동으로 일어난 것이다. 리액트 앱이 실행되면 리액트는 전체 컴포넌트를 렌더링하고 결과물을 DOM에 반영해 브라우저상에 보여준다. 첫 렌더링을 끝난 이후에 추가로 렌더링을 트리거 하려면 상태를 변경해주어야 한다. setState 함수 외에 추가로 다루는 방법이 있기는 하지만, 추후에 배울 예정이다.
컴포넌트 상태에 변화가 생기면 리렌더링이 발생한다. 이때, 여러 상태가 변경됐다면 리액트는 이를 큐 자료구조에 넣어 순서를 관리한다.
