2023. 7. 29. 19:15ใStudy_Develop/์ธํ๋ฐ - Slack ํด๋ก ์ฝ๋ฉ(๋ฐฑ์๋)
Nestjs ํ๊ฒฝ๋ณ์ (env) ์ค์ ๋ฐ ์ฌ์ฉ
๊ฐ์ฌ๋์ด ๊ฐ์ ์ค ๋ค๋๋ธ ๋ค๋๋ธ ๋ผ๊ณ ๋ง์ํ์๊ธธ๋
env๋ฅผ ์ ๋ค๋๋ธ๋ผ๊ณ ๋ถ๋ฅด์์ง? ์ถ์๋๋ฐ
dotenv = .env
์๊ฑฐ ์๋น ใ
dotenv๋?
์ฐ์ env๋, ์ ๋์ค ๋ฐ ์ ๋์ค ๊ณ์ด ์ด์ ์ฒด์ ์ฉ ์ ๋ช ๋ น์ด์ด๋ค. ํ๊ฒฝ๋ณ์์ ๋ชฉ๋ก์ ์ถ๋ ฅํ๊ฑฐ๋, ํ์กดํ๋ ํ๊ฒฝ์ ์์ ํ์ง ์๊ณ ๋ ๋ณ๊ฒฝ๋ ํ๊ฒฝ ๋ด์์ ๋ค๋ฅธ ์ ํธ๋ฆฌํฐ๋ฅผ ์คํํ๋๋ฐ ์ฌ์ฉํ ์ ์๋ค. env๋ฅผ ์ฌ์ฉํจ์ผ๋ก์จ ๋ณ์๋ฅผ ์ถ๊ฐํ๊ฑฐ๋ ์ ๊ฑฐํ ์ ์์ผ๋ฉฐ, ๊ธฐ์กด ๋ณ์๋ ์๋ก์ด ๊ฐ์ ์ด๋ค์ ํ ๋นํจ์ผ๋ก์จ ๋ณ๊ฒฝํ ์ ์๋ค.
dotenv๋ ํ๊ฒฝ๋ณ์๋ฅผ .env๋ผ๋ ํ์ผ์ ์ ์ฅํ๊ณ
process.env๋ก ๋ก๋ํ๋ ์์กด์ฑ ๋ชจ๋์ด๋ค.
์ด๋ฅผ ์ฌ์ฉํ๋ ์ด์ ๋ก๋ ๊ฐ๋ฐ๊ณผ์ ์์ ์ฌ์ฉ๋๋ ๊ณ ์ ํ api key๊ฐ ๋ฑ ๋ฏผ๊ฐํ ์ ๋ณด์ ๋ณด์์ ์ํด์์ด๋ค.
๋ง์ฝ, ๊นํ๋ธ ๊ฐ์ด ์คํ์์ค์ ๊ณต๊ฐ๋๋ฆฌ ๊ฒฝ์ฐ์ ํดํน์ ๋นํ ์ํ์ด ์๊ธฐ ๋๋ฌธ์ ๋ฏผ๊ฐํ ์ ๋ณด์ ๊ฒฝ์ฐ์ .env๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค.
1. ํจํค์ง ์ค์น
$ npm i --save @nestjs/config
-> ํ๊ฒฝ ๋ณ์ ๊ด๋ฆฌ๋ฅผ ์ํด config ํจํค์ง๋ฅผ ์ค์นํ๋ค.
2. ConfigModule์ค์
import { ConfigModule } from '@nestjs/config';
@Module({
imports: [ConfigModule.forRoot()],
})
- ์ค์นํ configํจํค์ง ์ค์ ์ ์ถ๊ฐํ๋ค.
- AppModule์์ ์ง์ import ํด๋ ์๊ด ์๋๋ฐ, ConfigModule์ค์ ๋ถ๋ถ์ด ์ฝ๋๊ฐ ๋ง์์ง๋ ๊ฒฝ์ฐ, APpModule์ด ๋ณต์กํด ๋ณด์ผ ์๋ ์์ด ๋ณ๋์๋๋ ํ ๋ฆฌ๋ฅผ ๋ง๋ค๊ณ ConfigurationModule ์ ๋ง๋ค์ด์ AppModule์์ import ํ๋๋ก ์ค์ ํ๋ค.
3. ํ๊ฒฝ ๋ณ์ ์ ์
.env>
SECRET = ์ ๋ก์ด๋ฐ๋ณด
PORT = 3030
- ํ๋ก์ ํธ a-nest ํด๋์ .envํ์ผ์ ๋ง๋ค๊ณ , ์์ ๊ฐ์ด ํ๊ฒฝ ๋ณ์๋ฅผ ์ค์ ํ ์ ์๋ค.
- ๋ณ๋์ ์ต์ ์ ๋ช ์ํ์ง ์๋ ๊ฒฝ์ฐ, envํ์ผ์ ํ๊ฒฝ๋ณ์๊ฐ ์๋ค๊ณ ์๋ฌต์ ์ผ๋ก ์ฝ์์ด ๋์ด ์๋ค.
- ํ๊ฒฝ๋ณ์๋ฅผ ์ฐธ์กฐํ ํ์ผ path๋ฅผ ๋ณ๊ฒฝํ๊ณ ์ถ์ผ๋ฉด envFilePath์ต์ ์ผ๋ก ์ค์ ์ ๋ฐ๊พธ๋ฉด ๋๋ค.
4. ํ๊ฒฝ ๋ณ์ ์ฌ์ฉ
app.module.ts>
@Get()
getHello(){
return this.appService.getHello();
}
app.service.ts>
@Injectable()
export class AppService {
async getHello() {
return process.env.SECRET;
}
}
process.env๋ง๊ณ , @nestjs/config๋ฅผ ์ฌ์ฉํด์ผ ํ๋ ์ด์
dotenv๋ง ์ฐ๋ฉด ๋์ง @nest/config๋ฅผ ์ ์ฌ์ฉํด์ผ ํ๋์??
nest์ ๊ฐ์ ํ๋ ์์ํฌ์์๋ ์ต์ํ test/dev/prod ์ธ ํ๊ฒฝ์์ ์คํํ๊ฒ ๋๋๋ฐ
๊ฐ ํ๊ฒฝ๋ง๋ค ๋ค๋ฅธ ํ๊ฒฝ ๋ณ์๋ฅผ ์ฌ์ฉํ ํ์๊ฐ ์๋ค.
์์ ์ฒ๋ผ dev/prod ๋จ ๋ ํ๊ฒฝ๋ง ์์๋ค๋ฉด ์ด๋ ํ๊ฒฝ์ธ์ง ๊ฐ๋จํ๊ฒ ์ฒดํฌํ๊ธฐ๋ง ํ์ด๋ ๋์์ง๋ง
์ด์ ๋ ์ ์ฐจ ํ๊ฒฝ์ด ๋ถํ๋๊ณ ์๊ธฐ์ @nestjs/config๋ฅผ ํตํด์ ๋ค์ํ ํ๊ฒฝ์ ๋ค์ํ ํ๊ฒฝ๋ณ์๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข๋ค.
๋ฌผ๋ก , nest ํ๋ ์์ํฌ๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ์๋ ๋ค์ํ ํ๊ฒฝ์ ์ ํฉํ ํ๊ฒฝ ๋ณ์๋ฅผ ๋ถ๋ฌ์ค๋ ๋ฐฉ๋ฒ์ด ์๋ค.
if (process.env.NODE_ENV === 'production') {
module.exports = require('./prod');
} else if (process.env.NODE_ENV === 'testing') {
module.exports = require('./test');
} else {
module.exports = require('./dev');
}
์๋ฐ ๋ฐฉ์์ผ๋ก ๋ณ๋์ ํ๊ฒฝ ๋ณ์๋ฅผ requireํ๋ ๋ฐฉ์๋ ์๋ค.
but, ํ์ฌ nest ํ๋ ์์ํฌ๋ฅผ ์ด์ฉํด ํ๋ก์ ํธ๋ฅผ ์งํํ๊ณ ์๋ค๋ฉด,
๊ตณ์ด ์ด๋ฐ ๋ฐฉ์์ ์ฌ์ฉํ ํ์๊ฐ ์๋ค.
๋ํ ์์กด์ฑ ์ฃผ์ ํ ๋, ํ๊ฒฝ๋ณ์ ๊ฐ์ ์์ ์์ฌ๋ก ์ฌ์ฉ๊ฐ๋ฅ!
๋ฐ๋ผ์!
service.ts>
return process.env.SECRET;
process.env๋ฅผ ์ง์ ๊ฐ์ ธ๋ค๊ฐ ์ฐ๊ธฐ๋ณด๋ค๋,
์ด๊ฒ๋ง์ ๋ configService์ ์ฐ๋๊ฒ ์ข์!
service.ts>
@Injectable()
export class AppService {
constructor (private readonly configService: ConfigService){
}
getHello() : string {
return this.configService.get('DB_PASSWORD');
//process.env.DB_PASSWORD
}
}
์๋ฐ ๋ฐฉ์!
DB_PASSWORD ์ ๋ณด๋ .env์์ ์๋ค.
- process.env ๋์ ConfigService๋ฅผ ์ฐ๋ ๊ฒ์ด ์ข๋ค.
- process.env๋ ์ธ๋ถ๊ฐ์ฒด๋ก ํ๊ฒฝ๋ณ์ ๊ฐ์ฒด์ธ๋ฐ ์ด๊ฒ๋ง์ ๋ nest๊ฐ ๊ด๋ฆฌํ ์ ์๋๋ก ํด์ค๋ค.
์์ ์์ฌ๋ก ํ๊ฒฝ๋ณ์๋ฅผ ๋ฐ๊ฟ ์ ์์
์ธ๋ถ์์ ์์ฒญ์ ๊ฐ์ ธ์ ๋ด config๋ก ๋ง๋๋ ๋น๋๊ธฐ ์์ ํ๋ ๋ฐฉ๋ฒ์ ?
-> load๋ผ๋ ๊ฒ์ ์ฌ์ฉํ๋ฉด ๋จ!
const getEnv = async () => {
const response = await axios.get('/๋น๋ฐํค์์ฒญ')
//์ธ๋ถ ์๋ฒ๋ก๋ถํฐ ๋น๋ฐํค๋ฅผ ์์ฒญํด์
return response.data;
//๊ทธ๊ฒ์ ๋ํ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์จ๋ค
};
@Module({
imports: [ConfigModule.forRoot({ isGlobal: true, load: [getEnv] })],
controllers: [AppController],
providers: [AppService, ConfigService],
})
์ด๋ฐ ๋ฐฉ์์ด๋ค.
'Study_Develop > ์ธํ๋ฐ - Slack ํด๋ก ์ฝ๋ฉ(๋ฐฑ์๋)' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
ํ๋ก๊ทธ๋๋จธ์ค - ๋ฐฐ์ด ๋ง๋ค๊ธฐ 2 - js (everyํจ์, continue) (0) | 2023.08.04 |
---|---|
loggerMiddleware๋ก morgan์ฒ๋ผ ๋ก๊น ํ๊ธฐ (0) | 2023.07.31 |
Nest.js ์ controller๊ธฐ๋ณธ ๋ฐ ์ฅ์ (0) | 2023.07.29 |
Nest JS Hot reload ์ค์ ํ๊ธฐ (0) | 2023.07.28 |