이슈 배경
- 비즈니스 로직이 구현되어 있는 service layer의 service_xxx.py 들 간에 Circular import가 발생
구현 코드
기존에 정상적으로 동작하는 코드
### service_a.py
from service_b import Service_B
class Service_A:
def a1():
Service_B.b1()
def a2():
pass
### service_b.py
class Service_B:
def b1():
pass
로직 추가 후 circular import 발생
### service_a.py
from service_b import Service_B
class Service_A:
def a1():
Service_B.b1()
def a2():
pass
### service_b.py
# === 신규 추가 라인 === #
from service_a import Service_A # <-- circular import 발생
class Service_B:
def b1():
pass
# === 신규 추가 함수 === #
def b2():
Service_A.a2() # <-- circular import 발생
오류 원인 정리
- service_a.py는 Service_B를 Service_A는 service_b.py를 서로 참조하여 에러 발생
해결 방법
1) 클래스 레벨에서의 참조 분리
- a2 함수에 대한 클래스를 분리함 (Service_C 클래스)
- Service_A -> Service_B 참조 / Service_B -> Service_C 참조하므로 circular import 해결
- 해당 방법은 Service_C 클래스가 Service_A보다 항상 밑에 와야 함. (import 문 포함)
2) 파일 레벨에서의 참조 분리
- a2 함수에 대한 파일 및 클래스를 분리함 (service_c.py의 Service_C 클래스)
- service_a -> service_b / service_b -> service_c 순으로 참조하므로 circular import 해결
- 만약 a2 함수가 기존 Service_A 클래스의 범위와 의미적으로 분리될 수 있을 때 적절하다고 생각
최종 2) 방법에 따라 구조 변경
'Python > Advanced' 카테고리의 다른 글
[Python] 모듈과 패키지 (0) | 2024.06.22 |
---|---|
[Python] Class 이해 - 언더바 정의, @property, @staticmethod, setter/getter (0) | 2023.07.02 |
[Python] 가상환경, 패키지 관리 모듈 정리 (pyenv, pipenv, poetry, venv) (0) | 2023.02.11 |
[Python 비동기] (3) Library, Framework 특징 비교 (0) | 2023.02.09 |
[Python 비동기] (2) Generator, Async/await 코루틴 코드 비교 (0) | 2023.02.09 |