Skip to content

[Chore] PDF·DOCX 파싱 사후 리뷰 반영 - 검증 문서 보완, 빈 Page 회귀 테스트, Chunker 중복 순회 정리 - #115

Merged
Gimini-3 merged 4 commits into
developfrom
feature/110
Aug 6, 2026
Merged

[Chore] PDF·DOCX 파싱 사후 리뷰 반영 - 검증 문서 보완, 빈 Page 회귀 테스트, Chunker 중복 순회 정리#115
Gimini-3 merged 4 commits into
developfrom
feature/110

Conversation

@Gimini-3

@Gimini-3 Gimini-3 commented Aug 6, 2026

Copy link
Copy Markdown
Contributor

배경

PR #107(PDF·DOCX 문서 파싱)은 자동 리뷰가 끝나기 전에 머지됐고, 머지 직후 등록된 지적 3건을 #110으로 분리해 처리했습니다. 모두 동작 오류가 아닌 문서·테스트·성능 보완 사항입니다.

1. Page가 없는 PDF 회귀 테스트 추가

기존 테스트는 빈 Page만 있는 PDF의 DOCUMENT_OCR_REQUIRED만 검증했고, Page 자체가 0개인 PDF가 DOCUMENT_CONTENT_EMPTY로 분기한다는 사실은 테스트로 고정돼 있지 않았습니다. Page가 없으면 OCR로도 복구할 수 없어 스캔 PDF와 구분해야 하므로, 이 분기가 이후 리팩터링에서 합쳐지지 않도록 회귀 테스트를 추가했습니다.

2. FixedSizeChunker 중복 순회 제거

chunk(ParsedDocument)가 Segment 길이를 codePointCount(...)로 한 번 순회하고, appendSegmentChunks가 같은 Text를 codePoints().toArray()로 다시 순회하고 있었습니다. Segment가 많은 PDF·DOCX에서 문서 전체를 두 번 훑습니다.

appendSegmentChunks가 이미 만든 Code Point 배열의 길이를 반환하도록 바꿔 호출부가 그대로 사용하게 했습니다. Segment당 순회가 2회에서 1회로 줄고, Chunk 경계·전역 Offset·page_no·section_title 결과는 달라지지 않습니다. 청커 단위 10건과 Chunking 통합 5건으로 회귀 확인했습니다.

3. Swagger 수동 검증 결과 기록

검증 문서가 단위·통합 테스트 결과만 담고 있어, 실제로 애플리케이션을 기동해 검증하고 결과를 8절에 추가했습니다.

# Extension Content-Type 기대 실제
1 pdf application/pdf 201 허용 201, jobStatus = PENDING
2 docx ...wordprocessingml.document 201 허용 201, jobStatus = PENDING
3 pdf application/octet-stream 400 거부 400, DOCUMENT-FILE-004
4 docx application/pdf 400 거부 400, DOCUMENT-FILE-004
5 doc application/msword 400 거부 400, DOCUMENT-FILE-003

5개 조합 모두 기존 단위 테스트 결과와 일치했습니다. Swagger UI(/swagger-ui/index.html 200)와 /v3/api-docsPOST /api/documents 노출도 확인했고, Swagger UI가 노출하는 것과 동일한 Endpoint·Schema로 같은 multipart/form-data 요청을 보냈습니다. UI의 File Picker 조작만 자동화가 어려워 요청 전송에는 CLI를 사용했으며, 그 사실을 문서에 명시했습니다.

검증용 Schema, Bucket, 계정은 모두 일회용으로 만들고 검증 후 삭제했습니다. 기존 개발 Schema와 데이터는 변경하지 않았고, 테스트용 PDF·DOCX·DOC 파일은 저장소 밖 임시 경로에서 생성해 저장소에 추가하지 않았습니다.

4. 업로드 API의 낡은 지원 형식 설명 정정 (검증 중 발견)

