백 페이지 사업보고서가 네 칸짜리 지도가 된다
삼성전자 사업보고서는 백 페이지가 넘는다. 첫 줄부터 문장으로 읽어 내려가면 절반쯤에서 길을 잃는다. 그런데 c.panel() 한 줄로 열면 그 백 페이지가 네 칸짜리 위치 지도로 접힌다. 큰 목차(chapter), 작은 절(sectionLeaf), 세부 블록(blockLeaf), 글과 표 종류(leafType). 이 네 칸이 문서의 어느 지점에 무엇이 놓였는지 먼저 알려 준다.
그래서 이번 편의 첫 동작은 해석이 아니라 위치 찾기다. II. 사업의 내용이 어디 있는지, 주석이 어느 장에 붙는지, 임원 현황이 몇 번째 큰 장인지부터 짚는다. 좋은 독자는 문장부터 읽지 않는다. 지도를 먼저 펴고 필요한 구역으로 걸어 들어간다.
EDGAR 재무제표, 코드 실행에서는 미국 재무제표 세 장을 panel로 열었다. 이번 편은 다시 DART로 돌아와, 재무제표 숫자만이 아니라 사업보고서 본문 전체가 panel() 안에서 어떻게 놓이는지 본다. 아직 회사 여는 코드가 낯설면 DART 종목코드, 회사 열기를 먼저 보면 되고, 큰 그림은 DART 공시분석, 설치 없이에서 본 panel 개념과 이어진다.
import dartlab
c = dartlab.Company("005930")
c.market 결과가 KR이면 삼성전자가 DART 쪽 회사로 열렸다는 뜻이다. 이제 재무제표가 아니라 사업보고서 전체 표면을 연다.
report = c.panel()
report.head(5) 앞줄에는 큰 목차 칸, 작은 절 칸, 세부 블록 칸, 글과 표 종류 칸이 먼저 보인다. 실제 컬럼 이름으로는 chapter, sectionLeaf, blockLeaf, leafType이다. 그 오른쪽으로 2026Q1, 2025Q4, 2025Q3 같은 기간 열이 이어진다. 이 표는 재무제표처럼 숫자만 깔끔하게 놓인 표가 아니다. 사업보고서의 제목, 표, 문단 조각이 기간별로 놓이는 지도에 가깝다.

