Python/Advanced

[Python] Circular Import에 따른 파일 구조 개선

yubi5050 2023. 5. 29. 16:52

이슈 배경

- 비즈니스 로직이 구현되어 있는 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) 방법에 따라 구조 변경