회귀 버그를 잡아서 상위 프로젝트에 기여하다
이날은 두 가지 작업을 했다.
하나는 내가 쓰는 도구에서 발견한 회귀 버그를 잡아서 상위 프로젝트에 기여한 거다.
다른 하나는 폴백 플러그인에 코드 품질 게이트를 도입한 거다.
내가 쓰는 AI 에이전트 워크플로 시스템에서 이상한 동작을 발견했다.
레거시 경로가 초기화되지 않는 문제였다.
원인을 추적해보니 리팩터링 과정에서 파라미터가 사라진 거였다.
누군가 리팩터링을 하면서 init 파라미터를 제거했다.
그랬더니 레거시 경로 초기화가 조용히 건너뛰었다.
에러도 안 나고 그냥 안 돌아가는 거다.
이런 버그를 “회귀”라고 부른다.
예전에 잘 돌아가던 게 리팩터링 때문에 깨진 거다.
리팩터링은 동작을 바꾸지 않아야 하는데, 파라미터를 빼먹으면서 동작이 바뀐 거다.
상위 프로젝트에 PR
이건 내 코드가 아니라 내가 쓰는 도구의 코드였다.
그래서 수정해서 상위 프로젝트에 PR을 올렸다.
PR 설명에 재현 단계랑 수정 내용이랑 테스트 결과를 정리했다.
재현할 수 있어야 리뷰어가 확인할 수 있다.
“이런 조건에서 이렇게 되는데, 이렇게 고치면 됩니다”를 명확히 썼다.
이 PR은 나중에 머지됐다.
내가 올린 상위 프로젝트 기여 중 하나가 됐다.
내가 쓰는 도구를 고치면서 그 도구를 쓰는 다른 사람들한테도 도움이 된 거다.
ESLint와 Prettier 도입
두 번째 작업은 폴백 플러그인에 코드 품질 게이트를 도입한 거다.
며칠간 플러그인을 빠르게 만들면서 코드가 커졌다.
버그도 여럿 나왔다.
변수 중복 선언이 전부를 멈추게 한 버그도 그중 하나였다.
이런 버그를 줄이려면 코드 품질 게이트가 필요했다.
그래서 ESLint v9 플랫 설정이랑 Prettier를 도입했다.
엄격한 규칙 80개 넘게를 적용했다.
엄격한 타입스크립트 규칙
타입 안전성에 관한 규칙을 빡세게 잡았다.
명시적인 any 금지, 안전하지 않은 할당이랑 멤버 접근 금지, 부동 프로미스 금지, null이 아님 단언 금지. 이런 규칙들이 타입 안전성을 강제한다.
변수 중복 선언 버그도 사실 린트가 잡아줄 수 있는 종류였다.
린트가 있었으면 그 버그를 사전에 막을 수 있었다.
그래서 이번에 도입한 거다.
경로 별칭 강제
그리고 경로 별칭을 강제했다.
상대 경로 임포트를 금지하고 @/ 별칭을 의무로 만들었다.
임포트 순서도 정했다.
빌트인, 외부, 내부, 부모, 형제, 인덱스 순서로 정렬한다.
이렇게 하니까 임포트가 일관되게 정렬된다.
파일을 열었을 때 어디서 뭘 가져오는지 한눈에 보인다.
그리고 @/ 별칭을 강제하니까, 경로가 깊어져도 읽기 쉽다.
에디터에서 린트가 안 돌던 문제
도입 과정에서 하나 더 잡은 게 있다.
에디터에서 ESLint가 안 돌고 있었다.
원인을 추적해보니 경로 별칭이 런타임에서 해석되지 않는 문제였다.
별칭은 빌드 도구가 해석하는 건데, 에디터는 그걸 모르니까 린트가 실패한 거다.
그래서 빌드 도구를 바꿔서 빌드할 때 경로 별칭을 해석하게 만들었다.
그러니까 에디터에서도 린트가 돌고 빌드도 제대로 된다.
검증
린트를 도입하고 전부 통과하는지 확인했다.
타입체크 에러 0개, ESLint 에러 0개 경고 0개, 테스트 82개 전부 통과, Prettier 포맷 검사도 전부 통과. 게이트를 통과하는 코드만 들어가게 만든 거다.
이 결정은 약 한 달 뒤에 검증됐다. 잠깐 Biome으로 바꿨다가 다시 ESLint랑 Prettier로 돌아온 거다.
Biome이 빠르긴 한데, 파일 스무 개 수준에서는 속도 차이가 의미가 없었다.
그리고 생태계 호환성은 ESLint가 더 좋았다.
이날 잡은 설정이 결국 끝까지 갔다.
마무리
상위 프로젝트 기여는 특별한 경험이었다.
내가 쓰는 도구를 고치면서 다른 사람한테도 도움이 됐다.
오픈소스 기여는 이런 식으로 자연스럽게 일어난다.
내가 쓰다가 불편한 걸 고치고 그걸 다시 돌려주는 거다.
린트 도입은 품질 게이트의 기반을 만든 거다.
버그가 나서 고치는 것도 중요하지만 애초에 버그가 안 나게 막는 게 더 낫다.
엄격한 규칙이 귀찮을 수는 있지만 변수 중복 선언 같은 버그를 사전에 막아준다.
그리고 에디터에서 린트가 안 돌던 문제를 잡은 것도 중요했다.
게이트를 도입해놓고 에디터에서 안 보이면, 결국 게이트를 안 지키게 된다.
에디터에서 바로 보여야 사람이 지킨다.