ํ๋ก์ ํธ๋ฅผ ์ค๊ณํ ๋ ๋ฐ์ดํฐ๋ฅผ ๋ณด์กดํ๊ณ ์ฌ๋ฌ ์ฌ๋๋ค๊ณผ ๊ณต์ ํ๊ธฐ ์ํด์๋ ์ ์ฅํ ๊ณต๊ฐ์ด ํ์ํ๋ค.
๋ฐ์ดํฐ๋ฅผ ๋ณด์กดํ๋ ๋ฐฉ๋ฒ์ผ๋ก๋ localStorage ,sessionStorage, cookie๋ฑ์ด ์์ง๋ง
์ค๋ฌด์์ ํต์ฌ ๋ฐ์ดํฐ ๋ฑ์ ์ ์ฅํ ๋์๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ฌ์ฉํ๋ค.
๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ์ฌ ๋ค๋ฅธ ์ฌ๋๋ค๊ณผ ๊ณต์ ํ๊ธฐ ์ํด์๋ ์๋ฒ๊ฐ ํ์ํ๋ค.
๋ฐ์ดํฐ๋ฅผ ๋ฌด์์ ์๋ฒ์ ๋ด์ง ์๊ณ ์ฌ๋ฌ ๊ฐ์ง ๊ท์น์ ๋ฐ๋ผ ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃฌ๋ค.
์ด๋ฌํ ์ญํ ์ ํ๋ ๊ฒ์ด ์๋ฒํ๋ก๊ทธ๋๋ฐ ๋ฐ ๋ฐฑ์๋ ํ๋ก๊ทธ๋๋ฐ์ด๋ผ๊ณ ํ๋ค.
Node.js : ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ๊ตฌ๋ํ ์ ์๋ ํ๊ฒฝ
์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ์ด์ฉํ์ฌ ์๋ฒ๋ฟ๋ง ์๋๋ผ ์ฌ๋ฌ ๊ฐ์ง ๊ธฐ๋ฅ์ ํ ์ ์์ง๋ง ์ฃผ๋ก ์๋ฒ๋ฅผ ๊ตฌํํ๋๋ฐ ๋ง์ด ์ฌ์ฉ๋๋ค.
Koa : ์น ํ๋ ์์ํฌ
์๋ฒ๋ฅผ ๋์ฑ ํธ๋ฆฌํ๊ฒ ๊ตฌํํ ์ ์๋๋ก ๋ณด์กฐํด์ฃผ๋ ์ญํ
์ฌ๋ฌ ๊ฐ์ง ์ธ์ด๋ก ๋ฐฑ์๋ ์๋ฒ๋ฅผ ๊ตฌํํ ์ ์์ง๋ง javascript๋ก๋ ๋ฐฑ์๋ ์๋ฒ๋ฅผ ๊ตฌํํ ์๋ ์๋ค.
๋ฐฉ๋ฒ์ Node.js๋ฅผ ํ์ฉํ๋ ๊ฒ์ด๋ค.
Node.js์์ ์๋ฒ๋ฅผ ๊ตฌ์ถํ ๋ ๋ณดํต Express,Hapi,Koa๋ผ๋ ์น ํ๋ ์์ํฌ๋ฅผ ์ฌ์ฉํ๋ค.
๊ทธ ์ค์์ Koa๋ผ๋ ์น ํ๋ ์์ํฌ๋ฅผ ์ฌ์ฉํด๋ณด๊ฒ ๋ค.
Koa๋ ๋ฏธ๋ค์จ์ด ๊ธฐ๋ฅ๋ง ๊ฐ์ถ๊ณ ์์ผ๋ฉฐ ๋๋จธ์ง๋ ๋ค๋ฅธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ ์ฉํ์ฌ ์ฌ์ฉํ๋ค.
๋ํ, Koa๋ async/await ๋ฌธ๋ฒ์ ์ง์ํ๊ณ ์์ด ๋น๋๊ธฐ ์์ ์ ๋ ํธํ๊ฒ ๊ด๋ฆฌํ ์ ์๋ค.
1. ๋ง๋ค๊ณ ์ ํ๋ ํ๋ก์ ํธ์ front-end์ back-end ํด๋๋ฅผ ๊ตฌ๋ถ์ง์ด ๋ง๋ค์ด ๋๋๋ค.
2. npm init -y
package.json์ ๊ฐ๋ค์ defalut๋ก ์ค์ ํ package.jsonํ์ผ ์์ฑ
3. ์น ํ๋ ์์ํฌ ์ค์น (npm install koa)
ESLint์ prettier ์ค์ (ํ์ ์๋)
ESLint : ์ฝ๋ ๋ฌธ๋ฒ ๊ฒ์ฌ
prettier : ์ฝ๋๋ฅผ ๋ ๊น๋ํ๊ฒ ์ ๋ฆฌํ๊ธฐ ์ํ ์ต์คํ
์
ESLint ์ค์
npm add eslint --save -dev
๋ฐฐํฌํ ๋๋ ํฌํจ๋์ง์๊ณ ๊ฐ๋ฐํ ๋๋ ์ฌ์ฉํ๋ ๋ชจ๋
npm init @eslint/config
eslint ๊ธฐ๋ณธ ์ค์ ์ ์ํ ๋ช
๋ น์ด
์ด์ ์๋ npm run eslint --init์ด์์ง๋ง ๋ช
๋ น์ด๊ฐ ๋ฐ๋.
๋ช ๋ น์ด๋ฅผ ์คํํ๋ฉด .eslintrc.jsonํ์ผ์ด ์์ฑ๋ ๊ฒ์ด๋ค.
Prettier ์ค์
๋๋ ํฐ๋ฆฌ์ .prettierrc ํ์ผ์ ๋ง๋ ๋ค.
npm add eslint-congif-prettier
prettier์์ ๊ด๋ฆฌํ๋ ์ฝ๋ ์คํ์ผ์ ESLint์์ ๊ด๋ฆฌํ์ง ์๋๋ก eslint-congif-prettier๋ฅผ ์ค์นํ์ฌ ๊ด๋ฆฌ
4. ์๋ฒ ๋์ฐ๊ธฐ
๋๋ ํฐ๋ฆฌ์ src๋๋ ํฐ๋ฆฌ๋ฅผ ์์ฑํ๊ณ index.js ํ์ผ์ ์์ฑํ ๋ค ๋ค์๊ณผ ๊ฐ์ด ์ฝ๋๋ฅผ ์
๋ ฅํ๋ค.
const Koa = require("koa")
const app = new Koa()
app.use(ctx => {
ctx.body = "hello world"
})
app.listen(4000,() => {
console.log("Listening to port 4000")
})
์ค์นํ koa ๋ชจ๋์ ๋ถ๋ฌ์ new ์ฐ์ฐ์์ ํจ๊ป ํธ์ถํด ๋ณ์์ ํ ๋นํ๋ฉด ํด๋น ๋ณ์๋ฅผ ํ์ฉํด ์๋ฒ๋ฅผ ๊ตฌํํ ์ ์๋ค.
app.listen()์ ์๋ฒ๋ฅผ ๋ง๋ค์ด ์ฌ์ฉํ ์ ์๊ฒ ํ๋ ๋ฉ์๋์ด๋ค.
์ฒซ ๋ฒ์งธ ์ธ์๋ก๋ ์๋ฒ์ ํฌํธ๋ฒํธ๋ฅผ ์ค์ ํ๊ณ ๋๋ฒ ์งธ ์ธ์๋ก๋ ์ฝ๋ฐฑํจ์๋ฅผ ํ ๋นํ์ฌ ์๋ฒ๋ฅผ ์์๋๋ฉด ์คํ๋ ํจ์๋ฅผ ํ ๋นํด์ค๋ค.
app.use๋ ๋ฏธ๋ค์จ์ด ํจ์๋ฅผ ์ ํ๋ฆฌ์ผ์ด์
์ ๋ฑ๋กํด์ค๋ค.
app.use()๋ this๋ฅผ ๋ฐํํ๊ณ ์ฒด์ด๋์ด ๊ฐ๋ฅํ๋ค.
๋ฏธ๋ค์จ์ด ํจ์(middle ware function)
๋ฏธ๋ค์จ์ด ํจ์๋ req(์์ฒญ) ๊ฐ์ฒด, res(์๋ต) ๊ฐ์ฒด, ๊ทธ๋ฆฌ๊ณ ์ดํ๋ฆฌ์ผ์ด์ ์์ฒญ-์๋ต ์ฌ์ดํด ๋์ค ๊ทธ ๋ค์์ ๋ฏธ๋ค์จ์ด ํจ์์ ๋ํ ์์ธ์ค ๊ถํ์ ๊ฐ๋ ํจ์์ด๋ค.
๋ฏธ๋ค์จ์ด๋ ๊ฐ๋จํ๊ฒ ๋งํ๋ฉด ํด๋ผ์ด์ธํธ์๊ฒ ์์ฒญ์ด ์ค๊ณ ๊ทธ ์์ฒญ์ ๋ณด๋ด๊ธฐ ์ํด ์๋ตํ๋ ค๋ ์ค๊ฐ(๋ฏธ๋ค)์ ๋ชฉ์ ์ ๋ง๊ฒ ์ฒ๋ฆฌ๋ฅผ ํ๋, ๋งํ์๋ฉด ๊ฑฐ์ณ๊ฐ๋ ํจ์๋ค์ด๋ผ๊ณ ๋ณด๋ฉด ๋๊ฒ ๋ค.
reference : middle ware function
์ฒซ ๋ฒ์งธ ์ธ์ ctx๋ context์ ์ค์๋ง๋ก ์น ์์ฒญ๊ณผ ์๋ต์ ๋ํ ์ ๋ณด๋ฅผ ์ง๋๊ณ ์๋ค.
๋ ๋ฒ์งธ ์ธ์ next๋ ํ์ฌ ์ฒ๋ฆฌ ์ค์ธ ๋ฏธ๋ค์จ์ด์ ๋ค์ ๋ฏธ๋ค์จ์ด๋ฅผ ํธ์ถํ๋ ํจ์์ด๋ค.
๋ฏธ๋ค์จ์ด๋ฅผ ๋ฑ๋กํ๊ณ next ํจ์๋ฅผ ํธ์ถํ์ง ์์ผ๋ฉด , ๊ทธ ๋ค์ ๋ฏธ๋ค์จ์ด๋ฅผ ์ฒ๋ฆฌํ์ง ์๋๋ค.
next()๋ promise๋ฅผ ๋ฐํํ๊ณ ๋ค์์ ์ฒ๋ฆฌํด์ผํ ๋ฏธ๋ค์จ์ด๊ฐ ๋๋์ผ ์๋ฃ๋๋ค.
5. nodemon ์ฌ์ฉ
์๋ฒ์ ๋ฐ์ํ๊ธฐ ์ํด์ ์ฝ๋๋ฅผ ๋ณ๊ฒฝํ ๋๋ง๋ค ์๋ฒ๋ฅผ ์ฌ์์ํด์ผํ๋ค.
(node index.js)
์ด๋ฅผ ๋ณด์ํ๊ธฐ์ํด ์ฝ๋๋ฅผ ๋ณ๊ฒฝํ ๋๋ง๋ค ์๋ฒ์ ๋ฐ์๋ ์ ์๋๋ก nodemon ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ์.
๊ทธ๋ฆฌ๊ณ ๋ช ๋ น์ด๋ฅผ ์คํํด์ผ nodemon์ ์คํํ ์ ์๋๋ก package.json์ script ๋ช ๋ น์ด์ ๋ฑ๋กํด๋์.
"scripts" : {
"start" : "node src",
"start:dev" : "nodemon --watch src/ src/index.js"
}
npm run start:dev ๋ช ๋ น์ด๋ฅผ ์ ๋ ฅํ์ฌ nodemon์ ์คํํ๋ค.
6. koa-router
๋ค๋ฅธ ์ฃผ์์ ๋ค๋ฅธ ์์ ์ ํ ์ ์๋๋ก ํ๊ฒ ํ๋ koa ๋ผ์ฐํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด๋ค.
const Koa = require("koa")
const Router = require("koa-router")
const app = new Koa()
const router = new Router()
router.get("/",ctx => {
ctx.body = "Home"
})
router.get("/about", ctx => {
ctx.body = "About"
})
app.use(router.routes()).use(router.allowedMethods()) //app.use chaining
app.listen(4000,() => {
console.log("Listening to port 4000")
})
new Router() / router.get...
koa-router ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ถ๋ฌ์ router ๊ฐ์ฒด๋ฅผ ๋ง๋ค๊ณ ์ค์ ํ๊ณ ์ถ์ ๊ฒฝ๋ก๋ณ ์์
์ ํด์ค๋ค.
app.use(router.routes()).use(router.allowedMethods())
์๋ฒ์ router๋ฅผ ๋ฑ๋กํด์ค๋ค.
router.get("/about/:name", ctx => {
const {name} = ctx.params
})
router.get("/about" , ctx => {
const {id} = ctx.query
})
7. REST API
ํด๋ผ์ด์ธํธ์ธก์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๊ธฐ์ํด์๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ฐ๋ก ์ ๊ทผํ๋ ๊ฒ์ด ์๋ ์๋ฒ๋ฅผ ํตํด ์ ๊ทผํด์ผํ๋ค.
์๋ฒ๋ ํด๋ผ์ด์ธํธ์ ์์ฒญ ๋ฉ์๋์ ๋ฐ๋ผ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ๊ทผํ์ฌ ํ์ํ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํด์ค๋ค.
์ด ๋ ์์ฒญ ๋ฉ์๋๋ฅผ Rest API๋ผ๊ณ ํ๋ค.
REST API๋ GET,POST,DELETE,PUT,PATCH ๋ฑ ๋ฉ์๋๊ฐ ์๋ค.
์ด ๋ฉ์๋๋ค์ ํตํด ๋ฐ์ดํฐ์ ์กฐํ,์ถ๊ฐ,์ญ์ ,์์ ๋ฑ์ ํ ์ ์๋ค.
ํด๋ผ์ด์ธํธ๊ฐ ์ ๋ฉ์๋๋ค์ ์ฌ์ฉํ์ฌ ์์ฒญ์ ํ๋ฉด ์๋ฒ์์๋ ํด๋น ์์ฒญ์ด ๋ค์ด์์ ๊ฒฝ์ฐ ๊ฐ ์์ฒญ๋ฉ์๋์ ๋ฐ๋ผ ์์ ์ ์ค์ ํด์ค๋ค.
๋ค์์ผ๋ก ๋ง๋ ์๋ฒ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ด์ฉํ์ฌ REST API๋ก ์ ๊ทผํ์ฌ ์์ ํ๋ ๊ฒ์ ๊ณ์ ํด๋ณด์.
๋ฐ์ดํฐ๋ฒ ์ด์ค๋ mongoDB๋ฅผ ์ฌ์ฉํ ๊ฒ์ด๋ค.