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

  1. postgresql 다운

    -> postgresql 홈페이지에서 다운로드

  2. GUI(graphical User Interface) 다운

    -> pgAdmin 4 설치( 나는 자동으로 postgresql에서 설치함)

  • pgAdmin 실행

    1. Add New Server
    2. image

    3. databases 하나 만들기

      -> 이름: nuber-eats

      ​ owner: 자기자신(나는 user를 만들었음)

      => pgadmin은 postgresql을 보기 위한것

dotenv

  • 새로운 창 -> TypeError: npm i –save @nestjs/config

  • .env.dev

    .env.test

    파일 생성

development환경 설정

  1. 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

: 자바스크립트용의 가장 강력한 스키마 설명 언어 & 데이터 유효성 검사 => 환경변수 유효성 검사할거

  1. 설치 -> 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 {}