Context API가 뭔지 본격적으로 알아보기 전에 상태 관리부터 알아보자!
🧐 상태 관리가 왜 필요할까?
이 질문에 답하기 전에 '상태'가 뭔지 정의해보자.
웹 어플리케이션에서 상태로 분류될 수 있는 것들은 다음과 같다.
1. UI에서의 상태
2. URL에서의 상태
3. 폼(Form)에서의 상태
4. 서버에서 가져온 값의 상태
이와 같은 상태가 애플리케이션에 존재할 때, 전체적으로 관리해야 할 상태가 있다고 가정해보면 그 상태에 따라 다양한 요소들이 알맞은 UI를 보여줘야 한다.
상태가 유효한 범위를 제한하고, 상태의 변화에 따라 변경되어야 하는 자식 요소들이 상태 변화를 어떻게 감지할지 등다양한 상태 관리가 필요해짐
에 따라 현대 웹 애플리케이션에서는 이러한상태를 효율적으로 관리
하고,상태가 필요한 쪽에 빠르게 반응할 수 있도록
변화되었다.
✨ Props Drilling 장점
명시적인 값
을 사용함으로써 각 컴포넌트에서 어떤 프로퍼티를 받아서 사용하는지 명확하게 파악할 수 있다.값의 흐름
을 쉽게 추적할 수 있다. -> 디버깅 할 때 편리해진다.- 데이터가 전달되는
경로
를 알 수 있기 때문에 코드 변경이 애플리케이션의 다른 부분에 어떤 영향을 주는지 파악하는데 용이하다.
🤧 Props Drilling 단점
-> 자식 컴포넌트의 깊이가 깊어질수록 발생한다!
- 데이터의
형식을 변경해야 하는 경우
컴포넌트 계층 전체에서 업데이트 하는 것이 번거롭다.- 컴포넌트 분리 과정에서 중간 컴포넌트를 통해
불필요한 프로퍼티가 전달
될 수 있어서 불필요한 복잡성을 초래한다.누락된 프로퍼티
를 인지하기 어렵다.- 프로퍼티
이름이 변경
되면 해당 값을 추적해서 업데이트하는 것이 어려워진다.
Context API
를 출시했다!Context Provider
가 주입하는 상태를 사용할 수 있게 되었다. 🤩🧐 Context API 왜 쓸까?
🧐 Context API, 언제 써야할까?
🧐 Context API, 어떻게 써야할까?
👛 React.createContext
const MyContext = React.createContext(defaultValue);
Provider
로부터 현재 값을 읽는다.<MyContext.Provider value={/* 어떤 값 */}>
value
를 사용해야 하며 value prop을 받아서 해당 값을 하위의 컴포넌트에게 전달한다. (전달 받는 컴포넌트의 수는 제한되지 않는다.)re-render
된다.<MyContext.Consumer>
{value => /* context 값을 이용한 렌더링 */}
</MyContext.Consumer>
함수(컴포넌트)
여야 한다.createContext()
에서 정의한 defaultValue
를 갖는다.🤧 Context API 단점
- Provider Hell
- 별도의 컨벤션이 없다
- Context를 사용하게되면 Provider 내에 있어야 하고, 상위 컴포넌트 내부에 있어야 한다는 제약이 있기 때문에 컴포넌트를 재사용하기가 매우 힘들어진다
- 최상단의 state를 업데이트하면 하위의 컴포넌트가 모두 리렌더링되어 성능 문제가 있다.
useContext
는 Context API
에서 제공된 데이터를 쉽게 읽어올 수 있도록 도와주는 React Hook이다.const value = useContext(SomeContext)
✨ useContext 장점 - 왜 쓸까?
- 전역 상태 관리를 간편하게 할 수 있다.
- Provider와 Consumer를 직접 사용하기보다 훅을 사용함으로써 더 간결하고 직관적인 코드를 작성할 수 있다.
- 여러 Context를 사용하는 경우에도 간편하게 상태를 관리할 수 있다.
import { useContext } from 'react';
function Button() {
const theme = useContext(ThemeContext);
// ...