Skip to content

fix: 랭킹 배너 winner 선별 및 폰트 스타일 정리#417

Merged
KoSeonJe merged 1 commit into
developfrom
fix/DDING-000-ranking-banner-winner-filter
Jul 2, 2026
Merged

fix: 랭킹 배너 winner 선별 및 폰트 스타일 정리#417
KoSeonJe merged 1 commit into
developfrom
fix/DDING-000-ranking-banner-winner-filter

Conversation

@KoSeonJe

@KoSeonJe KoSeonJe commented Jul 2, 2026

Copy link
Copy Markdown
Collaborator

🚀 작업 내용

메인 랭킹 배너에서 발견된 두 가지 문제를 다룹니다.

1. 모든 동아리가 배너로 생성되던 문제 (핵심 수정)
해당 월에 피드가 하나도 없으면 전 동아리의 점수가 0이 되고, 공동 순위 로직상 전원이 1위로 집계되어 모든 동아리가 배너로 생성되었습니다. 배너 생성 지점에서 점수가 0보다 큰 동아리만 winner로 선별하도록 수정했습니다. 진짜 동점(점수 > 0)은 기존대로 모두 배너로 노출되고, 선별 결과가 비어 있으면 기존 배너를 삭제하지 않고 보존한 채 종료합니다. 스케줄러 경로와 재생성 API 경로가 모두 이 지점으로 수렴하므로 한 곳 수정으로 양쪽이 함께 반영됩니다.

2. 배너 제목 렌더링 폰트 경로 정리
로드해 등록한 Pretendard 인스턴스에 스타일을 다시 지정(PLAIN)하고 letter-spacing을 위해 속성 기반 레이아웃으로 재구성하던 과정을 제거하고, 등록된 폰트 인스턴스를 그대로 사용하도록 단순화했습니다.

🤔 고민했던 내용

한글 제목 깨짐(tofu)이 이 폰트 경로 때문이라는 가설을 세우고, EB 운영과 동일 계열인 헤드리스 Linux 컨테이너(eclipse-temurin:21, amazoncorretto:21)에서 변경 전/후 코드를 직접 렌더링해 대조했습니다. 결과적으로 두 환경 모두에서 변경 전·후 코드가 한글을 정상 렌더링했고 tofu는 재현되지 않았습니다. 따라서 이 폰트 변경은 tofu의 확정된 원인 수정이라기보다, 스타일 불일치와 불필요한 재구성이라는 취약한 경로를 제거하는 방어적 정리로 보는 것이 정확합니다. 현재 노출되는 깨진 배너는 과거 생성된 정적 이미지가 남아 있는 경우일 가능성이 있어, 재생성 API 호출로 교체 여부를 별도 확인할 필요가 있습니다.

winner 선별 로직은 점수가 0인 달 전체 제외 / 단독 1위 / 점수 양수 공동 1위 / 점수 0 혼재 케이스를 단위 테스트로 검증했고, 배너 렌더링은 폰트의 한글 글리프 보유 여부와 PNG 생성을 검증했습니다.

💬 리뷰 중점사항

  • winner 선별 결과가 비었을 때 기존 배너를 보존하는 정책이 의도와 맞는지
  • letter-spacing(코스메틱) 제거로 인한 시각적 변화 허용 여부
  • 폰트 변경을 함께 포함할지, winner 선별만 우선 반영할지에 대한 의견

Summary by CodeRabbit

  • Bug Fixes

    • Ranking banners now only generate for winners with positive scores, preventing unnecessary banner creation.
    • Improved banner text font rendering with enhanced support for Korean characters.
  • Tests

    • Added test coverage for ranking banner service score filtering and font display validation.

피드가 없어 전 동아리 점수가 0인 달에도 공동 1위로 모든 동아리가
배너로 생성되던 문제를 수정한다. createRankingBanners에서 score>0
동아리만 winner로 선별하고, winner가 없으면 기존 배너를 삭제하지 않고
보존한 뒤 종료한다. 스케줄러·재생성 경로 모두 이 메서드로 수렴한다.

