** Redux Toolkit을 사용한 상태 관리 구조**
이번 프로젝트는 Redux Toolkit을 사용하여 애플리케이션의 상태를 효율적으로 관리한다
2.1. ~Slice.ts 파일들 (boardsSlice, loggerSlice, modalSlice)
- 역할: 애플리케이션의 상태를 기능 단위로 분할하여 관리하는 'Slice(슬라이스)' 를 정의한다. 각 Slice는 특정 도메인의 상태(State), 리듀서(Reducer), 액션(Action)을 하나로 묶어 관리하는 것이다.
boardsSlice: 게시판(Board), 리스트(List), 태스크(Task)와 같은 핵심 데이터를 관리한다.loggerSlice: 애플리케이션 내의 사용자 활동 로그를 저장한다.modalSlice: 모달창의 상태와 모달에 표시될 데이터를 관리한다.
- 핵심 함수:
createSlicename: Slice의 고유 이름 (예: 'boards')이다.initialState: 해당 Slice의 초기 상태 값이다.reducers: 상태를 어떻게 변경할지를 정의하는 함수들의 모음이다. (현재 코드에서는 비어있지만, 이곳에 상태 변경 로직이 추가된다.)
2.2. reducer.ts (Root Reducer)
- 역할: 여러 개로 나뉜 Slice의 Reducer들을 하나로 통합하여, Redux 스토어가 관리할 수 있는 단일 루트 리듀서(Root Reducer)를 만드는 것이다.
- 구조: 각 Slice의 Reducer를 키(key)와 값(value) 형태로 매핑한다. 이 키는 나중에 상태를 조회할 때 사용된다. (예:
state.logger,state.boards)
2.3. store.ts (Redux Store)
- 역할: 애플리케이션의 전역 상태 저장소(Store)를 생성하고 설정하는 것이다.
- 핵심 함수:
configureStorereducer:reducer.ts에서 만든 루트 리듀서를 받아 스토어를 생성한다.
- 타입 추론:
RootState와AppDispatch타입을store로부터 자동으로 추출하여, TypeScript 환경에서 타입 안정성을 보장한다.
2.4. hooks.ts (Typed Hooks)
- 역할: Redux의 기본
useSelector와useDispatch훅에 TypeScript 타입을 적용한 커스텀 훅(Custom Hook)을 만드는 것이다.useTypedSelector: 상태를 조회할 때마다 타입을 지정할 필요 없이, 자동으로RootState타입을 추론해준다.useTypedDispatch:dispatch함수가 어떤 액션을 받을 수 있는지AppDispatch타입을 통해 알 수 있게 한다.
결론: 이 코드 구조는 상태 로직을 기능별로 분리(Slice)하고, 이를 하나로 합쳐(Reducer) 전역 스토어(Store)를 만든 후, 타입이 지정된 훅(Hook)을 통해 컴포넌트에서 안전하고 편리하게 상태를 사용하기 위한 것이다.
3. 주요 개념 및 질문 답변
3.1. Vite란 무엇인가?
Vite(비트)는 차세대 프론트엔드 개발 도구(Build Tool)이다. 기존의 Create React App(CRA)과 같은 도구들이 가진 개발 서버의 느린 시작 속도와 빌드 시간을 혁신적으로 개선했다.
- 핵심 특징:
- 빠른 개발 서버: 브라우저가 요청하는 파일을 즉시 변환하여 제공하는 Native ES Module 방식을 사용한다. 이 덕분에 프로젝트 크기가 커져도 개발 서버 시작 속도가 매우 빠르다.
- 빠른 HMR (Hot Module Replacement): 코드 수정 시, 전체 파일을 다시 빌드하지 않고 변경된 모듈만 교체하여 화면에 즉각적으로 반영한다.
- 최적화된 빌드: 프로덕션(배포용) 빌드 시에는 Rollup이라는 번들러를 사용하여 코드를 최적화하고 하나 이상의 파일로 묶어준다.
3.2. npm vs npx 차이
npm (Node Package Manager)
- 역할: Node.js 패키지(라이브러리)를 설치하고 관리하는 도구이다.
- 주요 명령어:
npm install,npm uninstall,npm update. - 동작 방식:
package.json에 명시된 라이브러리를node_modules폴더에 설치하고, 프로젝트의 의존성을 관리한다.
npx (Node Package eXecute)
- 역할: 패키지를 실행하는 도구이다.
- 동작 방식: 로컬
node_modules에 설치된 패키지나, 설치되지 않은 패키지를 임시로 다운로드하여 딱 한 번 실행하고 지운다. - 주요 사용 예:
npx create-react-app my-app처럼, 프로젝트를 초기 설정하는 CLI 도구를 설치 없이 바로 실행할 때 매우 유용하다.
3.3. 상태 관리: props vs Redux (및 기타 라이브러리)
Props (Properties)
- 역할: React의 기본 데이터 전달 방식이다. 부모 컴포넌트에서 자식 컴포넌트로 데이터를 전달하는 단방향 데이터 흐름을 따른다.
- 문제점 (Props Drilling): 컴포넌트 구조가 깊어지면, 특정 자식에게 데이터를 전달하기 위해 중간의 여러 컴포넌트를 거쳐야 하는
Props Drilling현상이 발생하여 코드 유지보수가 어려워진다.
Redux (및 Zustand, Recoil, Context API 등)
- 역할: 전역 상태 관리 라이브러리이다. 애플리케이션의 상태를 컴포넌트와 분리된 전역 공간(Store)에 저장하고, 어떤 컴포넌트에서든 직접 해당 상태를 가져와 사용할 수 있게 한다.
- 장점:
- Props Drilling 해결: 깊은 구조의 컴포넌트에도 데이터를 쉽게 전달할 수 있다.
- 상태 중앙화: 상태 변경 로직이 한곳에 모여있어 예측 가능하고 디버깅이 용이하다.
- 차이점:
- React Context API: React에 내장된 기능으로, 간단한 전역 상태 관리에 적합하다. 하지만 상태가 자주 변경되면 렌더링 성능 이슈가 발생할 수 있다.
- Redux: 가장 오래되고 안정적인 라이브러리이다. 복잡한 상태 로직 관리에 강력하지만, 초기 설정이 다소 복잡했다. (Redux Toolkit이 이 단점을 크게 개선했다.)
- Zustand, Recoil: Redux보다 훨씬 간결한 문법으로 상태 관리를 할 수 있는 최신 라이브러리들이다.
3.4. Slice, Reducer, 그리고 redux.ts(Store)
- Reducer (리듀서): "현재 상태(State)와 액션(Action) 객체를 받아, 새로운 상태를 반환하는 순수 함수"이다. Redux의 핵심 원칙으로,
(state, action) => newState형태를 가진다. - Slice (슬라이스): Redux Toolkit에서 도입한 개념이다. 기존 Redux에서는
State,Action,Reducer를 별도의 파일로 분리하여 관리했지만, Slice는 이들을 하나의 기능 단위로 묶어 관리한다. 코드 구조가 훨씬 직관적이고 보일러플레이트가 줄어든다. store.ts(Store): 애플리케이션의 모든 상태가 저장되는 단 하나의 저장소이다. 각 Slice에서 만들어진 Reducer들을 하나로 합쳐 Store를 생성한다. 컴포넌트는 이 Store에 접근하여 상태를 읽거나, 변경을 요청(dispatch)한다.
4. 설치된 라이브러리 설명
@reduxjs/toolkit: Redux를 더 쉽고 효율적으로 사용하기 위한 공식 도구 모음이다.createSlice,configureStore등 보일러플레이트를 줄여주는 유용한 기능들을 제공한다.redux: Redux의 핵심 라이브러리이다. (Toolkit에 포함됨)react-redux: React와 Redux를 연결해주는 라이브러리이다.Provider,useSelector,useDispatch같은 도구를 제공하여 React 컴포넌트에서 Redux Store를 사용할 수 있게 한다.clsx: 여러 CSS 클래스 이름을 조건부로 쉽게 조합할 수 있게 도와주는 유틸리티 라이브러리이다.@vanilla-extract/css: 'Zero-runtime' CSS-in-JS 라이브러리이다. TypeScript/JavaScript로 스타일을 작성하면, 빌드 시점에 정적인 CSS 파일로 추출되어 성능에 이점이 있다.@vanilla-extract/css-utils:vanilla-extract사용 시 자주 쓰이는 유틸리티 함수들을 제공한다.@vanilla-extract/vite-plugin: Vite 환경에서vanilla-extract를 사용할 수 있도록 해주는 플러그인이다.
react-icons: Font Awesome, Material Icons 등 유명 아이콘들을 React 컴포넌트처럼 쉽게 사용할 수 있게 해주는 라이브러리이다.uuid: 고유한 ID(Universally Unique Identifier)를 생성해주는 라이브러리이다. 게시판, 리스트, 태스크 등 고유 ID가 필요한 항목에 사용된다.react-beautiful-dnd: React 애플리케이션에서 드래그 앤 드롭 기능을 쉽게 구현할 수 있게 해주는 라이브러리이다. (단, 현재 React 18+ 버전과 호환성 이슈가 있어@dnd-kit/core가 대안으로 많이 사용된다.)
'Programmers' 카테고리의 다른 글
| [53일차]컴포넌트 테스트와 forwardRef 정리 (0) | 2025.11.24 |
|---|---|
| [51일차]React 프로젝트 생성: Create React App vs Vite (0) | 2025.11.21 |
| [46일차]리액트(React)의 Props에 대하여 (0) | 2025.11.14 |
| [45일차]리액트(React) 컴포넌트와 상태 관리. (0) | 2025.11.13 |
| [44일차]리액트(React) 핵심 개념 시작 정리. (0) | 2025.11.12 |