NestJS Tutorial (3) - Provider

Hoony·2023년 6월 26일
0

NestJS

목록 보기
3/8

Provider란?

Provider은 실제 복잡한 작업이 일어나는 객체를 의미합니다.

Service, Repository, Factory, Helper 등이 Provider에 속할 수 있습니다.

중요한 점은 종속성으로 다른 객체에 주입할 수 있다는 것입니다. 이를 통해 개체 간에 연결을 맺어 다양한 관계를 설정할 수 있습니다.


NestJS는 SOLID 원칙 준수하는 것을 권장합니다.
Since Nest enables the possibility to design and organize dependencies in a more OO way, we strongly recommend following the SOLID principles

SOLID란?
"클래스는 단 하나의 책임을 가져야 하며, 확장에는 열려 있고 변경에는 닫혀 있어야 하며, 서브 타입은 부모 타입으로 대체 가능해야 하며, 클라이언트는 자신이 사용하지 않는 인터페이스에 의존하지 않아야 하며, 의존 관계는 추상화에 의존해야 합니다."



생성

cli를 통해 생성

nest g service [service-name]


@Injectable

생성된 Service 코드를 보면 @Injectable 데코레이터를 확인할 수 있습니다.

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 container에서 관리하는 객체임을 선언하는 것입니다. 이를 통해 추후에 Service 객체를 Controller 객체에 주입하여 사용할 수 있게 됩니다.
-> Spring의 Bean 과 같은 개념

The @Injectable() decorator attaches metadata, which declares that CatsService is a class that can be managed by the Nest Ioc container.



의존성 주입

생성자를 통해 Controller 객체에 다음과 같이 Service를 주입시킬 수 있습니다.

@Controller('cats')
export class CatsController {
  constructor(private catsService: CatsService) {}
	
...

}

이때, NestJS의 의존 객체들은 싱글톤(singleton) 디자인 패턴 원칙에 따라 생성됩니다.


싱글톤(singleton)이란?
클래스의 인스턴스가 단 하나만 존재하도록 보장하는 디자인 패턴입니다.

즉, 싱글톤(singleton) 디자인 패턴을 사용하면 여러 곳에서 같은 클래스 객체가 사용되더라도 이는 하나의 같은 인스턴스임이 보장됩니다. 여러 컨트롤러에서 같은 서비스 객체를 사용하더라도 서비스 객체는 하나만 생성됩니다.

Singleton 패턴은 자원 공유, 로깅, 데이터베이스 연결 등의 상황에서 유용하게 사용될 수 있습니다. 하지만 과도한 사용은 전역 상태를 갖게 되므로 주의가 필요하며, 다중 스레드 환경에서는 동기화 문제에 대한 고려도 필요합니다.



Cats Service - Cats Controller 연결

다음과 같이 Cats Service를 생성합니다.

  • 이때 @Injectable 데코레이터를 붙여야 합니다.
  • Nest Ioc Container에 등록

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

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

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

  findOne(id: number): Cat {
    return this.cats[id];
  }

  update(id: number, cat: Cat) {
    this.cats[id] = cat;
  }

  delete(id: number) {
    this.cats.splice(id, 1);
  }
}

이후 Cats Controller에 생성자로 의존성 주입을 해서 다음과 같이 사용합니다.

@Controller('cats')
export class CatsController {
  constructor(private catsService: CatsService) {}

  @Post()
  async create(@Res() res: Response, @Body() createCatDto: CreateCatDto) {
    this.catsService.create(createCatDto);
    res.status(HttpStatus.CREATED).send();
  }

  @Get()
  async findAll(): Promise<Cat[]> {
    return this.catsService.findAll();
  }

  @Get(':id')
  async findOne(@Param('id') id: number): Promise<Cat> {
    const findOne = this.catsService.findOne(id);
    if (!findOne) {
      throw new HttpException('Not Found', HttpStatus.NOT_FOUND);
    }
    return findOne;
  }

  @Put(':id')
  async updateOne(@Param('id') id: number, @Body() cat: Cat): Promise<void> {
    this.catsService.update(id, cat);
  }

  @Delete(':id')
  async deleteOne(@Param('id') id: number): Promise<void> {
    this.catsService.delete(Number(id));
  }
}
profile
Just Do it!

0개의 댓글

관련 채용 정보