NestJS Auth - Setup

이게되네·2021년 2월 14일
0

NestJS Auth

목록 보기
2/4
post-thumbnail

Index

  • MySQL Setup
    • docker-compose
  • NestJS Setup
    • Create Project
    • TypeORM Setup (Connect DB)
    • User Entity Model

MySQL docker-compose

Docker Compose

MySQL Container 환경을 구성합니다. 기존 MySQL를 사용하기 원하시는 사용자는 (Optinal)이라고 적힌 부분을 Skip 하셔도 됩니다.

  • docker-compose.yml이란 파일을 생성합니다. (Optinal)
services:
  mysql:
    image: mysql:5.7
    container_name: dev-mysql
    restart: always
    ports:
      - 10310:3306
    environment:
      TZ: Asia/Seoul
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: dev
      MYSQL_USER: dev
      MYSQL_PASSWORD: dev
    command:
      - --character-set-server=utf8mb4
      - --collation-server=utf8mb4_unicode_ci
      - --skip-character-set-client-handshake
    volumes:
      - dev-mysql:/var/lib/mysql

volumes:
  dev-mysql:
  • docker-compose up -d 명령어를 사용하여 MySQL Docker Container를 생성해줍니다. (Optinal)

  • MySQL WorkBench에서 Container가 생성되었는지 확인하고, 아래에 적힌 ID, Password로 Database에 Connect 합니다. (Optinal)

id: root
pw: root

  • Schema(Database)를 만들어 줍니다.

  • 왼쪽 위 Administration 탭의 Users and Privileges에서 새로운 account를 등록해줍니다.

# 사용자 마음대로

id: ilyong
pw: ilyong 

NestJS Setup

Create Project

  • @nestjs/cli Package를 통해 프로젝트를 만들어 줍니다.
$ nest new nestjs-auth

참고 🔍

TypeORM Setup (Connect DB)

  • 필요한 Package를 설치해줍니다.
$ npm i joi @nestjs/config
$ npm i @nestjs/typeorm typeorm mysql2
  • 우선 Database 연결에 필요한 환경변수가 정의된 파일을 만들어줍니다.
# File Should exist on Project Root Directory
# File Name : `.env`

NODE_PORT=3000

# MySQL Database Hostname
MYSQL_HOST=127.0.0.1

# MySQL Database Port
MYSQL_PORT=10310

# MySQL Database username
MYSQL_USERNAME=ilyong

# MySQL Database Password
MYSQL_PASSWORD=ilyong

# MySQL Database Schema Name
MYSQL_DATABASE=ilyong
  • ConfigModule을 통해 Nest Project에 환경변수를 불러옵니다.
// src/app.module.ts

import { Module } from '@nestjs/common';
import { ConfigModule } from '@nestjs/config';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import * as Joi from 'joi';

@Module({
  imports: [
    ConfigModule.forRoot({
      envFilePath: '.env',
      isGlobal: true,
      validationSchema: Joi.object({
        NODE_PORT: Joi.string().required(),
        MYSQL_HOST: Joi.string().required(),
        MYSQL_PORT: Joi.string().required(),
        MYSQL_USERNAME: Joi.string().required(),
        MYSQL_PASSWORD: Joi.string().required(),
        MYSQL_DATABASE: Joi.string().required(),
      }),
    }),
  ],
  controllers: [AppController],
  providers: [AppService],
})
export class AppModule {}

참고 🔍

  • TypeOrmModule을 사용하여 MySQL Database에 연결합니다.
// src/app.module.ts


@Module({
  imports: [
    // ...
    
    TypeOrmModule.forRoot({
      type: 'mysql',
      host: process.env.MYSQL_HOST,
      port: +process.env.MYSQL_PORT,
      username: process.env.MYSQL_USERNAME,
      password: process.env.MYSQL_PASSWORD,
      database: process.env.MYSQL_DATABASE,
      // Application이 실행(변경)될 때마다 database schema가 자동으로 생성(DB에 바로 반영)됩니다. 
      // (주의! 배포 환경에서 쓰지마시오)
      synchronize: true,
      // Query를 할때마다 Console Log를 찍어줍니다.
      logging: true,
      // The charset for the connection. (default: 'UTF8_GENERAL_CI')
      charset: 'utf8mb4_unicode_ci',
      // The timezone configured on the MySQL server.
      timezone: '+09:00',
      // Database 연결에 대해 불러올 Entity를 정의합니다.
      // Entity는 데이터베이스 테이블에 매핑되는 Class입니다.
      entities: [],
    }),
    
    // ...
    ,
})
export class AppModule {}

참고 🔍

User Entity Model

TypeORMRepository Design Pattern을 지원합니다. 따라서 각 Entity는 자신의 Repository를 가집니다. 이러한 Repository들은 database 연결로부터 얻어질 수 있습니다.

  • 우선 사용자 관련 로직을 처리하기 위해 Module, Controller, Service를 생성합니다.
$ nest generate module user
$ nest generate service user
$ nest generate controller user
  • 그리고 User Entity를 정의해줍니다.
// src/user/entity/user.entity.ts

import { Column, CreateDateColumn, DeleteDateColumn, Entity, PrimaryGeneratedColumn, UpdateDateColumn, VersionColumn } from "typeorm";

@Entity({ name: 'users' })
export class User {
  @PrimaryGeneratedColumn('uuid')
  id: string; // Primary Key

  @Column()
  username: string; // id(email 형식)
  
  @Column()
  name: string; // 사용자명

  @Column()
  password: string; // 비밀번호
  
  @Column({ nullable: true })
  avatar: string; // 프로필 이미지 (nullable)

  @CreateDateColumn()
  createdAt: Date;

  @UpdateDateColumn()
  updatedAt: Date;

  @DeleteDateColumn()
  deletedAt: Date;

  @VersionColumn()
  version: string;
}
  • User entity 사용을 시작하기 위해서 TypeOrmModuleforRoot() method 옵션 중 하나인 entities Array에 EnInserting 함으로써 TypeORM에 이를 알려야 합니다.
// src/app.module.ts

// ...
import { User } from './user/entity/user.entity';

@Module({
  imports: [
    // ...
    TypeOrmModule.forRoot({
      // ...
      
      entities: [User],
      
      // ...
  • 저장하고 Nest Application을 실행하여 Database에 적용되었는지 확인해봅시다.
$ npm run start:dev

실행하면 TypeORM이 MySQL Database에 연결하고 Table을 생성하기 위한 Query문을 실행하고 NestJS Server가 실행됩니다. 그리고 아래 사진과 같이 users 라는 Table이 된 것을 확인할 수 있습니다.

profile
BackEnd Developer

0개의 댓글