lflov

Express 초기설정들 본문

node.js

Express 초기설정들

마젠토브힘내부왕 2022. 10. 6. 01:37

아하하 앞에 게시물은 어그로였구요 진짜 시작해볼게요

 

일단 초기 세팅을 해줘야 겠죠?

 

해야할 디렉토리에package.json 만들기(npm init -y)

express 설치(npm i express)

nodemon 설치(npm i -g nodemon)

cors 설치(npm i cors)

dotenv 설치(npm i dotenv)

morgan설치(npm i morgan)

typeorm 설치(npm i typeorm) 

.env(환경변수 설정 숨김파일) 만들고

.env.sample(보여줄수 있는 환경변수 파일) 만들고

.gitignore(git에 올릴때 안올라가는 것들은 넣는곳) > .env추가 https://www.toptal.com/developers/gitignore/ 여기서 문제될만한 프로그램들(초기 세팅 맞추는데 영향이 갈만한 것들 추가해서 넣어주면 된다)

dbmate설치(3rd party db 테이블 구조 올리는곳)

tree설치(tree명령어 가능하게 하는것 brew install tree)

 

mysql 오류 발생시 : mysql or mysql2 설치 (npm install mysql     npm install mysql2)

 

app.js 예시

require('dotenv').config();
const express = require('express');
const cors = require('cors');
const morgan = require('morgan');
const { DataSource } = require('typeorm');
const app = express();
const PORT = process.env.PORT;
const appDataSource = new DataSource({
  type: process.env.TYPEORM_CONNECTION,
  host: process.env.TYPEORM_HOST,
  port: process.env.TYPEORM_PORT,
  username: process.env.TYPEORM_USERNAME,
  password: process.env.TYPEORM_PASSWORD,
  database: process.env.TYPEORM_DATABASE
})
appDataSource.initialize()
    .then(() => {
      console.log("Data Source has been initialized!")
    })
    .catch((err) => {
      console.error("Error during Data Source initialization", err)
      appDataSource.destroy()
    })
app.use(cors());
app.use(morgan('dev'));
app.use(express.json());
const start = async () => {
  try {
    app.listen(PORT, () => console.log(`Server is listening on ${PORT}`));
  } catch (err) {
    console.error(err);
  }
}
start();

 

 

 

 

1. package.json 만들기

{
  "name": "test",
  "version": "1.0.0",
  "description": "",
  "main": "app.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC"
}

 

요런식으로 기본값으로 생성된다 (-y로 할 시 기본값으로 생성됨)

여기서 main 부분은 index.html 처럼 모든걸 아우르는 js 파일명을 적어준다

scripts 안에는 단축키 설정 느낌으로 하는거다 여기서 우리는

 

$ "scripts": {
    "start": "nodemon app.js"
  }

 

요걸 적어주었다 이는 npm start 할시 nodemon app.js 로 한다는 단축키 설정 느낌이다

 

요건 nodemon 설치 이후에 입력해야한다! (nodemon 단축키 설정이므로)

 

