일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 공변성
- 태그된 유니온
- React
- Cypress
- 리터럴 타입
- 인터섹션
- useAppDispatch
- autosize
- 타입 좁히기
- 무한 스크롤
- app router
- 호이스팅
- Jest
- map
- TS
- Promise
- CORS
- async/await
- dfs
- webpack
- recoil
- 결정 알고리즘
- CI/CD
- 반공변성
- 투포인터
- ESlint
- RTK Query
- 이분 검색
- tailwind
- SSR
Archives
- Today
- Total
짧은코딩
순환 참조 본문
반응형
리액트 개발을 하던 도중 많은 데이터를 처리할 일이 생겼는데, 프로젝트의 성능이 많이 느려졌었다.
다시 빠르게 동작 시키기 위해서 여러 방법을 찾았는데, 순환 참조가 그중에서 하나였다.
여태까지 이런 문제가 있다는 것 자체를 몰랐기에 글로 적어 기록하려고 한다.
순환 참조란?
순환 참조(Circular Dependency)는 두 개 이상의 모듈이 서로를 직접적 또는 간접적으로 import 하는 상황을 말한다.
function createCircularReference() {
const objA = {};
const objB = {};
objA.reference = objB;
objB.reference = objA;
}
이렇게 서로가 서로를 참조하면 문제가 발생한다.
-문제점
- 코드가 예상대로 동작하지 않을 수 있음
- 초기화 순서 문제 발생 가능
- 번들 크기 증가
- 성능 저하
- 컴포넌트 테스트의 어려움
내가 저지른 실수 예시
-Header.tsx
import OperationLevel from './OperationLevel';
const Header = () => {
return (
<StyledAppBar>
<MainTitle />
<OperationLevel />
<FieldTime />
</StyledAppBar>
);
};
export default Header;
export const dictionary = {
...
};
-OperationLevel.tsx
import { dictionary } from './Header';
const OperationLevel = memo(() => {
return (
<OperationLevelWrapper>
<CurrentStatus
status={dictionary[defcon]}
/>
</OperationLevelWrapper>
);
});
export default OperationLevel;
이런식으로 Header.tsx는 OperationLevel.tsx를 참조하고, OperationLevel.tsx는 Header.tsx 안에 있는 dictonary를 참조해서 순환 참조가 발생했다.
해결 방법
npx madge --circular --extensions ts ./
이 명령어를 치게 되면 사진처럼 순환 참조가 발생한 지점이 나오게 된다.
이 결과를 기반으로 순환 참조를 해결할 수 있다.
혹은 ESLint의 rules에 import/no-cycle를 추가로 설정하여 순환 참조가 발생하는 것을 예방할 수 있다.
반응형
'개발' 카테고리의 다른 글
React input delay 해결법 (0) | 2024.05.18 |
---|---|
git 개념 정리 (1) | 2024.05.01 |
Comments