Victor

[연재] 지분·지배구조 (1) DART에서 데이터 캐오기 — 공시 세 개를 붙여야 그림이 된다

연재 · 2026-08-02

삼성물산 주주 명단에, 4조 원어치 주주가 없었습니다

 

지분 구조를 보여주는 도구를 만들다가 있었던 일입니다.

 

삼성물산 화면을 띄웠어요. 주주 명단이 순서대로 쭉 나옵니다. 1대 이재용 19.76%, 2대 국민연금공단 8.19%, 3대 이서현 6.80%, 4대 이부진 6.10%. 여기까지는 아는 이름들이라 별생각 없이 넘어갔습니다.

 

그런데 뭔가 허전했어요. KCC가 없었습니다.

 

 

KCC는 삼성물산 지분을 10% 넘게 들고 있습니다. 장부가로 4조 원이 넘어요. 뉴스에서도 여러 번 다뤄진, 삼성 지배구조 이야기가 나올 때마다 따라 나오는 지분입니다. 그런데 제 화면의 주주 명단에는 그 이름이 아예 없었어요. 1대부터 10대까지 훑어도 없고, 그 아래 '기타(소액주주·기관 등) 55.80%' 덩어리에 뭉뚱그려 들어가 있었습니다.

 

데이터가 틀린 게 아니었습니다. 제가 공시를 하나만 보고 있었던 것이 문제였어요.

 

오늘부터 네 편에 걸쳐 지분·지배구조 도구 이야기를 합니다. 오늘은 첫 편, 데이터를 어디서 어떻게 캐왔나입니다. 결론부터 말하면 이렇습니다. 회사 하나의 주인이 누구인지를 알려면, 성격이 다른 공시를 최소 세 개는 붙여야 합니다.

 

만들려던 것

 

먼저 뭘 만들고 싶었는지부터요.

 

재벌 지배구조 기사를 보면 늘 이런 문장이 나옵니다. "총수 일가는 지주회사를 통해 그룹 전체를 지배하고 있다." 저는 이 문장이 늘 답답했어요. 통해가 정확히 뭘 통하는 건지, 몇 퍼센트가 몇 단계를 거쳐 내려가는 건지가 안 나오니까요.

 

그래서 그림으로 보고 싶었습니다. 회사가 상자로 놓이고, 지분이 화살표로 이어지고, 화살표에 몇 퍼센트인지가 적혀 있는 그림이요.

 

 

지금은 이렇게 나옵니다. 삼성 66개사(상장 18개), 총수 일가 5명, 순환출자 고리 1개. 오른쪽 표에서 핵심 계열사인 삼성에피스홀딩스를 보시면, 이재용 회장의 경제적 소유지분은 17.31%인데 의결권 기준 지배력은 74.3%로 잡힙니다. 이 두 숫자의 차이가 흔히 말하는 '적은 지분으로 그룹 전체를 지배한다'의 정체입니다.

 

전체로는 112개 그룹, 1,879개 회사, 지분 관계 2,697건을 담고 있습니다. 다만 오늘 이야기는 이 그림이 아니라, 이 그림의 재료를 어디서 어떻게 퍼왔는가입니다.

 

DART는 공짜인데, 회사 이름으로는 못 부릅니다

 

재료는 처음부터 정해져 있었어요. 금융감독원 전자공시시스템, DART입니다. 상장사가 법으로 내야 하는 서류가 모이는 곳이고, 개발자용 창구(OpenDART)가 무료로 열려 있습니다. 가입하면 인증키를 하나 주는데, 그걸 들고 요청하면 공시 내용을 정리된 데이터로 받을 수 있어요.

 

여기서 첫 번째 벽을 만났습니다. DART는 "삼성전자"라는 이름을 못 알아듣습니다.

 

회사마다 여덟 자리 고유번호가 따로 있어요. 삼성전자는 00126380입니다. 주식 종목코드(005930)와도 다른 번호예요. 그러니까 "삼성전자 주주 알려줘"가 아니라 "00126380의 최대주주현황 알려줘"라고 물어야 합니다.

 

