2023.03.22 TIL

์ •์Šน์›ยท2023๋…„ 3์›” 23์ผ
0
post-thumbnail
post-custom-banner

๐Ÿ“’ ๋ชฉ์ฐจ

๐Ÿ“Œ Mongodb๋ž€ ๋ฌด์—‡์ผ๊นŒ?
๐Ÿ“Œ Mongodb ์„ค์น˜ ๋ฐ ์‚ฌ์šฉ๋ฒ•
๐Ÿ“Œ Docker-compose๋ž€ ๋ฌด์—‡์ผ๊นŒ?
๐Ÿ“Œ ODM & Mongoose

๐Ÿ“Œ Mongodb๋ž€ ๋ฌด์—‡์ผ๊นŒ?

mongodb๋Š” ๋ฌธ์„œ์ง€ํ–ฅ ์ €์žฅ์†Œ๋ฅผ ์ œ๊ณตํ•˜๋Š” NoSQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์‹œ์Šคํ…œ์ด๋‹ค.
์ด์™ธ์—๋„ 10gen, Couchbse, CouchDB ๋“ฑ์ด ์žˆ์ง€๋งŒ ์ธ์ง€๋„ 1๋“ฑ์„ ์œ ์ง€ํ•˜๊ณ  ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์ด๋‹ค.

โœ… Mongodb์˜ ํŠน์ง•

Mongodb์—์„œ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ Document๋กœ ๋ถ€๋ฅด๋ฉฐ, ํ•ด๋‹น ๋ฐ์ดํ„ฐ์˜ ์ง‘ํ•ฉ์„ Collection์ด๋ผ๊ณ  ํ•œ๋‹ค.
์Šคํ‚ค๋งˆ์˜ ์ œ์•ฝ์ด ์—†์–ด ์ž์œ ๋กœ์šฐ๋ฉฐ, Binary JSON ํ˜•ํƒœ๋กœ ๊ฐ๊ฐ์˜ ๋ฌธ์„œ๊ฐ€ ์ €์žฅ๋˜์–ด JOIN ์—†์ด ํ•œ ๋ฌธ์„œ์— ์ดํ•ดํ•˜๊ธฐ ์‰ฌ์šด ํ˜•ํƒœ ๊ทธ๋Œ€๋กœ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์žฅ์ ์ด ์žˆ๋‹ค.

๊ฐ์ฒด์ง€ํ–ฅํ”„๋กœ๊ทธ๋ž˜๋ฐ๊ณผ ์ž˜๋งž๊ธฐ ๋•Œ๋ฌธ์— Node.js์™€ ํ˜ธํ™˜์ด ๋งค์šฐ ์ข‹๋‹ค. ๋”ฐ๋ผ์„œ Node.js์—์„œ ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์ด๋‹ค.

๋˜ํ•œ, mongodb์—์„œ๋Š” ์งˆ์˜๋ฌธ์ด ๋ชจ๋‘ JSON ๊ฐ์ฒด๋กœ ํ‘œํ˜„๋˜๋ฉฐ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ ‘๊ทผํ•˜๊ณ  ์กฐ์ •ํ•˜๋Š” ๊ตฌ๋ฌธ์€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ๋ฌธ๋ฒ•์— ๊ฐ€๊นŒ์šด ๋ชจ์Šต์„ ๋ณด์—ฌ์ค€๋‹ค.

ํŠน์ง•

    • Join์ด ์—†์œผ๋ฏ€๋กœ Join์ด ํ•„์š” ์—†๋„๋ก ๋ฐ์ดํ„ฐ ๊ตฌ์กฐํ™”๊ฐ€ ํ•„์š”
  • ๋‹ค์–‘ํ•œ ์ข…๋ฅ˜์˜ ์ฟผ๋ฆฌ๋ฌธ์„ ์ง€์›(ํ•„ํ„ฐ๋ง, ์ˆ˜์ง‘, ์ •๋ ฌ, ์ •๊ทœํ‘œํ˜„์‹ ๋“ฑ)
  • ๊ด€๋ฆฌ์˜ ํŽธ์˜์„ฑ
  • ์Šคํ‚ค๋งˆ ์—†๋Š”(Schemaless) ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์ด์šฉํ•œ ์‹ ์† ๊ฐœ๋ฐœ. ํ•„๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ์ œ๊ฑฐํ•˜๋Š” ๊ฒƒ์ด ๋งค์šฐ ์‰ฌ์›Œ์ง
  • ์‰ฌ์šด ์ˆ˜ํ‰ ํ™•์žฅ์„ฑ
  • ์ธ๋ฑ์‹ฑ ์ œ๊ณต

โœ… Local์—์„œ mongoDB ์—ฐ๊ฒฐํ•˜๊ธฐ

์—ฐ๊ฒฐ์„ ์‹œ์ž‘ํ•˜๊ธฐ์— ์•ž์„œ 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 compass

์ด์ œ 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-compose๋ž€ ๋ฌด์—‡์ผ๊นŒ?

docker-compass๋ž€ ๋ณต์ˆ˜๊ฐœ์˜ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‹คํ–‰์‹œํ‚ค๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ๋„๊ตฌ์ด๋‹ค.
yaml ํŒŒ์ผ์„ ํ†ตํ•ด ์„œ๋น„์Šค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
๊ตฌ์ฒด์ ์œผ๋กœ ์„ค๋ช…ํ•˜์ž๋ฉด yamlํŒŒ์ผ๋กœ ์—ฌ๋Ÿฌ๊ฐœ์˜ docker ๋‚ด๋ถ€ ์†์„ฑ์„ ์„ค์ •ํ•˜๊ณ  yaml ํŒŒ์ผ์„ ์‹คํ–‰์‹œ์ผœ ๋งˆ์น˜ docker๋ฅผ ์ผ๊ด„์ ์œผ๋กœ ํ•œ๋ฒˆ์— ์‹คํ–‰์‹œํ‚ค๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ์ผ์„ ํ•  ์ˆ˜ ์žˆ๋‹ค.

โœ… docker-compass๋ฅผ ํ™œ์šฉํ•œ mongodb ์—ฐ๊ฒฐ

์ด๋ฒˆ์—๋Š” 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.mongodb๋ฅผ image๋กœ ๋ณ€๊ฒฝํ•˜๊ธฐ

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๋‚ด Mongodb ์ ‘์†ํ•˜๊ธฐ

docker exec -it ์ปจํ…Œ์ด๋„ˆID๋ฅผ ํ†ตํ•ด mongodb ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€๋กœ ์ ‘์†ํ•  ์ˆ˜ ์žˆ๋‹ค.
show databases๋ฅผ ํ†ตํ•ด ๋กœ์ปฌ์—์„œ ์ ‘์†ํ–ˆ์„ ๋•Œ์™€ ๋™์ผํ•˜๋‹ค๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

๐Ÿ“Œ ODM & Mongoose

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๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ๋‹ค. ์•ž์œผ๋กœ ์ง€๊ธˆ๊นŒ์ง€ ๋ฐฐ์šด ๋‚ด์šฉ์„ ํ† ๋Œ€๋กœ ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์ž๋กœ์„œ ๊ธฐ๋ณธ์ ์ธ ๋‚ด์šฉ์€ ํ•™์Šต์ด ๋œ ๊ฒƒ ๊ฐ™๋‹ค.

post-custom-banner

0๊ฐœ์˜ ๋Œ“๊ธ€