Conversation
* feat: 유저 프로필 엔티티 추가 * feat: 유저 프로필 레포 추가 * feat: 멀티프로필 DTO * feat: 유저 프로필 Mapper * feat: 유저 프로필 파일 타입 추가 * feat: 멀티프로필 생성, 조회 API 추가 * feat: 멀티프로필 생성, 조회 API 추가 * feat: 멀티프로필 수정 API 추가 * feat: 동아리별 멀티프로필 로직 추가 * feat: 동아리별 멀티프로필 API 추가 * feat: 멀티프로필 삭제 및 동시성 제어 추가 * feat: 내 동아리 목록에 사용 프로필 추가 * feat: 게시글 작성자 프로필을 멀티프로필에 맞춰 변경 * feat: 댓글 작성자 프로필을 멀티프로필에 맞춰 변경 * refactor: 작성자 프로필 매핑 중복 제거 * feat: 대시보드 게시글 작성자 정보 멀티프로필로 변경 * feat: 마이페이지 요약 조회 API 추가 * feat: 마이페이지 요약 조회 API 추가 * feat: 내가 쓴 글 조회 API 추가 * feat: 출석한 세션 조회 API 추가 * docs: 기존 동아리 프로필 API deprecated 표시 * refactor: 마이그레이션 쿼리 추가 * refactor: 기존 기능 삭제 * refactor: 리뷰 반영 * refactor: 리뷰 반영 * refactor: 리뷰 반영 * refactor: 무한스크롤로 변경 * refactor: 마이페이지 동아리 목록 기본값 제거 * refactor: 마이페이지 이미지 삭제 API 분리 * refactor: 멀티프로필 마이그레이션 버전 수정
* fix: v11 마이그레이션 수정 * refactor: 게시글 조회 생성시간 응답 * refactor: 멀티프로필 생성시 동아리 필수 선택
* refactor: 멀티프로필 응답 usingClubs 수정 * refactor: 마이페이지 게시글 isNew 응답 추가 * refactor: 마이페이지 활동을 동아리 기준으로 조회 * refactor: 홈 대시보드 사용자 정보 멀티프로필로 수정 * refactor: 게시글 조회 시간 Clock 주입으로 변경
* refactor: 마이페이지 요약에 현재 사용 중인 멀티프로필 추가 * refactor: 마이페이지 통계 현재 동아리 기준으로 수정 * feat: 프로필 사용 가능 동아리 목록 조회 추가 * refactor: 멤버 카운트 n+1 방지
- GET /admin/clubs/{clubId}/members를 PageResponse로 전환하고
기수 필터·이름/학과/학번 검색·정렬(ClubMemberSort) 지원
- 기수 정렬은 ClubMemberCardinal의 최대 기수번호 기준이라
Sort 프로퍼티로 표현할 수 없어 JPQL ORDER BY에서 처리
- 모든 정렬에 clubMemberId ASC 타이브레이커를 둬 페이지 경계 안정화
- 관리자용 멤버 상세 조회 추가 (WAITING/BANNED/LEFT 포함)
- 목록·상세 응답에 profileImageUrl, bio, joinedAt 추가
(멀티프로필 도입 이후 userProfile 우선, 레거시 필드 fallback)
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WwXeZkkPXJvbhj4UVBs1nU
- 멤버 목록 기본 size를 Figma 기준(10)에 맞춤 - JOINED_DESC 테스트가 createdAt 컬럼 정밀도에 의존하던 문제 해결. seed에서 네이티브 UPDATE로 가입일을 1분 간격으로 확정하고, 값이 실제로 서로 다른지 먼저 단언해 정밀도가 바뀌면 순서가 아니라 그 지점에서 실패하도록 함 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01WwXeZkkPXJvbhj4UVBs1nU
…따른-수정사항-반영 [WTH-468] 백엔드 패널티 관리 UI 변경에 따른 수정사항 반영
[WTH-475] 캘린더 api 구현
* feat: 마이페이지 stats에 페널티 수 추가 * feat: UserMyPageMapper에 페널티 매핑 추가 * feat: GetUserMyPageQueryService에 페널티 수 조회 추가 * feat: UserMyPenaltyResponse DTO 추가 * feat: GetUserPenaltyQueryService 추가 * feat: 마이페이지 페널티 목록 및 규정 조회 API 추가 * test: ClubMemberMyPageController 페널티 엔드포인트 테스트 추가 * fix: 페널티 규정 조회 시 동아리 멤버 여부 검증 추가 * fix: GetUserPenaltyQueryService @transactional 클래스 레벨로 이동 * chore: CI 트리거 * fix: GetPenaltyRuleQueryServiceTest clubMemberPolicy mock 추가
* feat: 어드민 일반 일정 목록 조회 API 추가 * test: 어드민 일반 일정 목록 조회 테스트 추가 * refactor: findAdminEvents → findEventsByAdmin 메서드명 수정 * fix: findEventsByAdmin 어드민 권한 검증 추가
* refactor: 경고 기능 동아리별 활성화 제한 제거 * chore: warning_enabled 컬럼 드롭 마이그레이션 추가 * fix: 경고 기능 리츠 전용 유지 및 페널티 타입 응답 필드 추가 - warningEnabled 필드 및 경고 비활성화 예외 복원 - V13 컬럼 드롭 마이그레이션 제거 - PenaltyDetailResponse에 penaltyType 필드 추가 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> --------- Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
* feat: 동아리 멤버 목록 조회 API 구현 * test: 멤버 목록 조회 테스트 추가 * feat: 동아리 멤버 작성 글 조회 api 구현 * feat: 동아리 멤버 조회 dto 정리 * feat: 동아리 멤버 상세 조회 응답에 학과 필드 추가 * feat: 동아리 멤버 목록 조회에 이름 검색 추가 * feat: User 엔티티에 개인정보 공개 여부 필드 추가 * feat: 멤버 상세 조회에 개인정보 공개 여부 반영 * feat: 마이페이지 응답에 개인정보 공개 여부 필드 추가 * refactor: GetUserPostQueryService 트랜잭션 어노테이션 클래스 레벨로 이동
* feat: 경고 2회 누적 시 패널티 1회 자동 전환 구현 * feat: 마이페이지 응답에 경고 횟수 필드 추가 * style: ktlint 포맷 수정 * refactor: 경고 자동 전환 조건을 if 블록 방식으로 변경 * refactor: 마이페이지 경고 횟수를 nullable로 변경 * feat: 어드민 멤버 목록 페널티 많은 순 정렬 추가
* fix: penalty_type 컬럼 WARNING 값 저장 안 되는 문제 수정 * fix: penalty_type을 varchar 대신 enum 확장으로 수정
핫픽스 v1.1.1(#108)을 dev에 반영한다. 충돌 14건은 모두 핫픽스와 무관한 기존 divergence였다. 릴리즈 1.1.0(#95)이 squash 형태로 main에 들어가면서 git 조상 관계가 끊겨, 동일 내용 파일이 양쪽에서 각각 추가된 것으로 인식된 결과다(add/add). main 쪽 내용이 dev 이력의 특정 커밋(#93/#94/#433)과 바이트 단위로 일치함을 전 파일 확인했고, dev가 그 위에 더 진행된 상태이므로 dev 버전을 취했다. AttendanceRepository.kt는 충돌 없이 자동 머지됐으나 양쪽 추가분이 모두 남아 메서드가 중복(Conflicting overloads)됐다. dev 버전이 main의 모든 메서드를 포함함을 확인하고 dev 버전으로 복원했다. 핫픽스 변경(Event/Session content TEXT, FileType pptx·docx, V12~V15)과 dev 최신 작업(#98 등) 양쪽 모두 유지됨을 확인했다. 검증: ktlintCheck, compileKotlin, compileTestKotlin, test 전체 통과 Refs: WTH-508 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: 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
chore: 핫픽스 v1.1.1 dev 역머지
관리자 화면이 게시판 추가 버튼을 언제 막아야 하는지 알 수 없었다. 상한은 이제 club마다 다를 수 있어(5bc8dc1) 프론트가 4를 상수로 들고 있을 수도 없다. 응답을 List에서 AdminBoardListResponse로 감싸고 activeBoardCount / maxBoardCount / canCreateBoard를 함께 내린다. canCreateBoard 판정은 Club.canAddBoard()를 그대로 쓰므로 생성 API의 실제 거부 조건과 어긋나지 않는다. 두 경로 모두 삭제되지 않은 게시판만 센다. 마이그레이션은 V17에서 V16으로 내린다. dev의 최신이 V15라 V16이 다음 번호이며, 빈 번호를 남기면 나중에 누가 V16을 쓸 때 out-of-order로 기동이 실패한다(flyway.out-of-order 미설정). 5bc8dc1 커밋 메시지와 PR 본문의 V17 언급은 이 커밋 기준으로 V16이다. Refs: WTH-509 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
* fix: 경고 2회 누적 시 페널티 자동 생성 Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LSnYQGCPrqJBzJRuVVJHCm * feat: 멤버 목록·상세에 경고 횟수 노출 Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LSnYQGCPrqJBzJRuVVJHCm * feat: 어드민 멤버 검색에 역할 필터 추가 Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LSnYQGCPrqJBzJRuVVJHCm * fix: 어드민 멤버 목록에서 탈퇴·추방 멤버 맨 뒤로 정렬 * refactor: QueryService @transactional을 클래스 레벨로 통일 * feat: 페널티 score 필드 전면 제거 * test: CARDINAL_ASC 정렬 테스트가 상태 우선순위 반영하도록 수정 Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LSnYQGCPrqJBzJRuVVJHCm * feat: 마이페이지 페널티 조회에 총 횟수,기수 필터 추가 --------- Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
V15__alter_event_session_content_to_text.sql과 버전이 겹쳐 dev 배포 시 FlywayException으로 앱이 계속 크래시했음
[WTH-509] 게시판 개수 상한을 club 단위로 관리
* feat: 커리어넷 학과 목록에 인공지능학과 보정 추가
외부 API(커리어넷)에 아직 등록되지 않은 인공지능학과를 이름 기준
중복 없이 목록에 포함시킨다.
* feat: 동아리 멤버 커스텀 포지션 지정 기능 추가
동아리 관리자가 포지션 옵션(이름/색상/순서, 최대 6개)을 정의하고
멤버별로 포지션을 지정/해제할 수 있는 API를 추가한다.
* feat: 멤버 포지션 일괄 지정/해제 API 추가
관리자가 여러 멤버를 선택해 동일한 포지션을 한 번에 지정하거나
해제할 수 있도록 벌크 액션 API를 추가한다. applyOb와 동일하게
정렬된 id 순서로 락을 걸어 데드락을 방지하고, 대상 중 하나라도
실패하면 전체를 롤백한다.
* feat: 멤버 검색 역할 필터를 keyword 통합 검색으로 변경
GET .../members/search의 memberRole 파라미터를 제거하고,
keyword가 역할 라벨("부원"/"리더"/"운영진")과 정확히 일치하면
이름/학과/학번 검색 대신 해당 역할로 필터링하도록 통합한다.
페이지네이션 목록(.../members)의 memberRole 드롭다운 필터는
그대로 유지한다.
* fix: 포지션 옵션 초과 메시지 하드코딩 제거
MAX_OPTION_COUNT 변경 시 예외 메시지가 자동으로 반영되도록
상수를 참조하게 한다.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
* fix: 동아리 성공 코드 번호 누락(11128) 수정
11127 다음이 11129로 건너뛰어 번호가 비어 있던 것을 재정렬한다.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
* refactor: 수동 추가 학과 목록을 설정값으로 분리
커리어넷 API 미등록 학과 보정 목록이 코드에 하드코딩되어 있어
학과 추가/삭제 시 재배포가 필요했다. UniversityProperties로
외부화해 application.yml만 수정해도 반영되게 한다.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
* feat: 포지션 색상을 hex 문자열에서 enum으로 변경
프론트가 hex 코드(#RRGGBB) 대신 PRIMARY/SECONDARY/PURPLE/PINK/
CAUTION/ERROR 같은 프리셋 이름으로 색상을 지정하도록 요청이 와서,
ClubPositionOption의 색상 필드를 PositionColor enum으로 바꾸고
관련 hex 검증 VO(ColorHex)를 제거한다.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
* feat: 멤버 목록 조회에 포지션 필터와 응답 필드 추가
동아리 멤버 목록/상세 조회에 positionOptionId 필터를 추가하고,
멤버 응답(public/detail)에 지정된 포지션 정보를 함께 내려준다.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
* fix: 학과 캐시 미스 테스트의 기대 개수 수정
인공지능학과 보정 추가로 목업 학과 20개가 21개로 반환되는데
테스트는 여전히 20개를 기대해 CI가 실패하고 있었다.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
V17(club_position_option)이 이미 DB에 적용된 V18(max_board_count) 보다 낮은 번호로 뒤늦게 병합되어 Flyway가 순서 위반으로 검증에 실패했다. V17→V19, V19(color enum)→V20으로 밀어 이미 적용된 V18 이후 순서가 되도록 정리한다. Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
fix: 수동 학과 환경변수 목록 지원
앱 기동에만 1분 이상 걸린다. dev 로그 기준 컨텍스트 초기화 40.9초에 Hikari/Flyway/Hibernate 초기화가 더해지는데, 기존 타임아웃 120초는 여유가 거의 없다. DB 마이그레이션이 동반되는 릴리스에서는 Flyway 실행 시간까지 붙어 정상 기동 중인 컨테이너가 헬스체크 실패로 판정돼 롤백될 수 있다. 블루-그린이라 장애로 이어지진 않지만 배포가 실패한다. prod/dev 모두 300초로 맞춘다. 환경변수 오버라이드 구조는 유지한다. Refs: WTH-522 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01R5mXcTtT9nQdHVET2CYWNy
…heck-timeout [WTH-522] 배포 헬스체크 타임아웃 300초로 상향
|
Important Review skippedAuto reviews are disabled on base/target branches other than the default branch. Please check the settings in the CodeRabbit UI or the ⚙️ Run configurationConfiguration used: Organization UI Review profile: CHILL Plan: Advanced Run ID: You can disable this status message by setting the Use the checkbox below for a quick retry:
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. Comment |
This branch was successfully deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
개요
dev→main릴리즈 PR입니다. 커밋 79개, 신규 Flyway 마이그레이션 4개가 포함됩니다.머지 후 드래프트 릴리스 v1.2.0 을 publish하면
deploy-prod가 실행됩니다.DB 마이그레이션 (prod 최초 적용)
현재 prod는
V15__alter_event_session_content_to_text.sql까지 반영되어 있습니다.penalty.score컬럼 삭제club.max_board_count추가 (기본 4) + 특정 club 12로 조정club_position_option테이블 생성 +club_member.position_option_idFK 추가color_hex→color컬럼 변경V17은 결번입니다. 번호 순서 역전을 정리하며 V17 → V19로 밀린 흔적이고, Flyway는 결번을 건너뛰므로 문제없습니다.
checksum 안전: V1~V15 파일이
main과dev에서 완전히 동일합니다 (전부 신규 추가, 기존 파일 수정 0건). prod의flyway_schema_history와 충돌하지 않습니다.클라이언트 호환 — 배포 순서 주의
응답 형태가 바뀐 어드민 API 2개가 있습니다.
maindevelopGET /admin/clubs/{clubId}/boardsAdminBoardListResponse)GET /admin/clubs/{clubId}/membersPageResponse, 기본size=10→ 서버 먼저 배포하고 클라이언트를 배포해야 합니다. 반대 순서면 어드민 부원 페이지가 깨집니다.
SavePenaltyRequest도userId: Long→userIds: List<Long>+ 사유@Size(max=20)로 바뀌었지만, 현재 prod 클라이언트에는 페널티 API 호출 자체가 없어 영향 없습니다.환경변수
${...}플레이스홀더 0건, 신규@Value0건.UniversityProperties는application.yml에 값이 커밋되어 들어가고 기본값도 있습니다NEXT_PUBLIC_FLAGSMITH_ENVIRONMENT_ID필요. 없어도 빌드/런타임은 멀쩡하지만club_warning_enabled가 전부 false로 떨어져 경고 기능 UI가 꺼진 채 배포됩니다배포 전 확인 필요
SELECT club_id, name FROM club WHERE club_id = 883010121028214452;결과가 0건이면 조용히 no-op으로 지나가고 해당 동아리는 게시판 상한 4에 묶인 채 남습니다flyway_schema_history의 V1~V15가 전부success이고 checksum 정상인지main인지 (publish 직전 재확인 — Release Drafter가 dev push마다 드래프트를 덮어씁니다)관련
🤖 Generated with Claude Code
https://claude.ai/code/session_01R5mXcTtT9nQdHVET2CYWNy