Controller

요청을 받고 요청에 대해 응답하는 책임을 가지고 있다.

import { Controller, Get, Query, Post, Body, Put, Param, Delete } from '@nestjs/common';
import { CreateCatDto, UpdateCatDto, ListAllEntities } from './dto';

@Controller('cats')
export class CatsController {
	consturctor(private readonly userService: UserService){}

  // POST /cats
  @Post()
	@HttpCode(201)
  create(@Body() createCatDto: CreateCatDto) {
    return 'This action adds a new cat';
  }

	// GET /cats?limit=10&offset=5
  @Get()
	@Header('Cache-Control', 'none')
  findAll(@Query() query: ListAllEntities) {
    return `This action returns all cats (limit: ${query.limit} items)`;
  }
	
  // GET /cats/:id
  @Get(':id')
  findOne(@Param('id') id: string) {
    return `This action returns a #${id} cat`;
  }
	
	// PUT /cats/:id
  @Put(':id')
	@HttpCode(204)
  update(@Param('id') id: string, @Body() updateCatDto: UpdateCatDto) {
    return `This action updates a #${id} cat`;
  }

	// DELETE /cats/:id
  @Delete(':id')
	@Redirect('<https://nestjs.com>', 301)
  remove(@Param('id') id: string) {
		// 여러가지 로직
    return `This action removes a #${id} cat`;
  }
}

Untitled

Provider

service, repository, factory, helper 등등 의존성으로서 주입될 것들을 의미한다.

import { Injectable } from '@nestjs/common';
import { Cat } from './interfaces/cat.interface';

@Injectable()
export class CatsService {
  private readonly cats: Cat[] = [];

  create(cat: Cat) {
    this.cats.push(cat);
  }

  findAll(): Cat[] {
    return this.cats;
  }
}

@Injectable() 데코레이터를 붙여줌으로서, Nest IoC 컨테이너가 해당 클래스의 생명주기(언제 클래스가 생성될 것인지)를 관리하도록 한다.

생명주기는 스코프를 확인해보면 알 수 있다.(기본적으로 Injectable로 관리되는 provider들은 싱글톤으로 관리된다.)

@Injectable({ scope: Scope.REQUEST })

Untitled

Module

Nest로 만든 어플리케이션은 적어도 하나의 모듈을 갖는다.

모듈은 4개의 property를 갖는다.

  1. imports: 다른 모듈을 import할 수 있다. 다른 모듈에서 exports한 provider들을 내부 controller, provider에서 사용가능하다.
  2. controllers: controller를 추가
  3. providers: provider를 추가
  4. exports: 모듈 외부로 provider들의 서브셋을 export한다. 다른 모듈에서 해당 모듈을 import했을 때, 사용가능하다.
import { Module } from '@nestjs/common';
import { DatabaseModule } from '../../common/database/database.module'
import { CatsController } from './cats.controller';
import { CatsService } from './cats.service';
import { CatsRepository } from './cats.repository';

@Module({
	imports: [DatabaseModule],
  controllers: [CatsController],
  providers: [CatsService, CatsRepository],
	exports: [CatsRepository]
})
export class CatsModule {
	// 동적 모듈 생성
	static forRoot(변수...){
		// 로직....
		return {
			module: CatsModule,
			providers: [CatsService, CatsRepository]
      exports: [CatsRepository]
		}
	}
}