그래서 그룹마다 계열사 목록을 먼저 만들었습니다. 이걸 씨앗 파일이라고 부르기로 했어요. 회사 하나가 이렇게 생겼습니다.

 

 

이름, 고유번호, 종목코드, 상장 여부, 업종. 업종은 나중에 그림에서 색으로 쓸 거라 미리 넣어뒀습니다.

 

이 씨앗 파일을 112개 그룹 몫으로 만드는 게 초반 일의 절반이었어요. DART가 전체 회사의 고유번호 목록을 파일로 내려주긴 하는데, 거기 적힌 이름과 우리가 아는 이름이 자주 다릅니다. 삼성생명은 법정 이름이 '삼성생명보험'이고, 어떤 회사는 앞에 (주)가 붙었다 말았다 해요. 이름을 맞춰 번호를 찾아주는 작업은 AI가 잘하는 종류의 일이었고, 실제로 여기서 시간을 크게 벌었습니다.

 

최신 보고서가 어디 있는지는 회사마다 다릅니다

 

두 번째 벽은 좀 더 성가셨어요.

 

"2025년 사업보고서에서 주주 명단을 가져와라"라고 하면 될 것 같잖아요. 안 됩니다. 회사마다 결산 시기가 다르고, 사업보고서를 아직 안 낸 곳도 있고, 반기보고서까지만 있는 곳도 있어요. 어떤 곳은 그냥 없습니다. 하나로 통일된 답이 없습니다.

 

그래서 두드려보고 있는 걸 집는 방식으로 갔습니다.

 

 

2025년 사업보고서 → 없으면 2025년 반기보고서 → 없으면 2024년 사업보고서 → 그것도 없으면 포기. 이 순서로 최대 네 번 두드려보고, 데이터가 들어 있는 첫 번째 걸 씁니다.

 

주석에 적어둔 020이 하루치 호출 한도 초과예요. DART는 무료인 대신 하루에 부를 수 있는 횟수가 정해져 있습니다. 회사 하나에 최대 네 번씩, 회사가 1,879개면 금방 한도에 닿습니다. 그래서 연도는 두 개(2025, 2024), 보고서 종류도 두 개(사업·반기)로 잘라뒀어요. 욕심내서 5년치를 다 훑게 했다면 첫날에 막혔을 겁니다.

 

한도 초과가 나면 1초 쉬었다가 다음으로 넘어갑니다. 우아한 처리는 아니에요. 그런데 실패한 회사는 그냥 비워두고 넘어가는 편이, 중간에 멈춰서 앞의 것까지 날리는 것보다 낫다고 봤습니다.

 

같은 회사를 부르는 이름이 서너 개

 

세 번째 벽이 제일 지저분했습니다. 이름 표기요.

 

주주 명단에 적힌 이름은 사람이 손으로 쓴 것에 가깝습니다. 같은 회사가 'SK', '에스케이', 'SK주식회사', '(주)에스케이'로 나와요. 앞뒤에 줄바꿈이나 공백이 붙어 있기도 하고요. 이걸 우리 씨앗 파일의 회사와 이어붙이지 못하면, 지분 화살표가 통째로 사라집니다. 화면에는 아무 표시도 안 남아요. 그냥 조용히 없어집니다.

 

그래서 이름 하나를 여러 표기형으로 펼쳐놓고 비교하게 했습니다.

 

 

영문 약칭을 한글 음차로 바꾸고(SK↔에스케이, DL↔디엘), 괄호와 '주식회사'와 공백과 가운뎃점을 다 걷어낸 다음에 맞춰봅니다.

 

아래 주석이 제가 직접 붙잡은 자리예요. 처음에는 "앞부분이 같으면 같은 회사로 치자"는 느슨한 규칙이 들어 있었습니다. 그럴듯하죠. 그런데 그렇게 하면 'SK'로 시작하는 수백 개 자회사가 전부 지주회사 SK 하나로 빨려 들어갑니다. SK이노베이션도 SK, SK텔레콤도 SK가 되는 거예요. 그룹 관계도가 통째로 무너집니다.

 

