일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- wecode#위코드
- 벌써보고싶어38기
- Github웹호스팅 #HTML#CSS
- 시멘틱 웹#시멘틱 태그#로멘틱성공적
- wecode
- 멘토님포함
- wecode#위코드#너무어려워#멘토님감사합니다
- Today
- Total
lflov
Express 초기설정들 본문
아하하 앞에 게시물은 어그로였구요 진짜 시작해볼게요
일단 초기 세팅을 해줘야 겠죠?
해야할 디렉토리에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 |