Skip to content

Conversation

@Dimo-2562
Copy link
Contributor

❤️ 기능 설명

TechBlog의 logoUrl을 Post 엔티티로 반정규화

Post 조회 시 매번 TechBlog를 조인하지 않고 logoUrl을 바로 가져올 수 있도록 성능 개선을 진행했습니다.

주요 변경사항

  1. Post 엔티티에 logoUrl 필드 추가

    • TechBlog의 logoUrl을 Post 테이블로 반정규화
    • @Column(length = 500) 추가
  2. RSS 크롤링 로직 수정

    • RssFeedItem에 logoUrl 필드 추가
    • RssFeedReader에서 TechBlog의 logoUrl을 포함하여 크롤링
    • PostBatchWriter의 JDBC Bulk Insert 쿼리에 view_count, logoUrl 컬럼 추가
  3. Elasticsearch 검색 API 수정

    • PostDocument에 logoUrl 필드 추가
    • SearchServiceImpl.mapToSearchResult()에서 logoUrl 매핑 추가
    • 검색 결과 응답에 logoUrl 포함
  4. 데이터 마이그레이션 완료

    • 기존 Post 레코드에 TechBlog의 logoUrl 업데이트 (MySQL)
    • Elasticsearch 인덱스에 logoUrl 필드 추가 및 업데이트

성능 개선 효과

  • Post 조회 시 N+1 문제 없이 logoUrl을 바로 반환 가능
  • 검색 API 응답에 logoUrl이 포함되어 프론트엔드에서 추가 요청 불필요

검색 시 logoUrl 반환 확인
image

반정규화

EXPLAIN ANALYZE
SELECT id, title, company, url, published_at
FROM posts
ORDER BY id DESC
LIMIT 30;
-> Limit: 30 row(s)  (cost=155 rows=30) (actual time=0.0745..0.142 rows=30 loops=1)
    -> Index scan on posts using PRIMARY (reverse)  (cost=155 rows=30) (actual time=0.0726..0.137 rows=30 loops=1)

정규화 (조인)
EXPLAIN ANALYZE
SELECT p.id, p.title, t.company_name, p.url, t.logo_url, p.published_at
FROM posts p
         JOIN tech_blogs t ON p.tech_blog_id = t.id
ORDER BY p.id DESC
LIMIT 30;
-> Limit: 30 row(s)  (actual time=2.34..2.34 rows=30 loops=1)
    -> Sort: p.id DESC, limit input to 30 row(s) per chunk  (actual time=2.34..2.34 rows=30 loops=1)
        -> Stream results  (cost=635 rows=602) (actual time=0.0672..2.06 rows=684 loops=1)
            -> Nested loop inner join  (cost=635 rows=602) (actual time=0.0629..1.52 rows=684 loops=1)
                -> Table scan on t  (cost=3.35 rows=31) (actual time=0.0264..0.0407 rows=27 loops=1)
                -> Index lookup on p using FKqirwl88w40kr6wpea76jf53i3 (tech_blog_id=t.id)  (cost=18.5 rows=19.4) (actual time=0.00871..0.0527 rows=25.3 loops=27)

연결된 issue

close #123


✅ 체크리스트

  • PR 제목 규칙 잘 지켰는가?
  • 추가/수정사항을 설명하였는가?
  • 테스트 결과 사진을 넣었는가?
  • 이슈넘버를 적었는가?

@Dimo-2562 Dimo-2562 requested a review from Joon9750 December 30, 2025 19:17
@Dimo-2562 Dimo-2562 self-assigned this Dec 30, 2025
@Dimo-2562 Dimo-2562 added 🌟 REFACTOR 리팩터링 (기능 변화 X) 📝 domain:post 게시글 관련 labels Dec 30, 2025
@Dimo-2562 Dimo-2562 merged commit 99007a5 into develop Dec 30, 2025
1 check passed
@Dimo-2562 Dimo-2562 deleted the refactor/#123 branch December 30, 2025 19:19
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

📝 domain:post 게시글 관련 🌟 REFACTOR 리팩터링 (기능 변화 X)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[REFACTOR] Post와 TechBlog 엔티티간 logoUrl 반정규화 진행

2 participants