먼저 글 정보를 담기 위한 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 상단 제목 부분에 type을 넣어준다.
이렇게 작성하고 글을 몇개 더 작성(쿼리를 통해 삽입)하여 조회해 보았다.
DB에 대충 이런 값들이 있을때
'Projects > NodeBoard' 카테고리의 다른 글
글 작성 기능 제작 (0) | 2021.02.25 |
---|---|
글 조회 페이지 작성 (0) | 2021.02.24 |
기본적인 라우팅과 MySQL DB 연동 (0) | 2021.02.22 |
메인 페이지 레이아웃 짜기 (0) | 2021.02.21 |
프로젝트 생성과 모듈 설치, github 레포지토리 생성 (0) | 2021.02.20 |
댓글