Skip to content

Conversation

@sominyun
Copy link
Member

@sominyun sominyun commented Nov 4, 2025

📌 관련 이슈

✨ 작업 내용

📸 스크린샷(선택)

📚 리뷰 요구사항(선택)

(프론트의 요청사항) login에 회원가입 및 로그인 통합함.

Summary by CodeRabbit

릴리스 노트

  • New Features

    • 프로모션 기능 추가 (활성 프로모션 조회 및 크롤러 연동)
    • 헬스체크 엔드포인트 추가
  • Refactor

    • 사용자 인증 기반 동적 ID 처리로 개선
    • 카드 정보 데이터 모델 구조 개선
    • gRPC 서비스 및 프로토콜 확장
    • MySQL 데이터베이스 전환
    • 배포 환경 및 포트 설정 업데이트
  • Chores

    • 환경 변수 기반 설정 관리 추가

juanxiu added 30 commits October 5, 2025 21:28
@sominyun sominyun self-assigned this Nov 4, 2025
@coderabbitai
Copy link

coderabbitai bot commented Nov 4, 2025

Caution

Review failed

The pull request is closed.

PR 분석 보고서

Walkthrough

배포 설정을 업데이트하고 gRPC 프로토 메시지를 재구조화하며, 카드/혜택/프로모션 엔티티를 리팩토링했습니다. 인증 흐름을 단순화하고, 하드코딩된 사용자 ID를 AuthUtils로 대체하며, 새로운 이벤트 기반 프로모션 처리 시스템을 도입했습니다.

Changes

