개발 노트

nodejs 게시판 본문

nodejs

nodejs 게시판

Meter216 2022. 12. 20. 20:45

게시판 요청 응답

server 는 복잡해지면 좋지 않다. 

server.js에서 쓰는 코드들을 폴더를 분할해서 기능별로 나눌 수 있게되면 

깔끔해지고 좋다. 기본적으로.

router

controller

repository

service

views 

로 간단하게 나눌 수 있다.


SERVER

 

const express = require("express");
const nunjucks = require("nunjucks");
const router = require("./routes/index");
const app = express();

app.set("view engine", "html");
nunjucks.configure("views", { express: app });

app.use(express.static("public"));
app.use(express.urlencoded({ extended: false }));

app.use(router);

app.listen(3000, () => {
    console.log("server start");
});

작업 단위로 나눠서 보관을 하는것이 좋다.

server에선 간단히 기본설정, 변하지 않을 설정만 해두는 것이 좋다. 협업을 할 때 변경하지 않는 것이 좋다.


 

ROUTER
const express = require("express");
const route = express.Router();

module.exports = route;

기본적으로 이 3문장을 한번에 써놓고 시작을 하는것이 좋다.

route.get 은 app.get 처럼 실행시키는 동작이 아니다.

route 에 스택을 쌓는 개념이다. 스택을 쌓고 나중에 실행을 시켰을 때 알맞는 값을 골라내서 실행을 하게 된다.

 

router 작업 하는 곳

단순하게 모든 route를 적어두는 곳이다.

const express = require("express");
const route = express.Router();
const controller = require("../controllers/controllers");

route.get("/", controller.getmain);
route.get("/list", controller.getlist);
route.get("/write", controller.getwrite);
route.post("/write", controller.postwrite);
route.get("/view", controller.getview);
route.get("/modify", controller.getmodify);
route.post("/modify", controller.postmodify);

module.exports = route;

 

CONTROLLER

 

const list = [{ title: "subject", writer: "whoRU", content: "content" }];

exports.getmain = (req, res) => {
    res.render("index.html");
};

exports.getlist = (req, res) => {
    res.render("board/list.html", { list });
};

exports.getmodify = async (req, res) => {
    const idx = req.query.index;
    const [list] = await service.getview(idx);
    res.render(`board/modify`, { list });
};

exports.postmodify = async (req, res) => {
    const modifyvalue = req.body;
    const idx = modifyvalue.idx;
    await service.update(modifyvalue);
    res.redirect(`view?index=${idx}`);
};

router 에서 설정해놓은 path에 맞는 콜백 함수를 작업해주는 곳이라고 보면 된다.

콜백 함수를 따로 작업해서 

라우터 = path에 따른 값을 호출하는 곳

controller = 콜백 함수 기능을 만들어주는 곳 이라고 생각하면 편하다. 


SERVICE

const repository = require("../repository/board.repository");

exports.getList = async () => {
    const result = await repository.findAll(); // [{}{}{}]
    return result;
};

exports.getview = async (index) => {
    const idx = await repository.findOne(index);
    return idx;
};

말 그대로 서비스를 해주는 곳이다. 

REPOSITORY 에서 데이터를 받고, 한 번 더 가공을 해주는 곳이라고 보면 될 것 같다.


REPOSITORT
const pool = require("./db.js");

exports.findAll = async () => {
    const [result, field] = await pool.query(`SELECT * FROM board;`);
    return result;
};

exports.insert = async (write) => {
    const [ins] = await pool.query(`INSERT INTO board(subject, writer, content) value("${write.subject}", "${write.writer}", "${write.content}")`);
    const idx = ins.insertId;
    return idx;
};

exports.findOne = async (idx) => {
    const [sql, field] = await pool.query(`SELECT * FROM board WHERE idx=${idx}`);
    return sql;
};

MYSQL 와 통신을 하고 통신을 통해 값을 입력하고, 리턴값을 받는 것이 필요하다.

응답을 받고 나서 입력을 해야 하기 때문에 비동기 통신으로 콜백함수가 필요하다. 하지만 콜백 함수를 통해 이를 이루게 되면 코드가 더 없이 난잡해지고 복잡해진다. 때문에 PROMISE를 사용함으로 이를 줄일 수 있는데  다시 async/await 을 이용해 줄일 수 있다.

async 는 await를 쓰기 위한 초석으로 볼 수 있다. await은 값을 받아 오기 전까지 다음 실행을 멈춰주는 것이라 이해를 하면 좋다.


정리

 

콜백 함수들을 모아놓은 controller의 값을 router 에서 받아 서버로 넘겨주는 행위를 한다. 여기서 각각의 콜백 함수들은 다시 service에서 정리된 데이터 값을 받아오는 형식이고, service에 데이터 값을 주는 곳은 repository이다 

repository는 DB에서 데이터를 입력하고 리턴값을 받아오거나 한다.

'nodejs' 카테고리의 다른 글

AJAX  (0) 2023.01.16
Paging  (0) 2023.01.02
Express  (1) 2022.12.14
http tcp 미완.2  (0) 2022.12.09
nodejs [3way handshake]  (0) 2022.12.07