Search

Bloc

Bloc (Business Logic Component)

Bloc(Business Logic Component)์€ Flutter ๊ณต์‹ ํŒ€์—์„œ ์ง€์›ํ•˜๋Š” ๊ฐ•๋ ฅํ•œ ์ƒํƒœ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ž…๋‹ˆ๋‹ค.
์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜ ์ƒํƒœ ๊ด€๋ฆฌ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๋ฉฐ, ๋Œ€๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ์—์„œ ๊ตฌ์กฐ์ ์ด๊ณ  ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์‰ฌ์šด ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๋ฐ ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค.

Bloc์˜ ํ•ต์‹ฌ ๊ฐœ๋…

Cubit vs Bloc

โ€ข
Cubit: ๊ฐ„๋‹จํ•œ ์ƒํƒœ ๊ด€๋ฆฌ (๋‹จ์ผ ์ƒํƒœ ๋ณ€๊ฒฝ)
โ€ข
Bloc: ์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜ ์ƒํƒœ ๊ด€๋ฆฌ (์—ฌ๋Ÿฌ ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅ)
๊ตฌ๋ถ„
Cubit
Bloc
์‚ฌ์šฉ ๋ฐฉ์‹
emit()์œผ๋กœ ์ƒํƒœ ๋ณ€๊ฒฝ
์ด๋ฒคํŠธ โ†’ ์ƒํƒœ ๋ณ€๊ฒฝ
์ฝ”๋“œ ๋ณต์žก๋„
๊ฐ„๋‹จํ•จ
๋‹ค์†Œ ๋ณต์žก
์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ
์—†์Œ
์žˆ์Œ
์„ฑ๋Šฅ ์ตœ์ ํ™”
๋น ๋ฆ„
์šฐ์ˆ˜ํ•จ
์ถ”์ฒœ ์šฉ๋„
๊ฐ„๋‹จํ•œ ์ƒํƒœ ๊ด€๋ฆฌ
๋ณต์žกํ•œ ์ƒํƒœ ๋กœ์ง

Bloc์˜ ์ฃผ์š” ๊ธฐ๋Šฅ๊ณผ ํŠน์ง•

1. ์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜ ์ƒํƒœ ๊ด€๋ฆฌ

โ€ข
Bloc์„ ์‚ฌ์šฉํ•˜๋ฉด **์‚ฌ์šฉ์ž์˜ ์ž…๋ ฅ(์ด๋ฒคํŠธ)**์„ ๋ฐ›์•„ ์ƒˆ๋กœ์šด ์ƒํƒœ๋กœ ๋ณ€๊ฒฝ
โ€ข
์ด๋ฒคํŠธ์™€ ์ƒํƒœ๊ฐ€ ๋ถ„๋ฆฌ๋˜์–ด ํ…Œ์ŠคํŠธ๊ฐ€ ์šฉ์ด

2. ๊ณ ์œ ํ•œ ์„ค๊ณ„ ํŒจํ„ด

โ€ข
Cubit โ†’ ๋‹จ์ˆœํ•œ ์ƒํƒœ ๋ณ€๊ฒฝ (emit())
โ€ข
Bloc โ†’ ์ด๋ฒคํŠธ๋ฅผ ๋ฐ›์•„ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝ (on<Event>() ์‚ฌ์šฉ)

3. ๊ฐ•๋ ฅํ•œ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ์ง€์›

โ€ข
async*์™€ Stream์„ ํ™œ์šฉํ•˜์—ฌ ๋น„๋™๊ธฐ ๋กœ์ง์„ ์‰ฝ๊ฒŒ ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅ
โ€ข
BlocObserver๋กœ ์ „์ฒด ์ƒํƒœ ๋ณ€ํ™”๋ฅผ ์ถ”์  ๊ฐ€๋Šฅ

4. ๋›ฐ์–ด๋‚œ ์„ฑ๋Šฅ ์ตœ์ ํ™”

