내일배움캠프 Node.js 본캠프 22일차

김선우·2024년 9월 7일
post-thumbnail

데이터베이스와 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",
}
  • JSON 형식으로 구성.

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 값과 존재하지 않는 필드
    • ex: null
  • String : 문자열
    • ex: "mongoDB"
  • Number : 숫자
    • ex: 3.14
  • Date : 날짜
    • ex: new Date()
  • Buffer : 파일을 담을 수 있는 버퍼, UTF-8이 아닌 문자열을 저장
    • ex: 0x65
  • Boolean : true or false
    • ex: true
  • ObjectId(Schema.Types.ObjectId) : 객체 ID, 주로 다른 객체를 참조할 때 넣음
    • ex: ObjectId()
  • Array : 배열 형태의 값
    • ex: ["a", "b", "c"]
  • MongoDB의 도입을 위해 필요한 데이터와 형식을 정의하는 것은 스키마설계시 가장 중요한 요소.
    => 추후에 수정될 가능성을 미리 예측하고, 고려해서 설계해야 시간이 지났을 때, 적은 리소스 만으로 해당하는 내역을 반영할 수 있게 될 것이다.

mongoose의 모델(Model)

  • 데이터베이스에 데이터를 저장하고 읽어올 때 사용되는 데이터의 구조.
  • 스키마를 바탕으로 만들어지고, JS의 객체와 MongoDB 간의 상호작용을 하기 위해 사용.
  • MongoDB의 실제 데이터를 다룰 수 있는 메서드를 지니고 있음.
  • 사용자의 데이터를 저장하려면, 사용자의 모델을 사용하여 데이터를 생성하고, 데이터베이스에 저장가능.
  • 클라이언트가 발생시킨 에러 상태코드 - 400
  • 클라이언트가 전달한 데이터가 존재하지 않을 때 상태코드(Not Found) - 404

0개의 댓글