"일단 보여야 막을 수 있다"
24.06.22 yoda
입사하고 온보딩이 막 끝날 무렵이었다. 코드베이스 파악하고, 파이프라인 구조 익히고, 데이터 흐름 그림 그리던 시기. 그때 팀에서 가장 큰 이슈 얘기가 나왔다. AUM 50억 규모 공모펀드 파이프라인에서 실제로 있었던 사고였다.
알파 생성 mart 파이프라인이 raw 데이터가 없는 채로 돌았다.
raw가 없으니 mart는 null을 뱉었다. 알파 시그널이 null이면 시스템 입장에서는 "시그널 없음"으로 해석됐다. 시그널이 없는 종목은 포지션을 정리하는 로직이 있었고, 결과적으로 특정 종목이 전량 매도됐다.
파이프라인은 에러 없이 성공했다. 로그는 깨끗했다. 데이터가 없어서 null이 나온 거지, 시스템이 뭔가 잘못된 게 아니었으니까. 아무도 몰랐다. 매도가 실행되고 나서야 잘못된 걸 펀드운영사에서 회신을 하게 되었다.
이게 내가 입사하고 몇일 후 터진 일이엿다.
구조를 파악하면서 원인이 보이기 시작했다.
raw→mart→알파 시그널→MP
*(MP 란? 펀드 구성종목에 대한 포트폴리오 비중이 담긴 중요한 문서)
이 흐름에서 각 단계가 Airflow DAG으로 연결되어 있었는데, upstream이 실패해도 downstream이 그냥 돌아가는 구조였다. DAG 간 의존성이 느슨하게 걸려있었고, raw 적재 DAG이 데이터 없이 성공 처리되면 mart DAG은 그걸 모른 채 실행됐다.
더 근본적인 문제는 "데이터가 있냐 없냐"를 아무도 체크하지 않았다는 거였다. 파이프라인 성공 여부만 봤지, 실제로 데이터가 정상적으로 들어왔는지를 확인하는 레이어가 없었다.