Skip to content

[Feat] 1단계 MVP 도메인 Entity 및 Flyway 마이그레이션 추가 - #6

Merged
Gimini-3 merged 3 commits into
developfrom
feature/5
Jul 7, 2026
Merged

[Feat] 1단계 MVP 도메인 Entity 및 Flyway 마이그레이션 추가#6
Gimini-3 merged 3 commits into
developfrom
feature/5

Conversation

@Gimini-3

@Gimini-3 Gimini-3 commented Jul 7, 2026

Copy link
Copy Markdown
Contributor

🔍️ 작업 내용

1단계 MVP(업로드 → 인덱싱 → 권한 기반 검색 → 출처 반환)에 필요한 JPA Entity 24종 + Enum 24종을 생성하고, 24개 테이블 전체에 대한 Flyway 마이그레이션(V1~V25)을 작성했습니다. Repository/Service/Controller는 포함하지 않았습니다.

✨ 상세 설명

생성한 패키지 구조 (Entity/Enum)

com.opensource.docgrid.domain
├── user/entity        User, Department, Role, UserRole
├── user/enums          UserStatus, CommonStatus
├── document/entity     Document, DocumentVersion, FileObject, DocumentChunk
├── document/enums      DocumentType, DocumentSourceType, DocumentStatus, DocumentVersionStatus, StorageProvider, VisibilityType
├── collection/entity   DocumentCollection, CollectionDocument
├── collection/enums    CollectionStatus
├── permission/entity   CollectionPermission, DocumentPermission, UserDocumentAccessCache
├── permission/enums    PermissionTargetType, PermissionType, AccessSourceType
├── embedding/entity    EmbeddingModel, EmbeddingJob, Embedding
├── embedding/enums     EmbeddingProvider, DistanceMetric, VectorStorageStrategy, EmbeddingJobStatus, EmbeddingStatus
├── search/entity       SearchQuery, SearchResult
├── search/enums        SearchType, ResultStatus
├── rag/entity          RagResponse, ResponseCitation
├── worker/entity       WorkerNode, EmbeddingJobAttempt, IndexingEvent
├── worker/enums        WorkerStatus, AttemptStatus, IndexingEventType
├── failover/entity     FailoverEvent
└── failover/enums      FailoverEventType, FailoverStatus

추가한 Flyway 마이그레이션 (V2~V25, 의존성 순서)

V2  departments                 V10 user_roles                    V18 embedding_jobs
V3  users                       V11 collection_permissions        V19 embedding_job_attempts
V4  file_objects                V12 document_permissions          V20 indexing_events
V5  documents                   V13 user_document_access_cache    V21 search_queries
V6  document_versions           V14 embedding_models               V22 search_results
V7  collections                 V15 document_chunks                V23 rag_responses
V8  collection_documents        V16 embeddings                     V24 response_citations
V9  roles                       V17 worker_nodes                   V25 failover_events

사용법/네이밍 규칙/순환 FK 해결 패턴은 .dev/learnings/flyway-migration-guide.md에 정리했습니다.

주요 설계 포인트

  • 기존 global.common.entity.BaseEntity를 그대로 상속(신규 BaseTimeEntity를 따로 만들지 않음).
  • collections 테이블 Entity는 java.util.Collection과의 이름 충돌을 피해 DocumentCollection으로 명명.
  • 모든 연관관계는 단방향 @ManyToOne(fetch = LAZY)만 사용, @OneToMany/@ManyToMany 미사용(다대다는 중간 엔티티로 해소: UserRole, CollectionDocument 등).
  • documents.current_version_iddocument_versions와의 순환 FK 구조상 nullable 처리. 마이그레이션에서는 V5(documents, FK 보류) → V6(document_versions 생성 후 ALTER TABLE로 FK 마무리) 3단계 패턴으로 실제 FK까지 완결.
  • deletedAt(soft delete)은 User/Document/DocumentCollection에만 별도 필드로 추가.
  • JSON/Vector 컬럼(configJson, filtersJson, metadataJson, vector, queryVector)은 Hibernate JSON/Vector 매핑 미설정 상태라 String/TEXT 컬럼으로 임시 매핑, 관련 TODO 주석 포함.
  • @Setter 미사용, 상태 변경은 markIndexed(), lock(), updateHeartbeat() 등 의미 있는 메서드로만 노출.
  • 모든 Entity/주요 필드에 한글 JavaDoc 및 인라인 주석 작성, @Table/마이그레이션 SQL 양쪽에 uk_*/idx_* 네이밍 규칙을 동일하게 적용.
  • collection_permissions/document_permissionstarget_type(USER/DEPARTMENT/ROLE)별 단일 FK 제약은 JPA로 표현 불가해 엔티티에는 TODO만 남겼지만, 마이그레이션(순수 SQL)에는 실제 CHECK 제약(ck_*_target_type_fk)으로 추가해 해결.

