Introduction
프로젝트를 시작하기에 앞서서, 이번 프로젝트는 nestJS로 소셜 로그인을 구현하는 사이드 프로젝트로 시작함을 알려드립니다.
nestJS CLI로 시작
$ nest new nest-social-login
nestJS CLI를 이용해서 프로젝트를 생성한다.
성공적으로 프로젝트가 생성되었다면 다음과 같은 프로젝트 구조가 만들어진다.
TypeORM , MySQL 설치
$ npm i --save @nestjs/typeorm typeorm mysql2
TypeScript ORM인 TypeORM과 MYSQL2를 설치합니다.
Config 패키지 설치와 .env 생성
$ npm i @nestjs/config
.env를 생성해서 DB연결에 대한 정보를 .env에 저장할 예정입니다.
/.env
DATABASE_USER = [DB 유저]
DATABASE_PASSWORD = [DB 비밀번호]
DATABASE_PORT = [DB 포트(Mysql 기본 3306)]
DATABASE_HOST = [DB ip 주소]
DATABASE_NAME = [DB 스키마 이름]
위의 규칙에 맞게 본인의 데이터베이스 정보를 .env파일에 저장해 주시면 됩니다.
Config Service를 이용해서 DB연결
src폴더 하위에 config폴더를 생성한 뒤에 src/config폴더로 이동하고 아래와 같은 명령어를 입력하여 database.model.ts 파일을 생성합니다.
$ nest g mo database
module.ts가 생성되었으면 각 파일들을 아래와 같이 수정합니다.
/src/config/database/database.module.ts
import { Module } from '@nestjs/common';
import { ConfigModule, ConfigService } from '@nestjs/config';
import { TypeOrmModule } from '@nestjs/typeorm';
import { Customer } from "../../users/customer/customer.entity";
@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: [],
synchronize: true,
}),
}),
],
})
export class DatabaseModule {}
database.module.ts를 작성했으면 아래 명령어를 이용하여 환경 변수 데이터 검증 joi 패키지를 다운 받습니다.
$ npm i @hapi/joi @types/hapi__joi
설치가 완료 된다면 app.module.ts를 다음과 같이 수정합니다.
/src/app.module.ts
import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import {DatabaseModule} from "./config/database/database.module";
import {ConfigModule} from "@nestjs/config";
import {CustomerModule} from "./users/customer/customer.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(),
}),
}),
CustomerModule,
DatabaseModule
],
controllers: [AppController],
providers: [AppService],
})
export class AppModule {}