배너 렌더링에서 deriveFont(PLAIN)의 스타일 불일치와 TextAttribute.TRACKING
기반 재탐색을 제거하고 로드한 폰트 인스턴스를 그대로 사용하도록 정리한다.
헤드리스 Linux(temurin:21, amazoncorretto:21) 재현 결과 기존/변경 코드 모두
한글이 정상 렌더되어 tofu는 재현되지 않았으며, 본 변경은 취약한 폰트 경로를
제거하는 방어적 정리에 해당한다.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@coderabbitai

coderabbitai Bot commented Jul 2, 2026

Copy link
Copy Markdown

Review Change Stack

Caution

Review failed

The pull request is closed.

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 19feb984-8bbc-489e-9e22-2e8a71e11d53

📥 Commits

Reviewing files that changed from the base of the PR and between ac44276 and 5dba950.

📒 Files selected for processing (4)
  • src/main/java/ddingdong/ddingdongBE/domain/banner/service/BannerImageGenerator.java
  • src/main/java/ddingdong/ddingdongBE/domain/banner/service/FacadeRankingBannerServiceImpl.java
  • src/test/java/ddingdong/ddingdongBE/domain/banner/service/BannerImageGeneratorTest.java
  • src/test/java/ddingdong/ddingdongBE/domain/banner/service/FacadeRankingBannerServiceImplTest.java

📝 Walkthrough

Walkthrough

This PR simplifies font styling logic in BannerImageGenerator by removing letter-spacing/tracking configuration, and adds score-based filtering to FacadeRankingBannerServiceImpl so only positive-score rankings produce banners with early return when none qualify. Corresponding unit tests are added for both changes.

Changes

Banner generation fixes

Layer / File(s) Summary
Simplified font styling in BannerImageGenerator
src/main/java/.../BannerImageGenerator.java
createStyledFont now derives fonts by size only from the loaded base font, removing TextAttribute/tracking logic; drawWebTexts and drawMobileTexts updated accordingly; unused imports removed.
Font glyph validation tests
src/test/java/.../BannerImageGeneratorTest.java
Adds headless AWT setup and reflective tests asserting Korean title/subtitle fonts can display all glyphs (canDisplayUpTo == -1).
Score-based ranking banner filtering
src/main/java/.../FacadeRankingBannerServiceImpl.java
createRankingBanners filters rankings to score > 0, returns early when no winners exist, and iterates only the filtered winners for banner creation.
Ranking banner filtering tests
src/test/java/.../FacadeRankingBannerServiceImplTest.java
New test suite covers no-banner creation for all-zero scores, single/tied winner banner creation, and exclusion of zero-score clubs.

Estimated code review effort: 2 (Simple) | ~15 minutes

Sequence Diagram(s)

sequenceDiagram
  participant Scheduler
  participant FacadeRankingBannerServiceImpl
  participant BannerImageGenerator
  participant BannerRepository
  Scheduler->>FacadeRankingBannerServiceImpl: createRankingBanners(firstPlaceRankings)
  FacadeRankingBannerServiceImpl->>FacadeRankingBannerServiceImpl: filter winners by score > 0
  alt no winners
    FacadeRankingBannerServiceImpl-->>Scheduler: return early
  else winners exist
    FacadeRankingBannerServiceImpl->>BannerRepository: deleteExistingRankingBanners()
    loop each winner
      FacadeRankingBannerServiceImpl->>BannerImageGenerator: generate banner image
      FacadeRankingBannerServiceImpl->>BannerRepository: save banner
    end
  end
Loading

Possibly related PRs

  • COW-dev/ddingdong-be#401: Directly modifies the same FacadeRankingBannerServiceImpl#createRankingBanners and BannerImageGenerator font styling logic touched here.
  • COW-dev/ddingdong-be#412: Modifies the same BannerImageGenerator font-selection logic and related test coverage.

Suggested labels: 💯테스트, 🎯리팩토링

Suggested reviewers: wonjunYou, 5uhwann, Seooooo24

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch fix/DDING-000-ranking-banner-winner-filter

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.

@KoSeonJe KoSeonJe merged commit aba8c56 into develop Jul 2, 2026
1 of 2 checks passed
@KoSeonJe KoSeonJe deleted the fix/DDING-000-ranking-banner-winner-filter branch July 2, 2026 14:01
This was referenced Jul 2, 2026
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