Skip to content

UI 이벤트를 Relay/Signal 스트림으로 전달했어요.#131

Open
ujhong7 wants to merge 4 commits intodevelopfrom
refactor/#128
Open

UI 이벤트를 Relay/Signal 스트림으로 전달했어요.#131
ujhong7 wants to merge 4 commits intodevelopfrom
refactor/#128

Conversation

@ujhong7
Copy link

@ujhong7 ujhong7 commented Nov 12, 2025

📝 Issue Number

🔧 변경 사항

  • 기존 delegate 기반 UI 이벤트 전달 방식을 Rx의 Relay/Signal 스트림 구조로 전환했어요.

🔍 변경 이유

  • 기존 delegate 방식은 이벤트가 늘어날수록
    프로토콜 선언 및 연결 과정이 반복되고, View ↔ Controller 간 결합도가 높아졌습니다.
    이를 개선하기 위해 RxSwift의 Relay/Signal 스트림 구조를 도입했습니다.
    이 방식은 UI → ViewController → ViewModel로 이어지는 단방향 이벤트 플로우를 형성해
    코드 연결이 단순해지고, 선언적이며 일관된 이벤트 처리가 가능합니다.

🧐 추가 설명

  • DogetherButtonCompletePageTodoWritePage 등 UI 컴포넌트에서
    PublishRelay로 이벤트를 방출하고, 외부에는 Signal로 읽기 전용으로 노출합니다.
    ViewController는 각 Signal을 emit(onNext:) 형태로 구독해 ViewModel과 연결하며,
    이를 통해 UI 이벤트 → 비즈니스 로직 흐름이 단순하고 예측 가능해졌습니다.
  • 하위 뷰에서 발생한 delegate 이벤트를 상위 ViewController까지 끌어올리는 구조가 번거롭다고 느꼈습니다.
    이왕 서드파티 라이브러리인 RxSwift를 도입한 만큼,
    이벤트 플로우도 리액티브하게 바인딩하고 선언적으로 처리하는게 어떨까하는 생각에 이 구조를 생각해봤습니다.

@seungyooooong
Copy link
Member

PR 올리기 전에 develop 현행화해서 rebase 한 번 씩 부탁드려요 충돌난채로 리뷰하면 의미가 반감되니까요!

@seungyooooong
Copy link
Member

크게 3가지 정도 궁금증이 남는데,

  1. BaseButton 두개가 동일한 수정이 이뤄진 걸로 보입니다 아예 BaseButton에다가 해당 내용을 추가하는 방법으로도 가능할까요?
  2. page 하위에 바로 button이 있는 구조가 아니라, page 하위에 BaseView가 하나 껴있고 그 하위에 button이 있는 구조라면, 그러니까 이벤트를 보내는 중간 단계가 늘어나면 어떤식으로 확장될까요?
  3. button자체가 가지고 있는 상태를 action에 담아서 던져야 할 때가 있을 것 같은데, (예를 들면 이벤트가 발생한 위치라거나, 이벤트가 발생한 button의 고유한 상태 같은 것들을 위로 던져줘야 하는 상황) 어떤식으로 확장될까요?

@ujhong7
Copy link
Author

ujhong7 commented Nov 24, 2025

  1. 중간 단계가 늘어나더라도 각 View나 Page가 자기 레벨에서 이벤트를 받아 Relay/Signal 형태로 상위에 다시 전달하는 방식으로 확장할 수 있습니다. 이때 중간 뷰는 이벤트를 소비하지 않고 전달자 역할만 수행하기 때문에 구조가 복잡해져도 동일한 패턴을 유지할 수 있습니다. 반면 Delegate 방식은 단계가 늘어날수록 프로토콜과 연결 코드가 계속 추가되어 구조가 복잡해지지만, Relay/Signal 방식은 이벤트를 스트림으로 방출하고 상위에서 구독하는 구조라 이벤트 흐름만 확장될 뿐 전체 구조는 크게 변하지 않습니다. 그래서 결합도와 유지보수 측면에서 Delegate보다 Relay/Signal 방식이 더 확장성 있지 않을까 생각했습니다.

  2. 버튼이 자기 고유 상태(이벤트 발생 위치, index, id, 현재 데이터 등)를 상위로 전달해야 하는 경우에는 해당 정보들을 하나의 Context 또는 Event 타입으로 묶어서 Relay/Signal로 함께 전달하도록 확장할 수 있습니다. 즉, 버튼이 자신의 상태 정보를 담은 객체를 만들어 방출하고, 상위에서는 이 객체를 구독하여 필요한 처리를 하는 구조입니다.

Copy link
Member

@seungyooooong seungyooooong left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

저번 회의때 말씀해주신 내용이라 아래 적어주신 리뷰를 보고 어느정도 상황을 이해했습니다 리베이스 및 주석 삭제 등 코드 정리해주시고 리뷰 마지막으로 요청해주세요!

- CompletePage delegate 제거
- DogetherButton에 PublishRelay 추가 (탭 이벤트 방출)
- CompletePage에서 Signal로 외부 이벤트 노출
- CompleteViewController에서 emit(onNext:)로 이벤트 처리
- delegate 의존 제거로 단방향 Rx 이벤트 플로우 정리

# Conflicts:
#	dogether/Presentation/Common/DogetherButton.swift
- TodoWritePage의 TodoWriteDelegate 제거
- UITextFieldDelegate 및 버튼 Action을 Rx 스트림으로 대체
- PublishRelay/Signal 기반 단방향 이벤트 플로우로 리팩토링
- ViewController에서 emit(onNext:)로 ViewModel 로직 연결
- BaseButton 공통 이벤트 처리 구조 적용
- Relay/Signal 기반 중간 View 이벤트 전달 구조 확장
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

Development

Successfully merging this pull request may close these issues.

2 participants