Skip to content
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

[COZY-492] feat: 방 추천에 대학교, 성별 필터링 추가 #252

Open
wants to merge 1 commit into
base: develop
Choose a base branch
from

Conversation

eple0329
Copy link
Member

@eple0329 eple0329 commented Jan 24, 2025

⚒️develop의 최신 커밋을 pull 받았나요?

#️⃣ 작업 내용

어떤 기능을 구현했나요?
기존 기능에서 어떤 점이 달라졌나요?
자세한 로직이 필요하다면 함께 적어주세요!
코드에 대한 설명이라면, 코맨트를 통해서 어떤 부분이 어떤 코드인지 설명해주세요!

Room 엔티티에 university와 gender 값이 들어오길 기다리다가, 일단 배포를 하게 되었으니 Mate를 통해서 필터링하도록 했습니다.
이후에 추가되게 되면 다시 원상복구 시키고, Room 엔티티를 참조하도록 하겠습니다.

동작 확인

기능을 실행했을 때 정상 동작하는지 여부를 확인하고 스샷을 올려주세요

기존에 성별이 동일할 때 검색 결과 -> 우심방 나옴

SCR-20250124-qlpg

델로롱을 여자로 변경 (우심방의 방장임)

SCR-20250124-qlrb

이후 검색 결과 -> 우심방이 나오지 않음

SCR-20250124-qlrx

기존에 대학이 같을 때 검색 결과 -> 우심방 나옴

SCR-20250124-qnse

델로롱을 인하대에서 다른 학교로 변경 (우심방의 방장임)

SCR-20250124-qntc

이후 검색 결과 -> 우심방이 나오지 않음

SCR-20250124-qnub

💬 리뷰 요구사항(선택)

리뷰어가 특별히 봐주었으면 하는 부분이 있다면 작성해주세요
고민사항도 적어주세요.

개발하면서 점점 많이 알아가고 있는 중입니다.
근데 Member와 MemberStat의 연관 관계의 주인이 MemberStat이라 불필요한 N+1 쿼리가 계속 날라가게 됩니다.
이 연관관계는 주종 관계를 바꾸는게 좋을 것 같습니다. (Member가 주인이고, MemberStat에서 mapped By로 참조하는 식으로)

Summary by CodeRabbit

  • 새로운 기능

    • 메이트 저장소에 새로운 쿼리 메서드 추가
    • 방 추천 서비스에 대학 및 성별 기반 필터링 로직 도입
  • 개선 사항

    • 방 추천 서비스에 로깅 기능 추가
    • 방 필터링 프로세스 최적화

Copy link

coderabbitai bot commented Jan 24, 2025

Walkthrough

이 변경 사항은 두 개의 주요 Java 클래스에 대한 수정을 포함합니다. MateRepository 인터페이스에 새로운 메서드가 추가되었으며, 이 메서드는 방 ID 목록, 방 관리자 상태, 입장 상태를 기반으로 Mate 엔티티를 조회할 수 있게 합니다. 동시에 RoomRecommendService 클래스에는 Lombok의 @Slf4j 로깅 어노테이션이 추가되고, getRoomList 메서드의 필터링 로직이 개선되었습니다. 새로운 필터링 로직은 방 관리자의 대학과 성별을 기준으로 방 목록을 세부적으로 제한합니다.

Sequence Diagram

sequenceDiagram
    participant Member
    participant RoomRecommendService
    participant MateRepository
    
    Member->>RoomRecommendService: getRoomList() 요청
    RoomRecommendService->>MateRepository: findAllByRoomIdListAndIsRoomManagerAndEntryStatus()
    MateRepository-->>RoomRecommendService: Mate 엔티티 목록 반환
    RoomRecommendService->>RoomRecommendService: 대학 및 성별 필터링
    RoomRecommendService-->>Member: 필터링된 방 목록 반환
Loading
✨ Finishing Touches
  • 📝 Generate Docstrings (Beta)

Thank you for using CodeRabbit. We offer it for free to the OSS community and would appreciate your support in helping us grow. If you find it useful, would you consider giving us a shout-out on your favorite social media?