첫 번째 목표는 해석이 아니다. 어디에 있는지 찾는 것이다. 큰 목차 칸은 문서의 큰 장을 알려 준다. 작은 절 칸은 그 장 안의 더 작은 위치다. 세부 블록 칸은 더 안쪽 이름이고, 글과 표 종류 칸은 그 조각이 문단인지 표인지 알려 준다.
큰 목차 칸부터 본다
큰 목차 칸은 사업보고서의 큰 장이다. 실제 컬럼 이름은 chapter다. I. 회사의 개요, II. 사업의 내용, III. 재무에 관한 사항, VIII. 임원 및 직원 등에 관한 사항 같은 큰 덩어리가 여기에 잡힌다.
초보자는 panel() 결과를 보고 오른쪽 기간 열부터 보려고 한다. 하지만 사업보고서 panel에서는 왼쪽 위치 열이 먼저다. 왼쪽을 보지 않으면 그 값이 회사 개요인지, 사업 설명인지, 주석인지, 임원 현황인지 알 수 없다.
좋은 읽는 순서는 이렇다.
- 큰 목차 칸(
chapter)으로 큰 장을 본다. - 작은 절 칸(
sectionLeaf)으로 그 장 안의 작은 절을 본다. - 세부 블록 칸(
blockLeaf)이 비어 있는지, 어떤 세부 블록명이 있는지 본다. - 글과 표 종류 칸(
leafType)이text인지table인지 본다. - 그다음 기간 열을 본다.
이 순서는 재무제표 기간, Y와 Q 조회에서 배운 기간 감각과 다르다. 재무제표는 계정과 기간이 먼저 보인다. 사업보고서는 위치와 종류가 먼저다. 같은 panel이지만 읽는 순서가 조금 다르다.
사업 구역은 따로 좁힌다
전체 panel()에서 모든 줄을 다 읽을 필요는 없다. 사업의 내용만 보고 싶으면 panel("사업")으로 좁힌다.
business = c.panel("사업")
business.head(5) 이 결과의 큰 목차 칸(chapter)에는 II. 사업의 내용이 보인다. 작은 절 칸(sectionLeaf)에는 1. 사업의 개요나 II. 사업의 내용처럼 사업 구역의 절 이름이 보인다. 오른쪽 기간 열에는 해당 기간의 원문 조각이 들어 있다.
여기서 중요한 오해가 있다. panel("사업")은 사업을 요약해 주는 함수가 아니다. 사업보고서 안에서 “사업”과 관련된 줄을 좁혀 주는 함수다. 결과에 <TITLE, <TABLE, <P 같은 원문 표시가 보일 수 있다. 이것은 깨진 결과가 아니라 공시 원문을 표면 위에 얹은 흔적이다.
그래서 이 편에서는 바로 “삼성전자의 사업은 이런 구조다”라고 쓰지 않는다. 먼저 사업 설명이 어느 장과 절에 있는지 찾는다. 사업의 내용 자체를 자세히 읽는 것은 다음 편에서 한다.
세부 블록과 글의 종류를 같이 본다
세부 블록 칸은 더 작은 위치 이름이다. 실제 컬럼 이름은 blockLeaf다. 항상 채워져 있지는 않다. 어떤 줄은 큰 장과 작은 절만으로 충분하고, 어떤 줄은 표 안의 세부 블록 이름까지 들어온다.
글과 표 종류 칸은 그 줄의 성격이다. 실제 컬럼 이름은 leafType이다. text면 문단 조각에 가깝고, table이면 표 조각에 가깝다. 사업보고서 본문에서 이 차이는 중요하다. 문장으로 설명한 부분과 숫자 표로 제시한 부분을 같은 방식으로 읽으면 안 된다.
예를 들어 사업의 내용 안에는 제품 설명, 사업부 설명, 원재료, 생산설비, 위험관리 같은 서로 다른 조각이 들어갈 수 있다. 어떤 조각은 문단이고, 어떤 조각은 표다. 글과 표 종류 칸을 보지 않으면 원문에서 무엇을 보고 있는지 흐려진다.
이것이 8편의 핵심이다. 사업보고서 panel은 예쁘게 다듬은 글이 아니다. 위치를 잃지 않게 해 주는 지도다. 좋은 독자는 지도를 먼저 보고, 그다음 필요한 구역으로 들어간다.

