fix: 랭킹 배너 winner 선별 및 폰트 스타일 정리#417
Conversation
피드가 없어 전 동아리 점수가 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>
|
Caution Review failedThe pull request is closed. ℹ️ Recent review info⚙️ Run configurationConfiguration used: defaults Review profile: CHILL Plan: Pro Run ID: 📒 Files selected for processing (4)
📝 WalkthroughWalkthroughThis 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. ChangesBanner generation fixes
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
Possibly related PRs
Suggested labels: Suggested reviewers: ✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
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. Comment |
🚀 작업 내용
메인 랭킹 배너에서 발견된 두 가지 문제를 다룹니다.
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 생성을 검증했습니다.
💬 리뷰 중점사항
Summary by CodeRabbit
Bug Fixes
Tests