Redux 기초

Redux는 상태관리 라이브러리(predictable state container) 입니다. 그렇다면 여기서 말하는 state가 뭘까요? React에서는 Props와 State가 있습니다. 이 두가지를 비교하면서 state에 대해 알아보겠습니다.

Props VS State

Props

  • Props는 Properties의 줄임말입니다.
  • 부모 컴포넌트와 자식 컴포넌트가 있는 경우 데이터를 서로 주고 받아야겠죠? 두 컴포넌트간의 데이터를 주고 받을 때는 Props를 이용해야 합니다.
  • 단방향 데이터 흐름: child component에 전달되는 값 또는 method. 부모 컴포넌트에서 자식 컴포넌트로 즉 위에서 아래로만 데이터 전달이 가능합니다. 반대로 child component에서 parent component로 전달은 불가능합니다.
  • read donly: child component로 전달받은 props 값은 변하지 않습니다다. 만약 부모로부터 받은 값을 수정하고 싶다면 수정된 값으로 부모 컴포넌트에게서 다시 받아야 합니다.
  • 소스코드 예시

    • parent component
      import React, {component} from 'react';
      import Hello from './Hello';
    
      class App extends Component{
          rendor(){
              return(
                  <Hello name="홍길동"> //Hello라는 자식 컴포넌트에게 name이라는 변수를 전달한다.
              );
          }
      }
    
    • child component
      import React, {component} from 'react';
    
      class Hello extends Component{
          rendor(){
              return(
                  <div>
                      안녕하세요. {this.props.name}님!!
                  </div>
              );
          }
      }
    

State

  • 컴포넌트가 가지고 있는 값: parent component에서 child component로 보내는게 아닌 그 component 자체 안에서 데이터를 전달할 수 있습니다.
  • state는 변할 수 있습니다.
  • state가 변경되면, component가 re-rendering 됩니다. (즉, update 라이프 사이클이 수행됩니다)
  • state의 변경은 반드시 setState()함수를 이용해줘야 합니다. 절대 this.state.term = '검색어'와 같이 직접 할당할 수 없습니다.
  • 소스코드 예시
import React, {Component} from 'react';

class App extends Component{
    constructor(props){
        super(props);

        this.state = { //초기화
            term: "",
        }
    }

    rendor(){
        return(
            <div>
                <input
                    onchange={(e) => this.setState({term: e.target.value})} //수정
                >
                </input>
                <div>InputText1 {this.state.term}</div> //읽기
            </div>
        );
    }
}

그래서 Redux는 이러한 state를 관리해주는 툴입니다. 만약 아래처럼 Comments 라는 컴포넌트 안에 A라는 컴포넌트가 있고, 또 그 안에 B라는 컴포넌트가 있다고 해봅시다.

B 컴포넌트에서 Action이 발생했다면 commments 컴포넌트에 어떤 액션이 일어났는지 알려줘야합니다. 이때 Redux가 없다면 B컴포넌트 → A컴포넌트 → Comments 컴포넌트로 하나하나 단계적으로 타고 올라가야합니다.

그런데 이때 상위 컴포넌트로 이동하는게 아니라 Redux 스토어에 저장을 해놓게되면 여러 컴포넌트를 거쳐 올라가지 않아도 B컴포넌트 → Store로 직접 접근이 가능하며, 반대로 store → B컴포넌트로도 직접 접근이 가능합니다. 여러개의 컴포넌트를 왔다갔다 해야하는 과정이 빠지니 훨씬 편하게 State관리를 할 수 있습니다.

Redux 데이터 Flow

Redux는 철저하게 한뱡향 데이터 플로우를 가집니다(strict unidirectional data flow). 리액트 컴포넌트에서 시작되어 Action → Reduecer → Store를 거쳐 다시 리액트 컴포넌트로 돌아옵니다.

Action

Action은 무엇이 일어났는지 설명하는 객체입니다. 형식이 객체여야만 redux store가 내용을 받을 수 있습니다.

{type: 'LIKE_ARTICLE', articleId: 42} //articleId 42번을 좋아요 했다.
{type: 'FETCH_USER_SUCCESS', response: {id:3, name: 'Mary'}} //이름이 Mary이고 id가 3번인 유저를 가져오는 것을 성공했다.
{type: 'ADD_TODO', text: 'Read the Redux docs.'} //이 텍스트를 todo List에 add했다.

REDUCER

이 액션을 함으로 인해서 A였던 값이 B로 변했다는 것을 설명해줍니다. 자세하게는 이전 State와 action object를 받은 후에 next state를 return 해주는 역할을 합니다.

{previousState, action} => nextState

STORE

Application의 state을 감싸주는 역할을 합니다. 이 Store안에는 여러가지의 많은 메소드가 있습니다. 이 메소드를 이용하여 State를 관리할 수 있습니다.