Skip to content

Conversation

@buzz0331
Copy link
Contributor

@buzz0331 buzz0331 commented Jul 15, 2025

#️⃣ 연관된 이슈

closes #82

📝 작업 내용

팔로워 수를 조회하는 count 쿼리를 줄이기 위해 User 테이블에 followerCount를 추가했습니다.
followerCount를 추가함에 따라 다음의 로직이 수정되었습니다.

  1. 팔로우 상태 변경 시 followerCount 증가/감소
  2. 팔로워 수 조회 (방에서 사용자 정보 리스트 조회 / 팔로워 리스트 조회) 시에 count 쿼리를 날리지 않고 User 테이블에 getFollowerCount()를 통해 DB I/O를 줄였습니다.

수정된 entity에 따라 ERD도 변경해두었습니다.

📸 스크린샷

💬 리뷰 요구사항

리뷰어가 특별히 봐주었으면 하는 부분이 있다면 작성해주세요

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

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

Summary by CodeRabbit

  • 신규 기능

    • 유저 팔로워 수(followerCount) 필드가 도메인, JPA 엔티티, API 응답에 추가되었습니다.
    • 팔로우/언팔로우 시 팔로워 수가 자동으로 증가 및 감소하도록 개선되었습니다.
    • 출석 체크 및 방 참가자 관련 영속성 어댑터와 레포지토리가 새로 도입되었습니다.
  • 버그 수정

    • 팔로우, 검색, 방 참가자 관련 에러 코드가 정정 및 추가되었습니다.
    • 팔로우 관련 필드 및 메서드 명칭이 일관성 있게 변경되었습니다.
  • 리팩터

    • 저장소(Repository) 클래스의 패키지 구조가 세분화되어 관리가 용이해졌습니다.
    • 방 참가자 엔티티 및 레포지토리 명칭이 일관성 있게 변경되었습니다.
  • 테스트

    • 팔로워 수 변경 동작에 맞춰 테스트 코드가 보강 및 수정되었습니다.
    • 리팩터된 엔티티 및 저장소 구조에 맞춰 테스트 코드가 일괄적으로 갱신되었습니다.

@coderabbitai
Copy link

coderabbitai bot commented Jul 15, 2025

Caution

Review failed

The pull request is closed.

"""

Walkthrough

이번 변경에서는 User 엔터티 및 관련 도메인/영속성 계층에 followerCount(팔로워 수) 필드를 추가하고, 팔로우/언팔로우 시 followerCount가 실시간으로 반영되도록 서비스, 포트, 어댑터, 매퍼, 테스트 코드 등 전반에 걸쳐 리팩토링이 이루어졌습니다. 또한 followerCount를 활용하여 팔로워 수 조회 시 count 쿼리를 제거하였습니다.

Changes

파일/그룹 변경 요약
src/main/java/konkuk/thip/user/domain/User.java, UserJpaEntity.java, UserMapper.java followerCount 필드 및 증가/감소/업데이트 메서드 추가, 매핑 로직 반영
src/main/java/konkuk/thip/user/domain/Following.java, FollowingJpaEntity.java, FollowingMapper.java followerUserId → userId로 필드명 변경 및 매핑 수정
src/main/java/konkuk/thip/user/application/port/out/FollowingCommandPort.java, FollowingQueryPort.java save/updateStatus에 User 파라미터 추가, countByFollowingUserIds 메서드 제거
src/main/java/konkuk/thip/user/adapter/out/persistence/FollowingCommandPersistenceAdapter.java, FollowingQueryPersistenceAdapter.java followerCount 동기화 로직 추가, countByFollowingUserIds 제거 및 followerCount로 대체
src/main/java/konkuk/thip/user/application/service/following/UserFollowService.java 팔로우/언팔로우 시 followerCount 증가/감소 반영, 포트/어댑터 변경점 적용
src/main/java/konkuk/thip/user/adapter/in/web/response/UserFollowersResponse.java followingCount → followerCount로 필드명 변경, of 메서드 제거, @builder 추가
src/main/java/konkuk/thip/room/adapter/in/web/response/RoomGetMemberListResponse.java, RoomGetMemberListService.java subscriberCount → followerCount로 필드명 및 사용처 변경
src/main/java/konkuk/thip/common/exception/code/ErrorCode.java FOLLOW_COUNT_IS_ZERO 등 followerCount 관련 에러코드 추가 및 메시지 보정
src/main/java/konkuk/thip/user/adapter/out/persistence/UserCommandPersistenceAdapter.java, UserQueryPersistenceAdapter.java UserJpaRepository, AliasJpaRepository 명시적 필드 선언 및 사용
src/test/java/konkuk/thip/user/adapter/in/web/UserFollowApiTest.java, UserFollowServiceTest.java 팔로우/언팔로우 시 followerCount 필드값 검증 테스트 추가
기타 repository, test 파일 등 패키지 구조 변경, 필드/메서드명 동기화, followerCount 관련 테스트 및 검증 강화

Sequence Diagram(s)

sequenceDiagram
    participant UserFollowService
    participant UserCommandPort
    participant FollowingCommandPort
    participant User (Domain)
    participant UserJpaEntity

    UserFollowService->>UserCommandPort: findById(targetUserId)
    UserCommandPort-->>UserFollowService: User (with followerCount)
    UserFollowService->>User: updateFollowerCount(isFollowing)
    UserFollowService->>FollowingCommandPort: updateStatus(following, targetUser)
    FollowingCommandPort->>UserJpaEntity: updateFollowerCount(targetUser.followerCount)
    FollowingCommandPort->>UserJpaEntity: save(updated UserJpaEntity)
Loading

Assessment against linked issues

Objective Addressed Explanation
User 테이블에 followingCount 컬럼 추가 (#82)
팔로잉 상태 변경 API에서 followingCount 증가 및 감소 상태 변경 로직 추가 (#82)
팔로잉 수 조회시 count 쿼리 제거하고 followingCount로만 조회 (#82)

Poem

(兔)
팔로워 수가 쏙쏙,
이제는 쿼리 없이 똑똑!
팔로우하면 한 칸 업,
언팔로우 땐 한 칸 덜,
토끼도 좋아할 followerCount,
깔끔해진 코드에 귀가 쫑긋!
🐇✨
"""


📜 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 4c56e7e and e08779b.

📒 Files selected for processing (1)
  • src/main/java/konkuk/thip/user/adapter/out/persistence/FollowingCommandPersistenceAdapter.java (3 hunks)
✨ 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 (4)
src/main/java/konkuk/thip/comment/adapter/out/persistence/CommentQueryPersistenceAdapter.java (1)

14-14: 필드명이 부정확합니다.

Comment 관련 어댑터에서 userMapper가 아닌 commentMapper로 네이밍되어야 합니다.

다음과 같이 수정하세요:

-    private final CommentMapper userMapper;
+    private final CommentMapper commentMapper;
src/main/java/konkuk/thip/attendancecheck/adapter/in/web/AttendanceCheckQuerydController.java (1)

1-8: 클래스명 오탈자(Queryd) 수정 필요

AttendanceCheckQuerydControllerAttendanceCheckQueryController 등으로 변경하는 것이 가독성과 검색성을 높입니다.
오탈자로 인한 Bean 등록 실패나 API 문서 불일치를 방지하기 위해 빠른 수정이 필요합니다.

