Showing Posts From

싶은데

리팩토링하고 싶은데 급한 기능이 또 들어왔다

리팩토링하고 싶은데 급한 기능이 또 들어왔다

리팩토링하고 싶은데 급한 기능이 또 들어왔다 오전 10시 30분 출근했다. 슬랙 알림 27개. 대표님: "오늘 중으로 결제 모듈 붙여주실 수 있나요? 내일 투자자 미팅인데 꼭 보여줘야 해요." 나: "네, 볼게요." 내가 보려던 건 3주 전부터 미뤄온 인증 로직 리팩토링이었다. 코드 열어볼 때마다 토 나올 것 같은 그 코드. 회원가입, 로그인, 토큰 갱신 로직이 5군데에 중복되어 있다. 버그 고칠 때마다 5곳을 다 수정해야 한다. 오늘은 꼭 정리하려고 했다. 결제 모듈 작업 예상 시간: 6시간. 리팩토링은 또 미뤄진다.기술 부채 통장 잔고 현재 내가 파악한 리팩토링 필요 목록:인증 로직 중복 (5곳) - 3주 경과 상품 조회 API 응답속도 4.2초 (목표 1초 이하) - 2달 경과 에러 핸들링 없는 비동기 함수 148개 - 카운트 포기 테스트 커버리지 12% - 올릴 생각도 못 함 Docker 이미지 3.2GB (최적화하면 500MB 가능) - 배포 때마다 10분 DB 인덱스 없는 테이블 9개 - 점점 느려짐 하드코딩된 설정값 곳곳에 - 환경 바뀌면 재배포이게 3개월 치다. 3개월 전엔 이것보다 적었다. 6개월 전엔 더 적었다. 계속 늘어난다. 갚는 속도보다 빌리는 속도가 빠르다. 기술 부채 이자만 내고 있다. 원금은 불어난다. 결제 모듈 작업 시작 일단 급한 거부터. 기존 코드 열어봤다. 주문 로직이 컨트롤러에 다 박혀있다. 비즈니스 로직이 라우터 파일에 200줄. 서비스 레이어가 없다. "이거 나중에 정리해야지." 메모장에 적는다. 47번째 항목. 일단 결제 API 연동부터. 문서 읽는다. 콜백 URL 설정, 웹훅 처리, 실패 케이스 핸들링. 제대로 하려면 결제 서비스 레이어 만들고, 에러 처리 통일하고, 트랜잭션 관리하고. 시간 없다. 기존 코드 복붙한다. 200줄이 400줄 된다. "나중에 정리하지 뭐."오후 3시 결제 모듈 70% 완성. QA팀 (기획자가 겸함): "상품 상세 페이지 로딩 너무 느려요. 5초 걸려요." 알고 있다. 2달 전부터 알고 있다. 상품 한 개 조회하는데 DB 쿼리 17번 날린다. N+1 문제다. JOIN으로 한 방에 가져오면 0.3초 컷. "급하게 수정할게요." 임시방편으로 Redis 캐싱 붙인다. 30분 작업. 1.5초로 줄어든다. 근본적 해결은 아니다. 캐시 무효화 로직도 제대로 안 짰다. 상품 수정하면 한참 후에 반영된다. "나중에 쿼리 최적화하면서 제대로 해야지." 메모장 48번째. 기능 개발과 리팩토링의 시간 역설 기능 개발: 1시간에 완성, 성과 보임, 대표님 좋아함. 리팩토링: 3일 걸림, 겉보기 변화 없음, "그래서 뭐가 달라진 건가요?" 어떤 게 우선순위가 될까. 명확하다. 대표님 입장에선 당연하다. 투자 유치해야 하고, 고객 늘려야 하고, 매출 만들어야 한다. 코드가 예쁜지 안 예쁜지는 관심 없다. 나도 이해한다. 근데 문제는. 기술 부채가 쌓일수록 기능 개발 속도가 느려진다. 3개월 전엔 기능 하나 추가하는 데 1일 걸렸다. 지금은 2일 걸린다. 6개월 후엔 4일 걸릴 거다. 코드가 복잡해져서 버그 찾기 어렵다. 수정하면 다른 데서 터진다. 테스트도 없어서 확인도 못 한다. 결국 느려진다. 그럼 대표님이 말한다. "왜 이렇게 오래 걸려요? 예전엔 빨랐는데." 설명할 수 없다. "코드가 더러워져서요"라고 하면 "그럼 깨끗하게 하면 되잖아요"라고 한다. 시간을 달라고 하면 "급한 게 먼저 아닌가요?" 무한 루프다.저녁 7시 결제 모듈 완성. 배포했다. 대표님: "고생하셨어요! 내일 미팅에서 잘 보여드릴게요." 뿌듯하다. 3초간. 그리고 생각한다. 오늘 추가한 코드 300줄. 제대로 설계 안 한 코드. 에러 처리 부실한 코드. 테스트 없는 코드. 다음 개발자가 이거 보면 욕할 거다. 아, 다음 개발자가 없다. 나다. 3개월 후의 나다. 미래의 내가 현재의 나한테 욕한다. 매일. 악순환의 구조 기능 개발 급함 → 제대로 못 짬 → 기술 부채 쌓임 → 다음 개발 느려짐 → 더 급해짐 → 더 못 짬. 어디서 끊어야 할까. 방법은 안다. 리팩토링 시간 확보. 일주일에 하루는 기술 부채 갚기. 새 기능 개발할 때 관련 코드 정리하고 시작. 근데 현실은. 월요일: "이번 주 금요일까지 A 기능 개발 가능할까요?" 화요일: "고객 문의 많은데 B 기능 급하게 추가해주실 수 있나요?" 수요일: "투자사에서 C 기능 보고 싶대요. 이번 주 안에 가능할까요?" 목요일: 장애 대응. 금요일: A, B, C 다 못 끝냄. 주말 작업. 리팩토링 시간은 어디 있나. 밤 11시 퇴근 준비하는데 슬랙. 대표님: "내일 미팅에서 D 기능도 보여주고 싶은데, 혹시 오늘 밤에..." D 기능은 장바구니다. 장바구니 로직 제대로 만들려면 이틀 걸린다. 세션 관리, 비회원 장바구니, 로그인 시 병합, 수량 변경, 재고 확인. "급하게라도 프로토타입만 만들 수 있을까요?" 프로토타입. 임시방편. 나중에 다시 짜야 할 코드. "해볼게요." 메모장 49번째: "장바구니 제대로 다시 짜기" 노트북 다시 연다. 새벽 2시 장바구니 프로토타입 완성. 로컬 스토리지에 때려박기. 제대로 된 장바구니 아니다. 보여주기용 껍데기. 배포한다. 침대에 눕는다. 천장 본다. "내일은 리팩토링 좀 해야지." 3개월째 하는 생각. 기술 부채의 실체 기술 부채는 눈에 안 보인다. 대표님 눈엔 "기능 잘 돌아가네" 밖에 안 보인다. 내 눈엔 보인다.중복 코드 덩어리 의미 없는 변수명 (data1, data2, temp, result) 1000줄짜리 함수 주석 없는 복잡한 로직 하드코딩된 값들 try-catch 없는 비동기 함수들이게 쌓인다. 눈덩이처럼. 작은 버그 하나 고치는데 3시간 걸린다. 코드 따라가다가 길 잃는다. 스파게티다. 새 기능 추가하려는데 어디에 넣어야 할지 모르겠다. 구조가 없다. 그래서 또 아무 데나 박는다. 더 복잡해진다. 홀로 싸우는 전쟁 시니어 개발자가 옆에 있었으면. "이거 이렇게 하지 말고 저렇게 해봐." "지금 리팩토링하는 게 나중에 이득이야." "일단 구조 잡고 시작하자." 조언해줄 사람이 없다. 구글링한다. 스택오버플로우 뒤진다. 유튜브 본다. 정답을 모른다. 내가 하는 게 맞는지 모른다. 그냥 돌아가게만 만든다. 나중 생각은 나중에. 근데 나중은 안 온다. 오늘의 커밋 로그 feat: 결제 모듈 추가 fix: 상품 조회 속도 개선 (임시) feat: 장바구니 프로토타입 refactor: ...refactor 커밋은 3개월째 없다. feat, fix, hotfix만 쌓인다. GitHub contribution 그래프는 초록색이다. 매일 커밋한다. 근데 코드 품질은 빨간색이다. 매일 나빠진다. 이직을 고민하는 밤 가끔 생각한다. 이직할까. 채용공고 본다. "클린 코드", "테스트 주도 개발", "코드 리뷰 문화". 좋아 보인다. 근데 또 생각한다. 여기 떠나면 서비스 어떻게 되나. 나 말고 아무도 코드 모른다. 대표님한테 미안하다. 같이 시작했는데. 동료들한테 미안하다. 개발자 나뿐인데. 책임감이 발목 잡는다. 그래서 못 떠난다. 그래서 계속 이렇게 산다. 금요일 오후 한 주가 끝난다. 이번 주 완성한 기능: 5개. 이번 주 리팩토링: 0건. 기술 부채 목록: 49개 → 52개. 다음 주 계획: 월요일: "이번엔 진짜 리팩토링 시작해야지." 화요일: 급한 기능 요청 들어올 거다. 수요일: 그거 하느라 리팩토링 못 할 거다. 목요일: 장애 터질 거다. 금요일: 다음 주엔 꼭 하자고 다짐할 거다. 예측 가능하다. 그래도 포기는 안 한다. 언젠가 시간 생긴다. 그때 한 방에 정리한다. 그때까지 버틴다. 메모장 열고 50번째 항목 적는다. "전체 아키텍처 재설계." 언젠가 할 거다. 오늘은 아니다. 내일도 아닐 거다. 근데 언젠가.오늘도 급한 기능이 또 들어왔다. 리팩토링은 내일.