시리즈

BLoC의 가장 큰 문제는 “BLoC” 이라는 이름입니다.

20231230
블록
상태관리
플러터
architecture
bloc
clean architecture
flutter
state management

저는 BLoC을 정말 좋아합니다.


상태 관리 플러그인으로서, BLoC은 말썽꾸러기 문제아인 getX 와는 아예 비교하고 싶지도 않고, provider 시리즈에 비교해서도 몇 가지 확실한 장점들이 있습니다.
패턴으로서의 BLoC 또한, 안정적이고 굳건한 코드를 작성할 수 있도록 해주는 점이 좋습니다.

하지만 BLoC이라는 이름은 몇몇 플러터 개발자들에게 혼동을 줍니다.
Business Logic Component. 비즈니스 로직을 담고 있는 컴포넌트?
먼저 Business Logic 의 일반적인 정의를 내리고 가야할 것 같네요.
우리가 일반적으로 생각하고 있는 Business Logic 은 무엇입니까?

(https://en.wikipedia.org/wiki/Business_logic)

위키피디아의 정의는 아래와 같습니다.

In computer software, business logic or domain logic is the part of the program that encodes the real-world business rules that determine how data can be created, stored, and changed. It is contrasted with the remainder of the software that might be concerned with lower-level details of managing a database or displaying the user interface, system infrastructure, or generally connecting various parts of the program.


데이터를 생성, 저장, 변화시키는 프로그램의 영역을 의미하죠. 이것이 일반적인 정의입니다.

Business Logic 을 제외한 다른 부분들. 데이터베이스를 저수준으로 다루는 디테일한 부분들, UI 보여주기, 시스템 인프라, 프로그램의 다른 부분들을 일반적으로 연결하는 것과는 구분됩니다.

간략화된 클린 아키텍처 방식으로 Presentation — Domain — Data 3단계 레이어로 나누었을때, Business Logic 은 일반적으로 Domain 레이어에 속합니다.



원조 4단계 레이어에서 이야기하는 Business Rules 은 Use Cases 레이어와 Entities 레이어에 있습니다. 단지 Enterprise wide 하냐, application specific 하냐 정도의 차이가 있습니다.


Entities

Entities encapsulate Enterprise wide business rules.

Use Cases

The software in this layer contains application specific business rules.


물론 레이어 정의는 주관적일 수 있습니다. 정해진 법이나 규칙이 있는 것은 아니죠. 따라서 보는 시각에 따라 다른 레이어에서도 Business Logic 을 담을 수 있다고 생각할 수 있습니다. 네, 좋아요. 좋습니다. 하지만 확실한 것은 Domain 레이어는 Business Logic 을 담고 있습니다.

그러면 BLoC 에서 주장하는 Business Logic(이하 BL) 은 무엇입니까?

https://bloclibrary.dev/#/architecture?id=business-logic-layer

이 문단을 보면 알수 있듯이,

The business logic layer’s responsibility is to respond to input from the presentation layer with new states. This layer can depend on one or more repositories to retrieve data needed to build up the application state.

Think of the business logic layer as the bridge between the user interface (presentation layer) and the data layer. The business logic layer is notified of events/actions from the presentation layer and then communicates with repository in order to build a new state for the presentation layer to consume.

BLoC 에서의 BL의 정의는 일반적이지 않은 정의를 내리고 있습니다.

첫 문단에서는 BLoC 이 그저 프레젠테이션 레이어에서 입력을 받아서 반응하는 책임만을 가지고 있습니다. 레포지토리들에서 App State 를 구성하기 위한 데이터를 불러오죠.

두번째 문단을 보면 갑자기 Business Logic 레이어를 프레젠테이션 레이어와 데이터 레이어를 연결하는 다리로 생각하자라고 합니다. Presentation 레이어와 Data 레이어? 웬 Data Layer?

그러면 BLoC 클래스는 Domain 레이어와 동치됩니까? 왜 첫 문단과 다른 이야기를 합니까? 왜 이렇게 우리를 헷갈리게 하나요?

아까 보았던 위키피디아의 정의를 다시 보죠.

It is contrasted with the remainder of the software that might be concerned with lower-level details of managing a database or displaying the user interface, system infrastructure, or generally connecting various parts of the program.

프로그램의 다른 파트들을 일반적으로 연결해주는 것을 BL 에서 제외하고 있는 위키피디아의 정의와는 완전히 상충되고 있습니다.


그 문단 아래쪽에 있는 그림을 보면 결국 BLoC은 Application Layer(?) 에 속해있습니다.

우리가 좀 전에 봤던 Presentation — Domain — Data 구조에서 Presentation 과 Domain 레이어 사이에 BLoC 레이어를 만들어 놓고 있죠.

하지만 결국 일반적인 3단계 구조로 생각했을 때 Presentation 레이어에 속합니다. Application 레이어를 Presentation 이라고 생각해도 아무런 문제가 없습니다. 그림의 윗부분에도 App-Domain-Data 로 나누어져 표시되어 있듯이 BLoC은 3단계 구조에서 Domain 이 아니라 다른 레이어에 속합니다. 
BLoC은 Domain 레이어에 속하지 않는다고요.

그러면 왜 위 그림에 BLoC 부분에 Business Logic 이라고 썼을까요?

그건 BLoC에서 정의한 BL에 따라서 저 부분이 BL이기 때문입니다. 이상하죠?


우리가 지금까지 내린 결론은 다음과 같습니다.

Domain 레이어는 Business Logic 을 담고 있습니다.

BLoC(Business Logic Component) 은 Domain 레이어에 속하지 않습니다.

이러한 모순이 생깁니다.

둘 중 하나는 문제가 있겠죠. 그리고 그건 일반적인 정의에 있는 것이 아니라 BLoC 에서의 BL 정의에 있다고 생각하는 것이 자연스러울 겁니다.

그러면 왜 이런 특수한 정의를 하고 있을까요?

제가 생각하기에는 그건 이름 때문입니다. BLoC 플러그인을 만든
Felix Angelov 도 죄가 없습니다. 단지 BLoC 이라는 패턴을 명명한 사람이 문제가 있는 것입니다. 비즈니스 로직이라는 단어가 들어가면 안됐습니다.



어쨌든 BLoC 에서의 Business Logic 은 개발자들이 일반적으로 생각하는 것과는 차이가 있습니다.

그러니 우리 BLoC에 우리의 일반적인 Business Logic 을 모두 담지 말아요.

#블록패턴 #블록아키텍처 #상태관리

.

piano (press key Q)

Categories

flutter ( 82 ) dart ( 34 ) android ( 32 ) kotlin ( 11 ) plugin ( 8 ) provider ( 8 ) vim ( 7 ) bloc ( 6 ) iOS ( 6 ) state management ( 6 ) 플러터 ( 6 ) PS ( 5 ) algorithm ( 5 ) architecture ( 5 ) async ( 5 ) getx ( 5 ) java ( 5 ) API ( 4 ) BOJ ( 4 ) class ( 4 ) daily ( 4 ) git ( 4 ) golang ( 4 ) memo ( 4 ) riverpod ( 4 ) state ( 4 ) stream ( 4 ) test ( 4 ) web ( 4 ) widget ( 4 ) windows ( 4 ) HTTP ( 3 ) androidX ( 3 ) app state ( 3 ) context ( 3 ) crash ( 3 ) db ( 3 ) editor ( 3 ) error ( 3 ) extension ( 3 ) github ( 3 ) hive ( 3 ) ide ( 3 ) package ( 3 ) pubspec ( 3 ) python ( 3 ) syntax ( 3 ) vscode ( 3 ) app icon ( 2 ) await ( 2 ) chocolatey ( 2 ) consumer ( 2 ) cp949 ( 2 ) deployment ( 2 ) dev ( 2 ) flavor ( 2 ) gesture ( 2 ) globalkey ( 2 ) go ( 2 ) google ( 2 ) hack ( 2 ) js ( 2 ) json ( 2 ) key ( 2 ) keystore ( 2 ) list ( 2 ) listview ( 2 ) lock ( 2 ) mac ( 2 ) map ( 2 ) navigation ( 2 ) nosql ( 2 ) project ( 2 ) pub ( 2 ) recyclerview ( 2 ) rxdart ( 2 ) sdk ( 2 ) selector ( 2 ) setting ( 2 ) size ( 2 ) soc ( 2 ) synchronized ( 2 ) tdd ( 2 ) tip ( 2 ) version ( 2 ) viewmodel ( 2 ) vundle ( 2 ) webview ( 2 ) xcode ( 2 ) yaml ( 2 ) ( 2 ) 플러터 단점 ( 2 ) 16.0 ( 1 ) 2.0 ( 1 ) 2023 ( 1 ) AATP2 ( 1 ) ChangeNotifierProvider ( 1 ) Example ( 1 ) Guava ( 1 ) ImageReader ( 1 ) Mo's algorithm ( 1 ) OAuth2 ( 1 ) OpenGL ( 1 ) Oreo ( 1 ) ProgressBar ( 1 ) REST API ( 1 ) Trie ( 1 ) activity ( 1 ) adaptive ( 1 ) android P ( 1 ) android context ( 1 ) android11 ( 1 ) apktool2 ( 1 ) app exit ( 1 ) append ( 1 ) appicon ( 1 ) arkit ( 1 ) array ( 1 ) asciidoc ( 1 ) async * ( 1 ) async* ( 1 ) audio ( 1 ) authorization ( 1 ) await for ( 1 ) behaviorsubject ( 1 ) beta ( 1 ) binary ( 1 ) binarysearch ( 1 ) blender ( 1 ) book ( 1 ) bottomsheet ( 1 ) break ( 1 ) broadcast ( 1 ) browser ( 1 ) bubbles ( 1 ) bug ( 1 ) build ( 1 ) buildcontext ( 1 ) buildnumber ( 1 ) bundle ( 1 ) button ( 1 ) bytecode ( 1 ) cache ( 1 ) camera2 ( 1 ) cameramanager ( 1 ) cd ( 1 ) chrome ( 1 ) ci ( 1 ) circle ( 1 ) clean ( 1 ) clean architecture ( 1 ) cli ( 1 ) clip ( 1 ) clipboard ( 1 ) cloud ide ( 1 ) cmdlet ( 1 ) code ( 1 ) coding test ( 1 ) command ( 1 ) comparator ( 1 ) complexity ( 1 ) concurrency ( 1 ) conditional ( 1 ) const ( 1 ) constraint ( 1 ) constraintlayout ( 1 ) controlc ( 1 ) controlv ( 1 ) converter ( 1 ) copy ( 1 ) copy project ( 1 ) coupling ( 1 ) coverage ( 1 ) cp ( 1 ) css ( 1 ) cupertino ( 1 ) cursor ( 1 ) cv ( 1 ) data class ( 1 ) data structure ( 1 ) dataBinding ( 1 ) database ( 1 ) debounce ( 1 ) decompile ( 1 ) delegate ( 1 ) deno ( 1 ) design pattern ( 1 ) development ( 1 ) device ( 1 ) di ( 1 ) dialog ( 1 ) dio ( 1 ) drawable ( 1 ) drug ( 1 ) emmet ( 1 ) encoding ( 1 ) english ( 1 ) entries ( 1 ) environment ( 1 ) equality ( 1 ) equatable ( 1 ) euc-kr ( 1 ) euckr ( 1 ) exit ( 1 ) expand ( 1 ) expanded ( 1 ) export ( 1 ) extension method ( 1 ) facade ( 1 ) fake ( 1 ) field ( 1 ) figma ( 1 ) final ( 1 ) fixed ( 1 ) flutter pub ( 1 ) flutter web ( 1 ) flutter_inappwebview ( 1 ) flutter_test ( 1 ) flutterflow ( 1 ) fold ( 1 ) fonts ( 1 ) form ( 1 ) frame ( 1 ) future ( 1 ) gestureDetector ( 1 ) gestureRecognizer ( 1 ) gesturearena ( 1 ) get-command ( 1 ) get_cli ( 1 ) getbuilder ( 1 ) getx단점 ( 1 ) gitignore ( 1 ) glut ( 1 ) google fonts ( 1 ) gopath ( 1 ) goto ( 1 ) gradient ( 1 ) graphics ( 1 ) gvim ( 1 ) hackaton ( 1 ) hash ( 1 ) hashmap ( 1 ) hot reload ( 1 ) how to ( 1 ) html ( 1 ) i18n ( 1 ) icon ( 1 ) id ( 1 ) impeller ( 1 ) implementation ( 1 ) import ( 1 ) indicator ( 1 ) inkwell ( 1 ) interrupt ( 1 ) intl ( 1 ) introduction ( 1 ) io ( 1 ) isar ( 1 ) iterable ( 1 ) iteration ( 1 ) javascript ( 1 ) julia ( 1 ) juno ( 1 ) jupyter ( 1 ) kakaomap ( 1 ) keytool ( 1 ) korean ( 1 ) kotlin syntax ( 1 ) l10n ( 1 ) lambda ( 1 ) language ( 1 ) layer ( 1 ) layout ( 1 ) lineageOS ( 1 ) localkey ( 1 ) localtoglobal ( 1 ) long list ( 1 ) ls ( 1 ) mac osx ( 1 ) markdown ( 1 ) markup ( 1 ) material ( 1 ) method ( 1 ) microtask ( 1 ) migrate ( 1 ) mintlify ( 1 ) mock ( 1 ) module ( 1 ) monitor ( 1 ) moor ( 1 ) mouse ( 1 ) mouseregion ( 1 ) multiplatform ( 1 ) multiset ( 1 ) multithread ( 1 ) mutable ( 1 ) mvvm ( 1 ) new ( 1 ) node ( 1 ) nodejs ( 1 ) nosuchmethod ( 1 ) null-safety ( 1 ) numberformat ( 1 ) nvim ( 1 ) object ( 1 ) objectbox ( 1 ) objectkey ( 1 ) obx ( 1 ) online ide ( 1 ) operator ( 1 ) orientation ( 1 ) parabeac ( 1 ) parse ( 1 ) paste ( 1 ) path ( 1 ) pattern ( 1 ) pitfall ( 1 ) play store ( 1 ) pod ( 1 ) podfile ( 1 ) pointer ( 1 ) pointers ( 1 ) powershell ( 1 ) private ( 1 ) programming ( 1 ) pull to refresh ( 1 ) puzzle ( 1 ) pycharm ( 1 ) realitykit ( 1 ) recursion ( 1 ) reduce ( 1 ) reference ( 1 ) regex ( 1 ) regular expression ( 1 ) release note ( 1 ) renderbox ( 1 ) renderobject ( 1 ) repl ( 1 ) repository ( 1 ) response ( 1 ) rm ( 1 ) rotue ( 1 ) round ( 1 ) run ( 1 ) scope ( 1 ) scroll ( 1 ) search ( 1 ) server ( 1 ) serverless ( 1 ) service ( 1 ) sharp ( 1 ) singlerepo ( 1 ) singleton ( 1 ) sketch ( 1 ) sliver ( 1 ) sliverlist ( 1 ) snippets ( 1 ) sogae ( 1 ) sorting ( 1 ) source ( 1 ) sparse ( 1 ) sparse array ( 1 ) spec ( 1 ) split ( 1 ) sqflite ( 1 ) sqlite ( 1 ) sqrt decomposition ( 1 ) stateful ( 1 ) statefulwidget ( 1 ) step ( 1 ) stepper ( 1 ) string ( 1 ) stringbuffer ( 1 ) stringbuilder ( 1 ) studio ( 1 ) study ( 1 ) sub-directory ( 1 ) svn ( 1 ) swiftui ( 1 ) swipe to refresh ( 1 ) system_alert_window ( 1 ) system_cache ( 1 ) systemnavigator ( 1 ) tail recursion ( 1 ) tailrec ( 1 ) tap test ( 1 ) text ( 1 ) texteditingcontroller ( 1 ) textfield ( 1 ) texttheme ( 1 ) themedata ( 1 ) then ( 1 ) thread ( 1 ) throttle ( 1 ) time ( 1 ) tool ( 1 ) tools ( 1 ) tooltip ( 1 ) ts ( 1 ) tutorial ( 1 ) typescript ( 1 ) ui ( 1 ) unittest ( 1 ) update ( 1 ) usb ( 1 ) utf8 ( 1 ) ux ( 1 ) valuekey ( 1 ) variable ( 1 ) vector ( 1 ) versioncode ( 1 ) very_good ( 1 ) view ( 1 ) vim plugin ( 1 ) vimrc ( 1 ) virtualenv ( 1 ) wasm ( 1 ) web app ( 1 ) webview_flutter ( 1 ) while ( 1 ) widget tree ( 1 ) window ( 1 ) wsl ( 1 ) yield ( 1 ) 강의 ( 1 ) 개발 ( 1 ) 개발 공부 ( 1 ) 공부법 ( 1 ) 그래픽스 ( 1 ) 꼬리재귀 ( 1 ) 꿀팁 ( 1 ) 데노 ( 1 ) 두줄 ( 1 ) 디노 ( 1 ) 번역 ( 1 ) 블록 ( 1 ) 상태관리 ( 1 ) 실험 ( 1 ) 안드로이드 ( 1 ) 안드로이드프로젝트 ( 1 ) 안드로이드프로젝트복사 ( 1 ) 어이없는 ( 1 ) 조건부 임포트 ( 1 ) 주절주절분노조절실패의식으흐름 ( 1 ) 패키지 ( 1 ) 프로젝트복사 ( 1 ) 플러그인 ( 1 )