Skip to content

[REFACTOR] 알람 중복 로직 제거 및 유저 이미지 추가#280

Merged
yooooonshine merged 3 commits intodevelopfrom
feature/279-refactor-notification
Nov 24, 2025
Merged

[REFACTOR] 알람 중복 로직 제거 및 유저 이미지 추가#280
yooooonshine merged 3 commits intodevelopfrom
feature/279-refactor-notification

Conversation

@yooooonshine
Copy link
Contributor

@yooooonshine yooooonshine commented Nov 24, 2025

개요

작업사항

  • 알림 중복 로직 제거
  • 알림에 sender 이미지 추가

Summary by CodeRabbit

릴리스 노트

  • 새로운 기능

    • 알림 목록에 발신자 프로필 이미지 표시(이미지 유무 및 이미지 URL 포함)
  • 개선사항

    • 알림 처리 흐름 통합 및 일관화로 동전 수령, 게시물 구매(코인/티켓), 팔로우, 게시물 리뷰, 좋아요, 파생 게시물 등 다양한 알림 유형 처리 개선

✏️ Tip: You can customize this high-level summary in your review settings.

@yooooonshine yooooonshine linked an issue Nov 24, 2025 that may be closed by this pull request
@coderabbitai
Copy link

coderabbitai bot commented Nov 24, 2025

Caution

Review failed

The pull request is closed.

Walkthrough

알림 생성 로직을 서비스별 직접 호출에서 중앙화된 NotificationFactory로 이동시키고, 알림 응답에 발신자 이미지 정보(hasSenderImage, senderImageUrl)를 추가하는 내부 리팩터링을 적용했습니다. 테스트 및 관련 서비스들의 알림 호출이 팩토리 기반으로 변경되었습니다.

Changes

Cohort / File(s) 변경 요약
NotificationFactory 신규 구현
src/main/java/hanium/modic/backend/domain/notification/factory/NotificationFactory.java
새로운 팩토리 클래스 추가. 알림 전송용 공통 메서드(coinReceived, postPurchasedByCoin, postPurchasedByTicket, postReviewed, followed, derivedPostCreated, liked)와 내부 헬퍼(user·image 조회, payload 빌드) 제공.
NotificationService 수정
src/main/java/hanium/modic/backend/domain/notification/service/NotificationService.java
UserImageService 주입 추가. getNotifications에서 발신자 이미지 URL 조회 및 GetNotificationsResponse에 이미지 플래그/URL 포함하도록 변경.
알림 DTO 확장
src/main/java/hanium/modic/backend/domain/notification/dto/GetNotificationsResponse.java
레코드에 hasSenderImage: boolean, senderImageUrl: String 필드 추가 및 정적 팩토리 시그니처 확장.
NotificationPayload 포맷 정리
src/main/java/hanium/modic/backend/domain/notification/dto/NotificationPayload.java
포맷/주석 정리만 수행. 공개 API 변경 없음.
서비스들: 팩토리로 전환
src/main/java/hanium/modic/backend/domain/ai/aiChat/service/AiImagePermissionService.java, src/main/java/hanium/modic/backend/domain/follow/service/FollowService.java, src/main/java/hanium/modic/backend/domain/post/service/AiDerivedPostService.java, src/main/java/hanium/modic/backend/domain/postLike/service/PostLikeService.java, src/main/java/hanium/modic/backend/domain/postReview/service/PostReviewService.java, src/main/java/hanium/modic/backend/domain/transaction/service/AccountService.java
각 서비스의 NotificationService 의존성을 NotificationFactory로 교체하고, 직접 생성하던 NotificationPayload 호출을 팩토리 메서드 호출로 변경.
테스트 업데이트
src/test/java/hanium/modic/backend/domain/ai/service/AiImagePermissionServiceTest.java, src/test/java/hanium/modic/backend/domain/follow/service/FollowMockingServiceTest.java, src/test/java/hanium/modic/backend/domain/post/service/AiDerivedPostServiceTest.java
테스트에서 NotificationService 목을 NotificationFactory 목으로 변경 및 스텁/검증 대상 메서드 조정(postPurchasedByCoin, postPurchasedByTicket, followed, derivedPostCreated 등).

Sequence Diagram(s)

sequenceDiagram
    autonumber
    participant S as 서비스 (예: FollowService)
    participant F as NotificationFactory
    participant U as UserEntityRepository
    participant UI as UserImageService
    participant N as NotificationService

    S->>F: followed(followerId, targetUserId)
    F->>U: findById(followerId)
    U-->>F: UserEntity
    F->>UI: createImageGetUrlOptional(followerId)
    UI-->>F: Optional<String> imageUrl
    F->>N: createNotification(targetUserId, FOLLOWED, payload(with image info))
    N-->>F: void
    F-->>S: void

    Note over F, N: 중앙화된 페이로드 생성 및 전송 흐름
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45분

  • 추가 검토가 필요한 항목:
    • NotificationFactory: 각 공개 메서드의 도메인 엔티티 조회 및 예외 처리(orElseThrow)의 적절성
    • NotificationService.getNotifications: 사용자 이미지 조회로 인한 쿼리 빈도(N+1) 및 Optional 처리
    • 서비스 변경점들: 팩토리 호출 파라미터(아이디·타입)가 정확히 전달되는지 확인
    • 관련 테스트: 목 설정과 호출 검증이 새 메서드 시그니처에 맞춰 정확히 이뤄졌는지 검증