코호트 / 파일(들) 변경 요약
배포 및 환경 설정
.github/workflows/deploy.yml, Dockerfile, docker-compose.yml, gRPC/src/main/resources/application.yml, src/main/resources/application.yml
DB_NAME, DB_PASSWORD, REDIS 설정 업데이트; gRPC 포트 9091→9090 변경; 헬스체크 엔드포인트 수정; Redis 서비스 추가; MySQL 데이터소스로 전환
gRPC 프로토 정의
gRPC/src/main/proto/cardCompany.proto, gRPC/src/main/proto/cardData.proto, gRPC/src/main/proto/promotion.proto
CardCompany 및 CardType 열거형 추가; CrawledBenefit→CardBenefit으로 메시지 재구조화; PromotionService 및 CardPromotionService 추가
카드 엔티티 및 저장소
src/main/java/com/example/demo/card/entity/Card.java, src/main/java/com/example/demo/card/repository/CardRepository.java, src/main/java/com/example/demo/card/service/GetCardService.java, src/main/java/com/example/demo/card/service/UserCardService.java
Card에 CardCompany, CardType 열거형 필드 추가; cardName/cardBank→name/cardCompany 리매핑; findByExternalId→findByCardId 변경
혜택 엔티티 및 DTO
src/main/java/com/example/demo/benefit/entity/Benefit.java, src/main/java/com/example/demo/benefit/entity/DiscountBenefit.java, src/main/java/com/example/demo/benefit/entity/PointBenefit.java, src/main/java/com/example/demo/benefit/entity/CashbackBenefit.java
id 필드 제거; externalId→minimumSpending/name으로 변경; Setter 제거; cardId→card로 리네이밍
혜택 DTO
src/main/java/com/example/demo/benefit/application/dto/DiscountBenefitDTO.java, src/main/java/com/example/demo/benefit/application/dto/PointBenefitDTO.java, src/main/java/com/example/demo/benefit/application/dto/CashbackBenefitDTO.java, src/main/java/com/example/demo/benefit/dto/BenefitDetailDTO.java, src/main/java/com/example/demo/benefit/dto/CardWithBenefitResponse.java, src/main/java/com/example/demo/benefit/dto/AvailableCardResponse.java
minimumSpending 필드 추가; BenefitDetailDTO에 summary 필드 추가; CardWithBenefitResponse에서 cardBank/type 제거, cardCompany/cardType 추가; cardBank 제거
혜택 저장소 및 서비스
src/main/java/com/example/demo/benefit/repository/BenefitRepository.java, src/main/java/com/example/demo/benefit/repository/CashbackBenefitRepository.java, src/main/java/com/example/demo/benefit/repository/PointBenefitRepository.java, src/main/java/com/example/demo/benefit/service/OptimalBenefitService.java, src/main/java/com/example/demo/benefit/util/BenefitConverter.java, src/main/java/com/example/demo/benefit/util/ProtoMapper.java
JpaRepository 제네릭 타입 수정; CardCompany/CardType 매핑 로직 추가; summary 집계 로직 추가; proto→domain 열거형 매퍼 구현
인증 및 사용자
src/main/java/com/example/demo/auth/repository/RefreshTokenRepository.java, src/main/java/com/example/demo/auth/service/KakaoLoginService.java, src/main/java/com/example/demo/auth/controller/AuthController.java, src/main/java/com/example/demo/user/dto/UserCardRegistrationRequest.java, src/main/java/com/example/demo/user/service/UserCardRegistrationService.java
deleteByMemberId 메서드 추가; signup 엔드포인트 제거; 자동 사용자 생성 로직 추가; userId 필드 제거; AuthUtils를 통한 동적 ID 조회
프로모션 기능
src/main/java/com/example/demo/promotion/entity/CardPromotion.java, src/main/java/com/example/demo/promotion/repository/PromotionRepository.java, src/main/java/com/example/demo/promotion/service/PromotionService.java, src/main/java/com/example/demo/promotion/dto/ActivePromotionResponse.java, src/main/java/com/example/demo/controller/PromotionController.java
새로운 CardPromotion 엔티티 추가; PromotionRepository와 PromotionService 구현; ActivePromotionResponse DTO 추가
이벤트 처리
src/main/java/com/example/demo/event/CardData/CardDataEventListener.java, src/main/java/com/example/demo/event/CardData/CardDataProcessedEvent.java, src/main/java/com/example/demo/event/CardData/CardDataReceivedEvent.java, src/main/java/com/example/demo/event/CardData/service/CardDataChangeDetectionService.java, src/main/java/com/example/demo/event/service/CardDataChangeDetectionService.java
패키지 구조 재편성(event→event.CardData); crawledData→cardBenefitList로 변경; 기존 서비스 제거 및 새 CardDataChangeDetectionService 추가
프로모션 이벤트
src/main/java/com/example/demo/event/Promotion/PromotionEventListener.java, src/main/java/com/example/demo/event/Promotion/PromotionProcessedEvent.java, src/main/java/com/example/demo/event/Promotion/PromotionReceivedEvent.java, src/main/java/com/example/demo/event/Promotion/service/PromotionEventService.java, src/main/java/com/example/demo/grpc/PromotionServiceImpl.java
새로운 프로모션 이벤트 시스템 추가; PromotionEventListener, PromotionEventService, PromotionServiceImpl 구현
gRPC 서비스
src/main/java/com/example/demo/grpc/CardDataServiceImpl.java, src/main/java/com/example/demo/config/GrpcConfig.java
CrawledBenefitList→CardBenefitList로 서명 변경; PromotionServiceImpl 등록; gRPC 포트 설정 업데이트
컨트롤러
src/main/java/com/example/demo/controller/AuthController.java, src/main/java/com/example/demo/controller/CardController.java, src/main/java/com/example/demo/controller/BenefitController.java, src/main/java/com/example/demo/controller/HealthController.java, src/main/java/com/example/demo/controller/OfflineStoreController.java, src/main/java/com/example/demo/controller/OnlineStoreController.java
AuthUtils를 통한 동적 memberId 조회; 하드코딩된 userId(1L) 제거; signup 엔드포인트 제거; HealthController 추가
저장소 서비스
src/main/java/com/example/demo/store/service/KakaoMapService.java, src/main/java/com/example/demo/store/service/OnlineStoreService.java, src/main/java/com/example/demo/store/service/StoreCardMatchingService.java, src/main/java/com/example/demo/store/dto/StoreInfoDTO.java
검색 반경 2000→5000 증가; cardName→name 리매핑; lat/lng 필드 추가; summary 집계 로직 추가
기타 서비스
src/main/java/com/example/demo/expense/service/ExpenseService.java, src/main/java/com/example/demo/expense/dto/PushNotificationRequest.java, src/main/java/com/example/demo/user/service/AutomaticBenefitCalculationService.java
@Transactional 어노테이션 이동; card.getCardName()→card.getName() 업데이트
테스트
src/test/java/com/example/demo/grpc/GRpcTest.java
불필요한 gRPC 테스트 파일 삭제

Sequence Diagram(s)

sequenceDiagram
    participant Crawler as Crawler Server
    participant gRPC as gRPC Service
    participant Event as Event Listener
    participant Service as Change Detection
    participant Repo as Repository
    
    Crawler->>gRPC: saveCardData(CardBenefitList)
    gRPC->>Event: publishEvent(CardDataReceivedEvent)
    Event->>Service: processCardBenefitList(CardBenefitList)
    Service->>Repo: findByCardId(cardId)
    alt Card exists
        Service->>Repo: update Card & Benefits
    else Card not found
        Service->>Repo: create new Card & Benefits
    end
    Service->>gRPC: CardSaveResponse(success)
    gRPC->>Crawler: response
