๐ Mongodb๋ ๋ฌด์์ผ๊น?
๐ Mongodb ์ค์น ๋ฐ ์ฌ์ฉ๋ฒ
๐ Docker-compose๋ ๋ฌด์์ผ๊น?
๐ ODM & Mongoose
mongodb๋ ๋ฌธ์์งํฅ ์ ์ฅ์๋ฅผ ์ ๊ณตํ๋ NoSQL ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์คํ
์ด๋ค.
์ด์ธ์๋ 10gen, Couchbse, CouchDB ๋ฑ์ด ์์ง๋ง ์ธ์ง๋ 1๋ฑ์ ์ ์งํ๊ณ ์๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ด๋ค.
Mongodb์์๋ ๋ฐ์ดํฐ๋ฅผ Document
๋ก ๋ถ๋ฅด๋ฉฐ, ํด๋น ๋ฐ์ดํฐ์ ์งํฉ์ Collection
์ด๋ผ๊ณ ํ๋ค.
์คํค๋ง์ ์ ์ฝ์ด ์์ด ์์ ๋ก์ฐ๋ฉฐ, Binary JSON ํํ๋ก ๊ฐ๊ฐ์ ๋ฌธ์๊ฐ ์ ์ฅ๋์ด JOIN ์์ด ํ ๋ฌธ์์ ์ดํดํ๊ธฐ ์ฌ์ด ํํ ๊ทธ๋๋ก ์ ์ฅํ ์ ์๋ค๋ ์ฅ์ ์ด ์๋ค.
๊ฐ์ฒด์งํฅํ๋ก๊ทธ๋๋ฐ๊ณผ ์๋ง๊ธฐ ๋๋ฌธ์ Node.js์ ํธํ์ด ๋งค์ฐ ์ข๋ค. ๋ฐ๋ผ์ Node.js์์ ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉํ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ด๋ค.
๋ํ, mongodb์์๋ ์ง์๋ฌธ์ด ๋ชจ๋ JSON ๊ฐ์ฒด๋ก ํํ๋๋ฉฐ, ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ๊ทผํ๊ณ ์กฐ์ ํ๋ ๊ตฌ๋ฌธ์ ์๋ฐ์คํฌ๋ฆฝํธ์ ๋ฌธ๋ฒ์ ๊ฐ๊น์ด ๋ชจ์ต์ ๋ณด์ฌ์ค๋ค.
ํน์ง
- Join์ด ์์ผ๋ฏ๋ก Join์ด ํ์ ์๋๋ก ๋ฐ์ดํฐ ๊ตฌ์กฐํ๊ฐ ํ์
- ๋ค์ํ ์ข ๋ฅ์ ์ฟผ๋ฆฌ๋ฌธ์ ์ง์(ํํฐ๋ง, ์์ง, ์ ๋ ฌ, ์ ๊ทํํ์ ๋ฑ)
- ๊ด๋ฆฌ์ ํธ์์ฑ
- ์คํค๋ง ์๋(Schemaless) ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ด์ฉํ ์ ์ ๊ฐ๋ฐ. ํ๋๋ฅผ ์ถ๊ฐํ๊ฑฐ๋ ์ ๊ฑฐํ๋ ๊ฒ์ด ๋งค์ฐ ์ฌ์์ง
- ์ฌ์ด ์ํ ํ์ฅ์ฑ
- ์ธ๋ฑ์ฑ ์ ๊ณต
์ฐ๊ฒฐ์ ์์ํ๊ธฐ์ ์์ brew services list
๋ฅผ ํตํด Mongodb๊ฐ ์ผ์ ธ์๋์ง ํ์ธํ๋ค.
๊บผ์ ธ ์๋ค๋ฉด, Mac ์ฌ์ฉ์๋ brew services start mongodb-community
,
Ubuntu ์ฌ์ฉ์๋ sudo systemctl start mongod
๋ฅผ ์
๋ ฅํ์ฌ mongoDB๋ฅผ ์คํํ๋ค.
์ ์ด์ , mongodb๊ฐ ์ผ์ ธ์๋ ์ํ์ด๋ค!
์ ์์ ์ํด mongo
๋ฅผ ํฐ๋ฏธ๋์์ ์
๋ ฅํ๋๋ก ํ๋ค.
์ ์์ด ์๋ฃ๋๋ค๋ฉด, show databases
๋ฅผ ํตํด database๋ฅผ ํ์ธํ๋ค.
admin, config, local์ด ์๋ ๊ฒ์ ํ์ธํ ์ ์๋ค!!
์ด์ mongodb ์กฐ์์ ์ฝ๊ฒ ํด์ฃผ๋ ๊ด๋ฆฌ ๋๊ตฌ์ธ mongodb compass๋ฅผ ์ด์ฉํด ๋ฐ์ดํฐ๋ฅผ ์์ฑํด๋ณด์!!
use ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ช
์ ์ฌ์ฉํ์ฌ ์ฌ์ฉํ database๋ฅผ ์ง์ ํด์ฃผ์
local์ ์ฌ์ฉํ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ use local
์ ์
๋ ฅํ์ฌ local์ ๋ค์ด๊ฐ๋ค.
์ดํ์, show collections
๋ฅผ ํตํด local collection์ ํ์ธํด๋ณด์
db.startup_log.find().pretty()
๋ฅผ ํตํด ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ํ ๋ก๊ทธ๋ฅผ ํ์ธํ ์ ์๋ค.
๋ง์ฝ, ํฐ๋ฏธ๋์์ ์ ์์ค์ธ mongodb๋ฅผ ๋๊ณ ์ถ๋ค๋ฉด exit
์ ํตํด shell์ ์ข
๋ฃํ๋ค.
์ด์ , ๋ณธ๊ฒฉ์ ์ผ๋ก mongodb compass๋ฅผ ํตํด mongodb๋ฅผ ํ์ธํด๋ณด์.
(mongodb compass = mongodb๋ฅผ ํ๋์ ๋ณผ ์ ์๋๋ก ๋์์ฃผ๋ ๋๊ตฌ)
url๋ถ๋ถ์ mongodb://localhost:27017
์ ์
๋ ฅํ์ฌ ์ ์ํ๋ค.
(ํฌํธ๋ฒํธ 27017์ ๊ธฐ๋ณธ ํฌํธ ์ค์ ๊ฐ์ด๋ค.)
์ ์ํด๋ณด๋ฉด ํฐ๋ฏธ๋์์ ํ์ธํ ๋์ผํ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ํ์ธํ ์ ์๋ค.
์ดํ, mongodb๋ฅผ ์ข
๋ฃํ๊ณ ์ถ๋ค๋ฉด, Mac ์ฌ์ฉ์๋ brew services stop mongodb-community
,
Ubuntu ์ฌ์ฉ์๋ sudo systemctl stop mongod
๋ฅผ ์
๋ ฅํ์ฌ 24์๊ฐ ์ผ์ ธ์๋ ์๋น์ค๋ฅผ ์ข
๋ฃ์์ผ ์ค๋ค.
docker-compass๋ ๋ณต์๊ฐ์ ์ปจํ
์ด๋๋ฅผ ์คํ์ํค๊ธฐ ์ํด ์ฌ์ฉํ๋ ๋๊ตฌ์ด๋ค.
yaml ํ์ผ
์ ํตํด ์๋น์ค๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
๊ตฌ์ฒด์ ์ผ๋ก ์ค๋ช
ํ์๋ฉด yamlํ์ผ๋ก ์ฌ๋ฌ๊ฐ์ docker ๋ด๋ถ ์์ฑ์ ์ค์ ํ๊ณ yaml ํ์ผ์ ์คํ์์ผ ๋ง์น docker๋ฅผ ์ผ๊ด์ ์ผ๋ก ํ๋ฒ์ ์คํ์ํค๋ ๊ฒ๊ณผ ๊ฐ์ ์ผ์ ํ ์ ์๋ค.
์ด๋ฒ์๋ docker-compose๋ฅผ ์ด์ฉํ์ฌ mongodb์ ์ฐ๊ฒฐ์ ํด๋ณด์.
๋จผ์ , ํด์ผํ ๊ฒ์ mongodb๋ฅผ ์ฐ๊ฒฐํ๊ธฐ ์ํด mongodv ์ปจํ
์ด๋๋ฅผ ๋์์ผ ํ๋ค.
dockerfile.mongo
ํ์ผ์ ๋ง๋ค์ด mongo ๋ฒ์ ์ 5๋ก ์ ์ํด๋ณด์
์ด์ ์ ๋ง๋ค์๋ dockerfile๊ณผ ๋ฐฉ๊ธ ์์ฑํ dockerfile.mongo๋ฅผ ํตํด ๊ฐ๊ฐ์ ๊ฐ์์ปดํจํฐ ๋๋๋ฅผ ๋ง๋ค์๋ค.
์ด์ ๊ฐ๊ฐ์ ์ปดํจํฐ๋ค์ ์ฐ๊ฒฐํ๊ธฐ ์ํด ํฌํธํฌ์๋ฉ์ ํด์ฃผ์ด์ผ ํ๋ค.
์ฌ๊ธฐ์ ๋์ปค๋ก ๋ง๋ค์ด์ง ๊ฐ์์ ๋ค๋ฅธ ์ปดํจํฐ๋ค์ ํฌํธํฌ์๋ฉ์ ์ํด ๊ทธ๋ฃนํ ํ๋ ๊ฒ์ด docker-compose์ด๋ค.
์ด์ , express์ mongodb์ ์๋ฒ๋ฅผ ํ๋ฒ์ ์คํ์ํค๊ธฐ ์ํด yamlํ์ผ์ ์ ์ํด์ผ ํ๋ค.
(.yaml, .yml ๋๋ค ์ฌ์ฉ๊ฐ๋ฅ)
version: '3.7' # ์ปดํจํฐ๋ค services: # ์ปดํจํฐ์ด๋ฆ my-backend: build: context: . dockerfile: Dockerfile ports: - 4000:4000 # ์ปดํจํฐ์ด๋ฆ my-database: build: context: . dockerfile: Dockerfile.mongo ports: - 27017:27017
services
๋ ๊ฐ๊ฐ์ ์ปจํ ์ด๋์ ์ ์ฉ๋๋ configuration์ ํฌํจํ๊ณ ์๋ค.
์์ ์์ค์ฝ๋๋ฅผ ๋ณด๊ฒ ๋๋ฉด, my-backend์ my-database๋ฅผ ์ ์ํ ๊ฒ์ ํ์ธ ํ ์ ์๋ค. (๋ณ์๋ช ์ด๋ค)
- context : Dockerfile์ ํฌํจํ๋ ๋๋ ํ ๋ฆฌ ๊ฒฝ๋ก ๋๋ git repo์ url์ด๋ค.
- dockerfile :
Dockerfile
์ ๋์ฒดํ๋ ํ์ผ์ ์ง์ ํด ์ค๋ค.- ports : Host OS์ ์ปจํ ์ด๋์ ํฌํธ๋ฅผ ๋ฐ์ธ๋ฉ ์์ผ์ค๋ค. ์๋ฅผ๋ค์ด ์ปจํ ์ด๋์ ๋ ธ์ถ๋ ํฌํธ 3000์ docker host ์ปดํจํฐ์ ํฌํธ 3000์ ์ ๋ฌํ๋ ๊ฒ์ด๋ค.
์ด์ docker-compose build
๋ฅผ ํตํด image๋ฅผ buildํ๋ค.
docker-compose up
์ ํตํด ์ปจํ
์ด๋๋ฅผ ์คํ์ํจ๋ค.
์ด์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์๋ฒ๊ฐ ์ ์์ ์ผ๋ก ์๋ํ๋์ง ํ์ธํ๊ธฐ ์ํด ๋จผ์ , ๋ก์ปฌ์ mongodb๊ฐ ๋นํ์ฑํ๋์ด ์๋์ง ํ์ธํ๋ค. Mac ์ฌ์ฉ์๋ brew services list
๋ฅผ Ubuntu ์ฌ์ฉ์๋ systemctl list-units --type=service
๋ฅผ ์
๋ ฅํ์ฌ mongodb-community ์๋น์ค๊ฐ ์ข
๋ฃ๋์๋์ง ํ์ธํด ์ฃผ์ธ์.
๋ชจ๋ ํ์ธ์ด ๋๋ฌ๋ค๋ฉด, mongodb compass๋ฅผ ์คํ์ํค๊ณ yaml ํ์ผ์์ ์ค์ ํ ํฌํธ๋ฒํธ 27017:27017๋ก db๋ฅผ ์ ์ํ๋ค.
๋ง์ฝ, docker container๋ฅผ ์ข
๋ฃํ๊ณ ์ถ๋ค๋ฉด docker-compose stop
์ ํตํด ์ข
๋ฃํ๋ค.
Dockerfile.mongo ํ์ผ์ ํ์ธํด๋ณด๋ฉด FROM: mongo:5 ๋ฐ์ ์์ ๊ฒ์ด๋ค. ์ด๊ฒ์ yaml ํ์ผ์์ ๋ฃ์ด ์์ฑํ ์ ์๋ค.
version: '3.7'
>
# ์ปดํจํฐ๋ค
services:
>
# ์ปดํจํฐ์ด๋ฆ
my-backend:
build:
context: .
dockerfile: Dockerfile
ports:
- 4000:4000
>
# ์ปดํจํฐ์ด๋ฆ
my-database:
image: mongo:5
ports:
- 27017:27017
docker exec -it ์ปจํ
์ด๋ID
๋ฅผ ํตํด mongodb ์ปจํ
์ด๋ ๋ด๋ถ๋ก ์ ์ํ ์ ์๋ค.
show databases
๋ฅผ ํตํด ๋ก์ปฌ์์ ์ ์ํ์ ๋์ ๋์ผํ๋ค๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
Mongoose
๋ Node.js์ Mongodb๋ฅผ ์ํ ODM ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด๋ค.
์ฆ, ํธํ์ฑ์ด ์๋ javascript์ mongodb์ ๋ฐ์ดํฐ๋ฅผ ๋งตํํ์ฌ ๊ฐํธํ CRUD๋ฅผ ๊ฐ๋ฅํ๊ฒ ํด์ค๋ค.
yarn add mongoose
๋ฅผ ์
๋ ฅํ์ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ค์นํ๋ค.
(package.json ํ์ผ์์ ์ ์์ ์ผ๋ก ์ค์น๋์๋์ง ํ์ธํ ์ ์๋ค.)
๋ํ, index.js ํ์ผ์์ import mongoose from 'mongoose'
์ฝ๋๋ฅผ ์ฌ์ฉํ์ฌ ๋ชฝ๊ตฌ์ค๋ฅผ ์ฌ์ฉํ ์ ์๊ฒ ๋ชจ๋์ ๊ฐ์ ธ์ต๋๋ค.
์ฑ์ด ํ๋์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ง ์ฌ์ฉํ๋ ๊ฒฝ์ฐย mongoose.connect
,ย
์ถ๊ฐ ์ฐ๊ฒฐ์ ์์ฑํด์ผ ํ๋ ๊ฒฝ์ฐย mongoose.createConnection
๋ฅผ ์ฌ์ฉํ๋ค.
๊ธฐ๋ณธํํ๋ mongoose.connect('mongodb://localhost/my_database')
์ ํํ๋ก ์์ฑํ๋ค.
import mongoose from "mongoose";
mongoose
.connect("mongodb://my-database:27017/mydocker")
์ค๋๋ก ๋๋์ด ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ํด ํ์ต์ ์์ํ๋ค. ์์ ๋ํ๊ต๋ฅผ ๋ค๋ ๋, MySQL์ ๋ฐฐ์ด ๊ฒฝํ์ด ์์ด, ๋์์ด ๋ง์ด ๋์๋ค. ์ด์ api๋ฅผ ๋ง๋ค๋ฉด์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ํ์ฉํ์ฌ api๋ฅผ ๋ง๋ค ์ ์๊ฒ ๋์๋ค. ์์ผ๋ก ์ง๊ธ๊น์ง ๋ฐฐ์ด ๋ด์ฉ์ ํ ๋๋ก ๋ฐฑ์๋ ๊ฐ๋ฐ์๋ก์ ๊ธฐ๋ณธ์ ์ธ ๋ด์ฉ์ ํ์ต์ด ๋ ๊ฒ ๊ฐ๋ค.