클라우드는 네트워크 전체에서 확장 가능한 리소스를 추상화, 풀링 및 공유하는 IT 환경이다.
클라우드 환경 내에서 워크로드를 실행하는 동작인 클라우드 컴퓨팅을 지원한다.
소프트웨어를 다운로드하지 않고도 인터넷을 통해 사용자가 액세스하는 모든 인프라, 플랫폼, 소프트웨어 또는 기술은 클라우드 컴퓨팅 서비스라고 볼 수 있으며 다음의 서비스형(as-a-Service)이 있다.
클라우드는 무엇을 서비스하느냐에 따라 크게 IaaS, PaaS, SaaS로 나눈다.
근래에는 클라우드 인프라에서 서비스하는 이름을 붙여 DaaS, BaaS를 지칭하기도 한다.
서버, 스토리지, 네트워크를 가상화 환경으로 만들어 필요에 따라 인프라 자원을 사용할 수 있게 제공하는 서비스 이다.
보통 운영체제 기반으로 서비스를 제공하기 때문에 KVM,Xen과 같은 하이퍼바이저를 이용한 Type1 형태로 구축된다.
대표적인 IaaS 서비스는 AWS의 EC2, S3 등이 있습니다.
개발 플랫폼으로 확장한 것으로, 운영체제에 미리 플렛폼들을 설치하여 서비스를 제공해주는 것을 뜻한다.
PaaS 서비스는 운영체제가 아니라 플랫폼 서비스를 제공하기 때문에 OS에 대한 조작이 불가능하다. 보통 서비스 단위로 서비스를 제공하기 때문에 Container 개념인 Docker 나 Kubernetes를 이용하여 제공 환경 구축한다.
대표적으로 PaaS 서비스는 Nginx(웹서버), MariaDB(데이터베이스), Django(웹프레임워크) 와 같은 개발 플렛폼들이 있다.
소프트웨어 중점으로 주로 웹을 통하여 클라이언트가 On-Demend 소프트웨어로 서비스를 제공한다.
주로 웹환경에서 사용자들이 서비스를 이용할 수 있는 환경을 제공한다.
대표적으로 google drive, google docs, 웹포토샵 등 다양하게 있다.
on-Demend란?
서비스를 요청시 즉시 서비스를 이용할 수 있는 환경을 뜻한다.
모바일 환경에서 구현하기 복잡하고 힘든 서버 사이드 서비스를 API 서비스로 제공해서 모바일 앱이나 웹을 개발할 때 UX/UI에 집중할 수 있도록 하는 서비스 이다.
스마트폰의 보급, 사물인터넷(IOT) 산업이 발전함에 따라 파생되는 서비스들이 많이 출시되고 있다. 이로 인해 IP(IPv4 => IPvr6)사용량 증가와 트래픽 폭증이 이어지면서 5G통신 발달로 이어졌다.
이에 맞춰 클라우드 기술 기반으로 IOT, 스트리밍 서비스들이 생기고 이를 BaaS 라고 합니다.
서버리스(Serverless)는 클라우드 컴퓨팅의 모델 중 하나로 개발자가 서버를 직접 관리할 필요가 없는 아키텍처를 의미한다.
기존 IaaS나 PaaS와는 다르게 실제 사용량에 대해서만 비용이 청구되므로 경제적
서버에 신경 쓸 필요가 없으므로 개발자 생산성 향상 및 개발 시간 단축
자동 스케일 업 및 스케일 다운
간단한 패키징 및 배포
Cold Start
서버가 항시 요청에 대기하고 있는게 아니라 느림
규모가 커지거나 속도를 요구하는 프로젝트라면 서버리스는 좋은 선택이 아닐 수 있음
실행 시간 한계
긴 시간이 필요한 작업(동영상 업로드, 데이터 백업 등)에는 굉장히 비효율적
서버리스는 함수가 1회 호출 될 때 사용할 수 있는 메모리 및 시간에 제한이 있음
만약 작업이 끝나지 않은채로 해당 시간이 지나면 작업이 완료될때까지 일정 시간마다 계속 함수를 다시 호출하게 됨
클라우드 제공 플랫폼에 종속적
디버깅 및 테스트 불편
온프레미스란 필요한 시스템을 구축하기 위해서 하드웨어와 소프트웨어를 구입하여, 시스템 구성 상황에 맞게 환경을 구성하는 것을 말한다. 즉 서버실과 혹은 데이터 센터와 같이 특정 공간에 IT 인프라를 구축하여 소프트웨어를 사용하는 방식이다.
이러한 방법은 인프라를 구축하기 위한 기간이 필요하며, 상황에 따라서는 몇 개월 이상이 걸리기도 한다. 또한 시스템을 구축하기 위한 물리적인 하드웨어 장비를 구매하는 비용이 들어가며, 부차적으로는 이를 관리 및 운용을 위한 유지보수 비용을 필요로 한다.
오프프레미스는 전통적인 방식의 온프레미스 소프트웨와는 다르게 인터넷 네트워크에 연결된 서버팜이나 클라우드의 원격 실행환경에서 사용되는 소프트웨어를 뜻한다.
즉, 온프레미스처럼 물리적인 장치나 사이트 운영시 필요한 서비스를 직접 갖추지 않아도, 네트워크를 통해 제공받는 운영 형태를 오프프레미스라고 한다. 이러한 서비스들은 제공 제공 범위에 따라 각각 Iaas, Paas, Saas로 나눌 수 있다.
FireBase는 2014년도에 구글에서 인수한 모바일, 웹 애플리케이션 개발 플랫폼이다.
모든 플랫폼을 프로젝트 구축 시, 자동적으로 만들어 준다. 또한 서버를 구축하기 위해서 리눅스 명령어를 알 필요도 없고, 도메인을 구입할 필요도 없으며 개발하는 동안에는 서버를 구입할 필요도 없다.
백엔드 기능을 클라우드 서비스 형태로 제공하기 때문에 서버리스 애플리케이션 개발이 가능하다.
- Cloud Firestore : 클라우드에 호스팅 되는 NoSQL 데이터베이스를 사용해서 글로벌 규모의 데이터를 저장하고, 사용자와 기기 간에 동기화할 수 있다. Cloud Firestore는 효율적인 데이터 쿼리와 실시간 동기화 및 오프라인 지원을 제공한다.
- 인증 : 이메일 및 비밀번호, 타사 제공업체(예: Google 또는 Facebook), 기존 계정 시스템 직접 사용 등의 다양한 인증 방법을 제공한다.
- 실시간 데이터베이스 : 클라이어트 간에 동기화된 상태를 실시간으로 요구하는 모바일 앱을 위해서 효율적이고 대기 시간이 짧은 솔루션. 새 프로젝트를 시작하는 경우 실시간 DB 대신에 Cloud Firestore를 구글에서 권장하고 있다.
- Cloud Storage : Google의 규모를 활용한 강력하고 단순하며 경제적인 객체 스토리지에 이미지, 오디오, 동영상 등의 사용자 제작 컨텐츠를 저장하고 공유할 수 있다.
- 원격 구성 : 각 사용자에게 앱이 표시되는 방식을 맞춤으로 설정할 수 있다.
- 클라우드 메시징 : Android, iOS, 웹 등의 플랫폼을 넘나들며 사용자에게 메시지와 알림을 무료로 보낸다.
1) 인증 시스템을 지원한다.
2) FireBase는 NoSQl 기반의 3세대 데이터베이스 이다.
-> RTSP(Real Time Stream Protocol) 방식을 말하며 말그대로 실시간으로 데이터들을 전송해주는 방식이다.
3) 원격 구성을 지원한다
4) 콘솔을 제공히는데 쉽게 말해서 서버 관리자 페이지라고 생각하면 된다.
5) Analytics를 제공힌다.
1) Firebase를 많이 사용한 유저들이 하는 말은 서버의 응답속도가 종종 느려진다.
2) Firebase의 데이터베이스인 FireStore(신버전 데이터베이스)나 RealTimeDatabase(구버전 데이터베이스) 모두 쿼리가 굉장히 빈약하다.
Supabase는 구글 Firebase를 엔터프라이즈 레벨에서도 사용 가능하도록 만든 오픈소스 프로젝트이다.
컴퓨터에 직접 설치하는 방식은 아니고, Firebase처럼 클라우드로 제공되는 서비스이다.
클라이언트가 필요한 리소스를 서버에 요청하면 서버는 그에 대해 응답한다.
기본적인 클라이언트-서버 모델의 동작이며, 항상 새로운 요청을 보내는 쪽은 클라이언트이다.
push server는 클라이언트의 요청이 오면 응답해주는 방식이 아닌, 서버가 클라이언트에게 공지사항과 같은 무엇인가 통지해주기 위한 방법이다.
클라이언트의 요청이 없어도 서버는 클라이언트에게 응답하는 방식이다.
관계형 데이터베이스 관리 시스템이라는 뜻으로 현재 사용되고 있는 일반적인 데이터베이스는 RDBMS를 사용하고 있다고 보면 된다.
엑셀의 형식과 유사한 2차원 테이블 형식으로 구성되며 속성과 값을 이용하여 데이터를 정의하고 저장 및 관리한다.
이러한 데이터들을 활용하기 위해서는 사용자는 SQL이라는 언어를 활용한다.
예를 들면 재무기록, 제조 및 물류정보, 회원정보 등이 이에 해당된다.
Not Only SQL의 약자로써, 관계형 데이터베이스와 반대되는 방식을 사용하고 데이터와 데이블 간의 관계를 정의하지 않는다. 따라서 정해진 스키마가 없어서 보다 자유롭게 데이터를 저장할 수 있다.
RDBMS로는 관리할 수 없는 복잡하고 용량이 큰 데이터드을 관리할 수 있도록 하기 위한 목적으로 등장한 개념이다. 그래서 key값만 가지고 데이터에 대한 입출렵을 수행할 수 있다.
1) 정형화 데이터 | 비정형 데이터
2) olumn과 Row | json 데이터
3) insert 위주 | select위주(유저, 게시글, 댓글)
4) 금융 | 소셜
supabase로 들어가 로그인한다.
(Git Hub계정으로 로그인 가능하다)
new project를 클릭하고
이름은 test라고 지정해준 뒤, 비밀번호는 길게 설정해 준다.
지역은 부산으로 설정한 후 create 한다.
세팅될때까지 기다린다.
완료가 되면 아래의 화면과 같이 뜨는데 database를 만들어 주기 위해 클릭한다.
아래와 같이 뜨는데 create new table을 해준다.
연습용으로 하는 거라 Enable Row Level은 선택 해제 해주고, 밑에 체크박스는 pull과 push가 가능하게 하도록 선택해준다.
Columns에서 설정버튼을 눌려서 isUnique를 체크해준다.
(밑에 column은 삭제해준다.)
add column은 클릭해 이름은 content 타입은 varchar로 해서 save를 클릭한다.
home에서 database를 클릭해 todo테이블을 선택하여 위의 insert버튼의 row insert를 클릭해준다.
그럼 이런 창이 뜨는데 데이터를 입력해 주고 save를 눌려준다.
데이터가 들어간 것을 확인할 수 있다.
DBeaver를 실행해 다음과 같이 클릭해준다.
PostgreSQL을 클릭하고 다음을 눌러준다.
다음과 같은 창이 뜨는데 host는 supabase에서 복붙해주고, 비밀번호는 위에서 만들 때 입력해줬던 비밀번호를 적는다.
그리고 난 후에 test connection을 클릭한다.
아래의 그림을 따라가 복붙한다.
test connection을 눌려 다음과 같이 뜨면 download를 해주고
그럼 connection이 됐다고 나오고 확인을 눌러주면 된다.
Postgre -> Database -> postgres -> public -> tables -> todo에 들어가면 supabase에서 입력했던 데이터가 들어간 것을 볼 수 있다.
새로운 project를 만들어 준다.
yaml파일에 들어가서 아래의 그림과 같이 적어주고 pub get을 눌러준다.
supabase_flutter:
실행을 위해 main dart파일을 만들어 준다.
(주석으로 설명)
import 'package:flutter/material.dart';
import 'package:supabase_flutter/supabase_flutter.dart';
Future<void> main() async{// future async await 는 무조건 함께
await Supabase.initialize(//runApp을 실행하기 전에 먼저 작성해줘야 함
url: "https://jhcvljjxxepwhzrlkida.supabase.co",
anonKey: "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6ImpoY3Zsamp4eGVwd2h6cmxraWRhIiwicm9sZSI6ImFub24iLCJpYXQiOjE2ODA1NzIyNTksImV4cCI6MTk5NjE0ODI1OX0.UJsTBmISHAGWbmRqusHFkMt2VlXhjPQStdt8GgX7fZo"
);//로그인 된 상태
runApp(MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({Key? key}) : super(key: key);
Widget build(BuildContext context) {
//연결되는 상태
Supabase.instance.client.from("todo").select().then((value){
print(value);
});
return const Placeholder();
}
}
supabase에서 설정에 들어가 API를 클릭 후 복붙해준다.
(url = URL, anonKey = APIkey)await Supabase.initialize(//runApp을 실행하기 전에 먼저 작성해줘야 함 url: "https://jhcvljjxxepwhzrlkida.supabase.co", anonKey: "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6ImpoY3Zsamp4eGVwd2h6cmxraWRhIiwicm9sZSI6ImFub24iLCJpYXQiOjE2ODA1NzIyNTksImV4cCI6MTk5NjE0ODI1OX0.UJsTBmISHAGWbmRqusHFkMt2VlXhjPQStdt8GgX7fZo" );
실행하면 console에 아래와 같이 데이터가 나온다.
supabase는 관계형 데이터베이스인 postgreSql을 사용하면서 push 기능(realtime)을 이용할 수 있습니다.
supabase에 가서 새로운 데이터를 입력해주고 main.dart를 변경 해준다.
main dart를 변경해준다.
(주석으로 설명함)
import 'package:flutter/material.dart';
import 'package:supabase_flutter/supabase_flutter.dart';
Future<void> main() async{// future async await 는 무조건 함께
await Supabase.initialize(//runApp을 실행하기 전에 먼저 작성해줘야 함
url: "https://jhcvljjxxepwhzrlkida.supabase.co",
anonKey: "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6ImpoY3Zsamp4eGVwd2h6cmxraWRhIiwicm9sZSI6ImFub24iLCJpYXQiOjE2ODA1NzIyNTksImV4cCI6MTk5NjE0ODI1OX0.UJsTBmISHAGWbmRqusHFkMt2VlXhjPQStdt8GgX7fZo"
);//로그인 된 상태
runApp(MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({Key? key}) : super(key: key);
Widget build(BuildContext context) {
//연결되는 상태
// Supabase.instance.client.from("todo").select().then((value){
// print(value);
// });
//리스트를 받는 타입
Supabase.instance.client.from("todo").stream(primaryKey: ["idx"]).listen((event) {
print(event);
});
return const Placeholder();
}
}
실행하면 아래의 결과처럼 나온다.
그리고 supabase에서 데이터를 하나 더 입력해주면 자동으로 아래와 같이 들어와 출력이 되는 것을 볼 수 있다.
플러터에서 스트림을 이용하여 postgreSql이 업데이트 되면 실시간 데이터 반영이 가능하다.
import 'package:flutter/material.dart';
import 'package:supabase_flutter/supabase_flutter.dart';
Future<void> main() async{// future async await 는 무조건 함께
await Supabase.initialize(//runApp을 실행하기 전에 먼저 작성해줘야 함
url: "https://jhcvljjxxepwhzrlkida.supabase.co",
anonKey: "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6ImpoY3Zsamp4eGVwd2h6cmxraWRhIiwicm9sZSI6ImFub24iLCJpYXQiOjE2ODA1NzIyNTksImV4cCI6MTk5NjE0ODI1OX0.UJsTBmISHAGWbmRqusHFkMt2VlXhjPQStdt8GgX7fZo"
);//로그인 된 상태
runApp(MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({Key? key}) : super(key: key);
Widget build(BuildContext context) {
//연결되는 상태
// Supabase.instance.client.from("todo").select().then((value){
// print(value);
// });
//리스트를 받는 타입
Supabase.instance.client.from("todo").stream(primaryKey: ["idx"]).listen((event) {
print(event);
});
return MaterialApp(
home: Scaffold(
body: SafeArea(
child: StreamBuilder<List<Map<String, dynamic>>>(//event에 커서 올려서 복붙(그림으로 설명함)
//stream에는 위에 복붙해서 가져옴.
stream: Supabase.instance.client.from("todo").stream(primaryKey: ["idx"]),
builder: (context, snapshot) {
return ListView(//리스트뷰가 데이터를 뿌리기 때문에 stream을 받아줘야함
children: snapshot.data?.map((e) => Text(e["content"])).toList() ?? [],
);
}
),
),
),
);
}
}
ListView안에서 아래와 같이 쉽게 변경할 수 있다.
event에 커서를 두고 복붙해서 StreamBuilder안에 붙여준다.
(해당 리스트를 받기 때문에)
실행하면 아래의 결과와 같이 출력된다.
(supabase에 데이터를 입력하고 다시 출력하면 데이터가 추가가 된다.)
콘솔에 아래 코드를 적어주고 완료가 되면 build안에 들어가서 휴대폰으로 받으면 폰에서도 볼 수 있다.
flutter build apk --debug --target-platform=android-arm64