ReacotrKit 예제 따라하면서 뿌시기!
ReactorKit이란?
반응형 단방향 앱을 위한 프레임워크로 StyleShare, Kakao를 비롯한 여러기업에서 사용하고 있는 기술입니다. Flux와 Reactive programming의 개념을 결합하여 만들어진 ReactorKit은 사용자 인터랙션과 뷰 상태가 관찰 가능한 스트림을 통해 단방향으로 전달됩니다. 뷰와 비즈니스 로직을 분리할 수 있게 되면서 모듈간 결합도가 낮아지고 테스트하기 쉬워졌다고 합니다.
ReactorKit의 데이터 흐름
전체적인 흐름은 View와 Reactor라는 개념을 통해 존재합니다.
- View는 Action을 Reactor에게 전달합니다.(View는 비즈니스 로직을 수행하지 않음!)
- Reactor는 전달받은 Action에 따라 비즈니스 로직을 수행합니다.
- 그 후 Reactor는 상태(State)를 변경하여 View에게 전달합니다.
여기서 View는 View Controller나 Cell 등을 말합니다
ReactorKit의 데이터 흐름을 구체화 시킨다면 다음의 사진입니다. Action이 들어오면 두 단계를 거쳐서 State를 변경합니다.
-
Mutate() 는 Action 스트림 —> Mutation 스트림으로 변환하는 역할
보통 네트워킹이나 비동기 로직 등의 사이드 이펙트를 처리합니다.
-
Reduce() 는 Mutation에서 방출된 값을 받아서 상태를 반환합니다.
View
! View 프로토콜을 적용하면 View를 정의할 수 있습니다.
- DisposeBag속성과
- bind(reactor: ) 메서드
필수로 필요합니다.
Reactor
! Reactor 프로토콜을 사용하여 정의할 수 있습니다
- 사용자 인터랙션을 표현하는 Action
- 뷰의 상태를 표현하는 State
- 상태를 변경하는 가장 작은 단위인 Mutation
- 가장 첫 상태를 나타내느 initialState
필수로 필요합니다.
ReactorKit을 써야하는 이유?
- MVVM 구조는 개발자마다 바인딩 방법이 다른데 프레임워크로 강제되는 사용법으로 명확성을 찾을 수 있습니다.
- 가독성이 좋아 협업에도 적합합니다.
- 기존 앱이 이미 존재하는 경우에도 작은 단위부터 ReactorKit을 도입하여 리팩토링이 수월합니다.
예제로 보는 실전 연습!
https://github.com/ReactorKit/ReactorKit 에 기재된 Examples를 보며 ReacotrKit을 익혀보겠습니다.
GitHubSearch라는 예제입니다.
1. Reactor 만들기
아까 설명했듯이 Reactor 프로토콜을 사용하여 만들어주었습니다. GitHub를 검색하기 위한 구조로 안에 값을 채워주겠습니다.
-
Action
updateQuery는 검색한 String을 지칭합니다
loadNextPage는 무한스크롤을 위해 만들어졌습니다
-
Mutation
setQuery는 비즈니스 로직으로 들어갈 쿼리값을 의미합니다
setRepos는 검색한 결과인 GItHub의 Repository 데이터를 담습니다
appendRepos는 무한 스크롤로 받은 새로운 데이터들을 append해줍니다
setLoadingNextPage Next Page를 로딩할 수 있는지 여부 확인
-
State
query는 현재 검색한 String
repos는 검색 결과 데이터
nextPage는 페이지 수
isLoadingNextPage는 로딩 확인
그 다음엔 Action 스트림을 Mutation 스트림으로 바꾸기 위해 mutate()로 구현해보겠습니다
- updateQery를 이용해서 현재 SearchBar에 어떤 String이 찍히고 있으며 그 String에 대한 검색 API를 이용합니다. 그리고 Repository 데이터를 담는 setRepos에 검색 결과를 담아 Mutation에 담습니다.
- loadNextPage는 무한 스크롤을 사용하기 위해 다음 페이지를 로딩합니다.
그리고 reduce()를 구현해봅시다.
Mutation에서 전달된 상태를 받아서 방출하는 것이 reduce()의 역할이다. 각 Mutation의 구조들을 State로 방출해주고 있는 모습을 볼 수 있다.
이 글은 ReactorKit을 중점적으로 다루고 있기 때문에 다른 비즈니스 로직은 생략하도록 하겠습니다.
2. Reactor의 View 만들기
앞서 View를 만들 때 View라는 프로토콜을 명시해야한다고 설명했었습니다. 만약에 Storyboard를 사용하여 UI를 구성할 경우엔 View 프로토콜이 아닌 StoryboardView 프로토콜을 사용하여 바인딩해줘야합니다.
필수로 DisposeBag과 bind()를 구현한 모습을 볼 수 있습니다. reactor의 타입은 아까 만들어준 Reactor의 이름을 붙이면 됩니다.
Action부터 바인딩 해봅시다.
설정한 Action은 updateQuery와 loadNextPage입니다.
-
searchBar의 text를 reactor의 action에 바인딩
-
tableViewdml height를 계산해서 reactor의 action에 바인딩
그 다음으론 State를 바인딩 해주겠습니다.
Mutation인 setRepos로 받은 repos를 tableView에 바인딩 해주는 모습을 볼 수 있습니다.
3. View에 Reactor 넣어주기
Reactor와 View 간의 흐름을 연결해주는 것만 남았습니다. bind()는 View의 Reactor에 새로운 값이 들어왔을 때만 호출되기 때문입니다.
! 전체코드
https://github.com/ReactorKit/ReactorKit/tree/master/Examples/GitHubSearch
끝으로
말로만 듣던,, ReactorKit,, 간단하게 예제를 통해 알아보았는데 아무래도 아직 미숙한 점이 많아 틀린 부분이 있을 수도 있습니다. 틀린 부분이 있으면 프로필에 기재된 이메일로 피드백 주시면 감사하겠습니다 :) MVVM으로 프로젝트를 몇개 진행했었는데
바인딩 방법의 통일을 주니 협업시에도 유용하게 쓰일 것 같아 기대가 됩니다! 더 공부해서 프로젝트에 도입해야겠어요..!
출처
https://medium.com/styleshare/reactorkit-시작하기-c7b52fbb131a
https://eunjin3786.tistory.com/100