Dockerfile.mongodb를 image로 변경해 보자
즉 Dockerfile.mongo로 정의해두었던 mongoDB의 설정을 yaml파일에 직접 정의하는 것이다.
class 폴더 안에 04-04-docker-compose-with-mongo 폴더를 복사 붙여넣기 한 이후, 복사된 폴더의 이름을 04-05-docker-compose-with-mongoose으로 변경한다.
04-05-docker-compose-with-mongoose 폴더 안에 Dockerfile.mongo 는 삭제한다.
version: '3.7'
# 컴퓨터들
services:
# 컴퓨터이름
my-backend:
build:
context: .
dockerfile: Dockerfile
ports:
- 4000:4000
# 컴퓨터이름
my-database:
image: mongo:5
ports:
- 27017:27017
기존에 Dockerfile.mongo에 정의해 두었던 mongo의 버전을 image에 정의해주었다.
이제 따로 build에 대한 정의는 필요없으니 지워주었다.
ODM은 mongoDB 에서 사용되는 쿼리문을 더 쉽게 만들어주는 도구이다.
mySQL과 같은 RDBMS 에서 사용되는 것은 ORM이다.
Mongoose는 Node.js와 MongoDB를 위한 ODM(Object Data Mapping) library 이다.
호환성이 없는 JavaScript와 MongoDB의 데이터를 Mapping하여 간편한 CRUD를 가능하게 해준다.
이제, 직접 스키마를 작성해 실제 데이터 베이스와 연결하고 요청을 보내 데이터를 생성하고 생성된 데이터를 읽어오는 작업까지 해보자
터미널을 열어서 04-05-docker-compose-with-mongoose ⇒ backend 폴더로 이동한다.
yarn add mongoose 를 입력해 라이브러리를 설치해준다.
package.json 파일에 설치된 mongoose의 버전이 적혀져 나온다면 잘 설치된 것이다.
npm 사이트의 mongoose 문서를 참고하여 라이브러리를 사용하여 코드를 작성해보자
index.js 파일을 열어 아래와 같이 코드를 추가 작성한다.
// const express = require('express') // 옛날방식 => commonjs
import express from 'express' // 요즘방식 => module
import {checkEmail, getWelcomeTemplate, sendTemplateToEmail} from './email.js'
import {checkPhone, getToken, sendTokenToSMS} from './phone.js'// export 가져오기
import swaggerUi from 'swagger-ui-express'
import swaggerJsdoc from 'swagger-jsdoc'
import {options} from './swagger/config.js'
import cors from 'cors'
import mongoose from 'mongoose' // 추가
const app = express()
app.use(express.json()) // 옛날에는 bodyParser 사용
app.use(cors())
app.use('/api-docs', swaggerUi.serve, swaggerUi.setup(swaggerJsdoc(options))); // app.get("/qqq", (req, res, next) => { 첫번째함수... next() }, () => { 두번째함수... })
app.get('/boards', (req, res) => {
// 1. DB에 접속 후, 데이터를 조회 => 데이터 조회했다고 가정
const result = [
{ number: 1, writer: "철수", title: "제목입니다~~", contents: "내용이에요!!!" },
{ number: 2, writer: "영희", title: "영희입니다~~", contents: "영희이에요!!!" },,
{ number: 3, writer: "훈이", title: "훈이입니다~~", contents: "훈이이에요!!!" },
]
// 2. DB에서 꺼내온 결과를 브라우저에 응답(response) 주기
res.send(result)
})
app.post("/boards", (req, res) => {
// 1. 브라우저에서 보내준 데이터 확인하기
console.log(req)
console.log("=========================")
console.log(req.body)
// 2. DB에 접속 후, 데이터를 저장 => 데이터 저장했다고 가정
// 3. DB에 저장된 결과를 브라우저에 응답(response) 주기
res.send("게시물 등록에 성공하였습니다.")
})
app.post("/tokens/phone", (req, res) => {
const myphone = req.body.qqq
// 1. 휴대폰번호 자릿수 맞는지 확인하기(10~11자리)
const isValid = checkPhone(myphone)
if(isValid === false) return
// 2. 핸드폰 토큰 6자리 만들기
const mytoken = getToken()
// 3. 핸드폰번호에 토큰 전송하기
sendTokenToSMS(myphone, mytoken)
res.send("인증완료!!!")
})
app.post("/users", (req, res) => {
const { name, age, school, email } = req.body
// 1. 이메일이 정상인지 확인(1-존재여부, 2-"@"포함여부)
const isValid = checkEmail(email)
if(isValid === false) return
// 2. 가입환영 템플릿 만들기
const myTemplate = getWelcomeTemplate({ name, age, school })
// 3. 이메일에 가입환영 템플릿 전송하기
sendTemplateToEmail(email, myTemplate)
res.send("가입완료!!!")
})
// 몽고DB 접속!! // 추가
mongoose.connect("mongodb://my-database:27017/mydocker")
.then(() => console.log("db 접속에 성공하였습니다."))
.catch(() => console.log("db 접속에 실패하였습니다."))
app.listen(4000, () => {
console.log("백엔드 API 서버가 정상 실행중입니다.")
})
먼저, import mongoose from 'mongoose' 코드를 작성하여 몽구스를 사용할 수 있게 모듈을 가져온다.
앱이 하나의 데이터베이스만 사용하는 경우에는
mongoose.connect를
추가 연결을 생성해야 하는 경우에는mongoose.createConnection를 사용한다.
기본형태는 mongoose.connect('mongodb://localhost/my_database')의 형태로 작성된다.
이제 다음과 같이 코드를 작성하여 추가해 준다.
mongoose.connect("mongodb://my-database:27017/mydocker") 네임 리졸루션을 이용하여
mongoDB를 연결해 주어야 한다. 포트 또한 작성해 준다.
도커 컴퓨터를 그룹핑하여 도커 컴포즈를 하게 되면 다수의 도커 컴퓨터들은 서로 연결이 된다.
이 때, 도커들이 연결될 때는 이름으로 연결이 되기 때문에 localhost가 아닌
docker-compose.yaml 에서 mongo db에 사용했던 이름을 넣어주면 연결된다.
물론 compass를 사용하려면 yaml 파일에서 포트포워딩은 해줘야 한다.