Notion Integration 설정을 완벽하게 했는데도 계속 "Could not find database" 오류가 발생했던 원인과, Notion의 새로운 Data Sources 구조를 이해하고 해결한 과정을 기록합니다.
🚨 문제 상황
아이보스 칼럼 크롤링 + AI 요약까지는 완벽하게 작동했는데, Notion에 자동 업로드하는 마지막 단계에서 계속 막혔습니다.
에러 메시지
$ python test_connection.py
❌ 데이터베이스 접근 실패: Could not find database with ID: xxx
Make sure the relevant pages and databases are shared with your integration.
설정 체크리스트 (모두 완료했는데도 실패)
✅ Notion Integration 생성 완료
✅ API 토큰 발급 및
.env에 저장✅ 데이터베이스 생성
✅ Integration을 데이터베이스에 연결 (UI에서 확인됨)
✅ Database ID 정확히 복사
✅ Capability 설정 (Read, Insert, Update content)
분명 모든 게 맞는데 API 호출만 하면 실패했습니다. 😤
🔍 시도 1: API 토큰 재발급
"혹시 토큰이 잘못 복사되었나?"
시도한 것
Notion Integration에서 새 토큰 발급
.env파일 업데이트테스트 재실행
결과
❌ 데이터베이스 접근 실패: Could not find database with ID: xxx
여전히 실패. 토큰 문제는 아니었습니다.
🔍 시도 2: Database ID 재확인
"Database ID가 잘못되었나?"
발견한 문제
디버그 스크립트로 접근 가능한 리소스를 확인해보니:
전체 접근 가능한 리소스: 2개
- page: 2f01fe32-cc81-8065-b14a-xxxxxxx
- data_source: 2f01fe32-cc81-800d-aa33-xxxxxx
Database 타입이 아닌 Page 타입으로 인식되고 있었습니다!
원인 파악
Notion에는 여러 종류의 테이블이 있습니다:
✅ Full-page database - Notion API로 접근 가능
❌ Inline database - 페이지 안에 포함된 테이블 (API 제한적 접근)
❌ Simple table - 일반 테이블, 데이터베이스 아님
제가 만든 것은 Inline database였습니다!
🔍 시도 3: Full-page Database 생성
"이번엔 제대로 만들어보자!"
올바른 생성 방법
Notion 사이드바에서 "+ Add a page" 클릭 (페이지 내부가 아님!)
/table입력"Table - Full page" 선택 (⚠️ "Inline" 아님!)
Integration 연결
URL 복사
결과
❌ 데이터베이스 접근 실패: Could not find database with ID: xxx
여전히 실패! 😭
🔍 시도 4: 페이지 내부 구조 분석
"실제로 뭐가 만들어진 거지?"
페이지 블록 검사 스크립트
# inspect_page.py
blocks = client.blocks.children.list(block_id=page_id)
for block in blocks.get('results', []):
block_type = block.get('type')
if block_type == 'child_database':
print(f"Inline Database 발견!")
print(f"Database ID: {block.get('id')}")
결과
✅ Inline Database 발견!
Database ID: 2f01fe32-cc81-8048-9d95-xxxxxxxx
제목: 아이보스 칼럼 수집
속성 개수: 0개
문제 발견!
페이지 안에 Inline database가 있음(Claude code가 설정 가이드 준거였는데...)
속성이 0개 (UI에서는 보이는데 API에서는 안 보임)
🔍 시도 5: API로 속성 직접 추가
"API로 직접 속성을 추가하면 되지 않을까?"
속성 추가 스크립트
# add_properties.py
properties_to_add = {
"제목": {"title": {}},
"순위": {"number": {}},
"수집일": {"date": {}},
"출처": {"url": {}},
"Article ID": {"rich_text": {}},
"AI 모델": {"select": {"options": [...]}}
}
response = client.databases.update(
database_id=database_id,
properties=properties_to_add
)
결과
✅ 속성 추가 성공!
추가된 속성:
- 제목
- 순위
- 수집일
- 출처
- Article ID
- AI 모델
성공! 하지만...
$ python test_connection.py
속성 체크:
❌ 제목: 없음
❌ 순위: 없음
...
속성 체크는 여전히 실패. 뭔가 이상합니다.
🎯 핵심 발견: Notion의 새로운 Data Sources 구조
API 원시 응답 확인
db = client.databases.retrieve(database_id=database_id)
print(json.dumps(db, indent=2))
결과
{
"object": "database",
"id": "2f01fe32-cc81-8048-9d95-f30xxxxxxxx",
"title": [{"plain_text": "아이보스 칼럼 수집"}],
"is_inline": true,
"data_sources": [
{
"id": "2f01fe32-cc81-800d-aa33-000bxxxxx",
"name": "아이보스 칼럼 수집"
}
]
// ❌ "properties" 필드가 없음!
}
충격적인 발견:
properties필드가 아예 없음대신
data_sources필드가 있음is_inline: true- Inline database임을 확인
Notion의 새로운 구조
Notion이 최근 데이터베 이스 구조를 변경했습니다:
Inline database는
data_sources로 실제 데이터를 참조속성 정보가 별도 data source에 저장됨
기존
properties접근 방식이 작동하지 않음
✅ 최종 해결: 속성 체크 건너뛰고 직접 업로드
"속성 체크는 안 되지만, 실제 업로드는 될까?"
테스트
$ python notion_uploader.py
============================================================
📤 아이보스 칼럼 → Notion 업로더
============================================================
📤 1개 파일을 Notion에 업로드합니다...
📄 처리 중: 2026-01-20-무신사 올리브영은 알고-있다.md
✅ Notion 페이지 생성: 무신사, 올리브영은 알고 있다
URL: https://www.notion.so/2f01fe32cc8181938eaxxxxxxxxxx
============================================================
✅ 1개 페이지 생성 완료!
============================================================
🎉 드디어 성공!
📊 최종 Notion 페이지 확인
Notion 데이터베이스를 열어보니:
제목
순위
수집일
출처
Article ID
AI 모델
무신사, 올리브영은 알고 있다
1
2026-01-20
[링크]
5273
gemini-2.0-flash-exp
모든 속성이 정상적으로 입력되어 있었습니다!
🔑 해결의 핵심
문제 원인 정리
Inline Database vs Full-page Database
Notion API는 Full-page database를 권장
Inline database는
data_sources구조 사용properties필드가 일반적인 방식으로 접근 안 됨
속성 체크 로직의 한계
test_connection.py의 속성 체크는 실패하지만 실제 페이지 생성은 정상 작동
속성 정보는 다른 방식으로 관리됨
UI와 API의 괴리
Notion UI에서는 Integration이 연결된 것으로 보임
속성도 UI에서는 정상적으로 보임
하지만 API 응답 구조는 다름
최종 해결 방법
속성 체크를 건너뛰고 바로 업로드 시도
# notion_uploader.py는 정상 작동
# test_connection.py의 속성 체크는 실패해도 무시
💡 배운 점
1. Notion API의 복잡성
예상했던 것:
Integration 만들기
Database ID 복사하기
API로 페이지 생성하기
실제로 겪은 것:
Full-page vs Inline database 구분
Data Sources 구조 이해
속성 접근 방식의 변화
UI와 API 응답 구조의 불일치
2. 디버깅의 중요성
효과적이었던 디버그 도구:
# 1. 접근 가능한 리소스 확인
debug_access.py → Integration이 뭘 볼 수 있는지
# 2. 페이지 내부 구조 확인
inspect_page.py → Inline database 발견
# 3. 원시 API 응답 확인
debug_raw.py → properties 필드 부재 발견
# 4. 실제 업로드 테스트
notion_uploader.py → 속성 체크 실패해도 업로드는 됨
3. 문서의 한계
공식 문서에서 찾기 어려웠던 것:
Inline database의
data_sources구조속성 접근 방식의 변화
Full-page vs Inline의 명확한 구분
Claude Code가 도움된 이유:
단계별 디버그 스크립트 작성
API 응답 구조 분석
대안 접근 방식 시도
🎯 같은 문제를 겪는 분들께
증상
❌ Could not find database with ID: xxx
Make sure the relevant pages and databases are shared with your integration.
Integration 설정은 다 맞음
UI에서는 연결되어 보임
Database ID도 정확함
해결 체크리스트
데이터베이스 타입 확인
# debug_access.py로 확인 # "database" 타입인지, "page" 타입인지Full-page database로 재생성
사이드바에서 "Add a page"
/table→ "Table - Full page"(Inline이 아님!)
페이지 내부 구조 확인
# inspect_page.py로 확인 # child_database가 있는지원시 API 응답 확인
# debug_raw.py로 확인 # properties 필드가 있는지 # data_sources 필드가 있는지속성 체크 실패해도 업로드 시도
# notion_uploader.py 실행 # 실제로는 작동할 수 있음
📂 사용한 디버그 스크립트
debug_access.py
# Integration이 접근할 수 있는 모든 리소스 확인
results = client.search()
for r in results.get("results", []):
print(f"{r.get('object')}: {r.get('id')}")
inspect_page.py
# 페이지 내부 블록 확인
blocks = client.blocks.children.list(block_id=page_id)
for block in blocks.get('results', []):
if block.get('type') == 'child_database':
print(f"Database ID: {block.get('id')}")
debug_raw.py
# 원시 API 응답 확인
db = client.databases.retrieve(database_id=database_id)
print(json.dumps(db, indent=2, ensure_ascii=False))
add_properties.py
# API로 속성 직접 추가
properties = {
"제목": {"title": {}},
"순위": {"number": {}},
# ...
}
client.databases.update(database_id=db_id, properties=properties)
🎬 결론
가장 큰 배움
"문서만으로는 부족하다"
Notion API 공식 문서를 아무리 봐도 이 문제는 해결할 수 없었습니다. 실제 API 응답을 직접 확인하고, 구조를 이해하고, 시행착오를 거쳐야만 해결할 수 있었습니다.
Claude Code의 진가
디버그 스크립트를 빠르게 만들고, API 응답을 분석하고, 대안을 시도하는 과정을 Claude Code에게 엄청 푸시하며 시켰더니 결국엔 해결해 냅니다.
PKM보다 기술적인 부분에 어쩌다 보니 치우치게 되었는데, 좀 더 근본적인 기록과 회고, 수많은 정보와 지식/비즈니스 문서를 어떻게 효율적으로 나에게 맞게 sorting/tagging/linking하면 좋을지 스스로 연구/공부가 필요해 보입니다.