# 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-reference)

![](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)


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://doongu.gitbook.io/pk_select/issue/backend/backend-circular-imports.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
