기존에 작성해둔 routes/article.js 라우터 파일에 ORM db 모듈을 참조하고 테스트용 데이터로 작성해둔 Data를 모두 Sequelize ORM 메소드로 변경하여 DB프로그래밍을 마무리하겠습니다.
관련 실습 깃허브 링크 정보 : https://github.com/eddykang1074/node-express-app.git
-먼저 DB프로그래밍이 필요한 routes/article.js 모듈을 오픈하고 상단에 ORM db객체를 참조합니다.
-DB 프로그래밍은 비동기 방식으로 처리하는것이 효율적이므로 모든 라우팅 메소드의 콜백함수를 비동기 콜백함수 형태로 변경합니다.
-하기 라우팅 메소드들의 임시 DB처리 기능코드를 ORM 관련 메소드로 대체 처리하여 실제 DB를 기반으로 데이터가 연동되게 처리합니다.
- routes/article.js
//express 패키지를 참조합니다.
var express = require('express');
//express객체의 Router()메소드를 호출하여 사용자 요청과 응답을 처리하는 서버측 router 객체를 생성합니다.
//일반적으로 서버측 각각의 라우팅 모듈은 추후 app.js내에서 기본 URL주소체계를 정의하게 되며
//article.js 라우팅 모듈의 기본주소 체계로 http://localhost:3000/article 를 사용할 예정입니다.
var router = express.Router();
//ORM db객체 참조하기
var db = require('../models/index');
1) 게시글 목록 조회하기
- 해당 테이블의 모든 데이터 조회하기 ORM 메소드 : await db.모델명.findAll()
/*
- 게시글 목록 웹 페이지 요청과 응답 처리 라우팅 메소드
-요청주소 : http://localhost:3000/article/list
-요청방식 : GET 방식
-응답결과 : article/list.ejs 뷰파일 웹페이지 내용
*/
router.get('/list', async(req, res, next) => {
//DB article 테이블에서 모든 데이터 목록을 조회해온다.
const articles = await db.Article.findAll();
//게시글 목록 뷰파일을 반환합니다.
res.render('article/list.ejs',{articles:articles});
});
2) 게시글 신규 데이터 등록처리하기
- 해당 테이블 신규 데이터 등록처리 ORM 메소드 : await db.모델명.create(json데이터)
/*
- 게시글 입력 정보 등록 처리 요청과 응답 처리 라우팅 메소드
-요청주소 : http://localhost:3000/article/create
-요청방식 : POST 방식
-응답결과 : http://localhost:3000/article/list 페이지로 이동처리(도메인주소생략)
*/
router.post('/create', async(req, res, next)=> {
//Step1: 게시글 등록 데이터 추출하기
const title = req.body.title;
const content = req.body.content;
const display_yn = req.body.display_yn;
const regist_user_name = req.body.regist_user_name
//Step2: DB 신규 등록 단일게시글 정보 준비하기
const article ={
title: title,
content, //속성명과 변수명이 동일하면 변수명 생략가능(ES6문법)
view_cnt:0,
ip_address:req.headers['x-forwarded-for'] || req.connection.remoteAddress,
display_yn:display_yn,
regist_date: Date.now(),
regist_user_name: regist_user_name
};
//Step3: DB 해당 게시글 신규 등록 처리하기
const savedArticle = await db.Article.create(article);
//step4: 등록 완료후 http://localhost:3000/article/list 페이지로 이동처리(도메인주소생략)
res.redirect("/article/list");
});
3) 단일 게시글 정보 조회하기
- 해당 테이블 단일 데이터 조회 ORM 메소드 : await db.모델명.findOne({where:{속성명:비교데이터}})
/*
- 게시글 정보 확인/수정 웹 페이지 요청과 응답 처리 라우팅 메소드
-요청주소 : http://localhost:3000/article/modify/1
-요청방식 : GET 방식
-응답결과 : article/modify.ejs 뷰파일 웹페이지 내용
*/
router.get('/modify/:aid', async(req, res, next) =>{
//Step1:게시글 고유번호 추출하기(파라메터방식의 경우 와일드카드 키값을 통해 추출가능)
const articleId = req.params.aid;
//Step2: DB에서 해당 게시글 정보 조회해오기
const article = await db.Article.findOne({where:{aid:articleId}});
//step3:modify.ejs 뷰파일에 단일 게시글 정보를 json 형식으로 전달하기
res.render('article/modify',{article:article});
});
4) 단일 게시글 정보 수정하기
- 해당 테이블 데이터 수정처리 ORM 메소드 : await db.모델명.update(수정데이터,{where:{조건속성명:비교데이터값}});
/*
- 게시글 수정 처리 요청 및 응답 처리 라우팅 메소드
-요청주소 : http://localhost:3000/article/modify
-요청방식 : POST 방식
-응답결과 : http://localhost:3000/article/list 페이지로 이동처리(도메인주소생략)
*/
router.post('/modify/:aid', async(req, res, next) =>{
//Step1:게시글 고유번호 추출하기(파라메터방식의 경우 와일드카드 키값을 통해 추출가능)
const articleId = req.params.aid;
//Step1: 게시글 수정데이터 추출하기
const title = req.body.title;
const content = req.body.content;
const display_yn = req.body.display_yn;
const modify_user_name = req.body.modify_user_name;
//Step2: DB 수정 단일게시글 정보 준비하기
const article ={
title: title,
content, //속성명과 변수명이 동일하면 변수명 생략가능(ES6문법)
display_yn,
ip_address:req.headers['x-forwarded-for'] || req.connection.remoteAddress,
moidify_date: Date.now(),
modify_user_name: modify_user_name
};
//Step3: DB 해당 게시글 수정 처리하기
await db.Article.update(article,{where:{aid:articleId}});
//step4: 수정완료후 http://localhost:3000/article/list 페이지로 이동처리(도메인주소생략)
res.redirect("/article/list");
});
5) 단일 게시글 삭제하기
- 해당 테이블 데이터 삭제처리 ORM 메소드 : await db.모델명.destroy({where:{조건속성명:비교데이터값}});
/*
- 게시글 삭제 처리 요청 및 응답처리 라우팅 메소드
-요청주소 : http://localhost:3000/article/remove?aid=1
-요청방식 : Get 방식
-응답결과 : http://localhost:3000/article/list 페이지로 이동처리(도메인주소생략)
*/
router.get('/remove', async(req, res, next) => {
//step1: 게시글 고유번호 추출하기
//QueryString방식으로 전달된 게시글 고유번호 추출하기
const articleId = req.query.aid;
//step2: DB에서 해당 게시글 정보 삭제처리하기
await db.Article.destroy({where:{aid:articleId}});
//step3: 삭제완료후 http://localhost:3000/article/list 페이지로 이동처리(도메인주소생략)
res.redirect("/article/list");
});
6) ORM 환경에서 SQL 쿼리 직접 작성 사용하기
-ORM 기반 직접 개발자가 SQL구문을 작성하고 해당 SQL구문을 DB서버에 전달해 SQL을 실행하는 방법을 안내해드립니다.
- 라우터 파일 상단에서 sequelize 객체와 QueryTypes객체를 추가로 참조합니다.
var express = require('express');
var router = express.Router();
var db = require('../models/index');
var Op = db.Sequelize.Op;
var sequelize = db.sequelize;
const { QueryTypes } = sequelize;
-사용 예시로 게시글 목록 조회 라우팅 메소드를 SQL쿼리를 이용해 조회하는 예시를 아래와 같이 제공합니다.
router.get('/list',async(req,res)=>{
var sqlQuery = `SELECT * FROM article WHERE display_yn = 1 ORDER BY aid DESC;`;
var articles = await sequelize.query(sqlQuery,{
raw: true,
type: QueryTypes.SELECT,
});
res.render('article/list.ejs',{articles:articles });
});