toss reality — fiction 04

편의점은 공짜인데

복지가 없어서 못 쓰는 게 아니다.
시간이 없어서 못 쓰는 것이다.

Part I

"복지 인벤토리"

2027년 5월 12일 월요일 오후 7시 43분. 입사 4개월 차.

도현은 화장실에서 손을 씻으며 칫솔꽂이를 보았다. 회사에서 제공하는 칫솔이다. 옆에 치약도 있고, 그 아래 서랍에는 양말과 스타킹이 있다고 들었다. 도현은 칫솔을 쓴 적은 있다. 양말을 가져간 적은 없다.

자리에 돌아와 노트북을 열었다. 스프린트 작업 대신 다른 것을 열었다. 메모장. 토스에서 4개월간 사용한 복지를 정리해보기로 했다. 이유는 없다. 그냥 궁금했다.

무료 카페 3회 전부 테이크아웃, 자리에서 마심
무료 편의점 27회 전부 야근 중 — 컵라면, 삼각김밥
헤어살롱 0회 예약하려고 했으나 시간이 안 맞음
두에싸 (Do Everything Silo) 1회 엄마 생일 선물 — 직접 살 시간 없어서
금요일 오후 (주 4.5일제) 1/8회 8번 중 7번은 스프린트 마감으로 반납
법인카드 식대 매일 점심을 자리에서 먹는 날이 절반
교육비 지원 0회 신청할 강의를 고를 시간이 없음

도현은 표를 보았다. 사용 빈도가 높은 것: 편의점(27회)과 법인카드 식대. 둘 다 "먹는 것"이다. 사용 빈도가 0인 것: 헤어살롱, 교육비. 둘 다 "시간이 필요한 것"이다.

복지가 없어서 못 쓰는 게 아니다. 시간이 없어서 못 쓰는 것이다. 편의점 27회 중 24회가 밤 9시 이후다. 무료 카페 3회 중 3회가 자리에서 마신 테이크아웃이다. 법인카드로 먹는 점심의 절반은 자리에서 모니터를 보며 먹는다. 두에싸를 1회 쓴 것도, 엄마 생일 선물을 "내가" 사러 갈 시간이 없어서 "회사에" 대신 시킨 것이다. 복지가 좋다는 것은 사실이다. 근데 복지를 쓸 겨를이 없다는 것도 사실이다.

도현은 헤어살롱을 한 번도 가지 못한 이유를 생각해보았다. 헤어살롱은 사전 예약제다. 예약 가능 시간: 오전 10시~오후 6시. 도현의 스프린트는 오전 10시에 시작해서, 종료 시간은 정해져 있지 않다. "잠깐 머리 자르러 갈게요"라고 말할 수 있는 분위기인지 아닌지는 판단이 어려웠다. 누가 막는 것이 아니다. 다만 사일로 8명 중에서 업무 중에 헤어살롱에 가는 사람을 본 적이 없다.

금요일 오후도 마찬가지다. 제도적으로는 금요일 오후가 자유다. 주 4.5일제. 하지만 스프린트 마감이 보통 금요일이다. 강서윤이 "금요일까지 배포 가능할까요?"라고 물을 때, "금요일 오후는 주 4.5일제라 안 됩니다"라고 대답하는 사람을 도현은 본 적이 없다. 금요일 오후에 사무실을 나서는 사람은 있다. 하지만 노트북을 가지고 나서는 사람이 더 많다.

* * *

Part II

"전화"

5월 14일 수요일 저녁 8시 22분. 핸드폰이 울렸다. 화면에 "김영수 대표님"이 떴다.

도현은 사무실 복도로 나와 전화를 받았다.

incoming call — 김영수

"도현아."

"대표님, 안녕하세요."

"거기 좋다며? 편의점이 공짜라며?"

"네 대표님, 공짜예요. 밤 12시에 컵라면 먹을 때 씁니다."

2초간의 침묵.

"우리 때는 300원짜리 캔커피라도 있었는데."

"네, 기억나요. 자판기 옆에 있던 거."

"자판기 고장 나면 도현이가 고쳤잖아."

도현은 웃었다. 넥스트비전의 커피 자판기. 2주에 한 번씩 고장이 났다. 도현이 분해해서 석회질을 제거하고 다시 조립했다. 개발팀장의 업무 목록에 "커피 자판기 수리"가 있던 회사.

"아 그리고, 새로 온 개발자 말이야."