🛠️ 추후 리팩토링 및 고도화 계획

  • OpenSQL vector 타입 실제 매핑 방식 확정 필요 (Embedding.vector, SearchQuery.queryVector)
  • embedding_models의 active/searchable 모델 단일 허용 제약은 애플리케이션 또는 DB partial unique index로 보강 필요
  • ROLE/DEPARTMENT 권한은 user_document_access_cache에 저장하지 않고 검색 시 live predicate로 처리
  • 최종 응답 전 live permission check 필요
  • JSON 컬럼은 추후 Hibernate JSON 매핑(@JdbcTypeCode(SqlTypes.JSON)) 또는 OpenSQL JSON 타입으로 교체 검토
  • uk_user_document_access_cache_user_id_document_id_source_type_source_id 등 일부 제약 이름이 PostgreSQL 식별자 63자 제한에 근접/초과할 수 있어 필요 시 축약 검토

📸 스크린샷 (선택)

해당 없음 (Entity/Enum/마이그레이션 생성 작업)

💬 리뷰 요구사항

  • 패키지 구조(domain.{도메인}.entity / .enums)가 기존 컨벤션과 맞는지 확인 부탁드립니다.
  • documentsdocument_versions 순환 FK 처리 방식(V5/V6 분리 + ALTER TABLE)이 적절한지 확인 부탁드립니다.
  • collection_permissions/document_permissions에 추가한 CHECK 제약 로직이 의도한 대로인지 확인 부탁드립니다.
  • 이 작업은 개발 환경(JDK 17, gradle wrapper 네트워크 접근, 실제 PostgreSQL)이 없는 샌드박스에서 진행되어 ./gradlew build 및 실제 flyway migrate 실행 검증은 하지 못했습니다. 로컬에서 빌드/마이그레이션 실행 확인 부탁드립니다.

Summary by CodeRabbit

  • 새 기능
    • 문서, 컬렉션, 사용자, 권한, 검색, RAG, 임베딩, 워커, 장애 전환 관련 핵심 데이터 구조가 추가되었습니다.
    • 문서 버전 관리, 청크 분리, 임베딩 작업 큐, 검색 결과/인용, 응답 저장 기능을 지원합니다.
    • 컬렉션 및 문서에 대한 읽기/쓰기/관리 권한과 접근 캐시를 도입했습니다.
  • 문서화
    • Flyway 마이그레이션 작성 및 운영 가이드를 추가했습니다.
  • 버그 수정
    • 순환 외래키, 상태 기본값, 유일성/인덱스 제약을 반영해 데이터 일관성을 강화했습니다.

Gimini-3 added 3 commits July 7, 2026 20:59
- 사용자/권한: User, Department, Role, UserRole
- 문서/파일/버전: Document, DocumentVersion, FileObject, DocumentChunk
- 컬렉션/권한: DocumentCollection, CollectionDocument, CollectionPermission, DocumentPermission, UserDocumentAccessCache
- 임베딩/인덱싱: EmbeddingModel, EmbeddingJob, Embedding
- 검색/RAG: SearchQuery, SearchResult, RagResponse, ResponseCitation
- Worker/장애복구: WorkerNode, EmbeddingJobAttempt, IndexingEvent, FailoverEvent
- 관련 Enum 24종 포함
- 기존 BaseEntity/패키지 컨벤션을 그대로 따름, Repository/Service/Controller는 미생성
- V2 departments, V3 users, V4 file_objects, V5 documents, V6 document_versions,
  V7 collections, V8 collection_documents 순서로 생성
