- 06 Dec, 2025
장애 터지면 나 말고 고칠 사람이 없다: 휴가는 언제?
장애 터지면 나 말고 고칠 사람이 없다: 휴가는 언제? 휴가 신청서를 쓸 수가 없다 휴가 신청 화면을 3개월째 켜놓고 있다. 날짜만 선택하면 된다. 근데 못 누른다. 작년 여름. 부산 가려고 KTX 표 예매했다. 출발 2시간 전에 장애 알림. 새벽 4시에 터진 DB 락. 결국 환불했다. 수수료 2만원. 추석 때도 마찬가지였다. 고향 가는 전날 밤에 AWS 비용 폭증 알림. 누군가 무한루프 API 호출 중. 명절 내내 노트북 들고 다녔다. 어머니가 "밥이라도 먹고 해라" 하셨다. 밥 먹으면서도 모니터링 대시보드 켜놓고 있었다.올해는 아예 신청을 안 했다. 어차피 못 가니까. 대표님은 "휴가 쓰세요" 라고 한다. 근데 내가 없으면 서비스가 멈춘다. 대표님도 안다. 그래서 더 미안해한다. 근데 채용은 안 한다. 예산이 없대. 지난주 금요일. 동기가 제주도 사진 보냈다. "3박4일 힐링 중ㅋ". 나는 그 시각 배포 중이었다. 힐링이 뭔지 기억이 안 난다. 주말이 주말이 아니다 토요일 오전 11시. 침대에서 일어나려는데 슬랙 알림. "서비스 느린 것 같은데요?" 대표님이다. 주말에도 서비스 쓰시나 보다. 노트북 켰다. CloudWatch 확인. CPU 사용률 92%. RDS 커넥션 풀 다 찬 상태. 어제 배포한 기능에서 커넥션 릭. 30분 만에 핫픽스 배포. 다시 침대로. 근데 잠이 안 온다. 혹시 또 터질까봐.일요일은 더하다. 사람들이 오후에 서비스를 제일 많이 쓴다. 그래서 장애도 일요일 오후에 제일 많이 터진다. 지난 일요일. 친구들이 등산 가자고 했다. 오랜만에 나갔다. 북한산 중턱쯤 올라갔을 때 알림. API 타임아웃 증가. 결국 하산했다. 친구들은 정상 찍고 왔다. 나는 스타벅스에서 노트북 펴고 있었다. "야 너 진짜 언제까지 그러고 살래?" 친구 말이 맞다. 근데 어쩌나. 나 말고 고칠 사람이 없는데. 주말에 쉬어본 게 언제였나 생각해봤다. 3개월 전? 아니다. 그때도 Terraform 작업했다. 6개월 전? 그때는 DB 마이그레이션 했다. 주말이 주말이 아니다. 그냥 출근 안 하는 평일이다. 명절도 예외는 아니다 설날이었다. 가족들 모였다. 사촌동생이 취업 준비 중이래. "형 회사 괜찮아?" 괜찮냐고? 글쎄. "개발자 뽑아?" 우리는 계속 뽑고 있다. 6개월째. 근데 안 온다. 오는 사람은 스타트업 경험자들인데 면접에서 "개발자 몇 명이에요?" 물어보면 대답 못 하겠다. "저요" 라고 하면 바로 표정 굳는다. 밥 먹는데 폰이 울렸다. Sentry 알림. Uncaught Exception. 500에러 스파이크. "잠깐만요." 화장실 들어갔다. 노트북 가져왔으면 좋았을 걸. 폰으로 SSH 접속. 로그 확인. Redis 연결 끊김. 재시작 명령어 입력.10분 뒤에 나왔다. 아버지가 걱정스럽게 보셨다. "배탈났냐?" "아니요. 괜찮아요." 배탈도 아니고 마음탈이다. 추석 때는 더 심했다. 고향 가는 버스에서 배포했다. 4시간 동안 테더링 켜놓고. 데이터 20GB 썼다. 배포 끝나니까 배터리 8%. 도착했을 때는 껐다. "휴대폰도 못 쓰게 생겼네." 어머니가 충전기 주셨다. 근데 사실은 의도적으로 다 쓴 거다. 알림 안 받으려고. 진짜 쉬고 싶어서. 2시간 뒤에 다시 켰다. 슬랙 메시지 47개. 카톡 32개. 부재중 전화 3통. 다 대표님. 명절도 예외가 아니다. 사람들은 쉬니까 서비스를 더 쓴다. 그러니까 장애도 더 터진다. 나는 더 일한다. 밤 11시 알림의 공포 요즘 제일 무서운 시간이 밤 11시다. 씻으려고 욕실 들어가는데 알림. 씻다 말고 나왔다. 머리에 샴푸 묻은 채로 노트북 켰다. 물방울이 키보드에 떨어졌다. API Gateway 타임아웃. Lambda cold start 문제. Provisioned Concurrency 설정 잊어먹었다. 30분 만에 해결. 다시 샤워하러 갔다. 물이 차가워졌다. 새벽 2시 알림도 자주 온다. 잠들었을 때. 꿈에서도 알림음 들리는 것 같아서 깬다. 진짜 알림인지 확인한다. 진짜다. 일어난다. 한 번은 꿈이었다. 근데 일어나서 확인했다. 습관이 됐다. 이제는 알림 없어도 새벽에 깬다. 확인한다. 다행히 알림 없다. 근데 잠이 안 온다. 혹시 모니터링 시스템이 죽은 건 아닐까. 확인한다. 살아있다. 다시 눕는다. 1시간 뒤에 또 깬다. 수면 패턴이 망가졌다. 건강검진에서 의사가 그랬다. "수면의 질이 안 좋네요. 스트레스 받는 일 하세요?" "네. 개발자요." "음... 일 줄이셔야 할 것 같은데요." 줄이고 싶다. 근데 어떻게 줄이나. 장애는 내가 정하는 게 아닌데. 알림 끄면 되지 않냐고? 껐다가 큰일 났다. 새벽 3시에 터진 장애. 9시에 출근해서 알았다. 대표님 얼굴이 창백했다. 유저 100명 이탈. 매출 타격. 사과문 올렸다. 그날 이후로 알림은 절대 안 끈다. 진동 켜놓고 잔다. 베개 밑에 폰 넣고 잔다. 언제든 깰 준비. 병원 예약도 못 잡는다 이가 아프다. 3주째다. 치과 가야 한다. 근데 예약을 못 잡는다. 평일 낮에 가려면 반차를 써야 한다. 근데 반차 쓰고 나가면 그 시간에 장애 터지면? 치과에서 노트북 펼 수는 없다. 마취하고 있는데 슬랙 알림 오면? 입 벌리고 있는데 전화 오면? 결국 진통제 먹고 버틴다. 타이레놀 500mg. 하루 3알. 3주째. 위도 아프기 시작했다. 건강검진도 2년째 미뤘다. 작년에 예약했는데 전날 밤에 배포 이슈. 취소했다. 올해도 예약했다. 또 취소했다. DB 마이그레이션 날짜랑 겹쳤다. 병원 갈 시간도 없다. 아프면 그냥 참는다. 약국 가서 약 사먹는다. 약사가 "병원 가보세요" 한다. "네" 하고 나온다. 안 간다. 못 간다. 허리도 아프다. 의자가 안 좋다. 회사 의자는 10만원짜리 사무용 의자. 집 의자는 이케아 5만원짜리. 둘 다 요추 지지 같은 건 없다. "허리 아프다"고 말했다. 대표님이 "의자 바꿔드릴까요?" 했다. 고마운데 사양했다. 의자 바꾼다고 해결될 문제가 아니다. 앉아있는 시간을 줄여야 하는데 그게 안 된다. 운동도 못 한다. PT 3개월 끊었다. 한 달 다니고 안 갔다. 환불 안 된다. 180만원 날렸다. 트레이너가 연락 왔다. "요즘 바쁘세요?" 바쁘다. 죄송하다. 몸이 망가지고 있다. 안다. 근데 어쩌나. 서비스 안 망가뜨리려고 내 몸이 망가진다. 온콜의 기회비용 온콜이 뭔지 아나. 24시간 대기조. 언제든 투입 가능 상태. 군대 같은 거다. 민간인이 군대 생활 하는 거다. 근데 온콜 수당은 없다. 연봉에 포함이래. 4800만원에 365일 온콜이 포함. 시급으로 계산하면 얼마나 될까. 하지 말자. 계산하면 화난다. 친구가 대기업 다닌다. 온콜 돌면 하루 10만원 받는대. 주말 온콜은 15만원. 부럽다. 우리는 온콜이 기본값이다. 온콜 아닌 날이 없다. 휴가 써도 온콜. 병가 써도 온콜. 퇴사하기 전까지는 온콜. 온콜의 기회비용을 생각해봤다. 데이트 못 한다. 약속 잡으면 취소한다. 3번 취소하면 끝이다. 그래서 약속 안 잡는다. 취미생활 못 한다. 등산, 헬스, 영화, 게임. 다 중간에 끊긴다. 롤 게임 중에 알림 오면? 팀원들한테 욕먹는다. 그래서 게임도 안 한다. 자기계발 못 한다. 책 읽으려고 하면 알림. 온라인 강의 들으려고 하면 알림. 결국 기술 블로그만 본다. 그나마 짧으니까. 근데 그것도 집중 안 된다. 사람들 만날 수가 없다. 약속 잡으면 "혹시 급한 일 생기면 못 갈 수도 있어" 라고 미리 말한다. 그러면 "그럼 다음에 하자" 한다. 다음은 안 온다. 고립된다. 집-회사-집. 가끔 카페. 근데 카페도 일하러 간다. 노트북 들고 간다. 쉬러 가는 게 아니다. 온콜의 기회비용. 내 인생이다. 대체자가 없는 시스템 Single Point of Failure. SPOF. 시스템 설계에서 제일 피해야 할 거. 근데 나는 SPOF다. 나 하나 없으면 서비스가 멈춘다. 프론트엔드 나. 백엔드 나. 인프라 나. DB 나. 배포 나. 모니터링 나. 장애대응 나. 코드리뷰? 그런 거 없다. 나한테 리뷰할 사람이 없으니까. 버스팩터가 1이다. 내가 버스에 치이면 서비스 끝. 대표님도 안다. 그래서 "조심히 다니세요" 한다. 진담인지 농담인지 모르겠다. 인수인계 문서 써놨다. 100페이지. Notion에. 근데 이걸 누가 읽나. 누가 이해하나. 3년간 쌓인 컨텍스트를 어떻게 글로 전달하나. "왜 이렇게 짰어요?" 라고 물어볼 사람이 없다. 3개월 뒤에 내가 내 코드 보고 "왜 이렇게 짰지?" 한다. 주석이 없다. 당시엔 급했으니까. 채용 공고 올렸다. "시니어 풀스택 개발자 구함". 6개월째 안 뽑힌다. 지원자는 온다. 근데 조건이 안 맞는다. "연봉 7000 이상이요." 우리는 5500까지 준다고 했다. 대표님이 "협의 가능" 하셨다. 근데 진짜 협의 가능한가? 내 연봉 깎아서 주나? "주 5일 근무죠?" 그렇다고 했다. 근데 온콜 얘기하니까 표정이 굳었다. "회사에 개발자가 몇 명이죠?" "저요." 그 뒤로 연락 없다. 대체자가 없다. 나를 대체할 사람을 뽑지 못한다. 그래서 나는 계속 여기 있다. 못 떠난다. 떠나면 서비스가 죽으니까. 책임감이라는 족쇄 솔직히 이직하고 싶다. 매일 생각한다. 이력서 업데이트했다. 링크드인 프로필 손봤다. 포트폴리오 정리했다. 원서도 넣어봤다. 몇 군데 면접도 봤다. 면접에서 물어봤다. "온콜 있나요?" "네, 있는데 로테이션 돌아요. 일주일씩." 일주일씩? 그것도 돌아간다고? 천국이다. "팀이 몇 명이에요?" "백엔드가 5명이고요. 프론트가 3명이고." 8명? 8명이나? 부럽다. 오퍼 받았다. 연봉 6500. 지금보다 1700 많다. 스톡옵션도 더 많다. 팀도 있다. 온콜도 돌아간다. 근데 못 갔다. 대표님한테 말씀드렸다. "이직 제안 받았습니다." 대표님이 당황하셨다. "연봉 맞춰드릴게요." "연봉 문제가 아니에요." "그럼 뭐예요?" "혼자는 못 하겠어요." "개발자 뽑을게요. 진짜로." 이미 6개월째 못 뽑고 있는데. 그 말 믿을 수 있나. "생각해보세요. 제발." 대표님 표정을 봤다. 진짜 힘들어 보였다. 나만 힘든 게 아니구나. 결국 안 갔다. 제안 거절했다. 이유는? 책임감. 서비스에 유저가 5천 명 있다. 유료 결제 유저가 300명 있다. 내가 떠나면 이 사람들은? 서비스 못 쓴다. 환불 받는다. 회사 망한다. 팀원들 있다. 기획자 2명, 디자이너 1명, 마케터 1명. 개발 쪽은 나 혼자지만 다른 팀원들은 있다. 내가 떠나면 이 사람들은? 다 실직자 된다. 대표님도 있다. 3년간 같이 일했다. 믿고 맡겨주셨다. 내가 떠나면? 대표님이 개발 배워야 하나? 책임감이다. 이게 나를 붙잡는다. 족쇄다. 금색 족쇄. 포기할 수 없는 것들이 너무 많다. 근데 이게 맞나? 내 인생을 포기하면서 서비스를 지키는 게? 모르겠다. 언제까지 버틸 수 있을까 요즘 생각한다. 내가 언제까지 버틸 수 있을까. 체력이 예전 같지 않다. 29살인데 벌써 이러면 안 되는데. 새벽 작업하면 다음 날 못 일어난다. 에너지 드링크 효과가 점점 짧아진다. 2시간 버티던 게 이제 30분. 정신적으로도 한계다. 알림음만 들어도 심장이 뛴다. 조건반사. 파블로프의 개. 슬랙 알림음이 공포다. 집중력도 떨어진다. 코드 짜다가 멍 때린다. 뭐 하려고 했더라? 커밋 메시지 뭐였지? 방금 전까지 생각했는데. 사라졌다. 번아웃 증상 찾아봤다. 다 해당된다.만성 피로? 체크 수면 장애? 체크 집중력 저하? 체크 냉소적 태도? 체크 성취감 감소? 체크 사회적 고립? 체크상담 받아보라고 한다. 근데 상담 받을 시간이 없다. 상담 예약하려면 평일 낮에 가야 하는데 그 시간에 장애 터지면? 악순환이다. 힘들어서 쉬어야 하는데 쉬면 서비스가 망한다. 서비스 지키려고 버티는데 내가 망한다. 동기들 만났다. 전부 이직했다. 대기업, 외국계, 스타트업. 다들 잘 다닌다. "너 아직 거기야?" "응." "채용 안 해?" "하는데 안 뽑혀." "그럼 너 언제 나와?" "모르겠어." 진짜 모르겠다. 탈출구가 안 보인다. 개발자 뽑히기 전까지는 못 나간다. 근데 개발자가 안 뽑힌다. 그럼 영원히 못 나가나? 1년 더? 버틸 수 있을까. 체력적으로. 정신적으로. 모르겠다. 근데 버텨야 한다. 나 말고 할 사람이 없으니까. 그래도 버티는 이유 퇴사 고민하면서도 출근한다. 왜? 월급 때문? 아니다. 6500 오퍼 거절했으니까. 성장 때문? 글쎄. 혼자 하니까 성장도 한계다. 피드백 없다. 방향도 모른다. 그럼 뭐 때문? 유저들 때문인 것 같다. 어제 앱 리뷰 봤다. 별 5개. "덕분에 업무 효율 10배 올랐어요. 감사합니다!" 이런 리뷰 보면 기분이 좋다. 내가 만든 거 누가 쓴다. 그것도 좋아한다. 도움이 된다. 팀원들 때문이기도 하다. 기획자가 그랬다. "덕분에 제 기획이 세상에 나왔어요. 고마워요." 디자이너는 "내 디자인이 진짜로 움직이네요" 하면서 좋아했다. 마케터는 "전환율 올랐어요!" 하면서 기뻐했다. 내가 있어야 이 사람들 일이 결과로 나온다. 그게 의미 있다. 대표님은 가끔 말한다. "너 없으면 여기 못 돌아가. 고마워." 고맙긴 한데 그 말이 때로는 무겁다. 부담이다. 책임이다. 그래도 버틴다. 완전히 의미 없는 건 아니니까. 누군가에게 도움이 되니까. 내가 필요한 곳이니까. 근데 이게 언제까지 버틸 이유가 될까. 모르겠다. 휴가는 결국 언제? 제목으로 돌아왔다. 휴가는 언제? 답은 없다. 정확히는 모른다. 개발자 뽑히면? 그때 휴가 갈 수 있다. 근데 언제 뽑힐지 모른다. 6개월째 못 뽑고 있다. 서비스가 안정화되면? 언제 안정화될까. 기능은 계속 추가된다. 유저는 계속 늘어난다. 장애는 계속 터진다. 회사가 커지면? 시리즈 A 투자 받으면 개발팀 꾸릴 수 있다. 근데 투자는 언제? 모른다. 현실적으로 생각해보자
- 05 Dec, 2025
커밋 메시지 'fix bug', 'update', 'asdf': 정신 없음의 흔적
커밋 메시지 'fix bug', 'update', 'asdf': 정신 없음의 흔적 오늘 아침에 git log를 봤다. 지난 3일치 커밋 메시지가 이렇다. "fix bug" "update" "asdf" "quick fix" "really fix this time" "fuck" "revert fuck" ...이게 프로덕션이다.git log가 내 정신 상태 커밋 메시지를 보면 그날 내 상태가 보인다. 오전 10시: "feat: 사용자 프로필 API 구현" → 정신 멀쩡할 때다. 오후 3시: "fix profile bug" → 피곤해지기 시작. 저녁 7시: "update" → 저녁 먹고 와서 뭐 했는지 기억 안 남. 밤 11시: "asdf" → 의식의 흐름. 새벽 2시: "please work" → 간절함. 새벽 3시: "I HATE THIS" → 분노. 새벽 4시: "final fix" → 거짓말. 이게 3년차 풀스택 개발자의 커밋 히스토리다. 자랑스럽다. 의미 모를 메시지의 이유 왜 이렇게 되는가. 첫째, 시간이 없다. 커밋 메시지 쓸 정신이 없다. 대표가 "이거 언제 돼요?" 슬랙에 5번째 멘션이다. 일단 커밋하고 푸시한다. 메시지는 나중에. 근데 나중은 오지 않는다. 둘째, 정신이 없다. 동시에 3개 작업 중이다. 프론트 버그 고치다가 백엔드 API 수정하다가 DB 인덱스 추가하다가. 뭘 커밋하는지 정확히 모른다. "update" 치고 엔터. 셋째, 새벽이다. 오후 2시에 시작한 '간단한 수정'이 밤 11시에 끝났다. 연쇄 버그였다. 피곤하다. 커서가 커밋 메시지 창에 깜빡인다. 손이 알아서 "fix" 친다. 넷째, 혼자다. 코드 리뷰 없다. 컨벤션 지킬 사람도 없다. 나 말고 git log 볼 사람이 없다. 그래서 대충 쓴다. 근데 3개월 뒤 내가 본다. 그리고 후회한다.새벽 커밋의 특징 새벽 2시 이후 커밋은 특별하다. 메시지가 짧아진다. "fix"에서 "f"까지 진화한다. 타이핑할 기력도 없다. 오타가 늘어난다. "fxi bug", "updaet", "commti". 백스페이스 누를 힘도 없다. 감정이 들어간다. "please", "why", "help", "fuck". 코드에 하소연한다. 종교가 등장한다. "god please", "jesus christ", "holy shit it works". 신에게 간구한다. 어제 새벽 3시 커밋이다. "why is this even a bug" "ok this should work" "nope" "maybe now" "FINALLY" 5개 연속 커밋. 같은 버그. 40분 걸렸다. 원인은 오타였다. 변수명 "user"를 "usr"로 썼다. 'asdf'의 의미 'asdf'는 특별하다. 왼손 홈포지션이다. 아무 생각 없이 친다. 근데 자주 쓴다. 지난달에만 12번 썼다. 처음엔 부끄러웠다. 지금은 자연스럽다. 'asdf'는 내 정신 상태를 정직하게 표현한다. "지금 나 아무 생각 없음. 그냥 커밋함." 동료 개발자 있었을 때는 안 썼다. 코드 리뷰 있었으니까. "커밋 메시지 좀 제대로 써주세요" 들으니까. 지금은 혼자다. 'asdf' 맘껏 쓴다. 자유다. 슬픈 자유다. git blame 보면 웃긴다. 3개월 전 코드에 'asdf' 커밋이다. 뭔지 모른다. 다시 읽어야 한다. 과거의 나를 욕한다. "메시지 좀 써놓지." 근데 오늘도 'asdf' 쓸 것 같다. 컨벤션은 어디로 입사할 땐 다짐했다. "커밋 메시지 컨벤션 지키자. feat, fix, refactor 구분하자. 이슈 번호 달자." 1주일 갔다. 지금 컨벤션은 이렇다.오전: 제대로 씀 오후: 대충 씀 저녁: 안 씀 새벽: 욕함feat, fix는 가끔 쓴다. 기분 좋을 때. refactor는 본 지 오래됐다. 리팩토링할 시간이 어딨나. 이슈 번호는 없다. 이슈 트래커 쓸 여유가 없다. 슬랙 DM이 이슈 트래커다. 대표 톡이 백로그다. 이모지도 시도했다. ✨, 🐛, 🔥. 3일 갔다. 귀찮다. 지금은 문자만. 최소한만.역대급 커밋들 기억에 남는 커밋들이 있다. 가장 정직한 커밋: "I have no idea what I'm doing" 새벽 4시. 스택오버플로우 코드 복붙했다. 작동했다. 이유는 모른다. 정직하게 적었다. 가장 긴 커밋: "fix bug fix bug fix bug fix bug fix bug" 복붙했다. 손이 컨트롤 안 됐다. 피곤해서. 가장 짧은 커밋: "." 마침표 하나. 엔터 치려다 점 찍었다. 그냥 푸시했다. 돌아가서 고칠 기력이 없었다. 가장 화난 커밋: "WHO WROTE THIS CODE oh wait it was me" 3개월 전 내 코드였다. 똑같은 버그를 똑같이 고쳤다. 커밋 메시지도 똑같았다. "fix user bug". 학습 능력 제로. 가장 슬픈 커밋: "goodbye clean code" 기술 부채 쌓는 거 알면서 땜질했다. 시간이 없어서. 나중에 고치자. 근데 나중은 안 온다. 동료가 보면 전 직장 동기가 물었다. "너희 회사 코드 퀄리티 어때?" git log 보여줬다. 말없이 봤다. 그리고. "...너 괜찮아?" 괜찮지 않다. 근데 뭐 어쩌나. 혼자 하는데. 서비스는 돌아가는데. 커밋 메시지까지 신경 쓸 여유가 없다. "나중에 누가 보면 어떡하려고?" 나중에 사람 뽑으면 창피할 것 같다. 신입이 와서 git log 보면. "선배님 이게 뭐예요?" 할 것 같다. "음... 그때 많이 바빴어. 하하." 변명할 것 같다. 근데 지금도 바쁘다. 6개월 뒤도 바쁠 것 같다. 반복되는 메시지 같은 메시지를 반복해서 쓴다. "fix login bug" - 이거 7번 커밋했다. 로그인 버그가 7번 났다. 아니다. 근본 원인을 안 고쳤다. 증상만 고쳤다. 시간이 없어서. "update API" - 이거 21번 썼다. 뭘 업데이트했는지 모른다. 그냥 뭔가 바뀌었다. "quick fix" - 빠른 수정은 없었다. 다 2시간씩 걸렸다. 거짓말이다. "minor change" - 마이너가 아니었다. DB 스키마 바꿨다. 이거 메이저다. 근데 인정하기 싫었다. "temp" - 임시 수정. 근데 3개월 째 프로덕션이다. 영구적 임시다. 반복되는 메시지를 보면 알 수 있다. 근본 문제를 안 고친다. 시간이 없어서. 똑같은 실수를 반복한다. PR 없는 세상 전 회사는 PR 필수였다. 커밋 3개 이상 쌓이면 안 됐다. 바로 PR 올렸다. 리뷰 받았다. "커밋 메시지 수정해주세요." 피드백 받았다. 귀찮았는데 배웠다. 지금은 PR이 없다. 혼자니까. 리뷰할 사람이 없으니까. main 브랜치에 바로 푸시한다. 무법지대다. 자유롭다. 근데 무섭다. 견제가 없으니까. 내 실수를 못 잡는다. 커밋 메시지도 점점 막 쓴다. 가끔 스스로 리뷰한다. "이거 좀 이상한데." 근데 고칠 시간이 없다. "나중에." 그리고 잊는다. 브랜치 전략도 없다. feature 브랜치? develop 브랜치? 그런 거 없다. main 하나. hotfix도 main에. 전부 main에. 깃플로우는 교과서에나 나온다. 현실은 메인 브랜치 하나로 모든 걸 한다. 미래의 나에게 3개월 뒤 내가 볼 것이다. 오늘 'asdf'로 커밋한 코드를. 그리고 욕할 것이다. "이게 뭔 코드야." 근데 수정 못 한다. 또 시간이 없어서. 6개월 뒤 신입이 올지도 모른다. 온보딩하면서 git log 보여줘야 한다. "이게 우리 커밋 히스토리예요. 하하." 웃으면서 말할 것이다. 근데 웃음이 나올까. 1년 뒤 이직할지도 모른다. 포트폴리오 정리하면서 이 레포를 볼 것이다. 공개할 수 없다. 창피해서. private으로 둘 것이다. 그리고 새로 만들 것이다. 깨끗한 커밋 히스토리로. 미래의 나에게 미안하다. 근데 지금의 나도 힘들다. 서비스는 돌려야 하고. 장애는 고쳐야 하고. 기능은 만들어야 하고. 커밋 메시지까지 신경 쓸 여유가 없다. 그래도 알고는 있다. 이게 잘못됐다는 거. 언젠가 대가를 치를 거라는 거. 근데 오늘은 아니다. 내일도 아니다. 그래서 오늘도 'asdf' 친다. 그래도 가끔 제대로 쓴다. 기분 좋은 날. 새 기능 완성한 날. 리팩토링 한 날. 그럴 땐 정성껏 쓴다. "feat: 사용자 알림 시스템 구현WebSocket 기반 실시간 알림 읽음/안읽음 상태 관리 모바일 푸시 알림 연동closes #42" 이런 커밋을 쓸 때. 뿌듯하다. "나도 할 수 있네." 싶다. 근데 이런 커밋은 한 달에 2개 정도다. 나머지는 'fix', 'update', 'asdf'. 그래도 포기 안 한다. 완전히 놓진 않는다. 가끔이라도 제대로 쓴다. 그게 내 마지막 자존심이다.오늘도 'quick fix' 쳤다. 2시간 걸렸는데.
- 04 Dec, 2025
코드리뷰가 없으면 생기는 일: 내 코드가 정말 맞나?
코드리뷰가 없으면 생기는 일: 내 코드가 정말 맞나? 아무도 내 코드를 안 본다 회사에 개발자가 나 혼자다. 대표는 "풀스택이시니까"라고 했지만, 실제론 온스택이다. 프론트, 백엔드, DB, 인프라, 디자인 피드백까지. 코드리뷰? 없다. 내가 짠 코드는 내가 보고, 내가 머지하고, 내가 배포한다. PR 올리면 자동으로 머지되는 설정. 누가 볼 사람이 없으니까. 처음엔 자유로웠다. "이렇게 짜도 아무도 뭐라 안 하네?" 근데 6개월 지나니까 불안하다. 이게 맞나? 정말로?3개월 전 내 코드가 이해 안 됨 어제 버그 수정하려고 3개월 전 코드 봤다. 뭔 생각으로 이렇게 짰지? const processData = (d) => { const r = d.map(x => x.value) const f = r.filter(y => y > 0) return f.reduce((a, b) => a + b, 0) }변수명이 d, r, f, a, b다. 주석은 없다. 함수명은 processData. 뭘 process하는지 모른다. 그때는 급했다. 대표가 "오늘 중으로"라고 했다. 일단 돌아가게 짜고 배포했다. 리팩토링은 나중에 하려고 했는데, 나중은 안 왔다. 코드리뷰가 있었다면? "이거 변수명 좀 명확하게 바꾸면 안 될까요?" 한 마디면 됐다. 근데 그 한 마디 해줄 사람이 없다. 지금은 30분 걸려서 이해했다. 원래 5분이면 될 코드를. 혼자 짠 코드를 혼자 해석하는데 30분. 보안은 구글링이 전부 지난주에 JWT 구현했다. 검색해서 코드 복사하고, 약간 수정하고, 테스트하고, 배포했다. 작동한다. 로그인되고, 토큰 발급되고, 인증된다. 끝? 아니다. 며칠 뒤에 우연히 다른 글 보다가 알았다. 내 코드는 refresh token이 없다. 만료 시간도 24시간이다. 보안 헤더 설정도 빠졌다. 당장 서비스가 터지진 않는다. 근데 제대로 된 건 아니다. 그리고 나는 그걸 며칠 동안 몰랐다. 코드리뷰가 있었다면? "refresh token 구현 안 하셨네요?" "만료 시간 24시간은 좀 긴 것 같은데요?" 이런 피드백 받았을 거다. 지금은? 구글링으로 배운다. 스택오버플로우, 미디엄 글, GPT. 근데 이것도 맞는지 확인해줄 사람이 없다. 그냥 믿고 쓴다.성능 최적화는 터지고 나서 서비스 느려졌다. 페이지 로딩이 3초 넘게 걸린다. 대표한테 컴플레인 들어왔다. 원인 찾는데 반나절 걸렸다. DB 쿼리였다. N+1 문제. 반복문 안에서 쿼리 100번 날리고 있었다. for (let user of users) { const posts = await db.query('SELECT * FROM posts WHERE user_id = ?', [user.id]) user.posts = posts }이거 배포한 지 2달 됐다. 유저 적을 땐 괜찮았다. 지금은 유저 500명이다. 느리다. JOIN으로 한 방에 가져오면 됐다. 근데 나는 2달 동안 몰랐다. 코드리뷰가 있었다면? "이거 N+1 아닌가요?" 배포 전에 잡았을 거다. 근데 없었다. 그래서 2달 동안 느린 서비스 운영했다. 최적화는 항상 터지고 나서 한다. 미리 못 잡는다. 혼자니까. 컨벤션은 내 기분 어제는 camelCase 썼다. 오늘은 snake_case 쓴다. 함수명도 일관성 없다. getUserData, fetch_user, loadUserInfo. 다 같은 기능이다. eslint 설정? 했다. 근데 급하면 // eslint-disable-line 박는다. 고칠 시간 없으니까. 코드 스타일 가이드? 없다. 내가 만들까 생각은 했다. 근데 나 혼자 지킬 가이드를 왜 만들지? 결과는 코드베이스가 난장판이다. 파일마다 스타일이 다르다. 내가 쓴 코드인데 통일성이 없다. 코드리뷰가 있으면? "컨벤션 맞춰주세요" 한 마디면 된다. 그럼 고친다. 근데 그 한 마디가 없으니까 계속 제멋대로 쓴다.틀린 줄도 모르고 배포 지난달에 결제 로직 짰다. 테스트했다. 잘 됐다. 배포했다. 일주일 뒤에 CS 들어왔다. "결제는 됐는데 포인트가 안 쌓여요." 코드 봤다. 로직 순서가 틀렸다. 결제 완료 후에 포인트 적립해야 하는데, 결제 전에 체크하고 있었다. 그래서 실패하면 포인트가 안 쌓였다. 버그다. 명백한 버그. 근데 나는 일주일 동안 몰랐다. 테스트할 때는 성공 케이스만 봤으니까. 코드리뷰가 있었으면? "실패 케이스는 어떻게 처리하나요?" 물어봤을 거다. 그럼 고쳤다. 배포 전에. 지금은? 버그 터지고 나서 안다. CS 들어오고 나서 고친다. 그 전까지는 모른다. 기술 부채는 계속 쌓임 리팩토링 해야 할 코드 리스트가 notion에 20개 있다. 3개월 전부터 있다. 하나도 안 건드렸다. 왜? 시간이 없어서. 항상 급한 게 먼저다. 신규 기능, 버그 수정, 장애 대응. 리팩토링은 우선순위가 제일 낮다. 근데 코드는 점점 복잡해진다. 임시방편 코드가 쌓인다. "나중에 고쳐야지" 주석이 10개 넘는다. 코드리뷰가 있으면? "이거 지금 고치는 게 나중에 편할 것 같은데요?" 누가 말해준다. 그럼 우선순위가 올라간다. 혼자면? 내가 판단한다. 그리고 항상 미룬다. 급한 게 먼저니까. 그래서 기술 부채만 쌓인다. 6개월 전 코드베이스보다 지금이 더 복잡하다. 기능은 많아졌는데 품질은 떨어졌다. 혼자라서 막을 수가 없다. 배울 기회가 없음 전 직장에선 시니어가 코드리뷰 해줬다. "이렇게 짜면 메모리 누수 생겨요." "이 라이브러리 쓰면 더 간단해요." 배웠다. 지금은? 배울 사람이 없다. 구글링으로 배운다. GPT한테 물어본다. 근데 이게 실무에서 맞는 방법인지 모른다. 예를 들어 상태관리. Redux 쓸까, Zustand 쓸까, Context API로 충분할까? 모른다. 그냥 내가 아는 거 쓴다. 근데 이게 최선인지는 모른다. 코드리뷰가 있으면 배운다. "이 경우엔 이게 더 나아요" 실무 경험이 쌓인 사람이 알려준다. 혼자면? 시행착오로 배운다. 틀려봐야 안다. 효율이 떨어진다. 3년 차인데 실력은 2년 차 같다. 성장이 더디다. 혼자라서. 책임은 오롯이 혼자 장애 터지면? 내 책임이다. 버그 나면? 내 책임이다. 느리면? 내 책임이다. 코드리뷰가 있었다면? 책임이 나뉜다. "이 부분은 제가 못 봤네요" 리뷰어도 일부 책임진다. 혼자면? 전부 내 책임이다. 내가 짜고, 내가 리뷰하고, 내가 배포했다. 틀리면 내 잘못이다. 심리적 압박이 크다. 배포할 때마다 불안하다. "이거 괜찮나?" 확신이 없다. 근데 배포해야 한다. 일정이 있으니까. 그래서 주말에도 모니터링 본다. 슬랙 알림 켜놓는다. 장애 나면 내가 고쳐야 하니까. 도와줄 사람이 없으니까. 휴가도 못 간다. 작년에 3박 4일 갔다가 2일 차에 장애 알림 와서 노트북 열었다. 해결하는데 4시간 걸렸다. 휴가가 아니었다. 그래도 돌아가긴 함 이렇게 써놓고 보니 암울하다. 근데 서비스는 돌아간다. 유저도 늘고 있다. 매출도 난다. 코드가 완벽하지 않아도 비즈니스는 굴러간다. 버그 있어도 고치면 된다. 느려도 최적화하면 된다. 완벽한 코드보다 빠른 실행이 중요할 때가 있다. 스타트업이 그렇다. 일단 만들어야 한다. 근데 불안하다. 내 코드가 정말 맞나? 더 나은 방법이 있는 거 아닌가? 확인할 방법이 없다. 코드리뷰는 완벽을 위한 게 아니다. 확신을 위한 거다. "이 정도면 괜찮아" 누군가 말해주는 거. 혼자서는 그 확신이 없다. 채용 공고는 6개월째 회사는 개발자 뽑으려고 한다. 채용 공고 올렸다. 6개월 됐다. 지원자는 3명 왔다. 면접 봤다. 안 뽑았다. 왜? 연봉이 낮아서. 우리는 4500 제시했다. 지원자는 6000 원했다. 안 맞았다. 대표는 "조금만 더 버텨줘요" 한다. 근데 조금이 6개월이다. 언제까지 버텨야 하나? 다음 개발자 오면? 코드리뷰 해줄 수 있다. 서로 봐줄 수 있다. 책임도 나눌 수 있다. 휴가도 갈 수 있다. 근데 안 온다. 그래서 계속 혼자다. 이직은 고민 중 요즘 이직 생각 많이 한다. 중견 기업이나 좀 큰 스타트업. 개발팀이 있는 곳. 코드리뷰 받고 싶다. 시니어한테 배우고 싶다. 혼자 떠안지 않고 싶다. 근데 망설여진다. 내가 떠나면 이 서비스는? 대표는? 유저들은? 책임감이 발목을 잡는다. 그리고 불안하다. 밖에 나가면 내 실력이 얼마나 되나? 3년 차인데 2년 차 실력이면? 떨어지면 어쩌지? 코드리뷰 없이 3년 일했다. 내 코드가 시장에서 통할까? 확신이 없다. 이력서는 썼다. 아직 안 넣었다. 조금만 더 버티면? 개발자 오면? 그러다 또 6개월 간다.코드리뷰는 사치가 아니다. 혼자라서 느낀다. 더 나은 코드보다, 확신이 필요하다. "이거 맞아" 한 마디가.
- 03 Dec, 2025
터미널 탭 20개, 내 정신 상태를 나타내는 지표
터미널 탭 20개, 내 정신 상태를 나타내는 지표 오전 10시 47분. 노트북을 열었다. 터미널 탭이 어젯밤 그대로다. 23개. 닫을 수가 없다. 어떤 게 뭔지 모른다.아침의 탭 정리, 실패 첫 번째 탭. npm run dev 돌아가는 중. 두 번째 탭. docker-compose logs -f 보고 있었나보다. 세 번째 탭. PostgreSQL 접속 상태. 쿼리 반쯤 쓴 흔적. 닫으면 안 될 것 같다. 다 의미가 있었을 거다. 어젯밤의 나는. 네 번째부터 열한 번째까지는 SSH 접속이다.프로덕션 서버 3대 스테이징 서버 1대 DB 마스터 왜인지 모를 htop 돌아가는 창 3개열두 번째 탭에서 git status 쳐봤다. Changes not staged for commit: modified: src/api/user.js modified: src/components/Header.tsx modified: migrations/20240115_add_index.sql modified: docker-compose.yml modified: .env.production5개 파일. 전부 다른 작업이다. 프론트, 백엔드, DB, 인프라, 환경설정. 이게 내 하루다. 오전: 컨텍스트 스위칭의 연속 10시 52분. 슬랙 메시지. "로그인 버튼 클릭 시 로딩 표시 안 나와요." 좋아. 프론트부터 본다. src/components/LoginButton.tsx 연다. 탭 하나 추가. 24개. const handleLogin = async () => { setLoading(true); // 이거 있는데? await loginAPI(); setLoading(false); }코드는 멀쩡하다. 크롬 개발자도구 연다. 탭 25개. 네트워크 탭 확인. API 응답이 0.2초. 너무 빨라서 로딩이 안 보이는 거였다. "빠른 건데요" 라고 말할 수 없다. setTimeout 300ms 추가한다. 11시 8분. 커밋하려는데 슬랙. "DB 용량 90% 넘었어요. 확인 부탁드려요."프론트 작업 멈춘다. 커밋 안 한다. 탭 전환. PostgreSQL 들어간다. SELECT schemaname, tablename, pg_size_pretty(pg_total_relation_size(schemaname||'.'||tablename)) AS size FROM pg_tables ORDER BY pg_total_relation_size(schemaname||'.'||tablename) DESC LIMIT 10;logs 테이블이 38GB다. 3개월치 로그가 쌓여있다. 파티셔닝 해야 하는데 시간이 없다. 일단 3개월 전 데이터 아카이빙. 새 터미널 탭 연다. 26개. pg_dump --table=logs --where="created_at < '2024-10-01'" > logs_archive.sql덤프 돌리는데 15분 걸린다고? 그동안 다른 거 해야지. 정신이 5개로 분열되는 순간 11시 23분. 덤프는 진행 중. 아까 프론트 작업 커밋하려고 했지. git add 하려는데 슬랙. "API 응답 느린데 확인 가능하세요?" 백엔드로 간다. node.js 프로세스 로그 확인. 탭 27개. tail -f /var/log/app/api.log | grep "slow query"나온다. /api/users/list 엔드포인트. 쿼리가 3초 걸린다. 코드 열어본다. 탭 28개. const users = await db.query(` SELECT * FROM users LEFT JOIN orders ON users.id = orders.user_id WHERE users.status = 'active' `);인덱스가 없다. status 컬럼에. 이거 내가 짠 건데. 언제 짠 거지. 인덱스 추가 마이그레이션 파일 만든다. 탭 29개. 11시 47분. PostgreSQL 덤프 끝났다. 아직 삭제는 안 했다. 백업 확인부터. psql test_db < logs_archive.sql테스트 DB에 복원해본다. 이것도 10분 걸린다. 그동안 인덱스 추가? 아니다. 프로덕션에 바로 추가하면 락 걸린다. 새벽에 해야 한다. 메모해둔다. 메모장 탭 연다. 30개. "TODO: 새벽 3시 인덱스 추가 - users.status" 이 메모를 볼 가능성은 30%다.점심, 먹으면서 AWS 콘솔 12시 18분. 편의점 김밥 뜯는다. 한 손으로 먹고 한 손으로 탭 정리. 닫아도 될 것 같은 거 찾는다. htop 3개 중 2개 닫는다. 28개. AWS 콘솔 확인한다. 습관이다. CloudWatch 들어간다. EC2 CPU 사용률 78%. 오전보다 올랐다. 평소 50%인데. 뭔가 있다. 확인해야 한다. 김밥 씹으면서 서버 접속. top -cnode 프로세스가 2개다. 하나는 정상. 하나는? ps aux | grep node 쳐본다. 좀비 프로세스다. PM2 재시작 안 된 거. pm2 restart all 친다. CPU 사용률 내려간다. 52%. 김밥 다 먹었다. 12시 34분. 점심시간 16분 썼다. 오후: 긴급 요청의 연속 2시 11분. 대표님 슬랙. "결제 모듈 테스트 환경 급하게 필요합니다." 결제 모듈. 토스페이먼츠. 프론트도 고쳐야 하고 백엔드도 고쳐야 하고. 스테이징 서버에 배포해야 한다. 근데 스테이징 서버 환경변수가 다르다. .env.staging 파일 연다. 탭 29개. 토스 테스트 키 찾는다. 노션에 있을 거다. 브라우저 탭 연다. 30개. 노션 로그인 만료됐다. 다시 로그인. 테스트 키 찾았다. 복사한다. .env.staging 에 붙여넣는다. 프론트 코드 수정. PaymentButton.tsx 연다. 탭 31개. const clientKey = process.env.REACT_APP_TOSS_CLIENT_KEY;환경변수 추가해야 한다. .env.development 도 수정. 탭 32개. 백엔드 코드 수정. payment.controller.js 연다. 탭 33개. 결제 승인 API 수정하고. 웹훅 엔드포인트 추가하고. 3시 2분. 배포 준비 끝. git commit -m "Add payment test environment" 친다. 배포 스크립트 돌린다. 탭 34개. ./deploy.sh staging5분 걸린다. 기다린다. 그동안 다른 거 못 한다. 불안해서. 3시 7분. 배포 끝. 테스트해본다. 결제 버튼 누른다. 에러 난다. 콘솔 확인. "CORS policy error" 아. NGINX 설정 안 했다. 서버 접속. 탭 35개. sudo vim /etc/nginx/sites-available/defaultCORS 헤더 추가. add_header 'Access-Control-Allow-Origin' '*';sudo nginx -t 테스트. sudo systemctl reload nginx 재시작. 다시 테스트. 된다. 대표님한테 메시지. "완료했습니다." 3시 29분. 저녁: 장애의 전조 6시 43분. 슬랙 알림. "사이트 느려요." 심장이 빨리 뛴다. 조건반사다. CloudWatch 연다. 이미 열려있다. RDS CPU 91%. 뭔가 쿼리가 터졌다. PostgreSQL 접속. 슬로우 쿼리 확인. SELECT * FROM pg_stat_activity WHERE state = 'active' ORDER BY query_start;10초 넘게 돌아가는 쿼리가 3개다. 전부 orders 테이블 조인. 내가 오전에 추가한 인덱스. 아직 안 만들었다. 새벽에 하려고 했는데. 지금 만들어야 한다. 프로덕션이 느리면 장애다. CREATE INDEX CONCURRENTLY idx_users_status ON users(status);CONCURRENTLY 옵션. 락 안 걸린다. 하지만 시간이 오래 걸린다. 진행 상황 확인할 방법이 없다. 기다린다. 7분. 7시 2분. 인덱스 생성 완료. 쿼리 속도 확인. 0.3초로 줄었다. RDS CPU 58%로 내려간다. 숨 쉰다. 아무도 모른다. 방금 장애를 막았다는 걸. 밤: 드디어 내 시간? 9시 17분. 퇴근 시간 한참 지났다. 사무실에 나 혼자. 오늘 한 일 정리해본다.프론트 버그 수정 1건 DB 용량 정리 (미완) API 성능 개선 결제 모듈 테스트 환경 구축 인덱스 긴급 추가5개 다른 영역이다. 오늘 못 한 일.프론트 리팩토링 백엔드 테스트 코드 작성 DB 파티셔닝 설계 CI/CD 파이프라인 개선 로그 아카이빙 자동화5개 다 못 했다. 터미널 탭 확인. 37개. 이제 정리해야 한다. 하나씩 닫는다. 어떤 건 뭐하던 건지 모른다. 그냥 닫는다. 15개 남았다. 여기서 멈춘다. 내일 쓸 것들이다. 리팩토링이나 하자. user.service.js 파일 연다. 탭 16개. 코드 보다가 슬랙 알림. "API 타임아웃 에러 났어요." 9시 48분. 다시 시작한다. 이게 정상인가 퇴근은 11시 23분. 집 가는 지하철에서 생각한다. 오늘 내가 한 일. 프론트엔드 개발자의 일. 백엔드 개발자의 일. DBA의 일. DevOps 엔지니어의 일. 그리고 장애 대응. 5명이 할 일을 혼자 한다. 아니, 5명이 제대로 하면 더 잘할 일을. 나 혼자 대충 한다. 터미널 탭 20개는. 내 정신이 20갈래로 찢어져 있다는 뜻이다. 각 탭마다 다른 문맥. 다른 언어. 다른 문제. React에서 PostgreSQL로. Node.js에서 NGINX로. AWS에서 다시 프론트로. 스위칭할 때마다. 뇌가 재부팅된다. "멀티태스킹 잘하시네요." 대표님이 칭찬한다. 멀티태스킹이 아니다. 생존이다. 채용 공고 올린 지 7개월. 아직도 혼자다. "역량 쌓기 좋은 환경이에요." 맞다. 억지로 쌓인다. 원하지 않아도 쌓인다. 근데 깊이가 없다. 전부 얕다. 급해서. 제대로 하고 싶다. 한 가지를 깊게 파고 싶다. 코드 리뷰 받고 싶다. 테스트 코드 짜고 싶다. 시간이 없다. 터미널 탭 20개가 날 기다린다. 집 도착. 12시 9분. 노트북 가방 던진다. 씻고 자야지. 근데 슬랙 확인부터. 빨간 점이 하나 있다. 열어본다. "내일 오전에 급한 건 있습니다." 하하. 웃음이 나온다. 오늘도. 내일도. 터미널 탭 20개.내일 아침 터미널 탭은 몇 개일까. 어차피 닫을 시간 없다.
- 03 Dec, 2025
리팩토링하고 싶은데 급한 기능이 또 들어왔다
리팩토링하고 싶은데 급한 기능이 또 들어왔다 오전 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번째 항목 적는다. "전체 아키텍처 재설계." 언젠가 할 거다. 오늘은 아니다. 내일도 아닐 거다. 근데 언젠가.오늘도 급한 기능이 또 들어왔다. 리팩토링은 내일.