[nest.js] 7. 모듈로 코드 정리하기

적자생존·2024년 3월 26일

nest.js

목록 보기
5/6

1. 파일 생성

computer라는 app을 만들 것이다.

파워모듈을 만들고 power service를 제공한다.
cpu와 디스크 모듈을 만들고 전력이 들어올 때만 작동하며 power module에 있는 서비스의 코드를 참조한다.
이후 cpu와 디스크 모듈이 준비되면 최상위의 컴퓨터 모듈이 이를 사용한다.

nest new di 로 프로젝트를 생성하고
main.ts를 제외한 파일을 지운다음

nest g module computer
nest g module cpu
nest g module disk
nest g module power

를 이용하여 모듈을 만들어주고

nest g service cpu
nest g service disk
nest g service power

를 이용하여 서비스를 생성한 뒤

nest g controller computer

computer 컨트롤러를 만들어준다.

이후 main.ts에서 기본 app.moudule을 ComputerModule로 교체한다.

import { NestFactory } from '@nestjs/core';
import { ComputerModule } from './computer/computer.module';

async function bootstrap() {
  const app = await NestFactory.create(ComputerModule);
  await app.listen(3000);
}
bootstrap();

2. 다른 모듈에 의존성 주입하기

우선 파워모듈에 supplyPower()를 만들어주고 해당 서비스를 cpu모델에서 참조하도록 사용하는 방법이다.

// power.service.ts
import { Injectable } from '@nestjs/common';

@Injectable()
export class PowerService {
  supplyPower(watts: number) {
    console.log(`supplying ${watts} worth of power.`);
  }
}

supplyPower를 호출할경우 해당 watts를 알려준다.

이후 위의 그림과 같이 스텝바이스텝으로 따라간다.

가. powerModule의 리스트에서 powerservice를 export 해주기

// power.module.ts
import { Module } from '@nestjs/common';
import { PowerService } from './power.service';

@Module({
  providers: [PowerService],
  exports: [PowerService]
})
export class PowerModule {}

위의 power모듈에서 power서비스의 powerService 부분을 exports 한다고 명시한다. providers에 있는 서비스들은 기본적으로 private 이다.

나. power모듈을 cpu모듈에서 import하기

// cpu.module.ts
import { Module } from '@nestjs/common';
import { CpuService } from './cpu.service';
import { PowerModule } from 'src/power/power.module';
@Module({
  imports: [PowerModule],
  providers: [CpuService]
})
export class CpuModule {}

cpu모듈에서 powermodule을 위의 코드와 같이 import를 하게 되면 cpu 모듈 내부에서 powermodule을 사용할 수 있다.

다. cpu 서비스에서 constructor를 이용하여 powerservice를 추가하기

// cpu.service.ts
import { Injectable } from '@nestjs/common';
import { PowerService } from 'src/power/power.service';

@Injectable()
export class CpuService {
    constructor(private powerService: PowerService){
        
    }
}

nest가 CpuService 인스턴스를 생성할 때마다 PowerService 인스턴스를 생성한 다음 해당 인스턴스를 Cpu 생성자에게 제공한다.

3. 사용하기

export 하고 다른 서비스에서 import 한 PowerService를 어떻게 사용할까?

// cpu.service.ts
import { Injectable } from '@nestjs/common';
import { PowerService } from 'src/power/power.service';

@Injectable()
export class CpuService {
    constructor(private powerService: PowerService){}
    compute(a: number, b:number){
        console.log('Drawing 10 watts of power form Power Service');
        this.powerService.supplyPower(10);
        return a + b;
    }
}

compute()라는 서비스를 생성해준다. this.powerService.supplyPower(10)을 사용하여 compute가 실행이 되었을 경우 supplyPower(10)을 실행한다.

위의 단계와 마찬가지로 disk 모듈을 구성한다.

// disk.module.ts
import { Module } from '@nestjs/common';
import { DiskService } from './disk.service';
import { PowerModule } from 'src/power/power.module';

@Module({
  imports: [PowerModule],
  providers: [DiskService]
})
export class DiskModule {}
// disk.service.ts
import { Injectable } from '@nestjs/common';
import { PowerService } from 'src/power/power.service';

@Injectable()
export class DiskService {
    constructor(private powerService: PowerService){}
    getData(){
        console.log("drawing 20 watts of power from PowerService");
        this.powerService.supplyPower(20);
        return 'data!';
    }
}

4. api를 호출해보기

power, disk, cpu 모듈이 준비 되었으니 computer 모듈에서 실제로 호출하는 방법이다.

우선 power 모듈은 disk와 cpu에서 참조하고 있으니 computer 모듈에서는 호출할 필요가 없고 computer 모듈에서는 오직 disk, cpu 모듈만 호출하면 된다.

// computer.module.ts

import { Module } from '@nestjs/common';
import { ComputerController } from './computer.controller';
import { CpuModule } from 'src/cpu/cpu.module';
import { DiskModule } from 'src/disk/disk.module';

@Module({
  imports: [CpuModule, DiskModule],
  controllers: [ComputerController]
})
export class ComputerModule {}
// computer.controller.ts

import { Controller, Get } from '@nestjs/common';
import { CpuService } from 'src/cpu/cpu.service';
import { DiskService } from 'src/disk/disk.service';

@Controller('computer')
export class ComputerController {
    constructor(
        private cpuService: CpuService,
        private diskService: DiskService
    ){}
    @Get()
    run(){
        return [
            this.cpuService.compute(1,2),
            this.diskService.getData()
        ]
    }
}

사용 방법은 동일하다.
computer 모듈에 disk, cpu 모듈을 import 하고 computercontroller에서는 @Get 데코레이터를 이용하여 불러와서 사용하면 된다.

localhost:3000/computer를 호출하게 되면

다음과 같은 결과값을 가져올 수 있다.

profile
적는 자만이 생존한다.

0개의 댓글