← 염승준
2025.08 ~

kr-corekit

프로젝트마다 반복하던 공통 로직을 npm 라이브러리로. 남이 쓸 코드라서 달라진 기준들.

문제
  • 문자열·쿠키·포맷팅·디바이스 감지 같은 공통 로직을 프로젝트마다 반복 작성
  • 남이 쓸 코드를 배포하니 "안 깨뜨렸다"를 증명하고 하위 호환을 관리해야 했음
해결
  • 기능별 독립 모듈로 트리 셰이킹을 지원하고, 네임스페이스·개별 import를 모두 제공
  • 브라우저 API는 모킹, 타이머는 가짜 타이머로 환경 의존 함수까지 검증
  • SSR에서 window 접근 가드, 클립보드는 최신 API 실패 시 레거시 방식으로 폴백
  • 태그 푸시 시 GitHub Actions로 빌드·npm 배포 자동화
결과
  • Vitest 커버리지 약 90%, CI에서 타입 검사·테스트 자동 실행
  • 하위 호환을 깨는 변경의 기준을 세워 버전 관리

왜 만들었나

문자열 처리, 객체 조작, 쿠키, 숫자 연산, 유효성 검사, 포맷팅, 디바이스 감지. 프로젝트마다 비슷한 유틸 함수를 다시 쓰고 있었습니다. 이걸 TypeScript 라이브러리로 묶어 npm에 배포했습니다.

혼자 쓰던 코드를 남이 쓰게 되자 기준이 달라졌습니다. "동작한다"로는 부족하고, "이번 변경이 기존 사용자를 깨뜨리지 않는다"를 증명해야 했습니다.

구조

환경에 붙은 함수 다루기

브라우저 API에 의존하는 함수가 가장 까다로웠습니다.

이 두 경로를 모두 테스트하려면 전역을 바꿔 끼워야 해서 vi.stubGlobal로 모킹했고, sleep 같은 타이머 함수는 vi.useFakeTimers()로 실제 대기 없이 타이밍을 검증했습니다.

배포와 버전

타입 검사와 테스트는 CI에서 자동으로 돌고, 태그를 푸시하면 GitHub Actions가 빌드해 npm에 배포합니다. 버전은 X.Y.Z로 관리하고, 무엇이 하위 호환을 깨는 변경인지 기준을 세워 메이저·마이너·패치를 나눕니다.

Vitest 커버리지는 약 90%입니다. 이 경험은 테스트를 설계 문제로 다루기에 더 적었습니다.