티스토리 뷰

반응형

 

 

 

Announcing the Reducer Protocol

Today we are releasing the biggest update to the Composable Architecture ever, completely reimagining how features are built with the library.

www.pointfree.co

작년 10월에 The Composable Architecture 0.41.0 버전과 함께 Reducer Protocol이 소개되었습니다. ReducerProtocol 사용을 위해서는 swift 5.6 버전 이상이 필요합니다.(ReducerProtocol 채택 후 구성을 할때, opaque type 문법 까지 온전히 활용하기 위해서는 5.7 버전 이상이 필요)

오늘은 이 ReducerProtocol이란 놈으로 인해 변경된 구조와 적용방법, 마이그레이션 방법 참고사항을 가볍게 공유드리겠습니다.

 


TCA ReducerProtocol 소개 및 구성, 사용방법 알아보자

기존 TCA(The Composable Architecture)를 사용했을때는
- Store의 요소인 비즈니스 로직에 의해 변화하고, View의 rendering에 영향을 주는 State
- 이벤트 케이스가 정의되는 Action
- API요청 등의 외부 의존성들을 갖고 있는 Environment (* ReducerProtocol 적용 시에 없어지며, @Dependency 를 사용 아래에서 이어서 보겠습니다.)
- 이벤트의 흐름과 비즈니스 로직이 들어가는 Reducer

등의 요소가 기능 별로 같은 파일에 정의는 되지만, 따로 따로 나누어서 정의되고 있었는데요.

이번 ReducerProtocol의 소개로, 이제 이 모든 개념들이 ReducerProtocol을 채택하는 구조체 내부에 정의되고 구성됩니다. ReducerProtocol이 소개되면서 이전에 사용하던 reducer를 pullback하는 방식도 모두 새롭게 바뀌었고, Environment가 없어지고, 다른방식으로 Dependency 객체들을 사용하게 됩니다.

 

 

ReducerProtocol 채택 이후 Reducer 내에서 이벤트 흐름을 구성하는 방식은 크게 두가지 인데요.

위와 같이(위 사진말고 그 이전 사진 참고) reduce 메서드를 사용하는 방식, 두번째는 body를 구성하여 내부에 Reduce { ... } 를 구성하는 방식입니다.

* Reduce 블럭 아래 꼭다리로 있는 ifLet(....) { ... }는 기존 TCA 방식의 reducer.optional().pullback(....) 방식으로 보면 될 것 같습니다.

 

 

ReducerProtocol을 적용함에 따라 이제 어떠한 Reducer를 보았을때 해당 도메인에 대하여 어떤 구성으로 동작하는지 상상하기 쉬워졌습니다. 또한 opaque type을 사용해서 SwiftUI 구문과 유사한 방식으로 다수의 reducer들을 구성할 수 있게 되었습니다.

기존에는 하위 Reducer들을 pullback 하는것을 반복하는 방식에 그 사이사이에 ',' 반점을 사용했는데, 이제는 위와 같이 pullback 대신 Scope로 non-optional한 State들을 처리할 수 있게 되었습니다. SwiftUI와 보다 유사한 표현방식을 사용하게 되었습니다. non-optional state 이외에도 optional한 State 또한 처리가 가능합니다. 아래 이어서 보겠습니다.

ifLet, forEach, ifCaseLet 등의 메서드를 Reduce 블럭 밑에 달아서 optional한 State값에 대한 reducer를 구성할 수 있습니다.

ReducerProtocol이 적용되면서, Environment 개념이 사라지고, @Dependency 를 사용해서 API client 등의 의존성을 사용할 수 있습니다. 

 

 

ReducerProtocol 소개와 더불어 새로운 dependency 관리 시스템이 생겼다고 합니다. 이제 별도의 Environment를 정의할 필요 없이, 각각의 도메인 기능의 필요에 따라 가져와서 사용할 수 있습니다.

@Dependency(\.{사용할 의존성 객체}) var {변수}
와 같이 가져와서 Reduce { ... } 블럭 내에서 손쉽게 의존성 사용이 가능해졌습니다.

@Dependency 사용방법은 나중에 기회되면 포스팅 해보겠습니다~

 


기존의 TCA 구조에서 ReducerProtocol 로 마이그레이션 방법

ReducerProtocol을 채택하고 구조를 적용하기 위해서는 기존 TCA 구조를 전체적으로 뜯어고쳐야 하는 과제가 있었습니다. 다행히 생각보다 오래걸리지는 않습니다. (생각 보다 안걸릴 뿐이지 그래도 시간이 다소 소요됨) 또한 TCACoordinator 와 같은 라이브러리를 사용하신다면, ReducerProtocol을 지원하는 버전 이상으로 업그레이드를 하셔야 합니다.

ReducerProtocol 마이그레이션 방법은 TCA를 만든 pointfree에서 추가로 소개하고 있으니, 아래 문서 참고하시기 바랍니다.

 

Documentation

 

pointfreeco.github.io

 


오늘은 TCA(The Composable Architecture)의 ReducerProtocol의 소개와 함께 적용 방식을 살짝 알아보고 마이그레이션 방식 링크까지 공유드려봤습니다.

ReducerProtocol을 적용해보고 느낀점은 각각의 도메인에 대한 Reducer의 개념이 보다 가시화되는 것 같고, SwiftUI 구문과 유사하게 표현이 가능해지면서 좀더 SwiftUI 코드와 자연스럽게 섞이게 되었다는 생각이 듭니다.

이외에도 ReducerProtocol의 도입으로 기존보다 성능 면에서도 좋아졌다고 하는데요. 자세한건 이번 포스팅 맨 처음에 공유드린 링크 참고하시면 됩니다. 많은 의견 댓글로 부탁드리겠습니다. 감사합니다. 😁

 

반응형
댓글
반응형
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함