❤️ 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.
    • Generate unit testing code for this file.
    • 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 generate unit testing code for this file.
    • @coderabbitai modularize this function.
  • 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 generate unit testing code.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.
    • @coderabbitai help me debug CodeRabbit configuration file.

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

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. (Beta)
  • @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: 0

🧹 Nitpick comments (1)
src/main/java/com/cozymate/cozymate_server/domain/mate/repository/MateRepository.java (1)

116-125: FETCH JOIN 시 중복 레코드 문제에 주의하세요
JOIN FETCH를 사용해 room, member, university 정보를 한 번에 불러오는 것은 N+1 문제를 줄이는 데 유용합니다. 다만 DISTINCT 키워드를 사용하지 않으면, 다대일 관계나 다대다 관계에서 중복 레코드가 발생할 수 있으니 필요할 경우 SELECT DISTINCT mt FROM ~ 형태를 고려해 보세요. 또한 roomIdList가 매우 클 때는 쿼리 성능 테스트를 통해 부하를 점검하면 좋겠습니다.

📜 Review details

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

📥 Commits

Reviewing files that changed from the base of the PR and between 7771976 and a16e98c.

📒 Files selected for processing (2)
  • src/main/java/com/cozymate/cozymate_server/domain/mate/repository/MateRepository.java (1 hunks)
  • src/main/java/com/cozymate/cozymate_server/domain/room/service/RoomRecommendService.java (2 hunks)
🔇 Additional comments (2)
src/main/java/com/cozymate/cozymate_server/domain/room/service/RoomRecommendService.java (2)

29-36: @Slf4j 어노테이션 도입을 환영합니다
로그를 남길 수 있어 운영 및 디버깅에 도움이 됩니다. 로깅 레벨 설정이나 민감정보 마스킹에 유의해 주세요.


116-129: stream().forEach()에서 roomList를 직접 제거하는 로직 수정 검토
필터 조건(대학교/성별)에 맞지 않는 Room을 제거하기 위해 managerList.stream()...forEach(roomList::remove())를 사용하는 패턴은, 반복 중에 리스트에서 요소를 제거하기 때문에 유지보수성 측면에서 혼동을 줄 수 있습니다. 다음과 같은 방안을 고려해 보세요.

  1. 제거 대상 Room을 별도의 집합(Set)으로 수집 후, 한 번에 제거하기
  2. 단일 스트림 체이닝으로 필터 후 collect(...) 하는 방식으로 roomList를 재할당

또한 manager.getMember().getUniversity() 혹은 manager.getMember().getGender()null일 수 있는지 확인하여 널 체크 로직을 추가할 필요가 없는지 점검해 보세요.

필요하다면 다음 스크립트를 통해 Member가 항상 null이 아닌 universitygender를 가진다고 보장되는지 확인할 수 있습니다:

Comment on lines +116 to +125
@Query("""
SELECT mt FROM Mate mt
JOIN FETCH mt.room r
JOIN FETCH mt.member m
JOIN FETCH m.university u
WHERE mt.room.id IN :roomIdList
AND mt.isRoomManager = :isRoomManager
AND mt.entryStatus = :entryStatus
""")
List<Mate> findAllByRoomIdListAndIsRoomManagerAndEntryStatus(List<Long> roomIdList, boolean isRoomManager, EntryStatus entryStatus);
Copy link
Member Author

Choose a reason for hiding this comment

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

가져온 방의 id를 바탕으로 방장의 정보를 가져옵니다.
방장의 roomId가 무엇인지 알아야하기 때문에 room과 join을 했고
대학 id가 무엇인지 알아야하기 때문에 member university와 join을 했습니다.

Comment on lines +120 to +128
// 대학 필터링
managerList.stream()
.filter(manager -> !manager.getMember().getUniversity().getId().equals(member.getUniversity().getId()))
.forEach(manager -> roomList.remove(manager.getRoom()));

// 성별 필터링
managerList.stream()
.filter(manager -> !manager.getMember().getGender().equals(member.getGender()))
.forEach(manager -> roomList.remove(manager.getRoom()));
Copy link
Member Author

Choose a reason for hiding this comment

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

단순 필터링입니다.
좀 더 읽기 편하라고 이렇게 작성했습니다.
어차피 이후에 room에 추가되면 삭제될 코드이기도 하고요

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