Possibly related PRs

Poem

🐰 알림 길을 새로 닦았네,
팩토리 문을 두드리면 소식이 오고,
초상화 한 장 담아 보냈더니,
발신자 얼굴 반짝 반짝 ✨,
당근 들고 축하하러 갈래요! 🥕

Pre-merge checks and finishing touches

❌ Failed checks (1 warning)
Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 71.43% which is insufficient. The required threshold is 80.00%. You can run @coderabbitai generate docstrings to improve docstring coverage.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed 제목은 알람 중복 로직 제거 및 유저 이미지 추가라는 주요 변경사항을 명확하게 반영하고 있으며, 변경사항 집합의 핵심을 요약하고 있습니다.
Description check ✅ Passed 설명이 필수 섹션(개요, 작업사항)을 모두 포함하고 있으며, 관련 이슈, 알림 중복 로직 제거, 발신자 이미지 추가 등 주요 내용을 담고 있습니다.
Linked Issues check ✅ Passed PR의 코드 변경사항이 링크된 이슈 #279의 목표인 유저 이미지 추가 및 알람 리팩터링을 완벽하게 충족하고 있습니다.
Out of Scope Changes check ✅ Passed 모든 변경사항은 NotificationFactory 도입으로 알림 중복 로직을 제거하고 발신자 이미지를 추가하는 범위 내에 있습니다.

📜 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 ea8dfd8 and d5e768d.

📒 Files selected for processing (2)
  • src/main/java/hanium/modic/backend/domain/notification/factory/NotificationFactory.java (1 hunks)
  • src/main/java/hanium/modic/backend/domain/postLike/service/PostLikeService.java (3 hunks)

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.

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

🧹 Nitpick comments (2)
src/test/java/hanium/modic/backend/domain/follow/service/FollowMockingServiceTest.java (1)

25-26: 팔로우 알림 호출에 대한 검증 추가를 고려해 주세요

followSuccess 테스트에서 notificationFactory.followed(anyLong(), anyLong())만 stub 하고 verify는 하지 않아, 알림 호출 여부가 깨져도 테스트가 잡아내지 못합니다. 예를 들어 아래 정도를 추가하면 리팩터링 시 회귀를 막는 데 도움이 될 것 같습니다.

verify(notificationFactory, times(1)).followed(me.getId(), target.getId());

기존 동작에는 영향 없고 테스트 신뢰도만 올라가는 수준이라, 여유 있을 때 반영해 보셔도 좋겠습니다.

Also applies to: 48-49, 75-77

src/main/java/hanium/modic/backend/domain/notification/factory/NotificationFactory.java (1)

39-42: 발신자 이미지 처리 로직이 Factory에서 아직 사용되지 않습니다

UserImageServicegetUserImageUrl(...) 헬퍼를 두셨고, basePayload 주석에도 “보내는 이의 이미지”라고 되어 있지만, 실제로는 이미지 정보를 NotificationPayload에 넣지 않고 있습니다. 현재 구현 기준으로는:

  • UserImageService / getUserImageUrl / Optional 반환값이 전혀 사용되지 않고,
  • 발신자 이미지는 다른 계층(알림 조회 시점 등)에서 따로 붙인다고 오해할 여지가 있습니다.

의도에 따라 두 가지 방향 중 하나를 추천드립니다.

  • 여기서 이미지까지 포함시키려는 의도였다면: basePayload 안에서 getUserImageUrl(senderId)를 사용해 NotificationPayload에 이미지 관련 필드를 세팅하는 로직을 추가.
  • 조회 시점에만 이미지를 붙일 계획이라면: 이 Factory에서 UserImageService 의존성과 getUserImageUrl 메서드를 제거하고 주석도 정리해서, 실제 책임 위치를 명확히 표현.

지금도 기능적으로는 문제 없지만, PR 설명의 “발신자 이미지 추가”와 코드의 역할이 살짝 어긋나 보이는 부분이라 정리해 두면 나중에 읽는 사람이 덜 헷갈릴 것 같습니다.

Also applies to: 49-58

📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between eae7fe6 and ea8dfd8.

