๐ฅ BLOCKTRIP ํ๋ก์ ํธ -4 | DB ์ฐ๋
blocktrip 4๋ฒ์งธ ์ฝ์ง
์ ๋ง ์ค๋๋ง์ ๊ฐ๋ฐ์ผ์ง๋ฅผ ์์ฑํ๋๊ฒ ๊ฐ๋ค.
์๋์์ผ๋ฉด ์ฝ๋ฉํ
์คํธ ์ฐ์ต๋ฌธ์ ์ผ์ฃผ์ผ์ 1ํ์ฉ ํ๊ณ ๋ธ๋ก๊น
,
๊ฐ๋ฐ๊ณผ์ ์ ๋ด๋ ์ผ์ง ๋ธ๋ก๊น
๋ฑ ์ฌ๋ฌ ์ปจํ
์ธ ๊ฐ ์งํ๋์ด์ผ ํ๋๋ฐ , ๊ฐ์ธ์ฌ์ (๋ฒ์์,์คํธ๋ ์ค) ๋๋ฌธ์ ๋๋์ด ์ฐจ๊ทผ์ฐจ๊ทผ ํ๋ณตํ๊ณ ์ฌ์์์ ํ๋ ค๊ณ ํ๋ค.
- nestJS init ๊ณผ์ ์๋ต
๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ตฌ์ฑ
์ฐ์ ๋ด ๋๋ฆ๋๋ก์ ์ค๊ณ์ ๋ฐ๋ฅด๋ฉด ์์์ ์ ์ ๋ฅผ ์์ฑํ๊ณ ๊ด๋ฆฌํ๋๊ฒ๋ถํฐ์๋ค.
๊ทธ๋์ ๋ก์ปฌ์ ์๋ mysql์ ์ฐ๊ฒฐํ๋ ค๋ค๊ฐ ์ด๋ฒ๊ธฐํ์ mysql์ ๋์ปค์ ๋ด์์ ๊ด๋ฆฌํ๋๊ฒ
์ข๋ ๊ฐ๋ณ๊ณ ํธ๋ฆฌํ์ง ์์๊น ? ๋ผ๋ ์๊ฐ์ ๋์ปค์ mysql ์ปจํ
์ด๋๋ฅผ ์ฌ๋ ธ๋ค.
๋์ปค๋ฅผ ์ค์นํ๋ค๋ ๊ณผ์ ํ์ ์์ฑํด๋ณด์๋ค.
๋ด ๊ฒฝ์ฐ๋ ์๋์ฐ๋ผ docker desktop ์ ๋ค์ด๋ก๋ ๋ฐ์ ์ฌ์ฉํ๋ค.
| mysql ์ด๋ฏธ์ง๋ฅผ ๋ด๋ ค๋ฐ๋๋ค.
docker pull mysql
| ์ปจํ ์ด๋๋ฅผ ์์ฑํ๊ณ ์คํํ๋ค.
docker run --name mysql -e MYSQL_ROOT_PASSWORD=<password> -d -p 3306:3306 mysql:latest
| mysql docker ์ ์
docker exec -it mysql-container bash
์ ์ ์์ ์ docker desktop ์์ ์ปจํ ์ด๋๋ฅผ ์คํ์์ผ์ค์ผ bash์ ์ ์ํ ์ ์๋ค.
๊ทธ ํ ๋น๋ฐ๋ฒํธ๋ฅผ ์ ๋ ฅํ๊ณ ์ ์ํ๋ฉด ์๋์๊ฐ์ด SHOW DATABASES๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ๋ณผ ์ ์๋ค.
์ฌ๊ธฐ ๊น์ง ๊ฐ๋จํ๊ฒ docker mysql ๊ตฌ์ฑ์ ์ฌํํ๊ฒ ํ๋ค.
๋ค์์ ์ค์ ์ฐ๊ฒฐ์ด ๋๋์ง ํ์ธํด๋ณด์
nestJS ์ mysql ์ฐ๋
nestJS - Database
๊ณต์๋ฌธ์๋ฅผ ์ฐธ๊ณ ํ๋ฉด ์ฌ์ค ๊ธ๋ฐฉ ์ฐ๊ฒฐํ ์ ์์ง๋ง ๋๋ DB ์ ๋ณด๋ฅผ ์จ๊ธธ ํ์๊ฐ ์์๊ณ ,
Database ๋ ๋ฐ๋ก ๋ถ๋ฆฌ์์ผ์ nestJS์ ํจํด์ ๋ง๊ฒ ์์
ํ๊ณ ์ถ์๋ค.
npm install --save @nestjs/typeorm typeorm mysql2
์ฐ์ typeorm์ ์ฌ์ฉํด์ ์ฟผ๋ฆฌ ์์ ์ ํ๊ธฐ์ํด ์์ ๊ฐ์ ํจํค์ง๋ฅผ ์ค์นํ๋ค.
npm install --save @nestjs/config joi
๊ทธ๋ฆฌ๊ณ ํ๊ฒฝ๋ณ์ ์ธํ ์ ์ํ config ์ ํ๊ฒฝ๋ณ์ ๊ฒ์ฌ๋ฅผ ์ํ joi ํจํค์ง๋ฅผ ์ ํํด์ ์ค์นํ๋ค.
// app.module.ts
import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import { Connection } from 'typeorm';
import { UserModule } from './user/user.module';
import { DataBaseService } from './database/database.service';
import { DatabaseModule } from './database/database.module';
import { ConfigModule, ConfigService } from '@nestjs/config';
import { AuthModule } from './auth/auth.module';
import * as Joi from 'joi';
@Module({
imports: [
ConfigModule.forRoot({
isGlobal: true,
validationSchema: Joi.object({
DATABASE_PORT: Joi.number().required(),
DATABASE_USER: Joi.string().required(),
DATABASE_PASSWORD: Joi.string().required(),
DATABASE_NAME: Joi.string().required(),
JWT_SECRET_KEY: Joi.string().required(),
}),
}),
TypeOrmModule.forRoot(
new DataBaseService(new ConfigService()).getTypeOrmConfig(),
),
UserModule,
DatabaseModule,
AuthModule,
],
controllers: [],
providers: [],
})
export class AppModule {
constructor(private connection: Connection) { }
}
๊ทธ๋ฆฌ๊ณ ๊ธฐ์กด nodejs ์์ ์ฌ์ฉํ๋ dotenv ๋์ nestjs์์ ์ ๊ณตํ๋ ConfigModule์ ์ด์ฉํด
env๋ฅผ ์ธํ
ํ๋ค.
ConfigModule.forRoot({
isGlobal: true,
validationSchema: Joi.object({
DATABASE_PORT: Joi.number().required(),
DATABASE_USER: Joi.string().required(),
DATABASE_PASSWORD: Joi.string().required(),
DATABASE_NAME: Joi.string().required(),
JWT_SECRET_KEY: Joi.string().required(),
}),
ConfigModule.forRoot๋ฅผ ์ด์ฉํ๋ฉด ์ด๋์๋ ํธ์ถํด์ ํ๊ฒฝ๋ณ์๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
isGlobal ์ต์
์ true ๋ก ์ค์ ์ ์ญ์ผ๋ก ์ฌ์ฉํ๊ฒ๋ ํ๋ค.
validationSchema ๋ฅผ ์ฌ์ฉํด ์๊น ์ค์นํ Joi๋ก ํ๊ฒฝ๋ณ์๋ฅผ ๊ฒ์ฌํ๋ค.
Database ์ฐ๊ฒฐ์ ์ํด์ TypeOrmModule์ ์ฌ์ฉํด์ผํ๋ค.
TypeOrmModule.forRoot(
new DataBaseService(new ConfigService()).getTypeOrmConfig(),
)
new DataBaseService ๋ ๋ด๊ฐ ๋ง๋ DataBase ์ฐ๊ฒฐ์ฉ ์๋น์ค ์ธ๋ฐ ์ฝ๋๋ ์ด๋ ๋ค.
// database/database.service.ts
import { Injectable } from '@nestjs/common';
import { ConfigService } from '@nestjs/config';
import { TypeOrmModuleOptions } from '@nestjs/typeorm';
@Injectable()
export class DataBaseService {
constructor(private readonly config: ConfigService) { }
public getTypeOrmConfig(): TypeOrmModuleOptions {
return {
type: 'mysql',
host: 'localhost',
port: +this.config.get('DATABASE_PORT'),
username: this.config.get('DATABASE_USER'),
password: this.config.get('DATABASE_PASSWORD'),
database: this.config.get('DATABASE_NAME'),
entities: ["dist/**/*.entity{.ts,.js}"],
synchronize: true,
autoLoadEntities: true,
};
}
}
๋ด ๊ฒฝ์ฐ ์์ง local ์์ ๊ฐ๋ฐํ๊ณ ์๊ธฐ ๋๋ฌธ์ host๋ localhost์ด๋ค.
synchronize ์ต์
์ prod ์์ ์ถ์ฒํ์ง ์๋๋ค.
ํ
์ด๋ธ์ ๋ฐ๋ก ๋ง๋ค์ด์ค์ ๋งค์ฐ ํธ๋ฆฌํ์ง๋ง ๋ฌธ์ ๊ฐ ์๊ธธ ์ ์์ผ๋ฏ๋ก ๊ณต์๋ฌธ์์์๋ prod ์์
์ง์ํ๋ผ๊ณ ํ๋ค.
autoLoadEntities ๋ฅผ ์ฌ์ฉํด ์ํฐํฐ๋ฅผ ์๋์ผ๋ก ๋ก๋ํ๋ค.
๋ด ์ํฐํฐ๋ ์ปดํ์ผ์ด ๋๋ dist ํด๋์ ๋ค์ด์์ด์ ๊ฒฝ๋ก๋ฅผ ์์ ๊ฐ์ด ์ค์ ํ๋ค.
๋๋จธ์ง ์ ๋ณด๋ ํ๊ฒฝ๋ณ์๋ก์ ConfigService.get() ๋ฉ์๋๋ฅผ ํตํด ๊ฐ์ ธ์ฌ ์ ์๋ค.
env ์ธํ ( ๋ณดํต์ dev , prod ๋ฅผ ๋๋๋ค. )
// .env
DATABASE_PORT=3306
DATABASE_USER=USER
DATABASE_PASSWORD=PASSWORD
DATABASE_NAME=NAME
database module ์์ providers ์ ์๋น์ค๋ฅผ ์ถ๊ฐํ๋๊ฑธ ๋นผ๋จน์ง ์๋๋ก ํ๋ค.
// database/database.module.ts
import { Module } from '@nestjs/common';
import { DataBaseService } from './database.service';
@Module({
providers: [DataBaseService],
})
export class DatabaseModule { }
docker mysql์ ์ผ์ ธ์๊ณ ์ธํ ๋ ๋๋ฌ์ผ๋ npm run start๋ฅผ ํด๋ณด๋ฉด...
์ ์์ ์ผ๋ก ๋ก๋๊ฐ ๋๋ฌ๋ค.
์ ์ด์ ์ ์์ ์ผ๋ก ์คํ๋์ง ์์ผ๋ฉด ์๋ฌ๋ฅผ ๋ฑ์ผ๋
์ค์ ๋ก ๋ฐ์ดํฐ ํ์ธ์ด๋ ํ
์ด๋ธ์ ํ์ธํด๋ณด๋ ค๋ฉด db ํด์ ์ด์ฉํด ํ์ธํ๋ฉด ๋๋ค.
ํด์์ ์ฐ๊ฒฐ์ ๋ณด๋ฅผ ์
๋ ฅํ๋ฉด
์ปค๋ฅ์
ํ
์คํธ ํ์๋ ์ฑ๊ณต์ ํ๋ค.
์ด๋๋ก ์๋ฃ๋ฅผ ํ๋ฉด ์ปค๋ฅํธ ์ฑ๊ณต !
์ฌ๊ธฐ๊น์ง ๋ด ์๋ฒ์ docker mysql์ ํตํด ์ฐ๋์ ์์ผฐ๋ค. !
์ด์ข๊ฒ ํ์ฌ์์ ๋ฐฑ์๋๋ก์ ํฌ์ง์
์ ํ์ด ๋๋ฉด์ php ๋ express ๊ฐ ์๋
๋ค๋ฅธ ํ๋ ์์ํฌ๋ก ์์
ํ๋๊ฑด ์ด๋ฒ ์ฌ์ด๋ ํ๋ก์ ํธ๊ฐ ์ฒ์์ธ๋ฐ,
NestJS๋ express ์ fastify ํ๋ ์์ํฌ๋ฅผ ํฉ์ณค๊ณ , ์๋ฐ ์คํ๋ง์ ํจํด์ ๊ทธ๋๋ก ๋ฐ๋ผ๊ฐ
ํ์ํ๊ฒ๋ค์ด ์ค๋น๋์ด์๊ณ ๋น ๋ฅด๊ณ ๊ฐ๊ฒฐํ๊ฒ ์ฝ๋๋ฅผ ๋๋ ์ ์์ฑํ ์ ์์ด์ ์ข์๊ฒ ๊ฐ๋ค.
๋ค์์ ์ ์ ๋ชจ๋์ ๋ง๋ค์ด ์์ฑํ๊ณ ๋ก๊ทธ์ธํ๋ ๊ณผ์ ๊น์ง ํด๋ณด๊ณ ์ํ๋ค.
ํต์ฌ๊ธฐ๋ฅ์ ๊ฐ๋ฐํ ์ถํ์ ์ญ์ ๋ ์์ ์ ์
๋ฐ์ดํธํ๋ ค๊ณ ํ๋ค.
์ฌ์ค ๋๋๊ฑด ์๋๊ณ ์์ผ๋ก ์ถ๊ฐํด์ผํ ์คํ๋ค์ด ๋ ๋ง๋ค. ๊ฐ๊ธธ์ด ๋ฉ๋ค๋ ๋ป..
์ด์จ๋ ์ค๊ณ๋๋ก ํ๋ฒ ์งํ์ ๊ณ์ ํด๋ณด๊ณ ์ ํ๋ค.
Author And Source
์ด ๋ฌธ์ ์ ๊ดํ์ฌ(๐ฅ BLOCKTRIP ํ๋ก์ ํธ -4 | DB ์ฐ๋), ์ฐ๋ฆฌ๋ ์ด๊ณณ์์ ๋ ๋ง์ ์๋ฃ๋ฅผ ๋ฐ๊ฒฌํ๊ณ ๋งํฌ๋ฅผ ํด๋ฆญํ์ฌ ๋ณด์๋ค https://velog.io/@tjehdgur1500/BLOCKTRIP-ํ๋ก์ ํธ-4-DB-์ฐ๋์ ์ ๊ท์: ์์์ ์ ๋ณด๊ฐ ์์์ URL์ ํฌํจ๋์ด ์์ผ๋ฉฐ ์ ์๊ถ์ ์์์ ์์ ์ ๋๋ค.
์ฐ์ํ ๊ฐ๋ฐ์ ์ฝํ ์ธ ๋ฐ๊ฒฌ์ ์ ๋ (Collection and Share based on the CC Protocol.)
์ข์ ์นํ์ด์ง ์ฆ๊ฒจ์ฐพ๊ธฐ
๊ฐ๋ฐ์ ์ฐ์ ์ฌ์ดํธ ์์ง
๊ฐ๋ฐ์๊ฐ ์์์ผ ํ ํ์ ์ฌ์ดํธ 100์ ์ถ์ฒ ์ฐ๋ฆฌ๋ ๋น์ ์ ์ํด 100๊ฐ์ ์์ฃผ ์ฌ์ฉํ๋ ๊ฐ๋ฐ์ ํ์ต ์ฌ์ดํธ๋ฅผ ์ ๋ฆฌํ์ต๋๋ค