Flutter

[Flutter] 39. 모노리스 구조의 개념과 특징

Song hyun 2024. 11. 13. 09:50
728x90
반응형

[Flutter] 39. 모노리스 구조의 개념과 특징

 

1. 모노리스 구조란?

  • 하나의 코드 파일에 UI, 비즈니스 로직, 프레젠테이션 로직을 모두 넣는 형식을 모노리식 구조(Monolithic Architecture) 즉 모노리스 구조(Monolith)라고 부른다.
  • (1) UI와 데이터 로직이 한 곳에 존재한다.
  • (2) 구조가 간단하다. 작은 규모의 앱이나 간단한 기능을 가진 앱에 적합한 구조!

 

 

 

 

2. 시나리오 코드

(1) 화면에 input form 띄우기

import 'package:flutter/material.dart';

void main() => runApp(TodoApp());

class TodoApp extends StatelessWidget {
  const TodoApp({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: TodoScreen(),
    );
  }
}

class TodoScreen extends StatefulWidget {
  const TodoScreen({super.key});

  @override
  State<TodoScreen> createState() => _TodoScreenState();
}

class _TodoScreenState extends State<TodoScreen> {
  // Todo기능을 개발 하기 위해 필요한 데이터는 뭘까?
  // UI 로직 : 프로젠테이션 로직
  final TextEditingController _controller = TextEditingController();

  // 데이터 : 할 일을 (목록을) 저장하는 리스트(저장 공간)
  List<String> todos = [];

  // 비즈니스 로직 : 할 일을 추가하는 기능
  void addTodo() {
    if(_controller.text.isNotEmpty) {
      todos.add(_controller.text);
      print("todos 확인 : ${todos.toString()}");

      _controller.clear();  // 프로젠테이션 로직
    }
  }

  // 비즈니스 로직 : 할 일을 삭제하는 기능
  void removeTodo(int index) {
    // 삭제 처리
    todos.removeAt(index);
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Simple Todo List'),
      ),
      body: Column(
        children: [
          // 입력 필드 만들기
          Padding(
            padding: const EdgeInsets.all(16.0),
            child: Row(
              children: [
                Expanded(
                  child: TextField(
                    controller: _controller,
                    decoration: InputDecoration(labelText: '작업을 입력 하시오'),
                  ),
                ),
                IconButton(
                  onPressed: addTodo,
                  icon: Icon(Icons.add),
                )
              ],
            ),
          ),
          // 아래에 할 일 목록 표시 구성
          Expanded(
            child: ListView.builder(
              itemCount: todos.length,
                itemBuilder: (context,index) {
              return ListTile(
                title: Text('사용자가 자료구조에 저장해둔 데이터를 뿌려야 함'),
                trailing: IconButton(
                    icon: Icon(Icons.delete),
                    onPressed: (){
                      removeTodo(index);
                    }
                ),
              );
            }),
          ),
        ],
      ),
    );
  }
}

 

 

(2) 입출력 처리 + setState()

 

 

import 'package:flutter/material.dart';

void main() => runApp(TodoApp());

class TodoApp extends StatelessWidget {
  const TodoApp({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: TodoScreen(),
    );
  }
}

class TodoScreen extends StatefulWidget {
  const TodoScreen({super.key});

  @override
  State<TodoScreen> createState() => _TodoScreenState();
}

class _TodoScreenState extends State<TodoScreen> {
  // Todo기능을 개발 하기 위해 필요한 데이터는 뭘까?
  // UI 로직 : 프로젠테이션 로직
  final TextEditingController _controller = TextEditingController();

  // 데이터 : 할 일을 (목록을) 저장하는 리스트(저장 공간)
  List<String> todos = [];

  // 비즈니스 로직 : 할 일을 추가하는 기능
  void addTodo() {
    if(_controller.text.isNotEmpty) {
      // 프로젠테이션 로직
      setState(() {
        todos.add(_controller.text);
        print("todos 확인 : ${todos.toString()}");

        _controller.clear();  // 프로젠테이션 로직
      });
    }
  }

  // 비즈니스 로직 : 할 일을 삭제하는 기능
  void removeTodo(int index) {
    // 삭제 처리
    setState(() {
      todos.removeAt(index);
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Simple Todo List'),
      ),
      body: Column(
        children: [
          // 입력 필드 만들기
          Padding(
            padding: const EdgeInsets.all(16.0),
            child: Row(
              children: [
                Expanded(
                  child: TextField(
                    controller: _controller,
                    decoration: InputDecoration(labelText: '작업을 입력 하시오'),
                  ),
                ),
                IconButton(
                  onPressed: addTodo,
                  icon: Icon(Icons.add),
                )
              ],
            ),
          ),
          // 아래에 할 일 목록 표시 구성
          Expanded(
            child: ListView.builder(
              itemCount: todos.length,
                itemBuilder: (context,index) {
              return ListTile(
                title: Text('사용자가 자료구조에 저장해둔 데이터를 뿌려야 함'),
                trailing: IconButton(
                    icon: Icon(Icons.delete),
                    onPressed: (){
                      removeTodo(index);
                    }
                ),
              );
            }),
          ),
        ],
      ),
    );
  }
}
728x90
반응형