Skip to content

Conversation

@stoneTiger0912
Copy link
Member

@stoneTiger0912 stoneTiger0912 commented Aug 5, 2025

📝 변경 내용


✅ 체크리스트

  • 코드가 정상적으로 동작함
  • 테스트 코드 통과함
  • 문서(README 등)를 최신화함
  • 코드 스타일 가이드 준수

💬 기타 참고 사항

Summary by CodeRabbit

  • 신규 기능

    • 그룹 가입 요청 및 관리 기능이 추가되었습니다. 이제 그룹에 가입 신청, 신청 목록 조회, 신청 승인/거절, 신청 취소 등이 가능합니다.
    • 그룹 생성 시 요청 및 응답 데이터 구조가 추가되었습니다.
    • 그룹 권한 및 가입 상태를 관리하는 Enum 및 관련 엔터티가 도입되었습니다.
  • 버그 수정

    • 그룹 및 사용자 정보 관련 일부 메서드의 파라미터 명칭이 일관성 있게 변경되었습니다.
  • 테스트

    • 그룹 가입 서비스 및 사용자 관련 테스트 픽스처가 추가되었습니다.
  • 기타

    • 그룹, 권한, 가입 관련 레포지토리에 다양한 조회 및 존재 여부 확인 메서드가 추가되었습니다.
    • 오류 코드 Enum이 추가되어 그룹 및 가입 관련 오류 메시지가 세분화되었습니다.

@stoneTiger0912 stoneTiger0912 self-assigned this Aug 5, 2025
@coderabbitai
Copy link

coderabbitai bot commented Aug 5, 2025

Walkthrough

이 변경사항은 그룹 가입(Join) 기능을 도입하며, 그룹 가입 요청, 응답, 삭제, 본인 신청 내역 조회 등 그룹 가입 관련 엔티티, 서비스, 컨트롤러, 모델, 예외, 리포지토리 계층을 추가합니다. 또한 기존 그룹 및 유저 관련 코드 일부의 파라미터, 타입, 명명 규칙을 정비하고, 테스트 픽스처 및 테스트 클래스도 추가되었습니다.

Changes

Cohort / File(s) Change Summary
Group Join Feature (Controller, Service, Entity, Model, Repository, Exception)
src/main/java/project/flipnote/groupjoin/controller/GroupJoinController.java, src/main/java/project/flipnote/groupjoin/service/GroupJoinService.java, src/main/java/project/flipnote/groupjoin/entity/GroupJoin.java, src/main/java/project/flipnote/groupjoin/entity/GroupJoinStatus.java, src/main/java/project/flipnote/groupjoin/model/GroupJoinRequest.java, src/main/java/project/flipnote/groupjoin/model/GroupJoinResponse.java, src/main/java/project/flipnote/groupjoin/model/GroupJoinListResponse.java, src/main/java/project/flipnote/groupjoin/model/GroupJoinRespondRequest.java, src/main/java/project/flipnote/groupjoin/model/GroupJoinRespondResponse.java, src/main/java/project/flipnote/groupjoin/model/FindGroupJoinListMeResponse.java, src/main/java/project/flipnote/groupjoin/repository/GroupJoinRepository.java, src/main/java/project/flipnote/groupjoin/exception/GroupJoinErrorCode.java
그룹 가입 요청/응답/삭제/조회 기능을 위한 컨트롤러, 서비스, 엔티티, 모델, 리포지토리, 예외 코드 신설.
Group Entity 및 권한 Enum/타입 개선
src/main/java/project/flipnote/group/entity/GroupPermission.java, src/main/java/project/flipnote/group/entity/GroupPermissionStatus.java, src/main/java/project/flipnote/group/entity/GroupRole.java, src/main/java/project/flipnote/group/entity/GroupRolePermission.java
그룹 권한 필드 타입을 String→Enum으로 변경, 관련 생성자 및 어노테이션 수정, 그룹 역할 Enum 삭제 및 역할 타입 참조 변경.
Group 관련 Repository 확장
src/main/java/project/flipnote/group/repository/GroupMemberRepository.java, src/main/java/project/flipnote/group/repository/GroupPermissionRepository.java, src/main/java/project/flipnote/group/repository/GroupRepository.java, src/main/java/project/flipnote/group/repository/GroupRolePermissionRepository.java
그룹 멤버/권한/역할/그룹 리포지토리에 쿼리 메서드 및 락 기능 추가.
Group 생성/서비스 및 DTO 추가
src/main/java/project/flipnote/group/controller/GroupController.java, src/main/java/project/flipnote/group/service/GroupService.java, src/main/java/project/flipnote/group/model/GroupCreateDto.java, src/main/java/project/flipnote/group/exception/GroupErrorCode.java
그룹 생성 DTO, 에러코드 추가 및 서비스/컨트롤러 파라미터 네이밍 및 일부 로직 개선.
User 모델 및 팩토리 메서드 네이밍 통일
src/main/java/project/flipnote/user/model/MyInfoResponse.java, src/main/java/project/flipnote/user/model/UserInfoResponse.java, src/main/java/project/flipnote/user/model/UserUpdateResponse.java
팩토리 메서드 파라미터명을 user→userProfile로 통일.
테스트 픽스처 및 신규 테스트 클래스
src/test/java/project/flipnote/fixture/UserFixture.java, src/test/java/project/flipnote/group/service/GroupServiceTest.java, src/test/java/project/flipnote/groupjoin/service/GroupJoinServiceTest.java
유저 픽스처 클래스 신설, 그룹/그룹조인 서비스 테스트 클래스(일부 주석 처리) 추가 및 변수명 정비.

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 + 응답
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20분

