Skip to content

Conversation

@eraser502
Copy link
Contributor

Overview

  • 실서버 배포

Related Issue

  • Closes

PR Checklist

  • [ ]

Additional Information

@eraser502 eraser502 self-assigned this Dec 9, 2025
@coderabbitai
Copy link

coderabbitai bot commented Dec 9, 2025

Caution

Review failed

The pull request is closed.

Walkthrough

이 PR은 CMS 및 사이트 앱 페이지/버전 관리 기능을 도입합니다. 여러 CMS 컨트롤러 문서에 X-App-Subdomain 헤더 파라미터 어노테이션을 추가하고, 새로운 CMSSitePageController와 SitePageController를 구현하여 페이지 버전 조회, 페이지 조회, 버전 생성 기능을 제공합니다. AppPage, AppVersion, AppVersionPage 엔티티와 관련 저장소, 서비스를 추가하며, 3개의 새로운 데이터베이스 테이블을 생성하는 마이그레이션을 포함합니다. 보안 설정에 사이트 공개 체인을 추가하여 /api/v1/app/site/\\ 경로에 대한 필터를 구성합니다.

Sequence Diagram

sequenceDiagram
    participant Client
    participant CMSSitePageController
    participant CMSSitePageService
    participant AppVersionRepository
    participant AppVersionPageRepository
    participant Database

    rect rgb(200, 220, 240)
    Note over Client,Database: 페이지 버전 생성 흐름
    Client->>CMSSitePageController: POST /versions (AppVersionCreateRequest)
    activate CMSSitePageController
    CMSSitePageController->>CMSSitePageService: createAppVersion(redotAppId, request)
    activate CMSSitePageService
    CMSSitePageService->>AppVersionRepository: findByRedotAppIdAndStatus(PUBLISHED)
    activate AppVersionRepository
    AppVersionRepository->>Database: SELECT * FROM app_versions
    Database-->>AppVersionRepository: Existing published version
    AppVersionRepository-->>CMSSitePageService: Optional<AppVersion>
    deactivate AppVersionRepository
    
    alt Duplicate published version exists
        CMSSitePageService-->>CMSSitePageController: CMSSitePageException
    else Create new version
        CMSSitePageService->>AppVersionRepository: save(AppVersion)
        activate AppVersionRepository
        AppVersionRepository->>Database: INSERT INTO app_versions
        Database-->>AppVersionRepository: persisted AppVersion
        AppVersionRepository-->>CMSSitePageService: AppVersion with id
        deactivate AppVersionRepository
        
        CMSSitePageService->>AppVersionPageRepository: save(AppVersionPage list)
        activate AppVersionPageRepository
        AppVersionPageRepository->>Database: INSERT INTO app_version_pages
        Database-->>AppVersionPageRepository: persisted pages
        AppVersionPageRepository-->>CMSSitePageService: AppVersionPage list
        deactivate AppVersionPageRepository
        
        CMSSitePageService-->>CMSSitePageController: AppVersionSummaryResponse
    end
    
    deactivate CMSSitePageService
    CMSSitePageController-->>Client: 200 OK with AppVersionSummaryResponse
    deactivate CMSSitePageController
    end

    rect rgb(220, 240, 200)
    Note over Client,Database: 공개 페이지 조회 흐름
    Client->>SitePageController: GET /api/v1/app/site/pages?path=/about
    activate SitePageController
    SitePageController->>CMSSitePageService: getPage(appId, pageId) 또는<br/>SitePageService: getSitePages(appId, path)
    activate CMSSitePageService
    CMSSitePageService->>AppVersionRepository: findByRedotAppIdAndStatus(PUBLISHED)
    activate AppVersionRepository
    AppVersionRepository->>Database: SELECT * FROM app_versions WHERE status='PUBLISHED'
    Database-->>AppVersionRepository: published AppVersion
    AppVersionRepository-->>CMSSitePageService: Optional<AppVersion>
    deactivate AppVersionRepository
    
    CMSSitePageService->>AppVersionPageRepository: findByAppVersionIdAndAppPage_Path()
    activate AppVersionPageRepository
    AppVersionPageRepository->>Database: SELECT * FROM app_version_pages
    Database-->>AppVersionPageRepository: AppVersionPage with AppPage
    AppVersionPageRepository-->>CMSSitePageService: Optional<AppVersionPage>
    deactivate AppVersionPageRepository
    
    CMSSitePageService-->>SitePageController: AppPageResponse
    deactivate CMSSitePageService
    SitePageController-->>Client: 200 OK with AppPageResponse
    deactivate SitePageController
    end
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

주의가 필요한 영역:

  • CMSSitePageService (src/main/java/redot/redot_server/domain/cms/site/page/service/CMSSitePageService.java): 페이지 집계, 상태 검증, 중복 발행 버전 처리 등 복잡한 비즈니스 로직
  • AppVersionPageRepository (src/main/java/redot/redot_server/domain/site/page/repository/AppVersionPageRepository.java): JPQL 생성자 표현식과 복합 조인을 사용하는 맞춤 쿼리
  • 데이터베이스 마이그레이션 (src/main/resources/db/migration/V3__create_site_pages.sql): 고유 제약 조건(UNIQUE constraints), 부분 인덱스(partial index), 외래 키 제약 로직
  • AppVersionPage 엔티티 (src/main/java/redot/redot_server/domain/site/page/entity/AppVersionPage.java): 다중 고유 제약 조건 및 버전/페이지 관계 모델링

