새벽 2시, 나는 왜 아직도 터미널을 열고 있는가

새벽 2시, 나는 왜 아직도 터미널을 열고 있는가

새벽 2시, 나는 왜 아직도 터미널을 열고 있는가 '이것만 하고 자자'는 거짓말 밤 10시. 노트북 화면에 떠 있는 시간을 본다. 충분하다. 오늘은 정말 이것만 하고 자겠다고 다짐한다. 간단한 버그 하나. React 컴포넌트의 렌더링 성능 문제. 5분이면 될 거 같은데. "아, 이거 상태 관리 때문인가? 그럼 리덕스도 한 번 체크해봐야겠는데." 11시 30분. 여전히 같은 화면이다. 근데 원인을 찾았다. 문제는 부모 컴포넌트의 불필요한 재렌더링. useMemo로 감싸면 될 것 같다. 손가락이 움직인다. 코드를 짜고, 테스트해보고, 아차, 이 부분도 최적화하면 더 나을 것 같은데. 새벽 12시. 한 숨을 돌린다. 커피잔이 반쯤 찼다. 아니 벌써 3번째인가. 기억이 안 난다. 슬랙을 본다. 대표님이 저녁에 올린 메시지. "내일 오전에 이 기능 구현 가능할까요?" 아, 이건 아직 안 했다. 지금 하는 이 최적화는 사실 그렇게 급하지 않은데. 그런데... 이미 여기까지 왔는데? 마무리하고 시작하자. 30분만 더.새벽 1시 15분. 이제 정말 끝났다. 빌드를 확인한다. 성공. 테스트를 돌린다. 통과. 배포해볼까? 아니지, 내일 오전에 하면 되지. 이제 정말 자야 한다. 슬랙에 체크 이모지라도 달아놓자. 그런데 문제가 하나 더 보인다. 예상 외의 발견들 버그를 고치다 보니 다른 곳이 눈에 띈다. 것도 아주 오래되고 답답한 부분들. 백엔드 API 응답 시간이 좀 길잖아. DB 쿼리 최적화할 시간도 있을 것 같은데. "아, 이것도 이미 알고 있던 거네. 왜 지금까지 안 했지?" 기술 부채다. 스타트업의 숙명. 급한 기능 개발에만 집중하다 보니 이런 것들이 쌓인다. 그런데 지금 이렇게 밤이 시간이 있으니까, 한 번 봐볼까? 쿼리를 수정해본다. 인덱스를 추가한다. 응답 시간이 200ms에서 50ms로 줄어든다. 정기적. 이제 정말 좋다. 그런데 혹시 DB 풀링 설정도 확인해볼까? 새벽 1시 50분. 노트북 화면에는 여섯 개의 탭이 떠 있다. 터미널, 코드 에디터, 데이터베이스 클라이언트, AWS 콘솔, 모니터링 대시보드, 브라우저. 각각에는 내가 지난 2시간 반 동안 들여놓은 정신과 에너지의 흔적들이 있다. 커밋 메시지를 쓴다. "fix: optimize database query and improve React component rendering" 좋다. 이 정도면 우아한 코드다. 내가 자랑스럽다. 그런데 프로덕션에 배포해도 되나? 한 번 더 테스트를...원맨밴드의 함정 지금 깨닫게 되는 건데, 이게 다 혼자 일 하기 때문이다. 내 옆에 다른 개발자가 있었다면, 어느 순간 "이거 내가 할 거야, 넌 자" 라고 누군가 말해줬을 것이다. 또는 코드 리뷰를 하다가 "이 정도면 충분해" 라고 누군가 멈춰 줬을 것이다. 하지만 지금 이 방에는 나밖에 없다. 내 정신 속 목소리도 나다. 악마 같은 나, 천사 같은 나, 둘 다 나다. 악마 나: "아직 API 응답도 좀 느린데?" 천사 나: "이제 정말 자야 해." 악마 나: "근데 이거 하나만 더..." 그리고 항상 악마 나가 이긴다. 왜냐하면 나는 스스로를 믿기 때문이다. "난 할 수 있어"라는 자신감과 "이건 내가 해야 해"라는 책임감이 섞여 있다. 스타트업이니까 그렇다. 12명이 일하는 회사인데 개발팀은 나 혼자다. 리팩토링? 그건 나중에. 테스트 커버리지? 나중에. 문서화? 나중에. 지금은 기능을 빨리 내야 한다. 내일 오전 회의에서 "이거 언제 되나요?" 라는 질문을 듣고 싶지 않으니까. 그래서 악마 나는 항상 이전을 가한다. "이것만 하고 자. 그럼 내일 아침에 대표님한테 완성된 거 보여줄 수 있어." 완성된 뭔가를 보여주는 걸 좋아한다. 실제로 동작하는 뭔가. 버그 없는 뭔가. 완벽한 뭔가. 그래서 계속 한다. 그리고 놓친다. 내일 아침에 일어났을 때 얼마나 피곤할지를. 밤 11시의 자신감이 새벽 2시의 후회가 되기까지 새벽 2시 정각. 나는 여전히 터미널을 열고 있다. 마지막 배포를 시도한다. 파이프라인이 돌아간다. 몇 분이 지난다. 성공. 모두가 자는 시간에 내 코드는 프로덕션에 올라간다. 어떤 위험도 무릅쓰고. (혹시 버그 있으면 어쩌지? 아니다. 테스트를 다 했잖아. 충분해. 정말 충분해.) 다시 노트북을 닫는다. 이번엔 정말 닫는다. 화면이 어두워진다. 한 숨을 돌린다. 이제 정말 끝이다. 오늘의 악순환이 끝났다. 내일은... 글쎄. 내일도 밤 10시가 오면 "이것만 하고 자자"라고 다짐할 것 같다. 그리고 새벽 2시가 오면, 나는 또 다른 문제를 발견하고 있을 것이다. 다른 버그, 다른 최적화 기회, 다른 기술 부채. 충전 케이블을 빼 놓으러 간다. 침대에 누웠다 일어난다. "아, 슬랙 응답은 했나?" 휴대폰을 든다. 메시지가 없다. 좋다. 아무 장애도 없었다는 뜻이다. 그래도 한 번 더 알림 설정을 확인한다. 음소거는 아닐까. 아니다, 켜져 있다. 침대에 누운다. 천장을 본다. 시간이 간다. 10분, 20분, 30분. 여전히 깨어 있다.악순환을 끊을 수 있을까? 내일 아침. 대표님이 온다. "어제 그 기능 됐어?" "네, 배포했습니다." "오, 빠르네! 그럼 이건 어때?" 또 다른 기능. 우선순위는 높다고 한다. 내일까지는 못 하겠지만, 모레 오전쯤이면 가능할 것 같다. 아마도. "알겠습니다." 다시 밤 10시가 온다. 언제쯤이면 이 악순환이 끝날까? 채용을 성공적으로 하면? 그럼 내 일량이 줄어들 텐데. 하지만 신입을 줄 일이 많지는 않을 것 같다. 어차피 복잡한 부분은 나만 알고 있으니까. 결국 더 많이 해야 할 것 같다. 신입 온온팩팅도 하고, 코드 리뷰도 하고. 아니면 퇴사를 하면? 그럼 서비스가 망할 텐데. 대표님이 다른 개발자를 찾을 때까지. 그걸 생각하니까 떠날 수가 없다. 책임감이 나를 묶는다. 결국 나는 여기 남는다. 밤 10시에 "이것만 하고 자자" 라고 다짐하고, 새벽 2시에 또 다른 버그를 발견하고, 새벽 4시에 침대에 누운다. 그리고 아침 9시에 깬다. 또 다른 메시지가 와 있다. "오전에 회의 있어요." 역시. 한숨을 쉰다. 하지만 일어난다. 이게 내 선택인지, 아니면 상황의 선택인지는 모르겠다. 하지만 분명한 건 새벽 2시에 나는 여전히 터미널을 열고 있다는 것이다. 그리고 내일도, 모레도 그럴 것 같다. 아마도 계속.결국 악순환은 한 가지 더 하다가 시작하는 게 아니라, 그것을 멈출 사람이 없다는 데서 비롯된다.

