NestJS의 Configuration 기능을 학습하고, 객체지향 패러다임을 적용할 겸 필자의 입맛대로 구현을 해본 프로젝트입니다.
Note
- 이 프로젝트는 NestJS의 환경 변수 관리 방법을 학습하고,
공식문서보다 타입 안전성과 유지보수성을 추가적으로 고려한 설계를 실습하기 위해 만들어졌습니다. - 단순히 공식 문서의 예제를 따라하는 것이 아닌, 실무에서 사용할 수 있는 수준의 구조와 패턴을 적용했습니다.
ConfigService를 직접 사용하지 않고 EnvironmentService로 감싸서 다음과 같은 이점을 제공합니다:
Note
- 타입 안전성:
keyof IEnvironment를 통한 컴파일 타임 검증 - 명확한 인터페이스:
getString(),getNumber(),getBoolean()등 타입별 메서드 제공 - 도메인 로직 캡슐화:
getApplicationPort(),isProduction()등 비즈니스 로직 포함 - 단일 책임 원칙: 환경 변수 관리에만 집중
// src/environment/environment.service.ts
@Injectable()
export class EnvironmentService {
getString(key: keyof IEnvironment): string | never;
getNumber(key: keyof IEnvironment): number | never;
getApplicationPort(): number;
isLocal(): boolean;
isDevelopment(): boolean;
isProduction(): boolean;
}런타임에 환경 변수의 유효성을 검증하여 애플리케이션 시작 시점에 오류를 조기 발견합니다:
// src/environment/environment.validation.ts
export const EnvironmentSchema = z.object({
ENV: z.enum([NODE_ENV.LOCAL, NODE_ENV.DEVELOPMENT, NODE_ENV.PRODUCTION, NODE_ENV.TEST]),
PORT: z.coerce.number().positive().optional(),
DATABASE_URL: z.string(),
});이번 프로젝트에서는 테스트 코드를 처음으로 환경 변수 관리에 적극적으로 적용해 보았습니다. 특히 EnvironmentService가 올바르게 동작하는지, 각 환경 변수에 타입 안전하게 접근되는지 단위 테스트를 통해 검증하고 있습니다.
Important
- 환경 변수는 애플리케이션의 핵심 설정 정보를 담고 있어 철저한 테스트가 필수라고 생각했습니다.
- 테스트를 통해 개발 및 배포 환경에서 안전하게 동작할 수 있도록 보장합니다.
주요 테스트 포인트:
- 정의되지 않은/잘못된 환경 변수 접근 시 예외 처리
- 각 타입별(
string,number,boolean) 접근 및 변환 검증 - 비즈니스 로직(
isProduction(),getApplicationPort()등) 정상 동작 여부
테스트 코드 예시:
// src/environment/__test__/environment.service.spec.ts
it('문자열 환경변수를 반환해야 한다.', () => {
mockConfigService.getOrThrow.mockReturnValue('local');
const result = environmentService.getString('ENV');
expect(result).toBe('local');
expect(mockConfigService.getOrThrow).toHaveBeenCalledWith('ENV');
});위와 같이 환경 변수의 타입 및 값 검증을 테스트 코드로 보장하므로
운영 환경에서도 신뢰할 수 있는 환경 변수 관리가 가능합니다.
pnpm install.env.example 파일을 참고하여 .env 파일을 생성합니다:
# NODE_ENV
ENV=local
# Prisma
DATABASE_URL="postgresql://postgres:postgres@localhost:5432/postgres?schema=public"Docker Compose를 사용하여 PostgreSQL 실행:
docker-compose up -dPrisma 마이그레이션 및 클라이언트 생성:
pnpm run prisma:generate# 개발 모드 (watch mode)
pnpm run start:dev
# 일반 실행
pnpm run start애플리케이션 실행 후 Swagger 문서를 확인할 수 있습니다:
http://localhost:9090/api-docs
# 유닛 테스트
pnpm run test
# 테스트 (watch mode)
pnpm run test:watch
# 테스트 커버리지
pnpm run test:cov# 린트 실행 및 자동 수정
pnpm run lint
# 코드 포맷팅
pnpm run format