SQL 과 NoSQL의 차이, Docker-compose를 이용한 mongodb 연결
오늘은 프론트엔드와 백엔드의 전체 구조, 데이터베이스의 종류인 SQL과 NoSQL의 차이에 대해서 배웠으며 Docker-compose를 이용한 mongodb를 통해서 여러 개의 Docker를 동시에 사용하는 법을 실습했습니다.
한 개의 Docker 프로그램만 작동하더라도 가상 프로그램이 내 컴퓨터 안에서 실행된다는 것이 신기했는데, 그걸 동시에 여러 대를 사용할 수 있다는 걸 알게 된 후 서버의 구조가 배우면 배울수록 매우 복잡하다는 걸 체감했습니다. 그와 동시에 Docker file을 통해 여러 사람이 동시에 같은 개발 환경을 가질 수 있는 점에서 매우 흥미로웠습니다.
많은 프론트엔드(브라우저) 에서 백엔드 서버로 API를 요청하며, 백엔드 서버는 데이터 베이스에서 정보를 저장하거나, 가져와 브라우저에 응답을 보내는 구조를 가집니다.
DB의 종류에는 크게 SQL, NoSQL 2가지 형태로 나뉜다.
엑셀 표 형식의 구조로 되어있습니다.(row/ colunm/ table)
테이블들 간에 관계가 있을 경우 (관계형 데이터베이스, RDB(Relational DataBase)) 합쳐서 데이터를 쉽게 통합할 수 있습니다.
데이터를 조회하거나 통합할 때 아주 유용하지만 table 형식에 맞는 데이터만 입력할 수 있으므로 유연하지 못합니다.
출처
: SQL vs NoSQL
쿼리문 : 데이터베이스를 사용할때 쓰는 라이브러리
ORM : SQL의 쿼리문을 외우지 않고도 사용할 수 있게끔 만들어주는 라이브러리
ODM : NoSQL 의 쿼리문을 외우지 않고도 사용할 수 있게끔 만들어주는 라이브러리
mongoDB는 문서지향(Document-Oriented) 저장소를 제공하는 NoSQL 데이터베이스 시스템입니다.
이외에도 NoSQL 데이터베이스 10gen, Couchbse, CouchDB 등이 있지만 인지도 1위를 유지하고 있습니다.
mongoDB에서는 데이터가 Document
로 불리며, 이 데이터의 집합을 Collection(RDMS에서는 Table)
이라고 합니다.
스키마 제약 없이 자유롭고, BSON(Binary JSON)
형태로 각 문서가 저장되며 배열(Array)
이나 날짜(Date)
등 기존 RDMS
에서 지원하지 않던 형태로도 저장할 수 있기 때문에 관계를 연결하는 JOIN
이 필요 없이 한 문서에 좀 더 이해하기 쉬운 형태 그대로 정보를 저장할 수 있다는 것이 특징입니다.
MongoDB에서 텍스트로만 되어있는 데이터들을 보기 쉽고 자작하기 쉽게 해주는 DB 관리 프로그램입니다.
MongoDB Compass에서 데이터를 생성 가능하지만, 이는 MongoDB Compass에서 데이터를 바로 생성하는 것이 아니라 MongoDB Compass에서 MongoDB로 데이터 생성을 요청한 뒤 생성된 데이터를 다시 요청하여 받아오는 것입니다.
Docker-compose란 복수 개의 컨테이너를 실행시키는 도커 애플리케이션이 정의를 하기 위한 툴입니다.
여러개의 서버를 동시에 실행시키기 위해서는 전용 파일인 야믈(.yaml or .yml)
파일을 정의해주어야 합니다.
version: "3.7"
services:
my-backend:
build:
context: .
dockerfile: Dockerfile
ports:
- 3000:3000
my-database:
build:
context: .
dockerfile: Dockerfile.mongo
ports:
- 27017:27017
위와 같은 형식으로 작성되며, version
, services
, volumes
, networks
를 정의합니다.
services
: 각각의 컨테이너에 적용되는 configuration을 포함
Dockerfile
을 포함하는 디렉토리 경로 또는 git repo의 url입니다.Dockerfile
을 대체하는 파일을 지정해 줍니다.ports
: Host OS와 컨테이너의 포트를 바인딩 시켜줍니다.
version: "3.7"
services:
my-backend:
build:
context: .
dockerfile: Dockerfile
ports:
- 3000:3000
my-database:
image: mongo:5
ports:
- 27017:27017
처음 지정해 준 Dockerfile.mongo
파일을 삭제해 준 뒤에 my-database
에 image를 사용하여 정의해 주면 하나의 Dockerfile
로 두 개의 데이터베이스를 작동시킬 수 있습니다.