개발자로 34세, 앞으로 뭘 해야 할까

개발자로 34세, 앞으로 뭘 해야 할까

34세, 7년차 어제 생일이었다. 34세. 케이크는 아내가 사 왔다. 초는 안 꽂았다. "축하해" 한마디 듣고 냉장고에 넣었다. 오늘 출근해서 PR 세 개 리뷰했다. 후배가 쓴 코드다. 변수명이 이상하다. "이거 userId로 바꾸는 게 어때요?" 댓글 달고 approve 눌렀다. 그러다 문득 생각했다. 나는 7년차인데 아직도 이런 일을 한다.같은 해 입사한 동기 대학 동기 단톡방이 있다. 요즘은 조용하다. 다들 바쁘다. 얼마 전에 한 명이 썼다. "팀장 됐어요 ㅎㅎ" 축하 이모지가 쏟아졌다. 나도 눌렀다. 엄지 척. 그리고 폰을 내려놨다. 그 친구는 3년차 때 이미 달랐다. 개발보다 기획자랑 얘기하는 게 많았다. "비즈니스를 이해해야 한다"고 했다. 나는 그냥 코드가 좋았다. 지금 그 친구는 팀장이다. 연봉은 모르겠다. 물어볼 수도 없다. 나는 여전히 코드 친다. 이력서의 기술스택 요즘 가끔 이력서를 본다. 이직할 건 아니다. 그냥 본다. [기술스택]Java, Spring Boot MySQL, Redis AWS EC2, RDS Git, Jenkins7년 전이랑 크게 다르지 않다. 버전만 올라갔다. Spring 3.x에서 5.x로. Redis는 그때도 썼다. 새로운 거라곤 Docker 정도. 그것도 배포 스크립트 복붙한 수준이다. 옆 팀 후배는 요즘 Rust 공부한다고 했다. 주말마다 사이드 프로젝트 한다고. "형도 해보세요, 재밌어요" 재밌겠다. 근데 피곤하다. 주말엔 쉬고 싶다.아키텍트라는 단어 회사에 아키텍트가 한 명 있다. 40대 중반. 15년차. 회의 때 화이트보드에 그림 그린다. "이 부분을 MSA로 분리하면..." 다들 고개를 끄덕인다. 나도 끄덕인다. 근데 실제로 코드 짜는 건 나다. 아키텍트는 코드를 안 짠다. 가끔 PR에 댓글 단다. "이 부분 성능 체크 부탁드립니다" 실제로 성능 체크하는 건 나다. JMeter 돌리고, 로그 보고, 튜닝한다. 그러면 아키텍트가 임원한테 보고한다. "성능 30% 개선했습니다" 나도 저렇게 되어야 하나. 그림 그리고 방향 제시하고. 코드는 후배들한테 맡기고. 근데 솔직히 말하면, 그림 그리는 게 재미있을 것 같지 않다. 관리자의 하루 우리 팀 리드가 있다. 나보다 2년 선배. 9년차. 직함은 수석 개발자인데 실제론 팀장이다. 그 사람 하루를 봤다. 아침 9시 출근. 바로 회의. 10시 회의. 11시 회의. 점심 먹고 2시 회의. 회의 끝나면 슬랙 답장. 기획자 질문, 디자이너 질문, 임원 질문. 5시쯤 되면 후배들 진행상황 체크. "이거 일정 괜찮아요?" 코드는 안 짠다. 가끔 PR 보는 게 전부다. 진짜 급한 버그 아니면 직접 안 건드린다. 퇴근은 나보다 늦다. 보고서 쓴다. 다음 분기 계획 짠다. 연봉은 나보다 천만원 많다. 나도 이렇게 되고 싶나. 잘 모르겠다.금요일 저녁의 배포 금요일 오후 4시. 배포 준비한다. 체크리스트 확인.DB 마이그레이션: 완료 API 테스트: 통과 프론트 연동: 확인5시에 배포 시작. Jenkins 빌드 돌린다. 초록불. 성공. 서버 재시작. 헬스체크 확인. 200 OK. 모니터링 본다. 에러율 0%. 응답속도 정상. 6시. 끝났다. "수고하셨습니다" 슬랙 메시지 보낸다. 노트북 덮는다. 이 순간이 좋다. 내가 짠 코드가 돌아간다. 사용자 천 명이 쓴다. 버그 없이 잘 돌아가면 뿌듯하다. 이게 내가 개발자 한 이유다. 근데 34세에도 이러고 있어야 하나. 이력서에 쓸 게 없다 가끔 링크드인 본다. 업데이트는 안 한다. 그냥 본다. 다른 사람들 프로필 구경한다. 똑같은 7년차인데 다르다. "DevOps 파이프라인 구축 리드" "마이크로서비스 아키텍처 전환 주도" "주니어 개발자 3명 멘토링" 나는 뭐라고 쓸까. "레거시 코드 유지보수" "후배 PR 리뷰" "버그 수정" 이게 나쁜 건 아니다. 누군가는 해야 하는 일이다. 회사는 잘 돌아간다. 근데 이력서에 쓰기엔 초라하다. 다음 이직 때 면접관이 물어본다. "7년간 뭐 하셨어요?" "음... 코드 짰습니다" "구체적으로는요?" "여러 가지요..." 대답이 안 나올 것 같다. 금요일 점심의 대화 점심 먹으러 갔다. 김치찌개집. 단골이다. 후배 둘이랑 같이 갔다. 한 명이 물었다. "형은 앞으로 뭐 하실 거예요?" "응? 뭘?" "커리어요. 아키텍트? 관리자?" 대답 못 했다. "아직 모르겠어" "이제 7년차시잖아요" 맞다. 7년차다. 시니어라고 불린다. 근데 아직도 모르겠다. 다른 후배가 말했다. "저는 형처럼 되고 싶어요" "왜?" "코드 잘 짜시잖아요. 부럽습니다" 그 말이 기분 좋으면서도 찝찝했다. 후배는 3년차다. 나도 3년차 때 그렇게 말했다. "저는 시니어처럼 코드 잘 치고 싶어요" 그런데 나는 7년차에도 여전히 코딩이 주 업무다. 집에 가는 지하철 퇴근길 지하철. 폰으로 기술 블로그 본다. 제목들이 비슷하다. "30대 개발자의 커리어 고민" "테크 리드가 되기까지" "관리자 vs 개발자, 나는 어느 쪽?" 다들 고민이 같다. 댓글도 비슷하다. "저도 7년차인데 고민입니다" "결국 관리자 됐는데 코딩이 그립네요" "아키텍트 됐지만 답은 없더라구요" 답이 없다는 말이 많다. 그러면서도 다들 뭔가 선택한다. 나는 아직 선택을 안 했다. 아니, 선택을 미루고 있다. 일단 오늘은 집에 가서 쉰다. 이번 주도 끝났다. 주말의 사이드 프로젝트 토요일 오후. 노트북을 켰다. 3개월 전에 시작한 프로젝트가 있다. 개인 일정 관리 앱. 간단한 거다. React + Spring Boot. README 파일만 있다. 코드는 한 줄도 없다. "일단 DB 스키마부터..." 생각만 한다. 손이 안 간다. 커피 마신다. 유튜브 켠다. "개발자 브이로그" 영상 본다. 30분 지났다. 노트북 덮는다. "다음 주말에 해야지" 벌써 세 번째다. 다음 주말에도 안 할 것 같다. 예전엔 이런 거 재밌었는데. 새 기술 배우고, 뭐라도 만들고. 지금은 그냥 피곤하다. 열정이 식은 건가. 아니면 나이가 든 건가. 아내의 질문 저녁 먹으면서 아내가 물었다. "요즘 고민 있어?" "응?" "요즘 좀 우울해 보여" 대답 안 했다. 그냥 밥 먹었다. "회사 일 힘들어?" "아니, 괜찮아" "그럼 뭔데" 말했다. "나 이대로 괜찮은 것 같아?" "무슨 소리야" 설명했다. 7년차인데 코딩만 한다. 동기들은 팀장 되고 아키텍트 된다. 나는 뭐 하는 건지 모르겠다. 아내가 말했다. "너 코딩 좋아하잖아" "응..." "그럼 계속 하면 되지" 간단한 말이었다. 근데 뭔가 찝찝했다. "그래도 발전이 없잖아" "발전은 무슨. 7년 전보다 훨씬 잘하잖아" "근데 이력서엔..." 말을 멈췄다. 이력서가 뭐가 중요한가. 나는 왜 이력서 걱정을 하는가. 이직할 것도 아닌데. 월요일 아침 회의 월요일 오전 10시. 팀 회의다. 팀장이 말한다. "이번 분기 목표입니다" 슬라이드를 넘긴다. "신규 기능 3개 런칭" "레거시 마이그레이션 완료" "성능 20% 개선" 다들 고개 끄덕인다. 나도 끄덕인다. "개발님이 마이그레이션 리드 맡아주세요" 팀장이 나를 본다. "네" 회의 끝났다. 내 책상으로 돌아왔다. Jira 티켓 30개가 보인다. 다 나한테 할당된 거다. 레거시 마이그레이션. 버그 수정. 신규 API. 한숨 나왔다. 커피 마셨다. 그리고 IDE를 켰다. 코드를 봤다. public class UserService { // 이 코드는 5년 됐다 // 내가 짠 건 아니다 // 근데 내가 고친다 }마우스를 움직였다. 리팩토링 시작했다. 이게 내 일이다. 아키텍트도 아니고. 관리자도 아니고. 그냥 코드 짜는 사람. 점심시간의 깨달음 김치찌개집에서 혼자 밥 먹었다. 후배들은 회의 중이다. 사장님이 물었다. "오늘 혼자?" "네" "김치찌개 드시죠?" "네" 7년 왔다. 메뉴는 항상 김치찌개다. 사장님은 내 이름 안다. 밥 먹으면서 생각했다. 나는 왜 이렇게 고민하는가. 7년차면 시니어다. 시니어는 뭘 해야 하는가. 아키텍트? 관리자? 그게 정답인가. 옆 테이블 사람들 대화가 들렸다. "우리 팀 시니어는 진짜..." "응?" "코드 하나하나 다 봐줘. 꼼꼼해" 부러웠다. 그 팀 시니어. 코드 하나하나 봐주는 사람. 나도 그런 사람이고 싶다. 아키텍트 아니어도. 관리자 아니어도. 그냥 코드 잘 짜는 시니어. 후배들한테 도움 되는 사람. 그게 나쁜 건 아니잖아. 오후 3시의 PR 리뷰 슬랙 알림이 떴다. "PR 올렸습니다. 리뷰 부탁드려요" 후배가 올린 코드다. API 하나 추가했다. 코드 봤다. 200줄 정도. 로직은 괜찮다. 근데 몇 개 보였다. 변수명이 애매하다. 예외 처리가 없다. 테스트 케이스가 부족하다. 댓글 달았다. "userId 대신 id는 어떨까요?" "NullPointerException 처리 필요할 것 같아요" "edge case 테스트 추가 부탁드립니다" 10분 뒤 답장 왔다. "오 감사합니다!" "수정했습니다" "다시 봐주세요" 다시 봤다. 깔끔해졌다. approve 눌렀다. "고생하셨습니다" "형 덕분에 배웠습니다" 기분이 좋았다. 이게 내가 할 수 있는 거다. 아키텍트는 큰 그림 그린다. 관리자는 일정 관리한다. 나는 코드 리뷰 잘한다. 이것도 가치 있는 일이다. 퇴근길의 결론 6시 퇴근. 지하철 탔다. 오늘 하루 생각해봤다. 아침엔 고민했다. 점심엔 생각했다. 오후엔 일했다. 그리고 알았다. 답은 하나가 아니다. 아키텍트가 되는 게 정답인 사람도 있다. 관리자가 되는 게 맞는 사람도 있다. 계속 코딩하는 게 좋은 사람도 있다. 나는 아직 모른다. 34세에도 모른다. 7년차에도 모른다. 근데 괜찮다. 지금 당장 정할 필요 없다. 내년에 생각이 바뀔 수도 있다. 관리자 해보고 싶어질 수도. 아키텍트 공부하고 싶어질 수도. 아니면 10년차까지 코딩할 수도. 중요한 건 지금이다. 지금 내가 잘하는 거. 지금 내가 해야 하는 거. 코드 잘 짜기. 후배 잘 가르치기. 레거시 잘 고치기. 이게 나다. 34세 7년차 개발자. 집에 와서 집 도착했다. 현관문 열었다. 아내가 물었다. "오늘은 어때?" "괜찮았어" "고민 좀 풀렸어?" 고개 끄덕였다. "응. 좀" 노트북 꺼냈다. 주말의 사이드 프로젝트. README만 있는 그 프로젝트. 열었다. DB 스키마 작성했다. 간단한 거다. 테이블 세 개. 한 시간 작업했다. 첫 커밋 했다. "Initial database schema" 많이 한 건 아니다. 근데 시작했다. 커피 마셨다. 오늘 다섯 번째다. 아내가 말했다. "뭐해?" "코딩" "또?" 웃었다. "응. 좋아서" 그게 답인 것 같다. 아직도 좋아서 한다. 7년 했는데도. 34세인데도.34세. 7년차. 아직도 코딩한다. 그리고 그게 괜찮다.

면접 볼 회사를 찾아보는 늦은 밤의 고민

면접 볼 회사를 찾아보는 늦은 밤의 고민

면접 볼 회사를 찾아보는 늦은 밤의 고민 11시 45분 노트북을 켰다. 넷플릭스 대신 잡코리아를. 아내는 벌써 잤다. 나는 거실 소파에 앉아서 채용공고를 본다. 스크롤을 내린다. 올린다. 또 내린다. "백엔드 개발자 5년 이상, Spring 필수" 자격은 된다. 연봉은 7천에서 협의. 지금보다 500은 오를 거다. 그런데 손이 안 간다. 지원하기 버튼이.창은 5개가 떠 있다. 잡코리아, 원티드, 로켓펀치, 프로그래머스, 링크드인. 매일 밤 11시쯤 이러고 있다. 벌써 3주째다. 이력서는 아직도 2년 전 버전이다. 네카라쿠배는 글렀고 네이버는 어렵다. 카카오도 어렵다. 라인 쿠팡 배민 다 어렵다. 알고리즘 문제를 3개월은 풀어야 한다. 코테 통과율이 10%라던데. 나는 프로그래머스 레벨 2도 버겁다. 지난 주말에 DFS 문제 하나 풀었다. 2시간 걸렸다. 결국 답 봤다. "이 정도는 기본이죠" 면접관이 그럴 거다. 나는 땀 흘리며 화이트보드에 서 있을 거고. 그래서 대기업을 본다. 삼성SDS, LG CNS, 현대오토에버. SK C&C도 있다. 연봉은 네카라쿠배보단 낮다. 그래도 지금보단 높다. 7천은 준다.복지가 좋다는 말이 많다. 야근이 적다는 말도. "칼퇴 문화 정착" 공고에 다 그렇게 써 있다. 믿어도 되나. 마우스를 올렸다. 지원하기 버튼에. 그리고 뗐다. 이력서가 문제다 경력기술서를 써야 한다. "주요 성과를 정량적으로 기술하세요" API 응답속도 30% 개선. DB 쿼리 최적화로 트래픽 처리량 2배 증가. 쓸 건 있다. 그런데 어떻게 쓰지. "Elasticsearch 도입으로 검색 성능 향상" 이게 맞나. 너무 뻔한가. 다들 이렇게 쓰나. GitHub 링크를 넣어야 한다는 글을 봤다. 내 GitHub은 초록색이 없다. 잔디가 말랐다. 마지막 커밋이 8개월 전이다. 회사 일로 바빴다고 쓸 순 없다.사이드 프로젝트를 만들까. 토이 프로젝트 하나 있으면 어필된다던데. 뭘 만들지. To-do 앱은 너무 흔하고. 게시판도 그렇고. "ChatGPT API 활용한 뭔가..." 생각해봤다. 아이디어가 안 나온다. 그리고 시간이 없다. 퇴근하면 9시다. 밥 먹으면 10시. 주말엔 쉬고 싶다. 자격요건을 본다 "우대사항: AWS, Docker, Kubernetes 경험자" AWS는 쓴다. Docker도 쓴다. Kubernetes는 안 써봤다. 강의를 들어야 하나. 인프런에 강의가 많다. 20만원짜리도 있다. 사면 또 안 볼 거다. 작년에 산 강의가 3개 있다. 진도율 15%, 8%, 0%. "Spring Boot 3.x, Java 17 이상" 우린 아직 Java 11이다. Spring Boot 2.7. 레거시 건드리면 팀장님이 싫어한다. "되는 걸 왜 바꿔" 기술스택이 뒤처지는 거 같다. 불안하다. 면접에서 물어보면 뭐라고 답하지. "최신 기술 학습에 관심이 많습니다" 거짓말은 아니다. 관심은 있다. 실행을 안 했을 뿐. 연봉 계산기를 켠다 7천만원 실수령액. 세후 580만원. 지금은 540만원. 40만원 차이. 1년이면 480만원이다. 대출 이자가 월 35만원이다. 40 빼면 5만원 남는다. 5만원으로 뭘 하지. "연봉 협상 가능" 공고에 그렇게 써 있다. 7천에서 시작하면 7500까지 받을 수 있나. 아니면 8천도. 계산기를 두드린다. 8천만원 실수령액. 현실적이지 않다. 경력 7년에 8천은 네카라쿠배나 받는다. 7500도 어렵다. 7200 정도. 그래도 지금보단 낫다. 면접 후기를 본다 블라인드에 들어갔다. "삼성SDS 면접 후기" 검색. "1차 코테 + 2차 직무면접 + 3차 임원면접" 3번이나 본다. 한 달은 걸린다. 코테는 프로그래머스 레벨 2~3 수준이라는데. 레벨 3은 못 푼다. 지금 실력으론. "직무면접에서 설계 질문 많이 나옴. MSA, DB 정규화, 트랜잭션 격리수준" MSA는 해본 적 없다. 팀장님한테 제안했다가 까였다. DB 정규화는 안다. 트랜잭션도 안다. 설명하라면 버벅일 거다. "임원면접은 인성 위주. 근데 기술 질문도 섞여 나옴" 3차까지 가면 붙는다던데. 3차까지 가는 게 문제다. 댓글을 본다. "저도 7년차인데 1차 코테 떨어짐 ㅋㅋ" 웃을 수가 없다. 회사 복지를 비교한다 현재 회사: 연차 15일, 자율복장, 야근수당 없음, 점심 7천원 지원. 대기업: 연차 20일, 복지포인트 연 200만원, 기숙사, 카페테리아, 헬스장. 복지포인트 200만원이 크다. 연 단위로 쌓인다. 헬스장도 좋다. PT 끊으면 월 30만원인데. 기숙사는 필요 없다. 출퇴근 1시간이면 괜찮다. 그런데 야근은 어떨까. "프로젝트 일정 타이트할 때 야근 있음" 블라인드 댓글에 그렇게 써 있다. "그래도 중소기업보단 덜함" 지금도 배포일엔 10시까지 남는다. 한 달에 2번. 대기업은 어떨까. 더할까 덜할까. 동기한테 물어볼까 대학 동기 중에 삼성에 간 놈이 있다. 4년 전에 이직했다. 단톡방에서 본 게 작년이다. 카톡을 열었다. 1:1 대화방. "야 너 요즘 어때" 쳤다가 지웠다. 뭐라고 물어보지. "이직 어땠어?" 너무 직접적이다. "거기 야근 많아?" 이것도 이상하다. "면접 준비 뭐했어?" 이건 괜찮은데. 4년 만에 연락해서 이직 물어보면 어떻게 생각할까. '얘 이직하려나보네.' 맞긴 하다. 그래도 부담스럽다. 나중에 안 되면 창피하다. 카톡을 껐다. 포기할까 시계를 봤다. 12시 50분. 1시간 동안 채용공고만 봤다. 지원은 0건. 이력서는 안 고쳤다. 알고리즘 문제도 안 풀었다. 내일도 출근이다. 9시 회의가 있다. 기획자가 새 기능을 제안한다. "이거 이번 주에 되죠?" 또 안 된다고 말해야 한다. 노트북을 덮었다. 이직은 다음 주에 생각하자. 다음 주에도 이러고 있을 거다. 안다. 그래도 오늘은 자야 한다. 침대로 갔다. 아내가 돌아누웠다. 나도 누웠다. 눈을 감았다. '7500은 받아야 하는데.' 잠이 안 온다. 결국 토요일에 주말이다. 오전 11시에 일어났다. 아내는 친구 만나러 나갔다. 커피를 내렸다. 노트북을 켰다. 이력서를 열었다. 고치기 시작했다. "API 응답속도 30% 개선..." 지웠다. 다시 썼다. "Redis 캐싱 도입으로 평균 응답시간 2.3초 → 0.7초 단축" 구체적으로 썼다. 숫자를 넣었다. 더 쓴다. "레거시 시스템 리팩토링으로 월 서버 비용 40만원 절감" 이것도 성과다. 쓸 만하다. 2시간 썼다. 경력기술서 80% 완성. GitHub을 켰다. 커밋을 하나 만들었다. README 수정. "Update project description" 초록색이 하나 생겼다. 별로다. 프로그래머스를 켰다. 레벨 2 문제 하나. 30분 걸렸다. 통과했다. 기분이 좀 낫다.내일 또 미룰 거다. 그래도 오늘은 뭔가 했다.

주말 문자: '혹시 확인 가능하신가요?'의 무서움

주말 문자: '혹시 확인 가능하신가요?'의 무서움

주말 문자: '혹시 확인 가능하신가요?'의 무서움 토요일 오후 3시 27분 침대에 누워 있었다. 넷플릭스 틀어놓고 폰으로 커뮤니티 보는 중. 딱 이 타이밍에 진동이 왔다. 슬랙 알림. "김개발님, 혹시 주말인데 죄송하지만 확인 가능하신가요?" 심장이 쿵 내려앉는다. 토요일이 끝났다. 정확히는 3시 27분에.메시지 내용은 안 봐도 안다. "급한 건 아닌데" 로 시작하는 글은 100% 급하다. "시간 되실 때" 라고 쓴 건 "지금 당장" 이란 뜻이다. 물음표 하나가 주말을 파괴한다. 확인하지 말까, 확인할까 5초간 고민한다. 안 본 척? 불가능하다. 이미 슬랙이 '읽음' 표시를 띄웠을 수도 있다. 설령 안 읽어도, 내일 출근하면 "어제 메시지 못 보셨어요?" 가 기다린다. 확인하면? 주말이 증발한다. "네 확인해볼게요" 라고 답장하는 순간, 나는 출근 상태가 된다. 침대는 책상이 되고, 휴식은 업무가 된다. 결국 확인한다. 안 할 수가 없다.내용을 본다. "고객사에서 데이터 조회가 안 된다고 하는데, 혹시 서버 확인 부탁드려요. 급하진 않은데 월요일 전에 해결되면 좋을 것 같아서요." 급하지 않다고? 월요일 전이면 오늘 아니면 내일이다. 이게 급하지 않은 거면 뭐가 급한 건데. 노트북을 켠다 한숨이 나온다. 침대에서 일어난다. 거실로 간다. 노트북 가방을 집는다. 무겁다. 마음이 더 무겁다. 전원을 켠다. 부팅 소리가 주말 종료 알람처럼 들린다. VPN 접속. 비밀번호 치는 손가락이 무겁다. 아내가 거실로 나온다. "왜? 뭐 일 있어?" "응... 좀 급한 거래." 미안하다는 말은 안 한다. 이미 몇 번을 겪었으니까. 아내는 한숨만 쉬고 들어간다.모니터링 툴을 연다. 그라파나, 키바나, 센트리. 로그를 본다. 에러는 없다. 데이터베이스 접속한다. 쿼리 날린다. 결과는 정상이다. 10분 지났다. 문제가 없다. 슬랙에 답장한다. "확인했는데 서버는 정상입니다. 혹시 어떤 화면에서 어떻게 조회하셨는지 알 수 있을까요?" 답장이 온다. 20분 후에. "아 고객사가 캐시 문제였나봐요. 새로고침하니까 되네요. 감사합니다!" 캐시. F5 한 번이면 되는 걸로 내 토요일 오후가 날아갔다. 그래도 끌 수가 없다 노트북을 닫아야 한다. 알고 있다. 근데 안 닫힌다. "혹시 또 문자 오면?" 이라는 생각이 든다. 이미 노트북 켜놨으니까, 그냥 좀 더 보는 게 낫지 않나. 슬랙 채널을 훑는다. 어제 올라온 메시지들. 지라 티켓도 확인한다. 새로 등록된 버그 3건. PR도 하나 올라와 있다. 후배가 올린 거. "주말엔 안 봐도 되는데..." 라고 생각하면서 클릭한다. 코드를 본다. 리뷰를 단다. "이 부분 null 체크 필요할 것 같아요." 댓글 남기고 나서 후회한다. 주말에 왜 리뷰를 달았지. 후배가 주말에 수정하면 어떡하지. 너무 늦었다. 이미 후배가 답글을 달았다. "오 감사합니다! 수정했어요." 주말 근무가 전염된다. 저녁이 되어도 시계를 본다. 6시 반. 아내가 저녁 먹자고 한다. "응, 곧 갈게." 노트북은 아직 켜져 있다. 슬랙 알림은 여전히 켜져 있다. 치킨을 시켰다. 아내랑 같이 먹는다. 근데 폰은 식탁 위에 있다. 화면이 보이는 각도로. 진동이 올 때마다 시선이 간다. "업무 채널 아니겠지?" 확인한다. 다행히 스팸 문자다. 치킨 먹으면서도 긴장한다. 주말인데 주말이 아니다. 아내가 말한다. "너 맨날 주말에도 폰 보더라. 그냥 알림 끄면 안 돼?" 끌 수 있으면 진작 껐다. 문제는 알림이 아니다. 내 머릿속이 문제다. 알림 꺼도 "혹시 급한 거 왔으면?" 이라는 생각이 든다. 30분마다 슬랙 확인한다. 아무 메시지 없으면 다행이다. 근데 또 30분 후에 확인한다. 이게 주말 근무보다 피곤하다. 차라리 일하는 게 나을 것 같다는 생각이 든다. 일요일도 마찬가지 일어나자마자 폰을 본다. 슬랙 확인. 다행히 메시지 없다. 근데 안심이 안 된다. "아직" 없는 것뿐이다. 샤워하면서도 폰을 가까이 둔다. 혹시 진동 소리 못 들을까봐. 점심 먹고 카페 간다. 아내랑. 노트북은 안 가져왔다. 의지의 한국인. 근데 폰은 있다. 핫스팟 켜면 된다. 만약 급한 일 생기면 노트북 가지러 집 갔다 오면 된다. 왕복 30분. 충분히 가능하다. 카페에서 2시간 있었다. 슬랙 17번 확인했다. 메시지는 없었다. 돌아오는 길에 생각한다. "오늘은 조용하네. 내일 월요일이 걱정이다." 주말이 끝나가는데 안도감이 든다. 이상하다. 주말이 끝나는 게 다행이라니. 월요일 출근 9시에 출근한다. 컴퓨터 켠다. 슬랙 연다. 주말 메시지 쭉 확인한다. 토요일 메시지: 캐시 문제 해결. 일요일 메시지: 없음. 결국 토요일 그 한 건이었다. 그 한 건 때문에 주말 이틀을 긴장하며 보냈다. 치킨 먹을 때도, 카페 갈 때도, 자기 전에도. 동료가 말한다. "주말 잘 쉬었어?" "응, 뭐 그럭저럭." 거짓말이다. 하나도 안 쉬었다. 그 문자의 정체 "혹시 확인 가능하신가요?" 이 문장이 무서운 이유를 안다. 급하다는 뜻이다. 근데 급하다고 안 쓴다. 완곡하게 물어본다. 선택권이 있는 것처럼. 실제로는 선택권이 없다. "아니요, 확인 불가능합니다" 라고 답할 수 있나? 못 한다. 절대로. 그래서 더 무섭다. 거절 불가능한 부탁. 그게 물음표로 포장되어 온다. "죄송하지만" 이라는 말도 들어간다. 미안해하면서 부탁한다. 거절하기 더 어렵다. "주말인데" 라고 명시한다. 본인도 알고 있다. 주말이란 걸. 근데 보낸다. 그만큼 급하다는 뜻이다. 결국 이 문장은 명령이다. 물음표로 끝나는 명령문. 경력이 쌓일수록 신입 때는 달랐다. 주말 메시지 오면 선배가 처리했다. "내가 볼게, 넌 쉬어" 라고 했다. 지금은 내가 제일 시니어다. 주말 메시지는 내게 온다. 후배들한테 떠넘길 수도 있다. 근데 안 한다. 왜냐하면 나도 당했으니까. "김개발님이 봐주시면 빠를 것 같아서요." 이 말의 뜻: 다른 사람은 못 한다. 너만 가능하다. 책임감이 주말을 잡아먹는다. 연봉이 오를수록 주말은 짧아진다. 시니어라는 타이틀의 대가. 신입 때는 주말에 연락 없었다. "경력 쌓으면 편해지겠지" 라고 생각했다. 틀렸다. 반대였다. 대응 방법들 방법을 찾아봤다. 커뮤니티에. "알림 끄세요." 끄면 불안하다. 이미 답했다. "회사 핸드폰 따로 쓰세요." 회사가 안 준다. 개인 폰에 슬랙 깔아야 한다. "퇴근하면 슬랙 로그아웃하세요." 해봤다. 30분 버티다가 다시 로그인했다. "업무 시간 외 연락 금지 문화 만드세요." 어떻게? 나부터 지키질 못한다. 해외 사례도 봤다. 프랑스는 '연결되지 않을 권리' 가 법으로 있다. 부럽다. 한국은 '확인 가능하신가요' 가 문화다. 결국 답은 없다. 회사를 옮겨도 마찬가지다. 어디를 가도 '혹시 확인 가능하신가요' 는 있다. IT 업계의 숙명. 24시간 운영, 24시간 대기. 진짜 무서운 건 적응한다는 거다. 처음엔 화났다. 주말인데 왜 연락하냐고. 지금은 그냥 확인한다. 당연하다는 듯이. 주말에 메시지 안 오면 이상하다. "오늘은 조용하네?" 라고 생각한다. 평화로운 주말이 불안하다. "월요일에 터지는 거 아니야?" 걱정한다. 이게 무섭다. 주말 근무를 당연하게 받아들이는 나. 동기들이랑 술 마셨다. 한 친구가 말했다. "너 주말에도 폰 계속 보더라. 슬랙이야?" "응, 습관이야." "끄면 안 돼?" "끄면 불안해." 친구가 웃었다. "너 중독됐다." 맞다. 중독이다. 일 중독이 아니라 불안 중독. 그래도 안 볼 수는 없다. 현실적으로 생각한다. 무시하면 월요일이 지옥이다. 처리 안 된 이슈가 쌓인다. 주말에 30분 일하면 월요일 3시간 아낀다. 그게 더 낫다. 효율적이다. 이렇게 합리화한다. 아내한테 설명했다. "지금 안 하면 월요일에 더 힘들어." 아내가 말했다. "그럼 월요일은 언제 또 힘드냐?" 대답 못 했다. 맞는 말이다. 월요일 처리하면 화요일 급한 게 온다. 화요일 처리하면 수요일 급한 게 온다. 끝이 없다. 주말에 미리 처리하는 건 해결이 아니다. 그냥 이슈를 당겨오는 것뿐이다. 이상과 현실 이상: 주말엔 완전히 쉰다. 현실: 주말엔 반쯤 쉰다. 노트북은 안 켜도 폰은 확인한다. 긴급한 것만 처리한다. 근데 모든 게 긴급하다. 타협한다. "토요일엔 확인만, 일요일엔 아예 안 봐." 지켜진 적 없다. "오전엔 확인 안 해, 오후에만." 이것도 안 된다. 오전 10시에 확인한다. "자기 전엔 절대 확인 안 해." 누워서 확인한다. 마지막으로. 결국 다 확인한다. 규칙은 깨지라고 있는 거다. 내 규칙은. 다른 직군은 디자이너인 아내는 주말에 연락 없다. "너희는 급한 거 없어?" "있지. 근데 주말엔 안 해." "그럼 월요일에 늦는 거 아니야?" "늦으면 늦는 거지. 주말인데." 부럽다. 개발자는 다르다. 서버가 죽으면 매출이 죽는다. 버그가 터지면 고객이 떠난다. "월요일까지 기다려주세요" 가 안 통한다. 그래서 주말에도 대기한다. 소방관처럼. 경찰관처럼. 근데 우리는 수당도 없다. 마케터 친구도 비슷하다. "주말엔 캠페인 안 돌려. 평일에만." 기획자 친구는 더하다. "주말? 당연히 쉬지. 왜?" 우리만 이렇게 사는 건가. 아니다. 다른 개발자들한테 물어봤다. 똑같다. 다들 주말에도 확인한다. 이게 정상인가, 비정상인가. 업계 전체가 이러면 정상인 건가. 언제까지 10년 차 선배한테 물었다. "선배도 주말에 확인해요?" "당연하지." "언제까지 해야 돼요?" "나도 모르겠다. 아직도 하고 있으니까." 희망이 없다. 은퇴할 때까지? 이직해도? 프리랜서 돼도? 서버가 돌아가는 한, 우리는 대기한다. 365일, 24시간. 실제로 일하는 건 아니어도, 대기는 한다. 이게 개발자의 숙명이다. 코드는 자면서도 돌아간다. 그래서 우리도 자면서 깬다. 폰 진동 소리에. 토요일 오후 3시 27분의 공포 다시 그 순간으로 돌아간다. 침대에 누워 있다. 평화롭다. 진동이 온다. 슬랙이다. "혹시 확인 가능하신가요?" 이 문장이 눈에 들어오는 순간, 주말이 끝난다. 정확히 3시 27분에. 앞으로 몇 시간이 남았는지는 중요하지 않다. 이미 출근 모드로 전환됐다. 뇌가 깨어난다. 휴식 모드 종료. 어떤 이슈일까. 심각한 건가. 빨리 처리 가능한가. 생각이 돌아가기 시작한다. 주말은 시간으로 측정되지 않는다. 메시지 하나로 시작되고 끝난다. "혹시 확인 가능하신가요?" 이게 주말 종료 알람이다.다음 주말도 똑같을 것이다. 그다음 주말도. 근데 확인은 할 거다. 안 볼 수가 없으니까.

야근 문화와 싸우는 개발자의 딜레마

야근 문화와 싸우는 개발자의 딜레마

야근 문화와 싸우는 개발자의 딜레마 또 8시 오늘도 6시가 됐다. 퇴근 시간이다. 근데 아무도 안 일어난다. 팀장이 자리에 앉아있다. 모니터를 보고 있다. 뭘 하는지는 모르겠다. 아마 메일 보는 중일 거다. 근데 그게 중요한 게 아니다. 그가 있다는 게 중요하다. 옆자리 박주임도 앉아있다. 헤드폰 끼고 코드 치는 척한다. 실제로 치고는 있는데, 급한 건 아닌 거 안다. 오전에 그 작업 끝났다고 했으니까. 나도 앉아있다. PR 리뷰를 한다. 급한 건 아니다. 내일 봐도 된다. 근데 지금 보고 있다. 이상하다. 다들 일이 있어서 남는 게 아니다. 남아야 해서 남는다.효율성이라는 허상 작년에 책을 읽었다. '실리콘밸리 어쩌구' 그런 제목이었다. 내용은 간단했다. 야근하지 마라. 쉬어라. 그게 효율적이다. 맞는 말이다. 실제로 그렇다. 피곤하면 코드 품질 떨어진다. 버그 만든다. 다음날 그거 고치느라 시간 쓴다. 악순환이다. 데이터도 있다. 주 40시간 이상 일하면 생산성 감소한다고. 그래프도 봤다. 50시간 넘으면 오히려 마이너스라고. 알고 있다. 다들 알고 있다. 근데 7시 반이다. 아직도 다들 앉아있다. 효율성? 그런 거 여기선 통하지 않는다. 적어도 우리 팀에선. 회사는 말한다. "워라밸 중요합니다." 복지 페이지에 써있다. 채용공고에도 있다. 근데 실제로는 다르다. 6시에 나가는 사람? "일 별로 없나보네." 이런 소리 들린다. 직접 듣진 않았다. 근데 분위기로 안다. 작년에 신입이 왔었다. 매일 6시 10분에 퇴근했다. 3개월 만에 팀 바뀌었다. 공식적인 이유는 '업무 적합성' 문제였다. 그 뒤로 아무도 6시에 안 나간다.야근의 구조 야근은 전염된다. 팀장이 남으면 주임이 남는다. 주임이 남으면 대리가 남는다. 대리가 남으면 사원이 남는다. 피라미드다. 역삼각형 피라미드. 가끔 팀장이 먼저 간다. "오늘은 약속 있어서." 이럴 땐 다들 7시쯤 나간다. 그래도 6시는 아니다. 너무 빨리 나가면 이상하니까. 근데 그런 날은 한 달에 한두 번이다. 배포일엔 더하다. 배포는 보통 오후 6시에 시작한다. 왜 6시냐고? 그게 규칙이니까. 배포 준비하느라 4시부터 긴장한다. 5시엔 테스트 서버 확인한다. 6시에 프로덕션 배포한다. 7시까지 모니터링한다. 문제 없으면 8시쯤 퇴근한다. 문제 생기면? 10시다. 운 좋으면. 작년엔 새벽 2시까지 있었다. 롤백하고, 원인 찾고, 다시 배포하고. 퇴근할 때 편의점에서 삼각김밥 샀다. 아침인지 저녁인지 모르겠더라. 다음날은? 9시 출근이다. 당연하다. 야근은 자발적인 거니까. 공식적으로는. 싸워봤다 한번 시도했다. 6개월 전쯤. 팀 회의에서 말했다. "야근 줄였으면 좋겠습니다. 효율성 측면에서도 그렇고요." 팀장이 고개 끄덕였다. "그러게. 다들 일찍 퇴근했으면 좋겠어." 끝이다. 대화는 거기까지였다. 다음날? 똑같다. 아무것도 안 바뀌었다. 일주일 뒤 다시 말했다. "지난번에 말씀드린 야근 건인데요." "아, 그거? 근데 지금 프로젝트 일정이 좀 빡빡해서. 마무리되면 그때 다시 얘기하자." 프로젝트는 끝났다. 다음 프로젝트가 시작됐다. 여전히 빡빡했다. 항상 빡빡하다. 2주 동안 나 혼자 6시에 퇴근했다. 실험이었다. 결과? 소외감. 팀원들이 저녁에 얘기한다. 슬랙에. "아 이 부분 김대리님 의견 필요한데." 나는 없다. 집에 있다. 다음날 아침. "어제 그 건 결정 났어요. 김대리님 의견 못 들어서 아쉬웠는데." 미안하다는 말투는 아니었다. 결국 다시 남게 됐다. 7시 반까지는.숫자로 보는 야근 계산해봤다. 하루 1.5시간 야근. 주 5일이면 7.5시간. 한 달이면 30시간. 30시간이면 거의 4일이다. 한 달에 4일을 공짜로 일하는 셈이다. 1년이면? 360시간. 45일. 두 달이다. 연봉 6500만원. 12개월로 나누면 월 541만원. 거기에 두 달 치면... 1082만원. 1년에 천만 원 어치를 공짜로 일한다. 물론 포괄임금제다. 계약서에 '월 20시간 야근 포함'이라고 써있다. 근데 실제론 30시간 넘게 한다. 초과 10시간. 시급으로 환산하면... 계산하기 싫다. 동기가 이직했다. 작년에. 연봉 7200 받는다고 했다. 야근? 거의 없다고. 배포 자동화 되어있고, 온콜도 돌아가면서 한다고. 700만 원 더 받으면서 야근도 안 한다. 나는? 여기서 야근한다. 왜? 이직이 귀찮아서. 면접 준비해야 한다. 알고리즘 문제 풀어야 한다. 이력서 써야 한다. 회사 찾아봐야 한다. 근데 야근하느라 시간이 없다. 야근 때문에 이직 못 하고, 이직 못 해서 야근한다. 순환논리다. 문화라는 이름의 감옥 야근은 문화다. 명문화되지 않은 규칙이다. 아무도 강요하지 않는다. 공식적으로는. 근데 다들 한다. 안 하면 이상한 사람 된다. 신기한 건 다들 싫어한다는 거다. 야근. 점심시간에 불평한다. "진짜 야근 지긋지긋해." 커피 마시면서 한숨 쉰다. "오늘도 늦게 가겠네." 근데 저녁 6시 되면? 다들 앉아있다. 변화를 원하지만 누구도 시작하지 않는다. 시작하면 손해니까. 먼저 나가면 찍히니까. 죄수의 딜레마다. 경제학 시간에 배웠던 거. 다들 협력하면 최선인데, 배신이 두려워서 결국 최악을 선택한다. 우리가 그렇다. 다 같이 6시에 퇴근하면 좋다. 근데 아무도 먼저 안 나간다. 결국 다 같이 8시까지 남는다. 최악의 균형이다. 근데 안정적이다. 아무도 깨지 않는다. 합리화의 기술 사람은 자기 행동을 합리화한다. 나도 그렇다. 야근하면서 생각한다. "뭐 그래도 요즘 10시까진 안 남잖아." "다른 회사는 더 심하대." "원래 개발자가 이런 거지." 거짓말은 아니다. 다 사실이다. 근데 위안이 되진 않는다. 가끔 반성한다. '내가 왜 이러고 있지?' 답은 알고 있다. 편해서. 익숙해서. 변화가 무서워서. 이직하면 새로운 사람들. 새로운 코드베이스. 새로운 규칙. 적응해야 한다. 증명해야 한다. 피곤하다. 차라리 여기서 야근하는 게 편하다. 적어도 익숙하다. 이직 준비할 시간에 넷플릭스 본다. 주말엔 늦잠 잔다. '다음 주부터 해야지.' 다음 주는 오지 않는다. 의지의 문제가 아니다. 시스템의 문제다. 근데 시스템은 안 바뀐다. 그럼? 내가 바뀌어야 한다. 근데 안 바뀐다. 그냥 야근한다. 해답은 없다 결론은 뭐냐고? 없다. 야근 문화는 당장 안 바뀐다. 내가 바꿀 수도 없다. 회사 전체의 문제니까. 할 수 있는 건 개인적 대응뿐이다. 이직할까? 진지하게 고민은 한다. 근데 실행은 안 한다. 아직은. 효율을 올릴까? 낮에 집중해서 일 끝내고 6시에 나갈까? 시도는 해본다. 근데 결국 남는다. 분위기 때문에. 타협한다. 7시 반까지만. 8시 넘기지 말자. 스스로 선 긋는다. 근데 배포일엔 어차피 넘긴다. 모순이다. 알면서 한다. 비효율적인 걸 알면서 반복한다. 왜? 그게 여기 문화니까. 나 혼자 바꿀 수 없으니까. 결국 적응이다. 불편하지만 참을 만하다. 최악은 아니다. 그냥 그렇다. 언젠가는 바뀔까? 모르겠다. 아마 안 바뀔 거다. 근데 희망은 버리지 않는다. 그게 버티는 방법이니까.오늘도 8시에 퇴근했다. 내일도 그럴 거다. 모레도.

로그 레벨을 DEBUG로 두고 배포한 죄책감

로그 레벨을 DEBUG로 두고 배포한 죄책감

로그 레벨을 DEBUG로 두고 배포한 죄책감 새벽 3시의 슬랙 메시지 금요일 저녁 7시. 배포 완료. "수고하셨습니다~" 단톡에 올리고 퇴근. 치킨 시켜놓고 맥주 땄다. 새벽 3시 20분. 슬랙 알림. "서버 응답 속도 왜 이래요?" 인프라팀 최대리다. 심장이 멎었다. 노트북 켰다. 손이 떨렸다.로그 파일 30GB VPN 접속. 서버 들어갔다. 로그 파일 확인했다. -rw-r--r-- 1 app app 30G Jan 17 03:15 application.log30기가. 배포 전엔 200메가였다. 4시간 만에 150배. tail 명령어 쳤다. 화면이 미친 듯이 흘렀다. 2025-01-17 03:15:23.441 DEBUG [http-nio-8080-exec-234] - Request received: GET /api/users 2025-01-17 03:15:23.442 DEBUG [http-nio-8080-exec-234] - Parsing request parameters... 2025-01-17 03:15:23.443 DEBUG [http-nio-8080-exec-234] - DB connection pool size: 15 2025-01-17 03:15:23.444 DEBUG [http-nio-8080-exec-234] - Executing query: SELECT * FROM users WHERE...1초에 수백 줄. 모든 API 호출마다. 모든 DB 쿼리마다. 모든 Redis 접근마다. 다 찍히고 있었다. application.yml 열었다. logging: level: root: DEBUG com.company: DEBUG내가 그제 고친 거다. 로컬에서 버그 잡으려고. 그리고 까먹었다.디스크 사용률 97% 더 큰 문제가 있었다. 그라파나 대시보드 확인. 디스크 사용률: 97%. 1시간 전만 해도 65%였다. 로그 때문에 디스크가 차고 있었다. 100% 되면 서버가 죽는다. 쓰기 작업 전부 실패한다. 오전 9시까지 4시간. 이 속도면 2시간 안에 100%. 손가락 떨면서 타이핑. sudo rm -rf /var/log/app/application.log.* sudo truncate -s 0 /var/log/app/application.log구형 로그 지웠다. 현재 로그도 비웠다. 5분 뒤. 다시 1.2GB. yml 수정했다. logging: level: root: INFO com.company: WARN긴급 배포. Jenkins 띄우고 빌드. 12분 걸렸다. 평소엔 8분인데. 배포 완료. 서버 재시작. 로그 속도 정상화. 디스크 사용률 72%에서 멈췄다. 새벽 4시 10분. 50분 걸렸다.월요일 아침 회의 주말 내내 불안했다. 로그 모니터링만 10번 확인. 다행히 문제 없었다. 월요일 9시. 주간 회의. 팀장이 물었다. "금요일 배포 후 이슈 있었나요?" 나: "아... 로그 레벨 설정 실수가 있었습니다." 인프라팀 최대리가 옆에 있었다. 눈빛이 날카로웠다. 팀장: "어떤 실수?" 나: "DEBUG로 남겨서 로그가 폭발했습니다. 디스크 97%까지 갔었고요." 회의실이 조용해졌다. 팀장: "언제 알았어요?" 나: "토요일 새벽 3시요." 팀장: "고객 영향은?" 나: "없었습니다. 응답 속도 약간 느렸지만." 거짓말이었다. Latency가 평소 200ms에서 800ms까지 튀었다. 다만 timeout은 안 났다. 팀장: "재발 방지는?" 나: "배포 체크리스트에 추가하겠습니다." 인프라팀 최대리: "로그 볼륨 알림도 설정해야죠." 나: "예, 그것도 하겠습니다." 회의 끝나고. 팀장이 따로 불렀다. "다음부턴 미리 말해." 그게 다였다. 혼은 안 났다. 더 무서웠다. 체크리스트 추가 그날 오후. 배포 문서를 수정했다. 배포 전 필수 체크리스트:application.yml 로그 레벨 확인 (INFO/WARN) 프로파일 설정 확인 (prod) DB 커넥션 URL 확인 Redis 엔드포인트 확인 외부 API 키 확인빨간색으로 강조했다. "로그 레벨 반드시 INFO 이하" Jenkins에 훅도 추가했다. 빌드 전에 yml 파싱해서. DEBUG 있으면 빌드 실패. stage('Check Log Level') { steps { script { def config = readYaml file: 'src/main/resources/application.yml' if (config.logging.level.root == 'DEBUG') { error('로그 레벨이 DEBUG입니다. INFO로 변경하세요.') } } } }후배 김주니어가 물었다. "형, 이거 너무 빡빡한 거 아니에요?" 나: "실수 한 번 하면 알게 돼." 김주니어는 이해 못 하는 표정. 2년 차는 아직 모른다. 프로덕션 장애의 공포를. 로그의 무게 개발할 땐 로그가 친구다. println 박고. System.out 찍고. log.debug() 남기고. "여기 들어왔나?" "이 값이 뭐지?" "쿼리 제대로 나가나?" 로그 없으면 디버깅 못 한다. IntelliJ 디버거 써도. 결국 로그를 본다. 그런데 프로덕션은 다르다. 로그 한 줄이 디스크를 먹는다. 초당 천 건 API면. DEBUG로 10줄씩 찍으면. 초당 만 줄. 분당 60만 줄. 시간당 3600만 줄. 하루면 8억 줄이 넘는다. 그게 전부 디스크에 쌓인다. 파일 시스템이 버틴다. 로그 수집기가 버틴다. 엘라스틱서치가 버틴다. 근데 비용이 나간다. S3 저장 비용. 클라우드워치 비용. 엘라스틱서치 인덱싱 비용. 회사 돈이다. 그리고 성능이 떨어진다. 파일 I/O는 느리다. 로그 찍는 동안 스레드가 멈춘다. async logger 써도. 버퍼가 차면 대기한다. 사용자는 기다린다. 로그 한 줄의 무게. 신입 때는 몰랐다. 7년 차가 되니 안다. 그래도 실수는 반복된다 이번이 처음은 아니다. 3년 전에는. 하드코딩한 테스트 계정. 프로덕션에 그대로 배포. 2년 전에는. Redis 키 prefix 빼먹어서. dev 데이터랑 prod 데이터 섞임. 1년 전에는. SQL 쿼리에 limit 빠뜨려서. 10만 건 full scan. 매번 다짐한다. "다시는 안 그러겠다." 근데 또 한다. 사람이라서. 피곤해서. 급해서. 시스템으로 막는다. 체크리스트. 자동화. 코드 리뷰. 그래도 빠져나간다. 완벽한 시스템은 없다. 결국 새벽에 슬랙 온다. 심장 떨린다. 노트북 켠다. 7년 차도 이런데. 15년 차는 어떨까. 익숙해질까. 아니면 더 조심해질까. 금요일 배포의 저주 왜 하필 금요일이었을까. 금요일 배포는 저주다. 업계 불문율. "금요일엔 배포하지 마라." 근데 우리 회사는 한다. 스프린트가 2주. 매주 금요일이 배포일. 그래서 매주 금요일. 6시 퇴근이 9시가 된다. 배포하고. 모니터링하고. 괜찮으면 퇴근. 근데 이번엔 방심했다. 배포 후 30분만 보고. "괜찮네" 하고 나왔다. 문제는 4시간 뒤에 터졌다. 로그가 쌓이는 건 느리다. 처음엔 티가 안 난다. 새벽에 터진다. 트래픽 적을 때. 다들 자고 있을 때. 월요일 배포였으면. 당일에 발견했을 거다. 사람 많을 때. 금요일 배포의 저주. 맞는 말이었다. 인프라팀의 차가운 시선 월요일 점심. 구내식당에서 최대리 만났다. 나: "저번에 죄송했습니다." 최대리: "괜찮아요. 빨리 조치했잖아요." 말투는 괜찮은데. 표정이 안 괜찮았다. 인프라팀 입장에선. 개발팀이 원수다. 우리가 코드 잘못 짜면. 서버가 죽는다. 그럼 인프라팀이 깬다. 메모리 릭. CPU 100%. 디스크 풀. 네트워크 타임아웃. 전부 개발자 실수다. 인프라팀이 수습한다. 그래서 우리를 못 믿는다. 배포할 때마다 긴장한다. "또 뭐 터질까." 이번 건으로. 신뢰가 더 깎였다. 다음 배포 때. 더 까다롭게 체크할 거다. "로그 레벨 확인했어요?" "진짜 확인했어요?" "yml 파일 보여주세요." 귀찮아진다. 근데 내 잘못이다. 신뢰는 쌓기 어렵고. 무너지긴 쉽다. 로그 레벨의 철학 INFO는 뭐고. WARN은 뭐고. ERROR는 뭔가. 신입 때는 몰랐다. 그냥 아무거나 썼다. log.info("유저 정보 조회"); log.warn("유저가 없음"); log.error("DB 연결 실패");다 틀렸다. INFO는 비즈니스 이벤트다. "주문 생성됨" "결제 완료" "회원가입 성공" 운영에 필요한 정보. 흐름 파악용. WARN은 비정상인데 처리 가능. "재시도 했음" "캐시 미스" "외부 API 느림" 신경 쓸 건데 급하진 않음. ERROR는 장애다. "DB 죽음" "필수 API 실패" "데이터 정합성 깨짐" 당장 처리해야 함. 슬랙 알림 가는 레벨. DEBUG는 개발용이다. 프로덕션엔 절대 안 씀. TRACE는 더 심하다. 라이브러리 내부 로직. 쓸 일 없다. 이걸 7년 만에 깨달았다. 늦었다. 다른 사람들의 실수 우리 팀만 그런 게 아니다. 작년에 A사. 환경변수 잘못 설정. 개발 DB를 프로덕션으로 착각. 실서비스가 테스트 데이터로 돌아감. B사는. 배포 스크립트 오타. 서버 전체 재시작 대신. 서버 전체 삭제. 백업으로 복구하는데 4시간. C사는. 캐시 TTL 설정 실수. 1시간이 1초로. Redis 트래픽 폭발. AWS 비용 하루에 300만원. 다들 실수한다. 베테랑도. 대기업도. 카카오 불 났을 때. 데이터센터 하나 죽었다. 백업 센터 자동 전환 실패. 카톡 5시간 먹통. 페이스북은. 잘못된 설정 배포로. 글로벌 서비스 6시간 다운. 아마존은. 오타 하나로. S3 전체 다운. 인터넷 절반이 멈췄다. 우리가 약한 게 아니다. 모두가 약하다. 다만 시스템을 개선해. 같은 실수 반복을 막는다. 지금의 대책 일주일 지났다. 추가한 것들.Jenkins 빌드 훅 - 로그 레벨 자동 체크 Grafana 알림 - 디스크 80% 넘으면 슬랙 로그 볼륨 모니터링 - 시간당 1GB 넘으면 경고 PR 템플릿 수정 - 로그 레벨 확인 항목 추가 배포 문서 업데이트 - 로그 관련 섹션 강화김주니어한테 교육했다. "로그는 비용이다." "프로덕션은 전쟁터다." "금요일 배포는 조심해라." 주니어는 고개 끄덕였다. 근데 이해 못 한 것 같았다. 결국 직접 겪어야 안다. 언젠가 김주니어도. 새벽 3시에 깰 거다. 심장 떨리며 노트북 켤 거다. 그게 성장이다. 아프지만. 로그가 가르쳐준 것 7년 동안 배운 것. 코드는 혼자 안 돌아간다. 서버 위에서 돈다. 네트워크 타고 간다. 데이터베이스랑 얘기한다. 그 모든 게 비용이다. CPU. 메모리. 디스크. 네트워크. 로그도 비용이다. 공짜가 아니다. "일단 찍어보자"가 습관이었다. 이제는 "꼭 필요한가"를 묻는다. DEBUG 로그 남길 때. "프로덕션에서 보겠어?" 아니면 지운다. INFO 로그 남길 때. "운영에 필요한가?" 아니면 DEBUG로. WARN 로그 남길 때. "조치 필요한가?" 아니면 INFO로. ERROR 로그 남길 때. "당장 처리해야 하나?" 그럼 슬랙 알림도. 로그 한 줄을 신중하게. 프로덕션을 존중하게. 여전히 불안한 금요일 오늘도 금요일. 배포일이다. 어제 PR 3개 머지했다. 오늘 오후 6시 배포 예정. 벌써 불안하다. 점심도 안 넘어간다. 체크리스트 10번 확인. 로그 레벨 INFO 맞음. 환경변수 prod 맞음. DB URL 맞음. 그래도 불안하다. 뭐 빠뜨린 것 같다. 김주니어가 물었다. "형, 왜 이렇게 예민해요?" 나: "작년에 사고 쳐봐서." 김주니어: "큰 사고였어요?" 나: "새벽 3시에 깼어." 김주니어: "아..." 이제 알 것 같다는 표정. 커피 세 번째. 손 떨린다. 카페인 때문인지. 긴장 때문인지. 6시간 남았다.금요일 배포는 여전히 무섭다. 7년 차도 그렇다.