문과생 성시은의 AWS 정복기
‘이노베이트’의 사무실은 한동안 평온했다. 아니, 평온을 넘어 활기가 넘쳤다. 오토 스케일링이라는 이름의 마법 군대를 손에 넣은 뒤, 그들은 두려움 없이 마케팅 캠페인을 집행했고, 파도처럼 밀려드는 사용자들을 미소로 맞이했다.
성시은은 매일 아침, 출근길 지하철에서 AWS 콘솔 앱을 열어 실시간 대시보드를 확인하는 일이 습관이 되었다. 초록색 ‘OK’ 상태를 유지하는 CloudWatch 알람, 트래픽에 맞춰 우아하게 오르내리는 EC2 인스턴스 수, 그리고 꾸준히 우상향하는 신규 가입자 그래프. 이 세 가지가 그녀에게 주는 안정감은, 그 어떤 투자 유치 소식보다 달콤했다. 그녀는 이제야말로 진짜 ‘대표’가 된 것 같았다. 기술을 이해하고, 통제하고, 비즈니스의 무기로 사용하는 리더.
그 평온한 일상에 첫 번째 균열을 일으킨 것은, 고객센터 채널로 날아든 한 통의 이메일이었다. 발신자는 ‘행복한 동행’, 그들의 첫 번째 VIP 유료 고객사이자 가장 든든한 지지자였다.
“대표님, 큰일 났습니다. ‘행복한 동행’에서 특정 조건에서 후원 감사 콘텐츠가 생성되지 않는 버그가 있다고 합니다. 지난주 업데이트 이후부터 발생했다는데… 꽤 치명적인데요.”
마케팅 인턴 김민아 씨의 보고에, 시은은 대수롭지 않게 고개를 끄덕였다.
“알겠습니다. 서준 님께 바로 전달할게요. 금방 해결될 겁니다. 걱정 말아요.”
그녀의 목소리에는 자신감이 넘쳤다. 지금까지 수많은 버그가 있었고, 그때마다 박서준과 이철민은 마치 게임 퀘스트를 깨듯 하루 이틀 만에 문제를 해결해왔다. 이번에도 그럴 것이라 믿어 의심치 않았다.
하지만 이번에는 달랐다.
하루가 지나고, 이틀이 지나도 박서준의 자리에서는 해결 보고가 올라오지 않았다. 그의 책상 주변에는 구겨진 종이컵과 텅 빈 에너지 드링크 캔이 마치 성벽처럼 쌓여갔다. 그의 눈은 토끼처럼 충혈되어 있었고, 평소 단정하던 머리는 까치집이 되어 있었다.
“아니, 이게 왜 안 잡히지? 말이 안 되잖아.”
그는 혼잣말을 중얼거리며 검은 터미널 창을 노려봤다. CloudWatch Logs에 접속해 수만 줄의 로그를 샅샅이 뒤졌지만, 버그가 발생하는 순간에는 아무런 흔적도 남아있지 않았다. 마치 유령처럼, 에러는 결과만 남기고 과정을 숨겨버렸다.
“분명 여기서 데이터를 정상적으로 넘겨주는데, 받는 쪽에서 값이 그냥 사라져. 중간에 블랙홀이라도 있나?”
평소라면 벌써 “형, 그거 이렇게 해보면 어때요?”라며 온갖 아이디어를 던졌을 이철민도 이번만큼은 뾰족한 수를 내지 못하고 있었다. 그는 자신의 모니터에 떠 있는 1년 전 코드를 보며 식은땀을 흘렸다.
“형… 혹시 이 부분 때문일까요? 이거 제가 작년에 투자 발표 직전에, 대표님이 갑자기 아이디어 냈던 기능 급하게 만드느라… 그때는 일단 돌아가게만 만드느라 제대로 된 테스트 코드도 못 붙였는데….”
“알아. 나도 알아.” 서준이 신경질적으로 머리를 쓸어 넘겼다. “문제는 네가 만든 그 모듈이랑, 내가 지난달에 붙인 결제 코드가 서로 완전히 다른 방식으로 데이터를 처리한다는 거야. 실타래가 꼬아놓은 국수처럼 얽혀서, 어디서부터 풀어야 할지 감도 안 와. 이쪽을 당기면 저쪽이 끊어지고, 저쪽을 풀면 이쪽이 엉망이 돼.”
사흘째 되던 날 아침, 결국 올 것이 왔다. ‘행복한 동행’의 담당 팀장에게서 전화가 왔다. 평소 시은을 ‘성 대표님’이라 부르며 응원해주던 그의 목소리는, 오늘은 얼음장처럼 차가웠다.
“성시은 대표님. 간단한 버그 하나 잡는 데 사흘이나 걸리는 게 말이 됩니까? 저희 지금 연말 최대 후원 캠페인을 앞두고 있는데, 후원자들에게 감사 메시지 하나 못 보내서 업무가 마비 상태입니다. 저희의 신뢰를 등에 업고 성장하셨으면, 그에 걸맞은 책임감을 보여주셔야죠. 오늘 오후 6시까지 해결 안 되면, 저희는 계약 해지를 포함한 모든 가능성을 검토할 수밖에 없습니다.”
‘신뢰를 등에 업고 성장했다.’ 그 말이 시은의 가슴을 후벼 팠다. 전화가 끊기고, 그녀는 곧장 개발팀으로 달려갔다.
“서준 님, 철민 님! 어떻게 되어가고 있나요? 오늘 오후 6시까지는 무조건 해결해야 합니다! 고객사에서 계약 해지까지 이야기하고 있어요!”
그 순간, 지난 사흘간 압력솥처럼 끓어오르던 박서준의 인내가 폭발했다.
“대표님!”
그가 의자에서 벌떡 일어나 소리쳤다. 사무실의 모든 움직임이, 이철민의 경쾌하던 키보드 소리마저 멎었다.
“대표님은 이게 그냥 간단한 버그로 보이십니까? 오늘 안에 뚝딱 고칠 수 있는 그런 문제로 보이세요?”
“서준 님… 진정하고….”
“진정 못 합니다!” 그의 목소리가 사무실 전체에 쩌렁쩌렁 울렸다. “이건 예고된 재앙입니다! 우리가 지난 1년간 ‘빠르게, 빠르게!’, ‘성장이 먼저다!’를 외치며 쌓아온 빚이, 이자가 붙어서 돌아온 거라고요!”
“빚이라니요? 그게 무슨 말이에요?”
“기술 부채(Technical Debt)요!” 서준이 화이트보드로 성큼성큼 걸어가 마커를 집어 들었다. 그는 아무렇게나 얽히고설킨 선들을 미친 듯이 그리기 시작했다.
“당장 급하다고 대충 땜질하고, ‘나중에 고치자’고 미뤄뒀던 코드들이 지금 서로 엉겨 붙어서 이 괴물이 된 겁니다! 이 괴물의 배를 가르려면, 지금 우리가 사는 이 집 전체를 부수고 기초 공사부터 다시 해야 할 판이라고요! 그런데 대표님은 지금 현관문 페인트 색깔이 바랜 것만 빨리 고쳐달라고 하시는 겁니다!”
사무실의 모든 공기가 얼어붙었다. 시은은 그의 분노 앞에서, 그가 토해내는 낯선 단어 앞에서 아무 말도 할 수 없었다. 그때, 이철민이 조심스럽게 끼어들었다.
“형, 그래도… 지금은 일단 이 불부터 꺼야죠. 집을 다시 짓는 건 나중에….”
“나중? 나중이 대체 언젠데!” 서준이 이글거리는 눈으로 철민에게 돌아섰다.
“네가 ‘일단 되게만 하자’고 밤새워 썼던 그 수많은 코드들! 그거 밤새워서 수습하고, 아무도 모르게 안정화시키고, 다음 날 멀쩡하게 돌아가게 만들었던 게 누구였는지 잊었어? 난 더 이상 이 모래성 위에서 곡예를 할 자신이 없어! 언제 무너질지 모르는 이 집에서 더는 살고 싶지 않다고!”
두 사람의 눈에서 불꽃이 튀었다. 창업 이래 최고의 동지였던, 서로의 코드를 눈빛만 봐도 이해했던 두 개발자 사이에 처음으로 깊고 날카로운 균열이 생기는 순간이었다.
시은은 어찌할 바를 몰랐다. 기술 부채. 그녀에게는 너무나 낯선 단어였다. 눈에 보이는 성장 지표, 아름다운 우상향 그래프에 취해, 수면 아래에서 썩어가고 있던 집의 기둥을 보지 못했다. 그녀는 리더로서 팀의 가장 깊은 고통을, 박서준의 침묵 속에 담겨 있던 경고를 외면하고 있었다.
그녀는 자리로 돌아와 떨리는 손으로 슬랙을 켰다. 안민준에게 도움을 청하고 싶었다. ‘민준 님, 저희 집에 괴물이 살고 있어요.’ 하지만 차마 메시지를 보낼 수 없었다. 이것은 EC2나 S3 같은 기술의 문제가 아니었다. 사람의 문제, 신뢰의 문제, 그리고 리더십의 문제였다. 그가 알려준 기술로 멋진 항공모함을 만들었다고 생각했지만, 정작 그 배의 엔진실에서는 선원들이 서로를 향해 총구를 겨누고 있었다.
그날 밤, 박서준은 버그를 잡았다. 거의 20시간에 가까운 사투 끝에, 국수 가락 코드 사이에서 기적처럼 원인을 찾아내고 임시방편으로 문제를 해결했다. 오후 5시 58분이었다. 하지만 사무실에는 그 어떤 환호도 없었다. 박서준은 말없이 자신의 자리로 돌아가 겉옷을 챙겨 퇴근했고, 이철민은 그에게 다가가지 못했다.
시은은 자신의 텅 빈 사무실에서, 화려하게 빛나는 AWS 대시보드를 바라보았다. 오토 스케일링이 서버를 늘려줄 수는 있어도, 개발자의 번아웃을 막아주지는 못한다는 것을. 로드 밸런서가 트래픽을 분산시켜 줄 수는 있어도, 팀원들의 무너진 신뢰를 회복시켜 주지는 못한다는 것을.
보이지 않는 적, 기술 부채는 단순한 코드의 문제가 아니었다. 그것은 팀의 영혼을 갉아먹는 암이었다. 그리고 그녀는, 그 암을 너무 늦게 발견했다.
기술 부채 (Technical Debt): 소프트웨어 개발에서, 장기적으로 더 나은 접근 방식을 사용하는 대신 당장의 빠른 출시를 위해 쉬운(하지만 제한적인) 해결책을 선택함으로써 미래에 발생하게 될 추가적인 재작업 비용을 의미합니다. 마치 이자를 내야 하는 금융 부채처럼, 기술 부채가 쌓이면 새로운 기능을 추가하기 어렵고(개발 속도 저하), 버그 수정이 힘들어지며(유지보수 비용 증가), 시스템의 안정성이 떨어지는 등 결국 더 큰 ‘이자’를 지불하게 됩니다.
기술 부채의 종류:
코드 부채: 임시방편으로 작성된 코드, 중복된 로직, 부족한 문서 등 코드 자체의 품질 문제.
아키텍처 부채: 초기 설계의 한계로 인해 시스템 확장이 어려운 경우.
테스트 부채: 충분한 테스트 없이 기능을 배포하여 잠재적인 버그를 남겨두는 경우.
리팩토링 (Refactoring): 소프트웨어의 겉으로 보이는 동작은 바꾸지 않으면서, 내부 구조를 개선하여 가독성을 높이고 유지보수를 쉽게 만드는 작업을 말합니다. 기술 부채를 갚아나가는 가장 대표적인 방법 중 하나입니다. 박서준이 주장한 ‘집을 다시 짓는 것’이 바로 리팩토링에 대한 비유입니다.
CloudWatch Logs: EC2 인스턴스, Lambda 함수 등 다양한 AWS 리소스에서 발생하는 로그 파일을 중앙에서 수집, 모니터링, 저장 및 분석할 수 있는 서비스입니다. 개발자들은 CloudWatch Logs를 통해 애플리케이션의 동작을 추적하고 버그의 원인을 찾아냅니다. 하지만 소설에서처럼, 코드 자체에 로그를 남기는 로직이 부실하면(기술 부채의 일종), 로그를 뒤져도 원인을 찾기 어려운 경우가 많습니다.
CI/CD (Continuous Integration/Continuous Deployment): 지속적인 통합/지속적인 배포. 개발자가 코드를 변경하면, 그 코드가 자동으로 테스트되고 빌드되어 운영 환경까지 배포되는 과정을 자동화하는 것을 의미합니다. AWS CodePipeline, CodeBuild, CodeDeploy 같은 서비스를 통해 구현할 수 있습니다. 잘 구축된 CI/CD 파이프라인은 코드 리뷰와 자동화된 테스트를 강제하여, 기술 부채가 쌓이는 것을 예방하는 ‘예방주사’와 같은 역할을 합니다.