Possibly related PRs

Suggested labels

enhancement

Suggested reviewers

  • dungbik

Poem

🐇
그룹 가입, 문이 열렸네
신청하고, 응답하며,
토끼도 친구와 함께 뛰네!
권한과 상태, 깔끔하게 정비,
테스트도 한가득,
FlipNote 세상에
더 많은 친구들이 모인다네!
🥕

Note

⚡️ Unit Test Generation is now available in beta!

Learn more here, or try it out under "Finishing Touches" below.


📜 Recent review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 44f25d9 and 167246d.

📒 Files selected for processing (7)
  • src/main/java/project/flipnote/group/model/GroupCreateDto.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/exception/GroupJoinErrorCode.java (1 hunks)
  • src/main/java/project/flipnote/groupjoin/model/FindGroupJoinListMeResponse.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)
✅ Files skipped from review due to trivial changes (1)
  • src/main/java/project/flipnote/groupjoin/model/FindGroupJoinListMeResponse.java
🚧 Files skipped from review as they are similar to previous changes (5)
  • src/main/java/project/flipnote/group/service/GroupService.java
  • src/main/java/project/flipnote/groupjoin/repository/GroupJoinRepository.java
  • src/main/java/project/flipnote/groupjoin/exception/GroupJoinErrorCode.java
  • src/main/java/project/flipnote/group/model/GroupCreateDto.java
  • src/main/java/project/flipnote/groupjoin/controller/GroupJoinController.java
🔇 Additional comments (9)
src/main/java/project/flipnote/groupjoin/service/GroupJoinService.java (9)

43-47: 헬퍼 메소드 구현이 적절합니다.

활성 사용자 조회 로직이 명확하고 예외 처리도 적절합니다.


50-54: 그룹 조회 메소드가 올바르게 구현되었습니다.

간단하고 명확한 구현으로 적절한 예외 처리를 포함하고 있습니다.


57-59: 중복 신청 확인 로직이 적절합니다.

그룹과 사용자 ID를 통한 중복 확인이 올바르게 구현되었습니다.


61-71: 이전 리뷰 의견이 반영되어 Pessimistic Lock이 올바르게 사용되고 있습니다.

findByIdForUpdate로 획득한 lockedGroup 엔티티를 실제로 사용하여 동시성 문제가 해결되었습니다.


74-85: 권한 확인 로직이 적절하게 구현되었습니다.

그룹 멤버십과 권한을 체계적으로 확인하는 로직이 올바릅니다.


88-97: 그룹 가입 신청 조회 메소드들이 올바르게 구현되었습니다.

단순하고 명확한 레포지토리 조회 로직으로 적절한 예외 처리를 포함하고 있습니다.


100-135: 그룹 가입 신청 로직이 잘 구현되었습니다.

중복 확인, 공개 그룹 검증, 최대 인원 확인, 승인 필요 여부에 따른 상태 설정 등 모든 비즈니스 로직이 적절하게 처리되고 있습니다.


162-205: 이전 리뷰 의견이 반영되어 올바른 사용자가 그룹 멤버로 추가되고 있습니다.

가입 신청 승인 시 신청자(groupJoin.getUser())를 그룹 멤버로 추가하도록 수정되어 치명적인 로직 오류가 해결되었습니다.


209-243: 가입 신청 삭제 및 개인 신청 목록 조회 메소드가 적절합니다.

groupJoinDelete에서 그룹 ID 일치 확인과 본인 신청 확인 로직이 올바르며, findGroupJoinListMe의 개인 신청 목록 조회도 적절하게 구현되었습니다.

✨ Finishing Touches
  • 📝 Generate Docstrings
🧪 Generate unit tests
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch feat/group-application

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
🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>, please review it.
    • Explain this complex logic.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query. Examples:
    • @coderabbitai explain this code block.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.
    • @coderabbitai read src/utils.ts and explain its main purpose.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.

Support

Need help? Create a ticket on our support page for assistance with any issues or questions.

CodeRabbit Commands (Invoked using PR comments)

  • @coderabbitai pause to pause the reviews on a PR.
  • @coderabbitai resume to resume the paused reviews.
  • @coderabbitai review to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
  • @coderabbitai full review to do a full review from scratch and review all the files again.
  • @coderabbitai summary to regenerate the summary of the PR.
  • @coderabbitai generate docstrings to generate docstrings for this PR.
  • @coderabbitai generate sequence diagram to generate a sequence diagram of the changes in this PR.
  • @coderabbitai generate unit tests to generate unit tests for this PR.
  • @coderabbitai resolve resolve all the CodeRabbit review comments.
  • @coderabbitai configuration to show the current CodeRabbit configuration for the repository.
  • @coderabbitai help to get help.

Other keywords and placeholders

  • Add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.
  • Add @coderabbitai summary to generate the high-level summary at a specific location in the PR description.
  • Add @coderabbitai anywhere in the PR title to generate the title automatically.

CodeRabbit Configuration File (.coderabbit.yaml)

  • You can programmatically configure CodeRabbit by adding a .coderabbit.yaml file to the root of your repository.
  • Please see the configuration documentation for more information.
  • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json

Documentation and Community

  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

Copy link

@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: 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

📥 Commits

Reviewing files that changed from the base of the PR and between 0dce162 and 44f25d9.

📒 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: 적절한 리팩토링입니다!

GroupRoleGroupMemberRole로 변경한 것이 전체 코드베이스의 변경사항과 일치합니다.

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 상태 코드를 사용하고 있습니다.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancement New feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants