Router, Controller

๊น€๋‘ํ˜„ยท2023๋…„ 8์›” 10์ผ
0

CafeOasis ๊ฐœ๋ฐœ์ผ์ง€

๋ชฉ๋ก ๋ณด๊ธฐ
2/5

๐Ÿ’ก ํ˜„์žฌ ํ”„๋กœ์ ํŠธ๋Š” mvc ํŒจํ„ด์„ ์ ์šฉ ์ค‘์ธ๋ฐ ์ด๋ฒˆ์—๋Š” ๊ทธ ์ค‘์—์„œ controller ํŒŒํŠธ๋ฅผ ๊ตฌํ˜„ํ•œ ๋ถ€๋ถ„์„ ๊ฐ„๋‹จํ•˜๊ฒŒ ์ ์–ด ๋ณด๊ณ ์ž ํ•œ๋‹ค.

Router๋ž€?

๊ธฐ์กด express๋ฅผ ์‚ฌ์šฉํ•ด์„œ api ์„œ๋ฒ„๋ฅผ ๊ตฌํ˜„ํ•˜๋ฉด ํด๋ผ์ด์–ธํŠธ ์ธก์—์„œ ๋“ค์–ด์˜ค๋Š” ์š”์ฒญ์€ ์•„๋ž˜์˜ ์ฝ”๋“œ์™€ ๊ฐ™์ด request๋ฅผ ์ˆ˜์‹ ๋ฐ›์•„ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ณ  ๋‹ค์‹œ ํด๋ผ์ด์–ธํŠธ ์ธก์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง„๋‹ค.

const express = require('express')
const app = express()

// app.[METHOD]('request ๊ฒฝ๋กœ', callback_function)
app.get('/', (req, res) => {
  res.send('hello world')
})

๊ธฐ์กด ์š”์ฒญ ์ฒ˜๋ฆฌ ๋‹จ์ 

ํ•˜์ง€๋งŒ ๊ธฐ์กด๊ณผ ๊ฐ™์ด ์ธ์ž๋กœ ์ „๋‹ฌํ•˜๋Š” callback ํ•จ์ˆ˜์—์„œ ๊ฐ ์š”์ฒญ๋“ค์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋กœ์ง์„ ์ง์ ‘์ ์œผ๋กœ ๊ตฌํ˜„ํ•˜๋‹ค ๋ณด๋ฉด ํ”„๋กœ์ ํŠธ์˜ ๊ทœ๋ชจ๊ฐ€ ์ปค์ง์— ๋”ฐ๋ผ ์ˆ˜๋งŽ์€ ์š”์ฒญ๋“ค์„ ์ฒ˜๋ฆฌํ•˜๊ฒŒ ๋œ๋‹ค.

๊ทธ ๊ณผ์ •์—์„œ ํ•˜๋‚˜์˜ js ํŒŒ์ผ์—์„œ ๋ชจ๋“  ์š”์ฒญ์— ๋Œ€ํ•ด ๋กœ์ง์„ ๊ตฌํ˜„ํ•˜๊ฒŒ ๋˜๋Š”๋ฐ ๊ทธ๋Ÿฌ๋‹ค ๋ณด๋ฉด ๋‹น์—ฐํžˆ ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ์ด ๋–จ์–ด์ง€๊ณ  ์ฝ”๋“œ๊ฐ€ ์ค‘๋ณต๋˜๊ฒŒ ๋˜๋ฉด์„œ ํ”„๋กœ์ ํŠธ์˜ ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ๋–จ์–ด์ง„๋‹ค.

Express Router

๊ทธ ์ ์„ express์—์„œ ์ œ๊ณตํ•˜๋Š” Router ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•ด ๊ณตํ†ต๋œ ๊ฒฝ๋กœ๋ฅผ ๋ชจ์•„์„œ ๋ผ์šฐํŒ…์„ ๊น”๋”ํ•˜๊ฒŒ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

โ†’ โ€œ๋ผ์šฐํŠธ ์ฒด์ด๋‹โ€ ์ด๋ผ๊ณ  ๋ถ€๋ฅด๋Š” ๊ฑฐ ๊ฐ™๋‹ค

