Notice
Recent Posts
Recent Comments
Link
«   2024/07   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

개발공부일지

NodeJS - Database - connection pool 활용해서 게시판 만들기 (작업중) 본문

NodeJS

NodeJS - Database - connection pool 활용해서 게시판 만들기 (작업중)

보람- 2023. 9. 20. 18:48

목차

1. 기초설정하기

2. LIST페이지 구현하기


 

 

 

1. 기초설정하기

npm init -y

npm install express nunjucks mysql2

- express, nunjucks,mysql2 설치하기

 

 

create database block10;
use block10;

CREATE TABLE boards(
    id INT AUTO_INCREMENT,
    title VARCHAR(200) NOT NULL,
    content TEXT,
    writer VARCHAR(20) NOT NULL,
    created_at DATETIME DEFAULT NOW(),
    hit INT DEFAULT 0,
    PRIMARY KEY(id)
);

show tables;
desc boards;

SHOW STATUS LIKE 'Threads_connected';

- database block10 생성하기

 

 

const express = require("express");
const app = express();
const nunjucks = require("nunjucks");

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

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

- server.js 실행해보기

 

 

/
| - /node_moduels
| - /src
| --- /board
| ------- /board.controller.js
| ------- /board.entity.js
| ------- /board.repository.js
| ------- /board.route.js
| ------- /board.service.js
| --- index.js
| - /views
|-----/board
|--------/list.html
|--------/view.html
| - package.json
| - package-lock.json
| - promisePool.js
| - server.js

- 디렉토리 만들기

 

 

 

 

2. LIST, VIEW 페이지 구현하기

// board.repository.js


const pool = require("../../promisePool");

// console.log(pool);

exports.findAll = async () => {
    try {
        const sql = "select * from boards";
        const [result] = await pool.query(sql);
        return result;
    } catch (e) {
        throw new Error(`DB 오류 ${e.message}`);
    }
};

exports.findOne = async (id) => {
    try {
        const sql = `select * from boards where id=${id}`;
        const [result] = await pool.query(sql);
        // console.log(result);
        return result;
    } catch (e) {
        throw new Error(`오류 ${e.message}`);
    }
};
// board.service.js

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

exports.getFindAll = async () => {
    try {
        // throw new Error("Service : 인자값 잘못 전달됨!");
        const result = await boardRepository.findAll();
        return result;
    } catch (e) {
        throw new Error(e.message);
    }
};

exports.getFindOne = async (id) => {
    try {
        const result = boardRepository.findOne(id);
        //  console.log(result);
        return result;
    } catch (e) {
        throw new Error(e.message);
    }
};
// board.controller.js

const boardService = require("./board.service");

exports.getList = async (req, res, next) => {
    try {
        const result = await boardService.getFindAll();
        res.render("board/list.html", {
            list: result,
        });
    } catch (e) {
        // res.status(400).send('error')
        next(e);
    }
};

exports.getView = async (req, res, next) => {
    try {
        const { id } = req.query;
        //  console.log(id);
        const [result] = await boardService.getFindOne(id);
        //  console.log(result);
        res.render("board/view.html", { ...result });
    } catch (e) {
        next(e);
    }
};
// board.route.js

const express = require("express");
const router = express.Router();
const controller = require("./board.controller");

router.get("/list", controller.getList);
router.get("/view", controller.getView);

module.exports = router;
// src --- index.js


const express = require("express");
const router = express.Router();
const boardRouter = require("./board/board.route");

router.use("/boards", boardRouter);

module.exports = router;
<!-- list.html -->

<body>
        <table>
            <tr>
                <th>번호</th>
                <th>제목</th>
                <th>작성자</th>
                <th>작성일</th>
                <th>조회수</th>
            </tr>
            {% for data in list %}
            <tr>
                <td>{{data.id}}</td>
                <td>
                    <a href="/boards/view?id={{data.id}}">{{data.title}}</a>
                </td>
                <td>{{data.writer}}</td>
                <td>{{data.created_at}}</td>
                <td>{{data.hit}}</td>
            </tr>
            {% endfor %}
        </table>
        <a href="/boards/write">글쓰기</a>
    </body>
<!-- view.html -->

<body>
        <h2>VIEW</h2>
        <ul>
            <li>제목 : {{title}}</li>
            <li>작성자 : {{writer}}</li>
            <li>작성일 : {{created_at}}</li>
            <li>조회수 : {{hit}}</li>
            <li>내용 : {{content}}</li>
        </ul>
        <a href="/boards/list">목록가기</a>
        <a href="/boards/modify?id={{id}}">수정하기</a>
        <form action="/boards/delete?id={id}" method="post">
            <button type="submit">삭제하기</button>
        </form>
    </body>
// server.js

app.use((err, req, res, next) => {
    res.status(400).json({ error: err.message });
});
INSERT INTO boards(title,content,writer) values('추가','띄어쓰기없이보내기','보람');

 

나중에 css작업추가하기!!

 

 

 

 

 


※ server.js에 추가해준내용

app.use((err, req, res, next) => {
    res.status(400).json({ error: err.message });
});

- 매개변수 4개로 next를 적으면 controller에서 next(e) 만날경우 실행되는 콜백함수로 json 형식으로 에러메세지를 알려줄수있게된다! 에러가 난다고해서 서버가 종료되어선 안되기 때문에 try, catch 문을 사용하여 throw로 에러를 찾아야하고, 에러 또한 응답이기 때문에 예외처리에 신경써야한다!!!