Context API에 대해 알아보자

2024. 5. 23. 20:34·Stack/React
반응형

Context API가 무엇인가?

context는 리액트에서 컴포넌트끼리 어떠한 값을 공유하는 기능이다.

보통 전역적(global)로 사용되지만, 꼭 전역적으로 사용할 필요는 없다.

Context API를 왜 사용하는가?

React에서 컴포넌트에서 값을 props로 넘겨주면 생기는 props drill현상이 있다.

import React from 'react';

// 최상위 컴포넌트
function App() {
  const username = 'johndoe';  // 사용자 이름을 상태로 관리하거나 props로 받을 수 있습니다.

  return (
    <div>
      <h1>Level 1</h1>
      <LevelTwo username={username} />
    </div>
  );
}

export default App;

// 두 번째 컴포넌트
function LevelTwo({ username }) {
  return (
    <div>
      <h2>Level 2</h2>
      <LevelThree username={username} />
    </div>
  );
}

// 세 번째 컴포넌트
function LevelThree({ username }) {
  return (
    <div>
      <h3>Level 3</h3>
      <LevelFour username={username} />
    </div>
  );
}

// 네 번째 컴포넌트
function LevelFour({ username }) {
  return (
    <div>
      <h4>Level 4</h4>
      <LevelFive username={username} />
    </div>
  );
}

// 최하위 컴포넌트
function LevelFive({ username }) {
  return <div>Level 5: {username}</div>;
}

이런 방식의 코드작성은 다음과 같은 문제를 발생시킨다.

  • 코드 가독성이 떨어진다
  • 코드의 유지보수가 어렵다
  • 컴포넌트의 재사용성 감소
  • 불필요한 리렌더링 발생
  • 복잡도 결합도 증가

이러한 문제들이 발생하기 때문에 Context API 라는게 존재한다.

Context API는 어떻게 사용하는가?

NewContextProvider

"use client";

import { createContext, useState } from "react";

// context api에 값들의 타입을 정의
interface ThemeContextType {
  theme: string;
  ChangeTheme: () => void;
}

// context api 선언
export const ThemeContext = createContext<ThemeContextType | undefined>(undefined);

// Provider 을 통해 별도로 관리
export const NewContextProvider = ({ children }: { children: React.ReactNode }) => {
  const [theme, setTheme] = useState("dark");

  const ChangeTheme = () => {
    setTheme(theme === "dark" ? "light" : "dark");
  };

  return <ThemeContext.Provider value={{ theme, ChangeTheme }}>{children}</ThemeContext.Provider>;
};

page

import { NewContextProvider } from "./components/NewContextProvider";
import SampleButton from "./components/SampleButton";

const ContextApi = () => {
  return (
    <NewContextProvider>
      <SampleButton />
    </NewContextProvider>
  );
};

export default ContextApi;

SampleButton

"use client";

import { useContext } from "react";
import { ThemeContext } from "./NewContextProvider";
import styles from "./sampleButton.module.css";

const SampleButton = () => {
  const context = useContext(ThemeContext);

  if (!context) {
    return <div>Theme context not available</div>;
  }

  const { theme, ChangeTheme } = context;

  return (
    <div className={styles.box} style={theme === "dark" ? { background: "black" } : { background: "white" }}>
      <button className={styles.button} onClick={ChangeTheme}>
        button
      </button>
    </div>
  );
};

export default SampleButton;

sampleButton.module.css

.box {
  width: 200px;
  height: 200px;
  display: flex;
  justify-content: center;
  align-items: center;
}

.button {
  width: 100px;
  height: 100px;
}

전역을 관리하는 Redux, Recoil 과의 차이

