Skip to content

PR에서 Spring Modulith 구조를 확인할 수 있게 한다#73

Draft
NaMinhyeok wants to merge 4 commits into
mainfrom
codex/modulith-pr-comment
Draft

PR에서 Spring Modulith 구조를 확인할 수 있게 한다#73
NaMinhyeok wants to merge 4 commits into
mainfrom
codex/modulith-pr-comment

Conversation

@NaMinhyeok
Copy link
Copy Markdown
Contributor

@NaMinhyeok NaMinhyeok commented Apr 12, 2026

Spring Modulith 구조도

이 섹션은 CI가 자동으로 갱신합니다.

flowchart LR
    room["Room"]
    template["Template"]
    room -->|"uses"| template
Loading

모듈 의존성

  • Room -> Template (uses)

모듈 세부사항

Room

Base package

com.naminhyeok.fantazzk.room

Spring components

Controllers

  • c.n.f.r.RoomApiController

Services

  • c.n.f.r.ClearDraftPosition
  • c.n.f.r.CreateRoom
  • c.n.f.r.CreateRoomAttempt
  • c.n.f.r.FindJoinableRooms
  • c.n.f.r.GetRoom
  • c.n.f.r.JoinRoom
  • c.n.f.r.PickDraft
  • c.n.f.r.PlaceBid
  • c.n.f.r.SelectDraftPosition
  • c.n.f.r.SettleAuction
  • c.n.f.r.SettleAuctionAttempt
  • c.n.f.r.StartRoom

Repositories

  • c.n.f.r.AuctionScheduleJpaRepository
  • c.n.f.r.JoinableRoomJpaRepository
  • c.n.f.r.AuctionScheduleReader (via c.n.f.r.JpaAuctionScheduleReader)
  • c.n.f.r.JoinableRoomReader (via c.n.f.r.JpaJoinableRoomReader)
  • c.n.f.r.Rooms

Event listeners

  • c.n.f.r.RoomAuctionDeadlineScheduler

Others

  • c.n.f.r.RoomActionAuthorizer
  • c.n.f.r.RoomCodeGenerator (via c.n.f.r.UuidRoomCodeGenerator)
  • c.n.f.r.TeamLeaderIdentityIssuer (via c.n.f.r.UuidTeamLeaderIdentityIssuer)

Bean references

  • c.n.f.t.TemplateCatalog (in Template)

Aggregate roots

  • c.n.f.r.Room

Value types

  • c.n.f.r.BidSequence
  • c.n.f.r.RoomBid
  • c.n.f.r.RoomTeamMember

Events listened to

  • org.springframework.boot.context.event.ApplicationReadyEvent
Template

Base package

com.naminhyeok.fantazzk.template

Spring components

Controllers

  • c.n.f.t.TemplateApiController

Services

  • c.n.f.t.CreateTemplate
  • c.n.f.t.FindTemplates
  • c.n.f.t.TemplateCatalog (via c.n.f.t.ProvideTemplateCatalog)

Repositories

  • c.n.f.t.TemplateListReader (via c.n.f.t.JpaTemplateListReader)
  • c.n.f.t.TemplateListJpaRepository
  • c.n.f.t.Templates

Aggregate roots

  • c.n.f.t.Template

Value types

  • c.n.f.t.TemplateConfiguration
  • c.n.f.t.TemplatePlayer

무엇을 변경했는가

  • CI workflow에 PR 본문 상단 구조도와 PR conversation 상세 보고를 함께 갱신하는 단계를 추가했습니다.
  • build/spring-modulith 산출물을 읽어 PR 본문용 Mermaid 섹션과 PR 코멘트용 상세 Markdown을 생성하는 스크립트를 확장했습니다.
  • 같은 PR에서 관리 마커를 기준으로 본문 섹션과 상세 코멘트를 각각 갱신하도록 했습니다.
  • Modulith 본문/코멘트 생성이나 업로드가 실패하더라도 본래의 검증 job 자체는 깨지지 않도록 fallback 처리와 continue-on-error를 적용했습니다.

왜 변경했는가

지금 저장소는 Spring Modulith 문서 산출물을 이미 만들 수 있지만, 그 결과를 로컬이나 artifact에서만 찾아봐야 해서 PR 리뷰 맥락에서는 잘 드러나지 않았습니다. 모듈 경계와 의존성을 PR 첫 화면에서 바로 보이게 하고, 더 자세한 내부 구성은 대화 탭에서 펼쳐보게 하면 구조 리뷰가 훨씬 빨라집니다.

