Showing Posts From

스타트업

Figma도 해야 한다고?: 디자이너 역할까지 겸임한 개발자

Figma도 해야 한다고?: 디자이너 역할까지 겸임한 개발자

오늘은 디자이너 월요일 아침이다. 슬랙 메시지가 떴다. "로그인 화면 UI 좀 다듬어주세요. 버튼 색이랑 폰트 크기 조정하고요." 나는 개발자다. 근데 디자인 툴을 켜야 한다. Figma를 열었다. 벌써 세 번째 프로젝트다. 처음엔 "임시로만"이라고 했다. 이제 당연하다는 듯이 요청이 온다. 디자이너는 없다. 예산이 없어서다. 대표님 말씀으로는 "요즘 개발자들은 다 디자인도 하더라고요." 그래. 나도 안다. 풀스택이니까. 프론트도 하고 백엔드도 하고 인프라도 본다. 근데 디자인까지?디자인 시스템이 뭔데 "디자인 시스템 좀 만들어주세요." 기획자가 말했다. 디자인 시스템. 들어는 봤다. 구글링을 했다. Material Design, Ant Design, 여러 레퍼런스가 나왔다. 좋아 보였다. 근데 우리 서비스에는 안 맞는다. 결국 직접 만들어야 한다. 버튼 컴포넌트부터 시작했다. Primary, Secondary, Disabled. 색상은 몇 개? 사이즈는? Border-radius는? CSS 짜는 건 익숙하다. 근데 이게 "예쁜지"는 모르겠다. 대표님한테 물었다. "이거 괜찮나요?" "음... 좀 더 모던하게?" 모던. 그게 뭔데. 유튜브로 디자인 강의를 봤다. "UI/UX 기초", "디자인 시스템 만들기", "색채론 입문". 새벽 2시까지 봤다. 다음날 다시 만들었다. 이번엔 좀 나아 보였다. "좋네요! 이거로 가시죠." 드디어 인정받았다. 근데 기쁘지 않다. 내 일이 또 늘었으니까.컬러는 #무엇 색상을 정해야 한다. Primary 컬러는 뭘로 할까. 파란색? 진부하다. 초록색? 너무 자연 친화적이다. 보라색? 우리 서비스랑 안 맞는다. 색상환을 봤다. HSL 값을 조정했다. H 210, S 80%, L 60%. 괜찮아 보인다. 근데 Accessible 하냐고 물어본다. 뭐가 Accessible 한지 몰랐다. 또 구글링이다. WCAG 2.1 AA 기준. Contrast ratio 4.5:1 이상. 도대체 이게 뭔 소리야. 플러그인을 깔았다. "Stark - Accessibility Checker". 빨간불이 떴다. 명도 대비가 부족하단다. 색상을 다시 조정했다. L 값을 55%로 낮췄다. 이번엔 통과했다. 2시간이 걸렸다. 색상 하나 정하는 데. 아직 Secondary, Error, Warning, Success 색상이 남았다. 저녁 7시다. 배고프다. 근데 일단 끝내고 먹어야 할 것 같다. 아이콘은 어디서 아이콘이 필요하다. 무료 아이콘 사이트를 뒤졌다. Heroicons, Feather Icons, Material Symbols. 다 괜찮다. 근데 통일성이 없다. 어떤 건 라인 스타일, 어떤 건 Solid. 섞으면 이상하다. 직접 만들기로 했다. Figma에서 벡터 도구를 켰다. 사각형 그리고, 원 그리고, 패스 조정하고. 30분 만에 하나 완성했다. 근데 60개가 필요하다. 계산했다. 30분 × 60개 = 1800분 = 30시간. 미쳤다. 결국 타협했다. 기본 아이콘은 라이브러리 쓰고, 커스텀 필요한 것만 만든다. 그래도 15개는 직접 그렸다. 주말 오후가 다 갔다. 친구가 놀자고 연락 왔다. "바빠. 아이콘 그리는 중." "개발자가 왜 아이콘을?" 나도 모르겠다.Typography는 또 뭐야 폰트를 정해야 한다. 본고딕? 나눔스퀘어? Pretendard? Spoqa Han Sans? 각각 테스트해봤다. 다 비슷해 보인다. 근데 미묘하게 다르다. 행간은 얼마? 자간은? Font-weight는 몇 종류 쓸 건데? "글씨가 좀 답답해 보여요." 기획자 피드백이다. 답답하다는 게 뭔 뜻이지. 행간을 1.5에서 1.6으로 올렸다. "오, 좋네요!" 0.1 차이로 답답함이 해소된단다. Heading은 5단계로 나눴다. H1부터 H5까지. 각각 크기를 정하고, weight를 정하고, line-height를 정했다. 반응형도 고려해야 한다. 모바일에서는 H1이 너무 크다. 미디어쿼리를 추가했다. 결국 만들었다. Typography Scale. 근데 쓰는 건 H1, H2, Body 세 개뿐이다. 왜 만들었지. 레이아웃 그리드 "디자인에 그리드를 깔아주세요." 무슨 말인지 알아듣는 데 3초 걸렸다. 그리드. 12컬럼? 16컬럼? Gutter는 몇 픽셀? Material Design 가이드를 참고했다. 12컬럼, 24px gutter. Figma에서 Layout Grid를 설정했다. 빨간 선이 쫙 그어졌다. 이제 컴포넌트를 그리드에 맞춰 배치한다. 정렬이 딱딱 맞으니 괜찮아 보인다. 근데 개발할 때 이거 다 맞춰야 하나. CSS Grid로 구현했다. grid-template-columns: repeat(12, 1fr). 간단하다. 근데 디자인대로 정확히 맞추려면 padding, margin 계산이 빡세다. 밤 11시에 완성했다. 그리드 시스템. 쓸모는 있는 건가. 모르겠다. 이제 개발한다 디자인이 끝났다. 2주 걸렸다. 원래 개발에 쓸 시간이었다. 이제 코드를 짠다. React 컴포넌트로 만든다. Button 컴포넌트. 디자인 시스템대로 구현한다. variant, size, disabled props. Input 컴포넌트. label, error, helperText 다 넣었다. Card, Modal, Dropdown. 하나씩 만들어간다. Storybook도 세팅했다. 컴포넌트 문서화까지. 혼자 만들고 혼자 본다. 코드리뷰 해줄 사람이 없으니까. 3주 차다. 드디어 실제 기능 개발에 들어간다. 로그인 페이지를 만들었다. 디자인한 컴포넌트를 조합했다. 예쁘다. 내가 디자인한 게 화면에 나오니 뿌듯하다. 근데 이거 하나 만드는 데 왜 5주가 걸렸나. 디자이너 구인 공고 "디자이너 뽑을까요?" 대표님한테 조심스럽게 물었다. "아직은 어렵죠. 예산이..." 알고 있었다. "OOO님이 잘해주시잖아요." 나를 칭찬하는 건지 부담 주는 건지 모르겠다. 구인공고는 올렸다. 6개월째 연락이 없다. 스타트업이라 그렇다. 연봉도 낮고 스톡옵션도 의미 없고. 결국 나만 있다. 개발자 겸 디자이너. 이력서에는 뭐라고 쓰지. "UI/UX 가능한 풀스택 개발자"? 웃긴다. 풀스택의 의미 풀스택이 뭔가 했다. 프론트엔드, 백엔드. 그 정도인 줄 알았다. 여기는 다르다. DevOps도 한다. AWS 세팅, Docker 배포, CI/CD 파이프라인. 기획도 돕는다. 요구사항 정리, 유저 플로우 그리기. 이제 디자인도 한다. UI 설계, 컴포넌트 제작, 디자인 시스템. 심지어 CS도 본다. 유저 문의 오면 내가 답한다. 진짜 풀스택이다. Full Stack이 아니라 Full Everything. 월급은 개발자 하나 치인데 일은 다섯 몫이다. 효율적이긴 하다. 소통 비용이 없으니까. 나랑 나랑 얘기하면 되니까. 근데 지친다. 하나에 집중을 못한다. 오늘은 디자인하다가 내일은 백엔드 API 짜다가 모레는 인프라 이슈 해결. 전문성은 어디로 갔나. 이직 고민 이력서를 업데이트했다. "React, Node.js, PostgreSQL, AWS, Docker... 그리고 Figma." Figma를 넣을지 고민했다. 근데 뺄 수가 없다. 실제로 했으니까. 대기업 공고를 봤다. "프론트엔드 개발자", "백엔드 개발자". 분리돼 있다. 디자인은 디자이너가 한다. 당연하다. 여기는 특이한 거다. 면접 가면 뭐라고 설명하지. "디자인 시스템 구축 경험이 있습니다"? 좋게 들릴까. 아니면 "왜 개발자가 그걸?"이라고 할까. 3년 차 개발자. 근데 제대로 된 개발 경험은 얼마나 되나. 기술 부채를 해결할 시간도 없었다. 테스트 코드도 못 짰다. 디자인하느라. 내일도 Figma 내일 할 일을 정리했다.회원가입 플로우 UI 수정 대시보드 차트 컴포넌트 디자인 API 에러 핸들링 개선 프로덕션 배포1번, 2번이 디자인이다. 3번, 4번이 개발이다. 반반이다. 요즘 평균이 이렇다. Figma는 익숙해졌다. 단축키도 외웠다. Auto Layout도 쓴다. 근데 좋아하지는 않는다. 코드가 더 편하다. 로직이 더 재밌다. 그래도 해야 한다. 나밖에 없으니까. "정말 풀스택이 됐다"는 말이 맞다. 원하던 풀스택은 아니지만.Figma 탭을 10개 열고, VS Code 탭도 10개 열고, 그렇게 일한다.

