-
20221229목_공부일지> Backend/NestJS 2022. 12. 30. 08:06
1. 모듈 : 여러 컴포넌트를 조합해 좀 더 큰 작업을 수행할 수 있게 하는 단위.
-> NestJS에서는 하나의 루트 모듈이 존재하고, 이 루트 모듈(AppModule)를 다른 모듈로 쪼개서 구성
-> 이유: 각기 맡은 바 책임을 나누고 응집도를 높임 => MSA
-> @Module Decorator 사용
-> params 설명: imports : 해당 모듈에서 사용하기 위한 provider를 가지고 있는 다른 모듈 가져옴 ,
-> params 설명: exports : 해당 모듈을 어디에서나 가져다 쓸수 있게 선언
2. 전역 모듈 (Static Module): 공통 기능이나 DB 연결과 같은 전역으로 쓸수 있어야 할 경우 전역 모듈로 선언
-> @Global decorator로, 선언하고, Root Module에 한번만 등록하여 사용
3. Module 로 분리
-> UserModule > Provider(Service) 에 있던, EmailService 제거 후, EmailModule 생성하고, 해당 모듈에서 사용
-> UserModule > Controller에서 사용할 예정이기 떄문에, imports 진행
import { Module } from '@nestjs/common'; import { UsersService } from './users.service'; import { UsersController } from './users.controller'; import {EmailModule} from "../email/email.module"; @Module({ imports: [EmailModule], controllers: [UsersController], providers: [UsersService] }) export class UsersModule {}
nest g mo Email
=> EmailModule 는 다른 module (UserModule에서 사용할 예정이기 때문에, exports )
import { Module } from '@nestjs/common'; import {EmailService} from "./email.service"; @Module({ providers: [EmailService], exports: [EmailService] }) export class EmailModule {}
4. 동적 모듈을 활요한 환경 변수 구성 (p 99 ~)
=> 호스트 모듈 (UserModule && EmailModule) 을 가져다 쓰는 소비모듈에서 호스트 모듈을 생성할 때, 동적으로 어떤한 변수 / 값을 설정해서 사용하는 방식
1) .env (dotenv) 를 이용한 방식
env 파일을 생성해, 해당 파일에 중요 데이터를 설정하고, .gitIgnore 파일에 넣어주기 (중요)
=> .env 파일은 시크릿 키와 같이 민감한 정보가 저정되는 경우가 많기 떄문
2) 순서
=> 2-1) npm i --save dotenv
=> 2-1) npm i --save-dev @types/dotenv
=> 각 환경 변수를 .env 확장자를 가진 파일에 저장하고, 서버가 구동될 때이 파일을 읽어 해당 값을 환경 변수로 설정
=> 2-2) .env 파일 생성 (.development.env )
=> 2-2) 비슷한 형식으로 stage 및 prod 도 생성할 것
DATABASE_HOST = local GOOGLE_EMAIL = EmailService에서 개인 구글 이메일 GOOGLE_PW = EmailService에서 개인 구글 비밀번호
=> 2-3) package.json 내, start:dev 수정
"scripts": { "prebuild": "rimraf dist", "build": "nest build", "format": "prettier --write \"src/**/*.ts\" \"test/**/*.ts\"", "start": "nest start", "start:dev": "npm run prebuild && NODE_ENV=development nest start --watch", ... // 생략 },
=> 2-4) main.ts 수정
import { NestFactory } from '@nestjs/core'; import { AppModule } from './app.module'; import * as dotenv from 'dotenv'; import * as path from 'path'; dotenv.config({ path: path.resolve( (process.env.NODE_ENV === 'production') ? './env/.production.env' :(process.env.NODE_ENV === 'stage') ? './env/.stage.env' : './env/.development.env' ) }) // console.log(`ENV CHECK:::: ${ '/Users/heath/Desktop/personal_work/NestJS/NestJS-Book/01.nestjs101/env/.development.env' === path.resolve('./env/.development.env')}` ) // console.log(`ENV CHECK:::: ${path.resolve('./env/.development.env')}` ) async function bootstrap() { const app = await NestFactory.create(AppModule); await app.listen(3000); } bootstrap();
=> 2-4) AppController 테스트 함수 만들고, 터미널에서 테스트
@Get('/hello') // 경로중에 / 는 생략할 수 있다. getHello(): any { console.log('Hello::: ', process.env.DATABASE_HOST) // return this.appService.getHello(); return process.env.DATABASE_HOST }
input::: curl -X GET http://localhost:3000/hello
output:: local%
'> Backend > NestJS' 카테고리의 다른 글
230105목_공부일지 (0) 2023.01.05 230102월_공부일지 (0) 2023.01.02 221228수_공부일지 (0) 2022.12.29 20221227화_공부 일지 (0) 2022.12.28 20221222Thu_공부 일지 (0) 2022.12.23