앞선 장에서 우리는 앱의 상태를 나타내는 State와 이를 변경할 수단인 Action, 그 Action의 기능을 구현하고 상태의 변경을 처리하는 Reducer을 알아보며, TCA에서의 데이터흐름에 대해서 살펴보았습니다.
이 장에서는 조금 더 자세히 들어가서 Action
이 반환하는 타입
이자 Action을 거친 모든 결과물을 칭하는 Effect
와 그 중에 외부에서 어떠한 처리가 일어나 예상하지 못하게 얻은 결과물인 Side Effect
에 대해 알아볼 예정입니다. 이에 더해, 이러한 비동기 작업이나 외부 작용에서 발생하는 Side Effect
들을 우리 앱의 로직에 통합하는 역할인 Store
까지 알아보겠습니다.
앞서 언급했듯 Effect
는 Reducer의 액션이 반환하는 타입으로, 액션을 거친 모든 결과물
을 칭할 수 있습니다. 그 중에서 외부에서 어떠한 처리가 일어나서 얻게된 예상과 다른 결과물
은 Side Effect
라고 합니다.
Effect는 외부 시스템과 상호작용하는 작업을 나타내는데, 이를 통해 앱의 State가 변경됩니다. State를 직접 변경
할 때의 Action
과 달리, Effect
는 비동기적인 작업을 수행하고 그 결과를 Action으로 반환
하여 State
에 반영하기 위해 사용됩니다.
즉, Effect는 특정 Action을 실행한 후 그 결과에 따라 새로운 Action을 생성
하고, 이를 통해 State를 업데이트하는 역할을 담당합니다. 네트워크 호출, 데이터 로딩, 외부 서비스와의 교류 등 다양한 비동기 작업이 Effect로 분류될 수 있습니다.
Effect는 TCA에서 다음과 같은 기능을 수행합니다.
비동기 작업 관리: 네트워크 요청, 데이터 로딩, 파일 다운로드 등 다양한 비동기 작업을 Effect를 통해 관리할 수 있습니다.
Side Effect 분리: Effect는 순수 함수형 프로그래밍의 원칙에 따라 Side Effect를 배제
합니다. 이를 통해 코드에서 State 변화를 일으키는 부분과 Side Effect를 다루는 부분을 명확하게 분리함으로써 코드의 가독성과 추론력이 향상되며, 테스트와 디버깅 과정이 용이해집니다.
취소 및 에러 핸들링: Effect는 비동기 작업의 성공, 실패 및 중단을 관리하는 데 사용됩니다. 예를 들어, 네트워크 요청 중에 발생한 오류를 적절하게 처리
하고 State를 업데이트할 수 있습니다.
순서 보장: TCA의 Effect는 순차적으로 실행되며 그 순서가 보장됩니다. 이로써 State 변화와 관련된 Side Effect를 적절하게 처리하면서도 예측 가능한 결과
를 얻을 수 있습니다.
순수 함수는 주어진 입력에 대해 항상 동일한 출력을 반환하고, 외부 상태를 변경하지 않으며, 부수 효과(Side Effect)가 없는 함수를 의미합니다. 그렇기 때문에 순수 함수 자체로는 비동기 작업이나 Side Effect를 처리할 수 없습니다.
그러나 TCA의 Effect는 이 문제를 해결하기 위해 특별한 방식을 사용합니다. 이전에 언급하였듯, Effect는 앱의 상태를 직접 변경하지 않고, 비동기 작업을 수행한 후 그 결과를 새로운 Action으로 반환하는 역할을 합니다. 이렇게 생성된 Action은 Reducer
에서 처리되어 State를 업데이트합니다.
예를 들어, 네트워크 요청 같은 비동기 작업을 처리하는 경우, Effect
가 요청을 수행하고 결과 데이터 또는 오류 정보 등을 포함하는 새로운 Action
을 생성하여 반환합니다. 이 Action
은 다시 Reducer
에서 받아서 상태 업데이트 로직을 수행하게 됩니다.