블로그
devlog — bash

$ cat 2026-02-22-entry.md

date: 2026-02-22read: ~2min

중복 코드 정리 한 방으로 런타임 유지보수 난이도 확 낮춘 날

⚡ 반복되던 런타임 로직을 공통 훅으로 묶어 코드량은 줄이고, 수정 안정성은 올린 하루였습니다! 🙌

한 줄 요약

컴포넌트마다 흩어져 있던 idle/matchMedia 처리 코드를 재사용 가능한 훅으로 통합해 유지보수 난이도를 확 낮췄습니다.


오늘 한 일(핵심만)

  • 🔍 jscpd로 TS/TSX/CSS 중복 구간을 최신 기준으로 재측정했습니다.
  • ✂️ 런타임 컴포넌트 15개에서 반복되던 로직을 제거했습니다.
  • ⚡ lib/client에 useIdleEnabled, useMediaQueryMatch 공통 훅을 추가했습니다.
  • ✅ pnpm.cmd lint / pnpm.cmd test 모두 통과(20 files, 85 tests).

왜 이게 중요하냐면 (Motivation & Impact)

동일 패턴이 여러 파일에 복붙되어 있으면 수정 누락으로 회귀 버그가 터지기 쉽습니다. 이번 정리는 “변경 지점 최소화”라는 핵심 가치를 확보했다는 점에서 직접적인 품질 향상 효과가 있습니다. 🎯

문제는 이랬어요 (Issue & Debugging)

idle scheduling과 matchMedia 구독 처리가 파일마다 거의 같은 모양으로 반복되어 있었고, 향후 변경 시 동일 수정이 여러 군데 필요했습니다.

지금은 이렇게 바뀌었어요 (Solution)

공통 훅으로 조건부 활성화 로직 통합

typescript
const isMobileViewport = useMediaQueryMatch("(max-width: 1279px)");
const enabled = useIdleEnabled({
  shouldEnable: headings.length > 0 && isMobileViewport,
  timeoutMs: TOC_RUNTIME_IDLE_TIMEOUT_MS,
  fallbackDelayMs: TOC_RUNTIME_FALLBACK_DELAY_MS,
});

각 컴포넌트가 비즈니스 조건만 선언하면 공통 훅이 idle/fallback/구독 처리를 담당하게 되어 코드 가독성과 일관성이 좋아졌습니다.

오늘의 체크(가볍게)

  • ✅ jscpd 개선: clones 55 -> 51, duplicatedLines 1047 -> 985, duplicatedTokens 9322 -> 8846
  • ⚠️ 남은 중복은 주로 ko/en 로케일 페이지 페어 및 의도된 유사 UI 컴포넌트 영역입니다.

마무리

오늘은 “뭔가를 더 만들었다”보다 “앞으로 고치기 쉬운 구조를 만들었다”가 포인트였습니다. 다음 변경부터 체감 속도가 달라질 겁니다. 🔧

댓글로 남겨줘: 다음 라운드에서 ko/en 페이지 중복도 공통 템플릿화할까요?

#코드정리 #중복제거 #리팩터링 #런타임최적화