Skip to content

refactor: 홈 화면 통합 API 더미 데이터를 실제 서비스 호출로 변경#99

Merged
neibler merged 1 commit intodevelopfrom
feature/97
Feb 8, 2026
Merged

refactor: 홈 화면 통합 API 더미 데이터를 실제 서비스 호출로 변경#99
neibler merged 1 commit intodevelopfrom
feature/97

Conversation

@neibler
Copy link
Copy Markdown
Contributor

@neibler neibler commented Feb 8, 2026

🔍️ 작업 내용

파일: HomeController.java
변경 내용: @AuthenticationPrincipal Long userId
추가
(로그인/비로그인 분기), 반환 타입
ResponseEntity →
DataResponse로 통일, @tag에 토큰 선택 설명
추가
────────────────────────────────────────
파일: HomeService.java
변경 내용: 더미 데이터 제거 →
AdvertisementService,
ProductService, BrandService, CartService
4개 서비스 호출하여 실제 데이터 조합
────────────────────────────────────────
파일: HomeResDto.java
변경 내용: 문자열 필드 → 실제 응답 DTO 타입으로
변경
(AdvertisementResponse,
RecommendedProductResponse,
BrandRecommendResponse, Long cartCount)
────────────────────────────────────────
파일: HomeConverter.java
변경 내용: 기존 문자열 변환 로직 → 실제 DTO 조합
변환
로직으로 재작성
요약

GET /api/home 하나로 홈 화면에 필요한 광고 5개 +
추천 상품 + 추천 브랜드 3개 + 장바구니 개수를 한
번에 반환하도록 리팩토링

Summary by CodeRabbit

릴리스 노트

  • New Features
    • 홈 화면이 로그인 시 개인화 데이터를 제공하도록 개선되었습니다.
    • 할인 광고 배너(5개), 추천 상품, 추천 브랜드(3개 브랜드 + 각 6개 상품)가 통합되어 표시됩니다.
    • 로그인 사용자는 홈 화면에서 장바구니 담긴 개수를 확인할 수 있습니다.

@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai bot commented Feb 8, 2026

Walkthrough

홈 화면 API 엔드포인트를 인증된 사용자 컨텍스트 지원으로 개선했습니다. 컨트롤러가 인증 주체에서 사용자 ID를 받아 서비스로 전달하고, 서비스는 광고, 추천 상품, 추천 브랜드, 장바구니 개수를 각 서비스에서 동적으로 조회하여 반환합니다.

Changes

Cohort / File(s) Summary
Controller 계층
src/main/java/com/ongil/backend/domain/home/controller/HomeController.java
메서드 시그니처 변경: @AuthenticationPrincipal Long userId 파라미터 추가, 반환 타입을 ResponseEntity<DataResponse<HomeResDto>>에서 DataResponse<HomeResDto>로 변경. 서비스 호출 시 userId 전달. Swagger 문서 확장.
DTO 응답 계층
src/main/java/com/ongil/backend/domain/home/dto/response/HomeResDto.java
필드 구조 변경: 기존 bannerUrls, latestMagazineTitle 제거. 신규 필드 추가: List<AdvertisementResponse> advertisements, List<RecommendedProductResponse> recommendedProducts, List<BrandRecommendResponse> recommendBrands, Long cartCount. 클래스 레벨 @Schema 추가.
Converter 계층
src/main/java/com/ongil/backend/domain/home/converter/HomeConverter.java
메서드 시그니처 변경: 파라미터를 (List<String> banners, List<String> products, String magazineTitle)에서 (List<AdvertisementResponse> advertisements, List<RecommendedProductResponse> recommendedProducts, List<BrandRecommendResponse> recommendBrands, Long cartCount)로 변경. 빌더 호출 대응 수정. 신규 import 추가.
Service 계층
src/main/java/com/ongil/backend/domain/home/service/HomeService.java
메서드 시그니처: getHomeData()getHomeData(Long userId). 하드코딩된 데이터 대신 AdvertisementService, ProductService, BrandService, CartService로부터 동적 데이터 조회. 조건부 cartCount 계산 추가. 트랜잭션 @Transactional(readOnly = true) 적용.

Sequence Diagram

sequenceDiagram
    actor Client
    participant Controller as HomeController
    participant Service as HomeService
    participant AdvertSvc as AdvertisementService
    participant ProductSvc as ProductService
    participant BrandSvc as BrandService
    participant CartSvc as CartService

    Client->>Controller: GET /home<br/>(`@AuthenticationPrincipal` userId)
    Controller->>Service: getHomeData(userId)
    
    Service->>AdvertSvc: getAdvertisements()
    AdvertSvc-->>Service: List<AdvertisementResponse>
    
    Service->>ProductSvc: getRecommendedProducts(RECOMMENDED_PRODUCTS_SIZE)
    ProductSvc-->>Service: List<RecommendedProductResponse>
    
    Service->>BrandSvc: getRecommendBrands()
    BrandSvc-->>Service: List<BrandRecommendResponse>
    
    alt userId != null
        Service->>CartSvc: getCartCount(userId)
        CartSvc-->>Service: Long cartCount
    else userId == null
        Service-->>Service: cartCount = null
    end
    
    Service->>Service: HomeConverter.toHomeResDto(advertisements,<br/>recommendedProducts, recommendBrands, cartCount)
    Service-->>Controller: HomeResDto
    Controller-->>Client: DataResponse<HomeResDto>
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Possibly related PRs

  • #51: HomeService에서 AdvertisementService 호출 및 AdvertisementResponse 사용으로 직접 의존
  • #39: HomeResDto의 cartCount 필드와 HomeService의 CartService.getCartCount() 호출로 직접 의존
  • #76: HomeResDto에서 BrandRecommendResponse 타입 필드 추가 및 BrandService 호출로 직접 의존

