기존에 작성해둔 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 });
});