Skip to content

feat: 동아리 상세에 대학 요약 정보 추가#632

Merged
dh2906 merged 2 commits into
developfrom
feat/website-club-detail-university-summary
May 22, 2026
Merged

feat: 동아리 상세에 대학 요약 정보 추가#632
dh2906 merged 2 commits into
developfrom
feat/website-club-detail-university-summary

Conversation

@dh2906
Copy link
Copy Markdown
Contributor

@dh2906 dh2906 commented May 22, 2026

🔍 개요

  • GET /konect/clubs/{clubId} 응답에서 동아리 상세 화면이 대학 로고와 해당 대학의 전체 등록 동아리 수를 바로 사용할 수 있습니다.
  • 기존 memberCount는 현재 동아리의 회원 수로 유지하고, 대학 단위 수치는 university.clubCount로 분리했습니다.

🚀 주요 변경 내용

  • 동아리 상세 응답의 university 객체에 imageUrl, clubCount 필드를 추가했습니다.
  • 상세 조회 시 동아리가 속한 대학의 전체 동아리 수를 별도 QueryDSL 카운트 쿼리로 계산합니다.
  • WebsiteApiTest에서 대학 이미지 URL과 대학 등록 동아리 수 응답 계약을 검증했습니다.

💬 참고 사항

  • 검증: ./gradlew test --tests gg.agit.konect.integration.domain.website.WebsiteApiTest
  • pre-push 훅에서 formatter, checkstyleMain, compileJava가 통과했습니다.

✅ Checklist (완료 조건)

  • 코드 스타일 가이드 준수
  • 테스트 코드 포함됨
  • Reviewers / Assignees / Labels 지정 완료
  • 보안 및 민감 정보 검증 (API 키, 환경 변수, 개인정보 등)

Compound Engineering
Codex

- 웹사이트 동아리 상세에서 대학 이미지와 대학 전체 동아리 수를 함께 내려주도록 응답 계약을 확장

- 현재 동아리 회원 수와 대학 단위 동아리 수를 분리해 클라이언트가 각각의 의미를 명확히 사용할 수 있도록 유지

- 상세 API 통합 테스트로 대학 이미지 URL과 동아리 수 응답을 검증
@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented May 22, 2026

Review Change Stack

Warning

Rate limit exceeded

@dh2906 has exceeded the limit for the number of commits that can be reviewed per hour. Please wait 52 minutes and 31 seconds before requesting another review.

You’ve run out of usage credits. Purchase more in the billing tab.

⌛ How to resolve this issue?

After the wait time has elapsed, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

We recommend that you space out your commits to avoid hitting the rate limit.

🚦 How do rate limits work?

CodeRabbit enforces hourly rate limits for each developer per organization.

Our paid plans have higher rate limits than the trial, open-source and free plans. In all cases, we re-allow further reviews after a brief timeout.

Please see our FAQ for further information.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro

Run ID: 1fddcb49-10f0-4ed7-afa0-3b8aec38cfb4

📥 Commits

Reviewing files that changed from the base of the PR and between 89a2d43 and f3b2170.

📒 Files selected for processing (1)
  • src/main/java/gg/agit/konect/domain/website/repository/WebsiteQueryRepository.java
📝 Walkthrough

Walkthrough

Repository에 대학별 동아리 수 조회 메서드를 추가하고, Service에서 이를 호출하여 계산한 값과 대학 이미지 URL을 DTO에 전달하도록 갱신했습니다. DTO는 새 필드를 수용하도록 확장되고, 통합 테스트에서 응답 필드를 검증합니다.

Changes

대학 동아리 수 조회 및 응답 확장

