리액트의 상태 관리
- 애플리케이션이 커짐에 따라 상태가 어떻게 구성되고 구성 요소 간에 데이터가 어떻게 흐르는 지에 대해 더 의도적으로 생각하는 것은 도움이 된다.
- 중복되거나 중복된 상태는 버그의 일반적인 원인이다.
Redux
- 리덕스는 자바스크립트 애플리케이션에서 상태 관리를 간편하게 하기 위해 사용하는 대표적인 라이브러리 중 하나이다. 특히, 리액트와 함께 자주 사용되지만 리덕스는 리액트에 한정되지 않고 모든 자바스크립트 애플리케이션에서 사용할 수 있다.
리덕스의 핵심 개념
- 스토어
- 애플리케이션의 상태를 담고 있는 객체이다. 스토어는 단 하나만 존재하며, 이 곳에 애플리케이션의 모든 상태가 저장된다.
- 액션
- 상태를 변화시키기 위한 의도를 나타내는 객체이다. 액션은 ‘type’ 이라는 속성을 필수적으로 가져야 하며, 이 외에도 상태 변화를 위한 추가 데이터를 포함할 수 있다.
- 리듀서
- 액션을 받아 상태를 업데이트하는 함수이다. 이전 상태와 액션을 인자로 받아 새로운 상태를 반환하는 순수 함수이다.
- 디스패치
- 액션을 스토어에 전달하는 함수이다. 디스패치된 액션은 리듀서를 통해 상태를 업데이트되게 한다.
- 구독
- 상태가 변경될 때마다 특정 동작을 실행하도록하는 함수이다. 리덕스는 상태가 변경되면 자동으로 리액트 컴포넌트를 다시 렌더링하게 할 수 있다.
리덕스의 작동 원리
graph TD;
A[사용자의 이벤트 발생] --> B[특정 액션 생성];
B --> C[디스패치];
C --> D[리듀서로 전달];
D --> E[전달받은 액션 + 현재 상태];
E --> F[새로운 상태가 스토어에 저장];
F --> G[스토어 상태 업데이트, 해당 상태 구독 시 컴포넌트 재렌더링]
리덕스의 장점
- 예측 가능하다
- 상태 변화가 예측 가능하게 이루어지므로 애플리케이션의 동작을 쉽게 파악할 수 있다.
- 중앙 집중식 관리
- 모든 상태가 하나의 스토어에서 관리되기 때문에 상태를 추적하기 쉽다.
- 디버깅 용이성
- 리덕스 개발 도구를 통해 상태 변화 과정을 시각적으로 확인할 수 있어 디버깅이 용이하다.
- 유연성
- 미들웨어를 활용해 비동기 작업이나 로직, 에러 처리 등을 쉽게 추가할 수 있다.
Redux-saga
- 리덕스 애플리케이션에서 비동기 작업을 관리하기 위한 미들웨어
- 리덕스 자체는 동기적인 상태 관리에 초점을 맞추기 때문에 비동기 로직을 처리하는 데 추가적인 도구가 필요하기 때문에 만들어졌다.
리덕스 사가의 작동 원리
graph TD;
A[특정 액션 디스패치] --> B[Watcher Saga가 감지];
B --> C[액션에 따른 Worker Saga 실행];
C --> D[비동기 작업 수행];
D --> E[수행 결과에 따라 액션 재디스패치];
E --> F[리듀서의 상태 업데이트];
Redux-saga를 사용하는 이유
- 리덕스 애플리케이션에서 비동기 작업이 복잡해질수록 단순한 상태관리에는 한계가 있다.
- 복잡한 API 호출 순서, 타이밍, 에러 처리 등의 작업이 필요한 경우 매우 유용하다.
옵저버블
- 옵저버블은 비동기 데이터 스트림을 관리하는 개념이다.
- 주로 리액티브 익스텐션 라이브러리를 통해 사용된다.
- 함수형 프로그래밍과 반응형 프로그래밍의 개념을 결합하여 데이터 흐름을 효율적으로 처리하는 도구이다.
옵저버블의 장점
- 조합성
- 여러 데이터 스트림을 조합하거나 변환할 수 있어 복잡한 비동기 로직을 간결하게 표현할 수 있다.
- 유연성
- 옵저버블은 데이터를 처리하는 시점을 제어할 수 있어 실시간 데이터 흐름을 다루는 데 유리하다.
- 함수형 프로그래밍
- 순수 함수와 연산자를 사용하여 데이터를 처리하는 함수형 프로그래밍 스타일 지원한다.
옵저버블과 프로미스 비교
- 프로미스
- 단일 비동기 작업의 결과를 나타낸다. 작업이 완료되면 하나의 값을 반환한다.
- 옵저버블
- 여러 비동기 이벤트의 스트림을 나타낸다. 여러 개의 값을 발행할 수 있으며, 데이터 흐름을 제어할 수 있다.
Context-API
- 전역적으로 데이터를 관리하고 여러 컴포넌트 간에 쉽게 데이터를 공유할 수 있도록 도와주는 기능
- 일반적으로 리액트에서는 데이터가 부모에서 자식 컴포넌트로 props를 통해 전달하지만 깊게 중첩된 컴포넌트 구조에서는 이 방식이 비효율적이기 때문에 사용한다.
Context API의 주요 개념
- Context
- 전역적으로 관리하고 있는 데이터를 저장하는 컨테이너 역할.
- React.createContext() 함수를 사용하여 생성된다.
- 생성된 Context는 Provider과 Consumer을 통해 데이터를 주고 받습니다.
- Provider
- Context에서 제공하는 컴포넌트로 데이터를 전달하는 역할을 한다. Provider은 컴포넌트 트리에서 Context를 구독하는 하위 컴포넌트에게 값을 전달한다. 이 때 Value 속성을 통해 전달할 데이터를 정의한다.
- Consumer
- Context에서 제공하는 또 다른 컴포넌트로 데이터를 소비하는 역할을 한다. Consumer은 Context로부터 전달된 데이터를 받아 사용하는 컴포넌트이다. 함수형 컴포넌트는 useContext 훅을 사용하여 더 간단하게 Context 데이터를 소비할 수 있다.
- useContext
- 함수형 컴포넌트에서 Context를 쉽게 사용할 수 있게 도와주는 리액트 훅이다. Consumer를 사용하는 것보다 코드가 간결해지고 직관적으로 Context에 접근할 수 있다.
Context API의 장점
- Prop Drilling 방지
- 부모에서 자식으로 일일이 ‘Props’를 전달 해야하는 번거로움을 해결할 수 있다. 이를 통해 코드가 더 간결하고 관리하기 쉬워진다.
- 전역 상태 관리
- Context API를 사용하면 애플리케이션 전역에서 상태를 관리하고 필요한 곳에서 쉽게 접근할 수 있다. 간단한 상태 관리에서 리덕스 같은 라이브러리 없이도 Context API만으로 충분히 해결할 수 있다.
- 재사용성
- Context를 통해 전역적으로 데이터를 관리하면 특정 상태나 설정을 여러 컴포넌트에서 재사용할 수 있다
클래스형과 함수형의 차이
클래스형 컴포넌트
- ES6을 사용하여 정의된다.
- 상태와 라이프사이클 메서드를 사용하여 컴포넌트의 동작을 제어한다.
- this 키워드를 사용해 상태 및 메서드에 접근한다.
- 장점
- 상태와 라이프사이클 관리
- 클래스형 컴포넌트는 상태를 관리하고, 라이프사이클 메서드를 사용하여 컴포넌트의 생명주기를 제어할 수 있다.
- 오래된 프로젝트에서 많이 사용
- 리액트 초기에는 상태 관리와 라이프사이클 메서드를 사용해야 할 때 클래스형 컴포넌트가 필수적이다.
- 상태와 라이프사이클 관리
함수형 컴포넌트
- 단순한 자바스크립트 함수로 정의
- React Hooks를 사용하여 상태 및 라이프사이클을 관리할 수 있다.
- useState, useEffect 등 다양한 훅을 사용하여 클래스형 컴포넌트에서 사용했던 기능들을 함수형 컴포넌트에서 쉽게 구현할 수 있다.
- 장점
- 간결한 코드
- this 피워드가 필요하지 않아 코드 작성이 더 쉽다.
- React Hooks의 도입
- 훅을 사용해 상태 관리, 사이드 이펙트 처리 등을 할 수 있으며, 함수형 컴포넌트에서도 클래스형 컴포넌트의 기능을 모두 사용할 수 있다.
- 재사용성 및 테스트 용이성
- 함수형 컴포넌트는 일반 함수처럼 동작하므로, 재사용성과 테스트가 더 용이하다.
- 간결한 코드
라이프사이클 메소드
라이프사이클의 단계
- 마운팅
- 컴포넌트가 DOM에 처음 추가될 때 호출되는 메소드
- 업데이트
- 컴포넌트가 업데이트될 때 호출되는 메소드
- 언마운팅
- 컴포넌트가 DOM에서 제거될 때 호출되는 메소드
출처
'TIL' 카테고리의 다른 글
WAS ; Web Application Server (0) | 2024.11.13 |
---|---|
AMP (Accelerated Mobile PAges) (0) | 2024.08.26 |
자바스크립트의 ES6 (0) | 2024.08.21 |
자바스크립트의 this (0) | 2024.08.20 |
자바스크립트의 타입 (0) | 2024.08.19 |