day08

데이터베이스

여러 사람이 공유하여 사용할 목적으로 체계화해 통합, 관리하는 데이터의 집합이다. 이는 일반적으로 DBMS(데이터베이스 관리 시스템)에 의해 제어된다. 연결된 애플리케이션과 함께 데이터와 DBMS를 하나로 묵어 데이터베이스 시스템이라고 한다.

관계형과 문서형 데이터베이스?

대표적으로 관계형엔 MySQL과 문서형엔 mongoDB를 뽑는다. 둘은 우선 용어부터 다르다.

데이터베이스를 저장할 데이터를 작성 방식으로 구분하는데 관계형은 관계를 중시하며 데이터의 중복을 피하기 위해 여러 테이블로 나누어 저장한다. ID는 ID만 EMAIL은 EMAIL만 저장한다. 문서형은 이와 반대로 다른 구조의 데이터를 같은 컬렉션에 추가할 수 있다. 각자 방식에 따른 장단점이 있으므로 상황에 맞게 사용하자.

물론 구문도 다르다.

+이번엔 MongoDB를 사용해볼 것이다.

MongoDB/MongoDB Compass

MongoDB는 문서지향 저장소를 제공하는 NoSQL 데이터베이스 시스템이다. 이때 NoSQL이란 SQL이 아닌 다른 데이터베이스 시스템을 의미한다.(또는 non relational 관계적이지 않은 sql을 의미한다.)

mongoDB에서는 데이터를 document라 하며, 이러한 데이터의 집합을 collection이라고 한다. 스키마 제약이 없고, BSON(Binary JSON) 형태로 각 문서가 저장된다. 이에 따라 자바스크립트를 기반으로 하는 nodejs와 호환이 좋다. mysql도 사용이 가능하다.

특징

  • Join이 없으므로 Join이 필요 없도록 데이터 구조화가 필요
  • 다양한 종류의 쿼리문을 지원(필터링, 수집, 정렬, 정규표현식 등)
  • 관리의 편의성
  • 스키마 없는(Schemaless) 데이터베이스를 이용한 신속 개발. 필드를 추가하거나 제거하는 것이 매우 쉬워짐
  • 쉬운 수평 확장성
  • 인덱싱 제공

MongoDB Compass는 mongodb용 GUI데이터를 시각적으로 탐색하는 툴이다. 이곳에서 데이터베이스를 쉽게 조회하고 수정할 수 있다.

Docker-Compose

도커 어플리케이션의 정의하여 복수 개의 컨테이너를 실행시키는 툴이다. yaml파일로 여러 개의 도커 내부 속성을 설정하고 이를 실행시켜 마치 도커를 배치로 한 번에 실행시키는 것이라 생각하면 된다.

docker-compose.yaml(yml)파일에 형식에 맞게 작성한다. 어떤 파일을 연결하고 어떤 식으로 포트 포워딩 할 지 정할 수 있다.

  • context : Dockerfile을 포함하는 디렉토리 경로 또는 git repo의 url
  • dockerfile : Dockerfile을 대체하는 파일을 지정

Docker-Compose CLI

docker-compose build//image빌드
docker-compose up//container실행

Mongoose/MongoDB

Mongoose는 nodejs와 mongoDB를 위한 ODM(Object Data Mapping)라이브러리로 호환성이 없는 js와 mongodb의 데이터를 맵핑하여 간편하게 crud를 구현할 수 있게 해준다.
마찬 가지로

yarn add mongoose

하고 파일에 import해준다.

이를 이용해 model정의를 하면

import mongoose from 'mongoose'

const userSchema = new mongoose.Schema({
	name: String,
    phone: String,
    password: String
})
export const User = mongoose.model('User', userSchema)
//model(해당 콜렉션의 단수적 표현, 적용할 모델)

사용가능한 Data Type

mongoDB와 백엔드 api를 연결하는 방법

//api파일에
mongoose.connect("mongodb://my_db:27017/study")

mongoose공식문서에서 사용가능한 명령어들을 볼 수 있다.
예를 들어 데이터 찾아오는 방법

// Using async/await
const arr = await Movie.find({ year: { $gte: 1980, $lte: 1989 } });

// Using callbacks
Movie.find({ year: { $gte: 1980, $lte: 1989 } }, function(err, arr) {});

Nodemon/Volumes

아까 작성한 대로 docker-compose를 통해 작업을 하다보면 Nodemon 리프레시 문제를 확인할 수 있을 것이다. docker안에서 nodemon작동하지 않기 때문으로

도커 파일에 CMD부분을 package.json의 스크립트 부분에 작성한 방식으로 적어준다.

좋은 웹페이지 즐겨찾기