Providers(service)에 있는 함수를 다른 곳에서 사용하려면?

chanykim·2021년 10월 8일
1
post-thumbnail

들어가며

nestjs에 폴더가 reservation과 book이 있다고 하자.
각 폴더에는 module, service, controller가 존재한다.
그리고 각각 데이터베이스와 연결한 상황이다.
여기서 우리는 Post를 통해 책을 예약해서 reservation에 저장했다.

book.service.ts에서 reservation.service.ts에 있는 findAll()함수를 사용하고 싶다. 이럴 때 어떻게 하면 사용할 수 있을까?

3단계로 나누어보자.

  1. 사용하고 싶은 함수 쪽에 있는 module에서 service를 내보낸다.(exports)
  2. 사용 해야할 곳에 있는 module에서 사용하고 싶은 모듈을 받는다.(imports)
  3. 사용 해야하는 곳에 있는 service에서 constructor를 만들고 사용할 service 적용한다.

이렇게 단계로만 보면 무슨 말인지 잘 모르겠으니, 만들어서 설명해드리겠습니다.
http://localhost:3000/books 으로 접속하면,

 //books.controller
  @Get()
  findAll() {
    return this.booksService.findAll();
  }

//books.service
  findAll() {
    return `This action returns all books`;
  }

이렇게 출력이 된다.

우리는 http://localhost:3000/books에 들어갔을 때 reservation에 있는 findAll을 출력하려고 한다.

 //books.controller
  @Get()
  findAll() {
    return this.booksService.findAll();
  }

//reservation.service
  findAll() {
    return `This action returns all reservations`;
  }

이제 방법을 차근차근 알아보자.

Providers(service)에 있는 함수를 다른 곳에서 사용하기 위한 3단계

단계는 그냥 편의상 나눈 것이고 어느단계부터 해도 된다!

1. 사용하고 싶은 함수 쪽에 있는 module에서 service를 내보낸다.(exports)

우선 reservation.module에 가보자.

@Module({
  controllers: [ReservationsController],
  providers: [ReservationsService],
})
export class ReservationsModule {}

기본형이다. nestjs는 기본적으로 자동으로 다 만들어 주니까 이런 형식으로 있을 것이다.
여기서 우리는 Module에 exports라는 것을 붙여줄 것이다.

@Module({
  controllers: [ReservationsController],
  providers: [ReservationsService],
  exports: [ReservationsService],
})
export class ReservationsModule {}

exports는 내보내는 것으로 이 파일에 있는 것을 다른 파일에서도 사용할 수 있게 내보내는 것이다.

2. 사용 해야할 곳에 있는 module에서 사용하고 싶은 모듈을 받는다.(imports)

내보냈으니 이제 받아야 사용할 수 있을 것이다.
사용하고 싶은 곳인 book.module에 가보자.

@Module({
  controllers: [BooksController],
  providers: [BooksService]
})
export class BooksModule {}

여기도 기본형이다.
우리는 여기서 imports로 모듈을 가져온다.

@Module({
  imports: [ReservationsModule],
  controllers: [BooksController],
  providers: [BooksService],
})
export class BooksModule {}

3. 사용 해야하는 곳에 있는 service에서 constructor를 만들고 사용할 service 적용한다.

1,2 단계를 통해서 우리는 사용하고 싶은 함수를 받아올 수 있는 길을 만들었다.
이제 적용시켜보자.

//books.service
@Injectable()
export class BooksService {
  constructor(private reservationsService: ReservationsService) {}

  findAll() {
    return this.reservationsService.findAll();
    //return `This action returns all books`;
  }
}

우리는 reservations.Service에 있는 findAll() 함수를 사용하고 싶었던 거니까 위와 같이 작성해주면 이제 다른 곳에 있는 함수를 가져다가 사용할 수 있게 된다.
constructor에 사용할 service를 명하고 사용할 때는 this. 을 붙여서 사용하고 싶은 함수를 꺼내서 사용한다.

결과

에러

만약에 위 단계중 하나라도 안하면 아래와 같은 에러 메세지가 나온다.

Nest can't resolve dependencies of the ####Service.
Please make sure that the argument #####Service at index [0] is available in the ####Module context.

profile
오늘보다 더 나은 내일

0개의 댓글