- 순환 의존성(circular dependency)은 두 모듈이나 더 많은 모듈이 서로를 직접적이거나 간접적으로 의존하는 상황
문제점
- 유지 보수의 어려움:
- 순환 의존성은 코드의 이해를 어렵게 만들고, 따라서 유지 보수를 더 복잡하게 만듭니다.
- 변경 사항이 하나의 모듈에 영향을 미치면, 이는 연쇄적으로 다른 모듈에도 영향을 미칠 수 있음
- 초기화 문제:
- 파이썬에서 모듈은 처음 임포트될 때 초기화되며, 순환 의존성이 있는 경우 무한 임포트 루프에 빠지거나 초기화 순서 문제로 인해 런타임 오류가 발생할 수 있습니다.
- 테스트와 디버깅의 어려움:
- 모듈 간의 강한 결합은 각 모듈을 독립적으로 테스트하기 어렵게 만듭니다.
- 이는 또한 버그를 찾고 수정하는 과정을 더 어렵게 만듭니다.
예시
다음은 파이썬에서 간단한 순환 의존성의 예시입니다.
module_a.py
from module_b import feature_b
def feature_a():
print("Feature A")
feature_b()
module_b.py
from module_a import feature_a
def feature_b():
print("Feature B")
feature_a()
이 코드를 실행하려고 할 때, Python은 module_a
를 임포트하고 이 모듈은 module_b
를 임포트합니다. 그러나 module_b
는 다시 module_a
를 임포트하려고 시도하면서 순환 의존성이 생깁니다. 이는 파이썬 인터프리터에서 "ImportError: cannot import name 'feature_a' from partially initialized module 'module_a'" 같은 오류를 발생시킬 수 있습니다.
해결 방법
- 구조 재설계:
- 모듈 간의 의존성을 제거하거나, 공통 기능을 별도의 모듈로 분리하여 모듈 간의 의존성을 줄입니다.
- 지연된 임포트 사용:
- 함수 내에서 필요할 때 임포트를 실행하여 초기화 문제를 피할 수 있습니다.
- 하지만 이 방법은 근본적인 문제의 해결은 아니며, 단지 순환 의존성 문제를 회피하는 임시적인 해결책에 불과합니다.
- 순환 의존성은 근본적으로 설계 문제이기 때문에, 가장 좋은 해결책은 종종 코드 구조를 재검토하고 개선하는 것