
시리즈 첫번째 글이었던 회고에서 가장 큰 문제로 "God Hook"을 꼽았었다.

수면 모니터링 기능의 핵심 로직이 모두 useSnoreMonitoring에 모여 있었다.
처음에는 UI와 비즈니스 로직을 분리하기 위해 커스텀 훅을 만들었지만, 프로젝트가 진행될수록 책임이 계속 추가되었다.
- 마이크 권한 요청
- 오디오 녹음
- 수면 세션 관리
- AI 분석 요청
- 알람 트리거
- 상태 관리
- 페이지 이탈 방지
...
결국 하나의 훅이 서비스 전체를 제어하는 구조가 되었다.
새로운 기능을 추가하거나 기존 기능을 수정할 때마다 기존 코드에 영향을 줄 가능성이 높아졌고, 디버깅 또한 점점 더 어려워졌다.
회고 당시에도 프로젝트 구조 개선에 이어 꼭 해봐야겠다고 생각한 리팩토링 대상이었다.
리팩토링 목표
특히 다음 상황이 없도록 만들고 싶었다.
수정할 곳이 어디쯤에 있더라... (드르륵... 드르륵... 드르륵...)
작성한 사람이 나이기 때문에 찾을 수야 있었지만,
리팩토링 이후에는 이 시간을 확 줄이고 싶었다.
먼저 useSnoreMonitoring에서 AI의 도움을 받아, 담당하고 있는 기능들을 정리하고 분리 순서를 정리했다.
분리 순서 기준
- 독립적인 기능 우선
- 당시 기준 분리가 쉬운 코드 우선
- 의존성이 높을수록 마지막에 분리
결정된 분리 순서
1. 오디오 녹음
2. AI 분석 요청
3. 알람 제어
4. 모니터링 세션 관리
5. 마이크 권한 관리
결정된 분리 순서에 따라 각 책임을 독립된 Hook으로 추출했다.

각 Hook은 자신이 담당하는 기능만 알도록 설계하려고 노력했다.
이 과정에서 각 로직이 서로 직접 호출하기도 해서 상위 Hook인 useSnoreMonitoring에서 조합하는 형태로 변경하며 진행했다.
각 1개 책임을 분리할때마다 수동으로 테스트하며 정상 동작하는지 확인하였다.
리팩토링을 진행하면서 상위 Hook이 존재하는 것이 자연스럽겠다는 생각을 하게 되었고, useSnoreMonitoring의 책임은 다음과 같이 변경하였다.
- 모니터링 시작/종료 제어
- 분리한 Hook 조합
- 페이지 컴포넌트 Unmount Cleanup
...
리팩토링 이후 useSnoreMonitoring은 더 이상 모든 기능을 직접 구현하지 않는다.
각 책임은 별도의 Hook으로 분리되었고,
상위 Hook은 이들을 조합하고 전체 흐름을 제어하는 역할을 담당한다.
문제가 생기면
→ useSnoreMonitoring부터 열어본다
알람 문제
→ useAlertManager
녹음 문제
→ useAudioRecorder
권한 문제
→ useMicPermission
수정 위치가 훨씬 명확해졌다.
그리고 약 300줄의 코드가 다음처럼 간결해졌다!

이번 리팩토링을 시작할 때 들었던 생각은
처음부터 God Hook을 만들고 싶었던 것은 아니야..
프로젝트 초반에는 이렇게 기능이 많아질지 몰랐고, 일정에 쫓기며 빠르게 기능을 구현하다 보니 자연스럽게 하나의 Hook에 로직이 계속 추가되었다.
기능이 늘어날수록 수정해야 할 코드 범위도 함께 늘어났고, 어떤 기능을 변경하더라도 useSnoreMonitoring 전체를 확인해야 하는 상황이 반복되었다.
이번 리팩토링은 리팩토링 과정부터 효과가 체감되었다.
기존에는 문제 원인을 찾기 위해 수백 줄의 코드를 스크롤해야 했다면, 확인해야 할 범위 자체가 크게 줄어들어 원인 찾는 시간이 정말 많이 줄어들었다.
이번 리팩토링이 끝나고 느낀 점은
단일 책임의 원칙은 미래의 유지보수를 위한 것만이 아닌,
현재 코드 이해를 훨씬 쉽게 만들어주는 도구이기도 하다.
앞으로는 기능 구현 속도만 고려하기보다, 책임이 과도하게 모이고 있지 않은지 경계하며 개발하려고 한다.
이번 리팩토링은 한 파일에 워낙 많은 코드가 모여 있어서, 기능을 분류하고 분리 순서를 정하는 데에 AI 도움을 좀 많이 받았다.
하지만 각 기능을 분리할 때엔 수동 테스트와 함께, 빠뜨린 부분은 없는지 점검하며 직접 디버깅하려 노력했고, 이 덕에 책임 분리의 효과를 더욱 체감할 수 있었던 것 같다.
다음 프로젝트에서는 뒤늦게 많은 시간 들이지 않도록, 책임이 모이고 있는지를 지속적으로 점검하며 개발해야겠다.
추가로, 이번 프로젝트 회고 글을 시작으로한 게시물 시리즈는 마무리 지으려고 한다. 회고하고, 리팩토링하고, 게시글을 작성하며 많이 배웠던 것 같다.
다른 일정들을 소화한 후에, 다음 프로젝트와 함께 시리즈를 또 시작하며 또 많이 배울 예정이다.