10) 개인 프로젝트) Auth인증 구현 Part6

Leo·2021년 2월 22일
0

Project-01

목록 보기
10/12
post-thumbnail

Secret Key의 저장 위치 변경

기존에는 ormconfig.json 파일에 DB의 정보를 기입해 뒀습니다. 하지만 이번에는 이것을 Nestjs의 Config를 이용하여 환경변수를 설정해 보도록 하겠습니다. 이렇게 외부로 환경변수를 빼두면 깃과 같은 저장소에 커밋하지 않기가 쉽습니다.

Config 패키지 다운로드

$ npm i @nestjs/config

.env 생성과 정보 저장

.env에는 DB의 접속정보를 넣어두고 관리합니다.

/.env

DATABASE_USER=root
DATABASE_PASSWORD=qwer1234@
DATABASE_PORT=3306
DATABASE_HOST=localhost
DATABASE_NAME=test
DB의 유저 이름
DB의 비밀번호
DB의 포트
DB의 ip주소
DB의 스키마 이름

DB 설정을 위한 Database Module 생성

Database Module 생성하여 app과 DB간의 연결을 정의합니다.
기능적으로 완전히 다른 부분이기 때문에 분리하여 만들었습니다.

$ nest g mo database

/src/database/database.module.ts

import { Module } from '@nestjs/common';
import { ConfigModule, ConfigService } from '@nestjs/config';
import { TypeOrmModule } from '@nestjs/typeorm';
import { join } from 'path';

@Module({
  imports: [
    TypeOrmModule.forRootAsync({
      imports: [ConfigModule],
      inject: [ConfigService],
      useFactory: (configService: ConfigService) => ({
        type: 'mysql',
        host: configService.get('DATABASE_HOST'),
        port: configService.get('DATABASE_PORT'),
        username: configService.get('DATABASE_USER'),
        password: configService.get('DATABASE_PASSWORD'),
        database: configService.get('DATABASE_NAME'),
        entities: [join(__dirname, '/../**/*.entity.js')],
        synchronize: true,
      }),
    }),
  ],
})
export class DatabaseModule {}

database module app module에서의 사용

작성한 database module을 app module에서 사용해 줘서 연동 처리를 완료해 줍니다. 과정에서 Joi 패키지를 이용하여 환경변수 데이터에 대한 검증을 합니다.

$ npm i @hapi/joi @types/hapi__joi

/src/app.module.ts

import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { UsersModule } from './users/users.module';
import { AuthModule } from './auth/auth.module';
import { APP_GUARD } from '@nestjs/core';
import { JwtAuthGuard } from './auth/guards/jwt-auth.guard';
import { ConfigModule } from '@nestjs/config';
import { DatabaseModule } from './database/database.module';
import * as Joi from '@hapi/joi';

@Module({
  imports: [
    ConfigModule.forRoot({
      validationSchema: Joi.object({
        DATABASE_HOST: Joi.string().required(),
        DATABASE_PORT: Joi.number().required(),
        DATABASE_USER: Joi.string().required(),
        DATABASE_PASSWORD: Joi.string().required(),
        DATABASE_NAME: Joi.string().required(),
      }),
    }),
    UsersModule,
    AuthModule,
    DatabaseModule,
  ],
  controllers: [AppController],
  providers: [AppService, { provide: APP_GUARD, useClass: JwtAuthGuard }],
})
export class AppModule {}

이제 DB 테이블을 삭제후 다시 앱을 실행시켜 정상작동 되는지 확인합니다.

다음 포스트에서 수정될 사항

  • secret key의 저장 장소
  • token의 시간 설정
  • username이 아닌 email 사용
  • password 암호화
profile
개발자

0개의 댓글