📒 Files selected for processing (13)
  • src/main/java/hanium/modic/backend/domain/ai/aiChat/service/AiImagePermissionService.java (4 hunks)
  • src/main/java/hanium/modic/backend/domain/follow/service/FollowService.java (3 hunks)
  • src/main/java/hanium/modic/backend/domain/notification/dto/GetNotificationsResponse.java (3 hunks)
  • src/main/java/hanium/modic/backend/domain/notification/dto/NotificationPayload.java (3 hunks)
  • src/main/java/hanium/modic/backend/domain/notification/factory/NotificationFactory.java (1 hunks)
  • src/main/java/hanium/modic/backend/domain/notification/service/NotificationService.java (5 hunks)
  • src/main/java/hanium/modic/backend/domain/post/service/AiDerivedPostService.java (3 hunks)
  • src/main/java/hanium/modic/backend/domain/postLike/service/PostLikeService.java (3 hunks)
  • src/main/java/hanium/modic/backend/domain/postReview/service/PostReviewService.java (3 hunks)
  • src/main/java/hanium/modic/backend/domain/transaction/service/AccountService.java (3 hunks)
  • src/test/java/hanium/modic/backend/domain/ai/service/AiImagePermissionServiceTest.java (4 hunks)
  • src/test/java/hanium/modic/backend/domain/follow/service/FollowMockingServiceTest.java (3 hunks)
  • src/test/java/hanium/modic/backend/domain/post/service/AiDerivedPostServiceTest.java (3 hunks)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
  • GitHub Check: build
🔇 Additional comments (9)
src/main/java/hanium/modic/backend/domain/notification/dto/NotificationPayload.java (1)

6-21: 코드 정리가 잘 되었습니다.

포맷팅 변경만 있고 기능적 변경은 없습니다.

Also applies to: 39-43

src/main/java/hanium/modic/backend/domain/postReview/service/PostReviewService.java (1)

18-18: 팩토리 패턴으로의 리팩터링이 적절합니다.

NotificationFactory를 사용하여 알림 생성 로직을 중앙화하고 중복을 제거했습니다. 팩토리 메서드가 필요한 데이터를 내부적으로 가져오는 것으로 보입니다.

Also applies to: 49-49, 78-78

src/main/java/hanium/modic/backend/domain/transaction/service/AccountService.java (1)

16-16: NotificationFactory로의 전환이 올바릅니다.

코인 전송 알림이 간결한 팩토리 메서드로 처리됩니다.

Also applies to: 38-38, 81-81

src/main/java/hanium/modic/backend/domain/post/service/AiDerivedPostService.java (1)

15-15: 파생 포스트 알림 로직이 팩토리 패턴으로 깔끔하게 개선되었습니다.

트랜잭션 커밋 후 비동기로 실행되는 알림 로직이 간소화되었습니다.

Also applies to: 50-50, 170-170

src/test/java/hanium/modic/backend/domain/post/service/AiDerivedPostServiceTest.java (1)

28-28: 테스트 코드가 프로덕션 코드의 팩토리 패턴 변경에 맞게 올바르게 업데이트되었습니다.

NotificationFactory 사용으로 전환이 정확히 반영되었습니다.

Also applies to: 74-74, 122-122

src/test/java/hanium/modic/backend/domain/ai/service/AiImagePermissionServiceTest.java (1)

22-22: 테스트가 코인 및 티켓 구매 알림의 팩토리 패턴 변경을 올바르게 반영합니다.

두 결제 방식 모두에서 NotificationFactory 사용이 정확히 적용되었습니다.

Also applies to: 56-56, 74-74, 140-140

src/main/java/hanium/modic/backend/domain/notification/dto/GetNotificationsResponse.java (1)

18-39: 발신자 이미지 필드 추가 설계 👍

hasSenderImage / senderImageUrl 필드 추가와 of(...) 팩토리 시그니처 확장은 자연스럽고, 호출부에서도 컴파일 타임에 새 인자를 강제하므로 안정적입니다. 응답 스키마가 바뀌었으니, 이 두 필드를 사용하는 쪽(특히 프론트)이 정상적으로 파싱·표시하는지만 한 번만 확인해 주세요.

src/main/java/hanium/modic/backend/domain/ai/aiChat/service/AiImagePermissionService.java (1)

13-49: NotificationFactory로 위임한 구조 적절합니다

기존의 NotificationService 직접 호출을 notificationFactory.postPurchasedByCoin(...), postPurchasedByTicket(...)로 치환한 부분이 자연스럽고, buyerId/postId 인자도 의도에 맞게 전달되고 있습니다. 알림 생성 책임을 공통 Factory로 모아서, 이 서비스는 도메인 로직에만 집중하게 된 점이 좋습니다.

Also applies to: 71-72, 88-89

src/main/java/hanium/modic/backend/domain/follow/service/FollowService.java (1)

18-19: 팔로우 알림 위임 로직 일관성 좋습니다

followOrUnfollow에서 팔로우 시 notificationFactory.followed(me.getId(), targetId)로 위임한 부분이 Factory 정의(followed(followerId, targetUserId))와 정확히 맞고, 서비스 레벨에서 알림 세부 구현을 감추는 구조도 깔끔합니다. Follow 관련 중복 알림 로직을 잘 정리하신 것 같습니다.

Also applies to: 39-39, 61-61

@yooooonshine yooooonshine merged commit 09bc8a8 into develop Nov 24, 2025
1 of 2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[REFACTOR] : 알람 리팩터링

1 participant