๊ฐ„๋‹จํ•˜๊ฒŒ Router์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๊ธฐ ์œ„ํ•ด src ๋””๋ ‰ํ† ๋ฆฌ ์•„๋ž˜์— routes๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.

  • index.js ๋Š” Express generator์— ์˜ํ•ด ์ž๋™์œผ๋กœ ์ƒ์„ฑ๋œ ํŒŒ์ผ(defalut ๊ฐ’..?)

๊ทธ๋ฆฌ๊ณ  ์•„๋ž˜์™€ ๊ฐ™์ด users.js ํŒŒ์ผ์— ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜์ž.
(์ „์ฒด ์ฝ”๋“œ๋Š” ๊นƒํ—ˆ๋ธŒ๋ฅผ ์ฐธ๊ณ ํ•˜์ž)

var express = require("express");
var router = express.Router();
// ๋กœ์ง์„ ์ฒ˜๋ฆฌํ•  ์ปจํŠธ๋กค๋Ÿฌ
const userController = require("../controllers/userController")

router.get("/emailCheck/:email", userController.checkEmailExistence);

module.exports = router;

๊ทธ๋ฆฌ๊ณ  app.js ์— user router๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ์•„๋ž˜์˜ ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜์ž.
app.use("/users", usersRouter);

๊ทธ๋ฆฌ๊ณ  ๋‚˜๋Š” router์™€ controller๋ฅผ ๋ถ„๋ฆฌํ•ด์„œ router๋Š” ๊ฒฝ๋กœ๋ฅผ ๋ผ์šฐํŒ… ํ•˜๋Š” ์šฉ๋„๋กœ๋งŒ ์‚ฌ์šฉํ•˜๊ณ ์ž ํ•œ๋‹ค.
(Django์˜ urls.py๋ฅผ ์ด์šฉํ•œ ๋ผ์šฐํŒ… ๋ฐฉ์‹๊ณผ ์œ ์‚ฌโ€ฆ?)

์œ„์™€ ๊ฐ™์ด ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑ์„ ํ–ˆ์œผ๋ฉด ๋งŒ์•ฝ โ€˜GET /emailChecl/[query parameter]โ€™ ๊ฒฝ๋กœ๋กœ ์„œ๋ฒ„์— ์š”์ฒญ์ด ์˜ค๋ฉด router๋Š” ์š”์ฒญ์„ ๋ฐ›์•„ userController๋กœ requset์„ ์ „๋‹ฌํ•œ๋‹ค.

Controller

์ด์ œ ํด๋ผ์ด์–ธํŠธ์—์„œ ๋“ค์–ด์˜จ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๊ณ  ๋ฐ˜ํ™˜ํ•˜๋Š” ๋กœ์ง์„ ๊ตฌํ˜„ํ•ด์•ผ ํ•˜๋Š”๋ฐ ๋ฐ”๋กœ mvc design pattern์˜ controller๋ฅผ ๊ตฌํ˜„ํ•˜๋ฉด ๋œ๋‹ค!!

๋ผ์šฐํ„ฐ๋„ ๊ณตํ†ต๋œ ๊ฒฝ๋กœ(๊ธฐ๋Šฅ)๋กœ ๋ฌถ์–ด์„œ ๊ตฌํ˜„ํ•œ ๋“ฏ์ด ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ๊ณตํ†ต๋œ ๊ธฐ๋Šฅ์ด๋‚˜ ๋ชฉ์ ์„ ๊ฐ€์ง„ ์ปจํŠธ๋กค๋Ÿฌ๋“ค์„ ํ•ฉ์ณ์„œ ํ•˜๋‚˜์˜ ๋ชจ๋“ˆ๋กœ ๊ตฌํ˜„ํ•ด๋ณด๊ฒ ๋‹ค.

โ†’ ์ผ๋‹จ Router : Controller = 1: 1 ๋งค์นญ์ด ๋˜๊ฒŒ๋”โ€ฆ

userController

์œ„์˜ ๊ทธ๋ฆผ์ฒ˜๋Ÿผ controllers ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๊ทธ ์•„๋ž˜์— ์‚ฌ์šฉ์ž ๊ด€๋ จ ๊ธฐ๋Šฅ์„ ๋‹ด๋‹นํ•  userController.js ํŒŒ์ผ์„ ์ƒ์„ฑํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์•„๋ž˜์™€ ๊ฐ™์ด ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•ด๋ณด์ž.

