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/cli
Package를 통해 프로젝트를 만들어 줍니다.$ nest new nestjs-auth
참고 🔍
$ npm i joi @nestjs/config
$ npm i @nestjs/typeorm typeorm mysql2
# 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 {}
참고 🔍
TypeORM은 Repository 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
사용을 시작하기 위해서 TypeOrmModule
의 forRoot()
method 옵션 중 하나인 entities
Array에 EnInserting 함으로써 TypeORM
에 이를 알려야 합니다.// src/app.module.ts
// ...
import { User } from './user/entity/user.entity';
@Module({
imports: [
// ...
TypeOrmModule.forRoot({
// ...
entities: [User],
// ...
$ npm run start:dev
실행하면 TypeORM이 MySQL Database에 연결하고 Table을 생성하기 위한 Query문을 실행하고 NestJS Server가 실행됩니다. 그리고 아래 사진과 같이 users
라는 Table이 된 것을 확인할 수 있습니다.