Swagger를 확인하는 과정에서 업로드 API의 Operation description과 file 필드 Schema가 아직 "TXT 또는 Markdown"으로 남아 있는 것을 발견했습니다. PDF·DOCX 추가 이후의 실제 동작과 프론트가 보는 계약이 어긋나 함께 고쳤습니다. 지원 형식을 실제와 맞추고, 확장자와 Content-Type이 함께 맞아야 한다는 점과 구형 DOC 형식은 지원하지 않는다는 점을 명시했습니다.

테스트

./gradlew test  ->  tests=662 failures=0 errors=0 skipped=0

Closes #110

Summary by CodeRabbit

  • 새로운 기능

    • PDF 및 DOCX 원본 파일 업로드를 지원합니다.
    • 파일 확장자와 Content-Type이 일치해야 하며, 구형 DOC 형식은 지원하지 않습니다.
    • Swagger에서 정상 및 잘못된 파일 업로드 검증 결과를 확인할 수 있습니다.
  • 버그 수정

    • 문서 분할 처리 시 위치 계산을 개선했습니다.
    • 내용이 없는 PDF 업로드 시 명확한 오류가 표시됩니다.
  • 문서

    • 업로드 검증 조건과 PDF·DOCX 지원 기준을 보강했습니다.

기존 테스트는 빈 Page만 있는 PDF의 OCR 필요 오류만 검증해, Page 자체가
0개인 PDF가 다른 오류로 분기한다는 사실이 테스트로 고정돼 있지 않았다.

Page가 없으면 OCR로도 복구할 수 없으므로 스캔 PDF와 구분해
DOCUMENT_CONTENT_EMPTY를 반환해야 한다. 이 분기가 이후 리팩터링에서
OCR 필요 오류로 합쳐지지 않도록 회귀 테스트를 추가한다.
chunk(ParsedDocument)는 Segment 길이를 codePointCount로 한 번 순회하고,
appendSegmentChunks가 같은 Text를 codePoints().toArray()로 다시 순회했다.
Segment 수가 많은 PDF와 DOCX에서 문서 전체를 두 번 훑는 비용이 생긴다.

appendSegmentChunks가 이미 만든 Code Point 배열의 길이를 반환하도록 바꿔
호출부가 그 값을 그대로 사용하게 한다. Chunk 경계, 전역 Offset,
page_no와 section_title 결과는 달라지지 않는다.
Swagger 수동 검증 중 발견했다. 업로드 API의 Operation description과 file
필드 Schema가 아직 "TXT 또는 Markdown"으로 남아 있어, PDF와 DOCX를 추가한
이후의 실제 동작과 프론트가 보는 계약이 어긋난다.

지원 형식을 실제와 맞추고, 확장자와 Content-Type이 함께 맞아야 한다는 점과
구형 DOC 형식은 지원하지 않는다는 점을 명시한다.
검증 문서가 단위·통합 테스트 결과만 담고 있어 Swagger로 노출되는 업로드
API의 수동 검증 결과가 빠져 있었다.

로컬에 애플리케이션을 기동하고 Swagger가 노출하는 것과 동일한 Endpoint와
Schema로 허용 2건과 거부 3건을 실제 호출해 요청, 기대 결과, 실제 응답을
기록한다. 5개 조합 모두 기존 단위 테스트 결과와 일치했다.

UI의 File Picker 조작만 자동화가 어려워 요청 전송에 CLI를 사용했다는 사실과
검증용 Schema, Bucket, 계정을 모두 일회용으로 만들고 삭제했다는 사실을
함께 남긴다. Page가 없는 PDF의 오류 코드도 회귀 테스트 추가에 맞춰 반영한다.
@Gimini-3
Gimini-3 requested a review from kangcheolung August 6, 2026 12:30
@coderabbitai

coderabbitai Bot commented Aug 6, 2026

Copy link
Copy Markdown

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro Plus

