순환의존성
순환 구조(Circular Dependency)란
두 개 이상의 모듈, 파일, 레이어가 서로를 참조하는 상태를 의미
A → B, B → A 이 구조가 되면 순환(cycle)이 발생
문제점
초기화/빌드시 문제가 발생함
JS Bundle(webpack, vite), TS 컴파일러 등 순환 참조시 import 순서 오류가 발생됨
undefined, 즉 초기화되지 않은 상태의 값이 들어오는 버그 발생
모듈간 결합도가 높아짐
A와 B가 서로를 알아야 하므로 결합도가 높아져 변경하기 어렵고 파악하기 어려운 구조가됨
개별적으로 테스트하기 어려워짐
A를 테스트하려면 B를 모킹해야하고, B를 테스트하려면 A를 모킹해야함 → 테스트도 순환됨
의존성 개념
한 모듈이 다른 모듈의 기능을 사용하기 위해 알아야하는 관계를 의미
A 모듈이 B 모듈을
import하면 → A는 B에 "의존" 한다고 말함
의존성이 많아지면 발생하는 문제
그래서 의존성은 "최소화하고 방향을 잘 관리하는 것"이 중요함
결합도 증가
A가 변경되면 B까지 변경되는 연쇄 수정이 발생됨
확장성 저하
새로운 기능을 만들 때 기존 의존성 구조를 고려해야해서 개발 속도가 느려짐
유지보수 난이도 증가
어디까지 영향이 가는지 추적하기 어려워짐
의존성 역전 원칙 (DIP, Dependency Inversion Priciple)
고수준 모듈은 저수준 모듈에 의존하면 안된다. 추상화(인터페이스)에 의존해야 한다.
추상화는 세부사항에 의존하면 안된다. 세부사항이 추상화에 의존해야 한다.
고수준 (High-level Module)
비즈니스 규칙, 도메인 규칙 등을 담는 레이어
사용자에게 제공해야하는 기능의 의도/규칙을 정의
외부 기술이 바뀌어도 그대로 유지되어야 하는 로직들
즉, 무엇을 해야하는가에 가까움
저수준 (Low-level Module)
구현 기술, 입출력, 구체적 세부사항을 담당하는 레이어
외부 세계나 시스템과 직접 연결되는 부분
기술 변경시 함께 변경될 가능성이 높은 계층들
Last updated