5일차 과제 - rlatkddbs99/Flutter GitHub Wiki

1.MariaDB와 MySQL에는 어떤 차이점이 있는지, 어떤 관계인지 서술하고, MongoDB와는 어떤 차이점이 있는지 NoSQL과 RDBMS의 관점에서 정리

MySQL은 시장에서 사용할 수 있는 최초의 오픈 DB중 하나이며 가장 널리 사용되고 있는 관계형 데이터베이스 관리 시스템(RDBMS: Relational DBMS)이다. MySQL은 단순 쿼리 처리 성능이 어떤 제품보다 압도적이며 이미 오래 사용되어 왔기 때문에 성능과 신뢰성 등에서 꾸준히 개선되어 온 것도 장점이다. 또한 MySQL은 오픈 소스이며, 다중 사용자와 다중 스레드를 지원하고 C언어, C++, JAVA, PHP 등 여러 프로그래밍 언어를 위한 다양한 API를 제공 MySQL은 유닉스, 리눅스, 윈도우 등 다양한 운영체제에서 사용할 수 있으며, 특히 PHP와 함께 웹 개발에 자주 사용된다. 그러나 MySQL은 오픈 소스 라이센스를 따르기는 하지만, 상업적으로 사용할 때는 상업용 라이센스를 구입해야만 한다

MariaDB는 MySQL 데이터베이스 시스템을 기반으로 fork한 서비스로 MySQL의 개선된 버전이다. 그래서 MariaDB와 MySQL의 호환성은 매우 높다. 또한 MySQL에서 찾을 수 없는 수많은 내장된 강력한 기능과 많은 유용성, 보안 및 성능 개선사항이 함께 제공된다.

쿼리를 비롯한 전반적인 사용법은 MySQL과 유사. 마리아 db는 여러 장점을 가지고 있다. 빠르고 투명한 보안패치 릴리즈, 다양한 기능, 다양한 스토리지 엔진, 더 나은 성능, Galera 액티브-액티브 마스터 클러스터링 등

NoSQL 데이터베이스(일명 "SQL만을 사용하지 않는 데이터베이스")는 표 형식이 아니며, 관계형 테이블과는 다른 방식으로 데이터를 저장합니다 NoSQL 데이터 모델을 사용하면 관련 데이터를 단일 데이터 구조 내에 중첩시킬 수 있습니다 . NoSQL 데이터베이스의 각 유형은 특정한 고객 상황을 염두에 두어 설계되었고, 각각의 데이터베이스 유형은 기술적 이유을 고려해 구성 방식이 결정됩니다.설명하기 가장 간단한 유형이 문서 데이터베이스인데, 여기서는 기본적으로 하나의 JSON 문서에 기본 정보와 고객 정보가 통합되어 있습니다. 이 경우, 각각의 SQL 열 속성이 필드가 되며 고객 레코드의 세부 정보가 각 필드에 연관된 데이터 값이 됩니다.

                            Rdbms                            vs                  noSQL

적합한 사용예 데이터 정합성이 보장되어야 하는 은행 시스템 낮은 지연 시간, 가용성이 중요한 SNS 시스템 데이터 모델 정규화와 참조 무결성이 보장된 스키마 스키마가 없는 자유로운 데이터 모델 트랜젝션 강력한 ACID 지원 완화된 ACID(BASE) 확장 하드웨어 강화(Scale up) 수평 확장 가능한 분산 아키텍처(Scale out) API sql 쿼리 객체 기반 API 제공

캡처 2.

'''

import 'package:flutter/material.dart';

void main() { runApp(const MyApp()); }

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

@override Widget build(BuildContext context) { return MaterialApp( home: Scaffold( drawer: Drawer( child: ListView( padding: EdgeInsets.zero, children: [ DrawerHeader( child: ListTile( title: Text("스나이퍼 팩토리"), subtitle: Text("안녕하세요 스팩입니다"), leading: CircleAvatar( radius: 30, child: Text("스"), ), )), ListTile( title: Text("홈"), subtitle: Text("홈으로 이동하기"), ), ListTile( title: Text("커뮤니티"), subtitle: Text("커뮤니티로 이동하기"), ), ListTile( title: Text("로그아웃"), subtitle: Text("로그아웃합니다"), trailing: Icon(Icons.exit_to_app), ) ], ), ), body: SafeArea( child: Center(), )), ); } }

'''