Layer / File(s) Summary
대학별 동아리 수 조회 메서드
src/main/java/gg/agit/konect/domain/website/repository/WebsiteQueryRepository.java
QueryDSL을 사용하여 주어진 universityId에 해당하는 모든 활성 동아리의 개수를 조회하는 countClubsByUniversityId 메서드를 추가합니다.
Club detail 서비스 로직 및 응답 DTO
src/main/java/gg/agit/konect/domain/website/service/WebsiteService.java, src/main/java/gg/agit/konect/domain/website/dto/WebsiteClubDetailResponse.java
WebsiteService.getClubDetail에서 저장소 메서드를 호출하여 universityClubCount를 계산합니다. 정적 팩토리 메서드 WebsiteClubDetailResponse.of(...)는 새 파라미터 universityClubCount를 받도록 시그니처가 변경되고, 반환 로직에서 University 객체를 생성할 때 대학의 imageUrluniversityClubCount를 매핑합니다.
University DTO 필드 및 OpenAPI 주석
src/main/java/gg/agit/konect/domain/website/dto/WebsiteClubDetailResponse.java
WebsiteClubDetailResponse.University 레코드에 imageUrlclubCount 필드를 추가하고, 각 필드에 대해 OpenAPI @Schema 메타데이터를 정의합니다.
통합 테스트 및 검증
src/test/java/gg/agit/konect/integration/domain/website/WebsiteApiTest.java
Club detail 테스트에서 UniversityFixtureimageUrl을 전달하도록 테스트 데이터를 갱신하고, 응답 검증에서 $.university.imageUrl$.university.clubCount를 확인하는 jsonPath 어서션을 추가합니다.

Estimated code review effort

🎯 2 (Simple) | ⏱️ ~12 minutes

Possibly related PRs

  • BCSDLab/KONECT_BACK_END#623: 기존 website club-detail API 계층과 관련 DTO/Service/Repository를 도입한 PR으로, 이 PR은 그 기반 위에서 University 필드와 club-count 쿼리를 확장합니다.

Suggested labels

기능

Poem

🐰 대학 동아리를 손에 들고,
개수 세고 로고도 담고,
응답이 풍성해지니
API는 더욱 빛나네! ✨
테스트도 함께 웃는다.

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed PR 제목은 동아리 상세 응답에 대학 요약 정보를 추가하는 변경사항을 명확하고 간결하게 설명하며, 변경 사항의 핵심을 잘 반영하고 있습니다.
Description check ✅ Passed PR 설명은 변경사항의 목적, 주요 변경 내용, 검증 방법을 상세히 기술하고 있으며, 제시된 변경사항과 직접적으로 관련이 있습니다.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/website-club-detail-university-summary

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.

@dh2906 dh2906 self-assigned this May 22, 2026
Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 2

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In
`@src/main/java/gg/agit/konect/domain/website/dto/WebsiteClubDetailResponse.java`:
- Around line 65-70: The Schema marks WebsiteClubDetailResponse.imageUrl as
required but there is no DB/entity NOT NULL guarantee; either make the
DTO/schema nullable to match current data or add a DB migration/backfill and NOT
NULL constraint to guarantee runtime non-null. Fix by choosing one: (A) change
the Schema on WebsiteClubDetailResponse.imageUrl to optional (requiredMode =
NOT_REQUIRED) and update the DTO type/annotations to allow null/Optional so
contract matches current DB, or (B) add a Flyway migration that backfills
existing null university.imageUrl values and then alters the column to NOT NULL,
and keep requiredMode = REQUIRED; ensure unit/integration tests and API docs are
updated accordingly.

In
`@src/main/java/gg/agit/konect/domain/website/repository/WebsiteQueryRepository.java`:
- Around line 128-133: countClubsByUniversityId currently builds its own where
clause which can drift from the shared filtering logic; change it to reuse the
common predicate by calling createClubCondition(universityId, null, null) (or an
equivalent active/visibility predicate) instead of directly using
club.university.id.eq(universityId) so the count uses identical filters as other
queries (e.g., those that populate university.clubCount) and will automatically
include soft-delete/visibility rules.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro

Run ID: 1f6cc37d-6142-4738-b644-ec4e069e62bf

📥 Commits

Reviewing files that changed from the base of the PR and between 0f345b1 and 89a2d43.