"뽑으셨어요?"

"아직 못 뽑았어. 면접을 몇 번 봤는데, 다들 연봉 이야기하다 끝나더라고. 4,500만 원 이하로는 안 온다고 하더라."

도현은 대답하지 못했다. 넥스트비전에서 도현의 마지막 연봉이 3,800만 원이었다.

"도현이 자리 아직 비어있어. 모니터도 그대로고. PC 수리 맡길 데도 없고."

짧은 침묵.

"대표님, 잘 되실 거예요. 개발자 구인 사이트에—"

"알아, 알아. 그냥 전화한 거야. 잘하고 있나 싶어서."

전화를 끊었다. 도현은 복도 창 밖을 보았다. 강남의 밤이 밝았다.

268만 원의 세계에서 나는 유일한 개발자였다. PC도 고치고, 프린터도 고치고, 자판기도 고치고, 코드도 짰다. 아무도 대신할 수 없는 사람이었다. 480만 원의 세계에서 나는 사일로의 FE 3번이다. 내가 내일 그만둬도 사일로는 돌아간다. 재원이 내 코드를 리뷰하듯 누군가 내 자리를 채울 것이다. 대체 불가능한 268만 원과 대체 가능한 480만 원. 어느 쪽이 더 나은 건지 아직 모르겠다.

도현은 자리에 돌아왔다. 옆자리의 FE 개발자 김나현이 말했다.

"도현 님, 괜찮아요? 표정이 좀 그래요."

"아, 아뇨. 전 직장 대표님한테 전화가 와서."

"아, 전 직장. 어디셨어요?"

"안양에 있는 B2B 소프트웨어 회사요. 직원 12명."

나현이 고개를 끄덕였다. 아무 말 없이. 토스에는 다양한 곳에서 온 사람들이 있다. 카카오, 네이버, 라인, 쿠팡. 12명짜리 회사에서 온 사람은 도현뿐일 것이다.

* * *

Part III

"6개월의 벽"

5월 19일 월요일. 사일로 채널에 메시지가 올라왔다.

# settlement-silo
강서윤 (PO) 09:14
수민 님이 오늘부로 퇴사하셨습니다. 짧은 시간이었지만 함께해주셔서 감사합니다.

이수민. 도현과 같은 달에 입사한 경력직 동기. BE 개발자. 네이버 출신, 5년 차. 4개월. 입사한 지 4개월 만에 퇴사했다.

도현은 이수민과 점심을 함께 먹은 적이 여러 번 있다. 같은 시기에 입사했으니 자연스럽게 어울렸다. 이수민은 한 달 전부터 표정이 어두워지고 있었다.

3주 전, 점심 시간에 이수민이 말했었다.

"나는 속도를 못 따라가겠어. 네이버에서도 빠르게 했다고 생각했는데, 여기는 차원이 달라. 스프린트 2주마다 배포하고, 데이터 보고, 킬하고, 다시 만들고. 여기 사람들은 이걸 당연하다는 듯이 하는데, 나는 적응이 안 돼."

도현은 그때 대답하지 못했다. 도현도 속도가 힘들었으니까. 하지만 도현에게는 다른 기준이 있었다. 넥스트비전. 도현은 넥스트비전보다 나은 곳에 있다는 것을 매일 확인했다. 이수민에게는 그런 기준이 없었다. 네이버도 좋은 회사였으니까. 네이버에서 토스로 온 이수민에게는 "여기가 전 직장보다 낫다"는 확인이 불가능했다.

이수민이 떠난 뒤, 도현은 블라인드를 열어보았다. 토스 게시판.

Blind — Toss
"산전수전 겪은 경력직들이 6개월 못 버티고 퇴사함. 빠르게 들어오고 빠르게 나감."
Blind — Toss
"일찍 퇴근하는 날은 하루도 없나요? 입사 전에 들었던 것과 너무 다름."
워라밸 만족도 조사 — 2021
토스 워라밸 만족도: 5점 만점 2.1점. 추이: 2019년 2.22 → 2020년 2.41 → 2021년 2.1 (하락).
퇴사율 통계
2021년 기준 입사 259명, 퇴사 102명. 1년 내 퇴사율 약 39%.

워라밸 2.1점. 퇴사율 39%. 숫자가 현실이 되었다. 이수민이 그 39%에 포함된 것이다.

하지만 도현에게는 다른 관점이 있었다.