- documents <-> document_versions 순환 FK는 V5에서 컬럼만 생성 후 V6에서 ALTER TABLE로 FK 추가
- collection_documents는 이제 collections/documents/users에 대한 실제 FK 제약 포함
- 엔티티(@table uniqueConstraints/indexes)와 동일한 uk_/idx_ 네이밍 규칙 적용
- roles, user_roles, collection_permissions, document_permissions,
  user_document_access_cache, embedding_models, document_chunks, embeddings,
  worker_nodes, embedding_jobs, embedding_job_attempts, indexing_events,
  search_queries, search_results, rag_responses, response_citations, failover_events
- collection_permissions/document_permissions에 target_type CHECK 제약 실제 추가
- .dev/learnings/flyway-migration-guide.md: V 네이밍 의미, 순환 FK 해결 패턴,
  V1~V25 마이그레이션 체인 표, 자주 겪는 실수 정리
@Gimini-3 Gimini-3 self-assigned this Jul 7, 2026
@Gimini-3 Gimini-3 added the ✨ Feature 기능 개발 label Jul 7, 2026
@coderabbitai

coderabbitai Bot commented Jul 7, 2026

Copy link
Copy Markdown

Review Change Stack

Caution

Review failed

The pull request is closed.

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro Plus

Run ID: 008b34dd-ae73-4d7c-b52e-d3c963e0348f

📥 Commits

Reviewing files that changed from the base of the PR and between 9406dc3 and e43e632.

