NestJS에서의 데이터를 저장할때 기존에 메모리로 관리하던 데이터를 DB에 저장을 해야하는 상황이 있다고 가정해보자. 이때 DI를 활용하여 데이터 저장 방식을 편리하게 전환하게 할수가 있다.
먼저, 데이터 저장 및 조회 기능을 정의하는 서비스의 인터페이스를 만든다. 이를 통해 구체적인 데이터 저장 방식에 대한 의존성을 분리할 수 있다.
// data.service.ts
export interface DataService {
saveData(data: any): void;
getData(): any;
}
DataService
는 데이터 저장 및 조회 기능을 정의하는 인터페이스이다. 이 인터페이스는 구체적인 데이터 저장 방식(메모리, 데이터베이스 등)에 대한 의존성을 분리하는 역할을 한다.초기에는 메모리에 데이터를 저장하는 서비스를 구현한다.
// 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;
}
}
MemoryDataService
는 DataService
인터페이스를 구현하는 클래스이다. 초기에는 메모리에 데이터를 저장하고 조회하는 단순한 방식을 제공한다.
@Injectable()
데코레이터를 사용하여 NestJS에 의해 관리되는 서비스로 등록된다.
saveData(data: any)
메서드는 받은 데이터를 메모리에 저장한다.
getData()
메서드는 저장된 데이터를 반환한다.
나중에 데이터베이스로 교체할 경우, 동일한 인터페이스를 구현하는 데이터베이스 서비스를 작성한다.
// 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(...);
}
}
DatabaseDataService
는 DataService
인터페이스를 구현하는 클래스이다 데이터 베이스에 데이터를 저장하고 조회하는 기능을 제공한다.
constructor(private connection: Connection)
을 통해 TypeORM의 Connection
객체를 주입받아 데이터베이스와 연동한다.
데이터 서비스를 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
를 제공할 서비스를 등록한다.
// 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을 통해 초기에는 메모리 서비스를 제공하며, 필요에 따라 데이터베이스 서비스로 간편하게 교체할 수 있다.