Skip to content

Conversation

@HongChangMo
Copy link
Owner

@HongChangMo HongChangMo commented Jan 2, 2026

๐Ÿ“Œ Summary

  • Spring Batch + MV ๊ธฐ๋ฐ˜ ์›”๊ฐ„, ์ฃผ๊ฐ„ ์ƒํ’ˆ ์ง‘๊ณ„ ๋ฐ์ดํ„ฐ ์ˆ˜์ง‘
  • Chunk Oriented Processing ๊ธฐ๋ฐ˜ ๋ฐฐ์น˜ ์ฒ˜๋ฆฌ ๊ตฌํ˜„
  • ์ผ๊ฐ„, ์ฃผ๊ฐ„, ์›”๊ฐ„ ๋žญํ‚น ์ œ๊ณต API ๊ตฌํ˜„

๐Ÿ’ฌ Review Points

์ปค์Šคํ…€ ItemReader๊ฐ€ ์•„๋‹Œ RepositoryItemReader๋ฅผ ์‚ฌ์šฉ

์ฒ˜์Œ ๊ตฌํ˜„ํ• ๋•Œ, ์ปค์Šคํ…€ ItemReader๋ฅผ ํ†ตํ•ด์„œ ๋งŒ์•ฝ ์ข‹์•„์š” ๋ฐ์ดํ„ฐ๊ฐ€ 100๋งŒ ๊ฑด์ด๋ผ๋ฉด,
100๋งŒ๊ฑด์„ ๋ชจ๋‘ ์ฝ์–ด์™€ ์ฒ˜๋ฆฌ๋ฅผ ํ•œ๋‹ค๋ฉด ๋ฐ์ดํ„ฐ ์–‘์ด ๋” ๋งŽ์•„์ง€๋ฉด OOM ์ด์Šˆ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™์•„,
Spring Batch ์—์„œ ์ง€์›ํ•˜๋Š” RepositoryItemReader๋ฅผ ์‚ฌ์šฉํ•ด์„œ chunk size์™€ ๋™์ผํ•œ
ํŽ˜์ด์ง• ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋„๋ก ๊ตฌํ˜„ํ•˜์˜€์Šต๋‹ˆ๋‹ค.
๊ถ๊ธˆํ•œ ์ ์€ RepositoryItemReader ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒฝ์šฐ๋„ ์‹ค๋ฌด์—์„œ ๋งŽ์€์ง€ ๊ถ๊ธˆํ•˜๊ณ ,
์ •๋‹ต์€ ์—†๋‹ค๊ณ  ํ•˜์…จ์ง€๋งŒ, ๊ตฌํ˜„ํ•œ ๋ฐฉ์‹์ด ์˜ฌ๋ฐ”๋ฅธ ๋ฐฉํ–ฅ์„ฑ์ด ๋งž๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.


MV๋ฅผ ํ™œ์šฉํ•œ ์ฃผ๊ฐ„ ์›”๊ฐ„ ๋žญํ‚น ๊ฐ€์ค‘์น˜ ์ ์šฉ ์งˆ๋ฌธ

Redis์˜ ZSET์œผ๋กœ ์ผ๊ฐ„ ๋žญํ‚น์„ ๊ตฌํ˜„ํ• ๋•Œ์—๋Š” ZSET score ๊ธฐ๋ฐ˜ top ๋žญํ‚น์„ ๋ฝ‘๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ ๊ตฌํ˜„ํ–ˆ์—ˆ๋Š”๋ฐ, ์ด๋ฒˆ ๊ณผ์ œ๋Š” Spring Batch + MV ๋ฅผ ํ™œ์šฉํ•ด ์ฃผ๊ฐ„, ์›”๊ฐ„ ์ง‘๊ณ„ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ง‘ํ•˜๊ณ , commerce-api์—์„œ top 100 ๋žญํ‚น์„ ์กฐํšŒํ•˜๋Š” ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•ด์•ผ ํ•˜๋Š”๋ฐ,

์ œ๊ฐ€ ๊ถ๊ธˆํ•œ ์ ์€ MV์— ์ €์žฅ๋˜๋Š” ๋ฐ์ดํ„ฐ๋Š” ์ง‘๊ณ„์— ๋Œ€ํ•œ ๋‚ด์šฉ๋ฟ์ด๋ผ, top N ์„ ๋ฝ‘์•„์•ผํ•˜๋Š” ๊ฒฝ์šฐ ๋ณ„๋„์˜ score ๋ฅผ ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„ํ•˜๋Š”๊ฒŒ ์ข‹์„์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.

์ €๋Š” ์ด๋ฒˆ ๊ณผ์ œ์—์„œ api๋ฅผ ์กฐํšŒํ•˜๋Š” commerce-api ์— ์ฝ๊ธฐ ์ „์šฉ ์—”ํ‹ฐํ‹ฐ๋ฅผ ๋งŒ๋“ค๊ณ  MV์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ db์—์„œ ์กฐํšŒํ•  ๋•Œ score๋ฅผ ๊ณ„์‚ฐํ•ด์„œ ์กฐํšŒํ•˜๋„๋ก ์ฒ˜๋ฆฌํ•˜์˜€์Šต๋‹ˆ๋‹ค.

