🎈 저번 시간에 spa-shop폴더를 만들어 상품 등록 API를 구현했으나, 이 API가 서버를 종료하거나 재시작시 등록된 상품 데이터가 모두 사라지는 문제를 겪었다.
그 이유가 뭘까 ? 바로 우리가 데이터를 "인 메모리(In-Memory)"방식으로 저장했기 때문이다. 이 방식은 데이터를 RAM과 같은 임시 저장소에 보관하여 어플리케이션이 종료될 때 이 임시 저장소의 데이터 또한 함께 사라지는 방식이다.
이러한 문제를 해결하기 위해 "데이터베이스(Database)"라는 기술이 등장하게 되었다. 이러한 데이터베이스는 우리가 서비스하는 어플리케이션이 종료된 후에도 데이터가 보존되는 영속성의 특징을 가지고 있음
🎯 요약하자면, 영속성(Persistence)이 없는 데이터는 상품 등록 API와 같이 인 메모리(In-Memory)에만 존재하며, 프로그램 종료되면 데이터가 사라지게 되는것

- 데이터베이스(Database)는 ‘데이터의 집합’이라고 할 수 있으며, 실제 데이터가 저장되는 저장소의 역할을 수행한다.
- 데이터베이스(Database)를 실제로 운영하고, 관리하는 소프트웨어를 DBMS(Database Management System)라고 부른다.
- 관계형 데이터베이스는 데이터의 형식이 정해져있고, 데이터 간의 관계를 맺어 모순이 없는 데이터를 유지할 수 있도록 도와주는 데이터베이스를 의미한다.
- 이런 특성 때문에 은행과 같이 정확하고 일관된 데이터가 중요한 경우에 주로 사용.
- 데이터의 형식이 고정되어 있지 않고, 유연하게 확장할 수 있는 데이터베이스를 비관계형 데이터베이스라고 부른다.
- 이런 유연성 덕분에 SNS 서비스, 빅데이터와 같이 다양한 형식의 데이터를 빠르게 저장하고 검색해야 하는 경우에 주로 사용.
- 비관계형 데이터베이스는 유연하게 저장되는 만큼 저장되는 데이터를 제대로 관리하지 않으면 데이터베이스에 저장된 데이터를 신뢰할 수 없게 되기도 한다.

MongoDB는 국내, 외 수많은 개발자들에게서 사용되고 있는 가장 인기있는 비관계형 데이터베이스 (NoSQL) 중 하나이다.

🎈 Studio 3T는 MongoDB의 데이터를 더욱 편리하게 관리할 수 있는 GUI 툴로, Studio 3T는 API의 사용을 도와주는 API Client처럼 MongoDB를 위해서 만들어진 MongoDB Client이다.
DB Client와 API Client 모두 서버에 연결해 데이터를 보내는것 까지는 같은 개념이지만, 사용되는 개념과 기능은 크게 다르다.
- DB Client:
- 직접 데이터베이스에 접근해 데이터를 조회, 추가, 수정, 삭제하는 기능을 제공
- SQL, NoSQL과 같은 다양한 유형의 데이터베이스를 지원
- API Client:
- 웹 서비스의 API에 연결하여 서버와 데이터를 송수신
- 저희가 배우는 REST API와 Socket 같은 다양한 프로토콜을 지원

🎈 mongoose는 MongoDB에 데이터를 쉽게 읽고 쓰게 해주는 JavaScript 라이브러리로, ODM(Object Document Mapper)이라고도 부른다.
yarn add mongoose // 터미널을 열어 입력해 주면 mongoose 설치가능
- MongoDB에서 가지고 있는 각 데이터 하나하나를 문서(Document)라고 정의하며, 1개 이상의 Key-Value의 쌍으로 이루어져 있다.
- JSON 형식으로 구성되어있으며, 아래의 문서(Document)는 _id와 name이라는 2개의 Key를 가지고 있다.
{ "_id": ObjectId("6682192a1c155bd2f27881"), "name": "lyw", }
컬렉션(Collection)은 여러개의 문서를 보유할 수 있는 MongoDB의 구성요소이며, JSON 형식의 여러가지 문서를 보유할 수 있다.
스키마(Schema)는 컬렉션(Collection)에 들어가는 문서(Document)가 어떤 종류의 값을 가질 것인지 정의하기위해 혹은, 데이터의 구조와 어떤 제약 사항을 가지는지 정의하기 위해 일반적으로 데이터를 모델링할 때 사용한다.
// 사용자(Users) 정보를 정의한 스키마 예시)
const UsersSchema = new mongoose.Schema({
name: String, // 문자열 타입입니다.
age: Number, // 숫자 타입입니다.
favorites: [String], // 문자열 배열 타입입니다.
createdAt: { type: Date, default: Date.now }, // 날짜 타입입니다.
someId: mongoose.Schema.Types.ObjectId // ObjectId 타입입니다.
});
spa-shop
├── app.js
├── routes
│ ├── carts.js
│ └── goods.js
└── schemas
├── index.js
├── cart.js
└── goods.js