2년 치 회사 DB 날려서 법원 갈 뻔한 사람이 기록하는 회고록

2024. 8. 10. 15:37·✍🏻/회고록
728x90
반응형

타노스도 우주의 절반만 날리는데...

 
'딸깍' 
약 200GB 데이터가 84KB가 되었던 순간.
대략 99.99996%를 날려버린 나는, 타노스보다 더 한 악당이 되었다.
 

사건의 시작 - 부제: 앱 접속 시 회원가입이 되는데요?



 

2024 07.29 오전 11시 30분 

욕 한마디 안 하시던 CTO님이

아침 회의 이후 화장실에 다녀오시더니 급히 문을 열고 들어오셨다.
평소엔 차분한 그분의 목소리가, 그날만은 달랐다.

 

'시x 다들 앱 실행해 보세요!'
나는 "응? 무슨 일이지" 하는 마음으로 앱을 열었는데, 회원가입이 되는 걸 보았고,

뭔가 단단히 잘못되었다고 느꼈다.
그 순간 운영 업무 하는 분이 '갑자기 고객문의가 계속 들어오고 있어요!'

말을 전해주면서 등에 식은땀이 나기 시작했다.
 

select * from users limit 10;  result = 0;

DB 유저 정보를 조회하는데 하나도 뜨지 않았다.
"응?",
"local DB에 쿼리를 날렸나?"
다시 한번 DB 이름을 확인했다. 
"응...?"
main DB 이름이 맞았다.
 

.

.

.
"이건 꿈일 거야"
 
문제가 될 수 있는 부분들을 파악해 보았다.
그리고 곧바로 알아낼 수 있었다.
 


. env 파일에 main DB URL과 local DB URL 모두 주석이 해제되어 있었다.
(필자는 prisma orm을 사용한다)

 

정말 내가 한 실수 때문일까? 
잘못된 DB 주소를 검색한 게 아닐까?

라는 생각들을 하며 
내 실수로 발생한 게 아니길 바랐다.

그러나 나도 알았다. 
내 실수로 일어난 일이란 것을...

 
이실직고

'제가 잘못한 것 같습니다.'
나는 이 말을 뱉을 수밖에 없었고

말하지 싫었던, 하지만 말할 수밖에 없던

그 순간의 감정과 심장박동을 잊을 수 없다.

 

prima ORM을 이용해서 테이블을 생성할 때

--create-only 옵션을 키지 않고, 실서버로 연결해 두어서 발생했다.
 
 

사내 모든 업무 중지

에어컨을 최저로 낮추고 있던 사무실이었는데도

온몸이 땀에 젖어 축축했다.
일단은 DB 복구가 제일 먼저다라는 생각이 들었다.
그러면서도

시간이 갈수록 점점 패닉상태가 되었다.
속으로 "하 xx x 됐다..."와 "개발자 인생은 이제 끝이다"라는 생각이 계속 맴돌었다.
 

우선 고객 대응을 위해

대표님 포함, 개발직군 외에  CS팀에 편성되어 고객응대를 하였고,

프런트 개발자와 디자이너분이
서비스에는 비상 전면 앱 공지 팝업을 띄웠다.

 

그리고 백엔드를 담당하는 CTO님과 나는 
계속 해결법을 찾았다.

속으로 "하 xx..."이라는 말이 계속 나왔다...


 
한 줄기의 빛 aurora DB... 사랑해... 


CTO님과 붙어
초기화 됐던 시점, DB 스펙 점검, DB스펙에서 특정 시점으로 롤백하는 방법을 포함하여 쿼리 로그를 찾아보았다.
 
그러던 중 CTO님이 aurora DB에서 시점으로 롤백하는 기능이 있는 것을 알아내셨고, 
사건이 터진 시점은 10시 37분이었지만 여러 가지를 고려해 2분 차이를 두고 10시 35분으로 롤백할 수 있었다.
(2분 차이를 둔 이유는 찰나의 순간으로 생성된 데이터 보존을 위함이었다)

 

DB upgrade내역을 찾아보니
약 3달 전인 24년 4월 DB lack이 있어서 aurora DB로 업그레이드했었는데,

aurora DB 스펙에서 롤백기능을 제공했고,

이전에 쓰던 DB에서는 롤백 기능을 제공하지 않았다.
만약 4월 이전에 이런 일이 있었다면...

하아.... 난 감방 가야 했다
 
새로운 auroraDB를 띄우고 proxy 서버와 연결을 해주고, proxy DB 설정도 다 해주고

3시간 정도 흐른

오후 2시 즈음이 되어야 DB를 복구를 할 수 있었다.

동료들과 CTO님께 감사하고 너무 죄송했다.

 

이때 끊었던 담배를 다시 피우게 되었고,
등과 바지가 흥건히 땀에 절어 있었다.
 

 


해결 이후 

 
로그인이 되지 않아 해당 시간에 접속한 유저뿐 아니라 모든 유저에게 보상 금액을 지원했다.
대략 n천만 원의 포인트가 유저들에게 지급되었다. 
 
다른 팀원들도 당일 해야 하는 업무가 있었는데 업무가 모두 밀렸다.
 
대표님께 면담을 요청했다.
이 회사에서 서버를 날린 이력도 있었는데,

이번엔 DB를 날려버렸다.
나의 개발자 인생은 "여기까지다"라고 생각했다.
암울했다. 죄송했다. 죽고 싶은 심정이었다.

 

대표님에게 책임지고 퇴사를 하겠다고 했다.
 
대표님은
"당연히 징계는 있다. 하지만 OO 씨의 퇴사를 생각한 건 아니다"라는 말과 함께
"퇴사는 책임지는 게 아니라 회피다"
"이 계기로 더 성장했으면 좋겠다."
"바빠서 인프라를 못 챙긴 회사 책임도 있다" 
라고 해주셨다.
 
