# BLoC (Business Logic Component) 패턴 설명

#### BLoC 패턴 개요

BLoC(Business Logic Component) 패턴은 Flutter 애플리케이션에서 비즈니스 로직을 UI로부터 분리하는 아키텍처 패턴이다. 이 패턴은 애플리케이션의 상태 관리와 데이터 흐름을 체계적으로 처리하는 방법을 제공하며, 특히 Flutter의 reactive 프로그래밍 모델에서 효과적으로 작동한다. BLoC 패턴의 핵심은 비즈니스 로직을 중앙 집중화하여 유지보수성을 높이고, 테스트를 용이하게 하며, UI 코드와 비즈니스 로직의 결합도를 낮추는 것이다.

#### Stream과 Sink

BLoC 패턴은 Dart의 Stream을 활용하여 이벤트(Event)와 상태(State)를 관리한다. Stream은 비동기 데이터 스트림을 나타내며, BLoC 패턴에서 상태 변화를 Stream을 통해 UI에 전달한다. 이벤트는 사용자의 입력이나 외부 요인에 의해 발생하며, 이러한 이벤트는 Sink를 통해 BLoC에 전달된다. BLoC은 Sink에 전달된 이벤트를 처리한 후, 결과를 Stream을 통해 발행하여 UI에서 이를 구독(Subscribe)하고 적절히 처리하게 한다.

* **Stream**: 비동기 데이터 흐름을 나타내며, BLoC 패턴에서는 상태(State)를 전달하는 데 사용된다.
* **Sink**: 이벤트(Event)를 BLoC에 전달하는 데 사용된다.

#### BLoC의 구성 요소

BLoC 패턴은 주로 세 가지 주요 구성 요소로 나뉜다: 이벤트(Event), 상태(State), 그리고 BLoC. 각각의 구성 요소는 명확한 책임을 가지며, 이들 간의 상호작용을 통해 애플리케이션 로직이 구현된다.

**이벤트(Event)**

이벤트는 애플리케이션에서 발생하는 특정 행동이나 입력을 의미한다. 사용자의 버튼 클릭, 텍스트 입력 등 다양한 사용자 상호작용이 이벤트로 표현될 수 있다. 이벤트는 BLoC에게 전달되어 비즈니스 로직이 실행되도록 트리거한다. 이벤트는 일반적으로 enum이나 클래스로 표현되며, BLoC 내에서 이를 구분하여 처리한다.

**상태(State)**

상태는 BLoC 패턴에서 애플리케이션의 현재 상태를 나타낸다. 이벤트가 발생하면, BLoC는 이 이벤트를 처리하고 새로운 상태를 생성한다. 이 새로운 상태는 Stream을 통해 UI에 전달되며, UI는 이를 기반으로 렌더링을 갱신한다. 상태는 특정 UI 상태를 표현하기 위해 여러 클래스로 나뉠 수 있으며, 각 상태 클래스는 고유의 속성을 가진다.

**BLoC**

BLoC은 이벤트를 받아서 처리하고, 그 결과로 새로운 상태를 방출하는 역할을 한다. 이벤트를 처리하는 로직은 BLoC 내부에서 구현되며, 이는 주로 이벤트를 on()와 같은 메서드를 통해 처리하여 상태를 갱신한다. BLoC는 애플리케이션의 비즈니스 로직을 캡슐화하여 UI와 비즈니스 로직을 분리하는 핵심 역할을 한다.

#### BLoC 패턴의 작동 원리

BLoC 패턴의 작동 원리는 간단하다. 먼저, UI에서 발생한 이벤트가 Sink를 통해 BLoC으로 전달된다. BLoC은 이 이벤트를 적절한 방식으로 처리하여 새로운 상태를 생성한다. 생성된 상태는 Stream을 통해 UI로 전달되며, UI는 이 상태를 구독하여 렌더링을 갱신한다. 이러한 과정은 지속적으로 반복되며, BLoC은 애플리케이션 로직을 관리하고, UI와의 상호작용을 조율한다.

#### BLoC 패턴의 장점

BLoC 패턴을 사용하면 코드의 재사용성과 테스트 가능성이 향상된다. 비즈니스 로직이 UI로부터 분리되므로, 동일한 BLoC 로직을 여러 UI 컴포넌트에서 재사용할 수 있다. 또한, 비즈니스 로직이 잘 정의된 상태로 분리되므로, 단위 테스트가 용이해진다. 이로 인해, 애플리케이션의 유지보수성과 확장성이 크게 향상된다.

#### BLoC 패턴의 단점

BLoC 패턴의 단점으로는 초기 구현의 복잡성이 있다. Stream과 Sink의 개념을 이해하고 이를 적절히 사용하는 것이 초심자에게는 어려울 수 있다. 또한, 상태와 이벤트를 명확히 정의하고 관리하는 것이 중요하므로, 코드의 양이 많아질 수 있다. 이는 소규모 애플리케이션에서는 오히려 복잡성을 증가시킬 수 있다.

***

관련 자료:

* Google Developers, flutter.dev, <https://flutter.dev>
* Felix Angelov, flutter\_bloc package documentation, <https://pub.dev/packages/flutter_bloc>