📒 Files selected for processing (4)
  • src/main/java/gg/agit/konect/domain/website/dto/WebsiteClubDetailResponse.java
  • src/main/java/gg/agit/konect/domain/website/repository/WebsiteQueryRepository.java
  • src/main/java/gg/agit/konect/domain/website/service/WebsiteService.java
  • src/test/java/gg/agit/konect/integration/domain/website/WebsiteApiTest.java
📜 Review details
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (2)
  • GitHub Check: coverage
  • GitHub Check: Analyze (java-kotlin)
🧰 Additional context used
📓 Path-based instructions (4)
**/*.java

📄 CodeRabbit inference engine (.github/copilot-instructions.md)

**/*.java: Java 코드에서 import로 해결할 수 있는 경우 FQCN(Full Qualified Class Name)을 사용하지 않도록 지적한다
JPA/QueryDSL 조회 변경 시 N+1, 잘못된 fetch join, count 쿼리 왜곡, pagination 깨짐, distinct 누락을 확인한다
권한 로직은 관리자 우회, 요청자와 대상자 관계, 클럽/채팅방/공지/일정의 소속 검증이 빠지지 않았는지 확인한다
soft delete, 탈퇴 사용자, 차단/제외 조건, 중복 제거가 필요한 조회에서는 응답에 노출되면 안 되는 데이터가 포함되는지 확인한다
DTO 응답 변경은 기존 클라이언트가 기대하는 필드명, nullability, enum/string 값, 정렬 순서를 깨지 않는지 확인한다
조건이 2개 이상 결합된 비즈니스 규칙, 권한 조건, soft delete 제외, 중복 제거, fallback 우선순위, 대표값 선택, DTO 변환, count 쿼리 분리, fetch join 선택 이유처럼 코드만으로 의도가 숨겨지는 지점에는 주석을 권장한다
단순 생성자 호출, 필드 매핑, 컬렉션 반환, 이름만으로 명확한 분기에는 주석을 요구하지 않는다

Files:

  • src/main/java/gg/agit/konect/domain/website/service/WebsiteService.java
  • src/main/java/gg/agit/konect/domain/website/repository/WebsiteQueryRepository.java
  • src/test/java/gg/agit/konect/integration/domain/website/WebsiteApiTest.java
  • src/main/java/gg/agit/konect/domain/website/dto/WebsiteClubDetailResponse.java
**/*.{sql,java}

📄 CodeRabbit inference engine (.github/copilot-instructions.md)

데이터베이스 변경에서는 마이그레이션 순서, 기존 데이터 호환성, nullable/default 처리, 롤백 난이도, 인덱스 필요성을 확인한다

Files:

  • src/main/java/gg/agit/konect/domain/website/service/WebsiteService.java
  • src/main/java/gg/agit/konect/domain/website/repository/WebsiteQueryRepository.java
  • src/test/java/gg/agit/konect/integration/domain/website/WebsiteApiTest.java
  • src/main/java/gg/agit/konect/domain/website/dto/WebsiteClubDetailResponse.java
src/main/java/**/*.java

⚙️ CodeRabbit configuration file

src/main/java/**/*.java: 아래 원칙으로 리뷰 코멘트를 작성한다.

  • 코멘트는 반드시 한국어로 작성한다.
  • 반드시 수정이 필요한 항목만 코멘트로 남기고, 단순 취향 차이는 지적하지 않는다.
  • 각 코멘트 첫 줄에 심각도를 [LEVEL: high|medium|low] 형식으로 반드시 표기한다.
  • 심각도 기준: high=운영 장애 가능, medium=품질 저하, low=개선 권고.
  • 각 코멘트는 "문제 -> 영향 -> 제안" 순서로 3문장 이내로 간결하게 작성한다.
  • 가능하면 재현 조건 및 실패 시나리오도 포함한다.
  • 제안은 현재 코드베이스(Spring Boot + JPA + Flyway) 패턴과 일치해야 한다.
  • 보안, 트랜잭션 경계, 예외 처리, N+1, 성능 회귀 가능성을 우선 점검한다.
  • 가독성: 변수/메서드 이름이 의도를 바로 드러내는지, 중첩과 메서드 길이가 과도하지 않은지 점검한다.
  • 단순화: 불필요한 추상화, 중복 로직, 과한 방어 코드가 있으면 더 단순한 대안을 제시한다.
  • 확장성: 새 요구사항 추가 시 변경 범위가 최소화되는 구조인지(하드코딩 분기/값 여부 포함) 점검한다.