나는 대표님과 CTO님을 포함한 동료들이
누구보다 일찍 출근하고 늦게 퇴근하고,

고객에게 어떤 기쁨을 줄지 매일 고민하는 것을 보면서 
어떤 마음으로 서비스를 키워가고 있는지 너무도 잘 아는 마음에

죄송함으로 며칠을 보낸 기억이 아직도 생생하다.
 

 


재발 방지 그리고 회고

이번 사건을 회고해 보았을 때 왜 이런 일이 발생했을까 생각해 보았다.

 
1. 바쁘다고 미루고 미루던 DB 계정 별 접근 권한을 주지 않았다.

너무도 당연한 이야기지만,

DB 접근 계정에 권한을 주지 않았다.

백엔드 개발은 CTO님과 나 둘이 담당하고

워낙 많은 업무를 처리하다 보니 넘어갔었다.

(귀찮음이 컸다.)


이 날 이후로 
 Main, QA DB 별 계정 권한에 read-only 계정과

create, update, read권한을 부여한 계정을 생성했다

그리고 모두 deleted, drop 권한은 주지 않았다.

 

2. 바쁘다고 업무 루틴을 지키지 않았다.

핑계라면 핑계지만,,, 전 날 노트북이 맛 가서 초기화를 진행했다.
그 이후로 키보드 배열 세팅등 사소한 부분들이 모두 초기화되었는데, 
달라진 환경에서 prisma 배포하는 과정에서 체크하는 루틴이 있었는데 
업무 루틴을 지키지 않았다. 

싸함은 틀리지 않는다.


 

3. 컨디션 관리

아침부터 뇌가 멍했다.
과로로 인해 수면을 충분히 취하지 못했고,

카페인에 뇌가 절여진 것 같은 집중력이 한몫했던 것 같다.
 
 
앞으로는 절대, 어떤 회사를 가더라도 DB 권한 체크부터 할 것이다.
그리고 멘탈도 많이 나갔는데, 정신 다 잡고, 공부를 더 해야겠다고 느꼈다.
요즘은 아침 1-2시간 이른 출근 후 공부를 하고 있다.
 


To. 이 글을 보고 있는 친애하는 개발자 분들에게. 
나의 이 당시 감정이 100% 전달될 순 없겠지만,
세상의 어떤 개발자에게 이런 비극적이고 참혹한 일이 일어났었습니다.
자신이 현재 겪고 있는 개발적인 어려움은 저의 일로 위안이 되시길 바랍니다.
일정에 쫓기고, 상사한테 욕을 먹을 때마다
"에이 그래... DB 날린 것도 아닌데 뭐~" 이런 마인드셋으로 이겨내시길 바랍니다.
그리고 권한 부여는 꼭 합시다...
 
 

728x90
반응형
저작자표시 비영리 변경금지 (새창열림)

'✍🏻 > 회고록' 카테고리의 다른 글

2024년 연말회고  (2) 2025.01.01
스타트업에서 QA 하기(백엔드 개발자의 QA 경험담: 작지만 강한 스타트업의 QA 전략)  (4) 2024.06.06
행동하고 많이 실패하는게 중요한 이유 | feat. 스티브잡스  (0) 2024.05.26
[백엔드]기프티콘 도메인에 대한 이해 & 정리 & 회고  (0) 2024.05.11
영업이익, 공헌이익, JTBD의 연관관계에 대하여  (0) 2024.05.04
'✍🏻/회고록' 카테고리의 다른 글
  • 2024년 연말회고
  • 스타트업에서 QA 하기(백엔드 개발자의 QA 경험담: 작지만 강한 스타트업의 QA 전략)
  • 행동하고 많이 실패하는게 중요한 이유 | feat. 스티브잡스
  • [백엔드]기프티콘 도메인에 대한 이해 & 정리 & 회고
foodev
foodev
이것저것 개발과 이것저것 리뷰 합니다.
    반응형
    250x250
  • foodev
    개발 개맛집
    foodev
  • 전체
    오늘
    어제
    • 분류 전체보기 (109)
      • 🌟🙇🏻‍♂️ 꼭 읽어봤으면 하는 글 (4)
      • 💻 개발 (72)
        • 설정 및 세팅 (4)
        • DB&서버&네트워크&암호 (11)
        • React (0)
        • JPA, Querydsl (13)
        • 알고리즘 (7)
        • 언어 (15)
        • 프레임워크 (12)
        • HTML, CSS (10)
      • ✍🏻 (33)
        • 회고록 (15)
        • 독서록 (7)
        • 일지록 (10)
        • 세미나 (1)
      • 💡 리뷰 (0)
        • 제품리뷰 (0)
  • 블로그 메뉴

    • 홈
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    validation failed (numeric string is expected)
    db 날림
    개발썰
    azure ci/cd
    스냅샷과 히스토리
    해피해킹 키매핑
    db 날린 썰
    di의존성
    해피해킹 카라비너
    githubaction 라벨 배포
    typedi 동작원리
    스냅샷과히스토리성 차이
    해피해킹 방향키
    QueryDSL
    nestjs pipe body
    토이프로젝트개발일지
    di동작원리
    해피해킹 커스텀
    githubaction 라벨 ci/cd
    nestjs pipe
    해피해킹 꿀팁
    di란
    typedi란
    서이추
    디비스냅샷
    스냅샷과로그성
    JPA
    스냅샷방식
    창업패키지후기
    db 초기화
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
foodev
2년 치 회사 DB 날려서 법원 갈 뻔한 사람이 기록하는 회고록
상단으로

티스토리툴바