Skip to content

Conversation

@buzz0331
Copy link
Contributor

@buzz0331 buzz0331 commented Jul 15, 2025

#️⃣ 연관된 이슈

closes #80

📝 작업 내용

패키지 구조를 다음과 같이 정리했습니다.

  1. persistence 패키지 하위에 adapter와 repository가 같이 있어 구분이 어려워 repository 패키지를 만들어 구분하였습니다. (conflict 방지를 위해 Feed와 Post 제외)
  2. UserRoom을 Room 패키지 하위로 옮기고 RoomParticipant로 이름을 변경하였습니다. 자세한 변경사항은 노션에 정리해두었으니 확인 부탁드릴게요!
  3. UserVote도 마찬가지로 VoteParticipant로 이름을 변경하였습니다.
  4. User 안의 Following이라는 도메인을 따로 패키지를 뺄까 생각하였지만 결국 User를 루트 도메인으로 가지는 애그리거트라고 판단해서 User 패키지 하위에 service와 repository 패키지에서만 following이라는 패키지로 따로 구분해두었습니다.

추가적으로 Room에 memberCount를 추가했습니다. 방 참여 api를 만들때 memberCount를 증가시켜주면 될 것 같습니다! 현재 방의 멤버수를 구하는 count 쿼리를 제가 건드리는 것은 어려울 것 같아 각자 맡으신 분이 리팩해주시면 될 것 같아요~

💬 리뷰 요구사항

Post 패키지 하위에 있는 PostLike와 Content를 어떻게 할지 고민인데, 일단은 두 도메인 모두 Record, Feed, Vote에서 공통으로 사용되기 때문에 postBase 패키지로 adapter.in 만 없이 유지시킬까 생각중입니다! 이 부분에 대해서 다른 의견 있으신 분이 있다면 커멘드 주시면 감사하겠습니다~

📌 PR 진행 시 이러한 점들을 참고해 주세요

* P1 : 꼭 반영해 주세요 (Request Changes) - 이슈가 발생하거나 취약점이 발견되는 케이스 등
* P2 : 반영을 적극적으로 고려해 주시면 좋을 것 같아요 (Comment)
* P3 : 이런 방법도 있을 것 같아요~ 등의 사소한 의견입니다 (Chore)

Summary by CodeRabbit

  • 신규 기능

    • 방 참가자 역할 및 관리 기능이 추가되었습니다. (RoomParticipant, RoomParticipantRole 등)
    • 방 참가자 관련 조회 및 커맨드 포트가 신설되었습니다.
  • 리팩터

    • 기존 UserRoom, UserVote 등 엔티티와 관련 클래스가 RoomParticipant, VoteParticipant 등으로 명칭 및 구조가 변경되었습니다.
    • 여러 도메인 및 패키지 구조가 일관성 있게 재정비되었습니다.
    • 멤버 수(memberCount) 필드가 방(Room)에 추가되어 방의 인원 수를 관리할 수 있습니다.
  • 버그 수정

    • 일부 오류 코드 및 메시지가 명확하게 수정되었습니다.
  • 테스트

    • 테스트 코드가 새로운 엔티티 및 패키지 구조에 맞게 전면적으로 수정되었습니다.
  • 기타

    • 불필요하거나 사용되지 않는 인터페이스 및 클래스가 정리되었습니다.
    • 패키지명 대소문자 일관성 및 오타가 수정되었습니다.

buzz0331 added 20 commits July 15, 2025 14:35
@coderabbitai
Copy link

coderabbitai bot commented Jul 15, 2025

Walkthrough

이번 변경은 전반적인 패키지 구조 정리와 함께, 도메인 엔티티 및 레포지토리의 네이밍 및 위치를 일관성 있게 재구성하였습니다. 주요 엔티티와 매퍼, 레포지토리, 포트 인터페이스, 서비스, 예외 코드 등이 새로운 패키지 구조에 맞게 이동·명명되었으며, 관련 테스트 코드도 이에 맞추어 수정되었습니다.

Changes

파일/그룹 변경 요약
.../attendanceCheck/..., .../attendancecheck/... 패키지명 대소문자 일관성 정리 및 관련 파일 이동, 빈 인터페이스 삭제 후 재생성
.../book/adapter/out/api/..., .../book/adapter/out/persistence/..., .../book/application/service/... 패키지 경로 정정 및 import 경로 수정
.../comment/adapter/out/persistence/... import 경로 수정
.../notification/adapter/out/persistence/... import 경로 수정
.../recentSearch/adapter/out/persistence/... 레포지토리 import 경로 수정 및 필드 추가
.../record/adapter/out/persistence/... 레포지토리 import 경로 수정
.../room/adapter/out/jpa/RoomJpaEntity.java, .../room/domain/Room.java, .../room/adapter/out/mapper/RoomMapper.java Room 엔티티 및 매퍼에 memberCount 필드 추가 및 매핑 반영
.../room/adapter/out/jpa/RoomParticipantJpaEntity.java, .../room/domain/RoomParticipant.java, .../room/domain/RoomParticipants.java, .../room/adapter/out/mapper/RoomParticipantMapper.java UserRoom → RoomParticipant로 명칭 및 위치 변경, 관련 필드/메서드명 일치화, 매퍼 신규 생성
.../room/adapter/out/persistence/repository/RoomParticipantJpaRepository.java RoomParticipantJpaRepository 신규 생성, 쿼리 메서드 정의
.../room/adapter/out/persistence/RoomParticipantCommandPersistenceAdapter.java RoomParticipantCommandPersistenceAdapter 신규 생성, RoomParticipantCommandPort 구현
.../room/application/port/out/RoomParticipantCommandPort.java, RoomParticipantQueryPort.java RoomParticipant 관련 포트 신규 생성
.../room/application/service/... UserRoom 관련 로직을 RoomParticipant로 일괄 변경
.../user/adapter/out/persistence/..., .../user/adapter/out/persistence/repository/... 레포지토리 import 경로 정리, UserRoom 관련 코드 제거
.../user/application/port/out/UserRoomCommandPort.java 반환 타입 UserRoom → RoomParticipant로 변경
.../vote/adapter/out/jpa/VoteParticipantJpaEntity.java, .../vote/domain/VoteParticipant.java, .../vote/adapter/out/mapper/VoteParticipantMapper.java UserVote → VoteParticipant로 명칭 및 위치 변경, 매퍼 신규 생성
.../vote/adapter/out/persistence/repository/VoteParticipantJpaRepository.java VoteParticipantJpaRepository 신규 생성 및 쿼리 메서드 정의
.../vote/adapter/out/persistence/VoteQueryPersistenceAdapter.java UserVoteJpaRepository → VoteParticipantJpaRepository로 변경
.../common/exception/code/ErrorCode.java USER_ROOM 관련 에러코드 → ROOM_PARTICIPANT로 명칭 및 메시지 변경, 신규 에러코드 추가
src/test/... 테스트 코드 내 엔티티, 레포지토리, enum 등 명칭 및 import 경로 일괄 변경

Sequence Diagram(s)

sequenceDiagram
    participant Service as RoomShowRecruitingDetailViewService
    participant Adapter as RoomParticipantCommandPersistenceAdapter
    participant Repo as RoomParticipantJpaRepository

    Service->>Adapter: findAllByRoomId(roomId)
    Adapter->>Repo: findAllByRoomJpaEntity_RoomId(roomId)
    Repo-->>Adapter: List<RoomParticipantJpaEntity>
    Adapter->>Adapter: toDomainEntity 변환
    Adapter-->>Service: List<RoomParticipant>
Loading
sequenceDiagram
    participant Service as RecordCreateService
    participant Adapter as RoomParticipantCommandPersistenceAdapter
    participant Repo as RoomParticipantJpaRepository

    Service->>Adapter: findByUserIdAndRoomId(userId, roomId)
    Adapter->>Repo: findByUserJpaEntity_UserIdAndRoomJpaEntity_RoomId(userId, roomId)
    Repo-->>Adapter: Optional<RoomParticipantJpaEntity>
    Adapter->>Adapter: toDomainEntity 변환
    Adapter-->>Service: RoomParticipant
Loading

Assessment against linked issues

