[WTH-468] 백엔드 패널티 관리 UI 변경에 따른 수정사항 반영 - #97
Hidden character warning
Conversation
|
Important
This repository does not receive automatic reviews because it has fewer than 10 stars. ⚙️ Run configurationConfiguration used: Organization UI Review profile: CHILL Plan: Pro Plus Run ID: 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 |
hyxklee
left a comment
There was a problem hiding this comment.
우선 어드민쪽 작업 먼저 리뷰를 했습니당
관련된 리뷰를 보시고, 일단 이번 PR에서 유저쪽은 다음 이슈로 분리해서 진행하는게 좋을 것 같아용
어드민 쪽에 달린 PR이 유저 쪽에서도 해당하는 경우가 많을테니 함께 수정하면서 작업을 해주시면 될 것 같습니당
고생하셨어요! 처음인데 크게 벗어나는 것 없이 작업이 되었네용
| var backgroundImageStorageKey: String? = backgroundImageStorageKey | ||
| private set | ||
|
|
||
| @Column(nullable = false) |
There was a problem hiding this comment.
DB 변경시 resources/db/migration에 마이그레이션 쿼리가 필요합니당
Flyway에 대해서 한 번 Claude와 함께 이야기해보고, 이해한 후에 추가해주세용
| var warningEnabled: Boolean = false | ||
| private set | ||
|
|
||
| @Column(length = 500) |
| @RequestParam(required = false) cardinalNumber: Int?, | ||
| @RequestParam(defaultValue = "0") page: Int, | ||
| @RequestParam(defaultValue = "20") size: Int, | ||
| ): CommonResponse<PageResponse<ClubMemberResponse>> { |
There was a problem hiding this comment.
검색의 경우는 Pagination이 굳이 없어도 될 것 같아요!
추가하신 별도의 의도가 있을까요??
| val score: Int = 1, | ||
| @field:Schema(description = "페널티 사유", example = "정기모임 무단 불참") | ||
| @field:NotBlank | ||
| val penaltyDescription: String, |
There was a problem hiding this comment.
사유가 디자인 스펙에는 몇 자인지 안 나타나있는 것 같네용 한 번 확인해서 반영해주세요!
|
|
||
| val penalty = mapper.toEntity(request, clubMember, cardinal) | ||
| penaltyRepository.save(penalty) | ||
| request.userIds.forEach { targetUserId -> |
There was a problem hiding this comment.
이렇게 내부에서 forEach를 통해 db에서 조회를 하게 되면 request.userIds 만큼 쿼리가 날라갑니당
해당 유스케이스의 경우에는 많은 인원을 선택해서 들어오는 경우는 적을 것 같긴 하지만, 이런 점을 인지하고 BE 개발을 하시면 좋습니당
BE는 항상 DB와 엮여있기 때문이에오
| clubMemberRepository.findByIdWithLock(clubMember.id) | ||
| ?: throw PenaltyNotFoundException() | ||
| lockedMember.incrementPenaltyCount() | ||
| if (request.penaltyType == PenaltyType.WARNING && !clubMember.club.warningEnabled) { |
There was a problem hiding this comment.
반복문 내부에서 경고 활성화 여부를 확인하고 있는 것 같네용
이렇게 되면 clubMember.club을 가져오면서 club을 조회하는 SELECT 문이 반복해서 나가게될 것 같아요 (FetchJoin을 이용하면 clubMember를 조회할 때 club도 같이 조회할 수 있습니다. 이건 FetchJoin, N+1 문제를 찾아보시면 좋아요)
디자인 스펙을 보면 경고/패널티는 한 번의 요청에서 섞이지 않는 것으로 나옵니당 WARGING인 경우는 반복문 밖 (위)에서 처리해주는게 좋아보여요
| class GetPenaltyRuleQueryService( | ||
| private val clubReader: ClubReader, | ||
| ) { | ||
| @Transactional(readOnly = true) |
There was a problem hiding this comment.
쿼리 서비스에서는 클래스에 @transactional(readOnly = true)를 다는 것이 컨벤션입니당
클로드가 못잡아줬나보네요..
| import org.springframework.web.bind.annotation.RestController | ||
|
|
||
| @Tag(name = "PENALTY", description = "패널티 API") | ||
| @Tag(name = "PENALTY", description = "페널티 API") |
There was a problem hiding this comment.
이번 작업은 어드민쪽 작업까지로 분리하고, 유저쪽은 PR을 나눠서 작업하면 좋을 것 같아용
BE는 FE에 비해 비교적 코드 양이 적기 때문에 500줄 정도면 큰 편으로 생각합니당
베스트는 300줄 이내, 큰 작업의 경우는 500줄 정도로 PR 볼륨을 잡고 작업을 분리하면서 하시면 좋을 것 같아요!
📌 Summary
페널티 관리 UI 개편에 맞춰 페널티 관련 API를 전반적으로 수정하고, 마이페이지 및 어드민 페이지에 페널티 관련 기능을 추가합니다.
📝 Changes
1. 페널티 부여 수정
POST /api/v4/admin/clubs/{clubId}/penaltiesuserIds: List<Long>)score: Int, 기본값 1) — 한 번에 여러 점수 부여 가능penaltyDescription: @NotBlank)2. 페널티 수정 추가
PUT /api/v4/admin/clubs/{clubId}/penalties/{penaltyId}ClubMember.penaltyCount/warningCount자동 delta 보정3. 페널티 삭제 수정
DELETE /api/v4/admin/clubs/{clubId}/penalties/{penaltyId}4. 어드민 멤버 페널티 상세 조회 신규
GET /api/v4/admin/clubs/{clubId}/penalties/members/{clubMemberId}5. 페널티 규정 저장 신규
PUT /api/v4/admin/clubs/{clubId}/penalties/rule6. 어드민 멤버 목록에 페널티 정보 추가
GET /api/v4/admin/clubs/{clubId}/memberspenaltyCount,lastPenaltyAt추가7. 마이페이지 stats에 페널티 갯수 추가
GET /api/v4/clubs/{clubId}/users/me/mypagestats.penaltyCount추가8. 마이페이지 페널티 목록 조회 신규
GET /api/v4/clubs/{clubId}/users/me/mypage/penaltiesSliceResponse)9. 마이페이지 페널티 규정 조회 신규
GET /api/v4/clubs/{clubId}/users/me/mypage/penalty-rule10. 한국어 표기 일괄 수정
11. 어드민 멤버 검색 조회 신규
GET /api/v4/admin/clubs/{clubId}/members/search페널티 / 경고 분리 현황
현재
PenaltyTypeenum으로PENALTY/WARNING두 타입이 구분되어 있으며,ClubMember에penaltyCount와warningCount가 별도로 관리됩니다.현재 상태:
Club.warningEnabled의 기본값이false이므로, 프론트에서penaltyType: "WARNING"을 전송하면WarningNotEnabledException이 발생합니다. 경고 타입은 현재 실제로 사용할 수 없습니다.경고 기능 활성화를 위해 필요한 것:
PUT /api/v4/admin/clubs/{clubId}/warning-enabled예정)warningEnabled = true설정 후 프론트에서penaltyType: "WARNING"전송 시warningCount증가테스트 항목
📸 Screenshots / Logs
💡 Reviewer 참고사항
슬랙에도 적어뒀는데 페널티에서 멤버 검색을 할때 해당 기수 전체 멤버 검색 api가 필요할 것 같습니다! 페널티 도메인보다 어드민 멤버 목록 API에 검색 파라미터 추가하거나 따로 공통 검색 API를 분리하는게 나을 것 같은데 어떻게 생각하시나욤...?? 의견 주시면 해당 피알이나 다음 피알에서 함께 반영해보겠습니닷...!!-> 구현 완료✅ Checklist