Skip to content

Conversation

@dahyun24
Copy link
Contributor

@dahyun24 dahyun24 commented Oct 31, 2025

🔗 연관된 이슈

🚀 변경 유형

  • ✨ 기능 추가 (feature)
  • 🐛 버그 수정 (fix)
  • 📝 문서 변경 (docs)
  • ♻️ 리팩토링 (refactor)
  • 🧪 테스트 추가 / 수정 (test)
  • ⚙️ 설정 변경 (chore)

📝 작업 내용

  • joinColumn 어노테이션 추가
  • 어노테이션 추가에 따른 service, repository, mapper 코드 수정
  • NewEnterResponse 응답에 사용자 이름, 이미지 url 포함되도록 수정

📸 스크린샷

스크린샷 2025-11-01 오전 1 28 59

💬 리뷰 요구사항

  • +)) User 테이블에 album_cnt 가 있는데 앨범 생성할 떄 이 필드가 그대로 입니다. 나중에 구현 부탁드려요~
  • *나도 photo_cnt 올리는 로직을 까먹었다

Summary by CodeRabbit

  • 새로운 기능

    • 앨범 진입 시 최근 업로드 사진에 업로더 이름과 프로필 이미지가 함께 표시됩니다 (최대 5개).
  • 리팩터

    • 앨범·사진 데이터 구조 개선 및 저장소 조회 최적화로 최신 사진 조회 안정성 및 성능 향상되었습니다.

@coderabbitai
Copy link

coderabbitai bot commented Oct 31, 2025

Walkthrough

도메인 엔티티의 원시 외래키(userId, albumId)를 JPA 관계(User, Album)로 리팩토링하고, 최근 사진 응답을 업로더 정보가 포함된 DTO(List)로 변경하며 매퍼·리포지토리·서비스 호출을 이에 맞춰 조정했습니다.

Changes

Cohort / File(s) 변경 요약
도메인 엔티티 관계 리팩토링
src/main/java/com/cheeeese/photo/domain/Photo.java, src/main/java/com/cheeeese/album/domain/UserAlbum.java
userId/albumId 원시 필드를 제거하고 @ManyToOne으로 User user, Album album 관계 추가; 빌더/생성자 시그니처를 엔티티 기반으로 변경
매퍼 시그니처 변경
src/main/java/com/cheeeese/photo/infrastructure/mapper/PhotoMapper.java, src/main/java/com/cheeeese/album/infrastructure/mapper/UserAlbumMapper.java
toEntity 메서드 시그니처를 Long ID → 엔티티(User, Album) 파라미터로 변경; toGuestUserAlbum 제거
응답 DTO 구조 개선
src/main/java/com/cheeeese/album/dto/response/NewEnterResponse.java
List<String> recentPhotoUrlsList<RecentPhotoResponse> recentPhotos로 변경; nested RecentPhotoResponse 레코드(썸네일, 업로더 이름, 업로더 프로필) 추가
앨범 매퍼 업데이트
src/main/java/com/cheeeese/album/infrastructure/mapper/AlbumMapper.java
toNewResponse 파라미터 타입을 List<RecentPhotoResponse>로 변경하고 toRecentPhotoResponse(Photo) 헬퍼 추가
서비스 로직 & 헬퍼 추가
src/main/java/com/cheeeese/album/application/AlbumService.java, src/main/java/com/cheeeese/photo/application/PhotoService.java
최근 사진 조회 API명/반환 타입 변경(getRecentPhotosForNewEnterList<Photo>); AlbumService에 getRecentPhotosWithUploaderInfo(Long) 헬퍼 추가하여 Photo → RecentPhotoResponse 매핑; enterAlbum/createAlbum에서 엔티티 기반 매퍼 호출로 변경
리포지토리 JPQL 명시화
src/main/java/com/cheeeese/photo/infrastructure/persistence/PhotoRepository.java, src/main/java/com/cheeeese/album/infrastructure/persistence/UserAlbumRepository.java
복합 조건 조회에 대해 JPQL @Query + @Param 추가, 페이지네이션(Pageable) 도입; 쿼리에서 관계 필드 접근(p.user.id 등)으로 변경
검증/유효성 로직 조정
src/main/java/com/cheeeese/photo/application/validator/PhotoValidator.java
소유자·앨범 검증 시 photo.getUser().getId(), photo.getAlbum().getId() 등 엔티티 접근으로 변경

