본문 바로가기
Projects/NodeBoard

테이블 생성과 게시판별 조회 기능

by DawIT 2021. 2. 23.
320x100

먼저 글 정보를 담기 위한 POST 테이블을 만들 것이다.

 

POST테이블의 칼럼은 다음과 같이 생각하고 있다.

 

  • ID : 글을 구별하기 위한 ID 값
  • TITLE : 글 제목
  • AUTHOR : 글쓴이
  • TYPE : 게시판 종류
  • CONTENT : 글 내용
  • VIEWS : 조회수
  • PASSWORD : 익명으로 글 작성시 글 삭제를 위한 비밀번호(추후 적용 예정)
  • isLogined : 익명으로 쓰인 글인지, 로그인하고 쓰인 글인지 bool 타입
  • THUMBUP : 추천수

다음은 해당 테이블을 생성하기 위한 쿼리이다.

 

CREATE TABLE `POST` (
  `ID` INT NOT NULL AUTO_INCREMENT,
  `TITLE` VARCHAR(45) NOT NULL,
  `AUTHOR` VARCHAR(45) NOT NULL,
  `CONTENT` TEXT(65535) NOT NULL,
  `VIEWS` INT NOT NULL DEFAULT 0,
  `PASSWORD` VARCHAR(30) NOT NULL DEFAULT '1234',
  `isLogined` TINYINT NOT NULL DEFAULT 0,
  `THUMBUP` INT NOT NULL DEFAULT 0,
  PRIMARY KEY (`ID`));
  
  까먹고 추가 안한 게시판 종류 나중에 추가
ADD COLUMN `TYPE` VARCHAR(20) NOT NULL AFTER `AUTHOR`;

 

일단 PASSWORD는 지금 고려하긴 너무 이른거 같아서 Default값으로 1234를 주었다.

 

테이블 생성 후 테스트 글 1개만 쿼리로 직접 작성

 

INSERT INTO `nodeboard`.`POST` (`TITLE`, `AUTHOR`, `TYPE`, `CONTENT`) VALUES ('테스트 글', 'jdw', 'free', '테스트 글입니다');

 

이후 db-query.js 를 만들어서 쿼리에서 데이터를 가져오는 함수를 정의한다.

 

var db = require('./db-connect')

var getList = function(amount,type,page,callback){
    db.query('SELECT * FROM POST',function(err,result){
        if (err)
            console.log('에러 발생 : ' + err);
        else
            callback(result);
    });
}

module.exports = getList;

 

인자로 amount(한번에 가져올 글 개수) , type(게시판 종류), page(페이지 넘버)를 받고 (지금은 테스트중이므로 직접 사용은 하지 않는다) 쿼리를 통해 DB에서 글을 가져오고 result에 담아서 콜백으로 넘긴다.

 

router.get('/list', function(req,res,next){
  let {type,page} = req.query;
  getList(20,type,page,(response)=>{
    res.render('list-all',{postData : response});
  });
});

 

그러면 list.js에서는 그 값을 받아서 list-all.ejs 파일로 postData라는 변수명으로 넘겨준다.

 

 

list-all.ejs에서는 테이블을 만들 때 가져온 정보를 바탕으로 for 문을 돌면서 row를 생성한다.

 

이렇게 작성하고 저장한 뒤 들어가보면,

 

 

이런 식으로 작성한 테스트 글이 잘 출력된다.

 

 

글을 몇개 더 추가해도 잘 가져와준다.

 

그러나 문제가 있다면 ID를 역순으로 배치해야 하는데 순서대로 배치하고 있다는 점이다.

 

이는 쿼리에 ORDER BY DESC를 추가함으로써 해결할 수 있다.

 

그리고 전체글보기와 특정 게시판 글만 모아볼 수 있도록 해야 하므로 db-query 파일을 대폭 수정하였다.

 

const e = require('express');
var db = require('./db-connect')

var getList = function(amount,type,page,callback){
    // 전체 글 조회
    if (type===undefined){
        db.query('SELECT COUNT(*) AS COUNT FROM POST',function(err,count){
            if (err)
                print('에러 발생 : ' + err);
            else{
                count = count[0].COUNT;
                var maxPage = Math.ceil(count / amount);

                db.query('SELECT * FROM POST ORDER BY ID DESC LIMIT ?, ?',[(page-1)*amount,amount],function(err,result){
                    if (err)
                        console.log('에러 발생 : ' + err);
                    else
                        callback(result,maxPage);
                });
            }
        });
    // 특정 게시판 글 조회
    } else {
        db.query('SELECT COUNT(*) AS COUNT FROM POST WHERE TYPE=?',[type],function(err,count){
            if (err)
                print('에러 발생 : ' + err);
            else{
                count = count[0].COUNT;
                var maxPage = Math.ceil(count / amount);

                db.query('SELECT * FROM POST WHERE TYPE=? ORDER BY ID DESC LIMIT ?, ?',[type,(page-1)*amount,amount],function(err,result){
                    if (err)
                        console.log('에러 발생 : ' + err);
                    else
                        callback(result,maxPage);
                });
            }
        });
    }
}

module.exports = getList;

 

전체 글 조회와 특정 게시판 글 조회는 쿼리문에서 WHERE가 들어가냐 마냐 차이밖에 없다.

 

일단 maxPage는 해당 게시판(혹은 전체글)의 글 개수에 따라서 최대 페이지를 구한다. 최대 페이지는 올림을 통해 쉽게 구할 수 있다. 그리고 이 값은 콜백함수로 마지막에 전달되고 최종적으로 list-all.ejs 까지 전달된다.

 

페이징 같은 경우는 page-1 에 amount(페이지당 글 수)를 곱한 곳부터 amount만큼만 가져와서 출력해주면 된다.

 

router.get('/list', function(req,res,next){
  let {type,page} = req.query;
  if (page===undefined)
    page = 1;
  getList(20,type,page,(response,maxPage)=>{
    if (type===undefined)
      type = '전체글 보기';
    res.render('list',{postData : response,type : type,maxPage : maxPage});
  });
});

 

list.js에서 달라진게 있다면 콜백함수의 인자가 하나 더 늘어났고(최대 페이지 변수), 해당 값을 list-all.ejs파일로 넘겨준다. 또한 어떤 종류의 게시판을 조회할껀지 나타내는 type도 넘겨주었다.

 

아, 그리고 list-all.ejs의 파일명을 list.ejs로 변경하였다.

 

list.ejs

 

list.ejs 상단 제목 부분에 type을 넣어준다.

 

이렇게 작성하고 글을 몇개 더 작성(쿼리를 통해 삽입)하여 조회해 보았다.

 

DB

 

DB에 대충 이런 값들이 있을때

 

type값을 주지 않았을 경우
type=자유게시판
type=유머게시판

 

댓글