Objective (이슈 번호) Addressed Explanation
패키지 구조 정리 및 일관성 유지 (#80)
도메인/엔티티/레포지토리/매퍼/포트/서비스 네이밍 및 위치 일치화 (#80)
테스트 코드 내 관련 명칭 및 import 경로 반영 (#80)
ErrorCode 등 공용 코드의 용어 일관성 (#80)

Poem

패키지 이사, 토끼가 뛰노네
Room과 Vote, 이름도 새로워졌지
레포지토리 줄 맞추고, 매퍼도 단장
에러코드 깔끔하게, 역할도 분명히
테스트 토끼도 신나게 점프!
구조가 반듯해져, 기분이 좋아
🐇✨


📜 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 4923a2e and 8a27299.

📒 Files selected for processing (1)
  • src/main/java/konkuk/thip/room/adapter/out/persistence/RoomParticipantCommandPersistenceAdapter.java (1 hunks)
🧰 Additional context used
🧠 Learnings (1)
src/main/java/konkuk/thip/room/adapter/out/persistence/RoomParticipantCommandPersistenceAdapter.java (1)
Learnt from: seongjunnoh
PR: THIP-TextHip/THIP-Server#43
File: src/main/java/konkuk/thip/book/application/port/out/BookCommandPort.java:0-0
Timestamp: 2025-07-03T03:05:05.031Z
Learning: THIP 프로젝트에서는 CQRS Port 분리 시 다음 컨벤션을 따름: CommandPort에는 findByXXX를 통해 도메인 엔티티를 찾아오는 메서드를 추가하고, QueryPort에는 조회 API의 response에 해당하는 데이터들을 DB로부터 조회하는 메서드를 추가함.
🧬 Code Graph Analysis (1)
src/main/java/konkuk/thip/room/adapter/out/persistence/RoomParticipantCommandPersistenceAdapter.java (2)
src/main/java/konkuk/thip/common/exception/EntityNotFoundException.java (1)
  • EntityNotFoundException (5-10)
src/main/java/konkuk/thip/room/adapter/out/persistence/repository/RoomQueryRepositoryImpl.java (1)
  • Repository (30-248)
🔇 Additional comments (4)
src/main/java/konkuk/thip/room/adapter/out/persistence/RoomParticipantCommandPersistenceAdapter.java (4)

1-14: 패키지 구조 정리에 따른 올바른 import 구성

패키지 구조 정리에 맞게 import 문들이 올바르게 구성되어 있습니다. 새로운 room 패키지 하위의 구조가 일관성 있게 적용되었습니다.


15-21: 적절한 의존성 주입 구성

@Repository@RequiredArgsConstructor를 사용한 의존성 주입 구성이 적절하며, 필요한 의존성들(JPA Repository와 Mapper)이 올바르게 주입되고 있습니다.


22-29: 올바른 에러 처리 및 도메인 매핑

이전 리뷰에서 지적된 문제들이 해결되었습니다:

  • 에러 코드가 ROOM_PARTICIPANT_NOT_FOUND로 올바르게 수정되어 도메인 모델 변경사항과 일치합니다.
  • JPA 엔티티에서 도메인 엔티티로의 매핑이 적절하게 구현되어 있습니다.

31-36: 효율적인 스트림 처리

findAllByRoomId 메서드에서 스트림을 사용하여 JPA 엔티티를 도메인 엔티티로 변환하고 있으며, toList()를 사용하여 최신 Java 스타일을 적용하고 있습니다.

✨ Finishing Touches
  • 📝 Generate Docstrings

🪧 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.
    • @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 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.
    • @coderabbitai help me debug CodeRabbit configuration file.

Support

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

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.
  • @coderabbitai generate sequence diagram to generate a sequence diagram of the changes in 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: 9

🔭 Outside diff range comments (7)
src/main/java/konkuk/thip/attendanceCheck/adapter/out/persistence/AttendanceCheckQueryPersistenceAdapter.java (1)

11-11: 인터페이스 이름에 오타가 있습니다.

구현하는 인터페이스 이름을 수정해야 합니다.

-public class AttendanceCheckQueryPersistenceAdapter implements AttendnaceCheckQueryPort {
+public class AttendanceCheckQueryPersistenceAdapter implements AttendanceCheckQueryPort {
src/main/java/konkuk/thip/comment/adapter/out/persistence/CommentQueryPersistenceAdapter.java (1)

13-15: 필드명 불일치 및 불필요 의존성 제거/정비 필요

CommentMapper 타입의 필드가 userMapper라는 혼동되는 이름으로 선언돼 있으며, 본 클래스 내에서 실제로 사용되지도 않습니다.
빈 주입은 계속 요구되므로,

  1. 이름을 commentMapper로 변경해 가독성을 높이고,
  2. 당장 사용 계획이 없다면 필드를 삭제하여 불필요한 의존성을 제거하는 편이 좋습니다.
-    private final CommentMapper userMapper;
+    // 필요 시 사용 목적에 맞춰 이름을 명확히 수정
+    private final CommentMapper commentMapper;
src/main/java/konkuk/thip/vote/adapter/out/persistence/repository/VoteQueryRepository.java (1)

3-13: Persistence 계층에서 Web DTO 직접 의존 ‑ 계층 침투 우려

RoomPlayingDetailViewResponse.CurrentVote(adapter.in.web.response) 타입을 persistence adapter가 반환하도록 정의하면,
hexagonal 구조에서 외부(inbound) 계층 DTO가 내부(outbound) 계층으로 침투하게 됩니다. 이는 계층 간 순환 의존을 야기하고, 테스트 및 재사용성을 낮춥니다.

가능한 해결책:

  1. persistence 계층에서는 Projection Interface나 전용 Query DTO를 정의하고, 상위 계층에서 Web DTO로 매핑.
  2. CQRS 팀 컨벤션을 유지하더라도 최소한 adapter.out → adapter.in 방향 의존은 피하고 application 계층에서 매핑.

추가 논의 없으면 아래처럼 Query DTO로 치환 후 매핑을 권장합니다.

// 예시 DTO (adapter.out.querydto 패키지)
public record CurrentVoteDto(Long voteId, String title, int participantCount) {}
src/main/java/konkuk/thip/room/adapter/out/persistence/repository/RoomQueryRepository.java (1)

3-5: Persistence 레이어에서 Web DTO 직접 참조 중단 필요
RoomQueryRepository.java(3–5행)에서 Web-layer Response DTO(RoomSearchResponse, RoomRecruitingDetailViewResponse, RoomGetHomeJoinedListResponse)를 직접 import하고 있습니다.

  • Persistence → Web-layer 의존성은 DIP/클린 아키텍처 위반
  • 테스트·재사용성 저하 및 패키지 재배치 시 파급 범위 확대

유사 패턴이 다른 *QueryRepository/*QueryPersistenceAdapter 클래스에도 다수 발견되니 함께 점검해 주세요.

해결 방안:

  1. Persistence 전용 Query DTO(RoomSearchQueryDto 등)를 src/main/java/konkuk/thip/room/application/port/out/dto 또는 persistence 패키지 내부에 정의
  2. Application 계층으로 결과를 매핑한 뒤 Web DTO로 변환

예시:

-import konkuk.thip.room.adapter.in.web.response.RoomSearchResponse;
+import konkuk.thip.room.application.port.out.dto.RoomSearchQueryDto;  // 예시 DTO
src/main/java/konkuk/thip/vote/adapter/out/persistence/repository/VoteQueryRepositoryImpl.java (1)

26-36: 페이지 조건 로직의 Null 처리 주의

startEndNull(pageStart, pageEnd) 이 true인 경우에만 isOverview 조건을 걸어주고, 하나라도 null 이 아니면 page.between(...)로 전환됩니다.
pageStart==null && pageEnd!=null 또는 그 반대 상황에서 between 호출 시 NPE 가 발생할 수 있으니, 두 값이 모두 non-null임을 보장하거나 개별 조건으로 분기하는 것이 안전합니다.

src/main/java/konkuk/thip/record/adapter/out/persistence/repository/RecordQueryRepository.java (1)

9-9: 파라미터 과다: 조건 DTO로 캡슐화 권장

findRecordsByRoom의 파라미터가 7개입니다. 유지보수 및 확장성을 위해 SearchCondition DTO (또는 스펙 객체)로 묶어주세요.

-public interface RecordQueryRepository {
-    Page<RecordSearchResponse.RecordSearchResult> findRecordsByRoom(
-            Long roomId, String viewType, Integer pageStart, Integer pageEnd,
-            Boolean isOverview, Long userId, Pageable pageable);
+public interface RecordQueryRepository {
+    Page<RecordSearchResponse.RecordSearchResult> findRecordsByRoom(
+            RecordSearchCondition condition, Pageable pageable);
 }
src/main/java/konkuk/thip/user/adapter/out/persistence/repository/following/FollowingQueryRepositoryImpl.java (1)

24-44: @OverRide 누락 및 카운트 타입 오버플로우 가능성

  1. countByFollowingUserIds 는 인터페이스 메서드 구현이므로 @Override 애노테이션을 추가해 컴파일-타임 검증을 받는 게 안전합니다.
  2. tuple.get(following.count()).intValue() 는 팔로워 수가 2,147,483,647 명을 넘으면 오버플로우가 발생합니다. Long 으로 유지하거나 Math.toIntExact 사용을 권장합니다.
-    // 주어진 userId 리스트에 대해 각 userId의 팔로워(구독자) 수를 집계하여 Map으로 반환
-    public Map<Long, Integer> countByFollowingUserIds(List<Long> userIds) {
+    @Override
+    // 주어진 userId 리스트에 대해 각 userId의 팔로워(구독자) 수를 집계하여 Map으로 반환
+    public Map<Long, Long> countByFollowingUserIds(List<Long> userIds) {
 ...
-        return results.stream()
-                .collect(Collectors.toMap(
-                        tuple -> tuple.get(following.followingUserJpaEntity.userId),
-                        tuple -> tuple.get(following.count()).intValue()
-                ));
+        return results.stream()
+                .collect(Collectors.toMap(
+                        tuple -> tuple.get(following.followingUserJpaEntity.userId),
+                        tuple -> tuple.get(following.count())
+                ));
     }
🧹 Nitpick comments (26)
src/main/java/konkuk/thip/attendanceCheck/adapter/out/persistence/AttendanceCheckQueryPersistenceAdapter.java (1)

13-13: 필드 이름 일관성을 고려해보세요.

Command 어댑터에서는 attendanceCheckRepository를 사용하는데, Query 어댑터에서는 jpaRepository를 사용합니다. 일관성을 위해 동일한 이름을 사용하는 것을 권장합니다.

-private final AttendanceCheckRepository jpaRepository;
+private final AttendanceCheckRepository attendanceCheckRepository;
src/main/java/konkuk/thip/book/adapter/in/web/response/GetBookSearchListResponse.java (1)

7-7: 외부 API Util 상수에 대한 직접 의존 제거 권장

응답 DTO 계층이 adapter.out.api.naver.NaverApiUtilPAGE_SIZE 상수에 직접 의존하면서, 외부 어댑터 구현 변경 시 DTO까지 영향을 받는 레이어 침투가 발생합니다.

  • 공용 상수를 common 모듈이나 설정 클래스로 분리
  • 또는 서비스 계층에서 값(또는 Pageable)을 주입

하도록 리팩터링을 고려해 주세요.

src/main/java/konkuk/thip/user/application/service/following/UserFollowService.java (1)

27-30: 불린 플래그 명확성 향상 제안

Boolean type 변수는 “팔로우 / 언팔로우” 의미를 담기에 네이밍이 모호합니다. isFollow 혹은 follow 등 의미가 분명한 이름으로 교체하면 가독성이 좋아집니다.

-        Boolean type = followCommand.type();
+        Boolean follow = followCommand.type();
src/main/java/konkuk/thip/user/application/service/following/UserGetFollowersService.java (1)

19-26: 페이지 크기 하드코딩 제거 고려

DEFAULT_PAGE_SIZE(10)를 상수로 고정하면 테스트는 편리하지만 운영 환경에서 요구사항이 바뀔 때 매번 코드 수정이 필요합니다.
application.yml 설정값이나 @Value 주입으로 외부화하면 유연성이 높아집니다.

src/main/java/konkuk/thip/user/adapter/out/persistence/repository/UserJpaRepository.java (1)

11-11: findById 메서드 중복 선언 제거 권장

JpaRepository 자체에 이미 Optional<T> findById(ID id)가 정의되어 있어 동일 시그니처를 다시 선언할 필요가 없습니다. 중복 선언은 IDE-level 오버라이드 표시가 사라져 가독성이 떨어지고, 향후 JpaRepository 시그니처 변경 시 컴파일 오류 위험을 키웁니다.

-    Optional<UserJpaEntity> findById(Long userId);
src/main/java/konkuk/thip/vote/adapter/out/persistence/repository/VoteItemJpaRepository.java (1)

8-11: 메서드 시그니처의 의도·이름 불일치

findAllByVoteJpaEntity_PostId(Long voteId) 는 JPA 프로퍼티 경로가 PostId임에도 파라미터 변수명이 voteId라 혼동을 줄 수 있습니다.
엔티티 구조상 VoteJpaEntityPost를 상속한다면 실제로는 postId를 의미하므로, 변수명과 메서드명을 일관되게 맞추는 편이 가독성·유지보수에 유리합니다.

- List<VoteItemJpaEntity> findAllByVoteJpaEntity_PostId(Long voteId);
+ List<VoteItemJpaEntity> findAllByVoteJpaEntity_PostId(Long postId);
src/main/java/konkuk/thip/user/adapter/out/persistence/repository/AliasQueryRepositoryImpl.java (1)

24-35: 카테고리 N+1 가능성 점검

aliascategory 조인을 fetch join 없이 분리 조회하면, 이후 서비스 계층에서 category 프록시 접근 시 N+1 발생 여지가 있습니다. 현재 DTO 로 바로 매핑하고 있으므로 문제없을 수도 있으나, 추후 필드 추가 시 대비해 leftJoin(...).fetchJoin() 고려를 권장드립니다.

src/main/java/konkuk/thip/record/adapter/out/persistence/repository/RecordQueryRepositoryImpl.java (1)

101-110: 카운트 쿼리 성능 개선 제안

목록 조회 쿼리와 동일한 조인 구조로 count()를 수행하면 불필요한 LEFT JOIN으로 성능 손실이 큽니다.
WHERE 조건만 동일하게 유지한 채 단순 post.count()를 수행하거나, 필요하다면 서브쿼리로 분리해 불필요한 조인을 제거하는 방안을 고려해 주세요.

src/main/java/konkuk/thip/user/adapter/out/persistence/repository/following/FollowingJpaRepository.java (1)

7-8: @repository 중복 여부 검토

Spring Boot 3.x 기준으로 JpaRepository 인터페이스는 컴포넌트 스캔 대상이므로 @Repository 애노테이션이 없어도 빈으로 등록됩니다.
의도적으로 예외 변환(AOP) 등을 위해 선언하신 것이 아니라면 제거하여 간결성을 유지하는 편이 좋습니다.

-@Repository
-public interface FollowingJpaRepository extends JpaRepository<FollowingJpaEntity, Long>, FollowingQueryRepository {
+public interface FollowingJpaRepository extends JpaRepository<FollowingJpaEntity, Long>, FollowingQueryRepository {
src/main/java/konkuk/thip/user/adapter/out/persistence/repository/following/FollowingQueryRepositoryImpl.java (1)

60-80: Cursor 기반 페이지네이션: 인덱스 존재 여부 확인 필요

createdAt 컬럼에 범위 조건과 정렬이 동시에 걸리므로 (created_at) 단일 인덱스가 없으면 성능 저하가 발생할 수 있습니다. DB 인덱스 상태를 점검해주세요.

src/main/java/konkuk/thip/record/adapter/out/persistence/RecordQueryPersistenceAdapter.java (1)

17-20: 조회 어댑터에 @Transactional(readOnly = true) 적용을 고려해 주세요

대부분의 Query Adapter 메서드는 읽기 전용 트랜잭션으로 동작하는 것이 성능-최적화(더티 체크 생략 등)에 유리합니다.

 @Repository
 @RequiredArgsConstructor
+@Transactional(readOnly = true)
 public class RecordQueryPersistenceAdapter implements RecordQueryPort {
src/main/java/konkuk/thip/recentSearch/adapter/out/persistence/RecentSearchCommandPersistenceAdapter.java (1)

26-26: 파라미터 표기 스타일 통일

쉼표 뒤에 공백이 빠져 있습니다. 사소하지만 팀 코딩 컨벤션 유지 차원에서 수정 권장합니다.

-public void save(Long userId,RecentSearch recentSearch) {
+public void save(Long userId, RecentSearch recentSearch) {
src/test/java/konkuk/thip/user/application/service/UserFollowServiceTest.java (1)

6-6: 패키지 경로 불일치로 인한 잠재적 혼란

UserFollowServicefollowing 하위 패키지로 이동했지만, 테스트 클래스의 패키지 선언은 여전히 konkuk.thip.user.application.service에 머물러 있습니다. 테스트 소스와 실제 소스의 패키지 계층을 맞춰 두면 추후 리팩터링·검색 시 혼동을 줄일 수 있으니, 필요 시 테스트 패키지를 ...service.following으로 이동하는 방안을 고려해 주세요.

src/main/java/konkuk/thip/vote/domain/VoteParticipant.java (1)

9-16: 도메인 엔티티 리네이밍 완료 – equals/hashCode 구현 여부 검토

VoteParticipant로의 리네이밍 자체는 이상 없습니다. 다만 식별자가 명확히 존재하므로 컬렉션 사용 또는 테스트 시 동등성 비교가 필요하면 equals/hashCode를 명시적으로 구현해 두는 편이 안전합니다.

src/main/java/konkuk/thip/saved/adapter/out/persistence/SavedQueryPersistenceAdapter.java (1)

27-32: 사용되지 않는 의존성 주입 필드 정리 제안
savedFeedJpaRepository, savedBookMapper, savedFeedMapper 필드는 현재 클래스에서 참조되지 않습니다. 남겨두면 경고가 발생하고 유지보수성이 저하됩니다. 필요 없다면 제거하거나, 앞으로 사용할 계획이라면 TODO 주석을 남겨 의도를 명확히 해주세요.

-    private final SavedBookMapper savedBookMapper;
...
-    private final SavedFeedMapper savedFeedMapper;
src/test/java/konkuk/thip/record/adapter/in/web/RecordQueryControllerTest.java (1)

1-2: 파일명-클래스명 불일치
파일명은 RecordQueryControllerTest 이지만 클래스명은 RecordSearchControllerTest 입니다. 리팩터 과정에서 어긋난 것으로 보이니 둘 중 하나를 통일하는 편이 가독성과 검색성을 높입니다.

src/main/java/konkuk/thip/room/domain/Room.java (1)

64-64: memberCount 업데이트 메서드 추가를 고려해보세요.

초기값 설정은 적절하지만, 방 참가자가 증가하거나 감소할 때 memberCount를 업데이트하는 도메인 메서드가 없습니다. 참가자 관리 로직과 함께 incrementMemberCount(), decrementMemberCount() 같은 메서드를 추가하는 것을 고려해보세요.

+public void incrementMemberCount() {
+    this.memberCount++;
+}
+
+public void decrementMemberCount() {
+    if (this.memberCount > 0) {
+        this.memberCount--;
+    }
+}
src/test/java/konkuk/thip/room/domain/RoomParticipantTest.java (1)

8-8: @DisplayName을 업데이트해야 합니다.

클래스명이 RoomParticipantTest로 변경되었으므로, @DisplayName도 "RoomParticipant 도메인 테스트"로 업데이트해야 합니다.

-@DisplayName("[단위] UserRoom 도메인 테스트")
+@DisplayName("[단위] RoomParticipant 도메인 테스트")
src/main/java/konkuk/thip/user/adapter/out/persistence/repository/UserQueryRepositoryImpl.java (1)

20-20: 변수명을 더 명확하게 개선하는 것을 고려해보세요.

변수명이 여전히 userRoom으로 되어 있는데, 도메인 모델이 RoomParticipant로 변경되었으므로 roomParticipant로 변경하는 것이 더 명확할 것 같습니다.

-QRoomParticipantJpaEntity userRoom = QRoomParticipantJpaEntity.roomParticipantJpaEntity;
+QRoomParticipantJpaEntity roomParticipant = QRoomParticipantJpaEntity.roomParticipantJpaEntity;

그리고 하단의 쿼리에서도 해당 변수를 사용하는 부분들을 함께 업데이트해야 합니다.

src/main/java/konkuk/thip/room/application/service/RoomGetMemberListService.java (1)

35-35: 주석을 업데이트해주세요.

주석에서 "방 참여자(UserRoom)"를 "방 참여자(RoomParticipant)"로 수정해야 합니다.

-        // 2. 방 참여자(UserRoom) 전체 조회
+        // 2. 방 참여자(RoomParticipant) 전체 조회
src/main/java/konkuk/thip/vote/adapter/out/persistence/repository/VoteParticipantJpaRepository.java (1)

6-8: Repository 인터페이스가 올바르게 구현되었습니다.

VoteParticipantJpaEntity에 대한 JPA Repository 인터페이스가 정확하게 정의되었습니다. 다만 메서드명이 상당히 길어 가독성 개선을 고려해볼 수 있습니다.

메서드명을 더 간결하게 만들기 위해 @query 어노테이션을 사용하는 것을 고려해보세요:

-    boolean existsByUserJpaEntity_UserIdAndVoteItemJpaEntity_VoteItemId(Long userId, Long voteItemId);
+    @Query("SELECT COUNT(vp) > 0 FROM VoteParticipantJpaEntity vp WHERE vp.userJpaEntity.userId = :userId AND vp.voteItemJpaEntity.voteItemId = :voteItemId")
+    boolean existsByUserIdAndVoteItemId(@Param("userId") Long userId, @Param("voteItemId") Long voteItemId);
src/test/java/konkuk/thip/room/domain/RoomParticipantsTest.java (1)

14-14: 헬퍼 메서드명 개선을 고려해보세요.

메서드명이 createUserRoom으로 되어 있지만 실제로는 RoomParticipant를 생성합니다. 도메인 모델의 명확성을 위해 createRoomParticipant로 변경하는 것을 고려해보세요.

-private RoomParticipant createUserRoom(Long id, Long userId, Long roomId, RoomParticipantRole role) {
+private RoomParticipant createRoomParticipant(Long id, Long userId, Long roomId, RoomParticipantRole role) {

그리고 이 메서드를 사용하는 모든 곳에서도 메서드명을 업데이트해야 합니다.

src/test/java/konkuk/thip/record/adapter/in/web/RecordCreateControllerTest.java (1)

96-96: 주석 개선 제안

코드는 RoomParticipantJpaEntity를 생성하고 있지만 주석에서는 여전히 UserRoomJpaEntity라고 표기되어 있습니다.

-        //UserRoomJpaEntity 생성 및 저장
+        //RoomParticipantJpaEntity 생성 및 저장
src/test/java/konkuk/thip/common/util/TestEntityFactory.java (1)

103-103: 메서드명 변경을 고려해보세요.

메서드가 RoomParticipantJpaEntity를 반환하므로 createRoomParticipant 또는 createParticipant로 메서드명을 변경하는 것이 더 적절할 수 있습니다.

-    public static RoomParticipantJpaEntity createUserRoom(RoomJpaEntity room, UserJpaEntity user, RoomParticipantRole roomParticipantRole, double userPercentage) {
+    public static RoomParticipantJpaEntity createRoomParticipant(RoomJpaEntity room, UserJpaEntity user, RoomParticipantRole roomParticipantRole, double userPercentage) {
src/main/java/konkuk/thip/room/domain/RoomParticipants.java (1)

15-17: 주석 업데이트가 필요합니다.

클래스 주석에서 여전히 "UserRoom"을 언급하고 있지만, 실제로는 RoomParticipant를 다루고 있습니다.

    /**
-     * 특정 Room 과 연관된 UserRoom 들을 모은 일급 컬렉션
+     * 특정 Room 과 연관된 RoomParticipant 들을 모은 일급 컬렉션
     */
src/main/java/konkuk/thip/vote/adapter/out/mapper/VoteParticipantMapper.java (1)

11-16: 매퍼 메서드 시그니처의 일관성을 개선하는 것을 고려해보세요.

toJpaEntity 메서드가 도메인 엔티티를 파라미터로 받지 않고 직접 JPA 엔티티들을 받는 것은 다른 매퍼 클래스들과 일관성이 떨어집니다. RoomParticipantMapper의 패턴을 따르는 것을 권장합니다.

다음과 같은 시그니처로 변경을 고려해보세요:

-public VoteParticipantJpaEntity toJpaEntity(UserJpaEntity userJpaEntity, VoteItemJpaEntity voteItemJpaEntity) {
+public VoteParticipantJpaEntity toJpaEntity(VoteParticipant voteParticipant, UserJpaEntity userJpaEntity, VoteItemJpaEntity voteItemJpaEntity) {
📜 Review details

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

📥 Commits

Reviewing files that changed from the base of the PR and between 6d40c4d and fa8c9d3.

📒 Files selected for processing (112)
  • src/main/java/konkuk/thip/attendanceCheck/adapter/out/persistence/AttendanceCheckCommandPersistenceAdapter.java (1 hunks)
  • src/main/java/konkuk/thip/attendanceCheck/adapter/out/persistence/AttendanceCheckQueryPersistenceAdapter.java (1 hunks)
  • src/main/java/konkuk/thip/attendanceCheck/adapter/out/persistence/repository/AttendanceCheckRepository.java (1 hunks)
  • src/main/java/konkuk/thip/book/adapter/in/web/response/GetBookSearchListResponse.java (1 hunks)
  • src/main/java/konkuk/thip/book/adapter/out/api/CompositeBookApiAdapter.java (1 hunks)
  • src/main/java/konkuk/thip/book/adapter/out/api/naver/NaverApiClient.java (1 hunks)
  • src/main/java/konkuk/thip/book/adapter/out/api/naver/NaverApiUtil.java (1 hunks)
  • src/main/java/konkuk/thip/book/adapter/out/api/naver/NaverBookXmlParser.java (1 hunks)
  • src/main/java/konkuk/thip/book/adapter/out/persistence/BookCommandPersistenceAdapter.java (1 hunks)
  • src/main/java/konkuk/thip/book/adapter/out/persistence/BookQueryPersistenceAdapter.java (1 hunks)
  • src/main/java/konkuk/thip/book/adapter/out/persistence/repository/BookJpaRepository.java (1 hunks)
  • src/main/java/konkuk/thip/book/application/service/BookSearchService.java (1 hunks)
  • src/main/java/konkuk/thip/comment/adapter/out/persistence/CommentQueryPersistenceAdapter.java (1 hunks)
  • src/main/java/konkuk/thip/comment/adapter/out/persistence/repository/CommentJpaRepository.java (1 hunks)
  • src/main/java/konkuk/thip/common/security/oauth2/CustomOAuth2UserService.java (1 hunks)
  • src/main/java/konkuk/thip/notification/adapter/out/persistence/NotificationCommandPersistenceAdapter.java (1 hunks)
  • src/main/java/konkuk/thip/notification/adapter/out/persistence/NotificationQueryPersistenceAdapter.java (1 hunks)
  • src/main/java/konkuk/thip/notification/adapter/out/persistence/repository/NotificationJpaRepository.java (1 hunks)
  • src/main/java/konkuk/thip/recentSearch/adapter/out/persistence/RecentSearchCommandPersistenceAdapter.java (1 hunks)
  • src/main/java/konkuk/thip/recentSearch/adapter/out/persistence/RecentSearchQueryPersistenceAdapter.java (1 hunks)
  • src/main/java/konkuk/thip/recentSearch/adapter/out/persistence/repository/RecentSearchJpaRepository.java (1 hunks)
  • src/main/java/konkuk/thip/record/adapter/out/persistence/RecordCommandPersistenceAdapter.java (1 hunks)
  • src/main/java/konkuk/thip/record/adapter/out/persistence/RecordQueryPersistenceAdapter.java (1 hunks)
  • src/main/java/konkuk/thip/record/adapter/out/persistence/repository/RecordJpaRepository.java (1 hunks)
  • src/main/java/konkuk/thip/record/adapter/out/persistence/repository/RecordQueryRepository.java (1 hunks)
  • src/main/java/konkuk/thip/record/adapter/out/persistence/repository/RecordQueryRepositoryImpl.java (1 hunks)
  • src/main/java/konkuk/thip/record/application/service/RecordCreateService.java (2 hunks)
  • src/main/java/konkuk/thip/room/adapter/out/jpa/RoomJpaEntity.java (1 hunks)
  • src/main/java/konkuk/thip/room/adapter/out/jpa/RoomParticipantJpaEntity.java (2 hunks)
  • src/main/java/konkuk/thip/room/adapter/out/jpa/RoomParticipantRole.java (1 hunks)
  • src/main/java/konkuk/thip/room/adapter/out/mapper/RoomMapper.java (2 hunks)
  • src/main/java/konkuk/thip/room/adapter/out/mapper/RoomParticipantMapper.java (1 hunks)
  • src/main/java/konkuk/thip/room/adapter/out/persistence/RoomCommandPersistenceAdapter.java (1 hunks)
  • src/main/java/konkuk/thip/room/adapter/out/persistence/RoomParticipantCommandPersistenceAdapter.java (1 hunks)
  • src/main/java/konkuk/thip/room/adapter/out/persistence/RoomQueryPersistenceAdapter.java (1 hunks)
  • src/main/java/konkuk/thip/room/adapter/out/persistence/repository/CategoryJpaRepository.java (1 hunks)
  • src/main/java/konkuk/thip/room/adapter/out/persistence/repository/RoomJpaRepository.java (1 hunks)
  • src/main/java/konkuk/thip/room/adapter/out/persistence/repository/RoomParticipantJpaRepository.java (1 hunks)
  • src/main/java/konkuk/thip/room/adapter/out/persistence/repository/RoomQueryRepository.java (1 hunks)
  • src/main/java/konkuk/thip/room/adapter/out/persistence/repository/RoomQueryRepositoryImpl.java (6 hunks)
  • src/main/java/konkuk/thip/room/application/service/RoomGetMemberListService.java (2 hunks)
  • src/main/java/konkuk/thip/room/application/service/RoomShowPlayingDetailViewService.java (2 hunks)
  • src/main/java/konkuk/thip/room/application/service/RoomShowRecruitingDetailViewService.java (2 hunks)
  • src/main/java/konkuk/thip/room/domain/Room.java (2 hunks)
  • src/main/java/konkuk/thip/room/domain/RoomParticipant.java (1 hunks)
  • src/main/java/konkuk/thip/room/domain/RoomParticipants.java (3 hunks)
  • src/main/java/konkuk/thip/saved/adapter/out/persistence/SavedCommandPersistenceAdapter.java (1 hunks)
  • src/main/java/konkuk/thip/saved/adapter/out/persistence/SavedQueryPersistenceAdapter.java (1 hunks)
  • src/main/java/konkuk/thip/saved/adapter/out/persistence/repository/SavedBookJpaRepository.java (1 hunks)
  • src/main/java/konkuk/thip/saved/adapter/out/persistence/repository/SavedFeedJpaRepository.java (1 hunks)
  • src/main/java/konkuk/thip/user/adapter/out/jpa/UserRoomRole.java (0 hunks)
  • src/main/java/konkuk/thip/user/adapter/out/mapper/UserRoomMapper.java (0 hunks)
  • src/main/java/konkuk/thip/user/adapter/out/persistence/FollowingCommandPersistenceAdapter.java (1 hunks)
  • src/main/java/konkuk/thip/user/adapter/out/persistence/FollowingQueryPersistenceAdapter.java (1 hunks)
  • src/main/java/konkuk/thip/user/adapter/out/persistence/UserCommandPersistenceAdapter.java (1 hunks)
  • src/main/java/konkuk/thip/user/adapter/out/persistence/UserQueryPersistenceAdapter.java (1 hunks)
  • src/main/java/konkuk/thip/user/adapter/out/persistence/UserRoomCommandPersistenceAdapter.java (0 hunks)
  • src/main/java/konkuk/thip/user/adapter/out/persistence/UserRoomJpaRepository.java (0 hunks)
  • src/main/java/konkuk/thip/user/adapter/out/persistence/repository/AliasJpaRepository.java (1 hunks)
  • src/main/java/konkuk/thip/user/adapter/out/persistence/repository/AliasQueryRepository.java (1 hunks)
  • src/main/java/konkuk/thip/user/adapter/out/persistence/repository/AliasQueryRepositoryImpl.java (1 hunks)
  • src/main/java/konkuk/thip/user/adapter/out/persistence/repository/UserJpaRepository.java (1 hunks)
  • src/main/java/konkuk/thip/user/adapter/out/persistence/repository/UserQueryRepository.java (1 hunks)
  • src/main/java/konkuk/thip/user/adapter/out/persistence/repository/UserQueryRepositoryImpl.java (2 hunks)
  • src/main/java/konkuk/thip/user/adapter/out/persistence/repository/following/FollowingJpaRepository.java (1 hunks)
  • src/main/java/konkuk/thip/user/adapter/out/persistence/repository/following/FollowingQueryRepository.java (1 hunks)
  • src/main/java/konkuk/thip/user/adapter/out/persistence/repository/following/FollowingQueryRepositoryImpl.java (1 hunks)
  • src/main/java/konkuk/thip/user/application/port/out/UserRoomCommandPort.java (1 hunks)
  • src/main/java/konkuk/thip/user/application/service/following/UserFollowService.java (1 hunks)
  • src/main/java/konkuk/thip/user/application/service/following/UserGetFollowersService.java (1 hunks)
  • src/main/java/konkuk/thip/vote/adapter/out/jpa/VoteParticipantJpaEntity.java (1 hunks)
  • src/main/java/konkuk/thip/vote/adapter/out/mapper/UserVoteMapper.java (0 hunks)
  • src/main/java/konkuk/thip/vote/adapter/out/mapper/VoteParticipantMapper.java (1 hunks)
  • src/main/java/konkuk/thip/vote/adapter/out/persistence/UserVoteJpaRepository.java (0 hunks)
  • src/main/java/konkuk/thip/vote/adapter/out/persistence/VoteCommandPersistenceAdapter.java (1 hunks)
  • src/main/java/konkuk/thip/vote/adapter/out/persistence/VoteQueryPersistenceAdapter.java (2 hunks)
  • src/main/java/konkuk/thip/vote/adapter/out/persistence/repository/VoteItemJpaRepository.java (1 hunks)
  • src/main/java/konkuk/thip/vote/adapter/out/persistence/repository/VoteJpaRepository.java (1 hunks)
  • src/main/java/konkuk/thip/vote/adapter/out/persistence/repository/VoteParticipantJpaRepository.java (1 hunks)
  • src/main/java/konkuk/thip/vote/adapter/out/persistence/repository/VoteQueryRepository.java (1 hunks)
  • src/main/java/konkuk/thip/vote/adapter/out/persistence/repository/VoteQueryRepositoryImpl.java (1 hunks)
  • src/main/java/konkuk/thip/vote/domain/VoteParticipant.java (1 hunks)
  • src/test/java/konkuk/thip/book/adapter/in/web/BookChangeSavedControllerTest.java (1 hunks)
  • src/test/java/konkuk/thip/book/adapter/in/web/BookDetailSearchControllerTest.java (6 hunks)
  • src/test/java/konkuk/thip/book/adapter/in/web/BookMostSearchedBooksControllerTest.java (1 hunks)
  • src/test/java/konkuk/thip/book/adapter/in/web/BookQueryControllerTest.java (1 hunks)
  • src/test/java/konkuk/thip/book/adapter/out/api/naver/NaverApiUtilTest.java (1 hunks)
  • src/test/java/konkuk/thip/common/util/TestEntityFactory.java (2 hunks)
  • src/test/java/konkuk/thip/feed/adapter/out/jpa/FeedJpaEntityTest.java (1 hunks)
  • src/test/java/konkuk/thip/record/adapter/in/web/RecordCreateControllerTest.java (3 hunks)
  • src/test/java/konkuk/thip/record/adapter/in/web/RecordQueryControllerTest.java (1 hunks)
  • src/test/java/konkuk/thip/record/adapter/out/persistence/RecordQueryRepositoryImplTest.java (1 hunks)
  • src/test/java/konkuk/thip/room/adapter/in/web/RoomCreateAPITest.java (1 hunks)
  • src/test/java/konkuk/thip/room/adapter/in/web/RoomGetHomeJoinedRoomsApiTest.java (5 hunks)
  • src/test/java/konkuk/thip/room/adapter/in/web/RoomGetMemberListApiTest.java (5 hunks)
  • src/test/java/konkuk/thip/room/adapter/in/web/RoomPlayingDetailViewApiTest.java (9 hunks)
  • src/test/java/konkuk/thip/room/adapter/in/web/RoomRecruitingDetailViewApiTest.java (7 hunks)
  • src/test/java/konkuk/thip/room/adapter/in/web/RoomSearchApiTest.java (3 hunks)
  • src/test/java/konkuk/thip/room/adapter/in/web/RoomVerifyPasswordAPITest.java (1 hunks)
  • src/test/java/konkuk/thip/room/adapter/out/jpa/RecordJpaEntityTest.java (1 hunks)
  • src/test/java/konkuk/thip/room/adapter/out/jpa/RoomJpaEntityTest.java (1 hunks)
  • src/test/java/konkuk/thip/room/adapter/out/jpa/VoteJpaEntityTest.java (1 hunks)
  • src/test/java/konkuk/thip/room/domain/RoomParticipantTest.java (5 hunks)
  • src/test/java/konkuk/thip/room/domain/RoomParticipantsTest.java (9 hunks)
  • src/test/java/konkuk/thip/user/adapter/in/web/UserFollowApiTest.java (1 hunks)
  • src/test/java/konkuk/thip/user/adapter/in/web/UserGetFollowersApiTest.java (2 hunks)
  • src/test/java/konkuk/thip/user/adapter/in/web/UserSignupControllerTest.java (1 hunks)
  • src/test/java/konkuk/thip/user/adapter/in/web/UserVerifyNicknameControllerTest.java (1 hunks)
  • src/test/java/konkuk/thip/user/adapter/in/web/UserViewAliasChoiceControllerTest.java (1 hunks)
  • src/test/java/konkuk/thip/user/adapter/out/jpa/UserJpaEntityTest.java (1 hunks)
  • src/test/java/konkuk/thip/user/application/service/UserFollowServiceTest.java (1 hunks)
  • src/test/java/konkuk/thip/vote/adapter/in/web/VoteCreateControllerTest.java (1 hunks)
💤 Files with no reviewable changes (6)
  • src/main/java/konkuk/thip/user/adapter/out/jpa/UserRoomRole.java
  • src/main/java/konkuk/thip/user/adapter/out/mapper/UserRoomMapper.java
  • src/main/java/konkuk/thip/vote/adapter/out/persistence/UserVoteJpaRepository.java
  • src/main/java/konkuk/thip/user/adapter/out/persistence/UserRoomJpaRepository.java
  • src/main/java/konkuk/thip/vote/adapter/out/mapper/UserVoteMapper.java
  • src/main/java/konkuk/thip/user/adapter/out/persistence/UserRoomCommandPersistenceAdapter.java
🧰 Additional context used
🧠 Learnings (36)
📓 Common learnings
Learnt from: buzz0331
PR: THIP-TextHip/THIP-Server#75
File: src/main/java/konkuk/thip/vote/adapter/out/persistence/VoteQueryRepositoryImpl.java:50-83
Timestamp: 2025-07-14T14:19:38.762Z
Learning: Vote와 VoteItem 엔티티는 자주 함께 사용되므로, N+1 문제를 방지하기 위해 양방향 매핑과 fetch join을 고려하는 것이 좋습니다. 특히 기록장 조회 API 등에서도 함께 사용될 가능성이 높습니다.
src/main/java/konkuk/thip/user/adapter/out/persistence/repository/UserQueryRepository.java (1)
Learnt from: buzz0331
PR: THIP-TextHip/THIP-Server#78
File: src/main/java/konkuk/thip/user/application/port/out/FollowingQueryPort.java:3-3
Timestamp: 2025-07-14T18:22:56.495Z
Learning: THIP 프로젝트에서는 Query API(조회 API)에 한해서는 application 계층에서 adapter.in.web.response 패키지의 response DTO를 직접 참조하는 것을 허용함. 이는 CQRS 아키텍처에서 읽기 전용 작업의 효율성을 위한 팀 컨벤션임.
src/main/java/konkuk/thip/user/adapter/out/persistence/repository/AliasQueryRepositoryImpl.java (1)
Learnt from: buzz0331
PR: THIP-TextHip/THIP-Server#78
File: src/main/java/konkuk/thip/user/application/port/out/FollowingQueryPort.java:3-3
Timestamp: 2025-07-14T18:22:56.495Z
Learning: THIP 프로젝트에서는 Query API(조회 API)에 한해서는 application 계층에서 adapter.in.web.response 패키지의 response DTO를 직접 참조하는 것을 허용함. 이는 CQRS 아키텍처에서 읽기 전용 작업의 효율성을 위한 팀 컨벤션임.
src/main/java/konkuk/thip/book/adapter/out/persistence/BookQueryPersistenceAdapter.java (1)
Learnt from: seongjunnoh
PR: THIP-TextHip/THIP-Server#43
File: src/main/java/konkuk/thip/book/application/port/out/BookCommandPort.java:0-0
Timestamp: 2025-07-03T03:05:05.031Z
Learning: THIP 프로젝트에서는 CQRS Port 분리 시 다음 컨벤션을 따름: CommandPort에는 findByXXX를 통해 도메인 엔티티를 찾아오는 메서드를 추가하고, QueryPort에는 조회 API의 response에 해당하는 데이터들을 DB로부터 조회하는 메서드를 추가함.
src/main/java/konkuk/thip/vote/adapter/out/persistence/repository/VoteItemJpaRepository.java (1)
Learnt from: buzz0331
PR: THIP-TextHip/THIP-Server#75
File: src/main/java/konkuk/thip/vote/adapter/out/persistence/VoteQueryRepositoryImpl.java:50-83
Timestamp: 2025-07-14T14:19:38.762Z
Learning: Vote와 VoteItem 엔티티는 자주 함께 사용되므로, N+1 문제를 방지하기 위해 양방향 매핑과 fetch join을 고려하는 것이 좋습니다. 특히 기록장 조회 API 등에서도 함께 사용될 가능성이 높습니다.
src/main/java/konkuk/thip/vote/adapter/out/persistence/repository/VoteJpaRepository.java (1)
Learnt from: buzz0331
PR: THIP-TextHip/THIP-Server#75
File: src/main/java/konkuk/thip/vote/adapter/out/persistence/VoteQueryRepositoryImpl.java:50-83
Timestamp: 2025-07-14T14:19:38.762Z
Learning: Vote와 VoteItem 엔티티는 자주 함께 사용되므로, N+1 문제를 방지하기 위해 양방향 매핑과 fetch join을 고려하는 것이 좋습니다. 특히 기록장 조회 API 등에서도 함께 사용될 가능성이 높습니다.
src/main/java/konkuk/thip/vote/adapter/out/persistence/repository/VoteQueryRepository.java (1)
Learnt from: buzz0331
PR: THIP-TextHip/THIP-Server#75
File: src/main/java/konkuk/thip/vote/adapter/out/persistence/VoteQueryRepositoryImpl.java:50-83
Timestamp: 2025-07-14T14:19:38.762Z
Learning: Vote와 VoteItem 엔티티는 자주 함께 사용되므로, N+1 문제를 방지하기 위해 양방향 매핑과 fetch join을 고려하는 것이 좋습니다. 특히 기록장 조회 API 등에서도 함께 사용될 가능성이 높습니다.
src/test/java/konkuk/thip/record/adapter/out/persistence/RecordQueryRepositoryImplTest.java (2)
Learnt from: buzz0331
PR: THIP-TextHip/THIP-Server#78
File: src/main/java/konkuk/thip/user/application/port/out/FollowingQueryPort.java:3-3
Timestamp: 2025-07-14T18:22:56.495Z
Learning: THIP 프로젝트에서는 Query API(조회 API)에 한해서는 application 계층에서 adapter.in.web.response 패키지의 response DTO를 직접 참조하는 것을 허용함. 이는 CQRS 아키텍처에서 읽기 전용 작업의 효율성을 위한 팀 컨벤션임.
Learnt from: seongjunnoh
PR: THIP-TextHip/THIP-Server#43
File: src/main/java/konkuk/thip/book/application/port/out/BookCommandPort.java:0-0
Timestamp: 2025-07-03T03:05:05.031Z
Learning: THIP 프로젝트에서는 CQRS Port 분리 시 다음 컨벤션을 따름: CommandPort에는 findByXXX를 통해 도메인 엔티티를 찾아오는 메서드를 추가하고, QueryPort에는 조회 API의 response에 해당하는 데이터들을 DB로부터 조회하는 메서드를 추가함.
src/main/java/konkuk/thip/record/adapter/out/persistence/RecordQueryPersistenceAdapter.java (2)
Learnt from: seongjunnoh
PR: THIP-TextHip/THIP-Server#43
File: src/main/java/konkuk/thip/book/application/port/out/BookCommandPort.java:0-0
Timestamp: 2025-07-03T03:05:05.031Z
Learning: THIP 프로젝트에서는 CQRS Port 분리 시 다음 컨벤션을 따름: CommandPort에는 findByXXX를 통해 도메인 엔티티를 찾아오는 메서드를 추가하고, QueryPort에는 조회 API의 response에 해당하는 데이터들을 DB로부터 조회하는 메서드를 추가함.
Learnt from: buzz0331
PR: THIP-TextHip/THIP-Server#78
File: src/main/java/konkuk/thip/user/application/port/out/FollowingQueryPort.java:3-3
Timestamp: 2025-07-14T18:22:56.495Z
Learning: THIP 프로젝트에서는 Query API(조회 API)에 한해서는 application 계층에서 adapter.in.web.response 패키지의 response DTO를 직접 참조하는 것을 허용함. 이는 CQRS 아키텍처에서 읽기 전용 작업의 효율성을 위한 팀 컨벤션임.
src/main/java/konkuk/thip/room/adapter/out/persistence/repository/RoomQueryRepository.java (1)
Learnt from: buzz0331
PR: THIP-TextHip/THIP-Server#78
File: src/main/java/konkuk/thip/user/application/port/out/FollowingQueryPort.java:3-3
Timestamp: 2025-07-14T18:22:56.495Z
Learning: THIP 프로젝트에서는 Query API(조회 API)에 한해서는 application 계층에서 adapter.in.web.response 패키지의 response DTO를 직접 참조하는 것을 허용함. 이는 CQRS 아키텍처에서 읽기 전용 작업의 효율성을 위한 팀 컨벤션임.
src/main/java/konkuk/thip/record/adapter/out/persistence/RecordCommandPersistenceAdapter.java (1)
Learnt from: seongjunnoh
PR: THIP-TextHip/THIP-Server#43
File: src/main/java/konkuk/thip/book/application/port/out/BookCommandPort.java:0-0
Timestamp: 2025-07-03T03:05:05.031Z
Learning: THIP 프로젝트에서는 CQRS Port 분리 시 다음 컨벤션을 따름: CommandPort에는 findByXXX를 통해 도메인 엔티티를 찾아오는 메서드를 추가하고, QueryPort에는 조회 API의 response에 해당하는 데이터들을 DB로부터 조회하는 메서드를 추가함.
src/main/java/konkuk/thip/record/adapter/out/persistence/repository/RecordQueryRepository.java (1)
Learnt from: buzz0331
PR: THIP-TextHip/THIP-Server#78
File: src/main/java/konkuk/thip/user/application/port/out/FollowingQueryPort.java:3-3
Timestamp: 2025-07-14T18:22:56.495Z
Learning: THIP 프로젝트에서는 Query API(조회 API)에 한해서는 application 계층에서 adapter.in.web.response 패키지의 response DTO를 직접 참조하는 것을 허용함. 이는 CQRS 아키텍처에서 읽기 전용 작업의 효율성을 위한 팀 컨벤션임.
src/main/java/konkuk/thip/recentSearch/adapter/out/persistence/RecentSearchCommandPersistenceAdapter.java (2)
Learnt from: seongjunnoh
PR: THIP-TextHip/THIP-Server#43
File: src/main/java/konkuk/thip/book/application/port/out/BookCommandPort.java:0-0
Timestamp: 2025-07-03T03:05:05.031Z
Learning: THIP 프로젝트에서는 CQRS Port 분리 시 다음 컨벤션을 따름: CommandPort에는 findByXXX를 통해 도메인 엔티티를 찾아오는 메서드를 추가하고, QueryPort에는 조회 API의 response에 해당하는 데이터들을 DB로부터 조회하는 메서드를 추가함.
Learnt from: seongjunnoh
PR: THIP-TextHip/THIP-Server#36
File: src/main/java/konkuk/thip/user/adapter/out/persistence/UserJpaRepository.java:7-7
Timestamp: 2025-06-29T09:47:31.299Z
Learning: Spring Data JPA에서 findBy{FieldName} 패턴의 메서드는 명시적 선언 없이 자동으로 생성되며, Optional<Entity> 반환 타입을 사용하는 것이 null 안전성을 위해 권장됩니다.
src/main/java/konkuk/thip/vote/domain/VoteParticipant.java (1)
Learnt from: buzz0331
PR: THIP-TextHip/THIP-Server#75
File: src/main/java/konkuk/thip/vote/adapter/out/persistence/VoteQueryRepositoryImpl.java:50-83
Timestamp: 2025-07-14T14:19:38.762Z
Learning: Vote와 VoteItem 엔티티는 자주 함께 사용되므로, N+1 문제를 방지하기 위해 양방향 매핑과 fetch join을 고려하는 것이 좋습니다. 특히 기록장 조회 API 등에서도 함께 사용될 가능성이 높습니다.
src/test/java/konkuk/thip/room/adapter/in/web/RoomGetMemberListApiTest.java (1)
Learnt from: hd0rable
PR: THIP-TextHip/THIP-Server#57
File: src/test/java/konkuk/thip/room/domain/RoomTest.java:0-0
Timestamp: 2025-07-08T16:30:33.771Z
Learning: Room 도메인에서 startDate는 현재 날짜 이후여야 하는 도메인 규칙이 있어서, 테스트에서 만료된 상태를 시뮬레이션하려면 reflection을 사용해야 한다.
src/main/java/konkuk/thip/user/adapter/out/persistence/UserCommandPersistenceAdapter.java (1)
Learnt from: seongjunnoh
PR: THIP-TextHip/THIP-Server#43
File: src/main/java/konkuk/thip/book/application/port/out/BookCommandPort.java:0-0
Timestamp: 2025-07-03T03:05:05.031Z
Learning: THIP 프로젝트에서는 CQRS Port 분리 시 다음 컨벤션을 따름: CommandPort에는 findByXXX를 통해 도메인 엔티티를 찾아오는 메서드를 추가하고, QueryPort에는 조회 API의 response에 해당하는 데이터들을 DB로부터 조회하는 메서드를 추가함.
src/main/java/konkuk/thip/room/adapter/out/persistence/RoomCommandPersistenceAdapter.java (1)
Learnt from: seongjunnoh
PR: THIP-TextHip/THIP-Server#43
File: src/main/java/konkuk/thip/book/application/port/out/BookCommandPort.java:0-0
Timestamp: 2025-07-03T03:05:05.031Z
Learning: THIP 프로젝트에서는 CQRS Port 분리 시 다음 컨벤션을 따름: CommandPort에는 findByXXX를 통해 도메인 엔티티를 찾아오는 메서드를 추가하고, QueryPort에는 조회 API의 response에 해당하는 데이터들을 DB로부터 조회하는 메서드를 추가함.
src/main/java/konkuk/thip/room/application/service/RoomGetMemberListService.java (1)
Learnt from: seongjunnoh
PR: THIP-TextHip/THIP-Server#43
File: src/main/java/konkuk/thip/book/application/port/out/BookCommandPort.java:0-0
Timestamp: 2025-07-03T03:05:05.031Z
Learning: THIP 프로젝트에서는 CQRS Port 분리 시 다음 컨벤션을 따름: CommandPort에는 findByXXX를 통해 도메인 엔티티를 찾아오는 메서드를 추가하고, QueryPort에는 조회 API의 response에 해당하는 데이터들을 DB로부터 조회하는 메서드를 추가함.
src/test/java/konkuk/thip/book/adapter/in/web/BookDetailSearchControllerTest.java (1)
Learnt from: hd0rable
PR: THIP-TextHip/THIP-Server#57
File: src/test/java/konkuk/thip/room/domain/RoomTest.java:0-0
Timestamp: 2025-07-08T16:30:33.771Z
Learning: Room 도메인에서 startDate는 현재 날짜 이후여야 하는 도메인 규칙이 있어서, 테스트에서 만료된 상태를 시뮬레이션하려면 reflection을 사용해야 한다.
src/main/java/konkuk/thip/room/application/service/RoomShowRecruitingDetailViewService.java (1)
Learnt from: seongjunnoh
PR: THIP-TextHip/THIP-Server#43
File: src/main/java/konkuk/thip/book/application/port/out/BookCommandPort.java:0-0
Timestamp: 2025-07-03T03:05:05.031Z
Learning: THIP 프로젝트에서는 CQRS Port 분리 시 다음 컨벤션을 따름: CommandPort에는 findByXXX를 통해 도메인 엔티티를 찾아오는 메서드를 추가하고, QueryPort에는 조회 API의 response에 해당하는 데이터들을 DB로부터 조회하는 메서드를 추가함.
src/main/java/konkuk/thip/vote/adapter/out/persistence/VoteCommandPersistenceAdapter.java (1)
Learnt from: buzz0331
PR: THIP-TextHip/THIP-Server#75
File: src/main/java/konkuk/thip/vote/adapter/out/persistence/VoteQueryRepositoryImpl.java:50-83
Timestamp: 2025-07-14T14:19:38.762Z
Learning: Vote와 VoteItem 엔티티는 자주 함께 사용되므로, N+1 문제를 방지하기 위해 양방향 매핑과 fetch join을 고려하는 것이 좋습니다. 특히 기록장 조회 API 등에서도 함께 사용될 가능성이 높습니다.
src/main/java/konkuk/thip/vote/adapter/out/persistence/VoteQueryPersistenceAdapter.java (1)
Learnt from: buzz0331
PR: THIP-TextHip/THIP-Server#75
File: src/main/java/konkuk/thip/vote/adapter/out/persistence/VoteQueryRepositoryImpl.java:50-83
Timestamp: 2025-07-14T14:19:38.762Z
Learning: Vote와 VoteItem 엔티티는 자주 함께 사용되므로, N+1 문제를 방지하기 위해 양방향 매핑과 fetch join을 고려하는 것이 좋습니다. 특히 기록장 조회 API 등에서도 함께 사용될 가능성이 높습니다.
src/test/java/konkuk/thip/room/adapter/in/web/RoomPlayingDetailViewApiTest.java (2)
Learnt from: buzz0331
PR: THIP-TextHip/THIP-Server#75
File: src/main/java/konkuk/thip/vote/adapter/out/persistence/VoteQueryRepositoryImpl.java:50-83
Timestamp: 2025-07-14T14:19:38.762Z
Learning: Vote와 VoteItem 엔티티는 자주 함께 사용되므로, N+1 문제를 방지하기 위해 양방향 매핑과 fetch join을 고려하는 것이 좋습니다. 특히 기록장 조회 API 등에서도 함께 사용될 가능성이 높습니다.
Learnt from: hd0rable
PR: THIP-TextHip/THIP-Server#57
File: src/test/java/konkuk/thip/room/domain/RoomTest.java:0-0
Timestamp: 2025-07-08T16:30:33.771Z
Learning: Room 도메인에서 startDate는 현재 날짜 이후여야 하는 도메인 규칙이 있어서, 테스트에서 만료된 상태를 시뮬레이션하려면 reflection을 사용해야 한다.
src/main/java/konkuk/thip/user/adapter/out/persistence/UserQueryPersistenceAdapter.java (1)
Learnt from: seongjunnoh
PR: THIP-TextHip/THIP-Server#43
File: src/main/java/konkuk/thip/book/application/port/out/BookCommandPort.java:0-0
Timestamp: 2025-07-03T03:05:05.031Z
Learning: THIP 프로젝트에서는 CQRS Port 분리 시 다음 컨벤션을 따름: CommandPort에는 findByXXX를 통해 도메인 엔티티를 찾아오는 메서드를 추가하고, QueryPort에는 조회 API의 response에 해당하는 데이터들을 DB로부터 조회하는 메서드를 추가함.
src/main/java/konkuk/thip/room/application/service/RoomShowPlayingDetailViewService.java (2)
Learnt from: seongjunnoh
PR: THIP-TextHip/THIP-Server#43
File: src/main/java/konkuk/thip/book/application/port/out/BookCommandPort.java:0-0
Timestamp: 2025-07-03T03:05:05.031Z
Learning: THIP 프로젝트에서는 CQRS Port 분리 시 다음 컨벤션을 따름: CommandPort에는 findByXXX를 통해 도메인 엔티티를 찾아오는 메서드를 추가하고, QueryPort에는 조회 API의 response에 해당하는 데이터들을 DB로부터 조회하는 메서드를 추가함.
Learnt from: buzz0331
PR: THIP-TextHip/THIP-Server#75
File: src/main/java/konkuk/thip/vote/adapter/out/persistence/VoteQueryRepositoryImpl.java:50-83
Timestamp: 2025-07-14T14:19:38.762Z
Learning: Vote와 VoteItem 엔티티는 자주 함께 사용되므로, N+1 문제를 방지하기 위해 양방향 매핑과 fetch join을 고려하는 것이 좋습니다. 특히 기록장 조회 API 등에서도 함께 사용될 가능성이 높습니다.
src/test/java/konkuk/thip/room/adapter/in/web/RoomRecruitingDetailViewApiTest.java (1)
Learnt from: hd0rable
PR: THIP-TextHip/THIP-Server#57
File: src/test/java/konkuk/thip/room/domain/RoomTest.java:0-0
Timestamp: 2025-07-08T16:30:33.771Z
Learning: Room 도메인에서 startDate는 현재 날짜 이후여야 하는 도메인 규칙이 있어서, 테스트에서 만료된 상태를 시뮬레이션하려면 reflection을 사용해야 한다.
src/test/java/konkuk/thip/room/domain/RoomParticipantTest.java (1)
Learnt from: hd0rable
PR: THIP-TextHip/THIP-Server#57
File: src/test/java/konkuk/thip/room/domain/RoomTest.java:0-0
Timestamp: 2025-07-08T16:30:33.771Z
Learning: Room 도메인에서 startDate는 현재 날짜 이후여야 하는 도메인 규칙이 있어서, 테스트에서 만료된 상태를 시뮬레이션하려면 reflection을 사용해야 한다.
src/main/java/konkuk/thip/room/adapter/out/persistence/repository/RoomParticipantJpaRepository.java (1)
Learnt from: seongjunnoh
PR: THIP-TextHip/THIP-Server#43
File: src/main/java/konkuk/thip/book/application/port/out/BookCommandPort.java:0-0
Timestamp: 2025-07-03T03:05:05.031Z
Learning: THIP 프로젝트에서는 CQRS Port 분리 시 다음 컨벤션을 따름: CommandPort에는 findByXXX를 통해 도메인 엔티티를 찾아오는 메서드를 추가하고, QueryPort에는 조회 API의 response에 해당하는 데이터들을 DB로부터 조회하는 메서드를 추가함.
src/main/java/konkuk/thip/vote/adapter/out/mapper/VoteParticipantMapper.java (1)
Learnt from: buzz0331
PR: THIP-TextHip/THIP-Server#75
File: src/main/java/konkuk/thip/vote/adapter/out/persistence/VoteQueryRepositoryImpl.java:50-83
Timestamp: 2025-07-14T14:19:38.762Z
Learning: Vote와 VoteItem 엔티티는 자주 함께 사용되므로, N+1 문제를 방지하기 위해 양방향 매핑과 fetch join을 고려하는 것이 좋습니다. 특히 기록장 조회 API 등에서도 함께 사용될 가능성이 높습니다.
src/main/java/konkuk/thip/vote/adapter/out/persistence/repository/VoteParticipantJpaRepository.java (1)
Learnt from: buzz0331
PR: THIP-TextHip/THIP-Server#75
File: src/main/java/konkuk/thip/vote/adapter/out/persistence/VoteQueryRepositoryImpl.java:50-83
Timestamp: 2025-07-14T14:19:38.762Z
Learning: Vote와 VoteItem 엔티티는 자주 함께 사용되므로, N+1 문제를 방지하기 위해 양방향 매핑과 fetch join을 고려하는 것이 좋습니다. 특히 기록장 조회 API 등에서도 함께 사용될 가능성이 높습니다.
src/main/java/konkuk/thip/vote/adapter/out/jpa/VoteParticipantJpaEntity.java (1)
Learnt from: buzz0331
PR: THIP-TextHip/THIP-Server#75
File: src/main/java/konkuk/thip/vote/adapter/out/persistence/VoteQueryRepositoryImpl.java:50-83
Timestamp: 2025-07-14T14:19:38.762Z
Learning: Vote와 VoteItem 엔티티는 자주 함께 사용되므로, N+1 문제를 방지하기 위해 양방향 매핑과 fetch join을 고려하는 것이 좋습니다. 특히 기록장 조회 API 등에서도 함께 사용될 가능성이 높습니다.
src/test/java/konkuk/thip/record/adapter/in/web/RecordCreateControllerTest.java (1)
Learnt from: hd0rable
PR: THIP-TextHip/THIP-Server#57
File: src/test/java/konkuk/thip/room/domain/RoomTest.java:0-0
Timestamp: 2025-07-08T16:30:33.771Z
Learning: Room 도메인에서 startDate는 현재 날짜 이후여야 하는 도메인 규칙이 있어서, 테스트에서 만료된 상태를 시뮬레이션하려면 reflection을 사용해야 한다.
src/main/java/konkuk/thip/room/adapter/out/persistence/RoomParticipantCommandPersistenceAdapter.java (1)
Learnt from: seongjunnoh
PR: THIP-TextHip/THIP-Server#43
File: src/main/java/konkuk/thip/book/application/port/out/BookCommandPort.java:0-0
Timestamp: 2025-07-03T03:05:05.031Z
Learning: THIP 프로젝트에서는 CQRS Port 분리 시 다음 컨벤션을 따름: CommandPort에는 findByXXX를 통해 도메인 엔티티를 찾아오는 메서드를 추가하고, QueryPort에는 조회 API의 response에 해당하는 데이터들을 DB로부터 조회하는 메서드를 추가함.
src/main/java/konkuk/thip/user/application/port/out/UserRoomCommandPort.java (1)
Learnt from: seongjunnoh
PR: THIP-TextHip/THIP-Server#43
File: src/main/java/konkuk/thip/book/application/port/out/BookCommandPort.java:0-0
Timestamp: 2025-07-03T03:05:05.031Z
Learning: THIP 프로젝트에서는 CQRS Port 분리 시 다음 컨벤션을 따름: CommandPort에는 findByXXX를 통해 도메인 엔티티를 찾아오는 메서드를 추가하고, QueryPort에는 조회 API의 response에 해당하는 데이터들을 DB로부터 조회하는 메서드를 추가함.
src/main/java/konkuk/thip/record/application/service/RecordCreateService.java (1)
Learnt from: seongjunnoh
PR: THIP-TextHip/THIP-Server#43
File: src/main/java/konkuk/thip/book/application/port/out/BookCommandPort.java:0-0
Timestamp: 2025-07-03T03:05:05.031Z
Learning: THIP 프로젝트에서는 CQRS Port 분리 시 다음 컨벤션을 따름: CommandPort에는 findByXXX를 통해 도메인 엔티티를 찾아오는 메서드를 추가하고, QueryPort에는 조회 API의 response에 해당하는 데이터들을 DB로부터 조회하는 메서드를 추가함.
src/main/java/konkuk/thip/book/adapter/out/persistence/BookCommandPersistenceAdapter.java (1)
Learnt from: seongjunnoh
PR: THIP-TextHip/THIP-Server#43
File: src/main/java/konkuk/thip/book/application/port/out/BookCommandPort.java:0-0
Timestamp: 2025-07-03T03:05:05.031Z
Learning: THIP 프로젝트에서는 CQRS Port 분리 시 다음 컨벤션을 따름: CommandPort에는 findByXXX를 통해 도메인 엔티티를 찾아오는 메서드를 추가하고, QueryPort에는 조회 API의 response에 해당하는 데이터들을 DB로부터 조회하는 메서드를 추가함.
🧬 Code Graph Analysis (17)
src/test/java/konkuk/thip/room/adapter/out/jpa/VoteJpaEntityTest.java (1)
src/test/java/konkuk/thip/common/util/TestEntityFactory.java (1)
  • TestEntityFactory (16-147)
src/test/java/konkuk/thip/room/adapter/in/web/RoomCreateAPITest.java (1)
src/test/java/konkuk/thip/common/util/TestEntityFactory.java (1)
  • TestEntityFactory (16-147)
src/test/java/konkuk/thip/book/adapter/in/web/BookChangeSavedControllerTest.java (1)
src/test/java/konkuk/thip/common/util/TestEntityFactory.java (1)
  • TestEntityFactory (16-147)
src/test/java/konkuk/thip/room/adapter/in/web/RoomGetMemberListApiTest.java (1)
src/test/java/konkuk/thip/common/util/TestEntityFactory.java (1)
  • TestEntityFactory (16-147)
src/test/java/konkuk/thip/room/adapter/out/jpa/RecordJpaEntityTest.java (1)
src/test/java/konkuk/thip/common/util/TestEntityFactory.java (1)
  • TestEntityFactory (16-147)
src/test/java/konkuk/thip/feed/adapter/out/jpa/FeedJpaEntityTest.java (1)
src/test/java/konkuk/thip/common/util/TestEntityFactory.java (1)
  • TestEntityFactory (16-147)
src/main/java/konkuk/thip/room/domain/RoomParticipant.java (1)
src/main/java/konkuk/thip/room/domain/RoomParticipants.java (1)
  • Getter (12-55)
src/main/java/konkuk/thip/room/adapter/out/persistence/RoomCommandPersistenceAdapter.java (1)
src/main/java/konkuk/thip/common/exception/EntityNotFoundException.java (1)
  • EntityNotFoundException (5-10)
src/main/java/konkuk/thip/saved/adapter/out/persistence/SavedCommandPersistenceAdapter.java (1)
src/main/java/konkuk/thip/common/exception/EntityNotFoundException.java (1)
  • EntityNotFoundException (5-10)
src/test/java/konkuk/thip/book/adapter/in/web/BookDetailSearchControllerTest.java (1)
src/test/java/konkuk/thip/common/util/TestEntityFactory.java (1)
  • TestEntityFactory (16-147)
src/test/java/konkuk/thip/room/adapter/in/web/RoomVerifyPasswordAPITest.java (1)
src/test/java/konkuk/thip/common/util/TestEntityFactory.java (1)
  • TestEntityFactory (16-147)
src/test/java/konkuk/thip/room/adapter/in/web/RoomSearchApiTest.java (1)
src/test/java/konkuk/thip/common/util/TestEntityFactory.java (1)
  • TestEntityFactory (16-147)
src/main/java/konkuk/thip/room/adapter/out/jpa/RoomParticipantRole.java (2)
src/main/java/konkuk/thip/room/domain/RoomParticipants.java (1)
  • Getter (12-55)
src/main/java/konkuk/thip/room/domain/RoomParticipant.java (1)
  • Getter (7-37)
src/main/java/konkuk/thip/vote/adapter/out/jpa/VoteParticipantJpaEntity.java (1)
src/main/java/konkuk/thip/vote/domain/VoteParticipant.java (1)
  • Getter (7-16)
src/test/java/konkuk/thip/record/adapter/in/web/RecordCreateControllerTest.java (1)
src/test/java/konkuk/thip/common/util/TestEntityFactory.java (1)
  • TestEntityFactory (16-147)
src/test/java/konkuk/thip/room/adapter/in/web/RoomGetHomeJoinedRoomsApiTest.java (1)
src/test/java/konkuk/thip/common/util/TestEntityFactory.java (1)
  • TestEntityFactory (16-147)
src/main/java/konkuk/thip/book/adapter/out/persistence/BookCommandPersistenceAdapter.java (1)
src/main/java/konkuk/thip/common/exception/EntityNotFoundException.java (1)
  • EntityNotFoundException (5-10)
🔇 Additional comments (118)
src/main/java/konkuk/thip/attendanceCheck/adapter/out/persistence/repository/AttendanceCheckRepository.java (1)

1-1: 패키지 구조 정리가 올바르게 적용되었습니다.

저장소 인터페이스를 .repository 하위 패키지로 이동하는 것이 PR 목표와 일치하며, 코드 구조가 더 명확해졌습니다.

src/main/java/konkuk/thip/attendanceCheck/adapter/out/persistence/AttendanceCheckCommandPersistenceAdapter.java (2)

4-4: 저장소 임포트가 올바르게 추가되었습니다.

새로운 패키지 구조에 맞춰 AttendanceCheckRepository 임포트가 정확히 업데이트되었습니다.


13-13: 저장소 필드 추가가 적절합니다.

AttendanceCheckRepository 의존성이 올바르게 주입되도록 설정되었습니다.

src/main/java/konkuk/thip/attendanceCheck/adapter/out/persistence/AttendanceCheckQueryPersistenceAdapter.java (1)

4-4: 저장소 임포트가 올바르게 추가되었습니다.

새로운 패키지 구조에 맞춰 AttendanceCheckRepository 임포트가 정확히 업데이트되었습니다.

src/main/java/konkuk/thip/notification/adapter/out/persistence/repository/NotificationJpaRepository.java (1)

1-1: 패키지 이동 적절 👍

repository 서브패키지로의 이동이 다른 모듈과 구조를 맞추어 가독성과 탐색성을 향상합니다. 별다른 문제 없습니다.

src/main/java/konkuk/thip/notification/adapter/out/persistence/NotificationQueryPersistenceAdapter.java (1)

4-14: 필드 명칭 일관성 제안

NotificationCommandPersistenceAdapter에서는 notificationJpaRepository 라는 명확한 변수명을 사용하고 있습니다. 이 클래스의 jpaRepository 도 같은 스타일로 맞추면 가독성과 검색성이 좋아집니다.

-    private final NotificationJpaRepository jpaRepository;
+    private final NotificationJpaRepository notificationJpaRepository;

[ suggest_nitpick ]

src/main/java/konkuk/thip/notification/adapter/out/persistence/NotificationCommandPersistenceAdapter.java (1)

4-14: 변경된 패키지 경로 import 확인 완료

새로운 repository 경로로의 import 추가가 필드 선언과 정확히 매칭됩니다. 불필요한 의존성이나 컴파일 오류 우려 없습니다.

src/test/java/konkuk/thip/room/adapter/out/jpa/VoteJpaEntityTest.java (1)

5-14: 패키지 경로 확인 필요

리포지토리 클래스들의 패키지 경로가 adapter.out.persistence.repository 로 변경되었는데, 실제 리팩터 결과와 일치하는지 한번 더 확인해주세요.
특히 CI 환경에서 컴파일 오류가 발생하기 쉬우므로, 각 인터페이스가 해당 경로로 이동되었는지 검증이 필요합니다.
mvn test 혹은 ./gradlew test 로 빠르게 확인해보시면 좋겠습니다.

src/main/java/konkuk/thip/comment/adapter/out/persistence/repository/CommentJpaRepository.java (1)

6-8: 엔티티 프로퍼티 경로 확인 완료
검증 결과:

  • CommentJpaEntityprivate PostJpaEntity postJpaEntity; 필드가 존재합니다.
  • PostJpaEntityprivate Long postId; 필드가 존재합니다.

따라서 countByPostJpaEntity_PostId 메서드 네이밍은 올바르게 설정되어 있습니다.

src/main/java/konkuk/thip/book/adapter/out/api/naver/NaverApiClient.java (1)

1-1: 패키지 이동 확인 완료

패키지 경로 변경이 일관성 있게 반영되었습니다. @Component가 스캔되는 기본 패키지(konkuk.thip..) 범위를 그대로 유지한다면 추가 설정 없이 정상 동작할 것으로 보입니다.

src/main/java/konkuk/thip/book/adapter/out/api/naver/NaverApiUtil.java (1)

1-1: 패키지 이동 확인

모든 참조(import)도 함께 업데이트된 것으로 보입니다. 별다른 문제를 발견하지 못했습니다.

src/test/java/konkuk/thip/book/adapter/out/api/naver/NaverApiUtilTest.java (1)

1-1: 테스트 클래스 패키지 경로 수정 확인

테스트 코드 역시 새 패키지로 이동되어, 빌드 및 실행 시 패키지 불일치 문제가 발생하지 않을 것으로 보입니다.

src/main/java/konkuk/thip/book/adapter/out/api/naver/NaverBookXmlParser.java (1)

1-1: 패키지 이동 검토 완료

관련 Naver API 구성요소가 동일한 naver 서브패키지로 통합되어 모듈 구조가 더 명확해졌습니다.

src/main/java/konkuk/thip/book/adapter/out/api/CompositeBookApiAdapter.java (1)

6-6: NaverApiClient import 추가로 필드 주입 정상화

NaverApiClient를 이미 필드로 사용하고 있었으나 import가 누락되어 있었습니다. 이번 추가로 컴파일 오류가 해결되므로 변경 사항은 적절합니다.

src/main/java/konkuk/thip/book/application/service/BookSearchService.java (1)

29-29: PAGE_SIZE static import 경로 확인 완료

리포지토리 전체를 검색한 결과, adapter.out.api.NaverApiUtil.PAGE_SIZE를 참조하는 구(舊) 경로가 더 이상 존재하지 않습니다.
모든 파일에서 최신 경로(konkuk.thip.book.adapter.out.api.naver.NaverApiUtil.PAGE_SIZE)로 일관되게 적용되어 있습니다.

src/main/java/konkuk/thip/room/adapter/out/persistence/repository/RoomJpaRepository.java (1)

1-8: RoomQueryRepository 임포트 위치 확인 필요

RoomJpaRepositoryRoomQueryRepository를 확장하고 있는데, 현재 파일에 별도의 import 문이 없습니다. RoomQueryRepository가 동일 패키지(repository) 안에 있다면 문제없지만, 다른 위치로 이동되었다면 컴파일 오류가 발생합니다. 패키지 리팩터링 과정에서 함께 이동했는지 한 번 더 확인해 주세요.

src/test/java/konkuk/thip/record/adapter/out/persistence/RecordQueryRepositoryImplTest.java (1)

9-9: 테스트 패키지 정리 반영 확인 완료

신규 패키지 경로에 맞춰 RecordQueryRepositoryImpl 임포트가 수정되었습니다. 테스트 실행에 필요한 빈이 정상 등록되는지만 CI에서 한 번 더 확인하면 될 것 같습니다.

src/main/java/konkuk/thip/book/adapter/out/persistence/repository/BookJpaRepository.java (1)

1-1: 패키지 이동 확인

repository 서브패키지로 이동이 잘 반영되었습니다. 별다른 문제 없어 보입니다.

src/main/java/konkuk/thip/vote/adapter/out/persistence/repository/VoteJpaRepository.java (1)

1-8: 패키지 리팩터링 확인 완료

패키지 이동 외에 로직 변화가 없으며, VoteQueryRepository와의 다중 상속 구조도 문제 없습니다.

src/main/java/konkuk/thip/user/adapter/out/persistence/repository/AliasJpaRepository.java (1)

1-11: 패키지 이동 정상 적용

리포지토리 인터페이스 구성 및 커스텀 쿼리 메서드 정의가 적절합니다.

src/main/java/konkuk/thip/user/adapter/out/persistence/repository/UserQueryRepository.java (1)

1-7: 패키지 구조 재정비 확인

인터페이스 자체 변경은 없고, 패키지 이동이 일관성 있게 반영되었습니다.

src/main/java/konkuk/thip/room/adapter/out/persistence/repository/RoomQueryRepository.java (1)

1-1: 패키지 이동 방향성 👍

repository 서브패키지로의 이동은 영속성 계층 구성에 일관성을 부여합니다. 다른 모듈과도 구조가 맞춰져 추후 가독성과 관리성이 좋아질 것으로 보입니다.

src/main/java/konkuk/thip/record/adapter/out/persistence/repository/RecordJpaRepository.java (1)

1-1: 패키지 정리 적용 확인

패키지 경로만 변경되었으며 JPA 설정과 제네릭 타입 모두 문제없습니다. 다른 Adapter/Service 클래스에서 새 경로로 임포트가 누락되지 않았는지만 한 번 더 빌드로 확인 부탁드립니다.

src/main/java/konkuk/thip/user/adapter/out/persistence/repository/AliasQueryRepository.java (1)

1-1: 패키지 구조 통일 👍

리포지토리 전용 서브패키지로 이동 완료된 것 확인했습니다. 변화로 인한 컴파일 오류는 없을 것으로 보입니다.

src/main/java/konkuk/thip/saved/adapter/out/persistence/repository/SavedFeedJpaRepository.java (1)

1-1: 패키지 이동 확인

정상적으로 repository 하위로 이동되었습니다. 추가 로직 변경이 없으므로 LGTM입니다.

src/main/java/konkuk/thip/room/adapter/out/persistence/repository/CategoryJpaRepository.java (1)

1-1: 구조 개선 반영

패키지 이동 외 변화가 없고, findByValue 시그니처도 그대로 유지되어 문제없습니다.

src/main/java/konkuk/thip/vote/adapter/out/persistence/repository/VoteQueryRepositoryImpl.java (1)

1-1: 패키지 이동 LGTM

패키지를 ...persistence.repository로 이동하여 계층 구분이 명확해졌습니다. 스프링 컴포넌트 스캔 패스가 기존과 같다면 추가 설정 없이 정상 주입될 것으로 보입니다.

src/main/java/konkuk/thip/room/adapter/out/persistence/RoomQueryPersistenceAdapter.java (1)

7-8: 불필요한 직접 의존성 여부 확인

RoomQueryPersistenceAdapterRoomJpaRepository에 직접 의존하도록 변경되었습니다. Query 전용 포트에서 Command 메서드를 호출하지 않도록, 리포지토리에서 제공하는 쿼리들이 CQRS 규칙에 부합하는지 한번 더 확인 부탁드립니다.

src/main/java/konkuk/thip/record/adapter/out/persistence/repository/RecordQueryRepository.java (1)

1-1: 기존 패키지 경로 잔여 없음 확인
전역 검색 결과 konkuk.thip.record.adapter.out.persistence.RecordQueryRepository 로 남아 있는 import나 참조가 전혀 발견되지 않았습니다. 모든 참조가 …persistence.repository… 하위로 올바르게 이동된 상태입니다.

src/main/java/konkuk/thip/user/adapter/out/persistence/repository/following/FollowingQueryRepository.java (1)

1-1: 패키지 경로 정상 반영 및 잔여 참조 없음 확인 완료

  • rg --line-number 'adapter\.out\.persistence\.FollowingQueryRepository' 검색 결과 없음
  • FollowingQueryRepository, FollowingQueryRepositoryImpl, FollowingJpaRepository 모두
    src/main/java/konkuk/thip/user/adapter/out/persistence/repository/following/ 하위에 위치
  • 동일 패키지 내 사용으로 별도 import 문도 존재하지 않음

추가 수정 불필요합니다.

src/main/java/konkuk/thip/saved/adapter/out/persistence/repository/SavedBookJpaRepository.java (1)

1-1: 패키지 리팩터링 적용 확인

패키지 이동 자체는 문제없어 보입니다. 다른 모듈에서 해당 Repo 를 주입받는 부분의 import 경로도 함께 수정되었는지 검증 부탁드립니다.

src/main/java/konkuk/thip/record/adapter/out/persistence/RecordQueryPersistenceAdapter.java (1)

4-4: import 경로 수정 확인 완료

RecordJpaRepository 의 패키지 이동을 정확히 반영했습니다.

src/main/java/konkuk/thip/recentSearch/adapter/out/persistence/repository/RecentSearchJpaRepository.java (1)

1-1: repository 하위 패키지로 이동 완료

패키지 구조 리팩터링이 일관성 있게 적용되었습니다.

src/main/java/konkuk/thip/recentSearch/adapter/out/persistence/RecentSearchCommandPersistenceAdapter.java (1)

6-11: import 경로 정리 확인

RecentSearchJpaRepository, UserJpaRepository 모두 새로운 repository 패키지 경로를 사용하도록 수정되었습니다.

src/test/java/konkuk/thip/user/adapter/in/web/UserVerifyNicknameControllerTest.java (1)

9-10: 테스트 코드 import 경로 업데이트 완료

리팩터링된 패키지 구조와 일치합니다. 별다른 이슈 없습니다.

src/test/java/konkuk/thip/book/adapter/in/web/BookMostSearchedBooksControllerTest.java (1)

10-11: import 경로 업데이트 확인

AliasJpaRepository, UserJpaRepository 의 위치 변경이 올바르게 반영되었습니다.

src/main/java/konkuk/thip/common/security/oauth2/CustomOAuth2UserService.java (1)

5-5: 레거시 경로 미사용 확인 완료

프로젝트 전반에서 konkuk.thip.user.adapter.out.persistence.UserJpaRepository import가 더 이상 존재하지 않음을 확인했습니다. 추가 조치가 필요 없습니다.

src/main/java/konkuk/thip/record/adapter/out/persistence/RecordCommandPersistenceAdapter.java (1)

5-11: 리포지토리 경로 정리는 일관성 있게 반영됨

RecordJpaRepository, RoomJpaRepository, UserJpaRepository 모두 새로운 repository 서브패키지로 이동된 것이 잘 반영되었습니다. 추가 수정 사항 없이 컴파일될 것으로 보입니다.

src/test/java/konkuk/thip/user/adapter/out/jpa/UserJpaEntityTest.java (1)

6-7: 테스트 코드 import 경로 업데이트 확인

테스트에서도 변경된 패키지 경로가 올바르게 반영되었습니다. 테스트 실행 시 컴파일 이슈는 없을 것으로 예상됩니다.

src/test/java/konkuk/thip/user/adapter/in/web/UserSignupControllerTest.java (1)

10-11: 통합 테스트 import 경로 업데이트 확인

AliasJpaRepository, UserJpaRepository import 경로 변경이 정상 적용되었습니다. 다른 테스트 파일에도 동일 패턴이 적용되었는지 한번 더 확인 부탁드립니다.

src/test/java/konkuk/thip/book/adapter/in/web/BookQueryControllerTest.java (1)

8-13: 복수 리포지토리 경로 변경 정상 반영

RecentSearchJpaRepository, AliasJpaRepository, UserJpaRepository 모두 새로운 위치로 수정되었습니다. 기능적 영향은 없을 것으로 판단됩니다.

src/main/java/konkuk/thip/user/adapter/out/persistence/FollowingQueryPersistenceAdapter.java (1)

7-7: 새 패키지 경로 import 정상 적용 확인

FollowingJpaRepository 경로가 repository.following으로 교체된 부분 문제 없습니다. 기존 컴포넌트 스캔 범위(예: @SpringBootApplication(scanBasePackages = "konkuk.thip"))가 그대로라면 별도 설정 없이 빈 등록이 이루어질 것입니다.

src/main/java/konkuk/thip/book/adapter/out/persistence/BookQueryPersistenceAdapter.java (1)

4-4: Import 경로 수정 확인 완료

패키지 구조 변경에 맞춘 BookJpaRepository 경로 수정이 적절합니다. 추가 조치 필요 없습니다.

src/main/java/konkuk/thip/vote/adapter/out/persistence/VoteCommandPersistenceAdapter.java (1)

6-14: 리포지토리 패키지 이동 후 빈 스캔 범위 확인 필요

리포지토리들이 ...adapter.out.persistence.repository 하위로 이동되면서 import 경로가 변경되었습니다.
기존에 @EnableJpaRepositories 등으로 특정 패키지에 한정해서 스캔하고 있었다면, 새 경로가 포함되는지 한번 더 확인해 주세요. Spring Boot 기본 설정(루트 패키지 기준 재귀 스캔)을 사용 중이라면 문제 없을 것입니다.

src/test/java/konkuk/thip/user/adapter/in/web/UserViewAliasChoiceControllerTest.java (1)

7-10: 패키지 경로 변경 적용 확인 완료
CategoryJpaRepositoryAliasJpaRepository의 새 경로가 정상적으로 반영되었습니다. 테스트 클래스 내부 로직에도 추가 수정이 필요 없어 보입니다.

src/test/java/konkuk/thip/room/adapter/out/jpa/RoomJpaEntityTest.java (1)

7-11: 경로 변경 적용 완료
새로운 repository 서브패키지 경로로의 수정이 잘 반영되었습니다. 테스트 로직에도 영향이 없음을 확인했습니다.

src/test/java/konkuk/thip/room/adapter/out/jpa/RecordJpaEntityTest.java (1)

5-15: 경로 변경 적용 확인
모든 Repository import가 새로운 구조에 맞게 수정되었습니다. 추가적인 수정 사항은 없어 보입니다.

src/test/java/konkuk/thip/book/adapter/in/web/BookChangeSavedControllerTest.java (1)

6-6: 패키지 구조 정리에 따른 import 경로 수정 승인

Repository 인터페이스들이 .repository 하위 패키지로 이동함에 따라 import 경로가 올바르게 수정되었습니다. 기능적 변경사항은 없으며 패키지 구조 정리 목적에 부합합니다.

Also applies to: 11-11, 15-16

src/test/java/konkuk/thip/room/adapter/in/web/RoomVerifyPasswordAPITest.java (1)

5-5: 패키지 구조 정리에 따른 import 경로 수정 승인

Repository 인터페이스들이 .repository 하위 패키지로 이동함에 따라 import 경로가 올바르게 수정되었습니다. 모든 관련 repository들(BookJpaRepository, CategoryJpaRepository, AliasJpaRepository, UserJpaRepository, RoomJpaRepository)의 import가 일관되게 업데이트되었습니다.

Also applies to: 9-9, 13-14, 16-16

src/main/java/konkuk/thip/saved/adapter/out/persistence/SavedCommandPersistenceAdapter.java (1)

4-4: 패키지 구조 정리에 따른 import 경로 수정 승인

Repository 인터페이스들이 .repository 하위 패키지로 이동함에 따라 import 경로가 올바르게 수정되었습니다. 어댑터의 비즈니스 로직은 그대로 유지되면서 패키지 구조만 개선되었습니다.

Also applies to: 9-10, 13-13

src/test/java/konkuk/thip/room/adapter/in/web/RoomCreateAPITest.java (1)

6-6: 패키지 구조 정리에 따른 import 경로 수정 승인

Repository 인터페이스들이 .repository 하위 패키지로 이동함에 따라 import 경로가 올바르게 수정되었습니다. 통합 테스트의 모든 기능은 그대로 유지되면서 패키지 구조만 개선되었습니다.

Also applies to: 10-11, 15-16

src/main/java/konkuk/thip/room/adapter/out/persistence/RoomCommandPersistenceAdapter.java (1)

4-4: 패키지 구조 정리에 따른 import 경로 수정 승인

Repository 인터페이스들이 .repository 하위 패키지로 이동함에 따라 import 경로가 올바르게 수정되었습니다. 어댑터의 비즈니스 로직은 그대로 유지되면서 패키지 구조만 개선되었습니다.

Also applies to: 9-10

src/main/java/konkuk/thip/book/adapter/out/persistence/BookCommandPersistenceAdapter.java (1)

5-5: 패키지 구조 정리에 따른 import 경로 업데이트가 올바르게 적용되었습니다.

Repository 인터페이스들이 repository 서브패키지로 이동한 것에 맞춰 import 경로가 정확히 업데이트되었습니다.

Also applies to: 9-9

src/test/java/konkuk/thip/vote/adapter/in/web/VoteCreateControllerTest.java (1)

6-6: Repository 패키지 구조 정리가 일관되게 적용되었습니다.

모든 Repository 인터페이스의 import 경로가 새로운 repository 서브패키지 구조에 맞게 올바르게 업데이트되었습니다.

Also applies to: 9-10, 14-15, 19-20

src/test/java/konkuk/thip/feed/adapter/out/jpa/FeedJpaEntityTest.java (1)

5-5: Repository import 경로가 새로운 패키지 구조에 맞게 정확히 업데이트되었습니다.

패키지 구조 정리에 따라 Repository 인터페이스들의 import 경로가 올바르게 변경되었습니다.

Also applies to: 10-11

src/main/java/konkuk/thip/recentSearch/adapter/out/persistence/RecentSearchQueryPersistenceAdapter.java (1)

4-4: Repository 의존성이 일관된 아키텍처 패턴으로 추가되었습니다.

새로운 패키지 구조에 맞는 import 경로와 생성자 주입을 위한 private final 필드가 올바르게 추가되었습니다.

Also applies to: 13-13

src/main/java/konkuk/thip/room/adapter/out/mapper/RoomMapper.java (1)

23-23: memberCount 필드 매핑이 양방향으로 일관되게 추가되었습니다.

도메인 엔티티와 JPA 엔티티 간의 변환에서 memberCount 필드가 올바르게 매핑되도록 구현되었습니다.

Also applies to: 40-40

src/main/java/konkuk/thip/room/domain/RoomParticipant.java (2)

1-1: 패키지 이동이 적절하게 수행되었습니다.

UserRoom에서 RoomParticipant로의 이름 변경과 user.domain에서 room.domain으로의 패키지 이동이 도메인 응집성을 높이는 좋은 리팩토링입니다.


17-17: 필드명 변경이 일관성 있게 적용되었습니다.

userRoomRole에서 roomParticipantRole로의 필드명 변경이 클래스명 변경과 일치하여 일관성이 유지되었습니다.

src/main/java/konkuk/thip/room/adapter/out/jpa/RoomJpaEntity.java (1)

47-49: memberCount 필드 추가가 적절하게 구현되었습니다.

새로 생성된 방에 방장 1명으로 초기화하는 것이 비즈니스 로직에 맞으며, @Builder.Defaultnullable = false 설정이 적절합니다.

src/main/java/konkuk/thip/room/domain/Room.java (1)

41-41: memberCount 필드 추가가 적절합니다.

도메인 엔티티에 멤버 수를 추적하는 필드를 추가한 것은 좋은 설계입니다.

src/main/java/konkuk/thip/user/adapter/out/persistence/UserQueryPersistenceAdapter.java (1)

4-5: 저장소 인터페이스 패키지 재구성이 적절하게 반영되었습니다.

repository 서브패키지로의 이동이 일관성 있게 적용되어 코드 구조가 개선되었습니다.

src/test/java/konkuk/thip/user/adapter/in/web/UserFollowApiTest.java (1)

9-11: 테스트 코드의 import 업데이트가 올바르게 수행되었습니다.

저장소 인터페이스들의 새로운 패키지 위치가 정확히 반영되었으며, 특히 FollowingJpaRepositoryfollowing 서브패키지로 이동된 것이 도메인 구조와 일치합니다.

src/test/java/konkuk/thip/room/domain/RoomParticipantTest.java (1)

1-1: 리팩토링이 올바르게 적용되었습니다.

UserRoom에서 RoomParticipant로의 도메인 이름 변경과 패키지 이동이 일관되게 적용되었습니다. 테스트 로직과 검증 로직도 정확하게 유지되었습니다.

Also applies to: 9-9, 15-15, 20-20, 30-30, 35-35, 45-45, 54-54, 58-60, 67-67, 76-76, 80-82

src/test/java/konkuk/thip/user/adapter/in/web/UserGetFollowersApiTest.java (1)

7-9: 패키지 구조 리팩토링이 올바르게 적용되었습니다.

repository 인터페이스들이 persistence 하위의 repository 서브패키지로 올바르게 이동되었고, 클래스명도 더 명확하게 변경되었습니다.

Also applies to: 33-33

src/main/java/konkuk/thip/user/adapter/out/persistence/repository/UserQueryRepositoryImpl.java (1)

1-1: 패키지 구조와 도메인 모델 변경이 올바르게 적용되었습니다.

QUserRoomJpaEntity에서 QRoomParticipantJpaEntity로의 변경이 올바르게 적용되었습니다.

Also applies to: 5-5

src/test/java/konkuk/thip/room/adapter/in/web/RoomGetMemberListApiTest.java (1)

4-4: 도메인 모델 리팩토링이 일관되게 적용되었습니다.

UserRoom에서 RoomParticipant로의 변경사항이 모든 repository, enum, 그리고 사용처에 일관되게 적용되었습니다. 테스트 로직은 그대로 유지되면서 새로운 도메인 모델을 올바르게 사용하고 있습니다.

Also applies to: 8-16, 58-58, 85-87, 103-103, 179-179

src/main/java/konkuk/thip/room/application/service/RoomShowPlayingDetailViewService.java (1)

11-12: 도메인 모델 변경이 올바르게 적용되었습니다.

UserRoom에서 RoomParticipant로의 도메인 모델 변경이 import문과 변수 타입에 일관되게 적용되었습니다. 서비스 로직은 그대로 유지되면서 새로운 도메인 모델을 올바르게 사용하고 있습니다.

Also applies to: 40-40

src/main/java/konkuk/thip/room/application/service/RoomGetMemberListService.java (3)

11-11: 도메인 모델 변경이 올바르게 적용되었습니다.

UserRoom에서 RoomParticipant로의 리네이밍이 정확하게 반영되었습니다.


36-42: 도메인 모델 변경이 일관되게 적용되었습니다.

RoomParticipant 타입 변경과 메서드 호출이 올바르게 수정되었습니다.


49-63: 스트림 처리 로직이 올바르게 업데이트되었습니다.

변수 타입 변경이 정확하게 반영되어 있고, 기존 로직은 그대로 유지되어 있습니다.

src/main/java/konkuk/thip/user/adapter/out/persistence/UserCommandPersistenceAdapter.java (1)

7-8: 패키지 구조 정리가 올바르게 적용되었습니다.

Repository 인터페이스들이 새로운 패키지 구조에 맞게 정확하게 임포트되었습니다.

src/test/java/konkuk/thip/book/adapter/in/web/BookDetailSearchControllerTest.java (4)

3-21: 임포트 문이 새로운 패키지 구조에 맞게 정확하게 업데이트되었습니다.

Repository 인터페이스들과 JPA 엔티티들의 패키지 경로가 올바르게 변경되었습니다.


52-52: Repository 타입 변경이 올바르게 적용되었습니다.

UserRoomJpaRepository에서 RoomParticipantJpaRepository로의 변경이 정확합니다.


103-109: 엔티티 생성 코드가 올바르게 업데이트되었습니다.

RoomParticipantJpaEntity와 RoomParticipantRole 사용이 정확하게 반영되었습니다.


129-129: Repository 메서드 호출이 일관되게 업데이트되었습니다.

테스트 정리(cleanup) 및 삭제 메서드들이 새로운 repository 타입에 맞게 정확하게 수정되었습니다.

Also applies to: 160-160, 189-189

src/main/java/konkuk/thip/user/adapter/out/persistence/FollowingCommandPersistenceAdapter.java (1)

7-8: Following 도메인의 패키지 구조가 올바르게 정리되었습니다.

Following 관련 Repository가 following 서브패키지로 이동하고, UserJpaRepository는 상위 패키지에서 임포트하는 구조가 도메인 관계를 잘 반영하고 있습니다.

src/test/java/konkuk/thip/room/adapter/in/web/RoomPlayingDetailViewApiTest.java (4)

4-16: 리팩토링이 일관되게 적용되었습니다.

import 구문들이 새로운 패키지 구조에 맞게 정확히 업데이트되었습니다. UserRoomJpaEntityRoomParticipantJpaEntity, UserRoomRoleRoomParticipantRole로의 변경이 올바르게 반영되었습니다.


67-67: Repository 변경이 올바르게 적용되었습니다.

UserRoomJpaRepositoryRoomParticipantJpaRepository로의 변경이 정확합니다.


79-79: tearDown 메서드에서 Repository 참조가 올바르게 업데이트되었습니다.

테스트 정리 로직에서 새로운 repository를 올바르게 사용하고 있습니다.


133-141: 엔티티 생성 로직이 새로운 도메인 모델에 맞게 업데이트되었습니다.

RoomParticipantJpaEntity 생성과 RoomParticipantRole 사용이 올바르게 적용되었습니다.

src/main/java/konkuk/thip/room/application/service/RoomShowRecruitingDetailViewService.java (3)

12-13: 도메인 모델 정렬이 올바르게 적용되었습니다.

RoomParticipantRoomParticipantsroom.domain 패키지로 이동된 것이 import 구문에 정확히 반영되었습니다.


39-39: 변수 타입이 새로운 도메인 모델에 맞게 업데이트되었습니다.

List<UserRoom>에서 List<RoomParticipant>로의 변경이 올바르게 적용되었습니다.


29-29: UserRoomCommandPort가 RoomParticipant 반환으로 올바르게 업데이트됨 확인됨

UserRoomCommandPort 인터페이스에서

  • RoomParticipant findByUserIdAndRoomId(Long userId, Long roomId)
  • List<RoomParticipant> findAllByRoomId(Long roomId)
    메서드가 모두 RoomParticipant 타입을 반환하도록 선언되어 있어, 서비스에서 해당 포트를 사용해도 문제가 없습니다.
src/test/java/konkuk/thip/room/adapter/in/web/RoomGetHomeJoinedRoomsApiTest.java (4)

8-14: import 구문이 새로운 패키지 구조에 맞게 올바르게 업데이트되었습니다.

RoomParticipantRoleRoomParticipantJpaRepository의 import가 정확히 적용되었습니다.


59-59: Repository 의존성이 올바르게 변경되었습니다.

RoomParticipantJpaRepository로의 변경이 정확합니다.


87-91: TestEntityFactory 사용이 올바르게 적용되었습니다.

TestEntityFactory.createUserRoom 메서드 호출과 RoomParticipantRole 사용이 올바르게 적용되었습니다. 제공된 관련 코드 스니펫과 일치하는 사용법입니다.


96-96: tearDown 메서드에서 Repository 참조가 올바르게 업데이트되었습니다.

새로운 repository를 사용하여 테스트 데이터를 정리하는 로직이 올바르게 적용되었습니다.

src/main/java/konkuk/thip/room/adapter/out/persistence/repository/RoomQueryRepositoryImpl.java (6)

1-1: 패키지 구조 개선이 올바르게 적용되었습니다.

repository 하위 패키지로 이동하여 패키지 구조가 더 명확해졌습니다.


18-18: 엔티티 import가 새로운 구조에 맞게 업데이트되었습니다.

QUserRoomJpaEntityQRoomParticipantJpaEntity로의 변경이 올바르게 적용되었습니다.


37-37: Q엔티티 변수명이 일관되게 업데이트되었습니다.

QRoomParticipantJpaEntity.roomParticipantJpaEntity로 변경되었지만, 변수명은 여전히 userRoom으로 유지되어 있습니다. 이는 기존 쿼리 로직과의 호환성을 위한 것으로 보입니다.


61-61: 필드 참조가 새로운 엔티티 구조에 맞게 업데이트되었습니다.

userRoomIdroomParticipantId로의 변경이 올바르게 적용되었습니다.


149-149: 멤버 수 계산 로직이 올바르게 업데이트되었습니다.

roomParticipantId.count()를 사용하여 멤버 수를 계산하는 로직이 정확히 적용되었습니다.


178-178: 서브쿼리 변수명이 새로운 엔티티에 맞게 업데이트되었습니다.

QRoomParticipantJpaEntity 인스턴스를 사용하여 서브쿼리를 구성하는 로직이 올바르게 적용되었습니다.

src/test/java/konkuk/thip/room/domain/RoomParticipantsTest.java (4)

1-1: 패키지 이동이 올바르게 적용되었습니다.

user.domain에서 room.domain으로의 패키지 이동이 도메인 경계를 명확히 하는 좋은 변경입니다.


4-4: Role enum import가 올바르게 업데이트되었습니다.

RoomParticipantRole import가 정확한 패키지에서 가져오도록 업데이트되었습니다.


14-23: 헬퍼 메서드가 새로운 도메인 모델에 맞게 업데이트되었습니다.

RoomParticipant 객체 생성과 roomParticipantRole 필드 사용이 올바르게 적용되었습니다.


29-30: 테스트 데이터 생성이 올바르게 업데이트되었습니다.

RoomParticipantRole.MEMBERRoomParticipantRole.HOST 사용이 정확하게 적용되었습니다.

src/main/java/konkuk/thip/room/adapter/out/jpa/RoomParticipantJpaEntity.java (1)

1-40: 리팩토링이 잘 수행되었습니다.

UserRoom에서 RoomParticipant로의 도메인 명확화와 패키지 구조 정리가 적절하게 수행되었습니다. 엔티티가 user 패키지에서 room 패키지로 이동한 것은 도메인 경계를 명확히 하는 좋은 변경입니다.

src/main/java/konkuk/thip/vote/adapter/out/jpa/VoteParticipantJpaEntity.java (1)

1-29: UserVote에서 VoteParticipant로의 리팩토링이 적절합니다.

도메인 모델의 명확성을 위한 리네이밍이 잘 수행되었습니다. 사용자-투표 관계를 투표 참여자로 명명하는 것이 더 명확한 의미를 전달합니다.

src/main/java/konkuk/thip/room/adapter/out/jpa/RoomParticipantRole.java (1)

6-16: Enum 구조가 잘 설계되었습니다.

HOST와 MEMBER 역할 정의와 한국어 레이블 매핑이 적절하게 구현되었습니다. Lombok의 @Getter 사용으로 코드가 간결해졌습니다.

src/main/java/konkuk/thip/vote/adapter/out/persistence/VoteQueryPersistenceAdapter.java (1)

6-7: Repository 의존성 변경이 적절하게 수행되었습니다.

UserVoteJpaRepository에서 VoteParticipantJpaRepository로의 교체와 관련 메서드 호출 업데이트가 일관되게 수행되었습니다.

Also applies to: 20-20, 24-24

src/test/java/konkuk/thip/room/adapter/in/web/RoomSearchApiTest.java (1)

8-9: 테스트 코드의 리팩토링이 일관되게 수행되었습니다.

UserRoomJpaEntity에서 RoomParticipantJpaEntity로의 변경과 관련 import, repository 의존성, 테스트 데이터 생성 코드가 모두 일관되게 업데이트되었습니다. 테스트 로직은 그대로 유지되어 기존 기능의 동작을 보장합니다.

Also applies to: 15-15, 61-61, 65-65, 148-156

src/main/java/konkuk/thip/room/adapter/out/persistence/repository/RoomParticipantJpaRepository.java (1)

1-13: 리팩토링이 잘 적용되었습니다.

UserRoom에서 RoomParticipant로의 전환이 깔끔하게 이루어졌고, 저장소 인터페이스가 room 패키지 하위 repository 서브패키지로 적절히 이동되었습니다. 쿼리 메서드명도 JPA 네이밍 컨벤션을 잘 따르고 있습니다.

src/main/java/konkuk/thip/user/application/port/out/UserRoomCommandPort.java (1)

3-3: 임포트 및 반환 타입 변경이 올바르게 적용되었습니다.

RoomParticipant 임포트와 메서드 반환 타입이 일관되게 변경되어 리팩토링이 잘 적용되었습니다.

Also applies to: 9-10

src/test/java/konkuk/thip/record/adapter/in/web/RecordCreateControllerTest.java (3)

6-6: 임포트 경로 업데이트가 올바르게 적용되었습니다.

저장소 인터페이스들이 repository 서브패키지로 이동한 것에 맞춰 임포트 경로가 정확하게 업데이트되었습니다.

Also applies to: 10-10, 13-20


72-72: 저장소 필드명과 사용법이 일관되게 변경되었습니다.

RoomParticipantJpaRepository로 필드명이 변경되고, tearDown 메서드에서도 일관되게 사용되고 있습니다.

Also applies to: 77-77


97-105: 엔티티 생성 코드가 올바르게 변경되었습니다.

RoomParticipantJpaEntityRoomParticipantRole.HOST 사용이 적절하게 적용되었습니다.

src/test/java/konkuk/thip/common/util/TestEntityFactory.java (2)

7-8: 임포트 변경이 올바르게 적용되었습니다.

새로운 엔티티와 역할 열거형으로 임포트가 정확하게 변경되었습니다.


104-110: 엔티티 생성 로직이 올바르게 변경되었습니다.

RoomParticipantJpaEntity 빌더 사용과 roomParticipantRole 필드 설정이 적절하게 적용되었습니다.

src/main/java/konkuk/thip/room/domain/RoomParticipants.java (3)

1-1: 패키지 이동이 적절합니다.

RoomParticipantsroom.domain 패키지로 이동한 것은 도메인 구조상 매우 적절한 변경입니다.


4-4: 타입 변경이 일관되게 적용되었습니다.

RoomParticipantRole 임포트와 RoomParticipant 타입 사용이 모든 곳에서 일관되게 적용되었습니다.

Also applies to: 19-19, 21-21


37-37: 메서드 내부 구현이 올바르게 변경되었습니다.

스트림 연산에서 RoomParticipantRoleRoomParticipant 메서드 호출이 정확하게 업데이트되었습니다.

Also applies to: 43-43, 51-51

src/main/java/konkuk/thip/room/adapter/out/mapper/RoomParticipantMapper.java (1)

1-36: 매퍼 클래스가 올바르게 구현되었습니다.

RoomParticipant 도메인 엔티티와 JPA 엔티티 간의 변환 로직이 정확하게 구현되어 있습니다. 필드 매핑도 일관성 있게 처리되었습니다.

src/main/java/konkuk/thip/vote/adapter/out/mapper/VoteParticipantMapper.java (1)

18-27: 도메인 엔티티 변환 로직이 정확합니다.

JPA 엔티티에서 도메인 엔티티로의 변환이 올바르게 구현되어 있습니다.

src/test/java/konkuk/thip/room/adapter/in/web/RoomRecruitingDetailViewApiTest.java (1)

1-343: 테스트 코드가 리팩토링된 도메인 모델에 맞게 올바르게 업데이트되었습니다.

UserRoom 관련 엔티티와 리포지토리를 RoomParticipant로 일괄 변경한 것이 정확하고 일관성 있게 적용되었습니다. 테스트 로직은 변경되지 않고 타입과 네이밍만 업데이트되어 안전한 리팩토링입니다.

src/main/java/konkuk/thip/room/adapter/out/persistence/RoomParticipantCommandPersistenceAdapter.java (1)

23-36: 퍼시스턴스 어댑터 구현 로직이 올바릅니다.

매퍼를 사용한 엔티티 변환과 리포지토리 호출 로직이 정확하게 구현되어 있습니다.

src/main/java/konkuk/thip/record/application/service/RecordCreateService.java (1)

15-98: 서비스 클래스가 리팩토링된 도메인 모델에 맞게 올바르게 업데이트되었습니다.

UserRoom을 RoomParticipant로 변경한 것이 일관성 있게 적용되었고, 비즈니스 로직은 변경되지 않아 안전한 리팩토링입니다. 변수명, 메서드 파라미터, 임포트가 모두 정확하게 업데이트되었습니다.

Comment on lines 3 to 9
import jakarta.persistence.EntityManager;
import konkuk.thip.book.adapter.out.jpa.BookJpaEntity;
import konkuk.thip.book.adapter.out.persistence.BookJpaRepository;
import konkuk.thip.book.adapter.out.persistence.repository.BookJpaRepository;
import konkuk.thip.common.util.TestEntityFactory;
import konkuk.thip.room.adapter.out.persistence.CategoryJpaRepository;
import konkuk.thip.room.adapter.out.persistence.RoomJpaRepository;
import konkuk.thip.room.adapter.out.persistence.repository.CategoryJpaRepository;
import konkuk.thip.room.adapter.out.persistence.repository.RoomJpaRepository;
import konkuk.thip.user.adapter.out.jpa.AliasJpaEntity;
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue

CategoryJpaEntity import 누락으로 인한 컴파일 오류

아래 코드에서 CategoryJpaEntity 를 사용하지만 import 문이 없습니다. 컴파일 단계에서 바로 실패하므로 반드시 추가해주세요.

 import jakarta.persistence.EntityManager;
 import konkuk.thip.book.adapter.out.jpa.BookJpaEntity;
+import konkuk.thip.room.adapter.out.jpa.CategoryJpaEntity;  // 추가
 import konkuk.thip.book.adapter.out.persistence.repository.BookJpaRepository;
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
import jakarta.persistence.EntityManager;
import konkuk.thip.book.adapter.out.jpa.BookJpaEntity;
import konkuk.thip.book.adapter.out.persistence.BookJpaRepository;
import konkuk.thip.book.adapter.out.persistence.repository.BookJpaRepository;
import konkuk.thip.common.util.TestEntityFactory;
import konkuk.thip.room.adapter.out.persistence.CategoryJpaRepository;
import konkuk.thip.room.adapter.out.persistence.RoomJpaRepository;
import konkuk.thip.room.adapter.out.persistence.repository.CategoryJpaRepository;
import konkuk.thip.room.adapter.out.persistence.repository.RoomJpaRepository;
import konkuk.thip.user.adapter.out.jpa.AliasJpaEntity;
import jakarta.persistence.EntityManager;
import konkuk.thip.book.adapter.out.jpa.BookJpaEntity;
import konkuk.thip.room.adapter.out.jpa.CategoryJpaEntity; // 추가
import konkuk.thip.book.adapter.out.persistence.repository.BookJpaRepository;
import konkuk.thip.common.util.TestEntityFactory;
import konkuk.thip.room.adapter.out.persistence.repository<CategoryJpaRepository>;
import konkuk.thip.room.adapter.out.persistence.repository.RoomJpaRepository;
import konkuk.thip.user.adapter.out.jpa.AliasJpaEntity;
🤖 Prompt for AI Agents
In src/test/java/konkuk/thip/room/adapter/out/jpa/VoteJpaEntityTest.java around
lines 3 to 9, the import statement for CategoryJpaEntity is missing, causing a
compilation error. Add the appropriate import statement for CategoryJpaEntity to
the import section to resolve the compilation failure.

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

♻️ Duplicate comments (1)
src/main/java/konkuk/thip/room/adapter/out/jpa/RoomParticipantRole.java (1)

20-27: 예외 처리가 제대로 구현되었습니다.

이전 리뷰 코멘트에서 지적된 null 반환 문제가 해결되어 InvalidStateException을 던지도록 구현되었습니다. 적절한 에러 코드와 함께 예외 처리가 잘 되어 있습니다.

📜 Review details

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

📥 Commits

Reviewing files that changed from the base of the PR and between f786665 and 4923a2e.

📒 Files selected for processing (14)
  • src/main/java/konkuk/thip/attendancecheck/adapter/out/persistence/AttendanceCheckQueryPersistenceAdapter.java (1 hunks)
  • src/main/java/konkuk/thip/attendancecheck/application/port/out/AttendanceCheckQueryPort.java (1 hunks)
  • src/main/java/konkuk/thip/common/exception/code/ErrorCode.java (2 hunks)
  • src/main/java/konkuk/thip/record/application/service/RecordCreateService.java (3 hunks)
  • src/main/java/konkuk/thip/room/adapter/out/jpa/RoomParticipantJpaEntity.java (2 hunks)
  • src/main/java/konkuk/thip/room/adapter/out/jpa/RoomParticipantRole.java (1 hunks)
  • src/main/java/konkuk/thip/room/adapter/out/persistence/RoomParticipantParticipantCommandPersistenceAdapter.java (1 hunks)
  • src/main/java/konkuk/thip/room/application/port/out/RoomParticipantCommandPort.java (1 hunks)
  • src/main/java/konkuk/thip/room/application/port/out/RoomParticipantQueryPort.java (1 hunks)
  • src/main/java/konkuk/thip/room/application/service/RoomGetMemberListService.java (3 hunks)
  • src/main/java/konkuk/thip/room/application/service/RoomShowPlayingDetailViewService.java (3 hunks)
  • src/main/java/konkuk/thip/room/application/service/RoomShowRecruitingDetailViewService.java (3 hunks)
  • src/main/java/konkuk/thip/user/application/port/out/UserRoomQueryPort.java (0 hunks)
  • src/main/java/konkuk/thip/vote/adapter/out/jpa/VoteParticipantJpaEntity.java (1 hunks)
💤 Files with no reviewable changes (1)
  • src/main/java/konkuk/thip/user/application/port/out/UserRoomQueryPort.java
✅ Files skipped from review due to trivial changes (4)
  • src/main/java/konkuk/thip/room/application/port/out/RoomParticipantQueryPort.java
  • src/main/java/konkuk/thip/attendancecheck/application/port/out/AttendanceCheckQueryPort.java
  • src/main/java/konkuk/thip/attendancecheck/adapter/out/persistence/AttendanceCheckQueryPersistenceAdapter.java
  • src/main/java/konkuk/thip/room/application/port/out/RoomParticipantCommandPort.java
🚧 Files skipped from review as they are similar to previous changes (6)
  • src/main/java/konkuk/thip/room/application/service/RoomGetMemberListService.java
  • src/main/java/konkuk/thip/room/application/service/RoomShowPlayingDetailViewService.java
  • src/main/java/konkuk/thip/room/adapter/out/jpa/RoomParticipantJpaEntity.java
  • src/main/java/konkuk/thip/room/application/service/RoomShowRecruitingDetailViewService.java
  • src/main/java/konkuk/thip/vote/adapter/out/jpa/VoteParticipantJpaEntity.java
  • src/main/java/konkuk/thip/record/application/service/RecordCreateService.java
🧰 Additional context used
🧠 Learnings (1)
src/main/java/konkuk/thip/room/adapter/out/persistence/RoomParticipantParticipantCommandPersistenceAdapter.java (1)
Learnt from: seongjunnoh
PR: THIP-TextHip/THIP-Server#43
File: src/main/java/konkuk/thip/book/application/port/out/BookCommandPort.java:0-0
Timestamp: 2025-07-03T03:05:05.031Z
Learning: THIP 프로젝트에서는 CQRS Port 분리 시 다음 컨벤션을 따름: CommandPort에는 findByXXX를 통해 도메인 엔티티를 찾아오는 메서드를 추가하고, QueryPort에는 조회 API의 response에 해당하는 데이터들을 DB로부터 조회하는 메서드를 추가함.
🧬 Code Graph Analysis (2)
src/main/java/konkuk/thip/room/adapter/out/persistence/RoomParticipantParticipantCommandPersistenceAdapter.java (1)
src/main/java/konkuk/thip/common/exception/EntityNotFoundException.java (1)
  • EntityNotFoundException (5-10)
src/main/java/konkuk/thip/room/adapter/out/jpa/RoomParticipantRole.java (2)
src/main/java/konkuk/thip/room/domain/RoomParticipant.java (1)
  • Getter (7-37)
src/main/java/konkuk/thip/room/domain/RoomParticipants.java (1)
  • Getter (12-55)
🔇 Additional comments (5)
src/main/java/konkuk/thip/common/exception/code/ErrorCode.java (2)

75-75: 에러 코드 수정이 적절합니다.

INVALID_SEARCH_TYPE의 코드가 900000에서 90000으로 수정되어 일관성을 유지합니다.


108-112: 도메인 리팩토링에 맞는 에러 코드 업데이트가 잘 되었습니다.

UserRoom에서 RoomParticipant로의 도메인 변경에 따라 에러 코드와 메시지가 일관성 있게 업데이트되었고, 새로운 ROOM_PARTICIPANT_ROLE_NOT_MATCH 에러 코드 추가도 적절합니다.

src/main/java/konkuk/thip/room/adapter/out/jpa/RoomParticipantRole.java (1)

9-12: Enum 구조가 잘 정의되었습니다.

HOST와 MEMBER 역할이 명확하게 정의되어 있고, 한국어 타입 값도 적절합니다.

src/main/java/konkuk/thip/room/adapter/out/persistence/RoomParticipantParticipantCommandPersistenceAdapter.java (2)

23-29: findByUserIdAndRoomId 메서드가 적절하게 구현되었습니다.

적절한 예외 처리와 함께 도메인 엔티티로의 매핑이 올바르게 구현되어 있습니다.


32-36: findAllByRoomId 메서드가 깔끔하게 구현되었습니다.

스트림을 사용한 매핑과 toList() 사용이 적절하고, CQRS 패턴에 따른 CommandPort 구현이 올바릅니다.

@sonarqubecloud
Copy link

Copy link
Member

@hd0rable hd0rable left a comment

Choose a reason for hiding this comment

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

Post 패키지 하위에 있는 PostLike와 Content를 어떻게 할지 고민인데, 일단은 두 도메인 모두 Record, Feed, Vote에서 공통으로 사용되기 때문에 postBase 패키지로 adapter.in 만 없이 유지시킬까 생각중입니다! 이 부분에 대해서 다른 의견 있으신 분이 있다면 커멘드 주시면 감사하겠습니다Post 패키지 하위에 있는 PostLike와 Content를 어떻게 할지 고민인데, 일단은 두 도메인 모두 Record, Feed, Vote에서 공통으로 사용되기 때문에 postBase 패키지로 adapter.in 만 없이 유지시킬까 생각중입니다! 이 부분에 대해서 다른 의견 있으신 분이 있다면 커멘드 주시면 감사하겠습니다

Content는 Feed에만 속하므로 Content는 Feed하위 패키지로 넣는게 맞을것같습니다
저희 Post의 상속구조를 없애는 것이 거의 확정 된것같은데 그로인해 생기는 Like들은 각 루트 애그리거트 내의 패키지로 이동하면 좋을 것 같습니다!!
정말 번거로운 작업 해주셨는데 사소한 리뷰 하나 남겼습니다 확인해주시면 감사하겠씁니다!!

@@ -1,4 +1,4 @@
package konkuk.thip.user.adapter.out.persistence;
package konkuk.thip.user.adapter.out.persistence.repository;
Copy link
Member

Choose a reason for hiding this comment

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

p3: User에서 Alias와 Room에서 Category도 repository안에서 패키지로 구분하는 것은 어떨까요? 저희가 하나의 애그리거트에 속해있는 엔티티,밸류가많아지면서 구분하기 위해 패키지 구조를 변경한 것이라고 생각했는데 밸류라고 할지라도 가독성을위해 Alias, Category도 repository안에서 패키지로 구분하는게 낫지않을까 싶습니다! 현재 제가 구현중인 Feed에서도 tag,content,feedtag도 repository안에서 패키지로 구분하는식으로 리펙토링했긴 합니다!
domain에서는 패키지로 구분하고있지않으니 해당 패키지에서 애그리거트의 루트안에 속한 엔티티라고 구분도 될 것 같습니다!

패키지 구조 상 루트 애그리거트 안에있는 모든 엔티티/밸류 들을 repository안에서 패키지로 구분하는데 가독성을 높이는데 도움이 될것같습니당

Copy link
Contributor Author

Choose a reason for hiding this comment

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

넵 뒷 pr에서 반영해보겠습니다!

@buzz0331 buzz0331 merged commit ab91562 into develop Jul 15, 2025
3 checks passed
@buzz0331 buzz0331 deleted the refactor/#80-package-structure branch July 15, 2025 17:01
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[THIP2025-123] [refactor] 패키지 구조 정리

3 participants