nestjs 2. 모듈과 의존성 주입

agnusdei·2023년 7월 28일
0

모듈과 의존성 주입

NestJS 모듈 개념과 구성

NestJS는 애플리케이션을 모듈 기반 아키텍처로 구성합니다. 모듈은 관련된 컨트롤러, 서비스, 프로바이더 등을 그룹화하여 애플리케이션을 구성하는 데 사용됩니다. NestJS 애플리케이션은 최소한 하나 이상의 모듈을 가지며, 각 모듈은 독립적으로 동작하거나 다른 모듈과 함께 조합될 수 있습니다.

NestJS 모듈의 구성 요소:
1. Providers: 서비스를 생성하는 클래스 또는 프로바이더를 정의합니다. 프로바이더는 의존성 주입(Dependency Injection)을 통해 컨트롤러와 다른 서비스 등에서 사용됩니다.
2. Controllers: 요청과 응답을 처리하는 핸들러입니다. 컨트롤러는 서비스의 기능을 노출하고, 클라이언트로부터의 요청을 받아 처리한 뒤 응답을 반환합니다.
3. Imports: 다른 모듈을 가져와 현재 모듈과 결합합니다. 즉, 다른 모듈에서 제공하는 프로바이더나 컨트롤러를 현재 모듈에서 사용할 수 있게 합니다.
4. Exports: 현재 모듈에 정의된 프로바이더를 다른 모듈에서 사용할 수 있도록 외부에 공개합니다.

NestJS 애플리케이션의 최상위 모듈은 AppModule이며, main.ts에서 애플리케이션을 시작할 때 AppModule이 로드됩니다. 이후 다른 모듈들을 AppModule에 import하여 전체 애플리케이션을 구성합니다.

Prisma Client를 이용한 의존성 주입

Prisma Client는 Prisma ORM을 사용하여 데이터베이스와 상호작용하기 위해 필요한 도구입니다. NestJS 애플리케이션에서 Prisma Client를 사용하기 위해서는 의존성 주입을 설정해야 합니다.

  1. 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() 데코레이터로 표시되어 의존성 주입을 사용할 수 있도록 합니다. 또한, PrismaServicePrismaClient 클래스를 상속하여 Prisma Client의 인스턴스를 생성합니다.

  2. 모듈에서 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 {}

    위 예시에서 PrismaServiceproviders 배열에 등록하여 의존성 주입을 설정합니다.

  3. 서비스 또는 컨트롤러에서 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 인스턴스를 공유하고, 간편하게 데이터베이스를 조작할 수 있습니다.

profile
DevSecOps ⚙️ + Pentest 🚩

0개의 댓글