๐ ๋ชจ๋ธ ์ ์ํ๊ธฐ
๐ GET ๋ฐ์ดํฐ ์กฐํ
๐ POST ๋ฐ์ดํฐ ๋ฑ๋ก
๐ mongoose์ debug
๐ ddocker-compose์ volumes
๐ ์คํฌ๋ํ & ํฌ๋กค๋ง
model์ ๋ง๋๋ ๊ฒ์ mongodb์ ์ ์ฅ๋๋ data ๊ตฌ์กฐ์ ๋ํ ์ ๋ณด๋ฅผ JSON ํํ๋ก ์ ์ฅํ ๊ฒ์ด๋ค.
model์ ์์ฑํ ๊ตฌ์กฐ๋ฅผ ๋ฐํ์ผ๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ฐ์ดํฐ๋ฅผ ์๋ง๊ฒ ์ ์ฅํ๋ค.
// board.model.js import mongoose from 'mongoose' // mongoose ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ถ๋ฌ์ค๊ธฐ // mongoose ์คํค๋ง๋ mongodb์ ์ ์ฅ๋๋ document data ๊ตฌ์กฐ์ ๊ดํ ์ ๋ณด๋ฅผ JSON ํํ๋ก ์ ์ํ ๊ฒ const boardSchema = new mongoose.Schema({ writer: String, title: String, contents: String }) export const Board = mongoose.model("Board", boardSchema) // ์ธ๋ถ์์ ์ ์ํ ์ ์๋๋ก exportํ๊ธฐ
result์ ๋ด์ฉ์ ๋ด์ ์๋ต์ผ๋ก ๋ด๋ณด๋ด์ฃผ๋ ๊ฒ์ด๋ค.
// index.js import { Board } from './models/board.model.js' // index.js ํ์ผ์์ ์ฌ์ฉํ ์ ์๊ฒ ๋ถ๋ฌ์ค๊ธฐ const app = express() app.use(cors()) app.use(express.json()) app.use('/api-docs', swaggerUi.serve, swaggerUi.setup(swaggerJsdoc(options))); app.get('/boards', async (req, res) => { // 1. ๋ฐ์ดํฐ๋ฅผ ์กฐํํ๋ ๋ก์ง => DB์ ์ ์ํด์ ๋ฐ์ดํฐ ๊บผ๋ด์ค๊ธฐ const result = await Board.find() // find() : ๋ชจ๋ ๋ฐ์ดํฐ ์กฐํํ ๋ ์ฌ์ฉ, // findOne() : ํน์ ๋ฐ์ดํฐ๋ง ์กฐํํ ๋ ์ฌ์ฉ // 2. ๊บผ๋ด์จ ๊ฒฐ๊ณผ ์๋ต ์ฃผ๊ธฐ res.send(result) })
POST ์์ฒญ์ ๋ฐ์์ ๋, JSON ๋ฐ์ดํฐ๋ฅผ ๋ด์ BODY์์ ๊ฐ๊ฐ์ ์์๋ฅผ ํ๋์ฉ ๋นผ์ ์ฐ๊ฒฐํด ๋์ mongodb์ boards collection์ ์ ์ฅํ๋ค.
//index.js app.post('/boards', async (req, res) => { console.log(req.body); // 1. ๋ฐ์ดํฐ๋ฅผ ๋ฑ๋กํ๋ ๋ก์ง => DB์ ์ ์ํด์ ๋ฐ์ดํฐ ์ ์ฅํ๊ธฐ const board = new Board({ writer: req.body.writer, title: req.body.title, contents: req.body.contents, }); await board.save(); // 2. ์ ์ฅ ๊ฒฐ๊ณผ ์๋ต ์ฃผ๊ธฐ res.send('๊ฒ์๋ฌผ ๋ฑ๋ก์ ์ฑ๊ณตํ์์ต๋๋ค!!'); });
mongoose.set("debug", true)
๋ฅผ ํ๊ฒ ๋๋ฉด mongoose์ ๋ํ ๋ก๊ทธ๋ฅผ ํ์ธํ ์ ์์ด, ๋๋ฒ๊น
์ด ๊ฐ๋ฅํด์ง๋ค.
๋ก๊ทธ๋ฅผ ํตํด db์ ์ ์ฅ๋๋ query๋ฌธ์ ํ์ธํ ์ ์๋ค.
// index.js // ์๋ต... mongoose.set("debug", true) // ์ถ๊ฐ // ๋ชฝ๊ณ DB ์ ์!! mongoose.connect("mongodb://my-database:27017/mydocker10") .then(() => console.log("db ์ ์์ ์ฑ๊ณตํ์์ต๋๋ค.")) .catch(() => console.log("db ์ ์์ ์คํจํ์์ต๋๋ค.")) app.listen(4000, () => { console.log("๋ฐฑ์๋ API ์๋ฒ๊ฐ ์ผ์ก์ด์!!!") })
docker-compose์ volumes๋ฅผ ์ค์ ํ์ง ์๋๋ค๋ฉด, ๋ก์ปฌ์ ํ์ผ ๋ด์ฉ์ ๋ณ๊ฒฝํ๋๋ผ๋ docker๋ด์ ํ์ผ์ ๋ณ๊ฒฝ๋์ง
์๋๋ค.
๋ฐ๋ผ์ ์๋์ ๋ ๋๊ฐ์ง ์ค์ ์ ์๋ฃํ๊ฒ ๋๋ฉด ๋์ปค๋ด์์๋ ๋งค๋ฒ build๋ฅผ ํ์ง ์๊ณ ๋ณ๊ฒฝ๋ ์์ค์ฝ๋๋ฅผ ์ ์ฉํ ์ ์๋ค.
vlumes๋ฅผ ํตํด ๋ก์ปฌ์ ์์ค์ฝ๋์ ๋์ปค๋ด์ ์์ค์ฝ๋๋ฅผ ๊ณต์ ํ ์ ์๋ค.
version: '3.7' # ์ปดํจํฐ๋ค services: # ์ปดํจํฐ์ด๋ฆ my-backend: build: context: . dockerfile: Dockerfile volumes: - ./index.js:/myfolder/index.js - ./email.js:/myfolder/email.js ports: - 4000:4000 # ์ปดํจํฐ์ด๋ฆ my-database: image: mongo:5 ports: - 27017:27017
ํน์ ํ ์น ์ฌ์ดํธ์์ ํด๋น ์ฌ์ดํธ์ HTML์ ๊ธ์ด์ค๋ ๊ฒ์ ๋งํ๋ค.
์๋ฅผ ๋ค์ด ์๋์ ๊ฐ์ด ๋งํฌ๋ฅผ ๊ณต์ ํ๋ฉด ๋ฐ์ ์๋์ผ๋ก ์ฌ์ดํธ์ ์๊ฐ์ ์ด๋ฏธ์ง๊ฐ ๋ํ๋๋ ๊ฒ์ ์๋ฏธํ๋ค.
์ ์ ๊ฐ ๊ฒ์๊ธ์ ์์ฑํด์ ๋ฑ๋กํ ๋, ๋ฐฑ์๋ API๋ก ๊ธ์ ๋ด์ฉ์ ๋ณด๋ด์ฃผ๊ฒ๋๋ค. ์ด๋, ๊ธ์ ๋ด์ฉ์ http๊ฐ ํฌํจ๋
URL์ด ์๋ค๋ฉด, ๊ทธ ์ฌ์ดํธ์ ์ ์ํด์ open graph
๊ฐ ์๋ ๋ด์ฉ์ ๊ธ์ด์์ ์ ์ฅํ๋ค. ๊ทธ๋ ๊ฒ ํ๋ฉด,
๋์ค์ ๊ธ์ ์์ธ๋ณด๊ธฐ๋ฅผ ํ ๋, ์์ ๋ค์ด๋ฒ ์์์ฒ๋ผ ์ฌ์ดํธ ์๊ฐ๋ฅผ ๊ฐ์ด ๋ณด์ฌ์ฃผ๊ฒ ๋๋ค.
๋ค์ด๋ฒ์ ํ์ด์ง๋ฅผ ํ์ธํด๋ณด๋ฉด, <head>
ํ๊ทธ ์์ meta ํ๊ทธ๋ค์ด ์๊ณ , ๊ทธ ์ค์์ property๊ฐ og๋ก ์์ํ๋ ํ๊ทธ๋ค์ด ์๋ค.
//index.js import axios from 'axios' import cheerio from 'cheerio' const createMessage = async () => { // ์ ๋ ฅ๋ ๋ฉ์์ง: "์๋ ํ์ธ์~ https://www.naver.com ์ ๋ฐฉ๋ฌธํด ์ฃผ์ธ์!" // 1. ์ ๋ ฅ๋ ๋ฉ์์ง์์ http๋ก ์์ํ๋ ๋ฌธ์ฅ์ด ์๋์ง ๋จผ์ ์ฐพ๊ธฐ!(.find() ๋ฑ์ ์๊ณ ๋ฆฌ์ฆ ์ฌ์ฉํ๊ธฐ) const url = "https://www.daum.net" // 2. axios.get์ผ๋ก ์์ฒญํด์ html์ฝ๋ ๋ฐ์์ค๊ธฐ => ์คํฌ๋ํ const result = await axios.get(url) console.log(result.data) // 3. ์คํฌ๋ํ ๊ฒฐ๊ณผ(result)์์ OG(์คํ๊ทธ๋ํ) ์ฝ๋ ๊ณจ๋ผ๋ด์ ๋ณ์์ ์ ์ฅํ๊ธฐ const $ = cheerio.load(result.data) $("meta").each((i, el) => { if($(el).attr("property") && $(el).attr("property").includes("og:")){ const key = $(el).attr("property") // og:title, og:description, ... const value = $(el).attr("content") // ๋ค์ด๋ฒ, ๋ค์ด๋ฒ ๋ฉ์ธ์์ ~~~ console.log(key, value) } }) } createMessage()
ํฌ๋กค๋ง์ ์คํฌ๋ํ์ ์ ๊ธฐ์ ์ผ๋ก ์ฃผ๊ธฐ์ ์ผ๋ก ์ฌ๋ฌ๋ฒํ๋ ๊ฒ์ ์๋ฏธํ๋ค.
mongoose๋ฅผ ํ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์๋๋ฐ ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃจ๋ ํ์ต์ ํ์๋ค. ์ด์ ํ๋ก ํธ์ ์๋ฒ์ฌ์ด๋ฟ๋ง ์๋๋ผ ๋ฐ์ดํฐ๋ฒ ์ด์ค๊น์ง ๋ค๋ฃฐ ์ ์๊ฒ ๋๋, ์ ์ ๋ฐฑ์๋ ๊ฐ๋ฐ์๋ก์ ๊ฒ๋ชจ์ต์ด ๊ฐ์ถฐ์ง๋ ๊ฒ ๊ฐ๋ค. ๋ฌผ๋ก ์์ง์ ์์์ ๋ถ๊ณผํ์ง๋ง, ๊ทธ๋๋ ์ค๋ ํ์ตํ ๋ด์ฉ์ ๋ฐํ์ผ๋ก ๋ฐ์ดํฐ์ ํ๋ฆ์ ์ ์ฒด์ ์ผ๋ก ์ ์ ์์ด ์๋ฏธ์๋ ํ๋ฃจ์ธ ๊ฒ ๊ฐ๋ค.