nestjs-command 라이브러리 활용

둥둥이·2023년 1월 17일
0
post-thumbnail

목표

기존 User 테이블에 각 유저별 알람설정을 할 수 있도록 새로운 테이블을 조인하여 붙여놓았는데 새로 등록하는 회원들은 디폴트 알람설정값이 생성되고 있으나 기존 회원들은 값이 없어서 에러가 발생 => 일괄적으로 디폴트 값을 생성해야할 필요가 있음

1) 지속적으로 이루어지지는 않으나 일시적으로 동작해야하는 코드가 있음
2) DB에서 직접 쿼리를 사용하지 않기(너무 위험)
3) 스크립트를 커맨드로 실행시켜서 적용하기

설치해야할 라이브러리

$ npm install nestjs-command
% npm install -S -D @types/yargs

공식 : https://gitlab.com/aa900031/nestjs-command

기본 설정하기

./src/cli.ts

import { NestFactory } from '@nestjs/core';
import { CommandModule, CommandService } from 'nestjs-command';
import { createConnection } from 'typeorm';
import { AppModule } from './app.module';

createConnection('default').then(async (connection) => {
  const app = await NestFactory.createApplicationContext(AppModule, {
    logger: ['error'],
  });
  
	try {
    	await app.select(CommandModule).get(CommandService).exec();
	    await app.close();
  	} catch (error) {
    	console.error(error);
    	await app.close();
	    process.exit(1);
  	}
});
  • 공식설명과는 조금 다르지만 나는 DB 내용을 수정해야하기 떄문에 DB연결을 해야했다
  • createConnection(typeorm 버전업으로 밑줄 쫙! 되어있으나 작동은 잘된다)

실행한 스크립트 설정하기

  • 초기에 변경이 많은 스타트업 특성상 이 스크립트 커맨드를 사용할 일이 많을것 같아서 아예 모듈로 빼서 관리하기로 하였다.
$ nest g mo task

task 모듈 파일 내용

./task/task.module.ts

import { TypeOrmModule } from '@nestjs/typeorm';
import { CommandModule } from 'nestjs-command';
import { Module } from '@nestjs/common';
import { SomeTask } from './some.task';
import { User } from '../auth/entities/user.entity';
import { AlarmConfig } from '../auth/entities/alarmConfig.entity';

@Module({
  imports: [CommandModule, TypeOrmModule.forFeature([User, AlarmConfig])], // repository를 주입받기 위한 typeorm설정
  exports: [],
  providers: [SomeTask], //스크립트 내용이 들어갈 클래스
})
export class TaskModule {}

실제스크립트 내용

./task/some.task.ts

import { InjectRepository } from '@nestjs/typeorm';
import { Command } from 'nestjs-command';
import { Repository } from 'typeorm';
import { AlarmConfig } from '../auth/entities/alarmConfig.entity';
import { User } from '../auth/entities/user.entity';

export class SomeTask {
  constructor(
    @InjectRepository(User) private userRepo: Repository<User>,
    @InjectRepository(AlarmConfig) private alarmConfigRepo: Repository<AlarmConfig>,
  ) {}

  @Command({
    command: 'create:alarmconfig', // 함수의 커맨드명령어 설정
    describe: '알람설정이 안된 유저의 디폴트값 생성', // 해당 커맨드의 설명
  })
  async createAlarmConfig() {
	// 여기에 코드를 작성하면 된다.
    // 보통 Nestjs + typeorm 작성하듯이 똑같습니다.
  }
}

커맨드 실행하기

  • 기본적인 실행 커맨드는 다음과 같다
$ npx nestjs-command <커맨드명령어>
$ npx nestjs-command create:alarmconfig //위의 스크립트에 설정된 커맨드 예시
  • NODE_ENV에 따라 DB설정값이 다른 경우
$ NODE_ENV='development' npx nestjs-command create:alarmconfig

이런식으로 커맨드 입력하면 스크립트가 자동 실행됩니다~

0개의 댓글