화면에서 SK 그룹이 이상하게 단순하게 나오길래 데이터를 뒤져보다 알았습니다. 그래서 규칙을 조였어요. 앞부분 매칭은 다섯 글자 이상일 때만, 뒤에 붙는 꼬리는 세 글자 이내일 때만 인정합니다. AI가 짜준 코드가 틀렸다기보다는, 그럴듯해서 그냥 넘어가기 딱 좋은 코드였습니다. 이런 건 화면을 봐야 잡힙니다.

 

공시 하나로는 절반만 보입니다

 

이제 본론이에요. 왜 공시를 세 개나 붙여야 했는가.

 

첫 번째, 최대주주현황. 회사의 최대주주와 그 특수관계인 명단입니다. 총수 개인이 몇 퍼센트, 배우자가 몇 퍼센트, 계열사가 몇 퍼센트. 지배구조의 뼈대가 여기 다 들어 있어요. 저도 처음엔 이거면 끝이라고 생각했습니다.

 

문제는 이름 그대로 최대주주와 특수관계인만 나온다는 겁니다. 최대주주 편이 아닌 대형 주주는 안 나와요. 국민연금이 안 나오고, 외국계 펀드가 안 나오고, 다른 그룹이 사둔 지분이 안 나옵니다. 앞에서 KCC가 없었던 이유가 이것이었어요.

 

두 번째, 타법인출자현황. 이 회사가 다른 법인에 얼마를 출자했는지입니다. 방향이 반대예요. 최대주주현황이 "누가 나를 갖고 있나"라면, 이건 "내가 누구를 갖고 있나"입니다.

 

왜 필요했냐면, 지분 100%짜리 완전자회사는 최대주주현황을 아예 안 내는 경우가 많거든요. 비상장이고 주인이 하나면 굳이 낼 이유가 없으니까요. 그러면 그림에서 계열사가 통째로 빠집니다. 그런데 모회사 쪽 출자 명세에는 그 회사가 적혀 있어요. 위에서 안 보이는 걸 아래에서 주워 오는 셈입니다.

 

세 번째, 대량보유상황보고. 흔히 5%룰이라고 부르는 그거예요. 상장사 지분을 5% 넘게 가지면 신고해야 하는 제도입니다. 국민연금이 여기서 잡힙니다.

 

 

여기에 잔손질이 좀 필요했습니다. 5%룰은 정기 보고가 아니라 사건이 생길 때마다 내는 신고예요. 그래서 같은 기관의 신고가 몇 건씩 쌓여 있습니다. 접수번호가 가장 큰(=가장 최근) 것만 남기게 했어요.

 

그리고 최대주주현황에 이미 잡힌 주주는 빼야 합니다. 안 그러면 총수 지분이 두 번 더해져서 100%를 넘어버려요. 실제로 초반에 지분 합계가 100%를 넘는 회사가 여럿 나왔고, 그게 이 중복 때문이었습니다.

 

이 세 번째 공시를 붙이고 나서야 삼성물산 명단에 국민연금 8.19%가 들어왔습니다.

 

그래도 KCC는 안 나왔습니다

 

그런데도 KCC는 여전히 없었어요.

 

이유가 좀 허탈합니다. 우리 수집기는 그룹 씨앗 파일 안에 있는 회사끼리만 짝을 지어줬거든요. 삼성 그룹 파일을 처리할 때 KCC라는 이름이 나오면, 삼성 목록에 없는 이름이니까 그냥 버렸습니다. 각 그룹을 따로따로 훑는 구조라서, 그룹의 경계를 넘는 지분은 설계상 처음부터 들어올 자리가 없었어요.

 