โ€ข
BlocBuilder, BlocListener๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋ถˆํ•„์š”ํ•œ UI ๋ฆฌ๋นŒ๋“œ ์ตœ์†Œํ™”
โ€ข
BlocSelector๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŠน์ • ์ƒํƒœ ๋ณ€๊ฒฝ๋งŒ ๊ฐ์ง€ ๊ฐ€๋Šฅ

Bloc ์ฝ”๋“œ ์˜ˆ์ œ (Counter ์•ฑ ์˜ˆ์ œ)

Cubit ์˜ˆ์ œ (๊ฐ„๋‹จํ•œ ์ƒํƒœ ๊ด€๋ฆฌ)

import 'package:flutter_bloc/flutter_bloc.dart'; // Cubit: ๋‹จ์ˆœ ์ƒํƒœ ๊ด€๋ฆฌ class CounterCubit extends Cubit<int> { CounterCubit() : super(0); void increment() => emit(state + 1); void decrement() => emit(state - 1); }
Dart
๋ณต์‚ฌ
// UI์—์„œ ์‚ฌ์šฉ BlocBuilder<CounterCubit, int>( builder: (context, count) { return Text('$count'); }, );
Dart
๋ณต์‚ฌ

Bloc ์˜ˆ์ œ (์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜ ์ƒํƒœ ๊ด€๋ฆฌ)

import 'package:flutter_bloc/flutter_bloc.dart'; // ์ด๋ฒคํŠธ ์ •์˜ abstract class CounterEvent {} class Increment extends CounterEvent {} class Decrement extends CounterEvent {} // Bloc ์ •์˜ class CounterBloc extends Bloc<CounterEvent, int> { CounterBloc() : super(0) { on<Increment>((event, emit) => emit(state + 1)); on<Decrement>((event, emit) => emit(state - 1)); } }
Dart
๋ณต์‚ฌ
// UI์—์„œ ์‚ฌ์šฉ BlocBuilder<CounterBloc, int>( builder: (context, count) { return Column( children: [ Text('$count'), ElevatedButton( onPressed: () => context.read<CounterBloc>().add(Increment()), child: Text("์ฆ๊ฐ€"), ), ], ); }, );
Dart
๋ณต์‚ฌ

Bloc ํŒจํ„ด์˜ ํ•ต์‹ฌ ๊ตฌ์„ฑ ์š”์†Œ

๊ตฌ์„ฑ ์š”์†Œ
์„ค๋ช…
Bloc
์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ํ•ต์‹ฌ ํด๋ž˜์Šค
Event
์‚ฌ์šฉ์ž ์ž…๋ ฅ์„ ์ •์˜ํ•˜๋Š” ์ด๋ฒคํŠธ
State
ํ˜„์žฌ ์•ฑ์˜ ์ƒํƒœ
BlocBuilder
์ƒํƒœ ๋ณ€๊ฒฝ์„ ๊ฐ์ง€ํ•˜์—ฌ UI ์—…๋ฐ์ดํŠธ
BlocListener
์ƒํƒœ ๋ณ€๊ฒฝ ๊ฐ์ง€ ํ›„ ํŠน์ • ๋กœ์ง ์‹คํ–‰
BlocProvider
Bloc ์ธ์Šคํ„ด์Šค๋ฅผ ์ œ๊ณตํ•˜๋Š” ์œ„์ ฏ

Bloc vs ๋‹ค๋ฅธ ์ƒํƒœ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋น„๊ต