Files:

  • src/main/java/gg/agit/konect/domain/website/service/WebsiteService.java
  • src/main/java/gg/agit/konect/domain/website/repository/WebsiteQueryRepository.java
  • src/main/java/gg/agit/konect/domain/website/dto/WebsiteClubDetailResponse.java
**/*

⚙️ CodeRabbit configuration file

**/*: 공통 리뷰 톤 가이드:

  • 모든 코멘트는 첫 줄에 [LEVEL: ...] 태그를 포함한다.
  • 과장된 표현 없이 사실 기반으로 작성한다.
  • 한 코멘트에는 하나의 이슈만 다룬다.
  • 코드 예시가 필요하면 최소 수정 예시를 제시한다.
  • 가독성/단순화/확장성 이슈를 발견하면 우선순위를 높여 코멘트한다.

Files:

  • src/main/java/gg/agit/konect/domain/website/service/WebsiteService.java
  • src/main/java/gg/agit/konect/domain/website/repository/WebsiteQueryRepository.java
  • src/test/java/gg/agit/konect/integration/domain/website/WebsiteApiTest.java
  • src/main/java/gg/agit/konect/domain/website/dto/WebsiteClubDetailResponse.java
🧠 Learnings (1)
📚 Learning: 2026-05-18T05:03:20.120Z
Learnt from: dh2906
Repo: BCSDLab/KONECT_BACK_END PR: 625
File: src/main/java/gg/agit/konect/domain/website/dto/WebsiteClubsResponse.java:0-0
Timestamp: 2026-05-18T05:03:20.120Z
Learning: 응답 DTO(또는 그 하위 클래스)의 필드에 `Schema(requiredMode = REQUIRED)`(또는 OpenAPI에서 필드를 required로 문서화)한다고 가정한 경우, 실제 런타임 계약이 비어있지 않음을 코드/DB로 보장해야 합니다. 구체적으로는 해당 값이 매핑되는 DB 컬럼이 `NOT NULL`이고(필요 시 Flyway 마이그레이션에서 기존 행 백필 후 `NOT NULL` 전환), 엔티티/필드에 `NotNull` 및 `Column(nullable = false)`(또는 동등한 검증/매핑 제약)가 선언되어 있으며, DTO/응답에서도 null이 허용되지 않도록 보장(검증/타입)하세요. 이 제약이 없는 상태에서 required로 문서화하면 리뷰 시 불일치로 플래그합니다.

Applied to files:

  • src/main/java/gg/agit/konect/domain/website/dto/WebsiteClubDetailResponse.java

@github-actions
Copy link
Copy Markdown

github-actions Bot commented May 22, 2026

🧪 JaCoCo Coverage Report (Changed Files)

Summary

  • Overall Coverage: 97.2% ✅
  • Covered Lines: 137 / 141
  • Changed Files: 3

Coverage by File

Class Coverage Lines Status
WebsiteQueryRepository
gg.agit.konect.domain.website.repository
96.3% 104/108
WebsiteService
gg.agit.konect.domain.website.service
100.0% 33/33

📊 View Workflow Run

- 대학별 동아리 수 계산이 웹사이트 동아리 조회 조건과 같은 기준을 재사용하도록 정리

- 추후 노출 조건이 공통 조건에 추가될 때 상세 응답의 university.clubCount만 다른 기준으로 계산되는 일을 방지

- 리뷰에서 지적된 집계 기준 드리프트 가능성을 최소 변경으로 해소
@dh2906 dh2906 merged commit f53b90a into develop May 22, 2026
5 checks passed
@dh2906 dh2906 deleted the feat/website-club-detail-university-summary branch May 22, 2026 02:46
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