Showing Posts From
상환해야
- 11 Dec, 2025
기술 부채를 상환해야 하는데 새로운 기능을 요청받다
월요일 아침, 슬랙 한 방 출근하자마자 슬랙이 울렸다. 기획팀 이수진 님: "개발님, 이번 주 스프린트에 소셜 로그인 추가 가능할까요? 사용자 요청이 많아서요 🙏" 커피도 안 마셨다. 마우스 커서가 멈췄다. 지난주 금요일에 작성한 리팩토링 계획서를 열었다. "레거시 인증 모듈 개선 - 예상 기간 2주" 파일명 끝에 (최종)(진짜최종)(이번엔진짜).md 3개월 전에도 이랬다. 6개월 전에도.기술 부채 장부 우리 서비스 인증 모듈은 4년 전 코드다. 당시 주니어가 급하게 만들었다. 그 주니어가 나다. UserAuthService.java 파일을 열면 숨이 막힌다. 1,247줄. 메서드 하나가 350줄. if 문이 7단 중첩. 주석은 "// 나중에 고치기" 이걸 고치려면 최소 2주다. 테스트 코드 작성 3일. 리팩토링 5일. QA 3일. 버퍼 3일. 근데 새 기능은 3일이면 된다. 소셜 로그인 API 붙이고, 기존 로직 우회하면 끝. 기획자 입장에선 당연히 새 기능이다. 사용자는 리팩토링을 모른다. 경영진도 모른다. 속도만 안다.회의실, 30분 PM이 물었다. "둘 다는 안 되나요?" 테크 리드인 나는 설명했다. "기술 부채 상환하면서 새 기능 개발하면, 둘 다 늦어집니다." "그럼 리팩토링은 나중에 하면 안 돼요?" "6개월째 나중입니다." PM이 한숨 쉬었다. 나도 한숨 쉬었다. 결국 타협했다. 소셜 로그인 먼저. 리팩토링은 다음 스프린트. 다음 스프린트엔 또 급한 게 생긴다. 알고 있다. 다들 알고 있다. 회의실 나오면서 후배 개발자가 물었다. "형, 리팩토링 언제 하는 거예요?" "다음에." "지난번에도 다음에라고..." 말을 잇지 못했다.빚은 눈덩이처럼 기술 부채는 이자가 붙는다. 소셜 로그인을 기존 인증 모듈에 덕지덕지 붙였다. UserAuthService.java가 1,247줄에서 1,489줄이 됐다. if 문이 8단 중첩. 새로운 주석이 추가됐다. "// TODO: 전체 리팩토링 필요. 2024.03.11" 2주 뒤, 기획팀에서 또 연락 왔다. "애플 로그인도 추가해야 해요. iOS 필수래요." 1,489줄이 1,672줄 됐다. if 문이 9단 중첩. 주석이 하나 더 늘었다. "// FIXME: 이거 진짜 개판임. 누가 좀..." 그게 나다. 한 달 뒤, 버그 리포트가 올라왔다. "특정 조건에서 로그인 안 됨" 디버깅하는데 4시간 걸렸다. if 문 6단계 안쪽에 숨어 있는 버그. 원래 코드 짠 사람도 모를 거다. 나도 모르겠다. 내가 짰는데. 다른 팀은 어떨까 점심시간에 옆 팀 시니어 개발자를 만났다. 김치찌개집 단골. "너네 팀은 리팩토링 시간 받냐?" "우린 스프린트마다 20% 할당해." 부럽다. "어떻게 설득했어?" "CTO가 개발자 출신이라." 우리 CTO는 영업 출신이다. "빠르게 만들면 되지, 왜 고쳐?" 설명해도 이해 못 한다. '작동하는데 왜 고쳐'가 그분 철학이다. 다른 회사 동기한테 물어봤다. 카톡으로. "너네는?" "우린 장애 나야 리팩토링 시간 받음." "장애 안 나면?" "계속 쌓이지 뭐." 다들 비슷하다. 위안이 안 된다. 설득의 기술 기술 부채를 설명하는 건 어렵다. 비개발자에게 "레거시 코드가..."라고 하면 "그래서 영업일 기준 며칠?"이라고 묻는다. "속도가 느려져요"라고 하면 "지금 느린가요?"라고 묻는다. "나중에 큰 문제가..."라고 하면 "나중이 언제죠?"라고 묻는다. 대답할 수 없다. 언제 터질지 모른다. 터지기 전까진 멀쩡해 보인다. 그래서 나는 다르게 설명한다. "새 기능 개발 속도가 점점 느려집니다." 구체적 숫자를 댄다. "3개월 전엔 3일 걸리던 게 지금은 5일 걸립니다." "다음 분기엔 7일 걸릴 겁니다." "리팩토링하면 다시 3일로 줄어듭니다." 그래도 안 통한다. 결국 장애가 나야 한다. 장애가 나면 모두가 심각함을 안다. 그때 리팩토링 시간을 받는다. 소 잃고 외양간 고친다. 결국 타협 이번 스프린트 계획을 다시 짰다. 소셜 로그인 개발: 3일 애플 로그인 추가: 2일 버그 수정: 1일 회의, 코드 리뷰: 2일 예상 못 한 일: 2일 리팩토링: 0일 스프린트 회고 때 말했다. "기술 부채 관리 시간이 필요합니다." PM이 고개를 끄덕였다. "다음 분기 로드맵에 반영할게요." 이게 세 번째다. 다음 분기에도 급한 게 생긴다. 그래서 나는 포기하지 않는다. 매번 말한다. 회고 때마다. 스프린트 계획 때마다. "리팩토링 시간이 필요합니다." 언젠가는 될 거다. 장애가 나거나. 내가 이직하거나. 농담이다. 반은. 그래도 일은 한다 월요일 오전 11시. 소셜 로그인 개발 시작했다. 일단 기존 코드를 분석한다. 1,672줄을 스크롤한다. 한숨이 나온다. if 문 미로를 헤맨다. "이게 뭐지?" 주석도 없다. git blame으로 작성자를 확인한다. 나다. 2년 전 나다. 당시엔 급했을 거다. 지금 나도 급하다. 그래서 또 덕지덕지 붙인다. 새로운 if 문을 추가한다. 주석을 쓴다. "// TODO: 리팩토링 필요" 언젠가 미래의 내가 볼 거다. 또 한숨 쉴 거다. 그래도 일은 한다. 동작하게는 만든다. 테스트도 돌린다. PR도 올린다. 후배가 코멘트를 단다. "이거 나중에 리팩토링하죠?" 답글을 쓴다. "응, 나중에." approve를 누른다. 퇴근길 생각 6시 30분. 모니터를 끈다. 소셜 로그인 개발 완료. 예상 3일이었는데 1일 만에 끝났다. 기존 코드 건드리지 않고 우회했다. 빠르긴 하다. 근데 찝찝하다. 파일을 닫기 전에 다시 봤다. UserAuthService.java 1,847줄이 됐다. 리팩토링 계획서를 열었다. 예상 기간을 수정했다. 2주에서 3주로. 파일명을 바꿨다. (최종)(진짜최종)(이번엔진짜)(제발).md 저장하고 닫았다. 슬랙 알림이 울렸다. 기획팀 이수진 님: "내일 회의 때 카카오 로그인도 논의해요!" 웃음이 나왔다. 쓴웃음. 가방을 챙겼다. 불을 껐다. 엘리베이터 안에서 생각했다. '다음 스프린트엔 정말 리팩토링 해야지.' 거짓말이다. 다음 스프린트에도 급한 게 있을 거다. 그래도 괜찮다. 모두가 그렇게 일하니까. 위안이 안 된다. 금요일 회고 일주일이 지났다. 소셜 로그인 배포했다. 카카오 로그인도 추가했다. 네이버 로그인 요청도 들어왔다. UserAuthService.java는 2,034줄이 됐다. 처음으로 2천 줄을 넘었다. 스프린트 회고 시간. "이번 주 잘한 점?" "빠르게 배포했어요." "개선할 점?" 침묵. 내가 말했다. "기술 부채 관리가 필요합니다." PM이 물었다. "구체적으로 얼마나 필요해요?" "3주 정도요." "3주 동안 새 기능 개발이 멈추는 거죠?" "네." "다음 다음 스프린트에 넣을게요." 이게 네 번째다. 회고가 끝났다. 다들 자리로 돌아갔다. 나는 리팩토링 계획서를 열었다. 날짜를 수정했다. 다음 다음 스프린트로. 어차피 또 밀릴 거다. 알고 있다.오늘도 빚을 쌓았다. 내일도 쌓을 거다.