📒 Files selected for processing (73)
  • .dev/learnings/flyway-migration-guide.md
  • src/main/java/com/opensource/docgrid/domain/collection/entity/CollectionDocument.java
  • src/main/java/com/opensource/docgrid/domain/collection/entity/DocumentCollection.java
  • src/main/java/com/opensource/docgrid/domain/collection/enums/CollectionStatus.java
  • src/main/java/com/opensource/docgrid/domain/document/entity/Document.java
  • src/main/java/com/opensource/docgrid/domain/document/entity/DocumentChunk.java
  • src/main/java/com/opensource/docgrid/domain/document/entity/DocumentVersion.java
  • src/main/java/com/opensource/docgrid/domain/document/entity/FileObject.java
  • src/main/java/com/opensource/docgrid/domain/document/enums/DocumentSourceType.java
  • src/main/java/com/opensource/docgrid/domain/document/enums/DocumentStatus.java
  • src/main/java/com/opensource/docgrid/domain/document/enums/DocumentType.java
  • src/main/java/com/opensource/docgrid/domain/document/enums/DocumentVersionStatus.java
  • src/main/java/com/opensource/docgrid/domain/document/enums/StorageProvider.java
  • src/main/java/com/opensource/docgrid/domain/document/enums/VisibilityType.java
  • src/main/java/com/opensource/docgrid/domain/embedding/entity/Embedding.java
  • src/main/java/com/opensource/docgrid/domain/embedding/entity/EmbeddingJob.java
  • src/main/java/com/opensource/docgrid/domain/embedding/entity/EmbeddingModel.java
  • src/main/java/com/opensource/docgrid/domain/embedding/enums/DistanceMetric.java
  • src/main/java/com/opensource/docgrid/domain/embedding/enums/EmbeddingJobStatus.java
  • src/main/java/com/opensource/docgrid/domain/embedding/enums/EmbeddingProvider.java
  • src/main/java/com/opensource/docgrid/domain/embedding/enums/EmbeddingStatus.java
  • src/main/java/com/opensource/docgrid/domain/embedding/enums/VectorStorageStrategy.java
  • src/main/java/com/opensource/docgrid/domain/failover/entity/FailoverEvent.java
  • src/main/java/com/opensource/docgrid/domain/failover/enums/FailoverEventType.java
  • src/main/java/com/opensource/docgrid/domain/failover/enums/FailoverStatus.java
  • src/main/java/com/opensource/docgrid/domain/permission/entity/CollectionPermission.java
  • src/main/java/com/opensource/docgrid/domain/permission/entity/DocumentPermission.java
  • src/main/java/com/opensource/docgrid/domain/permission/entity/UserDocumentAccessCache.java
  • src/main/java/com/opensource/docgrid/domain/permission/enums/AccessSourceType.java
  • src/main/java/com/opensource/docgrid/domain/permission/enums/PermissionTargetType.java
  • src/main/java/com/opensource/docgrid/domain/permission/enums/PermissionType.java
  • src/main/java/com/opensource/docgrid/domain/rag/entity/RagResponse.java
  • src/main/java/com/opensource/docgrid/domain/rag/entity/ResponseCitation.java
  • src/main/java/com/opensource/docgrid/domain/search/entity/SearchQuery.java
  • src/main/java/com/opensource/docgrid/domain/search/entity/SearchResult.java
  • src/main/java/com/opensource/docgrid/domain/search/enums/ResultStatus.java
  • src/main/java/com/opensource/docgrid/domain/search/enums/SearchType.java
  • src/main/java/com/opensource/docgrid/domain/user/entity/Department.java
  • src/main/java/com/opensource/docgrid/domain/user/entity/Role.java
  • src/main/java/com/opensource/docgrid/domain/user/entity/User.java
  • src/main/java/com/opensource/docgrid/domain/user/entity/UserRole.java
  • src/main/java/com/opensource/docgrid/domain/user/enums/CommonStatus.java
  • src/main/java/com/opensource/docgrid/domain/user/enums/UserStatus.java
  • src/main/java/com/opensource/docgrid/domain/worker/entity/EmbeddingJobAttempt.java
  • src/main/java/com/opensource/docgrid/domain/worker/entity/IndexingEvent.java
  • src/main/java/com/opensource/docgrid/domain/worker/entity/WorkerNode.java
  • src/main/java/com/opensource/docgrid/domain/worker/enums/AttemptStatus.java
  • src/main/java/com/opensource/docgrid/domain/worker/enums/IndexingEventType.java
  • src/main/java/com/opensource/docgrid/domain/worker/enums/WorkerStatus.java
  • src/main/resources/db/migration/V10__create_user_roles.sql
  • src/main/resources/db/migration/V11__create_collection_permissions.sql
  • src/main/resources/db/migration/V12__create_document_permissions.sql
  • src/main/resources/db/migration/V13__create_user_document_access_cache.sql
  • src/main/resources/db/migration/V14__create_embedding_models.sql
  • src/main/resources/db/migration/V15__create_document_chunks.sql
  • src/main/resources/db/migration/V16__create_embeddings.sql
  • src/main/resources/db/migration/V17__create_worker_nodes.sql
  • src/main/resources/db/migration/V18__create_embedding_jobs.sql
  • src/main/resources/db/migration/V19__create_embedding_job_attempts.sql
  • src/main/resources/db/migration/V20__create_indexing_events.sql
  • src/main/resources/db/migration/V21__create_search_queries.sql
  • src/main/resources/db/migration/V22__create_search_results.sql
  • src/main/resources/db/migration/V23__create_rag_responses.sql
  • src/main/resources/db/migration/V24__create_response_citations.sql
  • src/main/resources/db/migration/V25__create_failover_events.sql
  • src/main/resources/db/migration/V2__create_departments.sql
  • src/main/resources/db/migration/V3__create_users.sql
  • src/main/resources/db/migration/V4__create_file_objects.sql
  • src/main/resources/db/migration/V5__create_documents.sql
  • src/main/resources/db/migration/V6__create_document_versions.sql
  • src/main/resources/db/migration/V7__create_collections.sql
  • src/main/resources/db/migration/V8__create_collection_documents.sql
  • src/main/resources/db/migration/V9__create_roles.sql

📝 Walkthrough

Walkthrough

1단계 MVP를 위한 24개 JPA Entity(사용자/권한, 문서/파일/버전, 컬렉션, 권한, 임베딩, 검색/RAG, 워커/장애복구)와 관련 Enum들을 신규 추가하고, 이에 대응하는 Flyway 마이그레이션(V2~V25) 및 마이그레이션 운영 가이드 문서를 함께 도입했다. 기능 구현(Repository/Service/Controller)은 포함되지 않는다.

Changes

도메인 Entity/Enum 및 마이그레이션

