[flutter] 플러터(Flutter)에서 디자인 패턴 적용하기
플러터(Flutter)는 Google에서 개발한 오픈 소스 모바일 앱 개발 프레임워크입니다. 디자인 패턴은 소프트웨어 개발에서 효율적이고 구조적인 코드를 작성하기 위한 중요한 개념입니다. 플러터 앱을 개발할 때도 이러한 디자인 패턴을 적용하여 유지보수성과 확장성을 높일 수 있습니다.
MVC(Model-View-Controller) 패턴
MVC 패턴은 모델(Model), 뷰(View), 컨트롤러(Controller)로 구성됩니다.
- 모델은 데이터와 비즈니스 로직을 담당합니다.
- 뷰는 사용자 인터페이스를 나타냅니다.
- 컨트롤러는 모델과 뷰 사이의 상호작용을 관리합니다.
예를 들어, 플러터 앱에서 MVC 패턴을 적용하려면 특정 화면에 대한 데이터와 비즈니스 로직을 모델에 정의하고, 사용자에게 보여지는 UI 요소를 뷰에 구현하며, 사용자 입력 및 이벤트를 처리하는 로직을 컨트롤러에 작성할 수 있습니다.
// 예시: MVC 패턴 적용
class MyModel {
String data;
// 비즈니스 로직 처리
}
class MyView extends StatelessWidget {
@override
Widget build(BuildContext context) {
// UI 요소 구현
}
}
class MyController {
MyModel model;
MyView view;
// 상호작용 관리 로직
}
Bloc 패턴
Bloc(Block) 패턴은 비즈니스 로직과 UI를 분리하여 관리하는 패턴으로, 플러터에서 상태 관리에 많이 활용됩니다. Bloc 패턴을 사용하면 코드의 의존성을 줄이고, 앱의 상태를 더 효율적으로 관리할 수 있습니다.
// 예시: Bloc 패턴 적용
class CounterBloc {
final _counter = BehaviorSubject<int>.seeded(0);
Stream<int> get counterStream => _counter.stream;
void increment() {
_counter.sink.add(_counter.value + 1);
}
void dispose() {
_counter.close();
}
}
class CounterScreen extends StatelessWidget {
final _counterBloc = CounterBloc();
@override
Widget build(BuildContext context) {
return StreamBuilder(
stream: _counterBloc.counterStream,
builder: (context, snapshot) {
// UI 업데이트
},
);
}
@override
void dispose() {
_counterBloc.dispose();
super.dispose();
}
}
Provider 패턴
Provider 패턴은 의존성 주입(Dependency Injection)을 통해 상태 및 데이터를 관리하는 패턴입니다. 이 패턴을 사용하면 상태 변경을 간단하게 감지하고, 필요한 부분에 쉽게 적용할 수 있습니다.
// 예시: Provider 패턴 적용
class MyModel extends ChangeNotifier {
String _data;
String get data => _data;
void updateData(String newData) {
_data = newData;
notifyListeners();
}
}
class MyScreen extends StatelessWidget {
@override
Widget build(BuildContext context) {
final myModel = Provider.of<MyModel>(context);
return Text(myModel.data);
}
}
디자인 패턴을 플러터 앱에 적용하는 방법은 여러 가지가 있지만, 특정 상황과 요구에 맞는 적절한 패턴을 선택하는 것이 중요합니다. 이러한 패턴을 활용하여 플러터 앱의 코드를 깔끔하고 확장 가능하게 유지할 수 있습니다.
참고:
- https://flutter.dev/docs/development/data-and-backend/state-mgmt/simple
- https://bloclibrary.dev/#/coreconcepts