Showing Posts From

스타트업

배포-롤백-재배포: 저녁 7시부터 밤 10시까지의 카오스

배포-롤백-재배포: 저녁 7시부터 밤 10시까지의 카오스

배포-롤백-재배포: 저녁 7시부터 밤 10시까지의 카오스 저녁 7시, "이번엔 다를 거야" 금요일 저녁 7시. 배포 버튼을 눌렀다. "이번엔 로컬에서 완벽하게 테스트했어." 그렇게 생각했다. 정말로.테스트 코드도 돌렸다. 로컬에서 3번 확인했다. 스테이징 환경도 문제없었다. "30분이면 끝나겠지." 주말 전에 깔끔하게 마무리하고 싶었다. 그래야 주말에 슬랙 알림 안 들리니까. 배포 스크립트가 돌아간다. Building... ✓ Testing... ✓ Deploying... ✓완벽하다. 그런데. 7시 12분, 첫 번째 신호 슬랙에 메시지가 떴다. "결제가 안 돼요?" 고객사 담당자다. 금요일 저녁인데 왜 일하시나. "확인해보겠습니다." 손이 떨린다. 아니, 떨리지 않았다. 아직은. 로그를 확인한다. Error: Payment gateway timeout Retry count: 3 Status: Failed"아." 결제 모듈이다. 방금 리팩토링한 거.7시 20분, 롤백 1차 시도 당황하지 말자. 롤백하면 된다. git revert HEAD docker-compose down docker-compose up -d익숙한 명령어들. 이론상 5분이면 끝난다. 그런데 Docker 컨테이너가 안 내려간다. "뭐가 문제야." 강제 종료한다. docker kill. 다시 올린다. 이미지를 못 찾는다. 이전 버전 이미지를 내가 언제 지웠지? "아, 지난주에 디스크 용량 확보한다고..." 다시 빌드해야 한다. 이전 버전으로. 체크아웃한다. 빌드한다. 10분 걸린다. 금요일 저녁 7시 30분인데 배포가 죽어있다. 고객사 담당자가 또 메시지를 보냈다. "아직도 안 되는데요?" "죄송합니다. 5분만 더 기다려주세요." 거짓말이다. 10분은 더 걸린다. 7시 35분, 문제의 본질 롤백이 완료됐다. 이전 버전이 떴다. 결제를 테스트한다. 여전히 안 된다. "???" 이전 버전인데 왜 안 되지? 로그를 뒤진다. 30분 전 로그를 본다. 배포 전 로그. 결제는 잘 됐다. 그럼 뭐가 문제지? 환경변수를 확인한다. PAYMENT_API_KEY=*** PAYMENT_TIMEOUT=3000타임아웃이 3초다. 이전엔 10초였는데. "누가 바꿨지?" 나다. 어제 '최적화'한다고.환경변수는 코드 롤백으로 안 돌아간다. AWS 콘솔에서 직접 바꿔야 한다. 콘솔 들어간다. ECS 태스크 정의. 환경변수 수정. 새 리비전 생성. 서비스 업데이트. 또 5분. 고객사 담당자: "지금 주문 못 받고 있어요. 매출 손실인데요." 식은땀이 난다. 8시 05분, 두 번째 배포 환경변수 수정 완료. 서비스 재시작. 헬스체크 통과. 결제 테스트. 성공. "드디어." 고객사에 메시지 보낸다. "정상화됐습니다. 불편 드려 죄송합니다." 답장이 빠르다. "근데 관리자 페이지가 안 열려요?" "..." 관리자 페이지? 그건 또 뭐야. 확인한다. 500 에러. "이건 또 뭔데." 로그를 본다. Error: Database migration pending Run 'npm run migrate' to apply migrations마이그레이션. 롤백하면서 DB도 롤백했어야 했다. 그런데 나 백업 안 만들었다. "망했다." 8시 25분, 데이터베이스 지옥 DB 마이그레이션은 롤백이 까다롭다. 특히 테이블 구조를 바꿨으면. 마이그레이션 파일을 연다. 오늘 배포에서 뭘 바꿨는지 확인한다. ALTER TABLE payments ADD COLUMN gateway_version VARCHAR(10);컬럼 하나 추가했다. 이전 코드는 이 컬럼을 모른다. "괜찮아. 컬럼 하나 지우면 돼." 그런데 이미 데이터가 들어가 있다. 오늘 7시 이후 결제 시도들. 지우면 안 된다. 데이터 손실이다. 컬럼은 남기고 코드를 수정해야 한다. 이전 버전 코드에 컬럼 참조를 추가. 핫픽스다. 금요일 밤 8시 30분에. 코드를 연다. 손이 빠르게 움직인다. // 긴급 수정 const payment = await db.payments.findOne({ // gateway_version 무시 attributes: { exclude: ['gateway_version'] } });더러운 코드다. 나중에 리팩토링해야 한다. 지금은 일단 돌아가게. 커밋. 푸시. 빌드. 배포. 또 10분. 에너지 드링크를 연다. 세 번째다. 8시 50분, 재배포의 공포 새 버전이 올라간다. 정확히는 "이전 버전 + 긴급 패치". 헬스체크. 통과. 결제 테스트. 성공. 관리자 페이지. 로딩된다. "끝났나?" 고객사에 다시 메시지 보낸다. "이번엔 정말 정상화됐습니다." 5분 동안 답이 없다. 불안하다. 답장이 온다. "네, 잘 되네요. 고생하셨습니다." 긴장이 풀린다. 등받이에 몸을 기댄다. 그런데 또 슬랙 알림. 다른 채널이다. 운영팀. "배송 조회가 느려진 것 같은데요?" "..." 9시 10분, 끝나지 않는 밤 배송 조회 API를 확인한다. 응답 속도가 느리다. 평소 200ms인데 지금 2초. "왜지." New Relic을 연다. 쿼리 성능 모니터링. SELECT * FROM orders WHERE status = 'shipped' ORDER BY created_at DESC;인덱스가 없다. 이전 버전에는 있었는데. 마이그레이션 롤백하면서 인덱스도 날아갔다. 내가 수동으로 복구 안 했다. "진짜 미치겠네." DB 콘솔 접속. 인덱스 다시 생성. CREATE INDEX idx_orders_status_created ON orders(status, created_at);10초 걸린다. 작은 테이블이라 다행이다. 배송 조회 다시 테스트. 200ms로 돌아왔다. "이제 됐지?" 슬랙을 본다. 30분 동안 새 메시지 없다. 좋은 신호다. 9시 45분, 사후 정리 모니터링 대시보드를 30분 동안 지켜본다.결제: 정상 관리자 페이지: 정상 배송 조회: 정상 에러율: 0.1% (평소 수준) 응답 속도: 정상괜찮다. 정말 끝난 것 같다. 사후 기록을 남긴다. 노션에. [장애 리포트] 2024.XX.XX 결제 장애 - 발생 시간: 19:12 - 복구 시간: 21:00 - 원인: 환경변수 타임아웃 설정 + DB 마이그레이션 롤백 미숙 - 영향: 결제 불가 48분, 관리자 페이지 불가 30분 - 대응: 환경변수 복구, 핫픽스 배포, 인덱스 재생성재발 방지책을 쓴다. 1. 환경변수 변경 이력 관리 2. 롤백 체크리스트 작성 (DB, 환경변수 포함) 3. 스테이징에서 롤백 테스트 4. 금요일 저녁 배포 자제4번은 지킬 수 있을까. 모르겠다. 밤 10시, 퇴근 책상을 정리한다. 에너지 드링크 캔 3개. 과자 봉지 2개. 터미널을 닫는다. 20개 탭. 맥북을 끈다. 아니, 못 끈다. 슬랙 알림 들어야 해서. 슬립 모드로. 집에 간다. 가방에 맥북과 충전기. 지하철에서 슬랙을 확인한다. 습관이다. 새 메시지 없다. 다행이다. 집 도착. 10시 40분. 샤워한다. 침대에 눕는다. 맥북을 옆에 둔다. "내일 아침에 로그 확인해야지." 그런 생각을 하다가 잠든다. 토요일 새벽 2시 슬랙 알림에 깬다. "결제 오류 알림" 눈을 비빈다. 맥북을 연다. 에러율 스파이크. 5분 전부터. "또?" 터미널을 연다. 손이 자동으로 움직인다. ssh production docker logs app -f로그가 흐른다. 에러가 보인다. Error: Payment gateway connection refused외부 결제 게이트웨이 문제다. 우리 쪽 이슈가 아니다. 공지를 올린다. "외부 결제 시스템 장애로 일시적으로 결제가 불가합니다. 복구 중입니다." 거짓말이다. 우리가 복구할 수 있는 게 아니다. 결제사 상태 페이지를 확인한다. "일부 서비스 장애 조치 중". "할 수 있는 게 없네." 맥북을 닫는다. 다시 눕는다. 잠이 안 온다. 월요일 아침 대표가 묻는다. "금요일에 뭐 있었어요?" "배포 장애 있었습니다." "심각했어요?" "2시간 정도 복구했습니다." "다음부턴 조심해요." "네." 조심한다고 안 생긴다. 혼자라서 생기는 거다. 코드 리뷰 없다. 더블체크 없다. 롤백 도와줄 사람 없다. 전부 나다. 기획자가 묻는다. "이번 주에 신규 기능 배포 가능해요?" "지난주 롤백 정리하고 해야 할 것 같은데요." "급한 건데..." "네, 해보겠습니다." 혼자라는 것 풀스택 개발자. 멋있는 말이다. 뭐든 할 수 있다는 뜻. 근데 뭐든 혼자 해야 한다는 뜻이기도 하다. 배포도 혼자. 롤백도 혼자. 장애 대응도 혼자. 실수해도 혼자. 수습도 혼자. 금요일 저녁 7시의 "이번엔 다를 거야"는 항상 거짓말이 된다. 그래도 다음 주 금요일에 또 배포한다. "이번엔 정말 다를 거야." 또 거짓말이겠지.다음 배포는 목요일로 미루기로 했다. 금요일은 너무 위험하다. 근데 목요일도 비슷할 거다.