Suggested labels

✨ Feature

🚥 Pre-merge checks | ✅ 2 | ❌ 1
❌ Failed checks (1 warning)
Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (2 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed PR 제목이 핵심 변경 사항을 명확하고 정확하게 요약합니다. 더미 데이터를 실제 서비스 호출로 변경하는 리팩토링의 주요 목적을 명확히 전달합니다.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ 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 feature/97

No actionable comments were generated in the recent review. 🎉

🧹 Recent nitpick comments
src/main/java/com/ongil/backend/domain/home/dto/response/HomeResDto.java (1)

22-23: 필드명 일관성: recommendBrandsrecommendedBrands

recommendedProductsrecommended를 사용하고, recommendBrandsrecommend만 사용하고 있어 네이밍이 불일치합니다. 프론트엔드와의 API 계약 측면에서 혼란을 줄 수 있으므로, recommendedBrands로 통일하는 것을 권장합니다.

♻️ 네이밍 통일 제안
-        `@Schema`(description = "추천 브랜드 목록 (3개 브랜드 + 각 6개 상품)")
-        List<BrandRecommendResponse> recommendBrands,
+        `@Schema`(description = "추천 브랜드 목록 (3개 브랜드 + 각 6개 상품)")
+        List<BrandRecommendResponse> recommendedBrands,

As per coding guidelines, **/dto/**/*.java: "필드명 일관성 - camelCase 준수, 명확한 네이밍".

src/main/java/com/ongil/backend/domain/home/converter/HomeConverter.java (1)

15-27: Converter가 단순 빌더 위임만 수행

현재 HomeConverter.toHomeResDto는 파라미터를 그대로 빌더에 전달하는 것 외에 별도 변환 로직이 없습니다. record의 빌더를 직접 호출하는 것과 동일하므로, 향후 변환 로직이 추가될 가능성이 낮다면 서비스에서 직접 빌더를 호출하는 것도 고려할 수 있습니다.

현 시점에서는 컨버터 레이어를 유지하는 것 자체가 문제는 아니며, 프로젝트 컨벤션이라면 그대로 두셔도 됩니다.

src/main/java/com/ongil/backend/domain/home/service/HomeService.java (2)

32-39: 독립적인 4개 서비스 호출의 순차 실행 — 지연 시간 누적 가능

advertisementService, productService, brandService, cartService 호출은 서로 의존성이 없으므로, 순차 실행 시 각 호출의 지연 시간이 합산됩니다. 홈 화면은 사용자가 가장 먼저 접하는 화면이므로 응답 속도가 중요합니다.

CompletableFuture 등을 활용한 병렬 호출을 고려해 보세요.


32-39: 개별 서비스 실패 시 전체 홈 화면 장애 전파 우려

4개 서비스 중 하나라도 예외를 던지면 홈 화면 전체가 실패합니다. 예를 들어 광고 서비스가 일시적으로 불안정할 때 추천 상품이나 브랜드까지 노출되지 않는 것은 과도한 영향입니다.

각 서비스 호출을 try-catch로 감싸고, 실패 시 빈 리스트 또는 기본값으로 대체하는 부분 실패 허용(graceful degradation) 전략을 검토해 보세요.

🛡️ 부분 실패 허용 예시
 public HomeResDto getHomeData(Long userId) {
-    List<AdvertisementResponse> advertisements = advertisementService.getHomeAdvertisements();
-    List<RecommendedProductResponse> recommendedProducts = productService.getRecommendedProducts(userId, RECOMMENDED_PRODUCTS_SIZE);
-    List<BrandRecommendResponse> recommendBrands = brandService.getRecommendBrands();
-    Long cartCount = (userId != null) ? cartService.getCartCount(userId) : null;
+    List<AdvertisementResponse> advertisements = fetchSafely(() -> advertisementService.getHomeAdvertisements(), List.of());
+    List<RecommendedProductResponse> recommendedProducts = fetchSafely(() -> productService.getRecommendedProducts(userId, RECOMMENDED_PRODUCTS_SIZE), List.of());
+    List<BrandRecommendResponse> recommendBrands = fetchSafely(() -> brandService.getRecommendBrands(), List.of());
+    Long cartCount = (userId != null) ? fetchSafely(() -> cartService.getCartCount(userId), null) : null;

     return HomeConverter.toHomeResDto(advertisements, recommendedProducts, recommendBrands, cartCount);
 }
+
+private <T> T fetchSafely(Supplier<T> supplier, T fallback) {
+    try {
+        return supplier.get();
+    } catch (Exception e) {
+        log.warn("홈 데이터 일부 조회 실패, fallback 적용", e);
+        return fallback;
+    }
+}
src/main/java/com/ongil/backend/domain/home/controller/HomeController.java (1)

35-39: 반환 타입이 다른 컨트롤러와 불일치

UserController 등 기존 컨트롤러는 ResponseEntity<DataResponse<...>>를 반환하지만, 이 컨트롤러는 DataResponse<HomeResDto>를 직접 반환합니다. PR 목표에 "DataResponse로 통일"이라고 명시되어 있으므로 의도된 변경인지 확인합니다. 프로젝트 전체적으로 통일할 계획이라면 괜찮지만, 이 PR만 다른 패턴을 사용하면 일관성이 깨집니다.


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.

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.

1 participant