Typescript를 이용한 node server 만들기
dependencies
"dependencies": {
"@hapi/joi": "^17.1.1",
"body-parser": "^1.19.0",
"class-transformer": "^0.2.3",
"class-validator": "^0.10.2",
"config": "^3.3.1",
"continuation-local-storage": "^3.2.1",
"cookie-parser": "~1.4.4",
"cors": "^2.8.5",
"debug": "~2.6.9",
"express": "~4.16.1",
"http-errors": "~1.6.3",
"multer": "^1.4.2",
"mysql2": "^2.1.0",
"nunjucks": "^3.2.0",
"reflect-metadata": "^0.1.13",
"routing-controllers": "^0.8.0",
"sequelize": "^5.21.5",
"sequelize-typescript": "^1.1.0",
"typescript": "^3.8.3"
},
"devDependencies": {
"@types/body-parser": "^1.19.0",
"@types/bluebird": "^3.5.30",
"@types/chai": "^4.2.10",
"@types/config": "0.0.36",
"@types/continuation-local-storage": "^3.2.2",
"@types/cookie-parser": "^1.4.2",
"@types/cors": "^2.8.6",
"@types/debug": "^4.1.5",
"@types/express": "^4.17.3",
"@types/hapi__joi": "^16.0.12",
"@types/http-errors": "^1.6.3",
"@types/mocha": "^7.0.2",
"@types/morgan": "^1.9.0",
"@types/multer": "^1.4.2",
"@types/node": "^13.7.7",
"@types/nunjucks": "^3.1.3",
"@types/validator": "^10.11.3",
"@typescript-eslint/eslint-plugin": "^2.22.0",
"@typescript-eslint/parser": "^2.22.0",
"chai": "^4.2.0",
"eslint": "^6.8.0",
"mocha": "^7.1.0",
"sinon": "^9.0.0",
"ts-node": "^8.6.2"
}
Project Structure
.
├── config
│ ├── cors.ts
│ ├── local.json
│ └── routingControllers.ts
├── controllers
│ └── UserControllers.ts
├── database
│ ├── Hobby.ts
│ └── User.ts
├── middlewares
│ ├── auth
│ └── error
├── persistence
│ └── sequelize.ts
├── public
│ ├── favicon.ico
│ └── stylesheets
├── repository
│ └── user
├── test
│ ├── transaction
│ └── user
└── views
│ ├── error.html
│ └── index.html
├── index.ts
├── app.ts
├── .eslintrc.js
└── tsconfig.json
- config
server, database 등 관련 설정 파일 - controllers
controller - database
DB table entity - middlewares
- auth 인증 관련 미들웨어 (eg, passport)
- error error handler
- persistence
db connection - public
static view asset - repository
repository ( orm handler ) - test
test folder - views
static view page - index.ts
entry point - app.ts
config express - tsconfig.json
typescript config file
핵심 library
routing-controllers
- 사용이유
- router를 class로 관리할 수 있다.
- async처리시 try catch 불필요
- response data를 return 처리해서 필요한 data에 집중할 수 있다.
typescript활용 가능 - router import를 자동으로 처리해준다.
- 컨벤션
- response 형식이 json이면 JsonController를 사용한다.
- method명에 literal을 쓰길 권장한다.
controller method는 일반적으로 call할 경우가 없기 때문에 api에 대한 설명으로 literal을 활용할 수 있다. </ol>
- Q&A
Q middleware 사용은 어떻게 하나요?
A userBefore decorator를 사용합니다.
multer 또한 마찬가지 입니다.
sequelize
- spec
version: 5.0 - 사용이유
- 기존에 사용하던 knex로는 원하는 비즈니스 data set 관리하기가 힘들었다.
- node server에서 가장 많이 사용하는 orm이다.
- wrapping library
- sequelize 4.0시절 typescript구현을 위한 라이브러리
- sequelize 5.0또한 typescript를 지원하나
entity를 class로 관리할 수 있는 이점이 있고 relation관계 설정이 좀 더 편리하다.
- transaction config
continuation local storage를 사용해서 transaction 전달 코드를 줄인다.
자세한 내용 - migration config 추가적인 리서치후 구현이 필요 sequelize-typescript에 대한 자세한 내용
@hapi/joi
joi가 deprecated되고 @hapi/joi로 이전
scheme로 object를 검증할 수 있다.
자세한 내용은 https://hapi.dev/module/joi/#example
TODO
- authorization 전략을 짜서 구현하기