๊ธฐ๋Šฅ
Bloc
Riverpod
GetX
Provider
์ƒํƒœ ๊ด€๋ฆฌ ๋ฐฉ์‹
์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜
StateNotifier
obs
ChangeNotifier
๋น„๋™๊ธฐ ์ง€์›
์šฐ์ˆ˜ (Stream)
์šฐ์ˆ˜ (FutureProvider)
๊ฐ„ํŽธํ•จ
FutureBuilder ํ•„์š”
์˜์กด์„ฑ ๊ด€๋ฆฌ (DI)
RepositoryProvider ์‚ฌ์šฉ
ProviderScope ์‚ฌ์šฉ
Get.put() ์ง€์›
๊ธฐ๋ณธ ์ง€์› ์—†์Œ
์„ฑ๋Šฅ ์ตœ์ ํ™”
BlocListener๋กœ ์ตœ์ ํ™”
watch() ์‚ฌ์šฉ
GetBuilder๋กœ ์ตœ์ ํ™”
๋น„๊ต์  ๋‚ฎ์Œ
ํ…Œ์ŠคํŠธ ์šฉ์ด์„ฑ
๋งค์šฐ ์šฐ์ˆ˜
์šฐ์ˆ˜
๋‹ค์†Œ ๋ถ€์กฑ
์šฐ์ˆ˜
๊ฒฐ๋ก :
โ€ข
๋Œ€๊ทœ๋ชจ ์•ฑ์—์„œ Bloc์„ ์‚ฌ์šฉํ•˜๋ฉด ๊ตฌ์กฐ์ ์ด๊ณ  ์œ ์ง€๋ณด์ˆ˜ํ•˜๊ธฐ ์‰ฌ์›€
โ€ข
์ค‘ยท์†Œ๊ทœ๋ชจ ์•ฑ์ด๋ผ๋ฉด **Riverpod ๋˜๋Š” GetX*๊ฐ€ ๋” ๊ฐ„ํŽธ

Bloc์ด ์ ํ•ฉํ•œ ๊ฒฝ์šฐ

์ƒํ™ฉ
Bloc ์‚ฌ์šฉ ์—ฌ๋ถ€
๋Œ€๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ
์ถ”์ฒœ
ํŒ€ ๊ฐœ๋ฐœ ์‹œ ์œ ์ง€๋ณด์ˆ˜ ์šฉ์ด์„ฑ ํ•„์š”
์ถ”์ฒœ
์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜ ๋กœ์ง์ด ๋งŽ์Œ
์ถ”์ฒœ
์ž‘์€ ์•ฑ, ๋น ๋ฅธ ๊ฐœ๋ฐœ์ด ํ•„์š”
์ถ”์ฒœ X (GetX๊ฐ€ ๋” ์ ํ•ฉ)
๊ตฌ์กฐ์  ํŒจํ„ด ์—†์ด ๊ฐ„๋‹จํ•œ ์ƒํƒœ ๊ด€๋ฆฌ ํ•„์š”
์ถ”์ฒœ X (Riverpod, Provider ์‚ฌ์šฉ ๊ฐ€๋Šฅ)

๊ฒฐ๋ก : ์–ธ์ œ Bloc์„ ์จ์•ผ ํ• ๊นŒ?

โ€ข
๋Œ€๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ์—์„œ ์•ˆ์ •์ ์ธ ์ƒํƒœ ๊ด€๋ฆฌ๊ฐ€ ํ•„์š”ํ•  ๋•Œ
โ€ข
์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜ ๊ตฌ์กฐ๋กœ ์ƒํƒœ๋ฅผ ์ฒด๊ณ„์ ์œผ๋กœ ๊ด€๋ฆฌํ•˜๊ณ  ์‹ถ์„ ๋•Œ
โ€ข
ํŒ€ ๊ฐœ๋ฐœ์—์„œ ๋ช…ํ™•ํ•œ ์ฝ”๋“œ ๊ตฌ์กฐ๋ฅผ ์œ ์ง€ํ•˜๊ณ  ์‹ถ์„ ๋•Œ
Bloc์€ ๋ณต์žกํ•˜์ง€๋งŒ, ๋Œ€๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ๊ฐ€์žฅ ๊ฐ•๋ ฅํ•œ ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ!