칼럼 수집 자동연결, Notion API 연동, 모든 설정이 맞는데 왜 안 될까? - 해결기

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 토큰 재발급

"혹시 토큰이 잘못 복사되었나?"

시도한 것

  1. Notion Integration에서 새 토큰 발급

  2. .env 파일 업데이트

  3. 테스트 재실행

결과

❌ 데이터베이스 접근 실패: 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에는 여러 종류의 테이블이 있습니다:

  1. Full-page database - Notion API로 접근 가능

  2. Inline database - 페이지 안에 포함된 테이블 (API 제한적 접근)

  3. Simple table - 일반 테이블, 데이터베이스 아님

제가 만든 것은 Inline database였습니다!


🔍 시도 3: Full-page Database 생성

"이번엔 제대로 만들어보자!"

올바른 생성 방법

  1. Notion 사이드바에서 "+ Add a page" 클릭 (페이지 내부가 아님!)

  2. /table 입력

  3. "Table - Full page" 선택 (⚠️ "Inline" 아님!)

  4. Integration 연결

  5. 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 databasedata_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

모든 속성이 정상적으로 입력되어 있었습니다!


🔑 해결의 핵심

문제 원인 정리

  1. Inline Database vs Full-page Database

    • Notion API는 Full-page database를 권장

    • Inline database는 data_sources 구조 사용

    • properties 필드가 일반적인 방식으로 접근 안 됨

  2. 속성 체크 로직의 한계

    • test_connection.py의 속성 체크는 실패

    • 하지만 실제 페이지 생성은 정상 작동

    • 속성 정보는 다른 방식으로 관리됨

  3. 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도 정확함

해결 체크리스트

  1. 데이터베이스 타입 확인

    # debug_access.py로 확인
    # "database" 타입인지, "page" 타입인지
    
  2. Full-page database로 재생성

    • 사이드바에서 "Add a page"

    • /table → "Table - Full page"

    • (Inline이 아님!)

  3. 페이지 내부 구조 확인

    # inspect_page.py로 확인
    # child_database가 있는지
    
  4. 원시 API 응답 확인

    # debug_raw.py로 확인
    # properties 필드가 있는지
    # data_sources 필드가 있는지
    
  5. 속성 체크 실패해도 업로드 시도

    # 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하면 좋을지 스스로 연구/공부가 필요해 보입니다.

4
2개의 답글

뉴스레터 무료 구독

👉 이 게시글도 읽어보세요