전 직장에서도 야근했다. 야근 수당은 없었다. 성과 측정도 없었다. 코드 리뷰도 없었다. "수고했어 도현아"라는 대표의 한 마디가 야근의 대가였다. 여기서도 야근한다. 480만 원 받으면서. 야근 수당은 여기도 없다. 하지만 차이가 있다. 내 코드가 측정된다. 내가 만든 +0.7%가 기록된다. 내가 받은 47건의 코드 리뷰가 기록된다. 이전 4년은 기록이 없다. 여기서의 4개월은 숫자로 남아 있다.

워라밸 2.1점이라는 숫자가 의미하는 것은, 토스의 업무 강도가 높다는 것이다. 이것은 사실이다. 도현도 매일 느끼고 있다. 하지만 넥스트비전의 업무 강도도 높았다. 방향이 달랐을 뿐. 넥스트비전에서는 방향 없이 오래 앉아 있는 것이 업무였다. 여기서는 방향이 있는 대신, 속도가 빠르다.

* * *

Part IV

"같은 야근, 다른 야근"

5월 22일 목요일 밤 10시 07분.

도현은 결제 실패 복구 UI의 마지막 PR을 머지하고 퇴근 준비를 하고 있었다. 노트북을 닫으려는 순간 Slack 알림이 울렸다.

# incident-alert
PagerDuty Bot 22:07
P1 ALERT: 결제 API 레이턴시 급증 — p99 latency 4,200ms (threshold: 500ms). 토스페이먼츠 결제 사일로 온콜 호출.

P1. 최고 심각도. 도현은 장애 대응에 참여한 적이 없다. 온콜 로테이션에 도현은 아직 포함되지 않은 상태다. 하지만 사일로 채널에 메시지가 올라오기 시작했다.

# settlement-silo
박재원 22:09
결제 API 확인 중. Kafka 메시지 큐 지연으로 Gateway 타임아웃 발생 중인 것 같습니다. BE 쪽 확인 부탁드려요.
정민호 (BE) 22:11
확인했습니다. consumer lag 급증. 스케일 아웃 진행합니다.
박재원 22:13
FE 쪽은 결제 실패 시 에러 화면이 제대로 뜨고 있는지 확인해야 합니다. @한도현 님 혹시 아직 사무실이시면 에러 바운더리 확인 가능하세요?

도현은 노트북을 다시 열었다.

한도현 22:14
네, 사무실에 있습니다. 확인하겠습니다.

도현은 결제 화면의 에러 바운더리를 확인했다. API 타임아웃 시 사용자에게 보여주는 에러 UI. 이것은 도현이 지난 스프린트에서 만든 결제 실패 복구 BottomSheet였다. 자기가 만든 컴포넌트가 실전에서 작동하는 것을 처음 본다.

문제가 있었다. 타임아웃 에러 코드가 500으로 올 때는 BottomSheet가 정상적으로 뜨지만, Gateway에서 504를 반환할 때는 에러 타입 분기가 빠져 있었다. 504는 도현이 테스트에서 커버하지 않은 케이스였다.

error-boundary-fix.tsx — hotfix
// Before — 504 미처리
if (error.status === 500) {
  return <PaymentErrorSheet type="server" />;
}

// After — Gateway 타임아웃 처리 추가
if (error.status === 500 || error.status === 504) {
  const type = error.status === 504 ? "timeout" : "server";
  return <PaymentErrorSheet type={type} />;
}

도현은 코드를 수정하고 PR을 올렸다.

$ git commit -m "fix(payment): Gateway 504 타임아웃 에러 바운더리 처리 추가"
✓ commitlint passed

# PR #4,583 — hotfix
Lines: +8, -2
Reviewers: @jaewon.park (expedited review)

재원이 3분 만에 Approve를 눌렀다. 장애 상황에서의 핫픽스는 일반 리뷰보다 빠르게 처리된다. 도현은 머지했다. CI가 돌고, 배포가 완료되었다.

한도현 22:38
504 에러 바운더리 핫픽스 배포 완료. 타임아웃 시 결제 실패 복구 BottomSheet 정상 표시 확인했습니다.
정민호 (BE) 22:52
Kafka consumer 스케일 아웃 완료. p99 latency 380ms로 정상화. consumer lag 해소 중.
박재원 23:15
전체 지표 정상 확인. 인시던트 종료합니다. 모두 수고하셨어요. 내일 오전 10시에 포스트모텀 합시다.