Loading
sequenceDiagram
    participant Client as Client
    participant Ctrl as PromotionController
    participant Service as PromotionService
    participant Auth as AuthUtils
    participant Repo as Repositories
    
    Client->>Ctrl: GET /api/promotions/active
    Ctrl->>Service: getActivePromotions()
    Service->>Auth: getMemberId()
    Auth-->>Service: userId
    Service->>Repo: getUserCards(userId)
    Repo-->>Service: List<Card>
    Service->>Repo: findActivePromotions(cardCompanies, now)
    Repo-->>Service: List<CardPromotion>
    Service-->>Ctrl: List<ActivePromotionResponse>
    Ctrl-->>Client: 200 OK + promotions
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

특별히 주의가 필요한 영역:

  • gRPC 프로토 재구조화 (cardData.proto, cardCompany.proto): 메시지 구조 변경으로 인한 직렬화/역직렬화 호환성 검증 필요
  • 카드 엔티티 리팩토링 (Card.java): CardCompany/CardType 열거형 추가 및 OneToMany 관계 변경으로 인한 ORM 매핑 영향도 검토
  • 이벤트 시스템 재설계 (CardDataChangeDetectionService, 패키지 이동): 기존 로직 제거 및 새 로직 추가로 인한 데이터 일관성 및 성능 영향 검토
  • CardDataChangeDetectionService (새로 추가): 복잡한 엔티티 동기화 로직 포함; 모든 혜택 유형(Discount, Point, Cashback)에 대한 생성/업데이트/삭제 로직 검증
  • 프로모션 기능 (새로 추가): 새로운 도메인 로직; CardCompany 필터링 및 시간 기반 조회 로직 정확성 검증
  • AuthUtils 전환: 모든 컨트롤러에서 하드코딩된 userId 제거; 동적 인증 ID 조회의 완전성 및 일관성 확인

Possibly related PRs

  • PR #5: 동일한 Kakao 인증 코드 수정 (KakaoLoginService, AuthController, RefreshTokenRepository, 관련 인증 클래스) — 직접적인 변경 관계
  • PR #3: 동일한 gRPC 프로토 파일 (cardData.proto, cardCompany.proto) 및 많은 Java 엔티티/서비스/저장소 수정 (Card, Benefit, CardDataServiceImpl, ProtoMapper 추가/리팩토링) — 광범위한 겹침

Poem

🐰 새로운 구조로 카드 혜택을 담고,
프로모션 이벤트가 춤을 추네요.
인증의 흐름도 깔끔해졌고,
gRPC 메시지는 더욱 명확하고,
저희 시스템은 한 단계 진화했답니다! ✨

✨ 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/kakao-login

📜 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 ffb1c03 and b315e5c.

