[리팩토링] 1: backend와 Mysql 연동 확인

 

 

아니 그러니까 말이에요

제가, 로컬에서 도커 파일 만들고 깃으로 올려서 aws서버를 jupyter로 접속한 뒤 docker build를 했더니 화면이 멈춘 게 아니에요?

보니까 도커파일에 주석을 제 맘대로 적은 게 원인인 것 같았죠. 일단 build 행위를 멈추기 위해 서버를 재시작한다는 걸 인스턴스 종료를 해버린 게 아니에요? 다시 인스턴스 생성부터 해야겠죠. 그래서 다시 시작했어요. 그러다가 backend 파일을 구동시키려고 보니까 지금 진행하는게 도커를 쓰는 의미를 잃어버렸네요? 결론은. 어떻게 되었냐면요.

 

 

1️⃣ 리팩토링, backend>App.js


현재 파일 구조

~ backend ~

📁 config
- 🗄️ config.js
📁 models
- 🗄️ index.js
- 🗄️🗄️🗄️🗄️🗄️🗄️🗄️ model 파일들 여러개
📁 routes
🔒 env
🗄️ app.js
🗄️ package-lock.json
🗄️ package.json

sequelize 수정하기

require("dotenv").config();
const express= require('express');
const cors = require('cors') //front와 연결
const app =express();

/* connect Mysql */
const db = require("./models");
db.sequelize.sync();

/* connect front */
corsOptions = { 
    origin: "<http://127.0.0.1:3030>" 
}
app.use(cors(corsOptions));

app.get('/', (req, res) => {
    res.send('Hello WITH')
})

const port = 3005
app.listen(port, () => {
    console.log("this server on 3005");
})
  • db 연결을 위한 sequelize 사용
  • cors를 통한 frontend 포트와의 연결

2️⃣ 리팩토링, db(sequelize)연결


  • env파일을 통해 배포 이전에 데이터베이스 정보 과정을 거침
    • 기존의 config.json파일을 config.js로 바꿈
    • 파일 형식이 달라짐
    • 이에 따라 models> index.js의 파일의 코드도 바뀜

📁backend>.env

MYSQL_USERNAME=
MYSQL_PASSWORD=
MYSQL_DATABASE=
MYSQL_HOST=
MYSQL_DIALECT=
MYSQL_PORT=3306

📁 backend>config>config.js

require('dotenv').config();
const env = process.env;

const development = {
    username: env.MYSQL_USERNAME,
    password: env.MYSQL_PASSWORD,
    database: env.MYSQL_DATABASE,
    host: env.MYSQL_HOST,
    dialect: env.MYSQL_DIALECT,
    port: env.MYSQL_PORT
};
const test = {
    username: env.MYSQL_USERNAME,
    password: env.MYSQL_PASSWORD,
    database: env.MYSQL_DATABASE,
    host: env.MYSQL_HOST,
    dialect: env.MYSQL_DIALECT,
    port: env.MYSQL_PORT
};
const production = {
    username: env.MYSQL_USERNAME,
    password: env.MYSQL_PASSWORD,
    database: env.MYSQL_DATABASE,
    host: env.MYSQL_HOST,
    dialect: env.MYSQL_DIALECT,
    port: env.MYSQL_PORT
};

module.exports ={ development, test, production};

📁backend>models>index.js

const env = process.env.NODE_ENV || 'development';
const Sequelize = require('sequelize');
const config = require(__dirname + '/../config/config.js')[env];
const db = {};

const sequelize = new Sequelize(
    config.database, 
    config.username, 
    config.password, 
    config
);

db.User = require('./user')(sequelize, Sequelize);

... 모델 연결 생략 ...

Object.keys(db).forEach(modelName => {
  if (db[modelName].associate) {
    db[modelName].associate(db);
  }
});

db.sequelize = sequelize;
db.Sequelize = Sequelize;

module.exports = db;
  • 여기까지 했으니, 이것을 도커화 해서 npx seqyekuze db:create했을 때 database 생성이 되어있다면 back과 mysql의 연결이 된 것이다.

 

3️⃣ Backend 도커파일 만들기


1. dockerignore 작성

node_modules
npm-debug.log

2. Dockerfile 작성

FROM node:17. # 노드 버전 명시
WORKDIR /app  # 컨테이너의 작업 공간 명시

COPY package*.json /app/  # package로 시작하는 파일명.json을 컨테이너의 /app 경로에 붙여넣기
RUN npm install #컨테이너 안에서 이 명령어를 수행함

COPY . /app  # 모든 파일을 컨테이너의 /app 경로에 붙여넣음
RUN npx sequelize db:create #이 명령어를 수행함

EXPOSE 3085 # backend 역할을 할 포트번호 명시

CMD ["npm", "run", "dev"]
  • 주석은 없애야 함.

 

4️⃣ Jupyter에 가기


sudo apt update
sudo apt install nodejs
nodejs -
sudo apt install npm

//nodejs 최신버전으로 설치하기 (PPA)
$ cd ~
$ curl -sL <https://deb.nodesource.com/setup_14.x> -o nodesource_setup.sh

$ sudo bash nodesource_setup.sh 
$ sudo apt-get install nodejs

$ sudo apt-get install build-essential

//npm 업데이트하기
npm install -g npm@latest
npm -v

jupyter로 가서 깃 clone하기

: git clone .. 

//나머지 작업 생략, 해당 폴더 이동
: docker build -t backend . # 빌드시킴

jupyter에서 .env파일을 만들어주기

MYSQL_USERNAME=
MYSQL_PASSWORD=
MYSQL_DATABASE=
MYSQL_HOST=
MYSQL_DIALECT=mysql
MYSQL_PORT=
  • 여기서 헤맸는데, env파일은 .gitignore로 가렸으니 있을리가 만무하고 직접 만들어줬다. 그런 뒤에 npx 명령어를 실행하면 제대로 원하는 데이터베이스가 서버에 생성됨을 확인 가능하다

 

이럴 거면 docker파일을 왜 만들었냐고 💢

npx 명령어 조차 스스로 칠거면 왜 했냐고 💢