NestJS 의존성 주입 예제

SEUNGJUN·2024년 6월 23일
0

NestJS

목록 보기
6/8

NestJS에서의 데이터를 저장할때 기존에 메모리로 관리하던 데이터를 DB에 저장을 해야하는 상황이 있다고 가정해보자. 이때 DI를 활용하여 데이터 저장 방식을 편리하게 전환하게 할수가 있다.

예시 설명

1. 서비스 인터페이스 설정

먼저, 데이터 저장 및 조회 기능을 정의하는 서비스의 인터페이스를 만든다. 이를 통해 구체적인 데이터 저장 방식에 대한 의존성을 분리할 수 있다.

// data.service.ts
export interface DataService {
    saveData(data: any): void;
    getData(): any;
}
  • DataService 는 데이터 저장 및 조회 기능을 정의하는 인터페이스이다. 이 인터페이스는 구체적인 데이터 저장 방식(메모리, 데이터베이스 등)에 대한 의존성을 분리하는 역할을 한다.

2. 메모리 서비스 구현

초기에는 메모리에 데이터를 저장하는 서비스를 구현한다.

// memory-data.service.ts
import { Injectable } from '@nestjs/common';
import { DataService } from './data.service';

@Injectable()
export class MemoryDataService implements DataService {
    private data: any = null;

    saveData(data: any): void {
        this.data = data;
    }

    getData(): any {
        return this.data;
    }
}
  • MemoryDataServiceDataService 인터페이스를 구현하는 클래스이다. 초기에는 메모리에 데이터를 저장하고 조회하는 단순한 방식을 제공한다.

  • @Injectable() 데코레이터를 사용하여 NestJS에 의해 관리되는 서비스로 등록된다.

  • saveData(data: any) 메서드는 받은 데이터를 메모리에 저장한다.

  • getData() 메서드는 저장된 데이터를 반환한다.

3. 데이터베이스 서비스 구현

나중에 데이터베이스로 교체할 경우, 동일한 인터페이스를 구현하는 데이터베이스 서비스를 작성한다.

// database-data.service.ts
import { Injectable } from '@nestjs/common';
import { DataService } from './data.service';
import { Connection } from 'typeorm'; // 예시로 TypeORM 사용

@Injectable()
export class DatabaseDataService implements DataService {
    constructor(private connection: Connection) {}

    saveData(data: any): void {
        // 예시로 TypeORM을 사용하여 데이터베이스에 저장하는 로직
        // this.connection.manager.save(data);
    }

    getData(): any {
        // 예시로 TypeORM을 사용하여 데이터베이스에서 데이터 조회하는 로직
        // return this.connection.manager.find(...);
    }
}
  • DatabaseDataServiceDataService 인터페이스를 구현하는 클래스이다 데이터 베이스에 데이터를 저장하고 조회하는 기능을 제공한다.

  • constructor(private connection: Connection)을 통해 TypeORM의 Connection 객체를 주입받아 데이터베이스와 연동한다.

4. 모듈 설정

데이터 서비스를 NestJS 모듈에서 설정하고, 필요에 따라 주입할 구현체를 선택한다.

// data.module.ts
import { Module } from '@nestjs/common';
import { DataService } from './data.service';
import { MemoryDataService } from './memory-data.service'; // 초기 메모리 서비스
// import { DatabaseDataService } from './database-data.service'; // 나중에 DB 서비스로 교체

@Module({
    providers: [
        { provide: DataService, useClass: MemoryDataService }, // 초기는 메모리 서비스로 설정
        // { provide: DataService, useClass: DatabaseDataService }, // 나중에 DB 서비스로 교체
    ],
    exports: [DataService],
})
export class DataModule {}
  • DataModule 은 NestJS 모듈로, 데이터 서비스 관리를 담당한다.

  • providrs 배열에는 DataService를 제공할 서비스를 등록한다.

    • 초기에는 메모리 서비스(MemoryDataService)를 제공하기 위해 { provide: DataService, useClass: MemoryDataService }를 사용한다.
    • 필요에 따라 주석 처리된 부분처럼 나중에 데이터베이스 서비스(DatabaseDataService)로 교체할 수 있다.

5. 사용

// app.controller.ts (예시)
import { Controller, Post, Body, Get } from '@nestjs/common';
import { DataService } from './data.service';

@Controller('data')
export class AppController {
    constructor(private readonly dataService: DataService) {}

    @Post()
    async saveData(@Body() data: any) {
        await this.dataService.saveData(data);
        return 'Data saved.';
    }

    @Get()
    async getData() {
        return await this.dataService.getData();
    }
}
  • AppController는 HTTP 요청을 처리하는 NestJS 컨트롤러 이다.

  • constructor(private readonly dataService: DataService)를 통해 DataService를 주입받아 사용한다.

위의 코드들은 NestJS에서 DI를 활용하여 다양한 데이터 저장 방식(메모리, 데이터베이스)을 관리하는 예제를 보여준다. DataModule을 통해 초기에는 메모리 서비스를 제공하며, 필요에 따라 데이터베이스 서비스로 간편하게 교체할 수 있다.

profile
RECORD DEVELOPER

0개의 댓글