{
  "name": "realexpress",
  "version": "1.0.0",
  "description": "",
  "main": "app.js",
  "scripts": {
    "start": "nodemon app.js",
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "dependencies": {
    "cors": "^2.8.5",
    "dbmate": "^1.0.3",
    "dotenv": "^16.0.3",
    "express": "^4.18.1",
    "morgan": "^1.10.0",
    "mysql": "^2.18.1",
    "typeorm": "^0.3.10"
  }
}

 

요것처럼 dependecies 에 초기세팅에서 설치된 것들이 나온다

 

> 이것은 express 설치 이후에 나오는것 같다.

 

2. express 설치(npm i express)

 

npm install express 

npm install express --no-save : express 일시적으로 사용하고 싶을때 (베포용 dependency list에 저장하고 싶지 않을때)

npm install express --save-dev : 로컬 개발환경에서 쓰고 싶은 패키지들 관리할때 (devDependencies에 저장됨)

 

그냥 express 였다가 중간에 바꾸는건 불가능한것으로 보인다. 바꿔서 사용하고 싶으면 express를 지우고 다시 설치하여서 사용하는거같다

 

const express = require('express') // express require 하고
const app = express() // express 객체인 app을 만든다

app.use(express.json()); // json parse의 기능

 

 

3. nodemon 설치(npm i -g nodemon)

 

 

수정사항이 생기면 자동으로 서버를 restart 하는 프로그램이다

 

rs 명령어를 입력시 다시 시작할수 있다.

 

4. cors 설치(npm i cors)

 

SOP(Same Origin Policy) : 같은 출저에서 나온 것들끼리만 브라우저에서는 허용한다.

 

이를 특정 상황에서만 허용해주는게 cors다

 

모든 Request에 cors 하기

const express = require('express')
const cors = require('cors') //cors require 하고
const app = express()
 
app.use(cors()) // cors 사용하기

특정 request에 cors 하기

const express = require('express')
const cors = require('cors')
const app = express()
 
app.get('/ping', cors(), function (req, res, next) { // 필요한 곳에 cors()를 적어주면 된다
  res.json({message: 'pong'})
})


app.listen(3000, function () {
  console.log('server listening on port 3000')
})

cors 기본값으로 설정된 내용

{
  "origin": "*",
  "methods": "GET,HEAD,PUT,PATCH,POST,DELETE",
  "preflightContinue": false,
  "optionsSuccessStatus": 204
}

 

참고 : https://www.npmjs.com/package/cors?activeTab=readme 

 

cors

Node.js CORS middleware. Latest version: 2.8.5, last published: 4 years ago. Start using cors in your project by running `npm i cors`. There are 11196 other projects in the npm registry using cors.

www.npmjs.com

 

5. dotenv 설치(npm i dotenv)

환경변수(메타 데이터 느낌) 파일 .env 파일 세팅해주는 프로그램( process.env 파일 내용 추가해주는것)

 

설치 이후에 .env .env.sample .gitignore 생성한다

 

.env > 환경변수 넣는곳

.env.sample > 환경변수 설명 넣는곳 why? .env 는 보통 .gitignore에 적어줌으로써 git에 올라가지 않게 설정하므로

.gitignore > git에 push 할때 올리고 싶지 않은 정보들 넣는곳

 

.env 예시

DATABASE_URL="mysql://root:cutestar12!@@127.0.0.1:3306/crud_express" //db url

PORT=3000 // port

TYPEORM_CONNECTION=mysql // rdbms 종류
TYPEORM_HOST=127.0.0.1 // 호스트할 곳
TYPEORM_USERNAME=root // rdbms username
TYPEORM_PASSWORD='cutestar12!@'// rdbms password
TYPEORM_DATABASE=crud_express // database name
TYPEORM_PORT=3306 // typeorm port
TYPEORM_LOGGING=TRUE// logging 여부

 

const dotenv = require('dotenv'); // dotenv 요청하고

dotenv.config();// dotenv를 이용해 process.env 내용 추가 하는느낌

> 그래서 config() 하기전에 process.env 불러오면 안된다!

 

6. morgan설치(npm i morgan)

const express = require('express');
const logger = require('morgan'); // morgan 모듈 추가하기

const app = express();

app.use(morgan('combined')); // morgan 사용하기

combined는 로그의 포멧이고 하단부가 로그 포멧의 종류들이다.

 

common
[:remote-addr - :remote-user [:date[clf]] ":method :url HTTP/:http-version" :status :res[content-length]]
dev 
[:method :url :status :response-time ms - :res[content-length]]
short
[:remote-addr :remote-user :method :url HTTP/:http-version :status :res[content-length] - :response-time ms]
tiny
[:method :url :status :res[content-length] - :response-time ms]

 

7. typeorm 설치(npm i typeorm) 

 

이 때, 새로 다운 받은 패키지간 버전 호환 문제로 다양한 에러가 발생할 수 있는데, 그 중 TypeORM - Mysql 사이의 연동을 도와주는 mysql driver가 존재하지 않는다는(missing) 에러가 날 경우에는 npm 을 경유하여 mysql 혹은 mysql2로 관련 드라이버를 재설치 합니다.

해당 절차를 따랐음에도 계속 문제가 발생한다면, 설치시 내부 node_modules 구조가 설치 과정중 꼬여있을 수도 있음으로, TypeORM 삭제 → mysql/mysql2 설치 → TypeORM 드라이버 재설치 절차대로 다시 설치 과정을 진행해줍니다.

$ npm uninstall typeorm    # typeorm 삭제 명령어
$ npm install mysql        # mysql 설치 명령어
$ npm install mysql2       # mysql2 설치 명령어

 

typeorm - database 욘굘

 

const dotenv = require("dotenv")

dotenv.config()
 // dotenv한 이후에 진행(why : 환경변수(.env)에 연결에 필요한 정보(db url / username etc) 등이 있어서
 
 
const { DataSource } = require('typeorm'); // DataSource 명령어를 이용해 db와의 커넥션 환경 세팅

const myDataSource = new DataSource({ // DataSource 객체인 myDataSource 생성, 비동기적인 코드?
										// 이므로 callback 함수로 실행
    
    //process.env 와 db를 연결 정보들(env객체에 접근해서 typeorm 관련 환경변수 긁어오기)
    //process 객체는 node.js 에서 기본으로 설정되는 글로벌 객체로써 
    //별도의 require 호출 없이 언제, 어디서든지 모든 모듈에서 접근이 가능한 객체
    
    type: process.env.TYPEORM_CONNECTION, 
    host: process.env.TYPEORM_HOST,
    port: process.env.TYPEORM_PORT,
    username: process.env.TYPEORM_USERNAME,
    password: process.env.TYPEORM_PASSWORD,
    database: process.env.TYPEORM_DATABASE
})

myDataSource.initialize() // db와 실제 연결
    appDataSource.initialize()
    .then(() => {
      console.log("Data Source has been initialized!")
    })
    .catch((err) => {
      console.error("Error during Data Source initialization", err)
      appDataSource.destroy()
    })

 

 

아래와 같이 manager 클래스에 접근하여 query 메소드를 사용하여 그 안에 내가 원하는 쿼리문을 작성하면 db와 정상적으로 연동이 되었다는 가정하에 성공적으로 쿼리문이 실행됩니다.

const DataSource = myDataSource.query(`SELECT * FROM USERS`)

 

8. dbmate설치(3rd party db 테이블 구조 올리는곳)

 

dbmate 는 mysql 과 같은 RDBMS 의 테이블 스키마를 관리하는 도구로 이력을 남기기 때문에 매우 유용하다. 대규모 데이터베이스의 스키마는 양이 많다. 게다가 관리자가 바뀌거나 새로운 작업에 사용해야 할 때 만들어진 이후의 흐름을 쭉 볼 수 있기 때문에 작업의 연속성을 지킬 수 있다. 흐름은 다음과 같다.

0.dbmate 인스톨

작업을 진행할 폴더에 dbmate 를 인스톨한다. 그리고 잊지 말아야 한다. dbmate 의 github 공식문서를 보면 dbmate 와 데이터베이스를 연결하는 방법을 알려주고 있다.
예시) 터미널 명령 : npm install dbmate

