Skip to content

refactor: 트랙 콘텐츠 관리 권한 검사를 TrackAccessGuard로 모은다 - #148

Merged
ff1451 merged 1 commit into
mainfrom
refactor/track-access-policy
Oct 18, 2026
Merged

ff1451 merged 1 commit into
mainfrom
refactor/track-access-policy

Conversation

@ff1451

@ff1451 ff1451 commented Oct 16, 2026

Copy link
Copy Markdown
Contributor

요약

동작을 바꾸지 않는 리팩토링. 게임(3)·트랙 페이지(2)·커리큘럼(2) 서비스 7곳이 "회원 조회 → Member.canManage(트랙) 확인 → 도메인 예외"를 각자 복사해 갖고 있었고, 게임 3곳은 "GAME" 트랙 코드 상수도 따로 두었다.

변경

  • track/service/TrackAccessGuard
    • requireManager(memberId, track, errors): 회원이 없으면 errors.memberNotFound, canManage가 거짓이면 errors.accessDenied.
    • requireGameManager(memberId, errors): Track.GAME 트랙으로 위와 같다. GAME 트랙 행이 없으면 관리자만 통과(기존 동작 — 기존 코드는 관리자면 트랙 조회 없이 통과, 아니면 트랙이 없을 때 거부).
    • AccessErrors(예외 생성자, 회원 없음 타입, 권한 없음 타입): 도메인마다 메시지가 달라(GAME_ACCESS_DENIED/TRACK_ACCESS_DENIED/CURRICULUM_ACCESS_DENIED, MEMBER_NOT_FOUND 3종) 응답을 그대로 두려고 호출 쪽이 정한다.
  • 각 서비스의 requireXxxAccess는 가드 호출 한 줄이 되고, 더 이상 쓰지 않는 MemberRepository/TrackMasterRepository 의존을 뺐다.

하지 않은 것

  • MEMBER_NOT_FOUND 메시지 통일 — 응답 문구가 바뀌어 별도로 다룬다.
  • 게임 멤버·트랙 멤버 서비스 통합 — 엔티티·저장소·숨김 기능·검사 순서가 달라 제네릭으로 합치면 과한 추상화가 된다. 겹치던 권한 검사는 이 PR로 모였다.

테스트

  • TrackAccessGuardTest(단위): 회원 없음, GAME 트랙 행이 없을 때 관리자만 통과.
  • 로컬 전체 ./gradlew test: 534건 중 533 통과, 1 스킵.

게임·트랙 페이지·커리큘럼 서비스 7곳이 "회원 조회 -> Member.canManage 확인"을 각자 복사해 갖고 있었고,
게임 쪽 3곳은 "GAME" 트랙 코드 상수까지 따로 두었다.

- TrackAccessGuard.requireManager / requireGameManager 하나로 모은다.
- 도메인마다 응답 메시지가 달라 예외 생성자와 "회원 없음"·"권한 없음" 타입은 AccessErrors로 넘긴다.
  응답(상태 코드·메시지)과 예외 클래스는 그대로다.
- GAME 트랙 행이 없을 때 관리자만 통과하는 기존 동작을 유지한다(canManage(null)).
@coderabbitai

coderabbitai Bot commented Oct 16, 2026

Copy link
Copy Markdown

Warning

Review limit reached

You've used all free OSS reviews for now. Wait for the free limit to reset to keep reviewing this public repository.

Next included review available in 44 minutes.

Check out review usage here.

View limit details

Limit details: You’ve used the included review currently available.

Learn how review limits work.

Review configuration:

⚙️ Run configuration
  • Configuration used: defaults
  • Review profile: CHILL
  • Plan: Advanced
  • Run ID: f6e59a0b-d501-421c-926a-bd06378a319e
📥 Commits

Reviewing files that changed from the base of the PR and between ff8f676 and 3ddf46d.

📒 Files selected for processing: 9
  • src/main/java/com/bcsdlab/bcsdinternalapiv2/curriculum/service/AdminCurriculumService.java
  • src/main/java/com/bcsdlab/bcsdinternalapiv2/curriculum/service/AdminCurriculumTreeService.java
  • src/main/java/com/bcsdlab/bcsdinternalapiv2/game/service/AdminGameBuildService.java
  • src/main/java/com/bcsdlab/bcsdinternalapiv2/game/service/AdminGameMemberService.java
  • src/main/java/com/bcsdlab/bcsdinternalapiv2/game/service/AdminGameService.java
  • src/main/java/com/bcsdlab/bcsdinternalapiv2/track/service/AdminTrackPageMemberService.java
  • src/main/java/com/bcsdlab/bcsdinternalapiv2/track/service/AdminTrackPageService.java
  • src/main/java/com/bcsdlab/bcsdinternalapiv2/track/service/TrackAccessGuard.java
  • src/test/java/com/bcsdlab/bcsdinternalapiv2/track/TrackAccessGuardTest.java
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

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.

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