Javascript/Node.js

[ Javascript ] - nestjs 기본 세팅

algml0703 2022. 7. 13. 22:35
반응형

직접 구현하여 보기

1. node.js 가 기본적으로 설치되어 있어야 함


2. nest.js 클라이언트가 설치되어 있어야 함  (  > npm i @nestjs/cli   )

위에서 nest new [project_name]을 통해 생성된 폴더 구조에서 처음부터 구현해보기 위해 app.service.ts, app.controller.ts, app.controller.spec.ts 파일과 test폴더는 지워주고, app.module.ts파일에서는 controllers와 providers 부분을 지워준다.

// app.module.ts 파일 
import { Module } from '@nestjs/common';

@Module({

})

export class AppModule {}

3. 모듈 생성

// nest에서는 기본적으로 명령어를 통해 컨틀롤러나 서비스 파일을 생성한다.

>  nest g module boards
nest : using nestcli.  // nest 클라이언트를 사용하겠다.
g : generate  // 생성
module : schematic that i want to create.  // 어떤 유형의 것을 생성할 것이다.  하나의 모듈 폴더를 생성
boards : name of the schematic. // 명칭

위의 명령어 실행시 boards.module.ts 파일이 존재하는 boards라는 폴더가 생성된다.


4. 모듈 폴더에 컨트롤러 생성

> nest g controller boards --no-spce
nest: nestcli를 사용하겠다.
g : 생성하겠다.
boards : 생성할 때 명칭
--no-spce : 옵션으로, 해당 컨트롤서 파일을 생성할 때 테스트를 위한 소스 코드 파일은 생성하지 않을 것임을 의미한다.

 

위의 명령어 실행시 boards 폴더에 boards.controller.ts 파일이 생성되고, boards.module.ts 파일에는 해당 컨트롤러 사용을 위한 설정 코드가 추가된다.

boards.controller.ts 파일이 생성됨

import { Controller } from '@nestjs/common';
@Controller('boards')
export class BoardsController {}

boards.module.ts 파일에 BoardsController 사용을위한 설정 코드가 추가됨

import { Get, Module } from '@nestjs/common';
import { BoardsController } from './boards.controller';

@Module({
  controllers: [BoardsController],
  // 바로 위의 코드줄이 추가된 부분이다. 해당 모듈의 controller로 사용하겠다고 명시해주는 것이다.
})
export class BoardsModule {

}

5. 모듈 안에서 실질적인 서비스 로직을 담당한 서비스 파일 생성

> nest g service boards --no-spce
위의 명령어 실행시 서비스 파일을 생성하여 준다.

boards.service.ts

import { Injectable } from '@nestjs/common';

@Injectable()
export class BoardsService {}

명령어를 통해 기본적인 세팅을 한다. 

boards.module.ts

import { Module } from '@nestjs/common';
import { BoardsController } from './boards.controller';
import { BoardsService } from './boards.service';

@Module({
  controllers: [BoardsController],
  providers: [BoardsService]
  // nest g service boards --no-spec 명령어를 통해 추가된 코드부분이다.
  // 해당 모듈에서 해당 서비스를 사용할 것임을 의미한다.
})
export class BoardsModule {

}

디렉토리의 루트 경로에 위치한 app.module.ts 파일 코드는 아래와 같다. 사용되는 모듈을 등록해주거나, 프로젝트 전체에 적용하는 부분에 대한 설정을 해준다.

import { Module } from '@nestjs/common';
import { BoardsModule } from './boards/boards.module';

@Module({ 
  imports: [
    BoardsModule,
  ]

})

export class AppModule {}

6. 서비스를 컨트롤러 파일에서 사용할 수 있도록 종속성 주입  (Dependency Injection)

컨트롤러 클래스의 constructor(){}를 통해 주입한다.

import { Controller, Get } from '@nestjs/common';
import { BoardsService } from './boards.service';

@Controller('boards')
export class BoardsController {
    constructor(private boardsService : BoardsService) {}
    // 해당 기능을 사용하기 위해서는 this.boardsService.[함수명 or 변수명 등등] 으로 사용한다.
}
// private은 접근제한자
// * 접근제한자 : public, protected, private
// private -> boardsService가 해당 클래스내에서만 사용 가능함을 의미한다.

위의 부분은 컨트롤러에서 서비스로부터 종속성을 제공받은 것이고
서비스는 아래와 같이 @Injectable을 통해 종속성을 제공해야 한다.

import { Injectable } from '@nestjs/common';
import { Board, BoardStatus } from './board.model';

@Injectable()
export class BoardsService {

}
// @Injectable()데코레이터를 통해 다른 컴포넌트에서 해당 클래스를 사용가능하게 해준다.
// 다른 컴포넌트에서는 해당 클래스를 사용하기 위해 바로 위의 코드에서 constructor부분에서와 같이 작성해주어야 한다.

또한 추가적으로 module파일에서 아래와 같이 providers에 대한 설정도 해주어야 한다.

import { Get, Module } from '@nestjs/common';
import { BoardsController } from './boards.controller';
import { BoardsService } from './boards.service';

@Module({
  controllers: [BoardsController],
  providers: [BoardsService]
  // 이와 같이 설정해주어야 함
})
export class BoardsModule {

}

 

출처 

https://www.youtube.com/watch?v=3JminDpCJNE&t=18396s 

 

반응형