Skip to content

[WTH-509] 게시판 개수 상한을 club 단위로 관리 - #110

Draft
hyxklee wants to merge 1 commit into
devfrom
feat/WTH-509-club-board-limit
Draft

hyxklee wants to merge 1 commit into
devfrom
feat/WTH-509-club-board-limit

Conversation

@hyxklee

@hyxklee hyxklee commented Sep 19, 2026

Copy link
Copy Markdown
Member

배경

게시판 개수 상한이 ManageBoardUseCase의 상수로 박혀 있습니다.

private const val MAX_BOARD_COUNT = 4

application 계층 상수라 club별로 다르게 줄 수 없고, 요금제 차등도 불가능합니다.

WTH-508(V3 → V4 마이그레이션) 중에 드러났습니다. 마이그레이션이 SQL로 게시판을 직접 생성하면서
운영 leets club이 활성 게시판 5개로 이미 상한을 초과한 상태입니다.
조회·사용에는 영향이 없지만(상한은 생성 시점에만 검사) 관리자가 게시판을 추가하려 하면 막힙니다.

또 V3 게시글에는 파트 구분(BE/FE/D/PM)이 있었고, 이를 게시판으로 분리하려면 11~12개가 필요해
현행 상한으로는 불가능합니다.

변경 내용

판정을 Entity로 이동.claude/rules/architecture.md의 "business decisions belong to the Entity"를 따릅니다.
Club에는 이미 warningEnabled / penaltyRule 같은 club별 정책 필드가 있어 일관됩니다.

// Club
var maxBoardCount: Int = DEFAULT_MAX_BOARD_COUNT
    private set

fun canAddBoard(currentActiveCount: Int): Boolean = currentActiveCount < maxBoardCount

fun changeMaxBoardCount(count: Int) { ... }   // 1~30 범위 강제
// ManageBoardUseCase — 상수 제거
if (!club.canAddBoard(boardRepository.countByClubIdAndIsDeletedFalse(clubId))) {
    throw BoardLimitExceededException()
}

club은 이미 getClubByIdForUpdate로 락을 걸고 읽고 있어 추가 조회가 없습니다.

기본값은 4로 유지해 기존 동작에 회귀가 없습니다.

마이그레이션 V17

ALTER TABLE club ADD COLUMN max_board_count INT NOT NULL DEFAULT 4;
UPDATE club SET max_board_count = 12 WHERE club_id = 883010121028214452;

버전 채번 주의dev 기준 최신은 V14이지만, V15는 핫픽스(#108)로 main에 이미 나갔고,
V16은 WTH-495(노션 캘린더)가 사용할 예정이라 V17로 잡았습니다.

제외 범위

  • 요금제/구독(Plan, Subscription) 도메인 — 아직 개념 자체가 없습니다
  • 상한을 변경하는 어드민 API — 현재는 운영 쿼리로만
  • 파트별 게시판 분리 자체 (별도 과제)

테스트

ClubTest 6건 추가 — 기본값, 경계, 이미 초과한 상태에서도 차단, 조정 후 적용, 범위 검증

ManageBoardUseCaseTest — 기존 "4개 이상이면 예외"를 Club.DEFAULT_MAX_BOARD_COUNT 기준으로 바꾸고,
"상한을 올리면 기본값을 넘겨도 생성된다" 케이스를 추가했습니다. 상수였다면 성립하지 않는 테스트라
club별 동작을 실제로 검증합니다.

공유 club 인스턴스를 변경하면 다른 it 블록으로 상태가 새므로 별도 인스턴스를 씁니다.

ktlintCheck / compileKotlin / compileTestKotlin / 해당 테스트 통과.

열린 질문

  • 요금제별 기본 상한 값 (무료/유료)
  • leets club을 12로 두는 게 맞는지 — 파트별 분리를 안 하면 6~7로 충분합니다
  • 상한 변경을 어드민 API로 노출할지

관련

  • WTH-509 / WTH-508
  • docs/plan/v3-to-v4-migration-plan.md

🤖 Generated with Claude Code

https://claude.ai/code/session_01FUfuUw4qjjHWfZKiyqgADJ

ManageBoardUseCase의 private const MAX_BOARD_COUNT = 4 는 application
계층 상수라 club별로 다르게 줄 수 없고 요금제 차등도 불가능하다.

Club에 maxBoardCount 필드를 두고 canAddBoard() 로 판정을 옮긴다.
아키텍처 규칙상 비즈니스 판단은 Entity 책임이며, Club은 이미
warningEnabled / penaltyRule 같은 club별 정책 필드를 갖고 있다.

기본값은 기존과 동일한 4라 회귀가 없다. 상한 조정은 changeMaxBoardCount()
로만 가능하며 1~30 범위를 강제한다.

운영 leets club은 V3 마이그레이션(WTH-508)으로 활성 게시판이 5개가 되어
이미 상한을 초과한 상태다. V17에서 12로 조정한다.

Refs: WTH-509

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FUfuUw4qjjHWfZKiyqgADJ
@coderabbitai

coderabbitai Bot commented Sep 19, 2026

Copy link
Copy Markdown

Important

Draft PR not reviewed

Draft PRs are not automatically reviewed by default.

  • Trigger a manual review

To automatically review draft PRs, update your CodeRabbit configuration:

reviews:
  auto_review:
    drafts: true

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.

@hyxklee hyxklee left a comment

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

관리자 게시판 목록 API가 현재 List<BoardDetailResponse>만 반환해서, 동아리별 maxBoardCount를 FE가 알 수 없습니다. 화면 하단 안내와 생성 버튼 상태를 정확히 처리할 수 있도록 boards, activeBoardCount, maxBoardCount, canCreateBoard를 묶은 목록 응답 DTO가 필요합니다. 현재 목록에는 가상 전체 게시판과 삭제된 게시판도 포함되므로 FE가 목록 길이로 활성 개수를 계산하면 안 됩니다.

또한 V17은 예정된 WTH-495(V16), #105의 마이그레이션과 채번 충돌 가능성이 있으므로 머지 순서 확정 후 재채번이 필요합니다. 특정 club ID의 상한 보정은 일회성 운영 데이터 변경이므로 스키마 Flyway와 분리해 운영 SQL로 처리하는 편이 안전합니다.

@soo0711 soo0711 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

그대로 머지 해도 될 것 같습니다!!
수고하셨습니당~~

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