-
Notifications
You must be signed in to change notification settings - Fork 0
Feat: [FN-68][FN-69][FN-70][FN-71][FN-72] 그룹 가입 신청 #23
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
Walkthrough이 변경사항은 그룹 가입(Join) 기능을 도입하며, 그룹 가입 요청, 응답, 삭제, 본인 신청 내역 조회 등 그룹 가입 관련 엔티티, 서비스, 컨트롤러, 모델, 예외, 리포지토리 계층을 추가합니다. 또한 기존 그룹 및 유저 관련 코드 일부의 파라미터, 타입, 명명 규칙을 정비하고, 테스트 픽스처 및 테스트 클래스도 추가되었습니다. Changes
Sequence Diagram(s)sequenceDiagram
participant User as 사용자(AuthPrinciple)
participant Controller as GroupJoinController
participant Service as GroupJoinService
participant Repo as GroupJoinRepository
participant GroupRepo as GroupRepository
User->>Controller: 그룹 가입 요청(POST /groups/{groupId}/joins)
Controller->>Service: joinRequest(auth, groupId, req)
Service->>GroupRepo: findByIdForUpdate(groupId)
Service->>Repo: existsByGroup_idAndUser_id(groupId, userId)
Service->>Repo: 저장/상태변경/멤버추가 등
Service-->>Controller: GroupJoinResponse
Controller-->>User: 201 Created + 응답
Estimated code review effort🎯 3 (Moderate) | ⏱️ ~20분 Possibly related PRs
Suggested labels
Suggested reviewers
Poem
Note ⚡️ Unit Test Generation is now available in beta!Learn more here, or try it out under "Finishing Touches" below. 📜 Recent review detailsConfiguration used: CodeRabbit UI 📒 Files selected for processing (7)
✅ Files skipped from review due to trivial changes (1)
🚧 Files skipped from review as they are similar to previous changes (5)
🔇 Additional comments (9)
✨ Finishing Touches
🧪 Generate unit tests
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. 🪧 TipsChatThere are 3 ways to chat with CodeRabbit:
SupportNeed help? Create a ticket on our support page for assistance with any issues or questions. CodeRabbit Commands (Invoked using PR comments)
Other keywords and placeholders
CodeRabbit Configuration File (
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 13
🧹 Nitpick comments (1)
src/main/java/project/flipnote/group/repository/GroupRepository.java (1)
17-17: 불필요한 명시적 메서드 선언입니다.
JpaRepository가 이미findById(ID id)메서드를 제공하므로 명시적 선언이 불필요합니다. 특별한 이유가 없다면 제거하는 것을 권장합니다.특별한 커스텀 동작이 필요하지 않다면 다음 라인을 제거하세요:
- Optional<Group> findById(Long groupId);
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (31)
src/main/java/project/flipnote/group/controller/GroupController.java(1 hunks)src/main/java/project/flipnote/group/entity/GroupPermission.java(2 hunks)src/main/java/project/flipnote/group/entity/GroupPermissionStatus.java(1 hunks)src/main/java/project/flipnote/group/entity/GroupRole.java(0 hunks)src/main/java/project/flipnote/group/entity/GroupRolePermission.java(1 hunks)src/main/java/project/flipnote/group/exception/GroupErrorCode.java(1 hunks)src/main/java/project/flipnote/group/model/GroupCreateDto.java(1 hunks)src/main/java/project/flipnote/group/repository/GroupMemberRepository.java(1 hunks)src/main/java/project/flipnote/group/repository/GroupPermissionRepository.java(1 hunks)src/main/java/project/flipnote/group/repository/GroupRepository.java(1 hunks)src/main/java/project/flipnote/group/repository/GroupRolePermissionRepository.java(1 hunks)src/main/java/project/flipnote/group/service/GroupService.java(5 hunks)src/main/java/project/flipnote/groupjoin/controller/GroupJoinController.java(1 hunks)src/main/java/project/flipnote/groupjoin/entity/GroupJoin.java(1 hunks)src/main/java/project/flipnote/groupjoin/entity/GroupJoinStatus.java(1 hunks)src/main/java/project/flipnote/groupjoin/exception/GroupJoinErrorCode.java(1 hunks)src/main/java/project/flipnote/groupjoin/model/FIndGroupJoinListMeResponse.java(1 hunks)src/main/java/project/flipnote/groupjoin/model/GroupJoinListRequest.java(1 hunks)src/main/java/project/flipnote/groupjoin/model/GroupJoinListResponse.java(1 hunks)src/main/java/project/flipnote/groupjoin/model/GroupJoinRequest.java(1 hunks)src/main/java/project/flipnote/groupjoin/model/GroupJoinRespondRequest.java(1 hunks)src/main/java/project/flipnote/groupjoin/model/GroupJoinRespondResponse.java(1 hunks)src/main/java/project/flipnote/groupjoin/model/GroupJoinResponse.java(1 hunks)src/main/java/project/flipnote/groupjoin/repository/GroupJoinRepository.java(1 hunks)src/main/java/project/flipnote/groupjoin/service/GroupJoinService.java(1 hunks)src/main/java/project/flipnote/user/model/MyInfoResponse.java(1 hunks)src/main/java/project/flipnote/user/model/UserInfoResponse.java(1 hunks)src/main/java/project/flipnote/user/model/UserUpdateResponse.java(1 hunks)src/test/java/project/flipnote/fixture/UserFixture.java(1 hunks)src/test/java/project/flipnote/group/service/GroupServiceTest.java(5 hunks)src/test/java/project/flipnote/groupjoin/service/GroupJoinServiceTest.java(1 hunks)
💤 Files with no reviewable changes (1)
- src/main/java/project/flipnote/group/entity/GroupRole.java
🔇 Additional comments (41)
src/main/java/project/flipnote/group/model/GroupCreateDto.java (1)
34-40: 정적 팩토리 메서드 사용이 좋습니다.
Response레코드에서 정적 팩토리 메서드from()을 사용한 것은 객체 생성의 의도를 명확히 하고 가독성을 높이는 좋은 패턴입니다.src/main/java/project/flipnote/group/exception/GroupErrorCode.java (1)
13-13: 새로운 에러 코드가 잘 정의되었습니다.
GROUP_NOT_FOUND에러 코드가 기존 패턴을 잘 따르고 있습니다:
- 적절한 HTTP 상태 코드 (404)
- 순차적인 코드 번호 (GROUP_002)
- 명확한 한국어 메시지
src/main/java/project/flipnote/groupjoin/entity/GroupJoinStatus.java (1)
3-5: 그룹 가입 상태 enum이 잘 정의되었습니다.그룹 가입 요청의 생명주기를 잘 표현하는 4개의 상태(ACCEPT, PENDING, REJECT, CANCEL)가 명확하게 정의되어 있습니다.
src/main/java/project/flipnote/group/entity/GroupPermissionStatus.java (1)
3-5: 권한 상태를 enum으로 정의한 것이 좋습니다.String 타입에서 enum으로 변경하여 타입 안전성을 높였고, 그룹 권한의 종류(INVITE, KICK, JOIN_REQUEST_MANAGE)가 명확하게 정의되었습니다.
src/main/java/project/flipnote/user/model/MyInfoResponse.java (1)
25-37: 매개변수 이름 변경이 적절합니다.
user에서userProfile로 매개변수 이름을 변경하여 실제 타입(UserProfile)을 더 명확하게 표현하였고, 메서드 내부의 모든 참조도 일관되게 업데이트되었습니다.src/main/java/project/flipnote/group/repository/GroupPermissionRepository.java (2)
7-7: enum import가 적절히 추가되었습니다.새로운 GroupPermissionStatus enum을 사용하기 위한 import가 올바르게 추가되었습니다.
11-11: repository 메서드가 적절히 정의되었습니다.GroupPermissionStatus enum을 매개변수로 받는 findByName 메서드가 Spring Data JPA 명명 규칙에 따라 올바르게 정의되었습니다. 이는 타입 안전한 권한 조회를 가능하게 합니다.
src/main/java/project/flipnote/group/controller/GroupController.java (2)
26-26: 매개변수 이름 변경이 일관성을 향상시킵니다.
userAuth에서authPrinciple로 매개변수 이름을 변경하여 서비스 계층과의 일관성을 높였습니다.
28-28: 서비스 호출도 일관되게 업데이트되었습니다.변경된 매개변수 이름
authPrinciple을 사용하여 서비스 메서드를 호출하도록 올바르게 업데이트되었습니다.src/main/java/project/flipnote/user/model/UserInfoResponse.java (1)
11-12: 매개변수 이름 변경으로 코드 명확성 향상
user에서userProfile로 매개변수 이름을 변경한 것이 타입명과 일치하여 더 명확합니다. 다른 사용자 응답 모델들과의 일관성도 개선되었습니다.src/main/java/project/flipnote/group/entity/GroupRolePermission.java (2)
36-36: 생성자 매개변수 타입 일관성 유지생성자의
GroupMemberRole매개변수 타입이 필드 타입과 일치하여 일관성이 유지되었습니다.
33-33: 데이터베이스 스키마 호환성 확인 필요
GroupRolePermission엔티티의role필드가GroupMemberRole로 변경되었으며, @table(name="group_role_permissions")의 uniqueConstraints 컬럼명은 여전히role로 설정되어 있습니다. 코드베이스에서 마이그레이션 스크립트를 찾지 못했으므로, 아래 위치를 직접 검토해 주세요:
- GroupMemberRole enum 정의
– src/main/java/project/flipnote/group/entity/GroupMemberRole.java- @table 어노테이션의 uniqueConstraints 설정
– src/main/java/project/flipnote/group/entity/GroupRolePermission.java (컬럼명role확인)- 실제 DB 마이그레이션 스크립트(폴더 경로 및 파일)에서
group_role_permissions제약조건 변경 내역위 사항을 검증한 후 문제가 없다면 승인 부탁드립니다.
src/main/java/project/flipnote/user/model/UserUpdateResponse.java (1)
13-16: 일관된 매개변수 명명으로 코드 가독성 향상다른 사용자 응답 모델들과 동일하게 매개변수 이름을
userProfile로 변경하여 일관성을 유지했습니다. 코드의 명확성이 개선되었습니다.src/main/java/project/flipnote/group/repository/GroupRolePermissionRepository.java (2)
5-7: 필요한 import 추가 확인새로운 repository 메서드를 위해 추가된 import들이 적절합니다.
GroupMemberRole타입 변경과 일치합니다.
13-13: Repository 메서드 구현이 올바름Spring Data JPA 네이밍 규칙을 따르는 메서드명으로, 그룹 내 특정 역할의 권한 존재 여부를 확인하는 기능이 명확합니다. 그룹 가입 기능에 필요한 권한 검증 로직에 활용될 것으로 보입니다.
src/main/java/project/flipnote/groupjoin/model/GroupJoinRespondResponse.java (1)
3-9: LGTM! 간단하고 명확한 응답 모델입니다.Record 패턴을 적절히 활용했고, 정적 팩토리 메서드도 잘 구현되어 있습니다.
src/main/java/project/flipnote/group/entity/GroupPermission.java (1)
21-28: 타입 안전성 개선이 잘 이루어졌습니다.String에서 GroupPermissionStatus 열거형으로 변경하여 타입 안전성을 크게 향상시켰습니다.
@Enumerated(EnumType.STRING)사용도 적절합니다.src/main/java/project/flipnote/groupjoin/model/FIndGroupJoinListMeResponse.java (1)
10-12: 정적 팩토리 메서드 구현이 적절합니다.from() 메서드를 통한 인스턴스 생성 패턴이 잘 구현되어 있습니다.
src/main/java/project/flipnote/groupjoin/model/GroupJoinResponse.java (1)
5-11: 잘 구조화된 응답 모델입니다.GroupJoinStatus 열거형을 사용하여 상태를 타입 안전하게 관리하고 있고, 정적 팩토리 메서드도 적절히 구현되어 있습니다.
src/main/java/project/flipnote/group/repository/GroupMemberRepository.java (2)
15-15: 적절한 조회 메서드 추가입니다.
Optional<GroupMember>를 반환하는 것은 좋은 관례이며, 그룹과 사용자 조합으로 멤버를 조회하는 로직에 적합합니다.
17-17: 그룹 멤버 수 조회 메서드가 잘 구현되었습니다.Spring Data JPA의 네이밍 컨벤션을 따르고 있으며, 그룹 가입 제한 검증 등에 유용할 것입니다.
src/test/java/project/flipnote/group/service/GroupServiceTest.java (3)
23-23: 새로운 테스트 유틸리티와 열거형 임포트가 적절합니다.도메인 모델 리팩토링에 맞춰
UserFixture테스트 유틸리티와GroupPermissionStatus열거형을 임포트한 것이 올바릅니다.Also applies to: 27-27
55-55: 변수명 변경이 명확성을 향상시킵니다.
userRepository에서userProfileRepository로 변경하여 이 저장소가UserProfile엔티티를 다룬다는 것을 명확히 표현했습니다.
63-63: 필드 변수명 변경이 일관성을 제공합니다.
user에서userProfile로 변경하여 실제 엔티티 타입과 일관된 명명을 사용하고 있습니다.src/main/java/project/flipnote/groupjoin/repository/GroupJoinRepository.java (2)
12-13: 표준 Spring Data JPA 패턴을 올바르게 따르고 있습니다.인터페이스 선언이 적절하고 제네릭 타입이 엔티티와 기본 키 타입에 맞게 설정되었습니다.
14-14: 쿼리 메서드 명명이 명확하고 적절합니다.Spring Data JPA 명명 규칙을 따르며 메서드 이름이 기능을 명확히 표현하고 있습니다.
Also applies to: 16-16
src/main/java/project/flipnote/group/repository/GroupRepository.java (2)
4-5: 새로운 기능을 위한 임포트가 적절히 추가되었습니다.비관적 잠금과 명시적 메서드 선언을 위한 필요한 임포트들이 올바르게 추가되었습니다.
Also applies to: 8-8, 10-11, 12-13
19-21: 동시성 제어를 위한 비관적 잠금 구현이 적절합니다.그룹 가입 요청 처리 시 동시성 문제를 방지하기 위한 비관적 쓰기 잠금이 올바르게 구현되었습니다. JPQL 쿼리와 락 모드 설정이 적절합니다.
src/test/java/project/flipnote/fixture/UserFixture.java (3)
9-10: 테스트용 상수 정의가 적절합니다.재사용 가능한 테스트 데이터를 상수로 정의하여 테스트 코드의 일관성을 제공합니다.
12-21: 포괄적인 테스트 사용자 생성 메서드입니다.빌더 패턴을 사용하여 현실적인 테스트 데이터로
UserProfile을 생성하며, 한국어 컨텍스트에 적합한 데이터를 포함하고 있습니다.
22-22: 리플렉션을 통한 ID 설정이 적절합니다.Spring의
ReflectionTestUtils를 사용하여 private ID 필드를 설정하는 것은 테스트에서 일반적이고 적절한 방법입니다.src/main/java/project/flipnote/groupjoin/entity/GroupJoin.java (5)
22-30: JPA 엔티티 선언이 모범 사례를 따르고 있습니다.적절한 어노테이션 사용, 설명적인 테이블명, 그리고 올바른 ID 생성 전략을 사용하고 있습니다.
32-38: 관계 매핑이 올바르게 설정되었습니다.지연 로딩, 적절한 조인 컬럼명, 그리고 데이터 무결성을 위한 non-nullable 제약조건이 올바르게 설정되었습니다.
40-44: 상태 및 소개 필드가 적절히 설계되었습니다.열거형을 문자열로 저장하는 방식과 적절한 null 허용 정책이 잘 설정되었습니다.
46-60: 빌더 패턴 구현이 적절합니다.필요한 모든 필드를 포함하며 매개변수 순서와 가독성이 좋습니다.
62-64: 상태 업데이트 메서드가 단순하고 명확합니다.단일 책임을 가진 간단한 메서드로 가입 요청 상태 변경에 적합합니다.
src/main/java/project/flipnote/group/service/GroupService.java (2)
26-26: 좋은 변경사항입니다!
UserStatus.ACTIVE필터링을 추가하여 활성 사용자만 조회하도록 한 것은 적절한 보안 조치입니다.Also applies to: 43-47
77-87: 적절한 리팩토링입니다!
GroupRole을GroupMemberRole로 변경한 것이 전체 코드베이스의 변경사항과 일치합니다.src/main/java/project/flipnote/groupjoin/service/GroupJoinService.java (2)
99-134: 잘 구현된 가입 신청 로직입니다!검증 순서와 상태 할당 로직이 적절하게 구현되었습니다.
207-231: 적절한 삭제 로직 구현Soft delete 방식으로 상태를 CANCEL로 변경하는 것은 감사 추적에 좋은 접근입니다.
src/main/java/project/flipnote/groupjoin/controller/GroupJoinController.java (1)
20-75: 잘 구성된 컨트롤러 구현입니다!RESTful 규칙을 잘 따르고 있으며, 적절한 HTTP 상태 코드를 사용하고 있습니다.
📝 변경 내용
✅ 체크리스트
💬 기타 참고 사항
Summary by CodeRabbit
신규 기능
버그 수정
테스트
기타