개발팀은 '나'입니다: 한 명의 개발자가 모든 기술 스택을 통째로 담당하면 생기는 일

개발팀은 '나'입니다: 한 명의 개발자가 모든 기술 스택을 통째로 담당하면 생기는 일

개발팀은 '나'입니다 풀스택, 그 달콤하고 위험한 말 대표님이 면접 때 했던 말이 있다. "개발팀은 풀스택으로 구성할 거예요. 비용도 절감되고, 유연성도 있고. 다행히 당신이 React도, Node.js도, AWS도 다룰 수 있으니까." 그렇게 시작됐다. 나 혼자가 곧 개발팀이 되는 악몽. 세상에 풀스택 개발자는 많다. 근데 "풀스택이니까 다 해줄 수 있겠네"라고 생각하는 대표는 특이한 종류의 희귀동물이다. 처음엔 괜찮다고 생각했다. 자유롭다. 누가 간섭하지 않는다. 내가 하고 싶은 기술 스택으로 서비스를 만들 수 있다. React 쓰고 싶으면 쓴다. Node.js 쓰고 싶으면 쓴다. AWS 아키텍처도 내 맘대로다. 하지만 3개월 후. 아이디어가 나온다. "이 기능, 프론트에서 바로 처리할 수 있게 해줄 수 있어?" 끝나지 않는 요청. React. 라우팅 로직 추가. 상태 관리 수정. 컴포넌트 분리. 근데 API가 아직 안 나왔다. "API는?" 오늘 만든다고 했으니까. Node.js. Express 라우터 4개 추가. 데이터 유효성 검사 로직. 에러 핸들링. 근데 DB 스키마를 먼저 확인해야 한다. PostgreSQL에 테이블이 있나? 마이그레이션을 해야 하나? PostgreSQL. 기존 테이블 수정. 새 칼럼 추가. 인덱스 생성. 마이그레이션 스크립트 작성. 어제 데이터는 어떻게 처리하지? 데이터 정합성 체크. Docker. 로컬 개발 환경에서는 잘 되는데 운영 서버에서 왜 안 되지? 이미지 다시 빌드. 볼륨 마운팅 설정 재확인. AWS. S3에 파일 업로드? CloudFront 캐시 무효화? RDS 스토리지 거의 찼다고? 우린 아직 초기 스타트업인데. 프리티어는 이미 끝났고. Figma. 아 맞다, 기획팀이 없다. 대표가 그린 스케치를 보고 "이게 뭔데?" 하다가 기획자처럼 일한다. Figma 열어서 와이어프레임 그린다. 그리고 그 와이어프레임대로 코딩한다. 디자인시스템은? 없다. 한 시간이 지났다. 기능 하나가 끝났다. 기획자는 없다. 디자이너는 없다. QA는 없다. DevOps는 없다. 데이터베이스 관리자는 없다. 다 나다.하루의 흐름 (왜 이렇게 길까) 10시 출근. 아니, 이건 출근이 아니라 사무실 도착이다. 슬랙을 본다. 새벽에 온 메시지 23개. "이거 확인해주세요", "버그 났어요", "이거 언제까지 돼요?", "시간 있으시면 이것도". 대표님의 "좋은 아침입니다 :) 이것만 꼭"로 시작된 메시지들. 밤새 자지 못했다. 어제 배포 후 장애가 났으니까. 새벽 2시까지 버그 추적했다. DNS 캐싱 이슈였다. 역시 AWS다. 기획자가 요청사항 정리를 해달란다. 기획팀이 없으니까 개발자인 내가 한다. 스프레드시트 열어서 "이 요청들 우선순위 어떻게 해요?" 라고 물어본다. 대표 답장은 3시간 후. 오전 11시. 드디어 코딩을 시작한다. 프론트. 상품 목록 페이지 레이아웃이 이상하다. "왜 이렇게 나와요?" 라고 본부장이 물어본다. 아, 이건 백엔드 API가 데이터를 이상하게 준 거다. API 가서 체크한다. API. 조회 로직을 다시 본다. 쿼리가 복잡하다. PostgreSQL에서 직접 실행해본다. 근데 이상하다. 데이터가 중복으로 나온다. 조인 로직을 다시 짠다. 이번엔 뭐가 빠졌다. 서브쿼리를 추가한다. 점심 12시 30분. 밥을 먹으면서 AWS 콘솔을 본다. 이번 달 비용 추세를 본다. 또 올랐다. 왜 EC2가 이렇게 비싼 거야? RDS도 스토리지 비용이 장난 아니다. 프리티어를 벗어난 지 8개월. 스타트업 자금은 런웨이가 6개월 남았다고 했는데. 오후 1시. 대표가 온다. "이거 좀 봐주시겠어요? 경쟁사가 이렇게 했는데, 우리도 이렇게 할 수 있어?" 화면을 보여준다. 자동 추천 기능이다. "네, 할 수 있지만 시간이 걸릴 텐데요." "오늘 중으로 할 수 있어? 내일 투자자한테 보여주고 싶어." 오늘은 이미 할 일이 8개 있다. 근데 "오늘 중으로"라는 말을 들으면 할 수 없다는 건 없다. 그냥 밤새면 된다. "네, 해보겠습니다." 오후 2시부터 저녁 6시까지 4시간. Node.js에서 추천 로직을 짠다. 머신러닝은 아니고 단순 카테고리 기반 추천이다. 근데 한 번에 잘 안 되니까 여러 번 수정한다. PostgreSQL 쿼리도 최적화한다. SELECT 문이 점점 길어진다. 오후 6시. React에서 추천 섹션 UI를 만든다. 대표가 준 스크린샷을 보고 Figma에 그린 후 코딩한다. 컴포넌트는 재사용할 수 있게. 상태 관리는 Redux로. 캐싱은? 나중에 하자. 오후 8시. 밥을 먹지 않았다. 컵라면을 먹는다. 모니터 앞에서. 저녁 9시. 배포한다. Docker 이미지 빌드. AWS ECR에 푸시. ECS 서비스 업데이트. 롤아웃 안정성 설정 확인. 뭔가 느렸다. 이미지가 너무 크나? 역시 npm 의존성 문제다. 저녁 10시. QA를 누가 하나? 나다. 직접 기능을 테스트한다. 이 상품이 왜 추천돼? 저 상품은 왜 안 나와? 기준이 맞나? 다시 로직을 본다. 수정. 저녁 11시. 배포. 다시. 밤 12시. 대표에게 "완료됐습니다" 메시지. 스크린샷 2개 첨부. "오! 대박! 완벽한데요? 이거 내일 투자자한테 보여줄게. 고마워요!" 좋다. 내 일이 쓸모가 있다는 걸 느낀다. 근데 피곤하다. 밤 1시. 이제 어제 미루던 일을 한다. 리팩토링. 기술 부채 정리. 근데 시간이 없다. 새벽 2시. 자야 한다. 내일도 있으니까. 새벽 2시 30분. 여전히 깨어있다. 코드 리뷰를 받은 적이 없어서 내 코드가 맞는지 모른다. 다시 본다. 괜찮은 것 같은데? 아니면 이게 나쁜 건가? 모르겠다. 새벽 3시. 자러 간다. 새벽 4시. 휴... 또 뭔가 터진 거 같다. 슬랙 알림음. "서버 응답이 이상해요!" 일어난다. 노트북을 든다. 기술 부채는 눈덩이다 처음 3개월은 빨랐다. React 컴포넌트도 깔끔했다. API도 체계적이었다. PostgreSQL 마이그레이션도 계획적이었다. 하지만 요청이 늘었다. 시간이 줄었다. 기획도 변했다. React는 이제 상태 관리가 엉망이다. Redux 스토어에 뭐가 들었는지 모른다. Props drilling도 많다. 컴포넌트는 500줄짜리가 여럿 있다. 분리해야 하는데 시간이 없다. 새로운 기능을 먼저 추가해야 한다. Node.js는? API가 겹친다. 같은 데이터를 조회하는 엔드포인트가 3개다. 왜 3개나 있는지 기억이 안 난다. 지워도 되나? 뭐가 쓰나? 모른다. 그냥 둔다. PostgreSQL. 마이그레이션 스크립트가 10개 쌓여있다. 언제 적용했는지 모른다. 데이터가 정합하나? 체크해본 적이 없다. 인덱스가 있나? 슬로우 쿼리? 모른다. AWS RDS 성능 인사이트를 보면 경고등이 켜져 있다. "데이터베이스 로드가 높습니다." 뭐 어떻게 하라는 건지. Docker. 로컬에서는 도는데 서버에선 왜 안 돼? 환경 변수 때문인가? 볼륨 마운팅? 메모리 리미트? 복잡하다. AWS. 다양한 서비스를 쓰고 있는데 왜 이렇게 비싼가. 비용 최적화를 해야 하는데 어디서 시작해야 할지 모른다. Reserved Instance? 스팟 인스턴스? 자동 스케일링? 일단 대기만 한다. Figma. 디자인이 왜 계속 바뀌지? 사람마다 기대하는 디자인이 다르다. 코딩해놨는데 "이거 아닌데요" 하면 다시 한다. 코드리뷰는? 없다. 누가 해주나. 내가 짠 코드가 맞는지 틀린지 모른다. 그냥 잘 도는 것 같으니까 넘어간다. 나중에 문제가 터진다. 테스트 코드? 없다. 자동화 테스트? 없다. 수동 테스트만 한다. 배포 전에 "이거 제대로 도나?" 손가락 꼽으면서 기도한다. 기술 부채는 이렇게 쌓인다. 한 장의 종이처럼. 시간이 지나갈수록 두꺼워진다. 얇을 때 치워야 하는데, 계속 새로운 기능을 추가해야 하니까 못 본다. 어느 순간 눈덩이가 된다. 굴러간다. 멈출 수 없다.혼자라는 것의 위험성 개발자가 여럿이면 코드리뷰를 한다. 내가 짠 코드가 이상한지 정상인지 누군가 본다. 버그는 일찍 잡힌다. 나는 그게 없다. 어제 PostgreSQL 쿼리를 짰다. N+1 문제가 있었나? 조인을 좀 더 효율적으로 할 수 있었나? 누가 봐주지 않으니까 모른다. 그냥 도는 것 같으니까 배포한다. 4일 후. 성능이 떨어졌다. 응답 시간이 5초다. "왜 이렇게 느려요?" 라고 대표가 묻는다. 쿼리를 다시 본다. "아, 이거 좀 비효율적이네." 수정한다. 2초로 내려간다. 좋다. 근데 이걸 처음부터 안 했어야 했다. 휴가를 못 간다. 서비스가 터질까봐. 장애 알림이 올까봐. 휴가를 가도 핸드폰을 손에서 놓지 못한다. 슬랙을 계속 본다. "괜찮나?", "에러는 없나?". 여행지에서 5명이 묵는 에어비앤비에서 혼자 노트북을 켠다. 부다페스트에 갔을 때. 발리에 갔을 때. 그 때도. 회사에서 배우려는 기술이 있다. 새로운 프레임워크. 데이터베이스 최적화. 아키텍처 디자인 패턴. 공부하고 싶다. 근데 언제 하나? 유튜브에서 강의를 찾는다. 책을 산다. 읽는다. 한 장이면 졸린다. 피곤해서. 멘토가 없다. 내가 짠 아키텍처가 맞나? 의견을 나눌 사람이 없다. 대표는 기술을 모른다. 동료 개발자도 없다. 혼자 판단한다. 그리고 나중에 후회한다. "이건 이렇게 했어야 했는데." 면접을 본다. 새 개발자를 뽑아야 한다. 6개월째 공석이다. 근데 누가 면접을 본다? 나. 이력서를 읽고, 전화면접을 하고, 기술면접을 한다. 시간이 없는데. 채용공고를 내도 반응이 없다. 혼자 개발 중인 스타트업. "앞으로도 혼자겠겠네요" 라고 생각하는 개발자들이 많다. 실제로 그럴 거다. 그러면 내가 더 많이 한다. 혼자니까. 야근 문화도, 기술 선택도, 모든 게 이미 정해져 있다 11시에 출근한다. 원래는 9시였는데, 새벽 2시까지 일하니까 11시 출근을 하기로 했다. 하지만 정한 건 말일 뿐이다. 화상회의가 10시에 있으면 10시에 나간다. 장애가 밤 3시에 터지면 3시에 일어난다. 야근 문화? 없다. 문화라는 건 선택의 여지가 있을 때 말이다. 나는 할 일이 많으니까 자동으로 야근한다. 주말도 마찬가지다. "쉬세요!" 라고 대표가 말한다. 신경 써줘서 고맙지만, 쉴 수 없다. 장애가 터질까봐. 서비스가 느려질까봐. 일요일 밤 11시에 슬랙 알림이 울리면? 노트북을 든다. 그것뿐이다. 기술 선택도 내가 한다. React? 당연히. 나는 React를 잘 안다. 새로운 프레임워크를 배울 시간이 없다. Node.js? 당연히. JavaScript를 하나의 언어로 통일하면 편하다. 누군가 이견을 제시할 사람이 없으니까. PostgreSQL? "왜 이거 골랐어?" 라고 물어볼 사람이 없다. 그냥 관계형 DB가 필요하니까 PostgreSQL. 이 선택들이 맞나? 모른다. 더 좋은 대안이 있나? 있을 수 있다. 근데 배울 시간이 없다. 그냥 현재 스택으로 계속 간다. 기술 부채처럼 아키텍처 부채도 쌓인다. 스타트업이니까 빠르게 움직여야 한다. 그건 맞다. 근데 "빠르게 = 나 혼자 다 한다"는 방정식이 언제부턴가 생겼다. 대표와 나. 둘 다 이 방정식을 받아들였다. 누가 먼저 제안한 건지는 모르겠다. 어쨌든 지금은 이렇게 돌아간다. 연봉 4800만원, 그리고 스톡옵션 0.5% 연봉을 협상했을 때, 나는 이 모든 일을 할 줄 몰랐다. "풀스택이니까 연봉을 4800으로 제시할게요." 시장 가격은 5500에서 6500 사이였다. 나는 1000 이상을 내려줬다. 스타트업이니까. 초기 기업이니까. 그리고 주식 0.5%를 받기로 했다. 주식의 가치를 계산해봤다. 회사의 현재 평가액이 50억이라고 치자. 0.5%는 2500만원이다. 근데 지금은 의미가 없다. 상장하거나 인수될 때 의미가 생긴다. 그 확률이 얼마나 될까? 스타트업의 10%만 성공한다고 한다. 우린 어느 쪽일까? 연봉 4800에서 세금 떼고 나면 3600 정도다. 서울 월세 80만원, 생활비 150만원, 통신비, 보험. 남는 게 얼마나 될까? 많지 않다. 동기들은 어디 가 있을까? 대기업 분석가: 연봉 6500, 보너스 있음, 의료보험 완벽, 퇴직금, 휴가 자유로움. 네이버 개발자: 연봉 6800, 자유로운 휴가, 기술 커뮤니티 활발, 코드리뷰 문화 있음. 당신 회사 개발자: 연봉 5800, 딱 11시간 근무, 장애 지원팀 있음. 나? 연봉 4800, 24시간 온콜, 코드리뷰 없음, 휴가 못 감. 아직 3년 경력인데. 근데 떠날 수가 없다. 왜냐하면 서비스가 터질 것 같으니까. 내가 떠나면 누가 하나? 대표도 코딩을 안 하고, 다른 개발자도 없다. 책임감이 있는 건지, 아니면 그냥 정신없는 건지 모르겠다.내일은 어떻게 될까 사직서를 작성했다. 세 번이나. "안녕하세요. 개인적 사유로 사직을 신청합니다." 지우고 다시 저장했다. 세 번이나. 떠나면 뭐가 될까? 처음 한 달은 좋을 것 같다. 쉴 수 있으니까. 책도 읽고, 영화도 보고, 연애도 해보고. 두 번째 달. 불안하다. 이 회사 또 망했나? 알림을 켠다. 뉴스를 본다. 뭐가 나왔나? 세 번째 달. 후회한다. "내가 떠난 후 어떻게 됐을까?" 궁금하다. 동료들에게 연락한다. "어떻게 되고 있어요?" 결국 이직할 거다. 근데 이 회사는? 역설적으로, 나 때문에 서비스가 잘 도는 거다. 내가 모든 기술 스택을 이해하고, 버그를 빨리 잡고, 기능을 빨리 추가한다. 효율적이다. 대표 입장에선. 근데 나한테는 지옥이다. 이걸 어떻게 해결할까? 개발자를 더 뽑는다. 그럼 교육에 시간이 걸린다. 기존 코드를 설명해야 한다. 온보딩 과정. 그 시간에 새로운 기능은 더디다. 대표는 불만족한다. 아니면 내가 더 견딘다. 내년도, 그 다음 해도. 언제까지? 몰라. 혹은 영리하게 한다. 문서화한다. 아키텍처를 정리한다. 코드를 정리한다. 점진적으로 다른 개발자가 들어올 준비를 한다. 그럼 시간이 걸린다. 하지만 결국 그게 맞다. 근데 할 시간이 없다. 주 5일 중 4.5일을 버그 수정하고 기능 추가하는데 쓴다. 나머지 0.5일은 AWS 비용 확인하고, 배포 설정 확인하고, 슬랙 처리하는데 간다. 문서화할 시간은 없다. 악순환이다. 오늘 저녁도 야근할 거다. 내일도. 모레도. 언제쯤 변할까? 아마도 다음 중 하나:회사가 자금 부족으로 망한다. 나의 건강이 악화된다. 새로운 개발자가 들어온다. 내가 사직한다.어느 것이 먼저 올까? 요즘 따라 건강검진 결과가 자꾸 떠오른다. "스트레스 지수: 높음" "수면 부족: 주의" "혈압: 약간 높음" 30살도 안 됐는데. 이게 평생 이렇게 갈까? 아니다. 언젠가는 바뀔 거다. 분명히. 하지만 오늘은 아니다. 오늘도 야근한다.내일은 좀 나아지겠지. 아마도.