글 작성자: 망고좋아
반응형

📖 오늘 배운 내용 - 2022.01.14

  • Redux
  • React Redux
  • redux-toolkit

 

📝 Redux 데이터 흐름

 

[Redux] 리덕스 데이터 흐름

🎯 Redux 데이터 흐름 📝 Redux 데이터 흐름 애플리케이션의 상태를 바꾸는 유일한 방법은 스토어를 통해 액션을 디스패치 하는 것뿐이다. 스토어에는 액션을 인자로 받는 디스패치라는 메서드가

lakelouise.tistory.com

 

📝 Redux 소개

 

[Redux] 리덕스란?

🎯 리덕스 앱 전체 상태를 쉽게 관리하기 위한 라이브러리 Redux의 많은 개념들이 Flux pattern에서 차용되었다, 주로 React 앱과 같이 사용한다. redux.js.org에서 수많은 문서를 참고할 수 있고, 웹상에

lakelouise.tistory.com

 

📝 Redux의 구조

 

[Redux] Redux의 구조

🎯 Redux의 구조 redux는 자유롭게 확장하여 사용할 수 있다. 내부적으로 action과 데이터가 어떻게 흐르는지 이해하고, middleware, enhancer 등을 이용하여 redux를 확장할 수 있다. 📝 middleware action은 di..

lakelouise.tistory.com

 

📝 redux-toolkit 활용

 

[Redux] redux-toolkit

🎯 redux-toolkit 활용 redux에서 공식적으로 추천하는 helper 라이브러리 기존에 만들어야 하는 수많은 보일러 플레이트를 제거하고 유용한 라이브러리를 포함하여 redux 코드를 쉽게 작성하게 한다. r

lakelouise.tistory.com

 

📝 React Redux

 

[React Redux] React Redux란?

🎯 React Redux란? React Redux는 컨텍스트를 통해 스토어를 전달하는 과정의 복잡함을 덜어주는 도구를 제공하는 라이브러리다. 라이브러리를 사용하면 Redux 스토어를 컨텍스트에 추가하고 컨테이너

lakelouise.tistory.com

 

📝 Redux를 이용한 비동기 처리

  • redux 비동기 처리를 위해서는 비동기를 위한 middleware를 추가하여야 한다.
  • redux-thunk는 Promise를 이용한 비동기 Action을 쉽게 처리하도록 하는 middleware다.

 

📕 createAsyncThunk

  • redux-toolkit에서는 thunk middleware를 디폴트로 추가
  • redux-toolkit은 createAsyncThunk API를 제공
    • 함수를 리턴하는 함수
  • fulfilled, rejected, pending 3가지 상태에 대해 각각 reducer를 작성
  • TypeScript 환경에서 reducer 작성 시, builder callback을 사용하여 작성해야 정확한 타이핑이 가능하다.
  • dispatch 함수는 Promise를 반환하며, 반환된 Promise를 토대로, 복합적인 비동기 처리를 할 수 있다.

 

const addPost = createAsyncThunk('posts/addPost',
    async (title) => {
        const result = await PostAPI.addPost({     title })
        return result.data
    }
)

// Component
useEffect(() => {
    dispatch(addPost("post 1"))
}, [])
  • createAsyncThunk는 두 인자 action type, async callback(payload creator)를 받는다.
  • action type을 주어지면 pending, fulfilled, rejected가 각각 postfix로 붙어 reducer로 들어온다.
    • ex) posts/addPost/pending

 

const addPost = createAsyncThunk('posts/addPost',
    async (title) => {
        const result = await PostAPI.addPost({ title })
        return result.data
    }
)
  • createAsyncThunk로 만들어진 action creator는 4가지 함수로 구성된다.
  • addPost : async 함수를 dispatch 하는 함수
    • addPost.pending : promise를 생성했을 때 발생하는 액션
    • addPost.fulfilled : promise가 fulfilled 되었을 때 발생하는 액션
    • addPost.rejected : promise가 rejected 되었을 때 발생하는 액션

 

const postsSlice = createSlice({
    // ...
    extraReducers: builder => { builder
        .addCase(addPost.pending, state => ...)
        .addCase(addPost.fulfilled, state => ...)
        .addCase(addPost.rejected, state => ...)
        }
})
  • createSlice의 extraReducers 함수를 이용해, builder에 각 상황에 대한 리듀서를 추가할 수 있다.
  • 공식적으로 builder pattern을 추천하는데, 타입스크립트에서 타이핑이 용이하기 때문이다.

 

const postsSlice = createSlice({
    // ...
    extraReducers: builder => { builder
        .addCase(addPost.pending, state => ...)
        .addCase(addPost.fulfilled, state => ...)
        .addCase(addPost.rejected, state => ...)
    }
})
  • fulfilled시 데이터는 payload로 들어온다.
    • ex) action.payload.todos
  • rejected시 에러는 action.error로 들어오며, payload는 undefined가 된다.

 

📕 연속적인 비동기 처리

dispatch(addPost("post1"))
    .then(() => 

dispatch(updatePost("post2")))
  • thunk 함수를 dispatch 하면 promise가 리턴된다.
  • 따라서, .then() 메서드로 연속적인 비동기 처리를 이어 실행할 수 있다.

 

📕 동시 비동기 처리

Promise.all([
    dispatch(addPost("post1")),
    dispatch(updatePost("post2"))
])
    .then(() => 
        console.log("DONE"))
  • Promise.all을 이용해 여러 비동기 처리를 동시에 실행한다.
  • 주의할 점은 thunk의 promise가 rejected 되어도 .then()으로 들어온다는 것이다.

 

💡 오늘 깨달은 것

  • 이고잉 코치님과 함께한 리덕스는 할만했는데, 온라인 강의에서 배운 리덕스는 너무 어렵다.
  • 그래도 리덕스를 통해 상태 관리를 한곳에서 하니까 가독성이 높아지는 거 같다. 또한 불필요한 코드가 줄어든다. 근데 어렵다!!!!
반응형