주석은 재무제표 옆 설명이다
재무제표 숫자만 보면 이유가 부족하다. 재고, 차입, 유형자산, 매출채권 같은 항목은 주석에서 더 자세히 설명된다. 사업보고서 panel에서는 주석도 같은 방식으로 연다.
notes = c.panel("주석")
notes.head(5) 큰 목차 칸에는 III. 재무에 관한 사항이 보이고, 작은 절 칸에는 3. 연결재무제표 주석 같은 절 이름이 보인다. 이 결과를 보면 주석이 재무제표 숫자 옆에 붙은 설명이라는 감각이 생긴다.
재무제표, 파이썬 한 줄에서 panel("BS")와 panel("CF")를 열었다. 그때 자산, 현금, 현금흐름 같은 숫자를 봤다. 이제는 그 숫자의 배경을 찾는 길이 생긴다. 다만 이 편에서는 아직 특정 주석을 깊게 읽지 않는다. 먼저 주석 구역이 어디에 놓이는지만 본다.
주석 결과에도 원문 태그가 보일 수 있다. 이것을 보고 당황하지 않아도 된다. 브라우저 글에서 배우는 것은 “주석이 어느 위치에 있는가”다. 주석 문장을 사람이 읽기 좋은 형태로 정리하고, BS 숫자와 연결하는 일은 뒤 편에서 다룬다.
임원과 직원도 같은 표면이다
사업보고서는 숫자와 사업 설명만 담지 않는다. 임원, 직원, 보수, 주식 보유, 이사회 같은 지배구조 주변 정보도 들어간다. 먼저 임원 구역을 연다.
executives = c.panel("임원")
executives.head(5) 앞쪽 위치 열에는 VIII. 임원 및 직원 등에 관한 사항이 보인다. 작은 절 칸에는 1. 임원 및 직원 등의 현황 같은 절 이름이 보인다. 이 결과를 보면 임원 정보도 별도 API처럼 떨어져 있는 것이 아니라 사업보고서 안의 한 위치라는 감각이 생긴다.
직원 구역도 같은 방식으로 연다.
employees = c.panel("직원")
employees.head(5) 임원과 직원은 같은 큰 장 안에 있을 수 있다. 그래서 두 topic의 결과가 비슷한 위치를 가리킬 수 있다. 이것은 이상한 일이 아니다. 하나의 큰 장 안에서 서로 다른 질문으로 좁힌 것이다.
여기서도 결론을 서두르지 않는다. 직원 수가 늘었다, 임원 구성이 바뀌었다 같은 문장은 다음 단계다. 지금은 사업보고서에서 해당 구역을 찾는 연습이다.
DART 원천 페이지를 같이 둔다
코드가 표를 열어도 원천 감각은 놓치면 안 된다. DART 전자공시시스템은 국내 공시를 검색하고 열어 보는 공식 입구다. 회사별로 공시를 찾고 싶으면 회사별 검색을 쓴다.
API와 원천 파일 흐름이 궁금하면 OpenDART를 본다. OpenDART의 공시정보 개발가이드는 공시검색, 기업개황, 공시서류원본파일, 고유번호 같은 항목을 안내한다. 정기보고서의 의미와 제출기한은 DART의 보고서정보와 기업공시 길라잡이 정기보고서 안내에서 확인할 수 있다.
이 링크를 외우라는 뜻은 아니다. dartlab으로 panel()을 열 때도 원천은 DART라는 감각을 유지하라는 뜻이다. 코드가 빠르게 표를 만들어도, 그 표는 법정 공시 문서에서 온다. 표를 읽다가 이상하면 원천 검색 화면으로 돌아갈 수 있어야 한다.
브라우저에서 되는 것과 나중에 할 것
이번 편의 코드는 브라우저에서 그대로 실행되는 범위 안에 있다. dartlab.Company, market, panel, head만 쓴다. 내부 호출 이름은 본문 코드와 사용 예시로 노출하지 않는다. 독자가 따라 쳤을 때 같은 환경에서 돌아야 하기 때문이다.
또 하나 분명히 둔다. panel("사업"), panel("주석"), panel("임원"), panel("직원")은 해당 구역을 찾아 주는 길이다. 자동 요약이나 최종 해석이 아니다. 원문 조각이 길거나 XML처럼 보이면, 그것은 원문을 그대로 가까이 가져온 결과다.
재무제표 편에서는 원천 감각이 중요했지만, 이번 편의 첫 검산 도구는 위치 열이다. 사업보고서 본문 topic은 큰 목차, 작은 절, 세부 블록, 글과 표 종류를 먼저 보고 검산한다.
실시간 시세, 뉴스, 수급, 최신 공시 알림도 이 글에서 하지 않는다. 그것들은 로컬 확장 코스에서 다룰 데이터다. 브라우저 편은 공개 글 안에서 실행되는 사업보고서 panel 읽기에 집중한다.
자주 걸리는 함정 셋
panel()을 열었다고 사업보고서를 다 읽은 건 아니다. 전체 위치 지도를 폈을 뿐이고,panel("사업")도 요약이 아니라 사업 구역의 줄을 좁힌 것이다.- 글과 표 종류 칸(
leafType)을 안 보고 문장과 표를 같은 방식으로 인용하면 어긋난다.text와table은 다른 종류의 원문 조각이다. - 결과에 원문 태그가 보인다고 틀린 게 아니다. 이 편은 원문을 예쁜 글로 바꾸지 않고 조각이 어느 위치에 있는지만 찾는다. 7편에서 확인한 Apple 재무 panel과 8편의 DART 사업보고서 panel은 확인 범위가 서로 다르다는 점도 같이 기억해 둔다.
다음 편에서 할 것
이번 편은 사업보고서의 위치 지도를 폈다. 큰 목차, 작은 절, 세부 블록, 글과 표 종류를 먼저 보고 그다음 필요한 topic으로 좁혔다. 다음 편에서는 panel("사업") 안으로 더 들어가, 제품, 사업부, 원재료, 생산설비 같은 본문 조각을 재무 숫자가 아니라 공시 본문 근거로 읽고 문장으로 옮긴다. 오늘 기억할 한 줄은 이것이다. 사업보고서는 먼저 위치를 찾고, 그다음 문장을 읽는다.