그래서 수집기를 하나 더 만들었습니다. 이번엔 그룹별로 보지 않고, 1,879개 회사 전부를 한 통에 넣고 전역으로 이름을 맞춥니다. 홀더의 그룹과 대상의 그룹이 다르면 '그룹을 넘는 지분'으로 따로 기록해요. 이렇게 찾은 게 169건입니다.

 

 

지금은 회사 상세 아래에 이렇게 붙습니다. KCC 10.01%, 장부가 4.07조. 제목도 "최대주주 공시엔 없는 우호·전략 지분"이라고 달아뒀어요. 왜 이게 위쪽 표와 따로 노는지를 보는 사람도 알아야 하니까요.

 

여기서 새 문제가 하나 생겼습니다. 타법인출자현황은 상대 회사의 고유번호를 안 줍니다. 이름만 줘요. 그러니 이름이 같은 다른 회사와 헷갈릴 수 있습니다. 실제로 'HMM'처럼 여러 곳에서 같은 이름이 잡히는 경우가 나왔어요.

 

 

두 가지로 막았습니다. 하나, 전역에서 딱 하나로만 매칭되는 이름만 채택하고 애매하면 버립니다. 둘, 지분율이 90%를 넘으면 버립니다. 다른 그룹 회사를 90% 넘게 갖고 있다는 건 사실상 자기 자회사라는 뜻이고, 그러면 애초에 '다른 그룹'이 아니거든요. 그런 건 십중팔구 동명이인입니다.

 

버리는 쪽을 택한 게 핵심이에요. 애매한 걸 넣어서 화면에 '삼성이 저 회사를 갖고 있다'는 없는 관계를 그리는 것보다, 빠뜨리는 쪽이 낫다고 봤습니다. 지분 관계도에서 없는 화살표 하나는 그냥 오류가 아니라 거짓말이 되니까요.

 

 

두 그룹을 겹쳐 보면 이렇게 나옵니다. 왼쪽이 삼성, 오른쪽이 KCC고, 가운데 분홍 점선이 그룹을 넘는 지분이에요. 같은 그룹 안의 지분(회색 실선)과 색을 다르게 한 건, 이 둘이 성격이 완전히 다른 관계라서입니다.

 

사람이 붙잡아야 했던 자리들

 

수집 코드를 쓰는 동안 AI는 빨랐습니다. 공시 창구를 부르고, 응답을 정리하고, 실패하면 넘어가는 부분은 거의 손댈 게 없었어요. 제가 붙잡아야 했던 건 늘 판단이 들어가는 자리였습니다.

 

개인을 어디까지 그릴 것인가. 주주 명단에는 총수 일가만 있는 게 아니라 지분 0.001%짜리 임원도 잔뜩 들어 있습니다. 이걸 다 그리면 그림이 사람 이름으로 뒤덮여요. 그래서 총수 일가는 이름을 직접 적어 넣고, 나머지 개인은 1% 넘을 때만 그리게 했습니다.

 

이걸 왜 이름으로 박아뒀냐면, 관계 항목을 믿을 수 없었기 때문이에요. 예를 들어 이부진 사장은 삼성전자 공시에서 관계가 '계열회사 임원'으로 적혀 있습니다. 가족인지 임원인지를 그 값만 보고는 못 가릅니다. 규칙으로 우아하게 풀려다 몇 번 실패하고, 명단을 적는 쪽으로 돌아섰어요.

 

재단은 개인도 회사도 아닙니다. 삼성생명공익재단, 삼성문화재단 같은 곳이 지분을 갖고 있는데, 이걸 계열사로 치면 소유 사슬 계산이 이상해집니다. 따로 '외부' 종류로 뒀어요.

 

그리고 남아 있는 흠. 삼성FN리츠라는 회사는 지분 합계가 100%를 훌쩍 넘게 나옵니다. 리츠 공시의 특성 때문인데, 아직 못 고쳤어요. DART에 공시가 없는 완전자회사 열두 개는 지금도 선이 하나도 안 붙은 외톨이 상자로 떠 있습니다. 고칠 수 있는데 안 한 게 아니라, 원자료에 없어서 못 하는 것들입니다. 화면 아래 '출처: DART' 문구를 굳이 달아둔 이유도 여기 있어요. 이 그림의 한계는 곧 공시의 한계입니다.

 

