far

[Nest.js] 순환 참조를 공통 모듈로 해결하기 본문

Nest

[Nest.js] 순환 참조를 공통 모듈로 해결하기

Eater 2024. 9. 1. 20:31

0. 순환 참조란?

순환 참조는 모듈 간의 의존성이 꼬여 있을 때 발생한다. 예시로 아래의 코드처럼 Cart 모듈이 User 모듈을 의존하고, User 모듈이 다시 Cart 모듈을 의존하는 경우 순환 참조가 발생한다. (에러 메세지에 Circular Dependency 관련 에러가 찍힌다.)

// cart.module.ts
@Module({
  imports: [UserModule],
  providers: [CartService],
})
export class CartModule {}

// user.module.ts
@Module({
  imports: [CartModule],
  providers: [UserService],
})
export class UserModule {}

1. 순환 참조를 공통 모듈로 해결

위의 CartService는 장바구니의 품목을 관리하는 서비스로, 사용자의 장바구니 데이터를 처리한다. 즉, 장바구니에 상품을 추가할 때 사용자의 정보가 필요하다.

UserService는 사용자 정보를 관리하는 서비스로, 사용자의 인증이나 개인 데이터를 처리한다. 만약 사용자가 장바구니에 담은 품목들을 가져오고 싶다면 CartService를 참조하게 된다.

 

이를 해결하기 위해 일단 사용자 인증, JWT 토큰 발급, 로그인 등 인증과 관련된 기능을 별도의 AuthService로 분리한다. (순환 참조때문이 아니더라도 기본적으로 분리 하는편이 좋다.)

그리고 CartService와 UserService는 AuthService를 참조하여 인증 및 사용자 정보를 처리하게 한다.

 

이렇게 하면, CartService와 UserService가 서로 직접적으로 의존하지 않고, AuthService를 통해 필요한 기능을 해결할 수 있게 된다. 이때 공통 모듈을 사용하게 되는데, AuthService를 AuthSharedModule로 분리해 두 모듈에서 재사용할 수 있도록 만들어준다.

@Module({
  providers: [AuthService],
  exports: [AuthService],
})
export class AuthSharedModule {}
// cart.module.ts
@Module({
  imports: [AuthSharedModule],
  providers: [CartService],
})
export class CartModule {}

// user.module.ts
@Module({
  imports: [AuthSharedModule],
  providers: [UserService],
})
export class UserModule {}

이렇게 작성하면 순환 참조 문제를 해결할 뿐 아니라, 인증 관련 코드를 별도로 관리할 수 있게 해 유지보수를 쉽게 할 수 있다.

'Nest' 카테고리의 다른 글

[Nest.js] Swagger 사용하기  (0) 2023.05.14
[Nest.js] dotenv로 데이터베이스 연결하기  (0) 2023.05.03
Comments