Possibly related PRs

  • PR #117: 동일한 코드 레벨의 변경사항 — X-App-Subdomain @Parameter 어노테이션 추가 및 CMS/사이트 페이지 컨트롤러, 엔티티, 저장소, 서비스, DB 마이그레이션
  • PR #89: X-App-Subdomain 헤더 어노테이션이 CMSMenuControllerDocs에 추가된 것과 관련되어 동일한 API 표면(CmsMenuController#getMenus 엔드포인트)에 직접 관련
  • PR #115: 동일한 컨트롤러 문서 인터페이스(CMSAuthControllerDocs, CMSMemberControllerDocs 등)에 X-App-Subdomain 헤더 @Parameter 어노테이션을 추가/수정하여 코드 레벨에서 관련

Suggested labels

deploy

Poem

🐰 페이지와 버전의 춤이 시작되고,
마이그레이션 스키마 위를 우아하게 내려가네,
앱의 이야기가 몇 개의 버전으로 나뉘어,
공개된 세상으로 발행되기를 기다리고,
그 모든 것이 서브도메인 헤더에 담겨,
새로운 앱의 꿈을 안고 날아간다! ✨

✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch develop

📜 Recent review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 046f4cc and 987eb33.

📒 Files selected for processing (33)
  • src/main/java/redot/redot_server/domain/auth/controller/docs/CMSAuthControllerDocs.java (3 hunks)
  • src/main/java/redot/redot_server/domain/cms/inquiry/controller/docs/RedotAppInquiryControllerDocs.java (3 hunks)
  • src/main/java/redot/redot_server/domain/cms/member/controller/docs/CMSMemberControllerDocs.java (3 hunks)
  • src/main/java/redot/redot_server/domain/cms/site/menu/controller/docs/CMSMenuControllerDocs.java (2 hunks)
  • src/main/java/redot/redot_server/domain/cms/site/page/controller/CMSSitePageController.java (1 hunks)
  • src/main/java/redot/redot_server/domain/cms/site/page/controller/docs/CMSSitePageControllerDocs.java (1 hunks)
  • src/main/java/redot/redot_server/domain/cms/site/page/dto/request/AppPageCreateRequest.java (1 hunks)
  • src/main/java/redot/redot_server/domain/cms/site/page/dto/request/AppPageRetainRequest.java (1 hunks)
  • src/main/java/redot/redot_server/domain/cms/site/page/dto/request/AppVersionCreateRequest.java (1 hunks)
  • src/main/java/redot/redot_server/domain/cms/site/page/dto/response/AppVersionPageSummaryResponse.java (1 hunks)
  • src/main/java/redot/redot_server/domain/cms/site/page/dto/response/AppVersionSummaryResponse.java (1 hunks)
  • src/main/java/redot/redot_server/domain/cms/site/page/exception/CMSSitePageErrorCode.java (1 hunks)
  • src/main/java/redot/redot_server/domain/cms/site/page/exception/CMSSitePageException.java (1 hunks)
  • src/main/java/redot/redot_server/domain/cms/site/page/service/CMSSitePageService.java (1 hunks)
  • src/main/java/redot/redot_server/domain/cms/site/page/service/dto/AppVersionPageSummaryWithVersionResponse.java (1 hunks)
  • src/main/java/redot/redot_server/domain/cms/site/setting/controller/docs/SiteSettingControllerDocs.java (2 hunks)
  • src/main/java/redot/redot_server/domain/cms/site/style/controller/docs/StyleInfoControllerDocs.java (2 hunks)
  • src/main/java/redot/redot_server/domain/redot/app/controller/docs/RedotAppControllerDocs.java (2 hunks)
  • src/main/java/redot/redot_server/domain/site/page/controller/SitePageController.java (1 hunks)
  • src/main/java/redot/redot_server/domain/site/page/controller/docs/SitePageControllerDocs.java (1 hunks)
  • src/main/java/redot/redot_server/domain/site/page/dto/response/AppPageResponse.java (1 hunks)
  • src/main/java/redot/redot_server/domain/site/page/entity/AppPage.java (1 hunks)
  • src/main/java/redot/redot_server/domain/site/page/entity/AppVersion.java (1 hunks)
  • src/main/java/redot/redot_server/domain/site/page/entity/AppVersionPage.java (1 hunks)
  • src/main/java/redot/redot_server/domain/site/page/entity/AppVersionStatus.java (1 hunks)
  • src/main/java/redot/redot_server/domain/site/page/exception/SitePageErrorCode.java (1 hunks)
  • src/main/java/redot/redot_server/domain/site/page/exception/SitePageException.java (1 hunks)
  • src/main/java/redot/redot_server/domain/site/page/repository/AppPageRepository.java (1 hunks)
  • src/main/java/redot/redot_server/domain/site/page/repository/AppVersionPageRepository.java (1 hunks)
  • src/main/java/redot/redot_server/domain/site/page/repository/AppVersionRepository.java (1 hunks)
  • src/main/java/redot/redot_server/domain/site/page/service/SitePageService.java (1 hunks)
  • src/main/java/redot/redot_server/global/security/config/SecurityConfig.java (1 hunks)
  • src/main/resources/db/migration/V3__create_site_pages.sql (1 hunks)

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 and usage tips.

@eraser502 eraser502 merged commit 47768cc into main Dec 9, 2025
1 of 2 checks 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.

2 participants