[Node.js] 웹 게시판 구축하기(3) - backend 코드 리뷰(express, ejs 사용 예제)

Jaden·2024년 2월 14일
0

Web Project

목록 보기
3/4
  • app.js
const express = require('express'); //express 모듈을 require(require은 import와 동일한 개념)
const app = express(); //express의 app 인스턴스(객체의 실체화) 생성

var mysql = require('mysql'); //nodejs와 mysql 연동
var db = mysql.createConnection({
    host : "localhost",
    user: "root", //mysql username
    password: "1234", //mysql password
    database: "dbtheory_task" //db name
});
db.connect(function(err) { //DB연결
    if (err) throw err; 
    console.log('DB connected'); // 연결 성공에 대한 메시지 표시
});

//ejs 사용 설정
app.set('view engine', 'ejs'); //view engine으로써 ejs 사용
app.set('views','./views');//view 파일을 ./views 경로에서 불러옴을 명시

//express의 version이 4.16 이상이면 미들웨어인 body parser를 설치하지 않고 아래의 코드로 사용할 수 있음
app.use(express.json());//json 형태로 데이터를 전달 (body parser)
app.use(express.urlencoded({ extended: true })); //쿼리 스트링 해석 방식으로 false는 querystring library를, true는 qs library를 사용하겠다는 것 (body parser)

//express가 4.16 이하인 경우 위의 코드 두줄 대신 아래와 같이 사용
//const bodyParser = require('body-parser');
//app.use(bodyParser.json());
//app.use(bodyParser.urlencoded({ extended: true })); 



//Routing (1)get: 서버에 읽기 요청 (2)post:서버에 작성 및 생성 요청

//전체 게시글 조회 페이지
app.get('/', function (req, res) {//app은 root URL(/)에 접근할 때 내부의 함수를 실행시킴
  	//pagination을 위한......
 	//한 페이지에 10개의 게시글만을 표시하는 페이지네이션
    var page = parseInt(req.query.page || 1); //req.query.page 값을 정수로 바꿈, 만약 값이 없다면 기본값 1을 사용함
//여기서 req.query.page는 URL의 ?뒤에 위치하는 value값을 의미함 
  //즉, 가장 처음 root URL로 접근하여 page의 value가 기본값일 때 URL은 "http://~?page=1"의 형태가 되고 변수 page의 값은 1임
  
    var sql = 'select * from post order by postID desc'; //게시글(post) 조회 쿼리문(sql문), desc 옵션으로 내림차순 정렬
    db.query(sql, function (err, rows, fields) { //sql문 DB에 질의함(query, 쿼리)
        if(err) console.log('select fail...\n' + err);
        var howmanyposts = rows.length; //DB내 모든 게시글(post)의 개수 (DB 튜플 개수)
        var howmanypages = Math.ceil(howmanyposts / 10); //페이지 수, 한 페이지에 10개의 게시글만 표시되므로 몇개의 페이지가 생성되는지 알아보기 위해 (전체 게시글 수 / 10)
      
        const posts = rows.slice((page - 1) * 10, (page - 1) * 10 + 10); //substring으로 반환하는 함수 slice(startIndex, endIndex), 
      //endIndex == startIndex+10, page의 기본값이 1이므로 -1을 해줌
      
        res.render('mainpage', { list : posts, thispage: page, howmanypages });//서버가 mainpage.ejs를 렌더링하여 클라이언트에게 보내줌
      //res.render("ejs파일", {key1:value1, key2:value2}), 여기서 key는 데이터의 이름이고 value는 데이터 값
    });
});

//게시글 작성 페이지
app.get('/posting', function (req, res) {
    res.render('posting.ejs');
});

//게시글 작성
app.post('/postingL', function (req, res) {
    var body = req.body;
    var params = [body.title, body.author, body.content];
    var sql = 'insert into post(title, author, content, date) values (?, ?, ?, NOW())';
    db.query(sql, params, function(err) {
        if(err) console.log('insert fail\n' + err);
        else res.redirect('/');
    });
});

//게시글 상세페이지
app.get("/post:postID", function (req, res) {
    db.query('select * from post where postID = ?', [req.params.postID], function (error, result1) {
        var post = result1[0];
        db.query('select * from comment where postID = ?', [req.params.postID], function (error, comment) {
            res.render('post.ejs', {post, comment});
        });
    });
});

//게시글 삭제
app.get("/delete:postID", function (req, res) {
    db.query('delete from post where postID = ?', [req.params.postID], function (err) {
        if(err) console.log('delete fail\n' + err);
        res.redirect('/');
    });
});

//댓글 작성
app.post('/commenting:postID', (req, res) => {
    var body = req.body;
    var params = [req.params.postID, body.content ,body.author];
    var sql = 'insert into comment(postID, content, author, date) values (?, ?, ?, NOW())';
    db.query(sql, params, function(err) {
        if(err) console.log('insert fail\n' + err);
        res.redirect('back');
    });
});
 
//댓글 삭제
app.post('/commentdelete:commentID', (req, res) => {
    db.query('delete from comment where commentID = ?', [req.params.commentID], function (err) {
        if(err) console.log('delete fail\n' + err);
        res.redirect('back');
    });
});
  
app.listen(3000); //3000 포트로 지정하여 서버 실행

0개의 댓글