Sequence Diagram(s)

sequenceDiagram
    actor User
    participant AlbumService
    participant PhotoService
    participant PhotoRepository
    participant AlbumMapper
    participant UserAlbumMapper

    User->>AlbumService: enterAlbum(token, currentUser)
    AlbumService->>PhotoService: getRecentPhotosForNewEnter(albumId)
    PhotoService->>PhotoRepository: findRecentPhotosByAlbumIdAndStatus(albumId, ACTIVE, PageRequest)
    PhotoRepository-->>PhotoService: List<Photo>
    PhotoService-->>AlbumService: List<Photo>

    AlbumService->>AlbumMapper: toRecentPhotoResponse(Photo) *map*
    AlbumMapper-->>AlbumService: List<RecentPhotoResponse>

    AlbumService->>UserAlbumMapper: toEntity(currentUser, album, Role.GUEST/MAKER)
    UserAlbumMapper-->>AlbumService: UserAlbum

    AlbumService-->>User: NewEnterResponse(recentPhotos: List<RecentPhotoResponse>, ...)
Loading
sequenceDiagram
    participant Before as 이전 흐름
    participant After as 변경된 흐름

    Before->>Before: Photo(userId: Long, albumId: Long)
    After->>After: Photo(user: User, album: Album)

    Before->>Before: PhotoMapper.toEntity(Long userId, Long albumId)
    After->>After: PhotoMapper.toEntity(User user, Album album)

    Before->>Before: recentPhotoUrls: List<String>
    After->>After: recentPhotos: List<RecentPhotoResponse>
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

  • 추가로 주의할 파일/영역:
    • Photo / UserAlbum 관계 매핑과 N+1, LAZY 로딩 관련 테스트
    • PhotoRepository JPQL(Join fetch)과 PageRequest 사용시 성능/정확성
    • AlbumService.getRecentPhotosWithUploaderInfo의 1–4장/5장 이상 분기 로직
    • DTO 변경으로 인한 API 호환성(컨트롤러/클라이언트 영향) 검증
    • 매퍼들의 null/Optional 처리 및 빌더 호출 일관성

Possibly related issues

Possibly related PRs

Suggested reviewers

  • zyovn

Poem

🐰 외래키는 이젠 손을 잡고,
User와 Album, Photo가 함께 춤춰요.
최근 사진엔 이름과 얼굴이 빛나고,
매퍼는 바쁘게 변환을 노래하네.
작지만 반짝이는 리팩토링 파티 🎉

Pre-merge checks and finishing touches

