우버이츠클론코딩 #3
TypeORM
= Object Relational Mapping(객체 관계 매핑)
-
타입스크립트나 NestJS에서 데이터베이스와 통신할 때 사용하면 편리
=> SQL 문을 쓰는 대신 코드를 써서 상호작용
-
설치
vscode terminal에 npm install –save @nestjs/typeorm typeorm pg
-
TypeORM 모듈을 앱모듈에 설치
-
app.module.ts
import { Module } from '@nestjs/common'; import { ConfigModule } from '@nestjs/config'; import { GraphQLModule } from '@nestjs/graphql'; import {TypeOrmModule} from "@nestjs/typeorm"; import { RestaurantsModule } from './restaurants/restaurants.module'; @Module({ imports: [ ConfigModule.forRoot({ isGlobal: true, envFilePath: process.env.NODE_ENV == "dev" ? ".dev.env" : ".test.env", ignoreEnvFile: process.env.NODE_ENV ==="prod", }), TypeOrmModule.forRoot({ type: 'postgres', host: 'localhost', port: 5432, username: 'postgres', password: '1234',//localhost인 경우엔 안써도 됨 database: 'nuber-eats', synchronize: true, logging: true, }), GraphQLModule.forRoot({ autoSchemaFile: true,//root module 설정 }), RestaurantsModule, ], controllers: [], providers: [], }) export class AppModule {} export class AppModule {}
-
Postgresql
-
postgresql 다운
-> postgresql 홈페이지에서 다운로드
-
GUI(graphical User Interface) 다운
-> pgAdmin 4 설치( 나는 자동으로 postgresql에서 설치함)
-
pgAdmin 실행
- Add New Server
-
databases 하나 만들기
-> 이름: nuber-eats
owner: 자기자신(나는 user를 만들었음)
=> pgadmin은 postgresql을 보기 위한것
dotenv
-
새로운 창 -> TypeError: npm i –save @nestjs/config
-
.env.dev
.env.test
파일 생성
development환경 설정
-
npm i cross-env (가상 변수를 설정, 환경에 상관없이 쓸 수 있게)
-
package.json
(start:dev)부분
"scripts": { "prebuild": "rimraf dist", "build": "nest build", "format": "prettier --write \"src/**/*.ts\" \"test/**/*.ts\"", "start": "cross-env NODE_ENV=prod nest start", "start:dev": "cross-env NODE_ENV=dev nest start --watch", "start:debug": "nest start --debug --watch", "start:prod": "node dist/main", "lint": "eslint \"{src,apps,libs,test}/**/*.ts\" --fix", "test": "jest", "test:watch": "jest --watch", "test:cov": "jest --coverage", "test:debug": "node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand", "test:e2e": "jest --config ./test/jest-e2e.json" },
nestjs 버전 다 7로 통일!
-
.env.dev
DB_HOST= 'localhost' DB_PORT= 5432 DB_USERNAME= 'postgres' DB_PASSWORD= '1234' DB_NAME= 'nuber-eats'
-
app.module.ts
import { Module } from '@nestjs/common'; import { ConfigModule } from '@nestjs/config'; import { GraphQLModule } from '@nestjs/graphql'; import {TypeOrmModule} from "@nestjs/typeorm"; import { RestaurantsModule } from './restaurants/restaurants.module'; @Module({ imports: [ ConfigModule.forRoot({ isGlobal: true, envFilePath: process.env.NODE_ENV == "dev" ? ".dev.env" : ".test.env", ignoreEnvFile: process.env.NODE_ENV ==="prod", }), TypeOrmModule.forRoot({ type: 'postgres', host: process.env.DB_HOST, port: +process.env.DB_PORT, username: process.env.DB_USERNAME, password: process.env.DB_PASSWORD,//localhost인 경우엔 안써도 됨 database: process.env.DB_NAME, synchronize: true, logging: true, }), GraphQLModule.forRoot({ autoSchemaFile: true,//root module 설정 }), RestaurantsModule, ], controllers: [], providers: [], }) export class AppModule {}
-
joi
: 자바스크립트용의 가장 강력한 스키마 설명 언어 & 데이터 유효성 검사 => 환경변수 유효성 검사할거
- 설치 -> npm install joi
- app.module.ts
-> joi import(js로 이루어져있기때문에 import 하는 방식이 다름)
import { Module } from '@nestjs/common'; import { ConfigModule } from '@nestjs/config'; import { GraphQLModule } from '@nestjs/graphql'; import {TypeOrmModule} from "@nestjs/typeorm"; import * as Joi from 'joi'; //타입스크립트나 NestJS로 되어있지 않을때 패키지 import import { Restaurant } from './restaurants/entities/restaurant.entity'; import { RestaurantsModule } from './restaurants/restaurants.module'; import { UsersModule } from './users/users.module'; import { CommonModule } from './common/common.module'; import { User } from './users/entities/user.entity'; @Module({ imports: [ ConfigModule.forRoot({ isGlobal: true, envFilePath: process.env.NODE_ENV == "dev" ? ".env.dev" : ".env.test", ignoreEnvFile: process.env.NODE_ENV ==="prod", //production환경일땐 ConfigModule이 환경변수 파일 validationSchema: Joi.object({ NODE_ENV: Joi.string() .valid('dev', 'prod') .required(), // 환경변수 유효성 검사 DB_HOST: Joi.string().required(), DB_PORT: Joi.string().required(), DB_USERNAME: Joi.string().required(), DB_PASSWORD: Joi.string().required(), DB_NAME: Joi.string().required(), }), }), TypeOrmModule.forRoot({ type: 'postgres', host: process.env.DB_HOST, port: +process.env.DB_PORT, username: process.env.DB_USERNAME, password: process.env.DB_PASSWORD, //localhost인 경우엔 안써도 됨 database: process.env.DB_NAME, synchronize: process.env.NODE_ENV ==="prod", //production이 아니면 true로 logging: process.env.NODE_ENV ==="prod", //DB에 돌아가는 모든 로그 확인 entities:[User] }), GraphQLModule.forRoot({ autoSchemaFile: true, //root module 설정 }), UsersModule, CommonModule, ], controllers: [], providers: [], }) export class AppModule {}