Layer / File(s) Summary
사용자/권한 기초
domain/user/entity/User.java, Department.java, Role.java, UserRole.java, domain/user/enums/*, db/migration/V2*, V3*, V9*, V10*
User, Department, Role, UserRole Entity와 CommonStatus, UserStatus Enum, 각 테이블 마이그레이션(unique/index 포함)을 추가했다.
문서/파일/버전
domain/document/entity/*.java, domain/document/enums/*, db/migration/V4*, V5*, V6*, V15*
Document, DocumentVersion, FileObject, DocumentChunk Entity와 관련 상태 전이 메서드, 6개 Enum, 순환 FK 해결 방식의 마이그레이션을 추가했다.
컬렉션
domain/collection/entity/*.java, domain/collection/enums/CollectionStatus.java, db/migration/V7*, V8*
DocumentCollection, CollectionDocument Entity와 CollectionStatus Enum, 소프트 삭제 메서드, 매핑 테이블 마이그레이션을 추가했다.
권한
domain/permission/entity/*.java, domain/permission/enums/*, db/migration/V11*, V12*, V13*
CollectionPermission, DocumentPermission, UserDocumentAccessCache Entity와 대상/권한 유형 Enum, target_type 기반 CHECK 제약 마이그레이션을 추가했다.
임베딩
domain/embedding/entity/*.java, domain/embedding/enums/*, db/migration/V14*, V16*, V18*
EmbeddingModel, EmbeddingJob, Embedding Entity와 상태 전이/락 메서드, 5개 Enum, 대응 테이블 마이그레이션을 추가했다.
검색/RAG
domain/search/entity/*.java, domain/rag/entity/*.java, domain/search/enums/*, db/migration/V21*, V22*, V23*, V24*
SearchQuery, SearchResult, RagResponse, ResponseCitation Entity와 SearchType, ResultStatus Enum, 관련 마이그레이션을 추가했다.
Worker/HA
domain/worker/entity/*.java, domain/failover/entity/FailoverEvent.java, domain/worker/enums/*, domain/failover/enums/*, db/migration/V17*, V19*, V20*, V25*
WorkerNode, EmbeddingJobAttempt, IndexingEvent, FailoverEvent Entity와 상태 전이 메서드, 5개 Enum, 관련 마이그레이션을 추가했다.
마이그레이션 가이드 문서
.dev/learnings/flyway-migration-guide.md
Flyway 마이그레이션 작성/실행 규칙, 순환 FK 패턴, V1~V25 체인 표, 흔한 오류 대응을 정리한 문서를 추가했다.

Estimated code review effort: 4 (Complex) | ~75 minutes

Sequence Diagram(s)

해당 없음 (Entity/Enum/마이그레이션 스키마 정의 위주로, 다중 컴포넌트 간 실행 흐름을 시각화할 대상이 없음)

관련 이슈: #5 [Feat] 1단계 MVP 도메인 Entity 및 Enum 생성 — 24개 Entity와 필요한 Enum 생성, @ManyToMany 미사용, DocumentCollection 명명, Document.currentVersion nullable, 주요 unique/index 반영 요건과 부합.

제안 라벨: enhancement, database, domain-model

제안 리뷰어: 코드 소유자 및 백엔드 도메인 담당자 (저장소 정보 부족으로 특정 인원 지정 불가)

Poem:
🐰 굴속 깊이 테이블을 쌓고,
FK는 순서대로 살포시 놓고,
Enum 상자마다 이름표를 달아,
V2부터 V25까지 줄지어 나란히,
아직 로직은 없어도 뼈대는 튼튼해요 🥕


버그·성능·SOLID 관점 핵심 피드백: 이번 PR은 순수 스키마/Entity 정의라 로직 버그 위험은 낮으나, documents.current_version_id처럼 FK 없이 먼저 만든 컬럼은 이후 마이그레이션에서 반드시 제약을 추가했는지 확인이 필요하며, TEXT로 임시 매핑된 vector, filters_json, metadata_json 필드는 추후 타입 교체 시 마이그레이션 영향도를 검토해야 합니다. Entity마다 @Builder의 기본값 처리(null → 기본 상태) 로직이 반복되는데, 공통 추상화 여지가 있는지 점검할 만합니다.

✨ 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/5

Warning

Tools execution failed with the following error:

Failed to run tools: 13 INTERNAL: Received RST_STREAM with code 2 (Internal server error)


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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

✨ Feature 기능 개발

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Feat] 1단계 MVP 도메인 Entity 및 Enum 생성

1 participant