Project/Fourth

[Fourth] 서버 초기 설정

디스페어 2022. 12. 23.
npm init

node.js로 프로젝트를 시작할 때 쓰면 유용한 명령어

 

 

 

index.js

const express = require("express");
const app = express();
const fs = require("fs");
const https = require("https");
const cors = require("cors");
const passport = require("passport");
const session = require("express-session");
const cookieParser = require("cookie-parser");
require("dotenv").config();
dbConfig = require("./config/database.js");
const conn = dbConfig.init();
dbConfig.connect(conn);

// passportConfig();

app.use(express.json());
app.use(express.urlencoded({ extended: false }));

app.use(
  cors({
    origin: ["https://localhost:3000", "http://localhost:3000"],
    credentials: true,
    methods: ["GET", "POST", "OPTIONS", "PATCH", "DELETE"],
  })
);

app.use(cookieParser(process.env.COOKIE_SECRET));
app.use(
  session({
    saveUninitialized: false,
    resave: false,
    secret: process.env.COOKIE_SECRET,
    cookie: {
      httpOnly: true,
      secure: false,
      maxAge: 1000 * 60 * 60 * 24 * 7,
    },
  })
);

app.use(passport.initialize());
app.use(passport.session());

app.get("/", function (req, res) {
  res.send("안녕 세계!");
});

const HTTPS_PORT = process.env.SERVER_PORT || 8080;

let server;

if (fs.existsSync("./key.pem") && fs.existsSync("./cert.pem")) {
  const privateKey = fs.readFileSync(__dirname + "/key.pem", "utf8");
  const certificate = fs.readFileSync(__dirname + "/cert.pem", "utf8");
  const credentials = { key: privateKey, cert: certificate };

  server = https.createServer(credentials, app);
  server.listen(HTTPS_PORT, () => console.log("https server runnning"));
} else {
  server = app.listen(HTTPS_PORT, () => console.log("http server runnning"));
}
module.exports = server;

기본적인 서버 파일을 index.js로 세팅했다

소셜로그인의 경우 passport를 이용해 구현할 예정이라 express와 passport 모듈을 설치해주고,

그 외 필요한 모듈들을 import 해줬다

 

여기서 중요한건 passport가 express에 실려서 전송되는 구조라 express 위에 passport를 선언하면 안된다!

코드 작성의 순서도 매우 중요하다

 

아마존으로 배포할 경우 서버포트를 아무렇게나 해도 상관 없으나,

구글로 배포할 땐 서버의 포트가 8080 디폴트로 잡혀있어서 설정해줬다

디폴트값 수정하기 귀찮음

 

let server 아래 코드들의 경우 https로 배포할 예정이라 사전 테스트를 위해 작성했다

인증파일이 존재한다면 https, 인증파일이 없다면 http로 자동 설정 된다.

 

어디까지나 초기설정이므로 추후 변동될 수 있음

 

 

 

config/config.js

const dotenv = require('dotenv')
dotenv.config()

module.exports = {
  development: {
    username: process.env.DATABASE_USERNAME,
    password: process.env.DATABASE_PASSWORD,
    database: process.env.DATABASE_NAME,
    host: process.env.DATABASE_HOST,
    port: process.env.MYSQL_DEFAULT_PORT,
    dialect: 'mysql',
  },
  test: {
    username: process.env.DATABASE_USERNAME,
    password: process.env.DATABASE_PASSWORD,
    database: process.env.DATABASE_NAME,
    host: process.env.DATABASE_HOST,
    port: process.env.MYSQL_DEFAULT_PORT,
    dialect: 'mysql',
  },
  production: {
    username: process.env.DATABASE_USERNAME,
    password: process.env.DATABASE_PASSWORD,
    database: process.env.DATABASE_NAME,
    host: process.env.DATABASE_HOST,
    port: process.env.MYSQL_DEFAULT_PORT,
    dialect: 'mysql',
  },
};
npx sequelize init

자바스크립트로 코딩을 한다면 데이터베이스 관련해서 제일 만만한게 시퀄라이즈 인듯

 

위의 명령어를 입력하면 models, migrations, config, seeders 폴더가 생성될텐데

config로 가보면 처음엔 config.json으로 되어 있다

그렇지만 dotenv를 사용할거니까 확장자를 js로 바꿔준 후 코드를 수정해준다

 

 

 

models/index.js

const config = require(__dirname + '/../config/config.js')[env];

마찬가지로 models안에 있는 index.js 코드도 바꿔준다

바꿔주지않으면 당연하게도 시퀄라이즈가 config.js를 인식하지 못한다

 

 

 

config/database.js

const mysql = require("mysql");
const dbInfo = {
  host: process.env.SERVER_HOST,
  port: process.env.MYSQL_DEFAULT_PORT,
  user: process.env.MYSQL_USERNAME,
  password: process.env.MYSQL_PASSWORD,
  database: process.env.DATABASE_NAME,
};

module.exports = {
  init: function () {
    return mysql.createConnection(dbInfo);
  },

  connect: function (conn) {
    conn.connect(function (err) {
      if (err) console.error("데이터베이스 연결 에러 : " + err);
      else console.log("데이터베이스 연결 성공");
    });
  },
};

mySQL로 정상적으로 연결이 되는지 확인을 위한 코드

 

 

 

package.json

  "scripts": {
    "start": "nodemon index.js",
    "resetdb": "npx sequelize db:drop && npx sequelize db:create",
  },

서버를 작동하기 위한 nodemon과 데이터베이스 초기화를 위한 resetdb 명령어

 

DB 초기화 할때마다 mySQL 터미널로 들어가는게 귀찮아서 만들었다

그 외 테이블 및 컬럼생성은 시퀄라이즈를 사용하면 하드코딩이 되버리므로 mySQL 워크벤치를 사용하는게 훨씬 낫다

 

 

 

.env

; 데이터베이스
DATABASE_NAME=""
MYSQL_USERNAME=""
MYSQL_PASSWORD=""
MYSQL_DEFAULT_PORT=""

; 로컬서버
SERVER_HOST=""
SERVER_PORT=""

; Cookie-parser
COOKIE_SECRET=""

본인의 개발환경에 맞게 설정 하자

node.js에선 프로젝트 디렉토리에 .env 파일이 존재하면 환경변수처럼 소스코드로 가져와서 사용할 수 있는데

공개되면 민감한 정보들을 담아두기에 아주 유용하며, 배포환경 세팅할때도 개꿀빨 수 있다

 

 

 

.gitignore

# dependencies
/node_modules
/.pnp
.pnp.js
.env
.env.example2
key.pem
cert.pem

# testing
/coverage

# production
/build

# misc
.DS_Store
.env.local
.env.development.local
.env.test.local
.env.production.local

npm-debug.log*
yarn-debug.log*
yarn-error.log*

깃허브 레포지토리에 올라가면 안되는 친구들을 설정해두면 된다

대표적으로 node_modules와 .env가 있다

 

 

 

데이터베이스 작성

https://dbdiagram.io/

위의 사이트를 이용하면 직관적인 UI로 DB를 만들 수 있으며,

그 후 Export to MySQL을 눌러 sql 파일을 다운로드 하고 mySQL 터미널에서 등록하면 된다

mysql -u -root -p
//mySQL 터미널에 접속
//윈도우의 경우 mySQL 8.0 Command Line Client 터미널 사용

use <databaseName>
//데이터베이스 선택
//databaseName엔 본인의 DB이름을 입력

source <다운로드 받은 sql 파일 경로>

 

 

 

서버 ON!

반응형

댓글