Run ID: a4c2855c-5bd4-4bf2-9fd6-08e15ee142dd

📥 Commits

Reviewing files that changed from the base of the PR and between 2aa0d59 and 8fafc2e.

📒 Files selected for processing (5)
  • docs/test-results/Gimini-3-#103-pdf-docx-document-parsing.md
  • src/main/java/com/opensource/docgrid/domain/document/controller/DocumentUploadController.java
  • src/main/java/com/opensource/docgrid/domain/document/dto/request/DocumentUploadRequest.java
  • src/main/java/com/opensource/docgrid/domain/document/service/FixedSizeChunker.java
  • src/test/java/com/opensource/docgrid/domain/document/service/PdfDocumentParserTest.java

📝 Walkthrough

Walkthrough

PDF·DOCX 업로드 검증 문서와 API 설명을 보완했습니다. 페이지가 없는 PDF의 회귀 테스트를 추가했습니다. FixedSizeChunker는 Segment 길이를 재사용해 중복 순회를 줄였습니다.

Changes

문서 업로드 계약 및 검증

Layer / File(s) Summary
업로드 계약 및 수동 검증
src/main/java/com/opensource/docgrid/domain/document/controller/DocumentUploadController.java, src/main/java/com/opensource/docgrid/domain/document/dto/request/DocumentUploadRequest.java, docs/test-results/...
PDF·DOCX 지원, 확장자와 Content-Type 일치 조건, 구형 DOC 미지원 조건을 API 설명에 반영했습니다. Swagger에서 정상 업로드와 오류 응답을 기록했습니다.
빈 PDF 회귀 검증
src/test/java/com/opensource/docgrid/domain/document/service/PdfDocumentParserTest.java, docs/test-results/...
페이지가 없는 PDF가 DOCUMENT_CONTENT_EMPTY를 반환하는 테스트와 검증 계약을 추가했습니다.
청킹 오프셋 재사용
src/main/java/com/opensource/docgrid/domain/document/service/FixedSizeChunker.java
appendSegmentChunks가 처리한 Segment의 Code Point 길이를 반환합니다. 문서 단위 Offset 계산은 이 반환값을 재사용합니다. 빈 Segment는 0을 반환합니다.

Estimated code review effort: 3 (Moderate) | ~20 minutes

Possibly related PRs

  • DocGrid/backend#107: 동일한 PDF·DOCX 업로드, 파싱 검증, FixedSizeChunker 변경의 후속 작업입니다.
  • DocGrid/backend#22: 동일한 업로드 컨트롤러와 요청 DTO의 지원 형식 설명과 연결됩니다.
  • DocGrid/backend#26: 업로드 메타데이터와 Content-Type 검증 경로가 연결됩니다.

Suggested labels: 📃 Docs

Suggested reviewers: kangcheolung

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Title check ✅ Passed 제목이 PDF·DOCX 검증 문서 보완, 빈 Page 회귀 테스트, Chunker 중복 순회 제거라는 주요 변경을 명확히 요약합니다.
Description check ✅ Passed 설명은 배경, 세부 변경, 검증 결과, 테스트 결과와 연결 이슈를 포함해 필수 정보를 대부분 충족합니다.
Linked Issues check ✅ Passed 문서 검증, 빈 Page 회귀 테스트, Chunker 중복 순회 제거와 전체 테스트 통과를 모두 구현했습니다 [#110].
Out of Scope Changes check ✅ Passed 변경 사항은 연결 이슈의 검증·테스트·성능 목표와 직접 관련되며, 업로드 API 문서 수정도 해당 검증 결과를 반영합니다.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feature/110

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@Gimini-3
Gimini-3 merged commit 1016b86 into develop Aug 6, 2026
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Chore] PDF·DOCX 파싱 사후 리뷰 반영 - 검증 문서 보완, 빈 Page 회귀 테스트, Chunker 중복 순회 정리

1 participant