NestJS는 애플리케이션을 모듈 기반 아키텍처로 구성합니다. 모듈은 관련된 컨트롤러, 서비스, 프로바이더 등을 그룹화하여 애플리케이션을 구성하는 데 사용됩니다. NestJS 애플리케이션은 최소한 하나 이상의 모듈을 가지며, 각 모듈은 독립적으로 동작하거나 다른 모듈과 함께 조합될 수 있습니다.
NestJS 모듈의 구성 요소:
1. Providers: 서비스를 생성하는 클래스 또는 프로바이더를 정의합니다. 프로바이더는 의존성 주입(Dependency Injection)을 통해 컨트롤러와 다른 서비스 등에서 사용됩니다.
2. Controllers: 요청과 응답을 처리하는 핸들러입니다. 컨트롤러는 서비스의 기능을 노출하고, 클라이언트로부터의 요청을 받아 처리한 뒤 응답을 반환합니다.
3. Imports: 다른 모듈을 가져와 현재 모듈과 결합합니다. 즉, 다른 모듈에서 제공하는 프로바이더나 컨트롤러를 현재 모듈에서 사용할 수 있게 합니다.
4. Exports: 현재 모듈에 정의된 프로바이더를 다른 모듈에서 사용할 수 있도록 외부에 공개합니다.
NestJS 애플리케이션의 최상위 모듈은 AppModule
이며, main.ts
에서 애플리케이션을 시작할 때 AppModule
이 로드됩니다. 이후 다른 모듈들을 AppModule
에 import하여 전체 애플리케이션을 구성합니다.
Prisma Client는 Prisma ORM을 사용하여 데이터베이스와 상호작용하기 위해 필요한 도구입니다. NestJS 애플리케이션에서 Prisma Client를 사용하기 위해서는 의존성 주입을 설정해야 합니다.
Prisma Client 프로바이더 생성: Prisma Client를 사용하기 위해, Prisma 모듈과 함께 Prisma Client 프로바이더를 생성합니다. 이 프로바이더는 Prisma Client의 인스턴스를 제공합니다.
// prisma.service.ts
import { PrismaClient } from '@prisma/client';
import { Injectable } from '@nestjs/common';
@Injectable()
export class PrismaService extends PrismaClient {
constructor() {
super();
}
}
위 예시에서 PrismaService
클래스는 @Injectable()
데코레이터로 표시되어 의존성 주입을 사용할 수 있도록 합니다. 또한, PrismaService
는 PrismaClient
클래스를 상속하여 Prisma Client의 인스턴스를 생성합니다.
모듈에서 PrismaService 등록: PrismaService를 AppModule과 같은 모듈에서 등록하여 다른 컨트롤러와 서비스에서 사용할 수 있도록 해야 합니다.
// app.module.ts
import { Module } from '@nestjs/common';
import { PrismaService } from './prisma.service';
import { AppController } from './app.controller';
@Module({
controllers: [AppController],
providers: [PrismaService],
})
export class AppModule {}
위 예시에서 PrismaService
를 providers
배열에 등록하여 의존성 주입을 설정합니다.
서비스 또는 컨트롤러에서 PrismaService 사용: 이제 PrismaService
가 AppModule에 등록되었으므로, 다른 서비스나 컨트롤러에서 PrismaService
를 사용할 수 있습니다.
// user.service.ts
import { Injectable } from '@nestjs/common';
import { PrismaService } from './prisma.service';
@Injectable()
export class UserService {
constructor(private readonly prisma: PrismaService) {}
async getAllUsers() {
return this.prisma.user.findMany();
}
}
위 예시에서 UserService
클래스는 PrismaService
를 주입받아 Prisma Client를 사용하여 데이터베이스와 상호작용합니다.
이렇게 NestJS 애플리케이션에서 Prisma Client를 의존성 주입하여 모듈과 서비스, 컨트롤러들 간에 Prisma Client 인스턴스를 공유하고, 간편하게 데이터베이스를 조작할 수 있습니다.