1. Context API

  • 목적과 사용법: React에서 기본적으로 제공하는 Context API는 컴포넌트 트리를 통해 데이터를 "전달"하는 것을 목적으로 합니다. 주로 테마, 로케일 설정, UI 관련 상태 등 비교적 정적인 데이터를 컴포넌트 간에 공유할 때 사용됩니다.
  • 장점: 별도의 라이브러리 설치 없이 사용할 수 있으며, 간단한 전역 상태 관리에 적합합니다.
  • 단점: 대규모 상태 관리에는 적합하지 않으며, Context를 사용할 때 컴포넌트의 리렌더링 최적화가 필요할 수 있습니다.

2. Redux

  • 목적과 사용법: Redux는 예측 가능한 상태 컨테이너로, 애플리케이션의 상태를 중앙에서 관리하는 데 초점을 맞춥니다. Redux는 'actions'와 'reducers'를 사용하여 애플리케이션 상태의 업데이트 로직을 구성합니다.
  • 장점: 큰 규모의 애플리케이션에 적합하며, 시간 여행 디버깅, 상태 변경 로그, 중앙 집중식 상태 관리 등 강력한 기능을 제공합니다.
  • 단점: 보일러플레이트 코드가 많고, 초기 설정이 복잡할 수 있습니다. 상태 업데이트 로직이 집중적으로 관리되므로 복잡도가 증가할 수 있습니다.

3. Recoil

  • 목적과 사용법: Recoil은 React의 기능과 더 잘 통합되는 것을 목표로 하는 상태 관리 라이브러리입니다. 'atoms'과 'selectors'를 중심으로 구축되어, 각 컴포넌트가 필요한 상태에 대해서만 구독하도록 설계되었습니다.
  • 장점: 컴포넌트가 필요한 데이터에 대해서만 구독하므로 불필요한 리렌더링을 줄일 수 있습니다. React의 함수형 컴포넌트와 훅에 잘 맞는 설계를 가지고 있습니다.
  • 단점: 아직은 새롭고, 다소 실험적인 라이브러리이므로 아직 널리 채택되지 않았습니다. 기존에 잘 정립된 라이브러리들에 비해 커뮤니티 지원이 상대적으로 부족할 수 있습니다.
반응형

'Stack > React' 카테고리의 다른 글

useMemo 알아보기  (5) 2024.08.07
custom hook 만드는법 알아보기  (0) 2024.08.04
useRef 알아보기  (2) 2024.08.01
useState 알아보고 정리하기  (1) 2024.07.31
useEffect 알아보기  (2) 2024.07.30
'Stack/React' 카테고리의 다른 글
  • custom hook 만드는법 알아보기
  • useRef 알아보기
  • useState 알아보고 정리하기
  • useEffect 알아보기
WHITE_FROST
WHITE_FROST
개발공부리뷰블로그
    반응형
  • WHITE_FROST
    하얀하얀IT
    WHITE_FROST
  • 전체
    오늘
    어제
    • 분류 전체보기 (119)
      • Stack (43)
        • Next.js (7)
        • React (12)
        • React-Native (15)
        • TypeScript (0)
        • Python (2)
        • JavaScript (2)
        • Android (1)
        • DB (2)
        • JAVA (1)
      • Obsidian (1)
      • AI (3)
      • AI Tools (0)
      • Tools (0)
      • Mac (0)
      • Error (7)
      • 알고리즘 정리 (6)
      • 알고리즘 문제풀이 (46)
      • 공부일상 (4)
      • 개발 도구 & 라이브러리 (0)
      • 정보처리기사 (0)
      • 기타 (6)
      • Tip (2)
  • 블로그 메뉴

    • 홈
    • 태그
    • 미디어로그
    • 위치로그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    티스토리챌린지
    mongodb cloud
    React-Native cli
    d1
    React Hooks
    SWEA
    react
    리액트네이티브
    mongoDB Atlas
    ios
    Python
    java
    백준
    D2
    프로그래머스
    react-native-maps
    javascript
    error
    boj
    Next.js
    코딩테스트
    코테준비
    reactnative
    오블완
    코테
    Expo
    hooks
    ReactHook
    react-native
    알고리즘
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.5
WHITE_FROST
Context API에 대해 알아보자
상단으로

티스토리툴바