ํฐ์คํ ๋ฆฌ ๋ทฐ
NestJS๋ก ํ๋ก์ ํธ ๋ง๋ค์ด๋ณด๊ธฐ - 4 (configuration ์ ์ฉ)
๋๋์ด๋ฐ๐พ 2023. 2. 22. 00:03
์ด๋ ์ธ์ด์ด๋๊ฐ์ ํ๊ฒฝ๋ณ์ ๊ฐ, ์ฆ configuration ์ด๋ผ๋ ๋ชจ๋์ ์ฌ์ฉํ๊ฒ ๋๋๋ฐ, Nest.js์์๋ configuration ๋ชจ๋์ ์ ๊ณตํด์ฃผ๊ณ ์์ผ๋ฉฐ, ํด๋น ๋ชจ๋์ dotenv ๋ชจ๋์ ๊ธฐ๋ฐํด์ ์๋ํฉ๋๋ค.
๊ณตํต์ผ๋ก ์ฌ์ฉํด์ผํ ๋ณ์ ๊ฐ์ด๊ฑฐ๋ ํน์ ๊ฐ๋ฐ๋ ๋ฒจ (ํ๋ก๋์ , ๊ฐ๋ฐ, ํ ์คํ ๋ฑ๋ฑ..) ์ ๋ฐ๋ฅธ ๋ค๋ฅธ ํ๊ฒฝ๋ณ์๋ฅผ ๊ฐ์ ธ์ผํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ผ๋ฏ๋ก ํ๋ก์ ํธ๋ฅผ ๊ตฌ์ฑํ ๋ ๊ฑฐ์ ๋๋ถ๋ถ ์ ํ ํ๊ฒ ๋๋ ๋ชจ๋์ ๋๋ค. ์ด์ ์ ํฌ์คํ ํ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ์ ๋ณด๊ฐ์ ๊ฒฝ์ฐ๋ config ํ์ผ๋ก ๋ฐ๋ก ๊ด๋ฆฌํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์์ ํด๋น ๋ชจ๋์ ๋จผ์ ์ ํ ํ๊ณ ๋์ด๊ฐ๊ณ ์ ํฉ๋๋ค.
1. @nestjs/config ๋ชจ๋ ์ธ์คํจ
$ npm i --save @nestjs/config
or
$ yarn add @nestjs/config
nestjs์์ ๊ณต์์ผ๋ก ์ ๊ณตํด์ฃผ๋ ๋ชจ๋์ ์ธ์คํจํฉ๋๋ค. ํด๋น ํจํค์ง๋ ๋ด๋ถ์ ์ผ๋ก ์์ ๋ง์๋๋ ธ๋ค์ํผ dotenv๋ฅผ ์ฌ์ฉํฉ๋๋ค.
2. ๋ชจ๋์ ์ ์ฉํ๊ธฐ (Getting Started)
๊ณต์ ๋ฌธ์์์ ๊ฐ์ด๋ํ๋ ๋ฐฉ๋ฒ์ด ์ฌ๋ฌ๊ฐ์ง์ ๋๋ค. ๊ธฐ๋ณธ์ ๊ณต(Getting Started)์์๋ ์ด์๊ฐ์ด ๊ฐ์ด๋ํฉ๋๋ค.
app.module.ts
import { Module } from '@nestjs/common';
import { ConfigModule } from '@nestjs/config';
@Module({
imports: [ConfigModule.forRoot()],
})
export class AppModule {}
์์ ์ฝ๋๋ ๊ธฐ๋ณธ ์์น(ํ๋ก์ ํธ ๋ฃจํธ ๋๋ ํฐ๋ฆฌ)์์ .env ํ์ผ์ ๋ก๋ ๋ฐ ๊ตฌ๋ฌธ ๋ถ์ํ๊ณ .env ํ์ผ์ ํค/๊ฐ ์์ process.env์ ํ ๋น๋ ํ๊ฒฝ ๋ณ์์ ๋ณํฉํ๊ณ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ์ธ ๊ตฌ์กฐ์ ์ ์ฅํฉ๋๋ค.
@nestjs/config๋ dotenv์ ์์กดํ๊ธฐ ๋๋ฌธ์ ํ๊ฒฝ ๋ณ์ ์ด๋ฆ์ ์ถฉ๋์ ํด๊ฒฐํ๊ธฐ ์ํด ํด๋น ํจํค์ง์ ๊ท์น์ ์ฌ์ฉํฉ๋๋ค.
ํค๊ฐ ๋ฐํ์ ํ๊ฒฝ์ ํ๊ฒฝ ๋ณ์๋ก ์กด์ฌํ๋ ๊ฒฝ์ฐ(์: export DATABASE_USER=test์ ๊ฐ์ OS ์ ธ ๋ด๋ณด๋ด๊ธฐ๋ฅผ ํตํด) ๋ฐ .env ํ์ผ์ ์๋ ๊ฒฝ์ฐ ๋ฐํ์ ํ๊ฒฝ ๋ณ์๊ฐ ์ฐ์ ํฉ๋๋ค.
๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ ๊ฐ์ด๋ ๋ฐฉ๋ฒ์ด ์๊ณ , ์ ๋ ์ ์ด์ ์ดํ๋ฆฌ์ผ์ด์
์์์์ DB๋ฅผ ์ฐ๋์ํค๊ธฐ ๋๋ฌธ์
DB module์์ config๋ฅผ ๋ก๋ํ๊ณ , ๊ทธ ์ดํ์ ๋ก๋๋ config ๊ฐ์ ๊ฐ์ง๊ณ DB ์ฐ๊ฒฐ์ ๋จผ์ ์งํํ์์ต๋๋ค.
3. DB ๋ชจ๋ ์์ฑ
src/common/db.module.ts
import { Module } from '@nestjs/common';
import {ConfigModule, ConfigService} from '@nestjs/config';
import configuration from '@Common/configuration';
import {TypeOrmModule} from '@nestjs/typeorm';
import * as Joi from 'joi';
@Module({
imports: [
ConfigModule.forRoot({
isGlobal: true,
load: [configuration],
envFilePath: process.env.NODE_ENV == 'local' ? '.env' : process.env.NODE_ENV == 'development' ? '.env.development' : '.env.production',
validationSchema: Joi.object({ // ํ๊ฒฝ๋ณ์ ์ ํจ์ฑ ์ฒดํฌ
NODE_ENV: Joi.string().valid('local','development', 'production', 'testing', 'staging').required(),
DATABASE_HOST: Joi.string().required(),
DATABASE_PORT: Joi.string().required(),
DATABASE_USER: Joi.string().required(),
DATABASE_PASSWORD: Joi.string().required(),
DATABASE_NAME: Joi.string().required(),
})
}),
TypeOrmModule.forRootAsync({
imports: [ConfigModule],
inject: [ConfigService],
useFactory: async (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'),
legacySpatialSupport: false,
logging: true,
acquireTimeout: 5000,
charset: 'UTF8MB4_GENERAL_CI',
entities: ['dist/**/*.entity.{ts,js}'], // Entity ์ฐ๊ฒฐ
synchronize: false, //true ๊ฐ์ ์ค์ ํ๋ฉด ์ดํ๋ฆฌ์ผ์ด์
์ ๋ค์ ์คํํ ๋ ์ํฐํฐ์์์ ์์ ๋ ์ปฌ๋ผ์ ๊ธธ์ด ํ์
๋ณ๊ฒฝ๊ฐ๋ฑ์ ํด๋น ํ
์ด๋ธ์ Dropํ ํ ๋ค์ ์์ฑ
extra: {
connectionLimit: configService.get('CONNECTION_LIMIT')
}
}),
}),
],
})
export class DatabaseModule {}
์ด์ ์ ๋ฃจํธ๋ชจ๋์์ ConfigModule์ ์ด์ฉํด config๊ฐ์ ๋ก๋ํ๋ฉด ConfigService๋ฅผ ์ฃผ์ ๋ฐ์ ์ ์๋๋ฐ, ๊ทธ ์ดํ์๋ ConfigService ๊ฐ์ฒด๋ฅผ ํตํด config์ ๊ฐ์ ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค.
envFilePath๋ฅผ ํตํด NODE_ENV๊ฐ์ ๋ฐ๋ฅธ ์ฐธ์กฐ ํ๊ฒฝ๋ณ์ ํ์ผ์ ๋ค๋ฅด๊ฒ ๊ฐ์ ธ์ฌ ์ ์๊ฒ๋ ํ์์ต๋๋ค.
.env
# #MYSQL
DATABASE_HOST = localhost
DATABASE_USER = root
DATABASE_NAME = store
DATABASE_PASSWORD = root
DATABASE_PORT = 3306
DATABASE_LOGGING = true
CONNECTION_LIMIT=15
ํ๋ก์ ํธ ๋ฃจํธ์ ์ด์๊ฐ์ด env ํ์ผ์ ์์ฑํ๋ฉด ConfigModule์์ ํ๋ก์ ํธ ๋ฃจํธ์ ์๋ ํด๋น ํ๊ฒฝ๋ณ์ ํ์ผ์ ๋ก๋ํ๊ฒ๋ฉ๋๋ค.
4. ๋ฃจํธ๋ชจ๋์ DB๋ชจ๋ import ๋ฐ ํ ๋ชจ๋์์ configService ์ฌ์ฉ
DB ์ฐ๊ฒฐ์ ์ดํ๋ฆฌ์ผ์ด์ ์์ ์์ ํ์ํ๊ธฐ๋๋ฌธ์ ์๋์ ๊ฐ์ด import ํฉ๋๋ค.
app.module.ts
import { DatabaseModule } from '@Common/db.module';
import { Module } from '@nestjs/common';
import { OrderModule } from '@Order/order.module';
import {TypeOrmModule} from '@nestjs/typeorm';
@Module({
imports: [
DatabaseModule,
TypeOrmModule.forFeature([]),
OrderModule,
]
})
export class AppModule {}
DatabaseModule์ ๋ชป๊ฐ์ ธ์ค๋ฉด ์ดํ๋ฆฌ์ผ์ด์ ์คํ ์๋ฌ๊ฐ ๋จ์ด์ง๊ฒ๋๋ค. ๊ทธ๋ฆฌ๊ณ ํด๋น ๋ชจ๋์์ ConfigModule๋ ๊ฐ์ด importํ๊ธฐ๋๋ฌธ์ ์ ์์คํ๋๋ค๋ฉด ๋ค๋ฅธ ๋ชจ๋์์๋ ConfigService๋ฅผ ์ฃผ์ ํ์ฌ ์ฌ์ฉํ ์ ์์ต๋๋ค.
src/order/services/order.service.ts
import { Injectable } from '@nestjs/common';
import {ConfigService} from '@nestjs/config';
@Injectable()
export class OrderService {
constructor(
private readonly config: ConfigService
) {
console.log(config.get("database.host"))
}
}
๋ฌผ๋ก ์ฌ๊ธฐ์ ์ config๊ฐ์ด ํ์ํ๊ฑด ์๋์ง๋ง ์์๊ฐ์ด ConfigService๋ฅผ ๋ฐ๋ก ์ฃผ์ ๋ฐ์์ config ๊ฐ์ ์ฐธ์กฐ ๊ฐ๋ฅํ๊ฒ๋ฉ๋๋ค.
'Node.js > Nest.js' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
NestJS๋ก ํ๋ก์ ํธ ๋ง๋ค์ด๋ณด๊ธฐ - 3 (DB์ฐ๋) (0) | 2023.02.16 |
---|---|
NestJS๋ก ํ๋ก์ ํธ ๋ง๋ค์ด๋ณด๊ธฐ - 2 (๋๋ ํ ๋ฆฌ๊ตฌ์ฑ) (0) | 2023.02.14 |
NestJS๋ก ํ๋ก์ ํธ ๋ง๋ค์ด๋ณด๊ธฐ - 1 (nestjs/cli) (0) | 2023.02.10 |
- Total
- Today
- Yesterday
- Promise error
- android
- nestjs project
- ๊ธฐ์์ฒญAPI
- @nestjs/config
- Spring
- typeorm
- docker mysql
- nestjs doc
- sequelize
- nestjs typeorm
- nestjs directory
- typeorm ์ฐ๊ฒฐ
- Spring Async
- ๋น๋๊ธฐ ์์ฒญ
- Request_Limit_Exceeded
- nestjs/cli
- Promise bulk
- node.js
- DeferredResult
- ํ๋ก๊ทธ๋๋จธ์ค
- ์๊ณ ๋ฆฌ์ฆ
- NestJS
- foreignkey
- node.js backend
- nestjs configService
- nestjs module
- nestjs config
- JavaScript
- backend-framework
์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |