본문 바로가기
Category/Android

[Android] Circuit

by Corinee 2025. 9. 25.
728x90
반응형

Circuit을 사용하기에 앞서 해당 개념을 정리하고 Circuit을 사용하면 좋은 이유에 대해 알아보자.

 

Circuit

⚡️ Circuit Circuit is used in production at Slack and ready for general use 🚀. The API is considered unstable as we continue to iterate on it. Overview Circuit is a simple, lightweight, and extensible framework for building Kotlin applications that

slackhq.github.io

Circuit 이란?

Slack에서 개발한 Kotlin Multiflatform 및 Jetpack Compose 애플리케이션을 위한 Compose 기반의 아키텍처 프레임워크이다. UI 로직과 비즈니스 로직을 명확하게 분리하고, 단방향 데이터 흐름(Undirectional Data Flow, UDF)을 강력하게 적용하는 데 중점을 둔다.

 

Circuit의 핵심 목표

1. Compose 기반

 Jetpack Compose의 강력한 상태 관리(State Management) 기능을 아키텍처의 핵심으로 활용한다.

 

2. 재사용성 극대화

 Presenter를 UI로부터 완전히 분리하여 비즈니스 로직을 Android나 데스크톱 같은 특정 플랫폼의 UI에 종속되지 않게 만든다.

 

3. 테스트 용이성

 모든 로직이 순수한 Kotlin 클래스에서 테스트하기 쉬운 형태로 관리된다.

 

Circuit의 5가지 핵심 구성 요소

1. Screen

 화면 자체를 나타내는 것이 아니라, 해당 화면을 구성하는 Presenter-UI 쌍을 찾는 고유한 키 역할을 하며, 네비게이션의 단위로 사용된다. 보통 data object나 data class로 정의되며, 다른 화면으로 이동할 때 필요한 인자를 가질 수 있다.

 

2. Presenter

 해당 Screen의 비즈니스 로직을 담당한다. 초기 State를 생성하고, UI에서 전달받은 Event를 처리하며, 비동기 작업을 수행한 결과를 바탕으로 새로운 State를 발행(Emit)한다. Presenter 인터페이스를 구현하며, @Composable 함수 내에서 Compose 런타임을 사용하여 상태를 관리하고 State를 반환한다.

 

3. UI

 Presenter로부터 전달받은 State를 시각적으로 렌더링하는 역할을 한다. 순수한 Compose Composable 함수로 구현된다. 절대 비즈니스 로직을 포함하지 않으며, 오직 State가 가진 정보만을 화면에 표시한다. 사용자 상호작용은 Event를 Presenter로 보내는 역할만 한다.

 

4. State

현재 UI가 표시해야 하는 모든 정보를 담고 있는 Immutable 데이터다. 화면에 표시할 데이터(val count: Int 등)와 UI에서 Presenter로 액션을 전달하기 위한 Event Sink(val eventSink: (Event) -> Unit)로 구성된다.

 

5. Event

UI에서 발생하는 사용자 입력(예: 버튼 클릭)이나 내부 액션을 Presenter에 알리기 위한 메시지이다. State 내부의 eventSink를 통해 Presenter로 전달된다.

 

Circuit의 작동 원리

1. Screen 요청

 사용자가 특정 Screen으로 이동을 요청한다.

 

2. 연결 (Circuit)

 Circuit 프레임워크가 해당 Screen에 맞는 Presenter와 UI를 찾아 연결한다.

 

3. State 발행 (Presenter -> UI)

 Presenter가 초기 State를 발행하거나, 로직 처리 후 새로운 State를 발행한다.

 

4. UI 렌더링 (UI)

 UI는 전달받은 State를 사용하여 화면을 그린다.

 

5. Event 발생 (UI -> Presenter)

 사용자가 버튼을 클릭하면, UI는 State 안에 있던 eventSink 콜백을 호출하여 Event를 Presenter로 전달한다.

 

6. 로직 처리 (Presenter)

 Presenter는 전달받은 Event를 처리하고, 비즈니스 로직을 수행한 뒤, 다시 새로운 State를 발행하여 순환을 반복한다.

 

* 요약 - Presenter가 State를 만들고, UI는 그 State를 보여주며, UI에서 발생한 사용자 입력은 Event를 통해 다시 Presenter로 돌아간다. (순환적인 단방향 데이터 흐름을 통한 화면 관리가 Circuit 아키텍처의 핵심 포인트)

 

Circuit을 사용하면 얻는 이점

1. 재사용성

 Presenter가 플랫폼에 독립적이기 때문에 (Presenter는 Compose UI를 모르는 상태로 State와 Event만 확인함), Android, iOS, Desktop 등 다양한 플랫폼에서 UI만 교체하여 동일한 로직을 재사용할 수 있다.

 

2. 단일 책임 원칙

 Presenter는 로직 처리만, UI는 렌더링만 담당하여 코드가 명확하고 유지보수가 쉽다.

 

3. 네비게이션

 Screen을 기반으로 한 간결한 네비게이션 API를 제공하여 복잡한 화면 전환을 단순화한다.