백엔드 맛보기에서는 백엔드를 postman으로 연결하더라도 서버를 껏다 키면 데이터가 초기화됐다.
따라서 이번에는 영구적으로 저장할 수 있는 공간을 만들 것이다.
Firebase 로!
데이터베이스(DB)
= 데이터를 영구적으로 저장하는 공간
오늘 할 것
1. 서버와 데이터베이스를 연결한다.
2. 잘 연결 됐는지 Postman으로 확인한다.
데이터베이스(DB, DataBase)란?
- 데이터베이스(Database)는 식당의 초대형 냉장고이자 창고 와 같습니다.
단순히 데이터를 저장 하는 것을 넘어, 데이터를 관리하기 위한 전문 시스템(프로그램)입니다.
-
일반적으로 영속성과 동시성을 갖고
-
무결성과 일관성을 가지며
-
이를 구조화하여 저장해두고 있고
-
질의(쿼리)라는 것을 통해서 데이터를 조작할 수 있께 해준다.
데이터베이스의 특성에 대해 알아보자
영속성(Durability) : 영원히/영구적 저장
- 가게 문을 닫았다 열어도(서버 재시작) 데이터가 안전하게 보관됩니다.
동시성(Concurrency)
- 여러 셰프(Service)나 주방 매니저(Controller)가 '동시에' 재료를 꺼내거나 넣어도(읽기/쓰기) 데이터가 꼬이지 않게 관리해 줍니다.
구조화(Structure)
- 데이터를 체계적으로(예: '육류 코너', '채소 코너') 분류하고 저장합니다.
무결성/일관성(Integrity/Consistency)
- ‘재고’가 0이면 "구매"를 허용하지 않거나, 동일한 ID를 가진 상품을 저장하지 못하게 할 수 있습니다. 오류(공백/중복) 발생 차단
질의(쿼리, Query)
- "A-3 구역의 닭고기 5개만 줘"처럼, 데이터베이스마다 고유한 방식에 질의(Query)를 통해 데이터를 조작할 수 있습니다.
이 '냉장 창고'를 관리하는 소프트웨어를 DBMS (Database Management System)라고 부르며, 이 DBMS는 크게 두 가지 방식으로 나뉩니다.
DBMS 종류
RDB : 관계형 데이터베이스
- MySQL, PostgreSQL, Oracle 등 엑셀 시트(테이블)처럼 데이터를 저장하고, 구조화(분류하고 저장)된 관계 바탕으로 데이터를 관리한다.
- '상품'과 '사용자'를 연결하여 어떤 사용자가 어떤 상품을 찜했는지 명확하게 관리 가능
- 데이터의 일관성과 명확성이 생명인 은행, 쇼핑몰, 예약 시스템 등에서 사실상 표준으로 사용된다.
NoSQL : 비관계형 데이터베이스
(SQL이 아니다. X -> Not only SQL O)
-> 구조화된 질의 언어만이 아니다. = 관계형도 쓸 수 있고, 관계형이 아닌 것도 가능
- Firebase Firestore, MongoDB, Redis등
- 엑셀 시트 같은 '틀'이 없다.
- 데이터를 '폴더 안의 문서(JSON) 처럼 자유롭게 저장한다.
- 정해진 틀이 없어 나중에 데이터 구조가 바뀌기 쉬운 서비스(SNS, 로그 데이터 등)나 빠른 개발에 매우 유용함
- 따라서 빠른 속도와 유연한 확장성이 장점이다.(But, 일관성이나 명확성은 좀 떨어짐)
- NoSQL은 쿼리(고유한 방식으로 조작)는 데이터베이스마다 자체 쿼리 언어가 있고(MQL, CQL, DSL 등) NoSQL 특성상 공용 쿼리 언어가 없다.
오늘 할건 NoSQL의 Firestore이다. 이건 NoSQL이면서 RDB처럼 사용함
-> NoSQL로 RDB처럼 활용해볼거임
그러면, SQL 한줄 정리
-> 데이터를 저장, 관리, 조작하기 위해 사용되는 표준 프로그래밍 언어
SQL(구조화된 질의 언어, Structured Query Language)은 RDB에서 사용하는 언어이다.
데이터베이스의 언어
- 데이터베이스의 Query 언어는 우리가 Spring에서 사용하는 Java나, 프론트엔드에서 사용하는 JavaScript와는 목적과 방식이 완전히 다릅니다.
프로그래밍 언어(Java, Python, JavaScript 등)
목적
- 애플리케이션(서버, 웹)을 만드는 범용 언어입니다.
방식
- '명령형(Imperative)' - "어떻게(How)" 할지 모든 절차를 지시합니다.
1. 냉장고(DB)로 걸어간다.
2. 문을 연다.
3. 'A-3' 구역을 찾는다.
4. 닭고기를 하나 센다..."
(개발자가 모든 과정을 코드로 작성해야 합니다.)
쿼리 언어 (SQL, NoSQL API 등))
- 목적
데이터베이스(DB)에서 데이터를 효율적으로 조회/관리하기 위한 질의 언어입니다.
데이터베이스에게 물어보는 것입니다.
- 방식
'선언형(Declarative)' - "무엇을(What)" 원하는지만 선언합니다
SQL(관계형 데이터베이스)
SELECT name FROM items WHERE id=5
해석: ("5번 아이템의 이름(What)을 줘")
완전 지정형이다. 무엇을 원하는지만 선언함
= SELECT A FROM B WHERE C = B를 A에서 C인 얘들을 가져와
= items 이란 테이블에서 name이란 얘의 id=5인 것을 가져와줘(SELECT)
NoSQL (Firebase 등, 비관계형 데이터베이스)
db.collection('items').document('5').get()
해석: ("items 컬렉션에서 '5'번 문서(What)를 줘")
db에서 'items'를 collection 할건데, 5번 document라고 되어 있는 얘들을 가져와줘(.get())
SQL로 'SELECT'를 쓰든, 'NoSQL 함수인 .get()를 쓰든 [무엇(What)]을 원하지만 냉장고 관리인(데이터베이스)에게 여러 번 질의(쿼리)하면 데이터를 가져오는 가장 빠른 길은 알아서 최적화하여 실행한다.
클라우드(Cloud)와 Firebase란?
DB가 중요하다는 걸 알았으니, 이걸 어디에 설치해야 할까? 설치하거나 / 빌리자
내 컴퓨터(localhost)에 DB서버 '설치하기'
문제 : 내 컴퓨터 계속 켜놔야 함.
클라우드(cloud)에서 DB 서비스 '빌리기'
그러니까, 보통은 '가상 컴퓨터'를 '대여'하는 서비스를 사용한다.
Firebase란?
- 클라우드에서 데이터베이스를 빌려오는 서비스이다.
BasS(Backend as a Service) - 서비스형 백엔드
- 백엔드 서버를 운영하는 데 필요한 거의 모든 기능(데이터베이스, 사용자 인증, 파일 저장 등)을 Firebase가 API 형태로 제공해 줍니다.
- 개발자는 복잡한 인프라를 직접 직접 구축할 필요 없이, Firebase가 제공하는 기능들을 '레고 블록'처럼 조립해서 쓰기만 하면 됩니다.
Firebase의 주요 기능들:
- Firestore (우리가 쓸 기능)
-> NoSQL 데이터베이스 (냉장고)
- Authentication
-> 소셜 로그인(구글, 페이스북 계정 연동) 기능 (출입 명부 관리인)
- Storage
-> 이미지, 동영상 파일 저장 (대형 창고)
- Hosting
-> 프론트엔드(React) 배포 (서빙 로봇)
실습
firebase에서 고유 키 설치
-> web-basic-backend-main\src\main\resources\firebase-service-account.json에 덮어씌우자(이름은 firebase-service-account.json으로 바꾸고)

오늘은 memory 말고 database 쓸거니까 아래꺼 바꿈

원래 memory에 저장되던 것들이 이제부터 database에 저장됨
실행

조금 더 빠르긴 하네
전체 찜 상품 조회

아무것도 안나옴
1 ~ 4 추가
그러니까, 찜 상품 추가에서 1, 2, 3, 4 추가해보자




다시 조회

추가되어 있다.(다만, id가 랜덤으로 나와서 삭제할거면 이 id 입력해야 함. 예: 1764214770672 이건 4번임)
Firestore는 NoSQL 기반의 데이터베이스기에 id 값이 생성될 때 조금 복잡한 방식으로 생성되는 탓에 이러는거임.
memory와 다른 점은 임시가 아닌 영구적 저장이다.

종료 후
다시 시작 : 원래라면 초기화 되어 있어야 하는데


단건 조회

전체 조회

껏다 켜도 데이터가 남아있다.