인시던트 종료. 22:07 발생, 23:15 해소. 1시간 8분. 사일로 8명 중 4명이 대응했다. 재원, 민호, 도현, 그리고 사일로 밖에서 합류한 인프라 엔지니어 1명.

도현은 자리에 앉아 숨을 내쉬었다. 손이 약간 떨렸다. 자기가 만든 에러 바운더리에 구멍이 있었다. 504를 놓쳤다. 장애 중에 발견된 것이다. 다행히 빠르게 수정했지만, 자기 코드의 빈틈이 실전에서 드러난 경험은 처음이다.

시니어 재원이 다가왔다.

"수고했어요, 도현 님."

"504를 놓친 건 죄송합니다. 테스트에서 커버했어야 하는데."

"포스트모텀에서 다루면 됩니다. 에러 코드별 테스트 매트릭스를 정리해서 공유하면 다른 사일로에서도 참고할 수 있을 거예요. 실수에서 배우는 게 포스트모텀의 목적이니까요."

포스트모텀. 사후 분석. 누구의 잘못인지를 따지는 자리가 아니라, 무엇이 잘못되었고, 어떻게 방지할 수 있는지를 정리하는 자리. 넥스트비전에서의 장애 대응은 달랐다.

넥스트비전에서의 장애 대응. 도현 혼자, 새벽 3시, 아무도 모르게 고침. 장애가 있었다는 사실을 대표에게 보고하면, "왜 그런 거야?"라는 질문이 돌아왔다. "Kafka consumer lag이 — " 같은 설명은 불가능했다. 대표는 기술을 모르니까. "서버가 좀 느려졌는데 고쳤습니다"가 보고의 전부였다. 포스트모텀? 없었다. 장애 원인 분석? 도현 혼자 머릿속에서 했다. 기록? 없다. 재발 방지? "조심하자"가 전부였다.

여기서의 장애 대응. 4명이 함께. 밤 10시. Slack에 실시간으로 상황이 공유된다. 해결되면 포스트모텀이 남는다. 원인, 타임라인, 조치사항, 재발 방지 계획이 문서로 정리된다. 다른 사일로에서도 참고한다.

같은 야근이다. 같은 밤이다. 하지만 밀도가 다르다.

밤 11시 30분. 도현은 편의점에 갔다. 28번째 방문이다. 컵라면을 골랐다. 삼각김밥을 골랐다. 0원. 뜨거운 물을 부으며 도현은 생각했다.

이전의 야근은 혼자서 방향 없이 키보드를 두드리는 시간이었다. 옆에 아무도 없었고, 물어볼 사람도 없었고, 장애가 나면 나 혼자 해결해야 했다. 여기서의 야근은 4명이 함께 장애를 대응하고, Slack에 실시간으로 상황을 공유하고, 포스트모텀을 예약하고, "수고했어요"라는 메시지를 받는 시간이다. 같은 야근인데 밀도가 다르다.

도현은 컵라면을 다 먹고 정리했다. 엘리베이터를 탔다. 사원증을 찍었다. 퇴근 시각: 23:41. 강남역으로 걸었다. 막차가 15분 뒤다. 오늘은 택시를 안 타도 된다.

지하철 안에서 도현은 핸드폰을 꺼냈다. 김영수 대표에게 문자를 보냈다.

"대표님, 오늘 장애 대응하느라 야근했어요. 편의점에서 컵라면 먹었습니다."

1분 뒤 답장이 왔다.

"ㅋㅋ 잘하고 있어 도현아."

도현은 핸드폰을 주머니에 넣었다. 안양역에서 내렸다. 원룸까지 10분을 걸었다. 천장의 금이 거기 있었다. 냉장고 모터가 돌아갔다.

내일 오전 10시. 포스트모텀. 504 에러 테스트 매트릭스를 정리해서 가져가야 한다. 도현은 노트북을 다시 열었다. 새벽 1시까지 에러 코드별 테스트 케이스 문서를 작성했다.

넥스트비전에서는 이런 문서를 쓴 적이 없다. 아무도 요구하지 않았으니까. 여기서는 쓴다. 누군가 읽으니까.

복지가 좋다는 건 사실이다
쓸 겨를이 없다는 것도 사실이다

무료 편의점 27회. 전부 밤 9시 이후. 같은 야근인데, 밀도가 다르다.