AWS 콘솔, 내 유일한 악몽의 원천

AWS 콘솔, 내 유일한 악몽의 원천

AWS 콘솔, 내 유일한 악몽의 원천 점심을 먹고 있었다. 김밥이었다. 회사 근처 편의점 김밥. 3500원짜리 그것. 슬랙을 봤다. 안 봐야 할 걸. 스타트업이라 전사 채널에서 무언가 자꾸 울린다. 어? 빌링 얘기다. 대표가 물었다. "이번 달 AWS 비용이 왜 또 올랐어?" 김밥을 씹는 손이 멈췄다. 입에는 밥이 들어있는데 머리는 이미 AWS 콘솔로 날아가 있었다. 마우스를 쥐었다. 노트북을 켰다. 모니터를 본 순간, 이번 달 비용이 나를 노려보고 있었다. 6500만원. 지난달은 5800만원이었다. 700만원이 또 올랐다. 뭐를 했는가? 뭐를 했지?"언제부턴데 인프라가 내 일이 됐어?" 내 직함은 풀스택 개발자다. 근데 이게 뭐 하는 일인지 아무도 모른다. 나도 안다. 전부 하는 거다. 프론트엔드를 쓰고, 백엔드를 짜고, DB를 만들고, 클라우드에 올리고, 모니터링하고, 장애 나면 고치고. 그리고 이제 인프라 비용까지 노려보고 있다. 누가 정했냐면, 스스로다. 아니다. 대표가 정했다. "너 클라우드 잘 알잖아. 인프라 봐줄 수 있지?" 첫 날에 "세팅해드리겠습니다"라고 했다. 빅 실수다. 그건 이제 내 책임이 됐다. EC2, RDS, S3, CloudFront, Lambda, 뭔지도 모르는 것들. 다 내 책임. 컴퓨터가 켜지면 나한테 온다. 컴퓨터가 꺼져도 온다. 관리 콘솔에 로그인하는 순간부터, 나는 더 이상 개발자가 아니다. 나는 DevOps도 아니고 인프라 엔지니어도 아니다. 그냥... 누군가는 해야 하니까 하는 사람이 되는 거다. 6개월 전에는 몰랐다. 무언가 잘못되면 "아, 뭔가 이상한데?" 정도. 지금은 다르다. AWS 콘솔을 열면 대시보드가 날 쏴다본다. 비용, 비용, 비용. 그래프가 꺾이질 않는다.비용 상승곡선과 내 멘탈 점심에 김밥을 마시고 (물론 씹었지만 마신 기분) AWS 콘솔을 들었을 때, 첫 번째 확인할 것은 역시 청구서다. 아니, 청구서는 월 말에 나온다. 예상 비용. 현재 진행 중인 이 달의 악몽. "Cost Explorer"라는 이름이 웃기다. 마치 비용을 탐험하고 즐기는 것처럼 들린다. 나는 탐험 중이다. 매일매일 새로운 비용 항목을 발견한다.RDS: 왜 이렇게 비싼데? 디비 한 개잖아. 아 근데 자동 백업이 스토리지 3배를 쓰네? EC2: 24시간 켜놓은 t3.xlarge. 혼자 백엔드 서버, 캐시, 배치 작업 다 돌려. 돈을 안 들 수가 없지. NAT Gateway: 존재도 몰랐다. 그냥... 있더라. 월 32만원. 뭐하는 애인데? CloudFront: CDN이라고 하더니 뭔가 계속 비용이 난다. 그 외 모르는 것들: 로깅, 모니터링, 뭐... 뭐하는 애들인데 돈이 자꾸 나온다.사실 대부분은 필요 없다. 근데 없애면 장애가 난다. 자동 백업을 없애면 DB 터지면 끝이다. NAT Gateway를 없애면 프라이빗 서브넷에서 나갈 수가 없다. 뭔지는 몰라도 없애면 안 된다. 그래서 매달 700만원씩 올라간다. 어디서? 모른다. 알고 싶지도 않다. 알면 뭘 하나? 고칠 게 있나? 없다.독당한 기술 의사결정 스타트업이니까 "비용 최적화"를 해야 한다고 했다. 대표가. 개발팀(나)에게. 비용 최적화. 아름다운 단어다. 그래서 뭐를 했나?RDS 자동 백업 주기를 2주 -> 3주로 늘렸다. 누가 2주 백업이 필요한지는 몰라도 일단 줄였다. EC2를 t3에서 t2로 낮추려 했다. 근데 앱이 자꾸 튕긴다. 다시 올렸다. S3 스토리지 클래스를 GLACIER로 바꾸려 했다. 원본 이미지를 다 Glacier에 넣었다. 그다음 날 대표가 이미지를 빨리 가져와야 한다고 했다. 돈을 더 써서 복구했다.그 다음부턴 손을 안 댔다. 너무 아프다. 눈도 아프고 마음도 아프다. 대신 나는 깨달았다. "효율"과 "안정성"은 거의 항상 돈으로 결정된다는 걸. 그리고 그 돈은 항상 내가 마주쳐야 한다는 걸. 대표는 "좀 줄여봐"라고 한다. 개발팀(나)는 "줄이면 터져요"라고 한다. 결국 현상 유지다. 그리고 비용은 해마다 올라간다. 뭐, 서비스가 성장하니까 당연하다고 생각한다. 근데 매달 확인할 때마다 속이 철렁거린다. 700만원. 그게 내 월급의 15분의 1이다. 콘솔 탭이 자꾸 늘어나는 이유 AWS 콘솔을 켜면 탭이 자꾸 많아진다.Billing Dashboard: 얼마나 썼나 Cost Explorer: 어디에 썼나 EC2 콘솔: 서버 뭐하는지 RDS 콘솔: DB 건강한가 CloudWatch: 로그는 떠 있나 Lambda: 배치 작업 돌고 있나 VPC: 네트워크 어떻게 돼 있나 S3: 파일 경로 맞나 IAM: 권한 누가 뭐 했나 Support: 뭔가 에러가 떴나보통 8개에서 12개 탭 사이를 오간다. 모두 불안감에서 출발한다. 혼자라는 게 문제다. 만약 누군가 인프라를 담당한다면 나는 이 탭들을 절대 열지 않을 것이다. 열 필요가 없으니까. 근데 혼자니까 뭐가 잘못되면 나한테 온다. 그래서 계속 본다. 문제가 없어도 본다. 있을 것 같아서. 장애 나면 AWS 콘솔이 첫 번째 범죄 현장이 된다. "뭐가 터졌어? 여기도? 저기도?" 진짜 터진 건 보통 뭔가 설정이 자동으로 이상해진 거다. AWS 업데이트, 누군가의 실수, 아니면 그냥 "이 정도면 될 줄 알았는데?" 같은 내 판단 미스. 그럼 나는 구글링을 한다. StackOverflow를 본다. AWS 공식 문서를 읽는다. 대부분 읽을 수 없다. 너무 복잡하다. 그래서 결국 "off-on"을 한다. 다시 켰다 껐다 한다. 신기하게 그럼 된다. 70%의 경우. 30%는? 야근을 한다. [IMAGE_4] 매달 월급의 일부가 구름으로 올라간다 4800만원을 받는다. 세금을 떼니까 3600만원 정도다. 월급이 300만원이다. 그런데 AWS 비용이 650만원이다. 같은 회사에서 나오는 돈이다. 내가 받는 월급보다 2배 이상이 인프라에 간다. 이게 맞나? 하는 생각이 자꾸 든다. 근데 이건 내가 정할 일이 아니다. 인프라 비용은 "사업"이다. 내 월급과 다르다. 하지만 내가 챙겨야 한다. "좀 줄여봐" 또 들을 거다. 매달 들을 거다. 그러면 또 뭔가를 없애거나 설정을 바꿀 거다. 그럼 또 뭐가 터질 거다. 그럼 또 밤을 새울 거다. 악순환이다. 근데 악순환인 줄 알면서도 못 빠져나간다. 왜냐하면 이게 내 책임이니까. 누가 물으면 "제가 봐야겠습니다"라고 대답한다. 매번. 비용 최적화 계획 (3번째) 처음엔 "앗, 인프라 공부해야겠다"는 마음으로 시작했다. 지금은 다르다. 깨달았다. 공부해봐야 같은 거다. 정보는 많지만 답은 없다. 왜냐하면 최적이란 개념이 없으니까. 있는 건 "트레이드오프"뿐이다.비용 줄이다가 장애 난다. 장애 안 나게 하다가 비용이 올라간다. 비용 최적화하다가 서비스 느려진다. 서비스 빨리하다가 비용이 올라간다.현재 우리는 "적당한 비용에 적당히 괜찮은 서비스"를 하고 있다. 누군가는 "저 비용 줄일 수 있지 않나?"라고 생각한다. 그 누군가는 보통 개발비는 안 들어본 사람이다. 나는 매달 3번은 AWS 비용 줄이는 계획을 짠다. 계획은 실행되지 않는다. 왜냐하면 우선순위가 항상 "새 기능"이니까. 그럼 다음달엔 비용이 또 올라간다.아직도 AWS 콘솔을 매일 본다 점심을 마치고 노트북을 닫으려던 순간, 또 봤다. Billing 탭. 이번 달은 700만원인가? 아니면 800만원인가? 알고 싶은데 알고 싶지 않은 그런 기분. 의사가 검사 결과를 내밀려고 할 때 그 기분. 어쨌든 난 본다. 매일.[IMAGE_1] [IMAGE_2] [IMAGE_3] [IMAGE_4]