앞선 장에서 우리는 앱의 상태를 나타내는 State와 이를 변경할 수단인 Action, 그 Action의 기능을 구현하고 상태의 변경을 처리하는 Reducer을 알아보며, TCA에서의 데이터흐름에 대해서 살펴보았습니다.

이 장에서는 조금 더 자세히 들어가서 Action반환하는 타입이자 Action을 거친 모든 결과물을 칭하는 Effect와 그 중에 외부에서 어떠한 처리가 일어나 예상하지 못하게 얻은 결과물인 Side Effect에 대해 알아볼 예정입니다. 이에 더해, 이러한 비동기 작업이나 외부 작용에서 발생하는 Side Effect들을 우리 앱의 로직에 통합하는 역할인 Store까지 알아보겠습니다.

3.1 Effect의 구현과 활용

3.1.1 Action에 따른 결과: Effect

앞서 언급했듯 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를 적절하게 처리하면서도 예측 가능한 결과를 얻을 수 있습니다.

3.1.2 순수함수적인 Effect

순수 함수는 주어진 입력에 대해 항상 동일한 출력을 반환하고, 외부 상태를 변경하지 않으며, 부수 효과(Side Effect)가 없는 함수를 의미합니다. 그렇기 때문에 순수 함수 자체로는 비동기 작업이나 Side Effect를 처리할 수 없습니다.

그러나 TCA의 Effect는 이 문제를 해결하기 위해 특별한 방식을 사용합니다. 이전에 언급하였듯, Effect는 앱의 상태를 직접 변경하지 않고, 비동기 작업을 수행한 후 그 결과를 새로운 Action으로 반환하는 역할을 합니다. 이렇게 생성된 Action은 Reducer에서 처리되어 State를 업데이트합니다.

예를 들어, 네트워크 요청 같은 비동기 작업을 처리하는 경우, Effect가 요청을 수행하고 결과 데이터 또는 오류 정보 등을 포함하는 새로운 Action을 생성하여 반환합니다. 이 Action은 다시 Reducer에서 받아서 상태 업데이트 로직을 수행하게 됩니다.