-public class AttendanceCheckQuerydController {
+public class AttendanceCheckQueryController {
src/main/java/konkuk/thip/user/adapter/out/persistence/repository/following/FollowingQueryRepository.java (1)

10-12: countByFollowingUserIds 메서드는 새 설계와 상충됩니다
PR 목표가 “count 쿼리 제거 & followingCount 필드 활용”인데, 해당 메서드는 여전히 집계 쿼리를 노출합니다. 실제로 사용되지 않는다면 인터페이스‧구현체에서 제거하거나 @Deprecated 처리해 혼선을 줄여 주세요.

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

26-44: 팔로워 수 집계 로직이 여전히 count 쿼리를 사용합니다
User.followingCount 컬럼 도입 취지(쿼리 감소)에 맞춰, 여기서도 직접 카운트 대신 사용자 테이블의 컬럼을 읽도록 리팩터링해야 합니다.

예시 수정안:

-        List<Tuple> results = jpaQueryFactory
-                .select(following.followingUserJpaEntity.userId, following.count())
-                .from(following)
-                .where(following.followingUserJpaEntity.userId.in(userIds))
-                .groupBy(following.followingUserJpaEntity.userId)
-                .fetch();
-
-        return results.stream()
-                .collect(Collectors.toMap(
-                        tuple -> tuple.get(following.followingUserJpaEntity.userId),
-                        tuple -> tuple.get(following.count()).intValue()
-                ));
+        QUserJpaEntity user = QUserJpaEntity.userJpaEntity;
+
+        return jpaQueryFactory
+                .select(user.userId, user.followingCount.coalesce(0))
+                .from(user)
+                .where(user.userId.in(userIds))
+                .fetch()
+                .stream()
+                .collect(Collectors.toMap(
+                        tuple -> tuple.get(user.userId),
+                        tuple -> tuple.get(user.followingCount.coalesce(0)).intValue()
+                ));

이렇게 하면 N+1 없이 단일 쿼리로 컬럼을 읽을 수 있습니다.

🧹 Nitpick comments (33)
src/test/java/konkuk/thip/feed/adapter/out/jpa/FeedJpaEntityTest.java (1)

24-24: @import 구문 간결화 제안

FQCN을 그대로 쓰면 길이가 불필요하게 늘어나므로 import 문으로 분리해 가독성을 높일 수 있습니다.

-import konkuk.thip.config.TestQuerydslConfig.class)    // DataJpaTest 이므로 JPA 제외 빈 추가로 import
+import konkuk.thip.config.TestQuerydslConfig;
+@Import(TestQuerydslConfig.class)    // DataJpaTest 이므로 JPA 제외 빈 추가로 import
src/main/java/konkuk/thip/attendancecheck/application/service/AttendanceCheckService.java (1)

1-3: 빈 Service 구현체는 의도/로드맵 주석 추가 또는 제거 권장

AttendanceCheckServiceDummyUseCase만 구현하고 실제 메서드가 없습니다.

  • 추후 구현 계획이 있다면 // TODO: 주석을 남겨 명확히 해주세요.
  • 그렇지 않다면 클래스를 제거해 불필요한 빈을 줄이는 편이 유지보수에 유리합니다.
src/main/java/konkuk/thip/attendancecheck/application/port/in/DummyUseCase.java (1)

3-5: 빈 Marker Interface 사용 최소화 권장

의미 없는 빈 인터페이스는 코드 탐색 시 혼란을 줄 수 있습니다.

  • 실제 용도가 없다면 삭제
  • 필요 시 공용 메서드 시그니처를 정의하여 역할을 명확히 해주세요.
src/main/java/konkuk/thip/attendancecheck/adapter/in/web/response/DummyResponse.java (1)

5-7: 필드가 없는데도 @Getter가 붙어있습니다

현재 클래스에는 인스턴스 필드가 전혀 없습니다. @Getter와 관련 import 는 의미가 없어 컴파일 타임·런타임 어느 쪽에서도 코드 노이즈만 늘립니다.

-import lombok.Getter;
-
-@Getter
 public class DummyResponse {
 }

필요 시 추후 필드가 추가될 때 다시 어노테이션을 붙여도 늦지 않습니다.

src/main/java/konkuk/thip/attendancecheck/application/port/in/dto/DummyQuery.java (1)

6-9: @Builder, @Getter 모두 무의미합니다

필드가 없는 DTO에 두 어노테이션을 적용해도 생성되는 메타데이터가 없습니다. 제거해 간결성을 유지하거나, 실제 질의 파라미터가 생길 때까지 클래스를 삭제하는 편이 좋겠습니다.

-@Builder
-@Getter
 public class DummyQuery {
 }
src/main/java/konkuk/thip/attendancecheck/application/port/out/AttendanceCheckCommandPort.java (1)

4-6: 빈 CommandPort 인터페이스는 불필요해 보입니다

CQRS 컨벤션상 CommandPort에는 최소한 도메인 엔티티 조회용 findBy… 메서드 정도는 선언하도록 팀 규칙이 있습니다(학습 내용 참조). 아직 정의할 메서드가 없다면 인터페이스를 생성 시점까지 보류하거나 TODO 주석을 명시해 주세요.

src/main/java/konkuk/thip/attendancecheck/adapter/in/web/AttendanceCheckCommandController.java (1)

3-9: 실제 의존성이 없는데 @RequiredArgsConstructor가 붙어 있습니다

현재 필드가 없어 Lombok이 생성자를 만들지 않습니다. 또한 REST 엔드포인트도 정의되어 있지 않아 Controller 역할이 없습니다.

-@RestController
-@RequiredArgsConstructor
-public class AttendanceCheckCommandController {
-
-}
+// TODO: Command API 스펙이 확정되면 엔드포인트와 의존성을 추가하세요.
+public class AttendanceCheckCommandController {
+}

필요 시 구현 시점에 다시 Lombok 어노테이션을 추가해도 됩니다.

src/main/java/konkuk/thip/attendancecheck/adapter/in/web/request/UserSignupRequest.java (1)

5-7: 빈 Request DTO에 @Getter 적용 불필요

현재 필드가 없으므로 Lombok 코드 생성이 이뤄지지 않습니다. 어노테이션·import 제거를 권장합니다.

-import lombok.Getter;
-
-@Getter
 public class UserSignupRequest {
 }
src/main/java/konkuk/thip/attendancecheck/adapter/out/persistence/AttendanceCheckCommandPersistenceAdapter.java (1)

11-16: 주입된 Mapper가 사용되지 않습니다

attendanceCheckMapper 필드를 주입만 하고 참조하지 않고 있습니다.
빌드 경고(IDE/Lombok) 및 추후 리팩터 시 혼선을 줄 수 있으므로 사용 계획이 없다면 제거하거나 TODO 주석으로 용도를 명시해 주세요.

-    private final AttendanceCheckMapper attendanceCheckMapper;
+    // TODO: 구현 로직 추가 후 사용 예정
+    private final AttendanceCheckMapper attendanceCheckMapper;
src/test/java/konkuk/thip/book/adapter/out/api/naver/NaverApiUtilTest.java (1)

1-1: 테스트 실행 경로 업데이트 확인

테스트 클래스의 패키지가 변경되었습니다.
빌드 도구 설정(예: Surefire include/exclude 패턴)이나 CI에서 테스트 탐색 경로가 고정돼 있다면 새 경로가 포함되는지 확인해 주세요.

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

9-9: 테스트에서 구현체 직접 의존 – 인터페이스로 대체 제안
RecordQueryRepositoryImpl 구현체를 직접 import·주입하면 내부 구현 변경 시 테스트가 깨질 위험이 있습니다.
테스트 목적상 JPA Repository 커스텀 인터페이스(RecordQueryRepository) 또는 Port 수준으로 주입하도록 리팩터링하면 응집도가 낮아집니다.

-@Autowired
-private RecordQueryRepositoryImpl recordQueryRepository;
+@Autowired
+private RecordQueryRepository recordQueryRepository;
src/main/java/konkuk/thip/user/adapter/out/persistence/repository/UserJpaRepository.java (1)

8-12: 불필요한 findById 재정의 제거 제안
JpaRepository가 이미 Optional<T> findById(ID id)를 제공합니다. 동일 시그니처를 다시 선언할 필요가 없습니다.
중복 선언을 제거하면 인터페이스가 간결해집니다.

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

8-10: 카운트 반환형 intlong 검토
대용량 데이터(>21억 행) 환경에서 int 오버플로우 위험이 있습니다. Spring Data JPA의 count 계열 메서드는 보통 long을 사용하므로 일관성을 위해 반환형 변경을 고려해 주세요.

-    int countByBookJpaEntity_BookIdAndStartDateAfter(Long bookId, LocalDate currentDate);
+    long countByBookJpaEntity_BookIdAndStartDateAfter(Long bookId, LocalDate currentDate);
src/main/java/konkuk/thip/vote/adapter/out/persistence/repository/VoteItemJpaRepository.java (1)

1-11: 메서드 명칭 오타 및 의도 불명확

패키지만 변경되었지만, 기존에 있던 findAllByVoteJpaEntity_PostId 메서드는
VoteJpaEntity 내부 필드명이 postId 가 맞는지, 혹은 voteId 를 의도한 것인지 혼동을 줄 수 있습니다. 네이밍 컨벤션에 맞춰 findAllByVoteJpaEntityVoteId 처럼 수정하는 방안을 검토해 주세요.

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

3-11: @Repository 애너테이션은 불필요합니다

Spring Data JPA가 인터페이스를 자동으로 빈으로 등록하므로 중복 선언입니다. 제거해도 동작에 변화가 없습니다.

-@Repository
-public interface FollowingJpaRepository extends JpaRepository<FollowingJpaEntity, Long>, FollowingQueryRepository {
+public interface FollowingJpaRepository extends JpaRepository<FollowingJpaEntity, Long>, FollowingQueryRepository {
src/main/java/konkuk/thip/room/application/port/out/RoomParticipantQueryPort.java (1)

1-4: 메서드 없는 빈 인터페이스—필요성 검토

CQRS 컨벤션(학습 내용 참고)에 따르면 QueryPort에는 조회용 메서드가 최소 한 개 이상 정의되는 것이 일반적입니다.
아직 사용할 곳이 없다면 인터페이스 생성 시점을 뒤로 미루거나, 예상되는 조회 메서드를 스텁 형태로라도 명시해 두면 혼란을 줄일 수 있습니다.

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

9-16: 도메인 엔티티 불변성·동등성 메서드 보강 제안

VoteParticipant는 식별자(id) 기반 도메인 객체로 사용될 가능성이 높습니다.
equals()/hashCode() 오버라이드 혹은 Lombok의 @EqualsAndHashCode(of = "id") 추가를 고려해 불변성 및 컬렉션 사용 시 예측 가능한 동작을 보장하세요.

src/main/java/konkuk/thip/room/adapter/in/web/response/RoomGetMemberListResponse.java (1)

18-18: 필드명 변경(subscriberCountfollowingCount)에 따른 API 호환성 확인 필요

기존에 subscriberCount 를 소비하던 프론트/모바일 클라이언트가 있다면 호환성 문제가 발생할 수 있습니다. DTO → JSON 직렬화 시 필드명이 그대로 노출되므로, 배포 전 클라이언트가 동일한 명칭으로 수정되었는지 반드시 확인하세요. 또한 팔로잉 수가 서비스 성장과 함께 int 범위를 초과할 가능성이 있으므로 long 타입으로 확장하는 것도 고려해 볼 만합니다.

-                int followingCount
+                long followingCount
src/main/java/konkuk/thip/room/adapter/out/jpa/RoomJpaEntity.java (1)

10-10: 구현된 기능의 TODO 주석을 제거해주세요.

memberCount 필드가 이미 구현되었으므로 관련 TODO 주석을 제거하는 것이 좋습니다.

-//TODO 방에 이방에 참여중인 인원수 추가
src/test/java/konkuk/thip/room/domain/RoomParticipantTest.java (2)

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

클래스가 RoomParticipantTest로 변경되었지만 DisplayName은 여전히 "UserRoom 도메인 테스트"로 되어 있습니다.

-@DisplayName("[단위] UserRoom 도메인 테스트")
+@DisplayName("[단위] RoomParticipant 도메인 테스트")

1-1: PR 목표와 관련없는 변경사항입니다.

이 파일의 변경사항은 PR의 주요 목표인 followingCount 컬럼 추가와는 관련이 없는 도메인 리팩토링입니다. 별도의 PR로 분리하는 것을 고려해보세요.

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

1-13: PR 목표와 관련없는 변경사항입니다.

이 파일의 변경사항은 PR의 주요 목표인 followingCount 컬럼 추가와는 관련이 없는 도메인 리팩토링입니다. 별도의 PR로 분리하는 것을 고려해보세요.

그러나 코드 자체는 올바르게 구현되어 있으며, Spring Data JPA의 컨벤션을 잘 따르고 있습니다.

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

1-29: PR 목표와 관련없는 변경사항입니다.

이 파일의 변경사항은 PR의 주요 목표인 followingCount 컬럼 추가와는 관련이 없는 도메인 리팩토링입니다. 별도의 PR로 분리하는 것을 고려해보세요.

그러나 코드 자체는 올바르게 구현되어 있으며, 엔티티 이름과 테이블명, 기본 키 필드명이 일관되게 변경되었습니다.

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

14-23: 테스트 헬퍼 메소드명 개선을 제안합니다.

메소드명이 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) {

29-44: 테스트 코드의 일관성을 위해 메소드 호출 부분도 업데이트가 필요합니다.

헬퍼 메소드명을 변경한다면 해당 메소드를 호출하는 부분들도 함께 업데이트해야 합니다.

-        RoomParticipant ur1 = createUserRoom(1L, 100L, 10L, RoomParticipantRole.MEMBER);
-        RoomParticipant ur2 = createUserRoom(2L, 200L, 10L, RoomParticipantRole.HOST);
+        RoomParticipant ur1 = createRoomParticipant(1L, 100L, 10L, RoomParticipantRole.MEMBER);
+        RoomParticipant ur2 = createRoomParticipant(2L, 200L, 10L, RoomParticipantRole.HOST);
src/test/java/konkuk/thip/record/adapter/in/web/RecordCreateControllerTest.java (1)

96-105: 주석 업데이트가 필요합니다.

코드는 올바르게 변경되었지만, 96번째 줄의 주석이 여전히 "UserRoomJpaEntity 생성 및 저장"으로 되어 있습니다. "RoomParticipantJpaEntity 생성 및 저장"으로 업데이트해주세요.

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

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

반환 타입이 RoomParticipantJpaEntity로 변경되었으므로 메서드명도 createRoomParticipant로 변경하는 것이 일관성 측면에서 좋겠습니다.

-    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/adapter/out/persistence/repository/RoomQueryRepositoryImpl.java (1)

37-37: 변수명 변경을 고려해보세요.

타입이 QRoomParticipantJpaEntity로 변경되었으므로 변수명도 roomParticipant로 변경하는 것이 가독성과 일관성 측면에서 좋겠습니다.

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

그리고 이 변경에 따라 클래스 전체에서 userRoom 변수 참조도 모두 roomParticipant로 변경해야 합니다.

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

38-38: 주석 업데이트 필요

주석에서 여전히 "UserRoom"이라는 용어를 사용하고 있습니다.

주석을 다음과 같이 업데이트하는 것이 좋겠습니다:

-        // 2. Room과 연관된 UserRoom 조회, RoomParticipants 일급 컬렉션 생성
+        // 2. Room과 연관된 RoomParticipant 조회, RoomParticipants 일급 컬렉션 생성
src/main/java/konkuk/thip/user/domain/User.java (2)

36-42: 팔로잉 수 업데이트 메서드의 파라미터명 개선이 필요합니다.

boolean 파라미터 isFollowing이 메서드 의도를 명확히 전달하지 못합니다. 더 직관적인 네이밍을 고려해보세요.

-    public void updateFollowingCount(boolean isFollowing) {
+    public void updateFollowingCount(boolean shouldIncrement) {
-        if (isFollowing) {
+        if (shouldIncrement) {
             increaseFollowingCount();
         } else {
             decreaseFollowingCount();
         }
     }

48-53: 팔로잉 수 감소 메서드에 적절한 보호 로직이 있습니다.

팔로잉 수가 0일 때 추가 감소를 방지하는 검증 로직이 잘 구현되어 있습니다. 하지만 실제 팔로잉 관계와 followingCount 간의 데이터 일관성을 주기적으로 검증하는 것을 권장합니다.

데이터 일관성 검증을 위한 배치 작업이나 헬스체크 기능을 추가하는 것을 고려해보세요.

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

37-37: 사용자 조회 위치 최적화가 필요합니다.

유효성 검증 이후에 사용자를 조회하는 것이 더 효율적일 수 있습니다.

     validateParams(userId, targetUserId);
 
     Optional<Following> optionalFollowing = followingCommandPort.findByUserIdAndTargetUserId(userId, targetUserId);
-    User user = userCommandPort.findById(userId);
 
     if (optionalFollowing.isPresent()) {
+        User user = userCommandPort.findById(userId);
         Following following = optionalFollowing.get();
src/main/java/konkuk/thip/user/adapter/out/persistence/FollowingCommandPersistenceAdapter.java (1)

59-67: 사용자 팔로잉 수 동기화 메서드가 추가되었습니다.

DB에서 사용자 엔티티를 조회하고 팔로잉 수를 업데이트하는 로직이 올바르게 구현되어 있습니다. 하지만 성능 최적화를 고려할 수 있습니다.

사용자 엔티티를 이미 서비스 계층에서 조회했으므로, 불필요한 중복 조회를 피하기 위해 더티 체킹을 활용하는 것을 고려해보세요:

-    private UserJpaEntity updateUserFollowingCount(User user) {
-        UserJpaEntity userJpaEntity = userJpaRepository.findById(user.getId()).orElseThrow(
-                () -> new EntityNotFoundException(USER_NOT_FOUND)
-        );
-
-        userJpaEntity.updateFollowingCount(user.getFollowingCount());
-        userJpaRepository.save(userJpaEntity);
-        return userJpaEntity;
-    }
+    private UserJpaEntity updateUserFollowingCount(User user) {
+        UserJpaEntity userJpaEntity = userJpaRepository.findById(user.getId()).orElseThrow(
+                () -> new EntityNotFoundException(USER_NOT_FOUND)
+        );
+
+        userJpaEntity.updateFollowingCount(user.getFollowingCount());
+        // JPA 더티 체킹으로 자동 업데이트되므로 명시적 save 불필요
+        return userJpaEntity;
+    }
📜 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 d1acb12.

📒 Files selected for processing (141)
  • src/main/java/konkuk/thip/attendanceCheck/application/port/in/DummyUseCase.java (0 hunks)
  • src/main/java/konkuk/thip/attendanceCheck/application/port/out/AttendanceCheckCommandPort.java (0 hunks)
  • src/main/java/konkuk/thip/attendanceCheck/application/port/out/AttendnaceCheckQueryPort.java (0 hunks)
  • src/main/java/konkuk/thip/attendancecheck/adapter/in/web/AttendanceCheckCommandController.java (1 hunks)
  • src/main/java/konkuk/thip/attendancecheck/adapter/in/web/AttendanceCheckQuerydController.java (1 hunks)
  • src/main/java/konkuk/thip/attendancecheck/adapter/in/web/request/UserSignupRequest.java (1 hunks)
  • src/main/java/konkuk/thip/attendancecheck/adapter/in/web/response/DummyResponse.java (1 hunks)
  • src/main/java/konkuk/thip/attendancecheck/adapter/out/jpa/AttendanceCheckJpaEntity.java (1 hunks)
  • src/main/java/konkuk/thip/attendancecheck/adapter/out/mapper/AttendanceCheckMapper.java (1 hunks)
  • 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/attendancecheck/application/port/in/DummyUseCase.java (1 hunks)
  • src/main/java/konkuk/thip/attendancecheck/application/port/in/dto/DummyCommand.java (1 hunks)
  • src/main/java/konkuk/thip/attendancecheck/application/port/in/dto/DummyQuery.java (1 hunks)
  • src/main/java/konkuk/thip/attendancecheck/application/port/in/dto/DummyResult.java (1 hunks)
  • src/main/java/konkuk/thip/attendancecheck/application/port/out/AttendanceCheckCommandPort.java (1 hunks)
  • src/main/java/konkuk/thip/attendancecheck/application/port/out/AttendanceCheckQueryPort.java (1 hunks)
  • src/main/java/konkuk/thip/attendancecheck/application/service/AttendanceCheckService.java (1 hunks)
  • src/main/java/konkuk/thip/attendancecheck/domain/AttendanceCheck.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/exception/code/ErrorCode.java (3 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 (3 hunks)
  • src/main/java/konkuk/thip/room/adapter/in/web/response/RoomGetMemberListResponse.java (1 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/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/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/in/web/response/UserFollowersResponse.java (1 hunks)
  • src/main/java/konkuk/thip/user/adapter/out/jpa/UserJpaEntity.java (2 hunks)
  • src/main/java/konkuk/thip/user/adapter/out/jpa/UserRoomRole.java (0 hunks)
  • src/main/java/konkuk/thip/user/adapter/out/mapper/UserMapper.java (2 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 (3 hunks)
  • src/main/java/konkuk/thip/user/adapter/out/persistence/FollowingQueryPersistenceAdapter.java (2 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/FollowingCommandPort.java (1 hunks)
  • src/main/java/konkuk/thip/user/application/port/out/FollowingQueryPort.java (0 hunks)
  • src/main/java/konkuk/thip/user/application/port/out/UserRoomCommandPort.java (0 hunks)
  • src/main/java/konkuk/thip/user/application/port/out/UserRoomQueryPort.java (0 hunks)
  • src/main/java/konkuk/thip/user/application/service/following/UserFollowService.java (3 hunks)
  • src/main/java/konkuk/thip/user/application/service/following/UserGetFollowersService.java (1 hunks)
  • src/main/java/konkuk/thip/user/domain/User.java (3 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 (7 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 (3 hunks)
  • src/test/java/konkuk/thip/user/adapter/in/web/UserFollowControllerTest.java (0 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 (8 hunks)
  • src/test/java/konkuk/thip/vote/adapter/in/web/VoteCreateControllerTest.java (1 hunks)
💤 Files with no reviewable changes (13)
  • src/main/java/konkuk/thip/attendanceCheck/application/port/out/AttendanceCheckCommandPort.java
  • src/main/java/konkuk/thip/attendanceCheck/application/port/out/AttendnaceCheckQueryPort.java
  • src/main/java/konkuk/thip/attendanceCheck/application/port/in/DummyUseCase.java
  • src/main/java/konkuk/thip/user/application/port/out/UserRoomQueryPort.java
  • src/test/java/konkuk/thip/user/adapter/in/web/UserFollowControllerTest.java
  • src/main/java/konkuk/thip/user/application/port/out/FollowingQueryPort.java
  • src/main/java/konkuk/thip/user/application/port/out/UserRoomCommandPort.java
  • src/main/java/konkuk/thip/user/adapter/out/jpa/UserRoomRole.java
  • src/main/java/konkuk/thip/vote/adapter/out/persistence/UserVoteJpaRepository.java
  • src/main/java/konkuk/thip/user/adapter/out/mapper/UserRoomMapper.java
  • src/main/java/konkuk/thip/user/adapter/out/persistence/UserRoomCommandPersistenceAdapter.java
  • src/main/java/konkuk/thip/vote/adapter/out/mapper/UserVoteMapper.java
  • src/main/java/konkuk/thip/user/adapter/out/persistence/UserRoomJpaRepository.java
🧰 Additional context used
🧠 Learnings (45)
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/attendancecheck/adapter/in/web/AttendanceCheckQuerydController.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/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/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/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/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/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/attendancecheck/adapter/in/web/AttendanceCheckCommandController.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/room/application/port/out/RoomParticipantQueryPort.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/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/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/attendancecheck/adapter/in/web/request/UserSignupRequest.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/attendancecheck/adapter/in/web/response/DummyResponse.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/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로부터 조회하는 메서드를 추가함.
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/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/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/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/attendancecheck/application/port/out/AttendanceCheckQueryPort.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/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/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/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/user/adapter/out/persistence/repository/UserQueryRepositoryImpl.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/attendancecheck/application/port/out/AttendanceCheckCommandPort.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/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/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/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/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/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/room/application/port/out/RoomParticipantCommandPort.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/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/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/user/application/port/out/FollowingCommandPort.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/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/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/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/user/adapter/out/persistence/FollowingCommandPersistenceAdapter.java (1)
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/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/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/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/main/java/konkuk/thip/user/application/service/following/UserFollowService.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 (18)
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)
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/BookChangeSavedControllerTest.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/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/room/adapter/out/jpa/VoteJpaEntityTest.java (1)
src/test/java/konkuk/thip/common/util/TestEntityFactory.java (1)
  • TestEntityFactory (16-147)
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/main/java/konkuk/thip/attendancecheck/adapter/out/persistence/AttendanceCheckQueryPersistenceAdapter.java (1)
src/main/java/konkuk/thip/attendancecheck/adapter/out/persistence/AttendanceCheckCommandPersistenceAdapter.java (1)
  • Repository (9-16)
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/RoomPlayingDetailViewApiTest.java (2)
src/main/java/konkuk/thip/common/util/DateUtil.java (1)
  • DateUtil (12-62)
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/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/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)
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/RoomGetMemberListApiTest.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)
🔇 Additional comments (166)
src/test/java/konkuk/thip/room/adapter/out/jpa/VoteJpaEntityTest.java (1)

5-15: 패키지 구조 변경에 따른 import 경로 수정이 잘 반영되었습니다
repository 서브패키지로 이동한 리포지토리 인터페이스들을 올바르게 참조하고 있어 테스트가 정상적으로 컴파일·실행될 것으로 보입니다. 추가적인 이슈는 없습니다.

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

5-5: 리포지토리 패키지 경로 변경 반영 완료

repository 하위 패키지로 이동한 JPA 리포지토리 인터페이스를 올바르게 import 하였습니다. 스프링 부트의 컴포넌트 스캔 경로(루트 패키지 konkuk.thip)를 벗어나지 않아 빈 탐색에도 영향이 없으므로 추가 수정 사항은 없어 보입니다.

Also applies to: 9-9, 13-16

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

1-1: PR 목적과 관련 없는 패키지 구조 변경이 포함되어 있습니다.

이 파일의 패키지 구조 변경은 User 테이블에 followingCount 컬럼을 추가하는 주요 PR 목적과 관련이 없어 보입니다. 별도의 PR로 분리하는 것을 고려해보세요.

Likely an incorrect or invalid review comment.

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

4-4: Import 추가가 올바르게 되었지만 PR 목적과 무관합니다.

패키지 구조 변경에 따른 import 추가는 올바르게 구현되었습니다. 하지만 이 변경사항은 followingCount 추가라는 주요 PR 목적과 관련이 없습니다.

Likely an incorrect or invalid review comment.

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

4-4: Import 추가가 올바르게 구현되었습니다.

새로운 패키지 구조에 따른 import 추가가 올바르게 되었습니다.


13-13: Repository 필드 주입이 표준 패턴을 따릅니다.

NotificationJpaRepository 필드 주입이 Spring의 표준 패턴을 올바르게 따르고 있습니다. 하지만 이 변경사항은 User 테이블의 followingCount 추가라는 주요 PR 목적과는 관련이 없어 보입니다.

Likely an incorrect or invalid review comment.

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

5-11: 패키지 이동 반영 확인 완료

*.adapter.out.persistence.repository 하위로의 패키지 이동이 올바르게 반영되었습니다. 컴파일 문제나 빈 스캔 누락 우려가 없습니다.


46-48: User 엔티티 생성 시 followingCount 기본값 확인 필요

TestEntityFactory.createUser()가 새로 추가된 followingCount 값을 builder에 설정하지 않고 있습니다.
빌더가 기본값(예: 0)으로 초기화하지 않으면 NPE·제약조건 위반이 발생해 테스트가 실패할 수 있으니 확인 부탁드립니다.

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

1-1: 패키지 구조 개선을 위한 적절한 변경입니다.

Repository 인터페이스들을 전용 .repository 서브패키지로 이동시키는 것은 코드 조직화와 유지보수성 향상에 도움이 됩니다.

src/main/java/konkuk/thip/comment/adapter/out/persistence/CommentQueryPersistenceAdapter.java (3)

4-4: 패키지 구조 변경에 따른 적절한 import 업데이트입니다.

새로운 .repository 서브패키지 구조에 맞게 import 경로가 올바르게 수정되었습니다.


13-13: JPA Repository 의존성 주입이 올바르게 추가되었습니다.

Repository 패턴에 따라 JPA Repository를 final 필드로 주입하는 것이 적절합니다.


16-19: 메서드 구현이 올바르게 되었습니다.

Repository 메서드에 대한 적절한 위임 구현으로, 코드가 명확하고 간결합니다.

src/main/java/konkuk/thip/attendancecheck/application/port/in/dto/DummyCommand.java (1)

1-1: 패키지 네이밍 정합성 확보 👍

대소문자 오탈자 수정으로 모듈 전반의 패키지 네이밍 규칙(소문자 유지)에 일관성이 생겼습니다. 다른 클래스들의 import 경로도 모두 동일하게 수정되었는지 한 번 더 확인해 주세요.

src/main/java/konkuk/thip/attendancecheck/domain/AttendanceCheck.java (1)

11-11: id 중복 정의 여부 확인

BaseDomainEntity에 이미 id 필드가 존재할 가능성이 높습니다.
중복 정의 시 Lombok/도메인 모델 충돌이 발생할 수 있으므로 한 번 더 확인 부탁드립니다.

src/main/java/konkuk/thip/attendancecheck/adapter/in/web/response/DummyResponse.java (1)

1-1: 패키지명 소문자 통일 👍

대소문자 혼용을 바로잡은 점 확인했습니다.

src/main/java/konkuk/thip/attendancecheck/adapter/out/jpa/AttendanceCheckJpaEntity.java (1)

1-1: 패키지명 소문자 통일 👍

기존 attendanceCheckattendancecheck로의 정규화가 잘 반영되었습니다. JPA 엔티티 간 import 경로도 모두 맞춰져 있어 컴파일 오류 우려가 없습니다.

src/main/java/konkuk/thip/attendancecheck/application/port/in/dto/DummyResult.java (1)

1-1: 패키지명 정규화만 이루어졌습니다

기능상 변화는 없으며, 컨벤션 준수 확인했습니다.

src/main/java/konkuk/thip/attendancecheck/adapter/out/mapper/AttendanceCheckMapper.java (1)

1-4: import 경로 수정 확인

패키지 케이싱 통일 외 추가 변경 사항이 없어, 매핑 로직에 영향이 없습니다.

src/main/java/konkuk/thip/attendancecheck/adapter/out/persistence/repository/AttendanceCheckRepository.java (2)

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

패키지명을 attendanceCheck에서 attendancecheck로 변경하고 repository 서브패키지로 이동한 것은 일관성 있는 패키지 구조를 위해 좋은 변경사항입니다.

하지만 이 변경사항이 "User에 followingCount 컬럼 추가" PR의 목적과 관련이 있는지 확인이 필요합니다. 이는 인프라스트럭처 리팩토링으로 보이는데, 별도의 PR로 분리하는 것이 더 적절할 수 있습니다.


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

src/main/java/konkuk/thip/attendancecheck/adapter/out/persistence/AttendanceCheckQueryPersistenceAdapter.java (3)

1-1: 패키지 선언이 일관성 있게 업데이트되었습니다.


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

새로운 repository 서브패키지와 수정된 인터페이스명이 올바르게 반영되었습니다.


11-11: 인터페이스 구현이 올바르게 업데이트되었습니다.

오타가 있던 인터페이스명이 올바르게 수정되었습니다.

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

7-11: 테스트 파일의 import 경로 수정 필요

아래 테스트 파일에서 adapter.out.persistence 패키지 경로로 된 FeedJpaRepository import가 남아 있어, …repository 하위 패키지로 경로를 변경해주세요.

  • src/test/java/konkuk/thip/feed/adapter/out/jpa/FeedJpaEntityTest.java (7행)
  • src/test/java/konkuk/thip/book/adapter/in/web/BookDetailSearchControllerTest.java (19행)

수정 예시:

-import konkuk.thip.feed.adapter.out.persistence.FeedJpaRepository;
+import konkuk.thip.feed.adapter.out.persistence.repository.FeedJpaRepository;

Likely an incorrect or invalid review comment.

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

1-1: 스캔 범위 확인 완료

ThipServerApplication 클래스가 konkuk.thip 패키지에 위치하고 @SpringBootApplication만 사용 중이므로, Spring Boot의 기본 컴포넌트 스캔이 konkuk.thip 및 모든 하위 패키지를 포함합니다. 따라서 konkuk.thip.book.adapter.out.api.naver로 이동한 NaverApiClient도 정상적으로 Bean으로 등록됩니다.

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

1-1: 패키지 이동 후 잔존 import 없음 확인

rg -n "konkuk\.thip\.book\.adapter\.out\.api\.NaverBookXmlParser" 검색 결과, 이전 FQN을 임포트하는 구문이 없습니다.
패키지 이동에 따른 잔여 import는 모두 제거된 것으로 보입니다.

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

1-1: 패키지 변경 자체는 문제없으나 로그/모니터링 경로도 함께 점검

모니터링/로깅 설정 파일에서 FQN을 기준으로 필터링하고 있다면 새 경로를 반영해 주세요.
기능적 변경은 없으므로 코드 레벨에서는 이상 없습니다.

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

29-29: 정적 import 경로 수정 완료 확인

PAGE_SIZE 정적 import가 새로운 패키지를 가리키도록 수정되었습니다.
컴파일 오류를 예방하는 적절한 수정으로 보이며 추가 조치는 필요 없어 보입니다.

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

6-6: 패키지 경로 수정 확인 완료

NaverApiClient 의 패키지 경로가 naver 서브패키지로 이동한 것에 맞춰 import 를 갱신하신 부분 문제 없습니다.
기존 패키지(konkuk.thip.book.adapter.out.api)에 남아-있는 클래스나 import 가 없는지 한번 더 grep 으로 확인만 부탁드립니다.

src/main/java/konkuk/thip/book/adapter/in/web/response/GetBookSearchListResponse.java (1)

7-7: 정적 import 경로 변경 적절

PAGE_SIZE 상수를 새 naver 패키지로부터 정적 import 하도록 변경하신 부분 확인했습니다. 기존 경로를 참조하는 곳이 남아있다면 컴파일 오류가 나므로 CI 가 잡아줄 테지만, IDE 전체 검색으로 한 번 더 점검해 두시면 좋겠습니다.

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

4-4: 패키지 리팩터링에 따른 import 경로 수정 확인 완료
RecordJpaRepository.repository 서브패키지에서 가져오도록 경로를 수정한 부분 정상적으로 반영되었습니다. 컴파일 오류 없이 이전 필드 선언과 일치합니다.

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

1-1: 패키지 이동 확인
following 서브패키지로 이동하여 도메인별 모듈화가 명확해졌습니다. 추가 변경사항 없이 정상입니다.

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

1-1: 패키지 이동에 따른 잔존 import 없음 확인 완료
VoteJpaRepository 관련 import는 모두 …adapter.out.persistence.repository 하위로 잘 참조되고 있어, 기존 adapter.out.persistence만을 가리키는 레퍼런스는 없습니다. 추가 수정 없이 그대로 머지하셔도 됩니다.

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

1-1: 패키지 구조 정리 확인 완료

패키지 경로 변경 이외의 로직 변화가 없으며, 네이밍·위치 모두 일관성 있게 정리되었습니다.

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

1-1: 패키지 구조 정리 확인 완료

room 모듈도 동일하게 .repository 하위로 이동하여 패키지 구조가 일관성을 갖추었습니다.

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

1-1: 패키지 구조 정리 확인 완료

user 관련 QueryRepository도 동일 패턴으로 이동되어 모듈 간 구조가 통일되었습니다.

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

1-1: 패키지 구조 정리 확인 완료

패키지 이동 외 변화가 없으며, 타입/메서드 시그니처에 영향이 없습니다.

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

1-1: AliasQueryRepository 이전 경로 참조 없음 확인 완료

전역 검색 결과 옛 패키지(konkuk.thip.user.adapter.out.persistence.AliasQueryRepository)를 참조하는 코드는 발견되지 않았습니다. 추가 조치가 필요 없습니다.

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

1-1: 패키지 리팩터링 반영 확인

패키지 변경만 이루어졌습니다. Spring Boot의 기본 컴포넌트 스캔 경로(konkuk.thip)에 이미 포함되어 있으므로 추가 설정은 필요 없지만, 테스트 코드나 다른 모듈에서의 import 경로가 모두 수정됐는지 한 번 더 확인해 주세요.

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

1-1: 패키지 이동 OK – 추가 설정 불필요

패키지 변경만으로 로직 영향은 없습니다. @SpringBootApplication 루트가 konkuk.thip 이므로 컴포넌트 스캔은 그대로 동작합니다.

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

1-1: 패키지 변경으로 인한 Bean 충돌 여부 확인

동일한 클래스가 다른 패키지에도 남아 있지 않은지(이전 파일 삭제 여부) 확인해 주세요. 두 곳 모두 @Repository 로 존재하면 Spring 컨텍스트 로딩 시 충돌이 발생합니다.

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

1-12: 패키지 리팩토링 확인 완료

repository 서브패키지로의 이동은 레이어 구분을 더욱 명료하게 해줍니다. 추가적인 코드 변경 없이 패키지명만 수정된 부분 확인했습니다.

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

1-11: 패키지 변경에 따른 구현체·스캔 범위 점검 권장

RecordQueryRepositoryImpl(혹은 QueryDsl 기반 구현체)가 동일 패키지 경로로 이동되었는지, 그리고 이를 사용하는 어댑터들의 import 경로가 모두 교체되었는지 한번 더 확인해주세요. 누락 시 런타임에 구현체 미탐색 오류가 발생할 수 있습니다.

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

1-11: 패키지 리팩토링 확인 완료

AliasJpaRepository, AliasQueryRepository 모두 repository 하위로 이동된 것으로 보입니다. 별다른 문제 없이 Spring Data 스캔이 가능할 것으로 판단됩니다.

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

1-12: 패키지 리팩토링 확인 완료

서브패키지 분리로 가독성이 향상되었습니다. 별도 이슈 없습니다.

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

1-1: 의존성 업데이트 확인 완료
전역 검색 결과, 이전 FQN(RecordQueryRepository, RecordQueryRepositoryImpl)을 참조하는 import 구문이 없으며 모든 패키지 경로가 …persistence.repository 하위로 올바르게 갱신되어 있습니다. 추가 수정이 필요하지 않습니다.

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

1-1: 패키지 구조 리팩터링 반영 완료
repository 서브패키지로 이동이 일관성 있게 적용되었습니다. 추가 보완사항 없습니다.

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

1-1: 패키지 이동 확인 완료
단순 경로 변경으로, 기능·컴파일 이슈는 없어 보입니다.

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

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

저장소 인터페이스들을 전용 .repository 서브패키지로 이동시키는 것은 모듈성과 코드 구조를 개선하는 좋은 리팩토링입니다. import 경로가 올바르게 업데이트되었습니다.

Also applies to: 9-9

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

9-10: 테스트 파일의 import 경로가 올바르게 업데이트되었습니다.

저장소 인터페이스들의 새로운 패키지 경로에 맞춰 import 구문이 정확히 수정되었습니다. 테스트 로직은 변경되지 않았으며 패키지 구조 개선이 일관되게 적용되었습니다.

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

10-11: 테스트 파일의 패키지 구조 변경이 올바르게 적용되었습니다.

저장소 인터페이스의 새로운 패키지 경로로 import 구문이 정확히 업데이트되었습니다. 테스트 코드의 기능적 동작에는 영향을 주지 않으며 패키지 구조가 일관되게 개선되었습니다.

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

5-5: 보안 서비스 클래스의 import 경로가 올바르게 업데이트되었습니다.

UserJpaRepository의 새로운 패키지 경로로 import 구문이 정확히 수정되었습니다. OAuth2 인증 로직에는 영향을 주지 않으며 패키지 구조 개선이 일관되게 적용되었습니다.

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

6-6: 퍼시스턴스 어댑터의 import 경로가 올바르게 업데이트되었습니다.

RecentSearchJpaRepository와 UserJpaRepository의 새로운 패키지 경로로 import 구문이 정확히 수정되었습니다. 최근 검색 관련 로직에는 영향을 주지 않으며 패키지 구조 개선이 일관되게 적용되었습니다.

Also applies to: 10-10

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

7-7: RoomJpaRepository import 추가 확인 완료

필드 선언과 패키지 구조 리팩터링이 일치합니다. 추가적인 변경 없이도 컴파일 오류가 해소될 것으로 보입니다.

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

6-7: 리포지토리 패키지 이동 반영 확인

패키지 경로 변경이 테스트 코드에 정상적으로 반영되었습니다. 추가 수정 필요 없습니다.

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

10-11: 패키지 변경 반영으로 테스트 정상화 예상

새로운 repository 서브패키지 경로가 테스트에 반영되어, 불필요한 import 충돌 없이 빌드가 통과될 것으로 보입니다.

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

7-10: 패키지 경로 변경 반영 확인 완료

Repository 인터페이스들의 하위 repository 패키지 이동이 테스트 코드에도 올바르게 반영되었습니다. 추가적인 수정 사항은 없으며 컴파일·런타임 오류 가능성도 낮습니다.

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

5-11: 패키지 구조 리팩터링 반영 정상

RecordJpaRepository, RoomJpaRepository, UserJpaRepository 의 패키지 경로 변경이 어댑터에 문제없이 반영되었습니다. 실제 로직에는 영향이 없으므로 추가 조치는 필요 없어 보입니다.

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

9-14: 임포트 경로 업데이트 확인

SavedBookJpaRepository, SavedFeedJpaRepository, UserJpaRepository 의 새로운 경로가 정확히 반영되었습니다. 기능적 변화는 없으므로 LGTM입니다.

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

5-15: 테스트 임포트 경로 수정 확인

리포지토리 인터페이스 패키지 이동이 테스트 클래스에도 잘 반영되었습니다. 테스트 실행 시점에 스프링 컨텍스트 로딩 오류가 발생하지 않는지 확인만 하면 충분합니다.

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

6-6: 패키지 구조 개선으로 승인

repository 인터페이스들을 전용 .repository 서브패키지로 이동시키는 것은 코드 구조를 더 명확하게 만들고 모듈화를 개선하는 좋은 변경사항입니다.

Also applies to: 10-10, 13-14, 18-19, 22-23

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

6-6: 패키지 구조 개선으로 승인

repository 인터페이스들의 패키지 이동이 다른 파일들과 일관성 있게 적용되었습니다.

Also applies to: 8-8, 13-14

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

6-6: 패키지 구조 개선으로 승인

테스트 클래스에서도 repository 패키지 구조가 일관성 있게 개선되었습니다.

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

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

6-6: 패키지 구조 개선으로 승인

Room 테스트 클래스에서도 repository 패키지 구조가 일관성 있게 개선되었습니다.

Also applies to: 10-11, 15-16

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

41-41: memberCount 필드 추가 승인

방의 멤버 수를 추적하는 필드 추가는 합리적입니다.


64-64: memberCount 초기화 로직 승인

방 생성 시 방장을 첫 번째 멤버로 카운트하는 로직이 적절합니다.


41-41: PR 목표와 변경사항 불일치 확인

PR 목표는 "User에 followingCount 컬럼 추가"인데, 실제로는 Room에 memberCount 필드가 추가되었습니다. 이 변경사항이 의도된 것인지 확인해 주세요.

Likely an incorrect or invalid review comment.

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

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

Repository 인터페이스를 전용 .repository 서브패키지로 이동한 것은 코드 구조를 개선하는 좋은 접근입니다.


13-13: Repository 필드 추가가 적절합니다.

Persistence adapter에서 JPA repository를 private final 필드로 선언하는 것은 CQRS 패턴과 일치하는 올바른 구현입니다.

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

6-6: Import 경로 업데이트가 일관되게 적용되었습니다.

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

Also applies to: 11-11, 15-16

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

8-8: Repository import 경로가 올바르게 업데이트되었습니다.

새로운 패키지 구조에 맞게 모든 repository 인터페이스의 import 경로가 적절하게 수정되었습니다.

Also applies to: 12-13

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

4-4: Repository import 경로 업데이트가 완료되었습니다.

모든 repository 인터페이스의 import 경로가 새로운 .repository 서브패키지 구조에 맞게 일관되게 업데이트되었으며, 기존 비즈니스 로직은 그대로 유지되었습니다.

Also applies to: 9-10, 13-13

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

4-4: 패키지 구조 개선이 적절하게 적용되었습니다.

Repository 인터페이스를 전용 .repository 서브패키지로 이동한 것은 코드 구조를 개선하는 좋은 접근입니다.


13-13: Repository 필드 추가가 CQRS 패턴에 적합합니다.

Persistence adapter에서 JPA repository를 private final 필드로 선언하는 것은 올바른 구현 패턴입니다.

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/adapter/out/persistence/RoomCommandPersistenceAdapter.java (1)

4-4: 리포지토리 패키지 구조 개선이 적절합니다.

리포지토리 인터페이스들을 .repository 서브패키지로 이동하는 것은 코드 구조를 개선하는 좋은 접근입니다. 기능적인 변경 없이 조직화만 개선되었습니다.

Also applies to: 9-10

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

1-1: 도메인 리팩토링이 일관성 있게 적용되었습니다.

UserRoom에서 RoomParticipant로의 클래스명 변경과 user.domain에서 room.domain으로의 패키지 이동이 적절합니다. 필드명 변경(userRoomRole → roomParticipantRole)도 일관성을 유지하고 있습니다.

Also applies to: 9-9, 17-17

src/main/java/konkuk/thip/user/adapter/in/web/response/UserFollowersResponse.java (1)

16-16: @builder 애노테이션 추가가 적절합니다.

record에 @builder 애노테이션을 추가하여 일관성 있는 객체 생성 패턴을 유지하고 있습니다.

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

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

필드에 적절한 애노테이션(@Builder.Default, @column)이 적용되었고, 기본값 1은 새로운 방에 합리적입니다. nullable = false 설정도 올바릅니다.

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

1-1: 패키지 구조 변경이 적절하게 적용되었습니다.

Repository 인터페이스들을 repository 하위 패키지로 이동시키는 리팩토링이 일관되게 적용되었습니다.


5-5: UserRoom에서 RoomParticipant로의 엔티티 명명 변경이 올바르게 적용되었습니다.

QueryDSL 엔티티 import와 변수명이 새로운 명명 규칙에 맞게 일관되게 수정되었습니다.

Also applies to: 20-20

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

33-33: 클래스명 변경이 더 명확한 의미를 전달합니다.

UserFollowersApiTest에서 UserGetFollowersApiTest로 변경하여 API의 역할을 더 명확하게 표현했습니다.


7-9: Repository 패키지 구조 변경이 일관되게 적용되었습니다.

Repository 인터페이스들을 repository 하위 패키지로 이동시키는 리팩토링이 테스트 파일에도 올바르게 반영되었습니다.

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

7-8: Repository 패키지 구조 변경이 올바르게 적용되었습니다.

Repository 인터페이스들을 repository 하위 패키지로 이동시키는 리팩토링이 일관되게 적용되었습니다.

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

4-5: Repository 패키지 구조 변경이 올바르게 적용되었습니다.

Repository 인터페이스들을 repository 하위 패키지로 이동시키는 리팩토링이 일관되게 적용되었습니다.

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

7-7: UserVote에서 VoteParticipant로의 엔티티 명명 변경이 올바르게 적용되었습니다.

Repository 인터페이스명, 필드명, 메서드 호출이 새로운 명명 규칙에 맞게 일관되게 수정되었습니다.

Also applies to: 20-20, 24-24

src/main/java/konkuk/thip/user/adapter/out/mapper/UserMapper.java (2)

19-19: followingCount 매핑 로직이 올바르게 추가되었습니다.

도메인 엔티티에서 JPA 엔티티로 변환할 때 followingCount 필드가 적절히 매핑되고 있습니다.


30-30: followingCount 매핑 로직이 올바르게 추가되었습니다.

JPA 엔티티에서 도메인 엔티티로 변환할 때 followingCount 필드가 적절히 매핑되고 있습니다. 양방향 매핑이 일관되게 구현되어 있습니다.

src/main/java/konkuk/thip/user/adapter/out/jpa/UserJpaEntity.java (2)

30-31: followingCount 필드가 올바르게 추가되었습니다.

@Builder.Default 어노테이션을 통해 기본값 0이 설정되어 있어 새로운 사용자 생성 시 적절한 초기값이 보장됩니다.


41-43: updateFollowingCount 메서드가 적절히 구현되었습니다.

팔로잉 수를 업데이트하는 간단하고 명확한 메서드입니다.

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

9-17: 리팩토링 변경사항이 일관되게 적용되었습니다.

UserRoom에서 RoomParticipant로의 리팩토링이 import 구문에서 일관되게 적용되었습니다. 패키지 구조와 클래스명 변경이 올바르게 반영되었습니다.


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

UserRoomJpaRepository에서 RoomParticipantJpaRepository로의 변경이 적절하게 적용되었습니다.


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

RoomParticipantJpaEntity 생성 및 RoomParticipantRole 사용이 적절하게 변경되었습니다. 테스트 데이터 생성 로직이 새로운 엔티티 구조에 맞게 잘 적용되었습니다.


129-129: 테스트 정리 및 삭제 작업이 일관되게 업데이트되었습니다.

tearDown 메서드와 테스트 내에서의 엔티티 삭제 작업이 새로운 repository를 사용하도록 올바르게 변경되었습니다.

Also applies to: 160-160, 189-189

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

7-7: 패키지 구조 업데이트가 올바르게 적용되었습니다.

repository 패키지 구조 변경이 import 구문에 정확히 반영되었습니다.


25-25: DateUtil 사용법이 개선되었습니다.

cursor 파싱 로직에서 DateUtil.parseDateTime() 메서드 사용이 적절합니다.


36-43: 성능 최적화를 위한 followingCount 직접 사용이 우수합니다.

별도의 count 쿼리 대신 UserJpaEntity의 followingCount 필드를 직접 사용하여 데이터베이스 I/O를 줄이는 것이 PR 목표에 부합합니다. Builder 패턴 사용도 적절합니다.


46-47: 페이징 로직이 올바르게 유지되었습니다.

nextCursor 설정과 isFirst 판단 로직이 리팩토링 후에도 올바르게 유지되었습니다.

Also applies to: 53-53

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

1-8: 새로운 VoteParticipantJpaRepository 인터페이스가 올바르게 정의되었습니다.

Spring Data JPA 규칙에 맞는 repository 인터페이스 정의와 existsByUserJpaEntity_UserIdAndVoteItemJpaEntity_VoteItemId 메서드 시그니처가 적절합니다. 사용자와 투표 항목 조합에 대한 존재 여부 확인이라는 비즈니스 요구사항에 부합합니다.

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

8-10: 패키지 구조 변경이 올바르게 적용되었습니다.

repository 패키지 구조 변경이 import 구문에 정확히 반영되었습니다.


57-57: followingCount 필드 검증이 추가되어 테스트 커버리지가 향상되었습니다.

변수명을 user에서 followingUser로 변경하여 가독성을 높였고, 팔로우/언팔로우 시 followingCount 필드가 올바르게 증감하는지 확인하는 assertion이 추가되었습니다. 이는 새로운 기능이 올바르게 동작하는지 검증하는 중요한 테스트입니다.

Also applies to: 75-75, 82-82, 85-87, 90-90, 97-97, 100-101

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

4-4: 리팩토링 변경사항이 일관되게 적용되었습니다.

UserRoom에서 RoomParticipant로의 리팩토링이 import 구문에서 일관되게 적용되었습니다. 모든 관련 패키지와 클래스명 변경이 올바르게 반영되었습니다.

Also applies to: 9-12, 14-17, 19-20


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

UserRoomJpaRepository에서 RoomParticipantJpaRepository로의 변경이 적절하게 적용되었습니다. tearDown 메서드에서도 올바르게 업데이트되었습니다.

Also applies to: 79-79


133-141: 엔티티 생성 로직이 올바르게 업데이트되었습니다.

saveUsersToRoom 메서드에서 RoomParticipantJpaEntity 생성 및 RoomParticipantRole 사용이 적절하게 변경되었습니다. 매핑 로직이 새로운 엔티티 구조에 맞게 잘 적용되었습니다.


176-184: 테스트 메서드 내 엔티티 조작 로직이 일관되게 업데이트되었습니다.

모든 테스트 메서드에서 RoomParticipantJpaEntity 조회, 삭제, 생성 로직이 올바르게 변경되었습니다. 엔티티 빌더 패턴 사용과 RoomParticipantRole 설정이 적절합니다.

Also applies to: 224-232, 272-280, 298-306, 350-358

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

1-4: 패키지 이동 및 도메인 리팩토링이 적절하게 수행되었습니다.

UserRoom 도메인을 RoomParticipant로 변경하고 room 패키지로 이동한 것이 도메인 경계를 명확히 하는 좋은 개선사항입니다.

src/main/java/konkuk/thip/user/application/port/out/FollowingCommandPort.java (2)

4-4: followingCount 기능을 위한 User 도메인 추가가 적절합니다.

User 도메인을 import하여 followingCount 업데이트 기능을 구현하는 것이 PR 목표와 일치합니다.


12-15: FollowingCommandPort 구현체 시그니처 확인 완료

다음 구현체에서 save(Following, User)updateStatus(Following, User)가 모두 새로운 시그니처로 정의되어 있습니다. 추가 조치 없이 안전합니다.

• src/main/java/konkuk/thip/user/adapter/out/persistence/FollowingCommandPersistenceAdapter.java
– 40행: public void save(Following following, User user) { … }
– 50행: public void updateStatus(Following following, User user) { … }

src/main/java/konkuk/thip/room/application/port/out/RoomParticipantCommandPort.java (1)

1-12: 새로운 RoomParticipantCommandPort 인터페이스가 적절하게 설계되었습니다.

CQRS 패턴에 따라 CommandPort에 findByXXX 메소드들을 포함한 것이 프로젝트의 컨벤션과 일치합니다. 기존 UserRoomCommandPort를 대체하여 도메인 경계를 명확히 한 좋은 개선사항입니다.

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

13-20: 도메인 리팩토링에 따른 import 변경이 적절하게 수행되었습니다.

UserRoom 관련 클래스들이 RoomParticipant로 일관성 있게 변경되었고, 패키지 경로도 올바르게 업데이트되었습니다.


72-77: 필드명과 메소드 호출이 올바르게 업데이트되었습니다.

userRoomJpaRepositoryroomParticipantJpaRepository로 변경되고, tearDown 메소드에서도 올바르게 호출되고 있습니다.

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

1-30: 새로운 RoomParticipantRole enum이 적절하게 구현되었습니다.

기존 UserRoomRole을 대체하는 enum으로, 적절한 에러 처리와 함께 잘 설계되었습니다. from 메소드에서 InvalidStateException을 사용하여 일관성 있는 에러 처리를 구현한 것이 좋습니다.

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

4-15: UserRoom → RoomParticipant 리팩토링이 일관되게 적용되었습니다.

import 구문과 repository 참조가 새로운 패키지 구조에 맞게 정확히 업데이트되었습니다.


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

UserRoomJpaRepository에서 RoomParticipantJpaRepository로의 변경이 적절합니다.


87-91: 테스트 데이터 생성 로직이 새로운 엔티티 구조에 맞게 업데이트되었습니다.

RoomParticipantRolecreateUserRoom 메서드 사용이 적절하며, 테스트 의도를 유지하면서 리팩토링된 구조를 반영하고 있습니다.


154-156: 테스트 데이터 생성에서 새로운 엔티티와 역할 enum 사용이 적절합니다.

RoomParticipantJpaEntityRoomParticipantRole.MEMBER 사용이 정확하며, 기존 테스트 로직을 유지하면서 리팩토링된 구조를 반영하고 있습니다.

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

1-29: 새로운 VoteParticipantMapper 구현이 적절합니다.

양방향 변환 메서드가 올바르게 구현되었으며, 도메인 엔티티와 JPA 엔티티 간의 필드 매핑이 정확합니다. 빌더 패턴 사용과 필드 매핑 로직이 일관됩니다.

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

1-5: 도메인 클래스의 패키지 구조 변경이 적절합니다.

RoomParticipantRoomParticipantRole 사용으로 room 도메인 중심의 구조로 일관되게 변경되었습니다.


19-23: 일급 컬렉션 구조가 새로운 엔티티 타입에 맞게 올바르게 업데이트되었습니다.

List<RoomParticipant> 타입 변경과 팩토리 메서드 시그니처 변경이 적절합니다.


37-37: 역할 비교 로직이 새로운 enum 구조에 맞게 정확히 업데이트되었습니다.

RoomParticipantRole.HOST.getType()을 사용한 비교가 적절합니다.


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

RoomParticipant::getCurrentPageRoomParticipant::getUserPercentage 메서드 참조가 올바르게 변경되었습니다.

Also applies to: 51-51

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

6-8: RoomParticipant 관련 의존성이 올바르게 업데이트되었습니다.

RoomParticipantCommandPortRoomParticipant 도메인 엔티티 사용으로 일관된 구조를 유지하고 있습니다.

Also applies to: 23-23


34-39: 참여자 조회 로직이 새로운 포트 구조에 맞게 업데이트되었습니다.

RoomParticipantCommandPort.findAllByRoomIdRoomParticipant::getUserId 사용이 적절합니다.


41-43: followingCount 직접 조회로 성능 개선이 이루어졌습니다.

PR 목표에 맞게 별도의 count 쿼리 대신 user.getFollowingCount()를 통해 직접 조회함으로써 데이터베이스 I/O 연산을 줄였습니다. 이는 팔로잉 수 조회 성능을 크게 개선하는 변경사항입니다.

Also applies to: 55-55

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

4-15: Import 구문이 새로운 패키지 구조에 맞게 정확히 업데이트되었습니다.

RoomParticipantJpaRepository, RoomParticipantRole 등 새로운 엔티티 구조에 맞는 import가 적절하게 적용되었습니다.


61-61: Repository 의존성과 데이터 정리 로직이 올바르게 변경되었습니다.

RoomParticipantJpaRepository 사용과 tearDown 메서드의 데이터 정리 순서가 적절합니다.

Also applies to: 65-65


148-156: 테스트 헬퍼 메서드가 새로운 엔티티 구조에 맞게 업데이트되었습니다.

RoomParticipantJpaEntity 생성과 RoomParticipantRole.MEMBER 사용이 정확하며, 기존 테스트 로직을 유지하면서 리팩토링된 구조를 반영하고 있습니다.

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

7-8: Import 변경사항이 올바르게 적용되었습니다.

UserRoom 관련 클래스들이 RoomParticipant로 정확히 변경되었습니다.

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

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

repository 서브패키지로의 이동이 적절합니다.


18-18: 엔티티 Import 변경이 올바르게 적용되었습니다.

QUserRoomJpaEntity에서 QRoomParticipantJpaEntity로의 변경이 정확합니다.


61-61: 필드명 변경이 올바르게 적용되었습니다.

userRoomId에서 roomParticipantId로의 변경이 새로운 엔티티 구조에 맞게 정확히 적용되었습니다.

Also applies to: 149-149

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

1-37: CQRS 패턴에 따른 올바른 구현입니다.

  • RoomParticipantCommandPort 구현이 적절합니다
  • findByXXX 메서드들이 도메인 엔티티를 반환하는 THIP 프로젝트의 CQRS 컨벤션을 올바르게 따르고 있습니다
  • 적절한 예외 처리와 매핑 로직이 포함되어 있습니다
  • 생성자 주입과 @Repository 애노테이션 사용이 적절합니다
src/main/java/konkuk/thip/room/application/service/RoomShowPlayingDetailViewService.java (3)

10-12: Import 변경사항이 올바르게 적용되었습니다.

UserRoom에서 RoomParticipant로의 도메인 모델 변경에 따른 import 수정이 정확합니다.


28-28: 포트 의존성 변경이 적절합니다.

UserRoomCommandPort에서 RoomParticipantCommandPort로의 변경이 새로운 도메인 구조에 맞게 올바르게 적용되었습니다.


40-41: 메서드 호출과 도메인 객체 생성이 올바르게 업데이트되었습니다.

RoomParticipantCommandPortRoomParticipants 도메인 객체 사용이 적절합니다. TODO 주석도 향후 개선사항을 명시하여 좋습니다.

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

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

새로운 패키지 구조에 맞게 .repository 서브패키지로의 import 변경이 정확합니다.

Also applies to: 9-16


62-62: 테스트 의존성 변경이 적절합니다.

UserRoomJpaRepository에서 RoomParticipantJpaRepository로의 변경과 tearDown 메서드에서의 cleanup 로직이 올바르게 업데이트되었습니다.

Also applies to: 66-66


149-157: 테스트 데이터 생성 로직이 올바르게 업데이트되었습니다.

  • RoomParticipantJpaEntity 엔티티 사용
  • RoomParticipantRole.MEMBER 역할 사용
  • 빌더 패턴과 repository 저장 로직이 적절합니다

166-166: 테스트 메서드들의 repository 호출이 올바르게 변경되었습니다.

모든 테스트 메서드에서 roomParticipantJpaRepository를 사용하여 데이터를 조회하고 조작하는 로직이 새로운 도메인 모델에 맞게 일관성 있게 적용되었습니다.

Also applies to: 214-220, 267-267, 319-319

src/test/java/konkuk/thip/user/application/service/UserFollowServiceTest.java (4)

54-58: followingCount 검증 로직이 올바르게 구현됨

팔로우/언팔로우 시 followingCount가 적절히 증가/감소하는지 검증하는 테스트 로직이 잘 구현되어 있습니다. 사용자 생성 시 초기 followingCount 값을 설정하고, 서비스 호출 후 변경된 값을 확인하는 방식이 적절합니다.

Also applies to: 68-69, 80-82, 90-91, 118-122, 132-133


164-173: 테스트 헬퍼 메서드가 잘 구현됨

createUserWithFollowingCount 헬퍼 메서드가 테스트 데이터 생성을 깔끔하게 처리하고 있습니다. 필요한 모든 필드가 포함되어 있고, followingCount 값을 파라미터로 받아 유연하게 테스트할 수 있게 구현되었습니다.


7-8: 패키지 경로 변경이 의도된 구조로 확인되었습니다
UserFollowService는 실제로 src/main/java/konkuk/thip/user/application/service/following/UserFollowService.java에 위치하며, 테스트(UserFollowServiceTest.java)에서도 해당 경로를 올바르게 import하고 있습니다. 추가 조치가 필요 없습니다.


69-69: 서비스 구현에서 User 파라미터 전달 확인됨
changeFollowingState 메서드 내부에서

  • user.updateFollowingCount(isFollowing) 호출 후
  • followingCommandPort.updateStatus(following, user)User 객체를 전달하고 있어
    테스트(verify(followingCommandPort).updateStatus(inactiveFollowing, user))와 동작이 일치합니다. 추가 검증이나 수정은 필요 없습니다.
src/main/java/konkuk/thip/room/adapter/out/mapper/RoomParticipantMapper.java (2)

13-21: JPA 엔티티 변환 메서드가 올바르게 구현됨

toJpaEntity 메서드가 도메인 엔티티의 필드들을 JPA 엔티티로 적절히 매핑하고 있습니다. RoomParticipantRole.from() 메서드를 통한 enum 변환도 적절합니다.


23-35: 도메인 엔티티 변환 메서드가 올바르게 구현됨

toDomainEntity 메서드가 JPA 엔티티의 모든 필드를 도메인 엔티티로 적절히 매핑하고 있습니다. 연관 엔티티의 ID 추출(getUserId(), getRoomId())과 enum 변환(getType())도 올바르게 처리되어 있습니다.

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

1-1: 엔티티 리팩토링이 올바르게 적용됨

UserRoomJpaEntity에서 RoomParticipantJpaEntity로의 리팩토링이 일관되게 적용되었습니다:

  • 패키지 이동: user -> room 도메인
  • 테이블명 변경: user_rooms -> room_participants
  • ID 필드명 변경: userRoomId -> roomParticipantId
  • 역할 enum 변경: UserRoomRole -> RoomParticipantRole

Also applies to: 9-9, 14-14, 18-19, 30-31


33-39: 연관 관계 매핑이 적절히 유지됨

UserJpaEntityRoomJpaEntity와의 연관 관계 매핑이 올바르게 유지되어 있습니다. @ManyToOne 어노테이션과 @JoinColumn 설정이 적절합니다.

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

11-13: 의존성 주입이 올바르게 업데이트됨

UserRoomCommandPort에서 RoomParticipantCommandPort로의 변경이 적절히 적용되었습니다. 관련된 도메인 클래스들(RoomParticipant, RoomParticipants)의 import도 올바르게 업데이트되었습니다.

Also applies to: 29-29


39-40: 메서드 호출이 올바르게 업데이트됨

roomParticipantCommandPort.findAllByRoomId(roomId) 호출이 적절히 업데이트되었고, 반환 타입도 새로운 RoomParticipant 타입으로 일치합니다.

src/main/java/konkuk/thip/user/domain/User.java (3)

4-5: 새로운 예외 처리 임포트가 추가되었습니다.

팔로잉 수 관리를 위한 예외 처리 관련 임포트가 적절히 추가되었습니다.


31-31: 팩토리 메서드에서 followingCount 초기화가 추가되었습니다.

새로운 사용자 생성 시 팔로잉 수를 0으로 초기화하는 것이 적절합니다.


44-46: 팔로잉 수 증가 메서드가 올바르게 구현되었습니다.

간단하고 명확한 구현입니다.

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

1-1: 패키지 구조가 개선되었습니다.

following 관련 서비스를 별도 패키지로 분리한 것은 좋은 구조 개선입니다.


7-7: UserCommandPort 의존성이 추가되었습니다.

팔로잉 수 관리를 위해 UserCommandPort를 추가한 것은 적절합니다. CQRS 패턴을 올바르게 적용하고 있습니다.

Also applies to: 9-9, 25-25


42-43: 팔로잉 수 업데이트 로직이 올바르게 구현되었습니다.

도메인 엔티티의 상태를 업데이트하고 persistence 계층에 전달하는 로직이 적절합니다.


49-50: 새로운 팔로잉 관계 생성 시 카운트 증가가 올바르게 처리되었습니다.

팔로잉 수를 증가시키고 persistence 계층에 전달하는 로직이 적절합니다.

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

7-10: 새로운 의존성들이 추가되었습니다.

팔로잉 수 관리를 위해 UserMapper, UserJpaRepository, AliasJpaRepository 의존성이 추가되었습니다. 의존성 구조가 적절합니다.

Also applies to: 28-28, 31-31


40-40: 메서드 시그니처가 User 파라미터를 포함하도록 업데이트되었습니다.

팔로잉 수 동기화를 위해 User 엔티티를 추가로 받는 것은 적절한 설계입니다.

Also applies to: 50-50


44-45: 사용자 팔로잉 수 업데이트 로직이 통합되었습니다.

도메인 엔티티의 상태를 DB에 동기화하는 로직이 적절히 구현되어 있습니다.

Also applies to: 51-51

src/main/java/konkuk/thip/common/exception/code/ErrorCode.java (3)

45-48: 팔로우 관련 에러 코드가 체계적으로 정리되었습니다.

팔로우 관련 에러 코드들이 75000번대로 통일되고, 새로운 FOLLOW_COUNT_IS_ZERO 에러 코드가 추가되었습니다. 에러 코드 체계가 일관성 있게 개선되었습니다.


74-74: INVALID_SEARCH_TYPE 에러 코드가 수정되었습니다.

90000번대로 올바르게 수정되었습니다.


107-111: userRoom에서 roomParticipant로 용어가 변경되었습니다.

도메인 모델 리팩토링에 맞춰 에러 코드와 메시지가 적절히 업데이트되었습니다.

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

14-15: UserRoom에서 RoomParticipant로 도메인 모델이 변경되었습니다.

도메인 모델 리팩토링에 맞춰 임포트와 의존성이 적절히 업데이트되었습니다.

Also applies to: 30-30


46-46: 메서드 호출이 새로운 도메인 모델에 맞춰 변경되었습니다.

UserRoom 관련 메서드 호출이 모두 RoomParticipant로 일관성 있게 변경되었습니다.

Also applies to: 52-52, 56-56


62-69: RoomParticipant를 사용한 진행률 계산 로직이 올바르게 업데이트되었습니다.

도메인 모델 변경에 맞춰 진행률 계산 로직이 적절히 수정되었습니다.


73-78: 검증 메서드가 RoomParticipant 모델에 맞춰 업데이트되었습니다.

메서드명과 로직이 새로운 도메인 모델에 맞춰 적절히 변경되었습니다.

Comment on lines 1 to 5
package konkuk.thip.attendancecheck.application.port.out;

public interface AttendanceCheckQueryPort {

}
Copy link

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion

빈 인터페이스는 의미 없는 보일러플레이트입니다

CQRS 컨벤션(learned: CommandPort/QueryPort 분리) 상 QueryPort에는 실제 조회 메서드 시그니처를 명시해 두어야 합니다. 비어 있는 채로 머지되면:

  1. 코드 탐색 시 기능 파악이 어렵고
  2. 구현체(예: AttendanceCheckQueryPersistenceAdapter)에서 어떤 메서드를 구현해야 하는지 알 수 없습니다.

필요 메서드가 아직 결정되지 않았다면 인터페이스 추가를 늦추거나, 최소한 TODO 주석으로 향후 메서드 계획을 명시해 주세요.

🤖 Prompt for AI Agents
In
src/main/java/konkuk/thip/attendancecheck/application/port/out/AttendanceCheckQueryPort.java
lines 1 to 5, the interface is currently empty which provides no guidance on its
intended query methods. To fix this, either define the necessary query method
signatures that this port should expose according to CQRS conventions or, if the
methods are not yet decided, add a clear TODO comment indicating planned query
methods. This will improve code clarity and help implementers know what to
implement.


private int recruitCount;

private int memberCount;
Copy link

Choose a reason for hiding this comment

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

💡 Verification agent

🧩 Analysis chain

memberCount 관련 메서드 누락 확인 필요

memberCount 필드가 추가되었지만 이를 증가/감소시키는 메서드가 없습니다. 멤버 참여/탈퇴 시 카운트를 업데이트하는 로직이 다른 곳에 구현되어 있는지 확인해 주세요.


🏁 Script executed:

#!/bin/bash
# memberCount를 업데이트하는 메서드들을 검색
echo "=== memberCount 업데이트 메서드 검색 ==="
rg -A 5 -B 5 "memberCount.*[+\-]|[+\-].*memberCount|incrementMember|decrementMember|updateMemberCount" --type java

echo "=== Room 클래스의 멤버 관련 메서드 검색 ==="
ast-grep --pattern 'class Room {
  $$$
  $METHOD_NAME($$$) {
    $$$
  }
  $$$
}' | rg -A 10 -B 2 "member|Member"

Length of output: 376


memberCount 업데이트 로직 구현 필요

Room 엔티티에 memberCount 필드를 추가하였으나, 멤버 참여/탈퇴 시 이 값을 변경하는 메서드가 코드베이스 내에 존재하지 않습니다. 멤버 수가 올바르게 관리되지 않으면 도메인 상태가 일관성을 잃을 수 있습니다.

확인 및 조치 사항:

  • 대상 파일: src/main/java/konkuk/thip/room/domain/Room.java
  • 구현할 메서드 예시:
     public class Room {
         private int memberCount;
  •  /** 멤버 참여 시 카운트 증가 */
    
  •  public void incrementMemberCount() {
    
  •      this.memberCount++;
    
  •  }
    
  •  /** 멤버 탈퇴 시 카운트 감소 */
    
  •  public void decrementMemberCount() {
    
  •      if (this.memberCount > 0) {
    
  •          this.memberCount--;
    
  •      }
    
  •  }
    
    }
  • 멤버 참여/탈퇴를 처리하는 서비스 또는 이벤트 핸들러에서 위 메서드들을 호출하도록 로직을 추가해주세요.
🤖 Prompt for AI Agents
In src/main/java/konkuk/thip/room/domain/Room.java at line 41, the memberCount
field lacks update methods. Implement methods to increment and decrement
memberCount to reflect member join and leave actions. Ensure these methods are
called appropriately in the service or event handler managing member
participation to maintain domain consistency.

return RoomParticipantJpaEntity.builder()
.currentPage(roomParticipant.getCurrentPage())
.userPercentage(roomParticipant.getUserPercentage())
.roomParticipantRole(RoomParticipantRole.from(roomParticipant.getRoomParticipantRole()))
Copy link

Choose a reason for hiding this comment

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

💡 Verification agent

🧩 Analysis chain

enum 변환 로직 검증 필요

RoomParticipantRole.from() 메서드와 getType() 메서드가 올바르게 구현되어 있는지 확인이 필요합니다.

다음 스크립트로 enum 변환 로직을 확인하겠습니다:

Also applies to: 28-28


🏁 Script executed:

#!/bin/bash
# RoomParticipantRole enum의 from 메서드와 getType 메서드 확인
ast-grep --pattern $'enum RoomParticipantRole {
  $$$
  from($_) {
    $$$
  }
  $$$
  getType() {
    $$$
  }
  $$$
}'

Length of output: 120


아래 스크립트로 RoomParticipantRole enum 정의와 from, getType 메서드 구현을 직접 찾아 확인하겠습니다:


🏁 Script executed:

#!/bin/bash
# RoomParticipantRole enum 정의 및 메서드(from, getType) 구현 확인
rg -n "enum RoomParticipantRole" -A 30

Length of output: 2280


RoomParticipantRole enum에 getType() 메서드 누락
현재 RoomParticipantRole enum에 type 필드를 반환하는 getType() 메서드 정의가 없어
.from() 호출 시 컴파일 오류가 발생합니다.

조치 사항:

  • src/main/java/konkuk/thip/room/adapter/out/jpa/RoomParticipantRole.java
     public enum RoomParticipantRole {
         HOST("호스트"),
         MEMBER("팀원");
     
         private String type;
     
  •  /** enum의 type 값을 반환합니다. */
    
  •  public String getType() {
    
  •      return this.type;
    
  •  }
    
     public static RoomParticipantRole from(String type) {
         for (RoomParticipantRole role : values()) {
             if (role.getType().equals(type)) {
                 return role;
             }
         }
         throw new InvalidStateException(
             ErrorCode.ROOM_PARTICIPANT_ROLE_NOT_MATCH,
             new IllegalArgumentException("요청된 사용자 역할: " + type)
         );
     }
    
    }
  • from() 메서드는 올바르게 구현되어 있어, 위 getter 추가 후 문제가 해결됩니다.
🤖 Prompt for AI Agents
In src/main/java/konkuk/thip/room/adapter/out/jpa/RoomParticipantRole.java at
line 17, the RoomParticipantRole enum lacks a getType() method to return the
type field, causing a compilation error when calling .from(). Add a public
getType() method that returns the type field in the RoomParticipantRole enum to
fix this issue.


private String oauth2Id;

private Integer followingCount; // 팔로잉 수
Copy link

Choose a reason for hiding this comment

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

💡 Verification agent

🧩 Analysis chain

팔로잉 수 필드가 추가되었습니다.

성능 최적화를 위해 팔로잉 수를 캐시하는 필드가 추가되었습니다. 하지만 동시성 문제에 대한 고려가 필요합니다.

동시성 환경에서 여러 스레드가 동시에 팔로우/언팔로우 작업을 수행할 때 race condition이 발생할 수 있습니다. 서비스 레이어에서 적절한 동시성 제어(예: @Transactional 격리 수준 설정)가 되어있는지 확인해주세요.


🏁 Script executed:

#!/bin/bash
# 팔로잉 관련 서비스에서 트랜잭션 격리 수준 확인
ast-grep --pattern '@Transactional($$$)' -A 5 -B 5

Length of output: 14463


🏁 Script executed:

#!/bin/bash
# List all service classes in the following directory
find src/main/java/konkuk/thip/user/application/service/following -maxdepth 1 -type f

# Check for @Transactional annotations in those files
rg -n '@Transactional' src/main/java/konkuk/thip/user/application/service/following

# Search for follow/unfollow methods
rg -n 'follow' src/main/java/konkuk/thip/user/application/service/following

Length of output: 2844


동시성 안전성 보강이 필요합니다

UserFollowService.changeFollowingState()에는 이미 @Transactional이 적용되어 있지만, 격리 수준을 지정하지 않아 기본 DB 설정(대개 READ_COMMITTED)을 따르고 있습니다. 이 경우 다수 스레드가 동시에 팔로잉 수를 갱신하면 race condition이 발생할 수 있습니다.

권장 조치:

  • User 엔티티에 @Version 필드를 추가해 낙관적 락을 도입
  • 혹은 팔로우/언팔로우 시 전용 UPDATE user SET following_count = following_count + 1 (또는 -1) 쿼리를 사용해 원자적 증가/감소 처리
  • 또는 PESSIMISTIC_WRITE 잠금을 사용해 해당 행을 명시적으로 락킹

점검 대상:

  • src/main/java/konkuk/thip/user/application/service/following/UserFollowService.java
  • User 도메인 클래스(User.java) 및 사용자 저장소 레이어

위 방식 중 하나 이상을 적용해 동시성 문제를 해결해주세요.

🤖 Prompt for AI Agents
In src/main/java/konkuk/thip/user/domain/User.java at line 21, the
followingCount field lacks concurrency control, risking race conditions during
concurrent updates. To fix this, add a @Version field to the User entity to
enable optimistic locking, or modify the update logic in UserFollowService to
use atomic increment/decrement queries for followingCount, or apply a
PESSIMISTIC_WRITE lock when updating the User entity. Also review
UserFollowService and repository layers to ensure one of these concurrency
control methods is consistently applied to prevent race conditions.

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

수고하셨습니닷!! 팔로워/팔로잉 로직이 혼동되고 있는 것같습니다 확인 부탁드립니당

String imageUrl,
String alias,
int subscriberCount
int followingCount
Copy link
Member

Choose a reason for hiding this comment

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

엇 이거 subscriberCount가 팔로워수인데 followerCount로 수정해야할 것 같습니다!

Copy link
Contributor Author

Choose a reason for hiding this comment

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

앗 네 이전 피그마 화면 보다보니 헷갈렸던 것 같네요! 수정하겠습니다!

.toList();

// 4. 배치 쿼리로 유저 정보, 팔로워 수 조회
// 4. 배치 쿼리로 유저 정보만 조회
Copy link
Member

Choose a reason for hiding this comment

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

LGTM

private String oauth2Id;

@Builder.Default
private Integer followingCount = 0; // 팔로잉 수
Copy link
Member

Choose a reason for hiding this comment

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

p2: 팔로워 수인데 팔로잉 수로 착각하신것같습니다! 조회에서 쓰이는 정보들은 사용자의 팔로워 수를 뜻합니다! 즉, 팔로잉 관계테이블에서 userId가 조회 대상이고 followingUserId가 조회 대상을 구독하고있는 유저입니다!

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.

수고하셨어요 ㅎㅎ 함수이름딱 하나만바꾸고 머지하죳!!

entity.setStatus(following.getStatus());
}

private UserJpaEntity updateUserFollowingCount(User targetUser) {
Copy link
Member

Choose a reason for hiding this comment

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

여기 함수이름 아직 안바뀐것같습니닷~!

Copy link
Contributor Author

Choose a reason for hiding this comment

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

👍🏻

@hd0rable hd0rable changed the title [refactor] User에 followingCount 컬럼 추가 [refactor] User에 followerCount 컬럼 추가 Jul 15, 2025
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.

그에게 쥐어지는 합격 목걸이 🥇

@buzz0331 buzz0331 merged commit 1154e03 into develop Jul 15, 2025
1 of 2 checks passed
@buzz0331 buzz0331 deleted the refactor/#82-add-followingCount 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-124] [refactor] User에 followingCount 추가

3 participants