์ œ๊ฐ€ ์ƒ๊ฐํ•œ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์œผ๋กœ๋Š” ๋‚ด๋ถ€์— score๋ฅผ ๊ณ„์‚ฐํ•˜๋Š” ๋„๋ฉ”์ธ ๋กœ์ง์„ ํ†ตํ•ด ์ข…ํ•ฉ ์ ์ˆ˜๋ฅผ ๊ณ„์‚ฐํ•˜๋„๋ก ํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ์žˆ์„ ๊ฒƒ ๊ฐ™์•„๋ณด์ด๋Š”๋ฐ, commerce-collector ์ง‘๊ณ„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ถ€๋ถ„์—์„œ ๋ฏธ๋ฆฌ score๋ฅผ ๊ณ„์‚ฐํ•˜๋Š” ๊ฒƒ์ด ๋” ์ข‹์€ ๋ฐฉ๋ฒ•์ธ์ง€, ์•„๋‹ˆ๋ฉด ์ œ๊ฐ€ ๊ตฌํ˜„ํ•œ ๋ถ€๋ถ„๋„ ๊ดœ์ฐฎ์€ ๋ฐฉ๋ฒ•์ธ์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.

์Šค์ฝ”์–ด ๊ณ„์‚ฐ์„ repository์—์„œ ์ฒ˜๋ฆฌ

@Query("""
        SELECT w FROM ProductMetricsWeekly w
        WHERE w.year = :year AND w.week = :week
        ORDER BY (w.totalLikeCount * 0.2 + w.totalViewCount * 0.1 + w.totalOrderCount * 0.6) DESC
        """)
    List<ProductMetricsWeekly> findByYearAndWeekOrderByCompositeScoreDesc(
            @Param("year") int year,
            @Param("week") int week,
            Pageable pageable
    );

๋„๋ฉ”์ธ ๋กœ์ง์—์„œ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒฝ์šฐ

/**
     * ์ข…ํ•ฉ ์ ์ˆ˜ ๊ณ„์‚ฐ (๊ฐ€์ค‘์น˜ ์ ์šฉ)
     * Score = (like * 0.2) + (view * 0.1) + (order * 0.6)
     */
    public double calculateCompositeScore() {
        return (totalLikeCount * 0.2) + (totalViewCount * 0.1) + (totalOrderCount * 0.6);
    }

โœ… Checklist

๐Ÿงฑ Spring Batch

  • Spring Batch Job ์„ ์ž‘์„ฑํ•˜๊ณ , ํŒŒ๋ผ๋ฏธํ„ฐ ๊ธฐ๋ฐ˜์œผ๋กœ ๋™์ž‘์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.
  • Chunk Oriented Processing (Reader/Processor/Writer or Tasklet) ๊ธฐ๋ฐ˜์˜ ๋ฐฐ์น˜ ์ฒ˜๋ฆฌ๋ฅผ ๊ตฌํ˜„ํ–ˆ๋‹ค.
  • ์ง‘๊ณ„ ๊ฒฐ๊ณผ๋ฅผ ์ €์žฅํ•  Materialized View ์˜ ๊ตฌ์กฐ๋ฅผ ์„ค๊ณ„ํ•˜๊ณ  ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ ์žฌํ–ˆ๋‹ค.

๐Ÿงฉ Ranking API

  • API ๊ฐ€ ์ผ๊ฐ„, ์ฃผ๊ฐ„, ์›”๊ฐ„ ๋žญํ‚น์„ ์ œ๊ณตํ•˜๋ฉฐ ์กฐํšŒํ•ด์•ผ ํ•˜๋Š” ํ˜•ํƒœ์— ๋”ฐ๋ผ ์ ์ ˆํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋žญํ‚น์„ ์ œ๊ณตํ•œ๋‹ค.

- Chunk Oriented Processing ๊ธฐ๋ฐ˜ ์ฃผ๊ฐ„ ๋žญํ‚น ๋ฐฐ์น˜ ์ฒ˜๋ฆฌ ๊ตฌํ˜„
- ์ƒํ’ˆ ์ง‘๊ณ„ ๊ฒฐ๊ณผ MV ํ™œ์šฉ
- Chunk Oriented Processing ๊ธฐ๋ฐ˜ ์›”๊ฐ„ ๋žญํ‚น ๋ฐฐ์น˜ ์ฒ˜๋ฆฌ ๊ตฌํ˜„
- ์ƒํ’ˆ ์ง‘๊ณ„ ๊ฒฐ๊ณผ MV ํ™œ์šฉ
- ์˜ค๋ž˜๋œ ์ผ์ž๋ณ„ ๋ฐ์ดํ„ฐ ์ •๋ฆฌ 10์ผ ๊ธฐ์ค€ -> 30์ผ ์ˆ˜์ •
- PeriodType๋ณ„ ์ผ๊ฐ„, ์ฃผ๊ฐ„, ์›”๊ฐ„ ๋žญํ‚น ์ œ๊ณต
- ์ผ๊ฐ„์€ Redis ZSET ์œผ๋กœ ์ œ๊ณต
- ์ฃผ๊ฐ„, ์›”๊ฐ„ MV๋ฅผ ํ™œ์šฉํ•œ ๋žญํ‚น ์ œ๊ณต
- ์˜คํƒ€ ์ˆ˜์ •
- NPE ๋ฐฉ์ง€ ์ฝ”๋“œ ์ ์šฉ
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.

2 participants