Circular Dependencies
의존성 순환이란 코드를 모듈화 하여 작업할 때 생기는 모듈간의
의존성이 순환하며 무한루프를 일으키게 되는 현상을 뜻한다.
A라는 모듈이 B를 참조하여 의존성을 가지게 되고
B모듈 역시 A모듈을 참조하여 서로 의존성을 가지게 되면
A 혹은 B 모듈중 하나만 실행되어도 멈추지 않고
A모듈과 B모듈을 지속 실행하게 된다.
Node.js의 의존성 순환
기본적으로 자바스크립트 모듈 시스템은 순환 참조를 허용한다.
때문에 런타임 오류가 발생하진 않지만 간혹 참조 평가 순서에 의해
순환참조로 인한 에러를 마주할 수 있다.
여기서 "평가 순서"란 객체가 파라미터를 넘기고 수행하는 시점을 뜻한다.
해결책
결과적으로는 서로 순환참조할 수 없도록 평가 순서에 영향을
미치지 않는 새로운 모듈을 정의하고 이를 필요한 모듈에서
가져와 사용한다면 해결할 수 있다.
- 예시 코드
// modules.js (새롭게 정의한 모듈)
export * from './B.js';
export * from './A.js';
// index.js (A, B 모듈을 사용)
import { A, B } from './modules.js';
// A.js (B에 의존성을 가진 모듈A)
import { B } from './modules.js';
export const A = 'My name is A!';
B("Hello! ");
// B.js (A에 의존성을 가진 모듈B)
import { A } from './modules.js';
export const B = (Hello) => {
alert(`${Hello + A}`);
};
위 예시 코드는 새로 정의한 modules.js 파일에 모듈을
집합 시켜 평가 순서를 결정할 수 있도록 정의했기 때문에
모듈을 가져올 때 반드시 modules.js 파일에서 가져온다.
위 예시 코드는 모듈들을 번들링하여 순환 참조를
해결하는 하나의 방법론이다.
조영호 님의 '우아한 객체지향' 세미나에서 언급했던 이야기 중 [ 설계란, 코드를 어디에 위치시킬 것인가에 대한 의사 결정이며 이에 대한 결정은 " 변경 " 에 초점을 맞추는 것이다. " 변경되는 코드들을 함께 " 넣어야 하고 " 변경의 핵심은 의존성 "이다. ] 라고 조언해 주신 것이 순환 참조, 의존성에 대한 개념과 이해도를 높일 수 있는 키워드가 되었던 것 같다.
마치며...
깃허브를 둘러보다 Node.js런타임에서 개발되는 코드들을(주로 React) 봤을때 위 방식으로 순환참조를 방지하는 것을 종종 보았다. 분명 좋은 방법처럼 보이지만 개인적인 견해로는 차라리 폴더 아키텍처를 조금 더 구분감 있게 분류한다면 자연스럽게 해결할 수 있지 않을까? 싶은 생각이 들었다. 이 처럼 다양한 문제를 다양한 사고방식의 사람들이 다양한 방법론을 제시하고 발전시켜 왔기 때문에 지금처럼 개발 생태계를 발전시킬 수 있었던 것 같다.
'Computer Science' 카테고리의 다른 글
[ Computer Science ] REST API란? (0) | 2023.12.25 |
---|