12/20/2023

순환 의존성

발단

경매방 모듈의 레포지토리에서 기간이 지나면 자동으로 경매방을 삭제하는 메서드를 작성하는데 최고 입찰가를 추출해야 하기 때문에 입찰 모듈의 서비스를 가져와야 했는데 처음보는 오류가 발생했다... 바로 순환 의존성 오류! 이번 포스팅에서 이와 관련된 내용을 작성한다.


순환 의존성

순환 의존성은 두 클래스가 서로에게 의존할 때 발생한다. 예를 들어, 클래스 A는 클래스 B가 필요하고, 클래스 B도 클래스 A가 필요하다. NestJS에서는 모듈 간 및 프로바이더 간에 순환 의존성이 발생할 수 있다. 

캡처에서 볼 수 있듯이 입찰 레포지토리에서 경매방 레포지토리를 사용하고 경매방 레포지토리에서 입찰 레포지토리를 사용한다. 즉, 두 레포지토리가 서로에게 의존한다! 알고보니 순환 의존성을 가지는 설계는 SOLID의 단일 책임 원칙을 위반하기 때문에 문제가 있는 설계라고...


전방 참조

순환 의존성 문제를 해결하기 위한 해결책 중 하나는 전방 참조를 사용하는 것이다. forwardRef() 함수를 사용하여 아직 정의되지 않은 클래스를 참조할 수 있다. 서비스, 레포지토리, 모듈 등이 서로에게 의존하는 관계의 양쪽 모두가 @Inject() 데코레이터와 forwardRef() 함수를 사용하여 순환 종속성을 해결할 수 있다(forwardRef() 함수를 사용하지 않으면 필요한 모든 메타데이터가 사용 가능하지 않기 때문에 클래스 인스턴스화가 실패한다.).


모듈

두 레포지토리에 공식 문서에 따라서 Inject() 데코레이터와 forwardRef() 함수를 사용했지만 여전히 순환 의존성 오류가 발생했다... 알고보니 두 모듈에도 추가해야 한다는 것을 깨달았다! 두 모듈에서 서로의 모듈을 가져오지 않으면 사실 사용할 수 없기 때문이다.
순환 의존성 해결!

update: 2023.12.20

댓글 없음:

댓글 쓰기