Post

[Day 55] RxFlow를 사용해보자!

RxFlow를 직접 써보며 Step, Stepper, Flow가 왜 필요한지 체감한 기록

[Day 55] RxFlow를 사용해보자!

😵 화면 전환이 왜 이렇게 복잡해졌지?

요즘 앱을 만들다 보면
화면 전환이 단순하지가 않다.

처음엔 별거 아니었다.
버튼 누르면 push, 필요하면 present.

근데 화면이 늘어나고
로그인 분기, 권한 분기, 역할 분기가 생기니까
어느 순간부터 이런 생각이 들었다.

“이 화면은 대체 어디서 온 거지…?”

코드는 있는데,
흐름이 머릿속에 안 남는다.
딱 그 상태였다.

🤔 그러다 만난 RxFlow

RxSwift를 쓰다 보니
자연스럽게 RxFlow 이야기를 자주 접했는데,
솔직히 예전엔 이렇게 생각했다.

“네비게이션에 라이브러리까지 써야 하나…?”

근데 화면 흐름이 복잡해질수록
화면 이동을 누가 책임져야 하는가’ 라는 고민이 계속 들었다.

근데 솔직히 말하면,
처음 봤을 때 느낌은 이랬다.

  • Step?
  • Stepper?
  • Flow?

“이거 네비게이션 하나 하자고 왜 이렇게 이름이 많아…?”

그래도 화면 전환이 더 이상 감당이 안 되는 시점이라
이번엔 제대로 한 번 써보기로 했다.

📖 RxFlow가 말하는 방식

공식 문서를 보다가
계속 머리에 남았던 핵심은 이거였다.

RxFlow는 ‘어디로 이동’이 아니라 ‘지금 무슨 일이 일어났는지’를 기준으로 화면을 바꾼다.

🔗 https://github.com/RxSwiftCommunity/RxFlow

이 문장을 기준으로 보니까
왜 Step, Stepper, Flow가 나뉘어 있는지
조금씩 이해가 되기 시작했다.

🧩 Step — “지금 이런 상태임”

Step은 생각보다 단순했다.
그냥 상태를 말하는 이벤트다.

1
2
3
4
5
enum AppStep: Step {
  case loginIsRequired
  case loginIsCompleted
  case homeIsRequired
}

여기엔 ViewController 이름도 없고 push, present 같은 말도 없다.

처음엔 답답했는데, 이렇게 바꿔 생각하니 이해가 됐다.

“어디로 갈지는 나중에 정하고, 지금은 그냥 무슨 일이 일어났는지만 말하자”

🗣️ Stepper — “그래서, 나 지금 이 상태야”

Stepper는 Step을 세상 밖으로 알려주는 역할이다.

보통 ViewController가 맡는다.

1
2
3
4
5
6
7
final class LoginViewController: UIViewController, Stepper {
  let steps = PublishRelay<Step>()

  func loginSuccess() {
    steps.accept(AppStep.loginIsCompleted)
  }
}

여기서 느낀 게 하나 있다.

ViewController가 “다음 화면 뭐로 가지?”를 고민 안 한다. 그냥 사실만 말한다.

“나 로그인 성공했어.”

이거 생각보다 되게 편하다.

🗺️ Flow — “오케이, 그럼 이렇게 가자”

Flow는 Step을 받아서 실제 화면 전환을 결정하는 곳이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
final class AppFlow: Flow {
  var root: Presentable { navigationController }

  func navigate(to step: Step) -> FlowContributors {
    guard let step = step as? AppStep else { return .none }

    switch step {
    case .loginIsRequired:
      return navigateToLogin()
    case .loginIsCompleted:
      return navigateToHome()
    }
  }
}

이 코드를 보면서 처음으로 이런 생각이 들었다.

“아… 앱 설명서가 여기 있었네.”

Flow 파일 하나만 보면 앱이 어떤 순서로 흘러가는지 보인다.

예전엔 이 흐름이 여러 ViewController 안에 흩어져 있었다.

🔁 직접 써보니 가장 큰 차이

기존에는 이런 느낌이었다면

  • 버튼 탭
  • → VC 안에서 push
  • → 다음 화면에서 또 분기

RxFlow를 쓰고 나서는 이렇게 바뀌었다.

  • 버튼 탭
  • steps.accept(AppStep.loginIsCompleted)
  • → Flow가 이 Step을 해석해서 화면 전환

처음엔 오히려 돌아가는 느낌이 들었는데,
막상 Flow 파일을 열어보니
앱의 전체 흐름이 한눈에 보였다.

“아, 로그인 성공하면 여기로 가는구나”
“여기서 owner면 이 Flow로, user면 저 Flow로 가는구나”

👉 머릿속에서만 정리하던 흐름이 코드로 보이는 느낌

🧩 특히 좋았던 포인트

  • ViewController가 화면 전환 책임에서 벗어남
  • 네비게이션 로직이 한 곳에 모임
  • 분기 많은 앱일수록 Flow가 지도 역할을 해줌
  • 나중에 다시 봐도 “길 잃을 확률”이 줄어듦

이건 단순히 라이브러리를 하나 더 쓴 느낌이 아니라,
생각하는 방식이 바뀐 느낌에 가까웠다.

🐾 오늘의 마무리: 춘식이의 개발 일기

솔직히 아직도 헷갈리는 부분은 있다.

하지만 이렇게 정리됐다.

  • Step: 무슨 일이 일어났는지
  • Stepper: 그 사실을 알리는 역할
  • Flow: 그럼 이제 어디로 갈지 결정

역할이 나뉘니까 생각도 같이 정리되는 느낌이었다.

RxFlow는 그 구조를 정리할 수 있는 선택지였다.

오늘도 오류 내며 자란 춘식이였습니다. 🐾
더 열심히 해서 좋은 iOS Developer가 되자!

혹시 이 글을 우연히 보게 되신 분이 있다면, 더 잘 만들 수 있는 팁이나 피드백은 언제든 환영입니다 :)

This post is licensed under CC BY 4.0 by the author.