8단계 구현
며칠간 설계하고 조금씩 구현하던 새 코스 종류 도입이 마무리된 날이었다.
코스 생성부터 수료 처리, 출석체크, 약관 동의까지 플랫폼 전체를 건드렸다.
8단계로 나누어 구현했고 25개 파일이 바뀌었다.
새 코스 종류를 플랫폼에 도입하려면, 코스 정책 전반을 손봐야 했다.
기존에는 두 가지 코스 종류만 있었다.
모든 수강 정책이 이 두 종류에 맞춰져 있었다.
여기에 세 번째가 들어오니까, 모든 분기에 세 번째 갈래를 만들어야 했다.
첫 번째 단계는 코스 생성이랑 기본 설정이었다.
코스 생성 모달에서 새 종류를 선택할 수 있게 만들고 기본 정보 탭에서 종류에 따라 다른 UI가 나오게 했다.
두 번째랑 세 번째는 수강 설정이었다.
파트 완료율이랑 순차 수강 잠금을 새 종류에도 적용했다.
이전에는 특정 코스에서만 쓰던 기능을, 새 종류에서도 쓸 수 있게 확장한 거다.
네 번째는 학생 화면이었다.
잠긴 파트 UI랑 잠금 모달, 안내 메시지를 만들었다.
며칠 전에 픽셀 퍼펙트로 다듬었던 잠금 화면이 여기 들어간다.
다섯 번째는 학생 관리였다.
수료 기준, 수료 필터, 수료 통계를 새 종류에 맞게 조정했다.
여섯 번째는 마이 코스였다.
수료 후에 무제한으로 다시 수강할 수 있게 만들었다.
새 종류는 수료 후에도 계속 볼 수 있는 게 특징이었다.
일곱 번째는 약관이었다.
출석체크 분기를 새 종류에 맞게 조정했다.
출석체크가 필요한 코스랑 아닌 코스를 구분하는 분기다.
여덟 번째는 텍스트 분기였다.
코스 기본 정보랑 학생 관리 화면에서, 코스 종류에 따라 텍스트를 다르게 표시했다.
숨어 있던 버그들
새 종류를 도입하면서 숨어 있던 버그들이 드러났다.
가장 심각한 건 권한 대소문자 버그였다.
공공 매니저 권한 확인이 항상 실패하고 있었다.
권한 비교에서 대소문자를 구분했는데, 실제 토큰이랑 기대값의 대소문자가 달랐다.
그래서 항상 거절된 거다.
이 버그는 새 종류 도입과 무관하게 원래 있었지만 새 권한 모델을 만들면서 발견됐다.
그리고 코스 카드에서 잘못된 칩이 표시되는 버그도 있었다.
새 종류 코스인데 이전 종류 칩이 보이는 거다.
분기 로직이 불완전해서 생긴 문제였다.
각 UI 요소가 올바른 종류 갈래를 선택하게 수정했다.
커밋 정리
구현이 끝나고 커밋을 정리했다.
작업이 커서 커밋이 난잡해져 있었다.
이걸 9개 논리적 커밋으로 재구성했다.
리뷰하기 쉽게 기능 단위로 커밋을 나눴다.
임시 파일을 제거하고 린트 에러랑 타입체크 에러를 해당 커밋으로 흡수했다.
그러니까 CI가 깨끗하게 통과했다.
린트 에러 0개, 타입체크 에러 0개, 전체 앱 빌드 성공. 커밋을 나누는 게 왜 중요한가.
리뷰어가 한 번에 이해할 수 있는 단위로 나뉘어 있어야 리뷰가 빠르다.
거대한 커밋 하나는 리뷰하기가 어렵다.
“이 커밋이 뭘 하는지”가 명확해야 한다.
기획이랑 디자인 교차 참조
구현 과정에서 기획 문서랑 디자인을 교차 참조했다.
2순위 기능 항목을 분류하고 세부 규칙을 정리했다.
예를 들어 카카오톡 알림이 실패하면 문자로 대체 발송하는 규칙. 이런 세부 정책을 기획 문서에서 찾아서 구현에 반영했다.
기획자가 문서에 적어둔 걸 놓치면, 나중에 버그로 나타난다.
그래서 교차 참조가 중요하다.
마무리
이날로 며칠간의 새 코스 종류 도입이 마무리됐다.
처음에 범위를 정리하고 한 단계씩 구현하고 버그를 잡고 커밋을 정리했다.
가장 큰 교훈은 숨어 있던 버그가 새 작업을 하면서 드러난다는 거다.
권한 대소문자 버그는 원래 있었지만 아무도 몰랐다.
새 권한 모델을 만들면서 비로소 발견됐다.
이런 버그는 새 작업의 부산물로 자연스럽게 나온다.
그리고 커밋을 나누는 것도 중요했다.
25개 파일이 바뀌는 큰 작업을 9개 커밋으로 정리하니까, 리뷰가 가능해졌다.
거대한 커밋은 리뷰를 포기하게 만든다.
리뷰 가능한 단위로 나누는 게 코드 품질의 기반이다.