어떻게 동작하는가

  • ./gradlew check가 기존처럼 Modulith 문서 산출물을 생성합니다.
  • PR 이벤트일 때 scripts/render_modulith_pr_comment.pycomponents.puml, module-*.adoc를 읽어 두 가지 산출물을 만듭니다.
  • PR 본문 상단에는 Mermaid 기반 구조도 관리 섹션을 넣고, 기존 설명 본문은 유지한 채 해당 섹션만 치환합니다.
  • PR conversation에는 모듈별 서비스, 컨트롤러, 리포지토리, aggregate root, 이벤트 정보까지 포함한 상세 보고 코멘트를 유지합니다.
  • 산출물이 없거나 스크립트가 실패하면 원인 확인을 유도하는 fallback 본문/코멘트를 남깁니다.

리뷰 관점에서 기대하는 효과

  • PR 첫 화면에서 현재 모듈 그래프를 바로 볼 수 있습니다.
  • Room -> Template 같은 모듈 간 의존성을 artifact 다운로드 없이 확인할 수 있습니다.
  • conversation 탭에서는 모듈별 내부 컴포넌트와 도메인 타입까지 더 자세히 확인할 수 있습니다.
  • 구조 리포팅 실패가 본래 테스트 실패와 섞여 원인을 흐리지 않도록 분리했습니다.

검증

  • python3 -m unittest scripts.tests.test_render_modulith_pr_comment
  • python3 scripts/render_modulith_pr_comment.py --target body
  • ruby -e "require 'yaml'; YAML.load_file('.github/workflows/ci.yml'); puts 'ci.yml ok'"
  • ./gradlew check integrationTest --parallel --no-daemon

참고

  • fork PR처럼 토큰 권한이 제한된 환경에서는 본문/코멘트 업로드 단계가 실패할 수 있지만, 이 경우에도 검증 job은 실패하지 않도록 구성했습니다.

@github-actions
Copy link
Copy Markdown

github-actions Bot commented Apr 12, 2026

Spring Modulith 구조 보고서

CI가 생성한 현재 모듈 구조와 관찰된 의존성입니다.

모듈 그래프

flowchart LR
    room["Room"]
    template["Template"]
    room -->|"uses"| template
Loading

모듈 의존성

  • Room -> Template (uses)

모듈 세부사항

Room

Base package

com.naminhyeok.fantazzk.room

Spring components

Controllers

  • c.n.f.r.RoomApiController

Services

  • c.n.f.r.ClearDraftPosition
  • c.n.f.r.CreateRoom
  • c.n.f.r.CreateRoomAttempt
  • c.n.f.r.FindJoinableRooms
  • c.n.f.r.GetRoom
  • c.n.f.r.JoinRoom
  • c.n.f.r.PickDraft
  • c.n.f.r.PlaceBid
  • c.n.f.r.SelectDraftPosition
  • c.n.f.r.SettleAuction
  • c.n.f.r.SettleAuctionAttempt
  • c.n.f.r.StartRoom

Repositories

  • c.n.f.r.AuctionScheduleJpaRepository
  • c.n.f.r.JoinableRoomJpaRepository
  • c.n.f.r.AuctionScheduleReader (via c.n.f.r.JpaAuctionScheduleReader)
  • c.n.f.r.JoinableRoomReader (via c.n.f.r.JpaJoinableRoomReader)
  • c.n.f.r.Rooms

Event listeners

  • c.n.f.r.RoomAuctionDeadlineScheduler

Others

  • c.n.f.r.RoomActionAuthorizer
  • c.n.f.r.RoomCodeGenerator (via c.n.f.r.UuidRoomCodeGenerator)
  • c.n.f.r.TeamLeaderIdentityIssuer (via c.n.f.r.UuidTeamLeaderIdentityIssuer)

Bean references

  • c.n.f.t.TemplateCatalog (in Template)

Aggregate roots

  • c.n.f.r.Room

Value types

  • c.n.f.r.BidSequence
  • c.n.f.r.RoomBid
  • c.n.f.r.RoomTeamMember

Events listened to

  • org.springframework.boot.context.event.ApplicationReadyEvent
Template

Base package

com.naminhyeok.fantazzk.template

Spring components

Controllers

  • c.n.f.t.TemplateApiController

Services

  • c.n.f.t.CreateTemplate
  • c.n.f.t.FindTemplates
  • c.n.f.t.TemplateCatalog (via c.n.f.t.ProvideTemplateCatalog)

Repositories

  • c.n.f.t.TemplateListReader (via c.n.f.t.JpaTemplateListReader)
  • c.n.f.t.TemplateListJpaRepository
  • c.n.f.t.Templates

Aggregate roots

  • c.n.f.t.Template

Value types

  • c.n.f.t.TemplateConfiguration
  • c.n.f.t.TemplatePlayer

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.

1 participant