만 4개 이상의 item을 추가할 시 첫 item만 icon과 label이 제대로 나타나고 그 이후 항목에 대해서는 label이 제대로 나타나지 않아 위치가 이상하게 보이는 문제가 발생 BottomNavigationBar에 type: BottomNavigationBarType.fixed을 추가

'''

import 'package:flutter/material.dart';

void main() { runApp(const MyApp()); }

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

@override Widget build(BuildContext context) { return MaterialApp( home: Scaffold( appBar: AppBar(), bottomNavigationBar: BottomNavigationBar( selectedItemColor: Colors.green, // 선택된 요소 색 unselectedItemColor: Colors.grey, type: BottomNavigationBarType.fixed, items: [ BottomNavigationBarItem(icon: Icon(Icons.home), label: "홈"), BottomNavigationBarItem(icon: Icon(Icons.people), label: "친구"), BottomNavigationBarItem(icon: Icon(Icons.camera), label: "watch"), BottomNavigationBarItem( icon: Icon(Icons.check_circle), label: "프로필"), BottomNavigationBarItem(icon: Icon(Icons.alarm), label: "알림"), BottomNavigationBarItem( icon: Image.asset("assets/a.png"), label: "메뉴"), ], ), body: SafeArea( child: Center(), )), ); } }

'''

캡처1 4.

'''

import 'package:flutter/material.dart';

void main() { runApp(const MyApp()); }

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

@override Widget build(BuildContext context) { return MaterialApp( home: Scaffold( floatingActionButton: FloatingActionButton.extended( onPressed: () {}, label: Text("지금 예약하기"), ), floatingActionButtonLocation: FloatingActionButtonLocation.centerFloat, bottomNavigationBar: BottomNavigationBar( selectedItemColor: Colors.green, // 선택된 요소 색 unselectedItemColor: Colors.grey, items: [ BottomNavigationBarItem(icon: Icon(Icons.home), label: "홈"), BottomNavigationBarItem(icon: Icon(Icons.block), label: "차단"), BottomNavigationBarItem( icon: Icon(Icons.settings), label: "설정"), ]), body: SafeArea( child: Center(), )), ); } }

'''

캡처2 5.

'''

import 'package:flutter/material.dart';

void main() { runApp(const MyApp()); }

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

@override Widget build(BuildContext context) { return MaterialApp( home: Scaffold( extendBodyBehindAppBar: true, appBar: AppBar( title: Text('CGB (영화 예매)'), backgroundColor: Colors.transparent, ), body: Column( children: [ Container( height: 200, decoration: BoxDecoration( image: DecorationImage( fit: BoxFit.fill, image: NetworkImage('https://picsum.photos/400/500'), ), ), ), Row( children: [ Expanded( child: Text( style: TextStyle( fontSize: 18, ), '속초 여행을 떠나면서', ), ), Icon(Icons.remove_red_eye), Text('232회') ], ), ListTile( title: Text('오류동 멋쟁이'), subtitle: Text('스나이퍼팩토리 누군가'), leading: ClipOval( child: Image.network('https://picsum.photos/50/50'), ), trailing: Text('3시간전'), ), Text( '대한민국의 영토는 한반도와 그 부속도서로 한다. 재판의 전심절차로서 행정심판을 할 수 있다. 행정심판의 절차는 법률로 정하되, 사법절차가 준용되어야 한다. 공무원의 직무상 불법행위로 손해를 받은 국민은 법률이 정하는 바에 의하여 국가 또는 공공단체에 정당한 배상을 청구할 수 있다. 이 경우 공무원 자신의 책임은 면제되지 아니한다.', ), ], ), ), ); } }

'''