키를 명령줄에 쓰지 않은 이유, 그리고 수집과 빌드를 가른 이유

 

두 가지 결정이 나중에 두고두고 편했습니다.

 

하나는 인증키를 명령어에 직접 쓰지 않은 것입니다. 키는 파일이나 환경변수에서만 읽게 했어요. 명령어에 키를 적으면 터미널 기록에 그대로 남고, 화면을 캡처하다 같이 찍히기도 합니다. 지금 이 글에 코드 사진을 열 장 넣으면서도 마음이 편한 이유가 이거예요. 사진 어디에도 키가 없습니다.

 

다른 하나는 수집과 빌드를 완전히 갈라놓은 것입니다. 캐오는 단계만 키가 필요하고, 화면을 만드는 단계는 키가 없어도 돕니다.

 

 

수집이 끝나면 그룹마다 이런 파일 하나가 남아요. 회사 목록과 지분 관계 목록, 그리고 기준 시점. 화면을 만드는 쪽은 이 파일만 봅니다.

 

덕분에 화면을 백 번 고쳐도 DART를 다시 부를 일이 없습니다. 색을 바꾸고, 배치를 바꾸고, 표를 다시 짜는 동안 호출 한도를 한 번도 안 건드렸어요. 그리고 같은 파일로 다시 만들면 언제나 같은 결과가 나옵니다. 어제 잘 되던 게 오늘 안 되는 일이 없다는 뜻이에요.

 

 

그룹을 늘리는 것도 이 구조 덕분에 쉬웠습니다. 씨앗 파일 하나 더 만들고, 그 그룹만 수집하고, 다시 만들면 목록에 새 이름이 생겨요. 삼성 하나로 시작한 게 55개가 되고, 지금은 112개입니다.

 

다음 편

 

오늘은 재료를 캐오는 이야기였습니다. 세 개의 공시를 붙이고, 그룹의 경계를 넘는 지분을 하나 더 붙이고, 이름 표기와 동명이인을 걸러내는 것까지요.

 

그런데 재료가 모였다고 그림이 나오는 건 아닙니다. 다음 편은 계산 이야기예요. A가 B의 30%를 갖고 B가 C의 40%를 가지면, A는 C를 몇 퍼센트 갖고 있는 걸까요? 곱하면 12%입니다. 그런데 A와 B가 서로를 갖고 있으면 어떻게 될까요. 계산이 영원히 안 끝납니다. 순환출자를 코드로 다루는 이야기를 하겠습니다.

 

이 도구는 victor-house.com/equity에서 직접 보실 수 있습니다. 지분구조를 보는 학습·참고용이고, 투자 판단의 근거로 쓰라고 만든 것은 아닙니다.

 

#지분구조 #지배구조 #재벌 #대기업집단 #DART #전자공시 #오픈API #최대주주현황 #타법인출자 #대량보유 #5퍼센트룰 #국민연금 #KCC #삼성물산 #삼성그룹 #크로스그룹지분 #데이터수집 #데이터정제 #파이썬 #공공데이터 #AI활용 #AI자동화 #클로드 #바이브코딩 #비개발자개발 #개인프로젝트 #사이드프로젝트 #도구만들기 #휴먼인더루프 #빅터하우스

댓글

    로그인 없이 쓰는 대신, 등록한 댓글은 직접 지울 수 없습니다. 지워야 할 댓글은 옆의 신고를 눌러주세요.
    네이버 블로그글 원문 보러가기 →유튜브 쇼츠만드는 장면 20초로 보기 →
    관리자 Victor · 문의는 우상단 신고·제안으로 남겨주세요.
    글과 화면은 정적 파일로 만듭니다. 댓글과 조회수만 외부 데이터베이스에 저장합니다 — 개인정보처리방침

    오류 신고 · 제안

    관리자 Victor에게 전달됩니다