개념
사용자 인터페이스를 구축하기 위한 선언적이고 효율적이며 유연한 JavaScript 라이브러리. “컴포넌트”라고 불리는 작고 고립된 코드의 파편을 이용하여 복잡한 UI를 구성하도록 돕는다.
장점
virtual DOM을 사용해서 어플리케이션의 성능을 향상 시킨다.
서버, 클라이언트 사이드 렌더링 지원이 가능하다.
컴포넌트의 가독성이 높고 간단하여 유지보수가 쉽다.
다른 프레임워크와 혼용도 가능하다.
컴포넌트
레고 블록과 같이 작은 단위로 만들어서 그것들을 조립하듯이 개발하는 방법. 캡슐화, 확장성, 결합성, 재사용성과 같은 장점이 있다.
React는 Virtual DOM을 활용해 실제 DOM에 접근하여 조작하는 대신, 이를 추상화한 자바스크립트 객체를 구성하여 사용한다. 즉 동적으로 데이터가 변화했을 때 직접적으로 DOM을 조작하는 것이 아니라 DOM의 사본이라고 할 수 있는 새로운 Virtual DOM을 생성한다. 그리고 새로 생성된 Virtual DOM과 이전에 저장된 Virtual DOM을 비교해 변경된 부분의 DOM 만을 변경한다. 이 과정을 조화 과정(reconciliation)이라고 한다.
이 때 virtual DOM을 갱신하는 방법은 setState() 메서드를 호출하는 방법과, Redux의 경우처럼 store가 변하면 다시 최상위 컴포넌트의 render() 함수를 호출해서 갱신하는 2가지 방법이 있다.

state는 immutable(불변성)을 유지해야하기 때문이다.
리액트에서는 props나 state의 값이 바뀌면 화면이 다시 그려지는 렌더링이 일어나게 된다. 이런 componet의 state는 setState를 이용해서 바꾸어야 한다. 직접 값을 바꾸게 되면 리액트가 render 함수를 호출하지 않아 렌더링이 되지않는 경우도 있어 setState를 통해서 바꾸는 것만 렌더링이 된다. 즉 이 말은 setState를 통해 바꿔야만 화면에 표시된다는 말이다.
props를 오로지 하위 컴포넌트로 전달하는 용도로만 쓰이는 컴포넌트들을 거치면서 React Component 트리의 한 부분에서 다른 부분으로 데이터를 전달하는 과정이다.
로직의 재사용 가능, 관리가 쉽다.
로직을 한 곳으로 모을수 있어서 가독성이 좋다.
Virtual DOM은 실제 DOM 변화를 최소화 시켜주는 역할을 하며 실제 DOM을 직접 바꾸는 것보다 시간 복잡도가 현저히 낮아진다.
브라우저는 HTML 파일을 스크린에 보여주기 위해 DOM 노드 트리 생성, 렌더트리 생성, 레이아웃, 페인팅 과정을 거친다. DOM 노드는 HTML의 각 엘리먼트와 연관되어 있기 때문에 HTML 파일에 20개의 변화가 생기면 DOM 노드가 변경되고 그 이후의 과정역시 20회 다시 이루어 진다. 작은 변화에도 매우 복잡한 과정들이 다시 실행되기 때문에 DOM 변화가 잦을 경우 성능이 저하된다.
Virtual DOM은 뷰에 변화가 있다면, 그 변화가 실제 DOM에 적용되기 전에 Virtual DOM에 적용시키고 최종 결과만 실제 DOM에 전달한다.
따라서 20개의 변화가 있다면 Virtual DOM은 변화된 부분만 가려내어 실제 DOM에 전달하고 실제 DOM은 그 변화를 1회로 인식하여 단 한번의 렌더링 과정만 거치게 된다.
JSX의 확장 문법으로 React 엘리먼트를 생성하는 언어. 자바스크립트 코드를 HTML처럼 표현할 수 있기 때문에 용이한 개발이 가능.
useMemo는 렌더링을 할 때마다 메모리가 많이 소모되는 값은 계산하지 않고 functional components를 최적화하는데 도움을 준다. dependency 리스트를 생성해 그 중 하나가 변경되면 바로 값을 계산한다.
// useMemo를 사용한 예제
import React, { useMemo } from "react";
const computeValueFromProp = (prop) => {
// 에너지가 많이 소모되는 계산이 일어남
}
const ComponentThatRendersOften = ({ prop1, prop2 }) => {
const valueComputedFromProp1 = useMemo(() => {
return computeValueFromProp(prop1)
}, [prop1]);
// prop1이 변경될 때만 값을 계산
return (
<>
<div >{valueComputedFromProp1}</div>
<div >{prop2}</div>
</>
);
};
useCallback도 useMemo와 비슷합니다. useMemo는 값을 기억하는 대신 useCallback은 함수를 기억합니다.
React는 상태를 immutable 하게 변경하기 때문에 상태 객체의 주소값이 변경되면 상태가 변화되었다는 것을 알아챌 수 있다.
MobX
Apollo
- GraphQL을 기반으로 한다.
useEffect 코드 내부에서 return 하는 익명 함수를 작성하는 방법으로 componentWillUnmount를 구현할 수 있다.
useEffect(() => {
console.log('컴포넌트가 화면에 나타남');
return () => {
console.log('컴포넌트가 화면에서 사라짐');
};
}, []);