프라이D
프라이Develog(❁´◡`❁)
프라이D
전체 방문자
오늘
어제
  • ALL (378)
    • TDD, Cleancode with JavaScr.. (5)
    • 프로젝트 (32)
      • work (3)
      • 직접 만드는 기술 블로그 (2)
      • 데일리 옥션 (19)
      • 모락모락 (8)
    • Computer Science (1)
    • Algorithm & 자료구조 (94)
      • 알고리즘 w.JavaScript (53)
      • 자료구조 (5)
      • (인프런) 자바스크립트 알고리즘 문제풀이 (34)
    • JavaScript (45)
      • JavaScript (41)
      • 모던 자바스크립트 Deep Dive (4)
    • WEB (13)
    • 회고 (12)
    • TIL (109)
    • WIL (7)
    • Stacks (20)
      • React.js (6)
      • Next.js (1)
      • Redux (3)
      • Node.js (2)
      • GIT (2)
      • SAP (1)
    • 15일 메이킹 프로젝트 (15)
    • 이전 기록 (14)
    • ETC. (5)
    • ---------------2021 (6)
      • 내일배움단-웹개발 5주 (2)
      • 정보처리기사 (4)

블로그 메뉴

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

공지사항

인기 글

태그

  • 자바스크립트알고리즘
  • 국비지원
  • 모던자바스크립트딥다이브
  • 내일배움단
  • 자바스크립트
  • 코드스테이츠
  • JavaScript
  • 자바스크립트비트마스크
  • 스파르타코딩클럽
  • nomadcoder
  • 알고리즘
  • 비트마스크
  • MySQL
  • 투포인터알고리즘
  • 2023 인프콘 후기
  • Til
  • vanilaJS
  • 코딩프로젝트
  • nomadcoders
  • 내일배움카드

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
프라이D

프라이Develog(❁´◡`❁)

[Redux] redux-toolkit 폴더 구조 / 비동기처리 - createAsyncThunk 사용법
Stacks/Redux

[Redux] redux-toolkit 폴더 구조 / 비동기처리 - createAsyncThunk 사용법

2023. 1. 17. 21:13

✔️ Redux folder structure

https://redux.js.org/style-guide/#structure-files-as-feature-folders-with-single-file-logic

리덕스 공식문서에서 추천하는 폴더구조가 있어서 이 방법을 참고해 셋팅을 해보았다.

features 라는 폴더에 기능단위로 컴포넌트와 로직을 담당하는 Slice 가 같이 위치한다. 지난 프로젝트에서 디렉토리 구조를 신경쓰지 않고 진행했다가 몽땅 갈아엎는 대참사를 경험한 뒤로 초기셋팅에서 폴더 구조에 신경을 많이 쓰게되는 것 같다. 정해진 정답이 딱 있지 않아서 가능한 많이 참고하고 고민하고 적용해보는 시도가 필요할 것 같다. 이러한 구조에서는 동작을 담당하는 Slice 에 많이 의존하게 되는 것 같다.

✔️ redux - thunk 를 활용한 비동기 처리

간단하게 설명하면, dispatch 로 비동기 요청을 하는 함수를 전달하면 된다.

그런데 비동기 작업을 처리하는 코드를 부를 때마다 만들어서 사용하면 재사용도 어렵고 코드가 여기저기 파편화되어 응집도가 낮아진다. 그래서 비동기 요청을 하는 함수를 만들어서 dispatch 에 전달할 수 있다. 하지만 보통 dispatch 함수에 전달하는 것은 액션 객체이기 때문에, 이 작업을 처리하기 위해 thunk라는 리덕스 미들웨어를 필요로 한다.

 

redux-thunk란?

리덕스에서 액션 객체가 아닌 함수를 dispatch 할 수 있도록 해주는 미들웨어이다. 주로 비동기 작업을 처리하기 위해서 많이 사용한다. redux-toolkit을 사용하면 redux-thunk를 별도 설치하지 않아도 사용할 수 있는데, toolkit 에서 제공하는 createAsynkThunk 함수를 사용하여 thunk 기능을 쓸 수 있다.

 

"createAsyncThunk는 비동기 작업을 처리하는 액션을 만들어준다." - 생활코딩 

이 함수는 두 가지 인자를 받는데, 하나는 액션 타입, 그리고 액션 실행시 처리되어야하는 작업 및 결과를 리턴하는 함수를 받는다. 비동기 작업에는 3가지 상태가 있다. pending, fulfilled, rejected. 그래서 세 가지 상태에 따라서 각각 리듀서를 만들어 줄 수 있다. 

createAsynkThunk로 생성된 액션을 처리하는 reducer 는 createSlice 안에서 reducer 가 아닌 extraReducers 에서 처리하도록 한다. 공식문서에 따르면 일반적인 reducers 가 해당 slice안에서 생성된 action type에 대해서만 처리가 가능하지만,  extraReducers 는 createSlice 가 생성한 action type 외의 다른 type에 대해서도 처리가 가능하다고 한다. 그리고 생활코딩님의 설명에 따르면 action creator 를 자동으로 생성하지 못하는 비동기 처리의 경우 extraReducers 안에서 처리를 한다고 한다. 이 부분은 지금 당장은 이해가 안되어서 일단 그렇구나..하고 넘어간다 ;ㅅ;

 

createAsynkThunk로 API 데이터 가져오기

 API 를 사용해 댓글 기능을 구현하는 것이 이번 과제이다.

 

- 내가 착각했던 것이, 초기에 이니셜값을 API 에서 호출해와야 하는줄 알았는데, 이니셜 값은 API 응답시 기대되는 값(배열)로 두고, useEffect를 활용해 데이터를 요청하여 state를 업데이트 하도록 할 수 있다. (참고 : https://stackoverflow.com/questions/67882349/how-to-push-the-data-from-api-to-my-initial-state-list-items-using-the-redux-too) 

API 를 호출하여 comments 데이터를 가져오는 thunk 함수
commentSlice에 정의된 state와 reducer

위와 같이 slice 에 로직을 작성하고, 사용할 컴포넌트에서 useSelector와 useDispatch 로 state에 접근할 수 있다. 참고로 타입스크립트와 함께 사용하려면, store 에서 아래 타입을 export 한 뒤 타입 지정을 해야한다.

CommentList 컴포넌트에서 state에 접근하고 있다.

이제 redux-devtools 익스텐션을 켜서, 데이터가 잘 들어오고 있는지 확인해보자! (참고로 redux-toolkit 을 사용한다면 store에서 별도로 설정할 필요가 없다.) 

잘 들어오고, 화면에 렌더링도 잘 된다. ^^*

 

 

저작자표시

'Stacks > Redux' 카테고리의 다른 글

[Redux] React-Redux 라이브러리 : Counter 예제만들기  (0) 2022.09.05
[Redux] 상태관리 라이브러리 : Redux 원리 살펴보기  (0) 2022.09.03
    'Stacks/Redux' 카테고리의 다른 글
    • [Redux] React-Redux 라이브러리 : Counter 예제만들기
    • [Redux] 상태관리 라이브러리 : Redux 원리 살펴보기
    프라이D
    프라이D
    틀린내용 정정 및 개선사항은 언제든지 댓글 달아주세요 :D

    티스토리툴바