Lee-Park-Bae-Project / KAKIOTALK

😆💬 웹 기반 채팅 어플리케이션 😆💬
MIT License
4 stars 2 forks source link

[리팩토링] redux-saga channel api 를 이용한 socket event handling #143

Closed Junow closed 4 years ago

Junow commented 4 years ago

소켓 이벤트는 서버와 프론트 어디에도 포함되지 않는 외부이벤트입니다.

소켓 이벤트로 프론트와 서버사이의 어떤 데이터들을 주고 받는 로직은 socket/socket.ts 에 정의되어 있는 함수로 땜빵 중이었는데 갈수록 어디에도 속하지 않고 겉도는 느낌이었습니다.

그래서 아래와같은 이벤트 흐름이 있었죠. 여기저기 쏘다니면서 어디서 에러를 터트릴지도 모르겠고 코드도 왔다갔다 하면서 유지보수하기 굉장히 힘들었습니다. -> view 에서 socket event 구독 -> socket 이벤트 발생 -> view 에서 dispatch -> saga 에서 비동기처리 후 dispatch -> reducer 에서 state 업데이트

다행히 redux-saga 에서 제공하는 channel 이벤트를 이용하면 파입입출력, 소켓 이벤트와 같은 외부 이벤트와 결합할 수 있는 방법을 사용할 수 있게 됩니다.

그래서 아래와 같은 순서로 socket event 를 핸들링 가능해집니다. -> channel 에서 이벤트 수신 -> saga 에서 비동기 로직 처리 -> action dispatch or -> view 에서 action dispatch -> channel 을 통해 이벤트 push

아직 이해를 제대로 못한 부분이 있어서 코드가 상당히 더럽지만 로직이 단순화 되고 관련있는 side effect 끼리 묶여서 saga 안에서 처리되니 에러처리나 코드 관리가 쉬워질 것 같습니다.