재무 데이터를 자동으로 모으는 코드에서 빈 응답을 0으로 채우는 경우를 종종 본다. 편해서 그렇게 짜는데, 결과는 생각보다 크게 틀어진다. 삼성전자의 2024년 영업현금흐름 자리에 0이 들어가면 73조원을 번 회사가 한 푼도 못 번 회사가 된다.
실제로 요청해 봤다
2026년 11월 3일, OpenDART의 단일회사 전체 재무제표 API에 삼성전자(고유번호 00126380) 2024년 사업보고서(11011) 연결 기준(CFS) 데이터를 요청했다. 인증키는 일부러 비워 두었다. 같은 조건으로 두 번 보냈고 결과는 같았다.
| 관측 항목 | 실제 결과 |
|---|---|
| 서비스 | 단일회사 전체 재무제표 |
| 요청 연도·보고서·범위 | 2024 · 11011 · CFS |
| HTTP 상태 | 200 |
| 본문의 status | 100 |
| 본문의 message | 인증키가 누락되었습니다. |
| 재무 계정 list | 응답에 없음 |
| 이 응답으로 확보한 재무 숫자 | 없음 |
HTTP 상태는 200이다. 서버에 요청이 닿았고 응답이 왔다는 뜻일 뿐이다. 실제 결과는 본문의 status에 들어 있다. 개발가이드상 정상은 000이고, 이번에 돌아온 100은 인증키가 없다는 오류다. 계정 목록(list)은 아예 없다.
HTTP 200만 확인하고 넘어가는 코드는 이 응답을 성공으로 처리한다. 그러면 숫자가 하나도 없는 결과가 다음 단계로 넘어가고, 거기서 빈칸이 0으로 바뀌는 일이 생긴다. 내가 보기엔 재무 데이터 수집에서 가장 흔하고 가장 티가 안 나는 실수다.
0이 들어가면 생기는 일
삼성전자 공식 2024년 연결 감사보고서의 영업활동현금흐름은 72,982,621백만원이다. DART 사업보고서 원문에서도 같은 숫자를 확인할 수 있다. 이 숫자는 API가 아니라 원문에서 직접 가져왔다.
빈칸에 0을 넣으면 오차는 -100%다. 영업으로 73조원을 번 회사가 현금을 전혀 못 번 회사로 바뀐다. 거꾸로 영업현금이 마이너스인 회사였다면 0은 현금 유출을 감춰 버린다. 어느 쪽이든 빈칸은 빈칸으로 남겨 두는 게 맞다.
| 처리 방식 | 데이터 상태 | 재무 해석 가능 여부 |
|---|---|---|
| 실제 응답을 그대로 기록 | 인증키 누락, 재무 값 미확보 | 영업현금흐름 금액 판단 불가 |
| 공시 원본으로 별도 확인 | 72,982,621백만원 확보 | 해당 원본 범위에서 해석 가능 |
| 미확보를 0원으로 대입하는 가정 | 원본 대비 -100% 오차 | 잘못된 입력에 따른 결과 |
단위 실수는 100배
숫자를 제대로 받았더라도 단위에서 한 번 더 틀릴 수 있다.
| 동일한 공시 금액의 단위 변환 | 직접 계산값 |
|---|---|
| 원본 표시, 백만원 | 72,982,621 |
| 원으로 환산 | 72,982,621,000,000 |
| 억원으로 환산 | 729,826.21 |
| 백만원 숫자를 그대로 억원이라 쓰는 잘못된 표시 | 72,982,621억원 |
| 잘못된 표시/정확한 억원 금액 | 100배 |
백만원 표시 숫자를 억원으로 바꾸려면 100으로 나눠야 한다. 숫자는 그대로 두고 단위 이름만 '억원'으로 바꾸면 금액이 100배로 부풀려진다. 실제 API가 이렇게 틀린 값을 준 건 아니고, 옮겨 적다가 생길 수 있는 실수를 계산해 본 것이다.
수집 코드에 넣어 둘 것
- HTTP 상태와 별개로 본문 status가 000인지 확인한다.
- 값이 없으면 0이 아니라 결측으로 남긴다.
- 원본의 표시 단위를 숫자와 함께 저장한다.
- 정상 응답을 받았더라도 회사, 기간, 연결 여부를 원문과 한 번은 맞춰 본다.
이번 조회는 인증키 없이 보낸 요청이라 정상 응답의 숫자가 원문과 일치하는지까지는 확인하지 못했다. 그건 키를 넣고 다시 볼 일이다.
자주 만나는 응답들
OpenDART를 쓰다 보면 status 000 말고도 여러 코드를 만난다. 이번에 본 100은 인증키 문제다. 그 밖에 조회된 데이터가 없다는 응답, 요청 한도를 넘었다는 응답, 잘못된 인자를 넣었다는 응답이 개발가이드에 정리돼 있다. 의미가 다르니 처리 방법도 달라야 한다.
특히 '조회된 데이터 없음' 응답은 0과 헷갈리기 쉽다. 회사가 그 기간에 해당 보고서를 내지 않았거나 요청한 재무제표 구분이 없다는 뜻이다. 예를 들어 종속기업이 없는 회사에 연결 재무제표를 요청하면 데이터가 없다는 응답이 올 수 있다. 이때도 금액을 0으로 채우면 안 되고, 별도 재무제표로 다시 요청해야 한다.
요청 한도도 조심해야 한다. 여러 회사를 반복해서 조회하다 하루 한도를 넘기면 그 뒤 응답은 전부 실패로 돌아온다. 그걸 그대로 저장하면 어느 시점 이후 회사들의 숫자가 몽땅 비어 버린다. 수집이 끝난 뒤 status가 000이 아닌 건이 몇 개인지 세어 보는 것만으로도 이런 문제를 금방 찾을 수 있다.
수집 코드에서 가장 중요한 건 실패를 실패로 남기는 것이다. 빈칸을 0으로 바꾸는 순간 실패의 흔적이 사라지고, 나중에 분석 결과가 이상해도 원인을 찾기 어려워진다.
공식 API만 쓰더라도 결과를 한 번은 원문과 대조해 보는 편이 낫다. 이 글처럼 대표 회사 한두 곳의 숫자를 사업보고서 원문과 맞춰 보면 단위, 부호, 연결 여부 같은 실수를 미리 잡을 수 있다. 수집한 데이터를 전부 확인할 수는 없지만 몇 건만 맞춰 봐도 시스템 전체의 오류는 대부분 드러난다. 수집 코드가 잘 돌아간다는 것과 그 결과가 맞다는 것은 다른 이야기다. 검증은 그 둘 사이를 잇는 작업이다.
출처
- OpenDART 공식 개발가이드
- DART 원문 · DART 접수번호 20250311001085
- 공식 2024 연결 감사보고서