> For the complete documentation index, see [llms.txt](https://doongu.gitbook.io/pk_select/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://doongu.gitbook.io/pk_select/issue/backend/backend-circular-imports.md).

# BackEnd/Circular Imports

## 순환참조 이슈가 있었다.&#x20;

다음 코드를 보자.

![](https://3663972659-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MiZpKmP92-pLA9_KmoC%2Fuploads%2FDKQyNS2dgnjRrbeN8MBp%2Fimage.png?alt=media\&token=8ff0e23a-903a-4e23-b3c3-ffdc77bd7594)

이는 a.py를 실행하면 circular import 에러가 발생하는 것을 알 수 있다.

![](https://3663972659-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MiZpKmP92-pLA9_KmoC%2Fuploads%2FLKFFZUmmE9DPmkWuoprz%2Fimage.png?alt=media\&token=6e645127-9e90-415d-a23a-596eb3f6e706)

그 이유는 import time에는 .py 모듈에 들어 있는 소스 코드를 위에서 부터 순서대로 한 번 파싱하고, 실행을 위한 바이트 코드를 생성한다. 그 결과로 .pyc 파일이 생성되며 Syntax Error 또한 코드를 파싱하는 과정에서 발생한다. 또한 함수 본문과 클래스의 메소드 본문을 제외한 대부분의 코드가 import time에 실행이 되기 때문이다.

고로 위 사진에서 a.py를 실행하면

1. b.py를 import하고, import a를 만나 다시 a.py를 import하게 된다.&#x20;
2. 그럼 function*a()를 만나는데, function*a()내부에서 반환하는 function\_b()는 아직 부르지 않았기 떄문에 순환참조 오류가 발생하게 된다.

반면에 b.py를 실행하면 정상출력이 되는

![](https://3663972659-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MiZpKmP92-pLA9_KmoC%2Fuploads%2FIl1I1Nzd688SRibqQNor%2Fimage.png?alt=media\&token=8a9241b1-c5cb-4bf3-9c18-a588b1480ae9)

이는 import a를 만나, a.py를 부름과 동시에 import b를 만나 function\_b()가 선언되었기에 정상출력이 되는 것이다.

## 해결방법

그래서 보통 해결방법으로 import time을 고려해, import 위치를 바꿔준다.

![](https://3663972659-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MiZpKmP92-pLA9_KmoC%2Fuploads%2FXNDB9auo4PMkVMtbrDt6%2Fimage.png?alt=media\&token=dbcce5bc-1ff3-41e7-9e09-15511c91e2a7)

해당 코드에서는 b.py에서 import a를 함수안으로 넣어주었다.

## 프로젝트에서는 .....![](broken://files/nCBMHuIjxFNkxL4bV9IO)

![](https://3663972659-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MiZpKmP92-pLA9_KmoC%2Fuploads%2FntQhMF1l4zviwths6FFV%2Fimage.png?alt=media\&token=42e1c8b3-d654-4bed-af1e-eceb25e41a51)

\_*init\_\_.py와 login\_api.py 사이에 순환 참조가 일어났는데, 나는 import를 옮겨주기 보다는 login\_api.py를 함수로 묶어주었다.*

*왜냐하면, 순환참조가 코드가 잘 실행된다고 가정해도 한 파일이 두번씩 실행되기 때문에 이러한 점이 비효율적이다 생각하여 함수로 묶어주었다.*

*내가 찾아봤을 때 보통은 아래와 같이 import 순서를 바꾼다.*

![](https://3663972659-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MiZpKmP92-pLA9_KmoC%2Fuploads%2F0RgaUZJVGAbDvgcQ3kJV%2Fimage.png?alt=media\&token=482c52ad-48fc-40e7-91d1-8606d50f5c81)
