BLoC (Business Logic Component) Pattern 은 Flutter 애플리케이션에서 상태 관리를 위해 사용되는 디자인 패턴
⇒ UI 와 Business Logic 을 분리하여 사용되는 패턴
사용자의 인터렉션이나 시스템 이벤트가 발생하면, 이러한 이벤트는 BLoC 로 전달
⇒ 이벤트는 버튼 클릭, 데이터 로드 요청 등 사용자 인터페이스에서 발생하는 다양한 액션
애플리케이션의 비즈니스 로직 담당
⇒ 들어오는 이벤트를 받아 처리하고, 새로운 상태를 생성하여 애플리케이션의 UI 나 다른 BLoC 에 전달
BLoC 에 의해 생성되고 UI 에 전달되는 상태
⇒ 상태는 UI 가 사용자에게 보여줄 데이터의 현재 상태
사용자 인터페이스에서 특정 액션이 발생하면, 관련된 이벤트가 BLoC 로 전달
BLoC 는 전달받은 이벤트를 기반으로 비즈니스 로직을 수행
⇒ 외부 데이터 소스와의 통신, 데이터 가공 등이 이루어 질 수 있다.
BLoC 는 처리 결과를 바탕으로 새로운 상태 생성
⇒ 상태는 애플리케이션 UI 가 사용자에게 보여줄 데이터를 포함
생성된 새로운 상태는 UI 로 전달
⇒ UI 는 이 상태에 따라 화면 갱신
비즈니스 로직을 UI 로 부터 분리
⇒ 비즈니스 로직이 UI 와 독립적으로 유지되어 코드의 재사용성과 유지보수 용이
비즈니스 로직이 UI 와 분리되어 있기 때문에 UI 에 의존하지 않고 독립적으로 테스트 가능
⇒ 애플리케이션의 안정성을 높이는 데 기여
모든 상태 변경이 BLoC 를 통해 이루어지도록 함으로써 상태 관리의 일관성 유지
⇒ 애플리케이션의 예측 가능성과 실뢰성을 높이는 데 기여
Stream 을 사용하여 비동기 이벤트와 상태 변화 관리
⇒ 비동기 작업을 효율적으로 처리
이해하고 사용하기까지 상대적으로 높은 학습 곡선을 가지고 있다.
⇒ Stream 과 비동기 프로그래밍에 익숙하지 않은 개발자에게는 초기 진입 장벽이 될 수 있다.
이벤트, 상태, BLoC 클래스 등을 정의해야 하기 때문에 상당량의 보일러플레이트(반복적인) 코드가 발생할 수 있다.
⇒ 프로젝트의 코드량을 증가시키고, 때로는 가독성을 저해할 수 있다.
크고 복잡한 애플리케이션에서 다수의 BLoC 를 관리하고, BLoC 간의 상호작용을 처리하는 것이 복잡해질 수 있다.
⇒ 애플리케이션의 아키텍처를 복잡하게 만들 수 있다.
Dart 언어를 사용하는 어떤 애플리케이션에서든 상태 관리를 위해 사용될 수 있는 상태 관리 라이브러리
⇒ BLoC 패턴을 쉽고 효과적으로 구현할 수 있도록 도와주는 다양한 기능과 유틸리티 제공
BLoC 패턴을 구현하여 이벤트를 수신하고 이를 기반으로 상태를 변화시키는 로직을 구현할 수 있게 도와줌
⇒ 애플리케이션의 상태 관리를 추상화하고, 비즈니스 로직을 UI 로부터 분리하는 데 도움을 줌
이벤트 없이 상태만 관리하는 간단한 형태
⇒ 함수 호출을 통해 상태를 변경
이벤트 기반으로 상태를 관리하는 복잡한 형태
⇒ 이벤트를 받아서 상태를 방출
BLoC 패턴에서 상태 관리 시스템의 생명주기 이벤트를 관찰하고 처리하는 용도
⇒ 디버깅, 로깅, 분석 등에 사용
Bloc 또는 Cubit 이 생성될 때 호출
⇒ 초기화 단계에서 발생하는 이벤트를 관찰하는 용도
Bloc 에 이벤트가 추가될 때마다 호출
⇒ 초기화 단계에서 발생하는 이벤트를 관찷하는 용도
Bloc 또는 Cubit 의 상태가 변경될 때 호출
⇒ 상태 변화를 추적하고 분석하는 용도
Bloc 에서 상태 전환이 발생할 때 호출
⇒ 상태 변화의 전체 흐름 파악하는 용도
Bloc 또는 Cubit 내부에서 예외가 발생할 때 호출
⇒ 예외 상황을 처리하거나 로깅하는 용도
Bloc 또는 Cubit 이 닫힐 때 호출
⇒ 리소스 해제 등에 대한 관찰하는 용도
이벤트 처리, 상태 변화, 스트림 관리 등을 위한 API 제공
⇒ 개발자가 작성해야 하는 코드의 양을 줄여줌
상태 변화를 쉽게 추적하고 디버깅 할 수 있도록 도와줌
에러 처리와 리소스 해제를 보다 쉽게 관리할 수 있는 패턴과 구조 제공
Flutter 애플리케이션에서 BLoC 디자인 패턴을 구현하기 위해 만들어진 Flutter 라이브러리
위젯을 제공하여 Flutter UI 구성 요소와 BLoC 패턴 사이의 상호 작용을 용이하게 해줌
⇒ 상태 변화에 따라 UI 를 업데이트하거나, bloc 을 위젯 트리에 추가하고, 상태 변화에 대한 반응을 처리하는 등의 작업을 간소화해줌
bloc 의 상태 기반으로 UI 의 일부를 구축하는 데 사용되는 위젯
⇒ StreamBuilder 와 매우 유사하지만, API 가 더 단순하여 필요한 보일러플레이트 코드의 양을 줄임
bloc 의 상태 변화에 반응하여 UI 를 재빌드하는 위젯
⇒ CounterBloc 타입의 Bloc 을 사용하고, Bloc 의 State 타입이 int 임을 명시
bloc 의 상태가 변경될 때마다 호출되며, 주어진 상태에 따라 UI 를 어떻게 나타낼지 정의
⇒ context 는 현재의 BuildContext 를 나타내고, state 는 bloc 의 최신 상탤르 나타냄
BlocBuilder 에 사용할 Bloc 인스턴스를 전달
⇒ CounterBloc 인스턴스인 bloc 을 사용하여 주어진 bloc 의 상태 변화를 감지하고 반응함
bloc 의 상태 변화가 발생했을 때, UI 를 재빌드할지 결정하는 조건을 정의
⇒ true 를 반환하면 builder 함수가 호출되어 UI 를 재빌드
⇒ BlocBuilder 와 유사하지만 위젯이 응답할 상태의 특정 부분을 선택하는 기능 추가
bloc 의 상태 변화에 반응하여 UI 를 재빌드하는 위젯
⇒ CounterBloc 타입의 Bloc 을 사용하고, Bloc 의 State 타입이 int 임을 명시하고, 그 중 String 의 값을 선택하도록 명시함
bloc 의 수신 상태를 builder 함수에서 UI 를 재빌드하는 데 사용할 새로운 값으로 변환하는 곳
⇒ state 는 bloc 의 최신 상태이며 해당 상태 기반으로 새로운 값으로 반환
bloc 의 상태가 변경될 때, selector 에서의 상태가 변경될 때만 호출되며, 변경된 상태에 따라 UI 를 어떻게 나타낼지 정의
⇒ context 는 현재의 BuildContext 를 나타내고, state 는 selector 에서 반환된 값
BlocSelector 에 사용할 Bloc 인스턴스를 전달
⇒ CounterBloc 인스턴스인 bloc 을 사용하여 주어진 bloc 의 상태 변화를 감지하고 반응함
의존성 주입에 사용되며 위젯 트리 전체에서 bloc 에 쉽게 접근 가능
bloc 인스턴스를 생성하여 위젯 트리에 제공
⇒ 트리의 모든 하위 위젯에서 bloc 사용 가능
기존 bloc 인스턴스를 가져와 위젯 트리에 제공
⇒ 다양한 위젯 트리에서 bloc 상태를 그대로 유지해야 할 때 유용
create : 리소스 자동 해제
value : 리소스 수동 해제
위젯 트리에서 bloc 인스턴스를 검색하는 데 사용되는 메소드
⇒ 상태가 변경될 때 위젯이 자동으로 다시 작성되지 않음
⇒ 이벤트를 추가하기 위해 bloc 에 접근해야 할 때 일반적으로 사용
위젯 트리에서 bloc 인스턴스를 검색하는 데 사용되는 메소드
⇒ 상태가 변경될 때 마다 위젯이 재빌드되도록 함
⇒ 상태 변경에 응답하여 위젯이 UI 를 업데이트해야 할 때 유용
위젯 트리에서 bloc 인스턴스를 검색하는 데 사용되는 메소드
⇒ 모든 상태 변경이 아닌 선택한 상태 부분이 변경될 때만 위젯을 재빌드 함
⇒ 불필요한 위젯 재빌드를 줄여 성능을 향상 시킬 수 있음
여러 bloc 을 하위 트리에 제공하는 프로세스를 간소화하도록 설계된 위젯
⇒ 코드의 가독성 향상과 여러 BlocProvider 의 중첩과 관련된 복잡성과 혼란 제거
상태 변화에 대응하여 한 번만 수행되어야 하는 기능에 사용
⇒ 토스트, 스낵바, 다이얼로그 표시 등
bloc 의 상태 변화에 반응하여 리스너 함수 사용
⇒ CounterBloc 타입의 Bloc 을 사용하고, Bloc 의 State 타입이 int 임을 명시
상태 변경시 호출되는 콜백
⇒ 변경 사항에 응답하는 코드 입력
리스너 콜백을 호출해야 하는지 여부를 결적하는 선택적 콜백
⇒ 반환 값이 true 이면 리스너가 호출되고 그렇지 않으면 건너 뜀
여러 bloc 의 상태 변경을 수신해야 할 때 사용
⇒ 코드의 가독성 향상과 여러 BlocListener 의 중첩과 관련된 복잡성과 혼란 제거
하위 위젯에서 저장소에 접근하여 API 또는 DB 에서 데이터를 가져오는 등 데이터 작업 수행
위젯 트리에서 저장소를 검색하는 데 사용되는 메소드
애플리케이션의 구조를 명확하게 하고, 코드의 유지 보수성을 향상시켜줌
일관된 코드 컨벤션을 제공하고, 문서화가 잘 되어 있어 새로운 개발자들도 쉽게 학습하고 적용할 수 있음
널리 사용되는 라이브러리로 활발한 커뮤니티와 다양한 자료를 통해 지원을 받을 수 있음