sequelize라는 ORM을 사용해서 mysql을 연동하는 방법입니다.

프로젝트 생성

express sequelize-study
cd sequelize-study
npm i 

sequelize 설치

npm i sequelize mysql2

sequelize명령어를 사용하기 위해 글로벌로도 설치해줍니다.

sudo npm i -g sequelize-cli

초기화를 해줍니다.

sequelize init

그러면 아래와 같이 폴더가 생성됩니다.

image

mysql 설치

mysql 홈페이지에서 해당 OS에 맞는 mysql을 설치합니다. 저는 버전은 5.7.29로 설치하였습니다.

image

mysql을 클릭으로 쉽게 다룰 수 있게 도와주는 workbench도 다운로드하겠습니다. 사이트

  • Mysql 초기비밀번호는 복사해두기

  • workbench실행시키기 전에 mysql 서버 실행시키기

    image

sequelize 설정

config.json 수정

Config.json에는 데이터베이스 설정과 비밀번호를 정의할 수 있는 설정파일입니다.

{
  "development": {
    "username": "root",
    "password": null, // 비말번호 
    "database": "nodebird", // db이름 
    "host": "127.0.0.1",
    "dialect": "mysql",
    "operatorsAliases": false
  }
  ...생략

DB 생성하기

아래 명령어를 통해서 config.json에 설정된 db를 만들 수 있습니다.

$ sequelize db:create

Sequelize CLI [Node: 11.15.0, CLI: 5.5.1, ORM: 5.21.5]

Loaded configuration file "config/config.json".
Using environment "development".
(node:56911) [SEQUELIZE0004] DeprecationWarning: A boolean value was passed to options.operatorsAliases. This is a no-op with v5 and should be removed.
Database nodebird created.

nodemon 설치

서버를 실행시키기 위해서는 원래 ctrl+c를 눌러서 종료시킨 후에 다시 실행시켰는데, 서버 코드가 수정될 때마다 감지해서 서버를 다시 실행시켜주는 생상성을 높혀주는 모듈입니다.

npm i -D nodemon

express에 필요한 모듈 설치

npm i express cookie-parser express-session morgan connect-flash pug

body-parser는 이제 express에서 내부적으로 지원해주기 때문에 더이상 사용할 필요가 없습니다.

서버 코드 작성

이번에는 express-generator를 사용하지 않고 직접 코드를 작성해보겠습니다.

app.js를 만들어줍니다.

  • 설치한 모듈 불러오기
  • view-enginepug설정
  • port설정
  • morgan사용 (사용자 요청 로그 확인용)
  • static파일(css,js)에 대한 응답 미들웨어
  • Body-parser대신에 사용할 코드
  • cookie파싱용 미들웨어 사용
  • session사용
  • flash사용
  • 서버 listen
const express = require("express");
const cookieParser = require("cookie-parser");
const morgan = require("morgan");
const require = require("path");
const session = require("express-session");
const flash = require("flash");

const app = express();

// view engine
app.set("view-engine", "pug");
app.set("views", path.join(__dirname, "views"));

// port
app.set("port", process.env.PORT || 8001);

// middleware
app.use(morgan("dev"));
app.use(express.static(path.join(__dirname, "public")));
app.use(express.json());
app.use(express.urlencoded({ extend: false }));
app.use(cookieParser("nodebirdsecret"));
app.use(
  session({
    resave: false,
    saveUninitialized: false,
    secret: "nodebirdsecret",
    cooki: {
      httpOnly: true,
      secure: false
    }
  })
);
app.use(flash());

app.listen(app.get("port"), () => {
  console.log(`${app.get("port")}번 포트에서 서버 실행중입니다.`);
});

static파일들이 들어있을 public과 pug파일이 들어갈 views폴더를 루트 디렉토리에 만들어줍니다.

dotenv 모듈

서버에서 사용하는 중요한 정보들을 dotenv모듈을 통해서 관리할 수 있습니다.

설치

npm i dotenv

사용

.env

COOKIE_SECRET=nodebirdsecret
PORT=8001

app.js

require("dotenv").config();

// port
app.set("port", process.env.PORT || 8001);

app.use(cookieParser(process.env.COOKIE_SECRET));
app.use(
  session({
    resave: false,
    saveUninitialized: false,
    secret: process.env.COOKIE_SECRET,
    cooki: {
      httpOnly: true,
      secure: false
    }
  })
);

router 설정

routes폴더 안에 원하는 라우터 파일을 만들어줍니다.

**라우터 기본 구조 **

const express = require("express");
const router = express.Router();

module.exports = router;

routes/page.js로 라우터를 만들겠습니다. page는 서비스의 페이지들을 모아놓는 곳입니다.

const express = require("express");
const router = express.Router();

// 프로필 페이지
router.get("/profile", (req, res, next) => {
  res.render("profile", { title: "내 정보 | nodebird", user: null });
});

// 회원가입 페이지
router.get("/join", (req, res, next) => {
  res.render("join", {
    title: "회원가입 | nodebird",
    user: null,
    joinError: req.flash("joinError")
  });
});

// 메인 페이지
router.get("/", (req, res, next) => {
  res.render("main", {
    title: "nodebird",
    twits: []
  });
});
module.exports = router;

app.js에서 불러와 사용합니다. 404,500에 대한 에러처리도 함께 해줍니다.

const indexRouter = require("./routes/page");
app.use("/", indexRouter);

// 404 not found
app.use((req, res, next) => {
  const err = new Error("not Found");
  err.status = 404;
  next(err);
});

// 500 error
app.use((err, req, res) => {
  res.locals.message = err.message;
  res.locals.error = req.app.get("env") === "development" ? err : {};
  res.status(err.status || 500);
  res.render("error");
});