[TCA] 부모- 자식 간 이벤트 전달 방법

yeton·2023년 10월 21일
0
post-custom-banner

저번 시간에는 TCA(The Composable Architecture)에 대해 알아보았습니다.
오늘은 SwiftUI + TCA에서는 부모-자식 간 어떻게 이벤트를 전달하는지에 대해 제가 알게 된 것들을 정리하려고 합니다. 🌷

평소에 제가 UIKit으로 프로젝트를 할 때 자주 사용했던 방법은
부모가 자식에게 데이터나 이벤트를 전달해야 할 때는 프로퍼티를 통해 곧바로 꽂아주는 것과,
반대로 자식이 부모에게 데이터나 이벤트를 전달해야 할 때는 delegate 패턴을 사용한 것입니다.
그 이유는 부모는 자식을 이미 알기 때문에 바로 전달해줄 수 있고, 자식은 부모가 누군지 몰라도 전달이 가능하기 때문입니당 (ex. delegate 패턴을 사용하면 부모를 몰라도 됨)
이렇게 자식은 부모를 모르게 함으로써 의존성을 낮추고, 코드를 재사용하고 유지보수하기 쉬워지게 만든 것이죠!


이번에는 UIKit이 아닌, SwiftUI를 사용하여 부모-자식 간에 이벤트를 전달해주는 방법에 대해 알아볼 것입니다.
먼저 결론부터 말하면 제가 위에서 언급했던 평소에 자주 사용했던 방법과 크게 다르지 않습니다. scope라는 생소한 개념이 등장할 뿐...!


요약해보자면

  1. 부모 => 자식 이벤트 전달 방법
    부모가 자식에게 이벤트를 전달할 때 직접 프로퍼티로 꽂아주는 것이 가능하다고 했었죠? TCA에서는 이와 비슷하게 부모가 자식의 "Action"을 직접 발생시킬 수 있습니다.
    그러면 자식은 Reducer에 정의돼있는 Action을 실행하게 됩니다.
  1. 자식 => 부모 이벤트 전달 방법
    여기에서는 Scope란 개념이 등장합니다. 부모는 부모뷰에서 자식뷰를 "Scope"라는 개념을 통해 얘는 제 자식입니다~ 하고 등록을 할 수가 있습니다. Scope 설명
    부모는 자식의 Scope를 아래 코드와 같이 지정해주었습니다. 쉽쥬?
struct 부모: ReducerProtocol {
    struct State: Equatable {
        var 자식state = 자식.State()
    }
    
    enum Action: Equatable {
        case 자식action(자식.Action)
    }
    
    var body: some ReducerProtocol<State, Action> {
        Scope(state: \.자식state, action: /Action.자식action) {
            자식()
        }
    }
}

쉽게 예시를 하나 들어볼게요. 예를 들어 자식이 춤추기 action을 실행했다고 가정해봅시다.
그러면 자식은 부모를 몰라도... (⭐️이게 핵심입니다! 자식은 부모가 누군지 몰라요!) 부모가 자식의 춤추기 action을 자신의 action에 가지고 있기 때문에 (알고 있기 때문에) 자식이 춤추기 action을 하면 부모에게도 자연스럽게 그게 알려지게 됩니다.
(자식은 그걸 모름....무섭다..ㅋㅋ)

따라서 자식의 춤추기 action이 실행되면 어떤 행동을 할 것인지 부모가 정의해놓은 정의에 따라 부모도 적당한 action을 취하게 될 것입니다. 예를 들어 자식 action이 실행되면 부모는 응원을 해주는 action을 실행한다던지...

그래서 핵심은 자식은 부모를 모르고 부모는 자식을 안다.!
이 개념만 숙지하면 전반적으로 어렵지 않게 이해가 되는 것 같네요.



참고 링크
https://phillip5094.tistory.com/174

profile
🤗제 깃허브 링크는 https://github.com/yeeton37🤗
post-custom-banner

0개의 댓글