자바스크립트에서의 순환 참조 문제
🎯 이 문서를 읽고 난 후의 상태
- 순환 참조 문제가 무엇인지 안다.
- 순환 참조 문제를 해결하는 방법을 안다.
- 순환 참조 문제를 예방하는 방법을 안다.
😭 문제 상황
위의 글에서 확인할 수 있는데, 스토리북에서 스토리를 작성하다가 순환 참조 문제를 마주하게 되었다.
평소 순환 참조 문제라는 키워드는 들어봤는데, 정작 제대로 알지 못하 고 있다는 생각이 들었다.
그래서 이번 기회에 순환 참조 문제가 무엇인지 확인하고, 이를 해결하는 방법을 알아보려 한다.
🤔 순환 참조 문제란?
순환 참조(Circular Dependencies)
란 두 개 이상의 모듈이 서로를 직접 또는 간접적으로 참조하는 상황을 의미한다.
위의 예시처럼, ModuleA
와 ModuleB
가 서로를 참조하는 상황이 발생하면, 이를 순환 참조 문제라고 한다.
이러한 상황이 발생하면, 모듈이 무한히 서로를 참조하게 되어, 프로그램이 무한 루프에 빠지는 상황이 발생할 수 있으며, 그렇기 때문에 문제
라고 분류한다.
보면 알겠지만, 의외로 소프트웨어 개발에서 흔히 발생하는 문제이며, 특히 모듈 간의 의존성이 복잡해지면 복잡해질 수록 발생할 확률이 높아진다.
코드를 통해 좀 더 살펴보자.
📝 직접 순환 참조 예시
- ModuleA
- ModuleB
// moduleA.js
import { functionB } from './moduleB.js';
export function functionA() {
console.log('Function A');
functionB();
}
// moduleB.js
import { functionA } from './moduleA.js';
export function functionB() {
console.log('Function B');
functionA();
}
위의 코드에서 ModuleA
와 ModuleB
가 서로를 참조하고 있다.
이렇게 되면, functionA
가 호출되면 functionB
가 호출되고, functionB
가 호출되면 functionA
가 호출되는 무한 루프에 빠지게 된다.
이러한 상황이 발생하면, 프로그램이 무한 루프에 빠지게 되어, 프로그램이 정상적으로 동작하지 않게 된다.
📝 간접 순환 참조 예시
순환 참조는 두 개 이상의 모듈이 직접 참조하는 것 뿐만 아니라, 간접적으로 참조하는 경우에도 발생할 수 있다.
- ModuleA
- ModuleB
- ModuleC
// moduleA.js
import { functionC } from './moduleC.js';
export function functionA() {
console.log('Function A');
functionC();
}
// moduleB.js
import { functionA } from './moduleA.js';
export function functionB() {
console.log('Function B');
functionA();
}
// moduleC.js
import { functionB } from './moduleB.js';
export function functionC() {
console.log('Function C');
functionB();
}
위의 코드에서 ModuleA
는 ModuleC
를 참조하고, ModuleC
는 ModuleB
를 참조하고, ModuleB
는 ModuleA
를 참조하고 있다.
여기서 moduleA
→ moduleC
→ moduleB
→ moduleA
순으로 순환 참조가 발생한다.