데이터베이스와 MongoDB
이전 주차에 진행한 API는 데이터를 인 메모리(In-Memory) 방식으로 저장해서 서버를 종료하거나 재시작 할 경우 등록된 상품 데이터가 모두 사라짐.
=> 해당 문제 해결을 위해 데이터베이스(database)기술이 등장.(서비스하는 어플리케이션이 종료된 후에도 데이터가 보존되는 영속성(Persistence)이라는 특징을 가짐.
데이터베이스
데이터의 집합. 실제 데이터가 저장되는 저장소의 역할을 수행
데이터베이스를 실제로 운영하고, 관리하는 소프트웨어를 DBMS(Database Management System)라고 부름.
- 데이터베이스에 저장한다 = DBMS가 설치된 서버에 데이터를 저장한다는 의미.
- DBMS가 설치된 서버 컴퓨터를 데이터베이스 서버라고 부름
=> DB서버의 모든 데이터는 DBMS가 관리.
종류
관계형 데이터베이스 - Relational Database (RDB)
- 데이터의 형식이 정해져있고, 데이터간의 관계를 맺어 모순이 없는 데이터를 유지할 수 있도록 도와주는 데이터베이스.
=> 은행등 정확하고 일관된 데이터가 중요한 경우에 주로 사용
비관계형 데이터베이스 - Non-relactional Database(NoSQL)
- 데이터의 형식이 고정되어 있지 않고, 유연하게 확장할 수 있는 데이터베이스.
=> SNS 서비스, 빅데이터와 같이 다양한 형식의 데이터를 빠르게 저장하고 검색해야하는 경우에 주로 사용.
- 유연하게 저장되는 만큼 저장되는 데이터를 제대로 관리하지 않으면 데이터베이스에 저장된 데이터를 신뢰할 수 없게 되기도 함.
MongoDB
국내,외 수많은 개발자들에게서 사용되고 있는 가장 인기있는 비관계형 데이터베이스(NoSQL)
특징
모든 데이터가 JSON형태로 저장.
복잡한 데이터 구조를 쉽게 저장할 수 있음.
=> 대용량 데이터 처리 쉬움.
데이터베이스 서버의 확장을 손쉽게 줄이고 늘일 수 있음. - 서버를 병렬적으로 확장하기 쉽다.
=> 서버의 부하가 늘어나도 빠르게 대응 가능.
Studio 3T
MongoDB Client: Studio 3T
Studio 3T
- MongoDB의 데이터를 더 편리하게 관리할 수 있는 GUI 툴.
=> GUI를 통해 MongoDB에 저장된 데이터를 관리하기 쉽게 보여주는 프로그램.
- API Client와 같이 MongoDB를 위해 만들어진 MongoDB Client.
- 저장된 데이터를 직접 확인하고 수정할 수 있어서 JS코드만 데이터를 확인하고 수정하는 것보다 더 효율적으로 작업 및 테스트를 할 수 있는 툴.
DB Client 와 API Client의 다른점
DB Client
- 직접 DB에 접근해 데이터를 조회, 추가, 수정, 삭제하는 기능을 제공.
- SQL, NoSQL과 같은 다양한 유형의 DB를 지원.
API Client
- 웹 서비스의 API에 연결해 서버와 데이터를 송수신.
- REST API와 Socket 같은 다양한 프로토콜 지원.
mongoose
mongoose
MongoDB에 데이터를 쉽게 읽고 쓰게 해주는 JS라이브러리.
ODM(Object Document Mapper)이라고도 부름.
ODM(Object Document Mapper)
- JS의 객체(Object)와 MongoDB의 문서(Document)사이에서 매핑을 수행하는 도구이다.
=> JS코드에서 작업하는 객체를 MongoDB 데이터베이스의 문서로 쉽게 변환하거나, 문서를 객체로 변환해주는 작업을 수행.
mongoose의 문서(Document)
- MongoDB에서 가지고 있는 각 데이터 하나하나를 문서(Document)라고 정의.
- 1개 이상의 Key-Value의 쌍으로 이루어짐.
해당 문서는 2개의 Key를 가지고 있음.
{
"_id": ObjectId("6682192a1c155bd2f27881"),
"name": "lyw",
}
mongoose의 컬렉션(Collection)
- 여러개의 문서를 보유할 수 있는 MongoDB의 구성요소.
- JSON 형식의 여러 문서를 보유 가능.
- 고정된 구성요소가 존재하지 않고, 유연하게 구성
=> RDBMS에서는 Table이 특정한 행이 지정되어 있음. - 특정 컬럼을 사용해야지만 해당 테이블에 삽이할 수 있음. but, Mongoose는 해당 데이터가 어떤 형식을 가지든 상관하지 않음.
- 관계형 데이터베이스(RDB)의 Table과 동일한 역할.
mongoose의 스키마(Schema)
- 컬렉션에 들어가는 문서가 어떤 종류의 값을 가질 것인지 정의를 위해 사용.
- 데이터의 구조와 어떤 제약 사항을 가지는지 정의하기 위해 사용
=> 일반적으로 데이터를 모델링할 때 사용.
- 어떤 필드가 있어야 하는지, 필드는 어떤 데이터 타입을 가져야 하는지를 정의.
- ex)사용자(Users) 정보를 정의한 스키마의 예시
const UsersSchema = new mongoose.Schema({
name: String, // 문자열 타입입니다.
age: Number, // 숫자 타입입니다.
favorites: [String], // 문자열 배열 타입입니다.
createdAt: { type: Date, default: Date.now }, // 날짜 타입입니다.
someId: mongoose.Schema.Types.ObjectId // ObjectId 타입입니다.
});
대표적인 스키마의 타입
null : null 값과 존재하지 않는 필드
String : 문자열
Number : 숫자
Date : 날짜
Buffer : 파일을 담을 수 있는 버퍼, UTF-8이 아닌 문자열을 저장
Boolean : true or false
ObjectId(Schema.Types.ObjectId) : 객체 ID, 주로 다른 객체를 참조할 때 넣음
Array : 배열 형태의 값
- MongoDB의 도입을 위해 필요한 데이터와 형식을 정의하는 것은 스키마설계시 가장 중요한 요소.
=> 추후에 수정될 가능성을 미리 예측하고, 고려해서 설계해야 시간이 지났을 때, 적은 리소스 만으로 해당하는 내역을 반영할 수 있게 될 것이다.
mongoose의 모델(Model)
- 데이터베이스에 데이터를 저장하고 읽어올 때 사용되는 데이터의 구조.
- 스키마를 바탕으로 만들어지고, JS의 객체와 MongoDB 간의 상호작용을 하기 위해 사용.
- MongoDB의 실제 데이터를 다룰 수 있는 메서드를 지니고 있음.
- 사용자의 데이터를 저장하려면, 사용자의 모델을 사용하여 데이터를 생성하고, 데이터베이스에 저장가능.
- 클라이언트가 발생시킨 에러 상태코드 - 400
- 클라이언트가 전달한 데이터가 존재하지 않을 때 상태코드(Not Found) - 404