부모님: '대기업 갔으면 좋았겠어' - 대답할 말이 없다

부모님: '대기업 갔으면 좋았겠어' - 대답할 말이 없다

부모님: '대기업 갔으면 좋았겠어' - 대답할 말이 없다 명절이 두렵다 명절 전날 대표한테 슬랙 온다. "내일 점검 있으니까 노트북 챙겨가세요." 챙긴다. 고향 가는 KTX에서도 AWS 콘솔 확인한다. 비용이 또 올랐다. 친척들이 모인다. "요즘 어디 다녀?" 스타트업이라고 한다. "거기 이름이 뭔데?" 설명한다. 아무도 모른다. "직원이 몇 명인데?" 12명이라고 한다. 분위기가 이상해진다. 아버지가 끼어든다. "대기업은 안 갔어?" 떨어졌다고 한다. "재수하지 그랬어." 경력 쌓고 있다고 한다. "그게 경력이야?" 할 말이 없다. 어머니는 다르게 접근한다. "요즘 잘 자?" 못 잔다고는 못 한다. "밥은 먹어?" 편의점 도시락 먹는다고는 못 한다. "얼굴이 왜 그래?" 거울 안 봤다.설명할 수 없는 것들 "성장하고 있어요." 이렇게 말한다. 부모님 표정이 안 좋다. 무엇을 성장이라고 해야 할까. React 마스터했다고? Node.js로 서버 구축했다고? AWS 인프라 전체를 혼자 관리한다고? Docker 컨테이너 최적화했다고? 부모님 세대는 이해 못 한다. 아버지는 제조업 다니셨다. 30년 한 회사. 어머니는 공무원이셨다. 정년퇴직. 둘 다 '안정'이라는 걸 아신다. 내가 하는 일은 안정과 거리가 멀다. 어제 밤 서버 터졌다. 새벽 4시에 고쳤다. 오늘 아침 출근해서 또 일했다. 이게 성장인가? 경험인가? 아니면 그냥 착취인가? "풀스택 개발자예요." 설명한다. "그게 뭔데?" 질문 온다. "프론트도 하고 백엔드도 하고 인프라도 해요." "그럼 사람을 세 명 뽑아야 하는 거 아니야?" 맞다. 근데 우리는 안 뽑는다. 연봉 얘기가 나온다. 4800만원. 서울에서 혼자 살기에 빠듯하다. 월세 80만원, 관리비 10만원, 식비 40만원, 통신비 7만원, 카드값 30만원. 남는 게 없다. "대기업 가면 초봉이 얼마야?" 삼촌이 묻는다. 6500만원쯤? 게다가 복지가 다르다. 사내 식당, 기숙사, 헬스장, 동호회, 명절 상여금, 휴가비. 우리는? 없다. "스톡옵션 있어요." 말한다. "그게 뭔데?" "회사 주식이요. 0.5%요." "회사가 상장해?" 아니요. "그럼 휴지 조각 아니야?" 할 말이 없다.요즘 잘 자고 먹어? 어머니의 질문이 제일 답하기 어렵다. 잘 자냐고? 어제 새벽 2시에 잤다. 오늘 7시에 장애 알림 울렸다. 노트북 켜서 확인했다. DB 커넥션 풀이 터졌다. 재시작하고 모니터링했다. 10시에 출근했다. 지난주는 더 심했다. 월요일 밤 11시에 배포했다. 화요일 새벽 3시에 롤백했다. 수요일 밤 1시에 재배포했다. 목요일 새벽 4시에 또 터졌다. 금요일은 기억이 안 난다. 수면 패턴이 망가졌다. 침대에 누우면 슬랙 알림 생각난다. 눈 감으면 에러 로그가 보인다. 꿈에서도 코드를 친다. 일어나면 피곤하다. 먹냐고? 아침은 못 먹는다. 일어나면 출근 시간이다. 점심은 배달 시켜서 모니터 보면서 먹는다. 키보드에 국물 튄다. 저녁은? 퇴근이 언제인지 모르니까 편의점 도시락이다. 요즘 위가 안 좋다. 속이 쓰리다. 커피를 하루 5잔 마신다. 에너지 드링크 2캔 추가. 물은 잘 안 마신다. 컵라면 자주 먹는다. 치킨은 주 2회. 건강검진 결과 나왔다. 의사가 말한다. "수면 부족, 스트레스 과다, 위염, 영양 불균형." 약 처방받았다. 안 먹는다. 먹을 시간이 없다. "병원은 가?" 어머니가 묻는다. 시간이 없다고 한다. "주말에라도 가." 주말에도 일한다고는 못 한다. "얼굴색이 안 좋아." 안다. 거울 보면 나도 놀란다.대기업 동기들 대학 동기 단톡방이 있다. 요즘 조용하다. 다들 바쁘다. 종종 소식이 올라온다. "팀장님이 칭찬하셨다." "프로젝트 마무리했다." "해외 출장 간다." 좋아요 누른다. 부럽다. 한 녀석이 물어본다. "너 아직 거기야?" 응. "힘들지 않아?" 힘들다. "이직 안 해?" 하고 싶다. "우리 회사 오면?" 지원했다. 떨어졌다. 그 녀석 연봉이 7500만원이다. 3년 차에. 나보다 2700만원 많다. 복지는 비교 자체가 안 된다. 사내 식당, 헬스장, 수영장, 도서관, 카페. 야근하면 택시비 나온다. 우리는? 자비다. 휴가도 다르다. 그 녀석은 연차 15일에 리프레시 휴가 5일. 총 20일. 나는? 연차 10일인데 못 쓴다. 쓰면 서비스 터진다. 대체 인력이 없다. 복지 포인트라는 것도 있다. 연 300만원. 도서 구매, 문화생활, 자기계발에 쓴다. 우리 회사는? 커피 무제한. 그게 복지다. 작년에 그 녀석 만났다. "너 왜 그렇게 말랐어?" "요즘 바빠서." "야근 많아?" "음." "그래도 스타트업이 성장하면 대박 아니야?" "그러게." 대박. 언제? 어떻게? 우리 MAU가 5만이다. 3년째 정체다. 투자 유치? 작년에 시리즈 A 받았다. 30억. 다 쓴다. 다음 라운드는? 모른다. 상장? 대표는 3년 안에 한다고 했다. 2년 지났다. 실적은? 적자다. 매출은 늘고 있다. 근데 비용이 더 빨리 는다. 손익분기점은? 언제일지 모른다. 책임감이라는 올가미 이직하고 싶다. 진심이다. 이력서 써놨다. 포트폴리오 정리했다. 근데 지원을 못 한다. 왜? 책임감 때문이다. 내가 나가면 서비스 멈춘다. 진짜로. 개발자가 나 혼자다. 코드베이스 전체를 내가 안다. 인프라 접근 권한도 나만 있다. DB 스키마도 내가 설계했다. API도 내가 만들었다. 대표가 말한다. "곧 채용할 거예요." 6개월째 같은 말이다. 공고는 올렸다. 지원자는? 거의 없다. 면접은? 몇 명 봤다. 합격은? 없다. 왜 안 뽑히나. 연봉이 낮다. 우리가 줄 수 있는 게 4000만원이다. 경력 3년 개발자한테. 대기업은 6000만원 준다. 당연히 안 온다. 기술 스택도 문제다. "풀스택 가능하신 분" 이게 공고다. 프론트, 백엔드, 인프라 다 해야 한다. 지원자가 묻는다. "팀 규모가 어떻게 되나요?" "개발자 1명이요." "...네?" 다음 날 불합격. 이런 상황에서 내가 나가면? 서비스 죽는다. 유저 5만 명 피해 본다. 투자자들 화난다. 대표 힘들어진다. 동료들 실직한다. 그래서 못 간다. 책임감이다. 아니, 죄책감이다. 어머니는 이해 못 한다. "회사가 너한테 책임감 느끼냐?" 모른다. "너 쓰러지면 회사가 챙겨주냐?" 안 준다. "그럼 네가 왜?" 모르겠다. 성장이라는 착각 "그래도 배우는 게 많잖아." 이렇게 위로한다. 스스로를. 배웠다. 많이. React, Node.js, PostgreSQL, Redis, AWS, Docker, Kubernetes, CI/CD, 모니터링, 로그 분석, 보안, 성능 최적화. 3년 동안 엄청나게 성장했다. 기술적으로. 혼자 풀스택 서비스 만들 수 있다. 인프라 구축할 수 있다. 장애 대응할 수 있다. 24시간 온콜 돌릴 수 있다. 근데 이게 성장인가? 아니면 생존인가? 대기업 동기들은 다르게 성장한다. 체계적으로. 한 분야 깊게 판다. 시니어한테 배운다. 코드 리뷰 받는다. 스터디 한다. 컨퍼런스 간다. 교육비 지원받는다. 나는? 혼자 부딪힌다. 스택오버플로우가 멘토다. 구글이 선배다. 새벽 3시 에러 로그가 스승이다. 코드 리뷰? 없다. 내가 틀렸는지 맞는지 모른다. 기술 부채가 쌓인다. 보인다. 리팩토링하고 싶다. 시간이 없다. 테스트 코드 짜고 싶다. 여유가 없다. 문서화하고 싶다. 마감이 급하다. "빨리 만드세요." 대표가 말한다. "제대로 만들고 싶은데요." "일단 돌아가게 만드세요." 그렇게 만든다. 기술 부채 쌓인다. 나중에 고치자. 나중은 안 온다. 6개월 전 코드 본다. 내가 짠 건데 이해 안 된다. 주석이 없다. 변수명이 엉망이다. 로직이 복잡하다. 고치고 싶다. 근데 건드리면 터질 것 같다. 그냥 둔다. 이게 성장인가? 기술 부채 관리자가 된 건가? 부모님한테 설명할 수 없다. "요즘 뭐 배워?" "음... Kubernetes요." "그게 뭔데?" "컨테이너 오케스트레이션이요." "...너 밥은 먹어?" 결국 여기로 온다. 밥은 먹냐. 잘 자냐. 건강하냐. 대답할 말이 없다. 포기할 수 없는 이유 그래도 못 나간다. 아직은. 이유가 있다. 스톡옵션 0.5%. 휴지 조각일 수도 있다. 근데 만약? 만약 회사가 대박 나면? 만약 상장하면? 만약 인수되면? 0.5%면 얼마나 될까. 회사 가치가 1000억 되면 5억. 2000억 되면 10억. 꿈같은 얘기다. 근데 불가능하지는 않다. 그래서 못 나간다. 또 다른 이유. 3년 버텼다. 여기서 포기하면 아깝다. 조금만 더. 조금만 더 버티면 뭔가 달라질 것 같다. 착각이다. 알면서도 믿는다. 그리고 솔직히. 이직이 무섭다. 대기업 가면 나 같은 사람 많다. 경쟁 심하다. 여기서는 내가 유일하다. 필요하다. 중요하다. 착각이지만 좋다. 부모님은 이해 못 한다. "빨리 이직해." "조금만 더요." "몸 망가진다." "괜찮아요." "괜찮은 게 어딨어." 할 말이 없다. 명절 끝나고 서울 온다. KTX 타면서 슬랙 확인한다. 대표한테 메시지 왔다. "고생 많으셨어요. 내일 회의 있습니다." 회의 주제는 뭘까. 신규 기능? 또? 리소스는? 나? 일정은? 타이트? 당연히. 핸드폰 보다가 어머니 문자 온다. "잘 도착해. 밥 꼭 챙겨 먹어. 몸 상하면 나중에 후회해." 답장 친다. "네. 걱정 마세요." 거짓말이다. 걱정해야 한다. 나도 걱정된다. 근데 어쩌겠나. 이게 내 선택이다. 맞나? 모르겠다.대기업 갔으면 좋았을까? 모른다. 근데 부모님 답답하신 건 이해한다.

배포-롤백-재배포: 저녁 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살도 안 됐는데. 이게 평생 이렇게 갈까? 아니다. 언젠가는 바뀔 거다. 분명히. 하지만 오늘은 아니다. 오늘도 야근한다.내일은 좀 나아지겠지. 아마도.