📒 Files selected for processing (63)
  • .github/workflows/deploy.yml (1 hunks)
  • Dockerfile (1 hunks)
  • docker-compose.yml (2 hunks)
  • gRPC/src/main/proto/cardCompany.proto (1 hunks)
  • gRPC/src/main/proto/cardData.proto (2 hunks)
  • gRPC/src/main/proto/promotion.proto (1 hunks)
  • gRPC/src/main/resources/application.yml (1 hunks)
  • src/main/java/com/example/demo/auth/repository/RefreshTokenRepository.java (1 hunks)
  • src/main/java/com/example/demo/auth/service/KakaoLoginService.java (3 hunks)
  • src/main/java/com/example/demo/benefit/application/dto/CashbackBenefitDTO.java (1 hunks)
  • src/main/java/com/example/demo/benefit/application/dto/DiscountBenefitDTO.java (1 hunks)
  • src/main/java/com/example/demo/benefit/application/dto/PointBenefitDTO.java (1 hunks)
  • src/main/java/com/example/demo/benefit/dto/AvailableCardResponse.java (0 hunks)
  • src/main/java/com/example/demo/benefit/dto/BenefitDetailDTO.java (1 hunks)
  • src/main/java/com/example/demo/benefit/dto/CardWithBenefitResponse.java (1 hunks)
  • src/main/java/com/example/demo/benefit/entity/Benefit.java (3 hunks)
  • src/main/java/com/example/demo/benefit/entity/CashbackBenefit.java (1 hunks)
  • src/main/java/com/example/demo/benefit/entity/DiscountBenefit.java (3 hunks)
  • src/main/java/com/example/demo/benefit/entity/PointBenefit.java (1 hunks)
  • src/main/java/com/example/demo/benefit/repository/BenefitRepository.java (2 hunks)
  • src/main/java/com/example/demo/benefit/repository/CashbackBenefitRepository.java (1 hunks)
  • src/main/java/com/example/demo/benefit/repository/PointBenefitRepository.java (1 hunks)
  • src/main/java/com/example/demo/benefit/service/OptimalBenefitService.java (2 hunks)
  • src/main/java/com/example/demo/benefit/util/BenefitConverter.java (2 hunks)
  • src/main/java/com/example/demo/benefit/util/ProtoMapper.java (1 hunks)
  • src/main/java/com/example/demo/card/entity/Card.java (2 hunks)
  • src/main/java/com/example/demo/card/repository/CardRepository.java (1 hunks)
  • src/main/java/com/example/demo/card/service/GetCardService.java (2 hunks)
  • src/main/java/com/example/demo/card/service/UserCardService.java (3 hunks)
  • src/main/java/com/example/demo/config/GrpcConfig.java (2 hunks)
  • src/main/java/com/example/demo/controller/AuthController.java (1 hunks)
  • src/main/java/com/example/demo/controller/BenefitController.java (2 hunks)
  • src/main/java/com/example/demo/controller/CardController.java (4 hunks)
  • src/main/java/com/example/demo/controller/HealthController.java (1 hunks)
  • src/main/java/com/example/demo/controller/OfflineStoreController.java (3 hunks)
  • src/main/java/com/example/demo/controller/OnlineStoreController.java (3 hunks)
  • src/main/java/com/example/demo/controller/PromotionController.java (1 hunks)
  • src/main/java/com/example/demo/event/CardData/CardDataEventListener.java (2 hunks)
  • src/main/java/com/example/demo/event/CardData/CardDataProcessedEvent.java (1 hunks)
  • src/main/java/com/example/demo/event/CardData/CardDataReceivedEvent.java (2 hunks)
  • src/main/java/com/example/demo/event/CardData/service/CardDataChangeDetectionService.java (1 hunks)
  • src/main/java/com/example/demo/event/Promotion/PromotionEventListener.java (1 hunks)
  • src/main/java/com/example/demo/event/Promotion/PromotionProcessedEvent.java (1 hunks)
  • src/main/java/com/example/demo/event/Promotion/PromotionReceivedEvent.java (1 hunks)
  • src/main/java/com/example/demo/event/Promotion/service/PromotionEventService.java (1 hunks)
  • src/main/java/com/example/demo/event/service/CardDataChangeDetectionService.java (0 hunks)
  • src/main/java/com/example/demo/expense/dto/PushNotificationRequest.java (1 hunks)
  • src/main/java/com/example/demo/expense/service/ExpenseService.java (2 hunks)
  • src/main/java/com/example/demo/grpc/CardDataServiceImpl.java (3 hunks)
  • src/main/java/com/example/demo/grpc/PromotionServiceImpl.java (1 hunks)
  • src/main/java/com/example/demo/promotion/dto/ActivePromotionResponse.java (1 hunks)
  • src/main/java/com/example/demo/promotion/entity/CardPromotion.java (1 hunks)
  • src/main/java/com/example/demo/promotion/repository/PromotionRepository.java (1 hunks)
  • src/main/java/com/example/demo/promotion/service/PromotionService.java (1 hunks)
  • src/main/java/com/example/demo/store/dto/StoreInfoDTO.java (1 hunks)
  • src/main/java/com/example/demo/store/service/KakaoMapService.java (1 hunks)
  • src/main/java/com/example/demo/store/service/OnlineStoreService.java (3 hunks)
  • src/main/java/com/example/demo/store/service/StoreCardMatchingService.java (2 hunks)
  • src/main/java/com/example/demo/user/dto/UserCardRegistrationRequest.java (0 hunks)
  • src/main/java/com/example/demo/user/service/AutomaticBenefitCalculationService.java (4 hunks)
  • src/main/java/com/example/demo/user/service/UserCardRegistrationService.java (2 hunks)
  • src/main/resources/application.yml (1 hunks)
  • src/test/java/com/example/demo/grpc/GRpcTest.java (0 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.

@sominyun sominyun closed this Nov 4, 2025
@sominyun sominyun deleted the feat/kakao-login branch November 4, 2025 04:18
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.

3 participants