๐TypeORM & ๐Configuring์ ํตํด TypeORM์ ๋ฑ๋กํด๋ณด์
๊ฐ์ฒด์ ๊ด๊ณํ ๋ฐ์ดํฐ ๋ฒ ์ด์ค์ ๋ฐ์ดํฐ๋ฅผ ์๋์ผ๋ก ๋ณํ ๋ฐ ์ฐ๊ฒฐํ๋ ์์ ์ผ๋ก orm์ ํ์ฉํ๋ฉด ๊ฐ๋ฐ์ ๊ฐ์ฒด์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ณํ์ ์ ์ฐํ๊ฒ ์ฌ์ฉํ ์ ์๋ค.
- ๋ชจ๋ธ ๊ธฐ๋ฐ์ผ๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค ํ ์ด๋ธ ์ฒด๊ณ๋ฅผ ์๋์ผ๋ก ์์ฑ
- ๋ฐ์ดํฐ ๋ฒ ์ด์ค์ ๊ฐ์ฒด ์ฝ๊ฒ ์ฝ์ , ์ ๋ฐ์ดํธ ๋ฐ ์ญ์ ๊ฐ๋ฅ
- ํ ์ด๋ธ ๊ฐ์ ๋งคํ(1:1,1:N,M:N)์ ๋ง๋ฆ
- ๊ฐ๋จํ CLI ๋ช ๋ น์ ์ ๊ณต
- typeorm์ ๊ฐ๋จํ ์ฝ๋ฉ์ผ๋ก ORM ํ๋ ์์ํฌ ์ฌ์ฉํ๊ธฐ ์ฝ๋ค
- typeorm์ ๋ค๋ฅธ ๋ชจ๋๊ณผ ์ฝ๊ฒ ํตํฉ๋๋ค.
1.npm install @nestjs/typeorm
2.npm install --save typeorm pg
config/typerom.cofig.ts
import { TypeOrmModuleOptions } from '@nestjs/typeorm'; export const typeORMConfig: TypeOrmModuleOptions = { type: 'postgres', host: 'localhost', port: 5432, username: 'postgres', password: '2qordjr10', database: 'board-app', entities: [__dirname + '/../**/*.entity.{js,ts}'], synchronize: true, };
- app.module์ ์ฐ๊ฒฐ
@Module({ imports: [ TypeOrmModule.forRoot(typeORMConfig), ], })
- app.module
import { Module } from '@nestjs/common'; import { GraphQLModule } from '@nestjs/graphql'; import { TypeOrmModule } from '@nestjs/typeorm'; import { RestaurantsModule } from './restaurants/restaurants.module'; @Module({ imports: [ GraphQLModule.forRoot({ autoSchemaFile: true, }), TypeOrmModule.forRoot({ type: 'postgres', host: 'localhost', port: 5432, username: 'minjaekim', password: '2qordjr10', database: 'minber-eats', synchronize: true, // ๋ฐ์ดํฐ ๋ฒ ์ด์ค์์ ๋ชจ๋์ ํ์ฌ์ํ๋ก ๋ง์ดํฌ๋ ์ด์ logging: false, }), RestaurantsModule, ], controllers: [], providers: [], }) export class AppModule {}
npm i --save @nestjs/config
npm i cross-env
"start:dev": "cross-env Env=dev nest start --watch"
- app.module
import { Module } from '@nestjs/common'; import { ConfigModule } from '@nestjs/config'; import { TypeOrmModule } from '@nestjs/typeorm'; @Module({ imports: [ ConfigModule.forRoot({ isGlobal: true, envFilePath: process.env.NODE_ENV === 'dev' ? '.env.dev' : '.env.test', }), TypeOrmModule.forRoot({ type: 'postgres', host: 'localhost', port: 5432, username: 'minjaekim', password: '2qordjr10', database: 'minber-eats', synchronize: true, logging: false, }), ], controllers: [], providers: [], }) export class AppModule {}
- isGlobal์ ์ดํ๋ฆฌ์ผ์ด์ ์ด๋์๋ config ๋ชจ๋ ์ ๊ทผ ๊ฐ๋ฅํ๋๋ก ํด์ฃผ๊ณ
- envFilePath์ ๋ณ์๋ฅผ ํ๊ฒฝ์ ๋ฐ๋ผ ๋ค๋ฅด๊ฒ ์ ๊ทผ ํ๋๋ก npm ํ๊ฒฝ ์ค์ ์ ํด ์ค ์ ์๋ค.
.env.dev
DB_HOST=localhost DB_PORT=5432 DB_USERNAME=minjaekim DB_PASSWORD=2qordjr10 DB_NAME=minber-eats]
- app.module
import { Module } from '@nestjs/common'; import { ConfigModule } from '@nestjs/config'; import { TypeOrmModule } from '@nestjs/typeorm'; @Module({ imports: [ ConfigModule.forRoot({ isGlobal: true, envFilePath: process.env.NODE_ENV === 'dev' ? '.env.dev' : '.env.test', ignoreEnvFile: process.env.NODE_ENV === 'prod', }), GraphQLModule.forRoot({ autoSchemaFile: true, }), TypeOrmModule.forRoot({ type: 'postgres', host: process.env.DB_HOST, port: +process.env.DB_PORT, username: process.env.DB_USERNAME, password: process.env.DB_PASSWORD, database: process.env.DB_NAME, synchronize: true, logging: true, }), RestaurantsModule, ], controllers: [], providers: [], }) export class AppModule {}
-ignoreEnvFile์ ์๋ฒ์ ๋ฐฐํฌํ ๋ ํ๊ฒฝ ๋ณ์ ํ์ผ ์ฌ์ฉํ์ง ์๋๋ก ํ์ฌ prod ํ๊ฒฝ์ผ ๋ ConfigModule์ ํ๊ฒฝ๋ณ์ ํ์ผ์ ๋ฌด์ํ๋ค.
"start": "cross-env NODE_ENV=prod nest start"
- scripts์ start๋ถ๋ถ cross-env NODE_ENV=prod ๋ฐฐํฌ ์์๋ง ๋๋๋ก ์ค์ ํ๊ธฐ
npm i joi
import * as Joi from 'joi';
ConfigModule.forRoot({
isGlobal: true,
envFilePath: process.env.NODE_ENV === 'dev' ? '.env.dev' : '.env.test',
ignoreEnvFile: process.env.NODE_ENV === 'prod',
validationSchema: Joi.object({
NODE_ENV: Joi.string().valid('dev', 'prod').required(),
DB_HOST: Joi.string().required(),
DB_PORT: Joi.string().required(),
DB_USERNAME: Joi.string().required(),
DB_PASSWORD: Joi.string().required(),
DB_NAME: Joi.string().required(),
TypeOrmModule.forRoot({
type: 'postgres',
host: process.env.DB_HOST,
// ์ซ์๊ฐ ๋ค์ด๊ฐ string(EX>"5302")์ num์ผ๋ก ๋ฐ๊พธ๊ธฐ ์ํด์+๋ฅผ ์์ ๋ถ์ฌ์ฃผ๋ฉด๋จ
port: +process.env.DB_PORT,
username: process.env.DB_USERNAME,
password: process.env.DB_PASSWORD,
database: process.env.DB_NAME,
synchronize: true,
logging: true,
}),
- ๐TypeORM์ ์ฐ๋ 2๊ฐ์ง ๋ฐฉ์๊ณผ & ๐Configuring ์ค์ ํ๋ ๋ฐฉ์์ ๋ํด์ ์์๋์
- ๋๊ผด๋ผ์ค ์ค ์ฐ๋ฒ์ด์ธ ๊ฐ์ ์ค:-