1.dbmate new create_table 

create_table 에 원하는 이름을 넣으면 된다. dbmate 가 인스톨된 폴더에 db 폴더가 생긴다. 지금 사용된 이름은 데이터베이스의 테이블 이름이 아니므로 크게 신경쓸 필요 없다.

2.SQL 작성 (migrate:up > dbmate up 할때 올라가는 부분/ migrate:down > dbmate down 할때 하는 부분)

만들어진 파일에 SQL 을 작성한다. SQL 문법에 맞게 작성해야 한다.

3.dbmate up

SQL 을 모두 작성했다면 마이그레이션 해야 한다. 여러 파일을 한번에 마이그레이션 할 수 있다. 마이그레이션 끝나면 schema.sql 파일이 생긴다. 우리가 만든 테이블은 우리가 사용하는 RDBMS 에 생긴다. dbmate 와 연결한 database 에 생기므로 연결시 주의한다.

4.테이블을 수정하려면

마이그레이션 끝난 테이블을 수정하려면 그 파일을 직접 수정하는게 아니라 새로운 마이그레이션을 하면 된다. 즉 mySQl 에서 테이블을 수정하듯이 새로운 파일에 수정 SQL 문을 작성하여 마이그레이션 하면 데이터베이스의 테이블이 수정된다.

삭제등 명령문은 공식문서를 참조하면 된다.

 

'node.js' 카테고리의 다른 글

2차 프로젝트 회고록  (2) 2022.11.13
Express와 TypeORM  (1) 2022.10.05
TypeORM & DB connection  (1) 2022.10.05
Express 초기설정?  (1) 2022.10.05
데이터베이스  (0) 2022.09.26