React Context API를 의존성 주입 도구로 활용하여 Mocking 없이 Zustand store 테스트하기
들어가며
나는 전역 상태를 선호하지 않는다. 그 이유는 아래와 같다.
- 컴포넌트 간의 의존성을 이해하고 관리하기 어렵다.
- 어디서 어떤 변경이 일어났는지 추적하기가 어렵다.
- 상태 변경이 여러 곳에서 일어날 수 있어서 상태를 예측하기 어렵다.
그럼에도 불구하고 이미지 에디터를 개발하게 되면서, 전역 상태 관리 라이브러리를 사용할 수 밖에 없었다. 그 주요한 이유는 아래와 같다.
- UI와 Canvas가 서로 영향을 미쳐야한다.
- 성능 최적화를 꿰해야 한다.
내 선호도와 관계없이, 전역 상태 관리 라이브러리가 가져다주는 이점이 크다고 생각했기 때문이다.
그리고 별 다른 문제없이 제품을 시장에 출시했고, 서비스 운영을 이어나갔다.
하지만 시간이 지남에 따라 코드베이스는 커져갔고, 이에 따라 엔지니어링적인 문제들이 수반되었다.
빠른 개발과 품질의 딜레마
제품의 개발기, 도입기를 거쳐 성장기에 진입하며 우리 팀은 좀 더 빠르게 움직일 수 있길 원했다.
개발자인 나는 더 짧은 주기로 배포 주기를 가져가야 했지만, 제약이 되는 걸림돌이 있었다.
1. 수동 테스트에 의존적인 요구사항 검증
이미지 에디터 특성상 Canvas와 UI간 상호작용이 매우 복잡했다. 예를 들어 단축키로 UNDO/REDO를 수행한다고 해보면,
- Canvas 내 이미지가 이전/이후 상태로 변경되어야 한다.
- UI의 모든 컨트롤(회전 각도, 밝기, 대비 등)이 해당 시점의 값으로 업데이트 되어야 한다.
- 여러 개의 이미지를 편집 중일 때에는 현재 선택된 이미지의 히스토리만 영향을 받아야 한다.
이런 복잡한 상호작용은 수동 테스트로 검증하기에는 너무 많은 시간이 필요했고, 놓치기 쉬운 엣지 케이스도 많았다. 특히나 우리 팀은 별도의 QA 인력이 없기에 품질 검증이 더욱 힘들었다.
2. 잦은 Hotfix
예상치 못한 버그가 프로덕션에서 발생하는 일이 잦았다. 이는 hotfix의 빈도를 증가시켰고, 계획된 작업 일정과 리소스 관리에 영향을 미치게 됐다.
배포 주기에 영향을 주는 문제들을 해결해야겠다고 생각이 들었고, 버그 케이스를 커버할 수 있는 테스트라도 작성해야겠다고 생각했다.