const db = require("../models");

// ์ด๋ฉ”์ผ ์ฒดํฌ ์ปจํŠธ๋กค๋Ÿฌ
exports.checkEmailExistence = async (req, res) => {
  const emailToCheck = req.params.email;

  db.Worker.findOne({ where: { email: emailToCheck } })
    .then((user) => {
      res.status(200);
      if (user) {
        res.json({ message: "EMAIL_ALREADY_EXISTS" });
      } else {
        res.json({ message: "EMAIL_AVAILABLE" });
      }
    })
    .catch((err) => {
      console.log(err.message);
      res.status(500).json({ message: "EAMIL_CHECKING_FAILED" });
    });
};

checkEmailExistence controller๋ฅผ ๊ฐ„๋‹จํ•˜๊ฒŒ ์„ค๋ช…ํ•˜๋ฉด ํšŒ์›๊ฐ€์ž… ๊ณผ์ •์—์„œ ์ด๋ฉ”์ผ์ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ด๋ฉ”์ผ์ธ์ง€ ์กฐํšŒํ•˜๋Š” ๋กœ์ง์„ ๊ตฌํ˜„ํ•œ ์ฝ”๋“œ์ด๋‹ค.

model ๊ฐ์ฒด๋ฅผ ํ†ตํ•ด ํด๋ผ์ด์–ธํŠธ์—์„œ ์š”์ฒญ์œผ๋กœ ๋ฐ›์€ email ๊ฐ’์ด user table์— ์กด์žฌํ•˜๋Š”์ง€ ํ™•์ธํ•œ๋‹ค.
โ†’ ํ˜„์žฌ๋Š” database๋ฅผ ORM์„ ํ†ตํ•ด CRUD๋ฅผ ํ•˜๊ธฐ ์œ„ํ•ด sequelize์™€ ์—ฐ๋™์„ ํ•œ ์ƒํƒœ
๐Ÿ’ก ๊ทธ๋ฆฌ๊ณ  ๊ฐœ์ธ์ ์ธ ๋ฐ”๋žŒ์œผ๋กœ ์ตœ๋Œ€ํ•œ **REST full api**๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์„ ๋ชฉํ‘œ๋กœ ๊ฐ€์ง€๊ณ  ์žˆ์–ด ์ƒํƒœ ์ฝ”๋“œ๋‚˜ return message ๋“ฑ์„ ์ ๊ทน์ ์œผ๋กœ ํ™œ์šฉํ•  ์˜ˆ์ •์ด๋‹ค.


๋งˆ์ง€๋ง‰์œผ๋กœ ์ข…ํ•ฉํ•˜๋ฉด
  • Router: ๋ง ๊ทธ๋Œ€๋กœ ํŠน์ • ๊ฒฝ๋กœ๋กœ ๋“ค์–ด์˜จ ์š”์ฒญ์„ controller๋กœ routing์„ ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ
  • Controller: ๋ผ์šฐํŒ…์„ ํ†ตํ•ด ๋ฐ›์€ request๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ํ•ต์‹ฌ ๋กœ์ง์„ ๊ตฌํ˜„ํ•˜๋Š” ์ฝ”๋“œ์„ ์˜๋ฏธ
    • ๊ธฐ๋ณธ์ ์œผ๋กœ model ๊ณผ view ์™€ ๋ถ„๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด controller ๋ชจ๋“ˆ?์„ ์‚ฌ์šฉ

Reference

Express routing

[EXPRESS] ๐Ÿ“š ๋ผ์šฐํ„ฐ (Router) ๊ฐœ๋… ์ •๋ฆฌ

express ๋ผ์šฐํ„ฐ, ๋ชจ๋“ˆ๋กœ ๋ถ„๋ฆฌํ•˜๊ธฐ

profile
๋„์ ๋„์ 

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

comment-user-thumbnail
2023๋…„ 8์›” 10์ผ

์ข‹์€ ๊ธ€์ด๋„ค์š”. ๊ณต์œ ํ•ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

๋‹ต๊ธ€ ๋‹ฌ๊ธฐ

๊ด€๋ จ ์ฑ„์šฉ ์ •๋ณด