PPT 생성기 개발 로그 – 2025-11-16

1. credentials.json 오류 정리

  • /result/ 페이지(썸네일/다운로드 뷰)로 들어가자마자 아래 에러 발생

    FileNotFoundError: [Errno 2] No such file or directory: 'credentials.json'
    
  • 원인

    • prompt 뷰에서 슬라이드를 만들 때는 OAuth 인증(token.json) 을 쓰고 있었는데,
    • display_slides() / download_pptx() 쪽에서는 예전 코드 그대로 서비스 계정용 credentials.json 파일을 찾고 있었다.
  • 해결

    • 두 뷰가 같은 인증 방식을 쓰도록 정리해서, 더 이상 credentials.json 을 찾지 않도록 수정.
    • 결과적으로 /result/ 접근 시 FileNotFoundError 는 사라짐.

2. “내용이 템플릿 그대로” 문제 해결

  • 증상

    • GPT가 생성한 텍스트를 파일로 잘 만들어 두었는데,
    • 실제로 만들어진 PPT를 열어보면 템플릿에 있던 기본 문구가 그대로 남아 있음.
  • 조치

    • create_slides() 에서 템플릿 복사 → batchUpdate 요청까지 전체 흐름 점검.
    • 디버그 로그 추가

      • DEBUG: 56 texts, 0 boxes, 50 requests 처럼 텍스트 개수, 매핑된 박스 수, 요청 수를 출력해 확인.
    • 이후 수정으로 텍스트 교체 자체는 정상 동작하게 만들었고,

      • 템플릿 기본 문구 대신 GPT가 만든 내용이 들어가는 것까지 확인.

3. 텍스트가 “제목 박스에 세로로 쌓이는” 깨짐 현상 분석

  • 새로운 문제

    • 내용은 들어가는데, 어떤 슬라이드는 제목 박스 한 칸에 본문이 몽땅 들어가서 세로로 쭉 쌓이면서 레이아웃이 무너짐.
  • 원인 후보

    1. 코드가 슬라이드 구조를 모르고 단순히 elements[:2] 같은 방식으로 objectId 를 수집해서,

      • 제목 박스(TITLE), 본문 박스(SUBTITLE), 장식 도형을 구분하지 못함.
    2. 그 상태로 text_list 전체를 순서대로 매핑하면서

      • 어떤 슬라이드는 제목 박스에 본문까지 다 들어가 버림.
  • presentation_data.json 구조 분석

    • 실제 JSON을 열어보니 각 텍스트 박스에 이런 정보가 붙어 있음:

      "placeholder": {
        "type": "TITLE"  
      }
      
    • 예시 – 섹션 타이틀 슬라이드 (p1)

      • TITLE 박스: 2 한국의 역사적 사건과 인물 같은 큰 제목
      • SUBTITLE 박스: 한 줄짜리 요약 문장
    • 예시 – 내용 슬라이드 (p8)

      • TITLE: 근대화와 한국의 독립 운동 (소제목)
      • SUBTITLE: 불릿 포함 본문 전체 (여러 줄)
  • 오늘까지 얻은 결론

    • 텍스트를 넣을 때는 순서가 아니라 placeholder.type 기준으로 매핑해야 한다.

      • TITLE → 슬라이드 제목 1줄
      • SUBTITLE → 본문(혹은 요약) 전체
      • BODY (notes 등) → 발표자 노트, 보통 건드리지 않기
      • 그 외 텍스트 없는 도형들은 전부 장식이므로 건드리지 않기

4. 다음 할 일

  • create_slides() 안에서:

    1. presentation_data.json 을 돌면서 슬라이드별로

      • 제목 박스 objectId (TITLE)
      • 본문 박스 objectId (SUBTITLE/BODY) 를 딕셔너리로 수집하는 함수 만들기.
    2. GPT가 만든 내용도 “슬라이드별 제목 · 슬라이드별 본문” 두 덩어리로 나누기.
    3. batchUpdate 요청을

      • 제목 박스에는 제목만,
      • 본문 박스에는 본문 전체 가 들어가도록 분리해서 생성.
  • 이걸 적용하면,

    • 섹션 슬라이드는 깔끔한 제목 슬라이드로,
    • 내용 슬라이드는 제목 + 본문 구조로
    • 레이아웃이 깨지지 않게 정리될 예정.

5. 결론

웹에서 바로 보이던 오류는 사라졌고, credentials.json 문제도 해결되어 기본 흐름 자체는 다시 동작한다. 하지만 슬라이드별 텍스트를 “순서”로 꽂던 기존 방식이 깨지면서 결과물 레이아웃이 무너졌고, 결국 핵심 원인은 템플릿 구조를 코드가 이해하지 못한다는 점이었다. 다음 작업에서는 예전처럼 운 좋게 맞아떨어지는 매핑이 아니라, presentation_data.jsonplaceholder.type을 기준으로 안정적인 배치 로직을 만드는 쪽으로 가야 한다.