❌ Failed checks (1 warning)
Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 9.52% which is insufficient. The required threshold is 80.00%. You can run @coderabbitai generate docstrings to improve docstring coverage.
✅ Passed checks (2 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title Check ✅ Passed PR 제목 "feat: Photo, UserAlbum 엔티티에 Join 추가 및 NewEnterResponse 수정"은 changeset의 주요 변경사항을 정확하게 반영하고 있습니다. Photo와 UserAlbum 엔티티에 @manytoone 관계와 @joincolumn이 추가되었으며, 이에 따라 NewEnterResponse DTO가 수정되어 RecentPhotoResponse 중첩 레코드가 추가되었습니다. 제목은 명확하고 구체적이며, 엔티티 구조 변경이라는 핵심 의도와 이에 따른 응답 모델 개선을 효과적으로 요약하고 있습니다. 모든 세부 변경(Service, Mapper, Repository 수정 등)을 포함할 필요는 없으며, 제목은 주요 변경의 수준에서 팀원이 변경 내용을 이해할 수 있도록 충분한 정보를 제공합니다.
✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch feat/#34-entity-join

📜 Recent review details

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between c27d05d and 36fd13d.

📒 Files selected for processing (2)
  • src/main/java/com/cheeeese/album/application/AlbumService.java (5 hunks)
  • src/main/java/com/cheeeese/photo/infrastructure/persistence/PhotoRepository.java (2 hunks)
🧰 Additional context used
🧠 Learnings (1)
📚 Learning: 2025-10-31T13:17:52.512Z
Learnt from: dahyun24
Repo: Say-Cheeeese/BE PR: 35
File: src/main/java/com/cheeeese/photo/application/PhotoService.java:46-52
Timestamp: 2025-10-31T13:17:52.512Z
Learning: In src/main/java/com/cheeeese/photo/application/PhotoService.java, the getRecentThumbnailUrls method intentionally returns only the first thumbnail URL when photos.size() < 5, rather than returning all available thumbnails. This is according to product requirements: 0 photos → empty list, 1-4 photos → single thumbnail (most recent), 5 photos → all 5 thumbnails.

Applied to files:

  • src/main/java/com/cheeeese/album/application/AlbumService.java
  • src/main/java/com/cheeeese/photo/infrastructure/persistence/PhotoRepository.java
🧬 Code graph analysis (1)
src/main/java/com/cheeeese/album/application/AlbumService.java (2)
src/main/java/com/cheeeese/album/infrastructure/mapper/AlbumMapper.java (1)
  • AlbumMapper (13-149)
src/main/java/com/cheeeese/album/infrastructure/mapper/UserAlbumMapper.java (1)
  • UserAlbumMapper (8-18)
🔇 Additional comments (4)
src/main/java/com/cheeeese/photo/infrastructure/persistence/PhotoRepository.java (2)

15-28: 이전 LazyInitializationException 문제가 해결되었습니다.

JOIN FETCH p.user를 추가하여 이전 리뷰에서 지적된 지연 로딩 문제와 N+1 문제가 해결되었습니다.

참고: JOIN FETCHPageable을 함께 사용하면 Hibernate가 메모리에서 페이지네이션을 수행하게 되지만, 최대 5개의 결과만 조회하는 용도이므로 성능상 문제가 없습니다.


35-35: 도메인 모델 리팩토링에 맞춰 올바르게 수정되었습니다.

원시 외래키(userId)에서 JPA 관계 참조(user.id)로 변경되어 엔티티 매핑 구조와 일관성 있게 처리됩니다.

src/main/java/com/cheeeese/album/application/AlbumService.java (2)

69-73: 앨범 생성자에 대한 권한 설정이 올바릅니다.

앨범 생성 시 Role.MAKER를 부여하는 것이 정책에 맞으며, 엔티티 기반 매핑으로의 변경도 적절합니다.


161-178: 비즈니스 로직이 제품 요구사항에 맞게 구현되었습니다.

최근 사진 조회 로직이 올바르게 구현되어 있습니다:

  • 0개: 빈 리스트 반환
  • 1-4개: 최신 사진 1개만 반환
  • 5개: 전체 5개 반환

@Transactional 컨텍스트 내에서 Photo 엔티티를 DTO로 변환하므로 지연 로딩 문제도 없습니다.

Based on learnings


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@dahyun24 dahyun24 self-assigned this Oct 31, 2025
@dahyun24 dahyun24 added the ✨feature New feature or request label Oct 31, 2025
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: 2

📜 Review details

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 35e1b93 and c27d05d.

📒 Files selected for processing (11)
  • src/main/java/com/cheeeese/album/application/AlbumService.java (5 hunks)
  • src/main/java/com/cheeeese/album/domain/UserAlbum.java (3 hunks)
  • src/main/java/com/cheeeese/album/dto/response/NewEnterResponse.java (2 hunks)
  • src/main/java/com/cheeeese/album/infrastructure/mapper/AlbumMapper.java (3 hunks)
  • src/main/java/com/cheeeese/album/infrastructure/mapper/UserAlbumMapper.java (1 hunks)
  • src/main/java/com/cheeeese/album/infrastructure/persistence/UserAlbumRepository.java (1 hunks)
  • src/main/java/com/cheeeese/photo/application/PhotoService.java (3 hunks)
  • src/main/java/com/cheeeese/photo/application/validator/PhotoValidator.java (2 hunks)
  • src/main/java/com/cheeeese/photo/domain/Photo.java (3 hunks)
  • src/main/java/com/cheeeese/photo/infrastructure/mapper/PhotoMapper.java (1 hunks)
  • src/main/java/com/cheeeese/photo/infrastructure/persistence/PhotoRepository.java (2 hunks)
🧰 Additional context used
🧠 Learnings (1)
📚 Learning: 2025-10-31T13:17:52.512Z
Learnt from: dahyun24
Repo: Say-Cheeeese/BE PR: 35
File: src/main/java/com/cheeeese/photo/application/PhotoService.java:46-52
Timestamp: 2025-10-31T13:17:52.512Z
Learning: In src/main/java/com/cheeeese/photo/application/PhotoService.java, the getRecentThumbnailUrls method intentionally returns only the first thumbnail URL when photos.size() < 5, rather than returning all available thumbnails. This is according to product requirements: 0 photos → empty list, 1-4 photos → single thumbnail (most recent), 5 photos → all 5 thumbnails.

Applied to files:

  • src/main/java/com/cheeeese/album/dto/response/NewEnterResponse.java
  • src/main/java/com/cheeeese/album/application/AlbumService.java
  • src/main/java/com/cheeeese/photo/application/PhotoService.java
  • src/main/java/com/cheeeese/album/infrastructure/mapper/AlbumMapper.java
  • src/main/java/com/cheeeese/photo/infrastructure/persistence/PhotoRepository.java
🧬 Code graph analysis (2)
src/main/java/com/cheeeese/album/application/AlbumService.java (2)
src/main/java/com/cheeeese/album/infrastructure/mapper/AlbumMapper.java (1)
  • AlbumMapper (13-149)
src/main/java/com/cheeeese/album/infrastructure/mapper/UserAlbumMapper.java (1)
  • UserAlbumMapper (8-18)
src/main/java/com/cheeeese/photo/application/PhotoService.java (1)
src/main/java/com/cheeeese/photo/infrastructure/mapper/PhotoMapper.java (1)
  • PhotoMapper (12-42)
🔇 Additional comments (5)
src/main/java/com/cheeeese/album/infrastructure/persistence/UserAlbumRepository.java (1)

13-20: JPQL로 엔티티 기반 조회를 명시한 점이 깔끔합니다.

src/main/java/com/cheeeese/photo/application/validator/PhotoValidator.java (1)

106-119: 엔티티 참조를 활용한 검증으로 일관성이 확보된 것 확인했습니다.

src/main/java/com/cheeeese/photo/infrastructure/mapper/PhotoMapper.java (1)

14-22: User·Album 엔티티를 직접 세팅하도록 바꾼 구성 잘 반영되었습니다.

src/main/java/com/cheeeese/album/application/AlbumService.java (1)

161-177: 최근 사진 응답이 기획 요구(1~4장일 때 1장, 5장일 때 5장)를 그대로 유지하고 있어요.

Based on learnings

src/main/java/com/cheeeese/album/infrastructure/mapper/UserAlbumMapper.java (1)

10-16: 엔티티 참조 기반 빌더 구성이 일관되게 정리되었습니다.

Copy link
Member

@zyovn zyovn left a comment

Choose a reason for hiding this comment

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

수고하셧세여 🎸🧌🕺

@dahyun24 dahyun24 merged commit ae96ac5 into develop Nov 1, 2025
1 check passed
@zyovn zyovn deleted the feat/#34-entity-join branch November 1, 2025 04:30
@dahyun24 dahyun24 linked an issue Nov 1, 2025 that may be closed by this pull request
2 tasks
@coderabbitai coderabbitai bot mentioned this pull request Jan 20, 2026
6 tasks
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

✨feature New feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

feat: Photo, UserAlbum 엔티티 Join 추가

3 participants