HOTSPOT ์๋น์ค์ ๋ฐฐ์น ์ ์ฉ ์๋ฒ์ ๋๋ค.
- ์คํ ๋ฐฉ์: CLI ํ๋ผ๋ฏธํฐ ๊ธฐ๋ฐ (
BatchJobRunner) - ์๊ฐ๋ ๊ธฐ์ค: KST (
Asia/Seoul) - ๊ณตํต ๊ธฐ๋ฅ:
- Job ํ๋ผ๋ฏธํฐ ๊ฒ์ฆ
- Job ๊ฒฐ๊ณผ ๋ก๊น
- Chunk ์งํ ๋ก๊ทธ
familyRemoveJob
- ๋ชฉ์ :
family_remove_schedule์ ๋๋ ๊ฑด(SCHEDULED) ์ฒ๋ฆฌ - ๋ฐฉ์: Tasklet
- ํ์ฌ ์ํ: ๊ตฌํ ์งํ ์๋ฃ(์ญ์ /์ง๊ณ/์ํ ๊ฐฑ์ )
usageAggregationJob
- ๋ชฉ์ : ์ฃผ๊ฐ ๋ฆฌํฌํธ seed ์์ฑ + ์ฌ์ฉ๋ ์งํ ์ง๊ณ
- ๋ฐฉ์: Job1 (Chunk - 2step ๊ตฌ์กฐ) + Job2 (Chunk - 1step ๊ตฌ์กฐ)
- ํ์ฌ ์ํ: ๊ตฌํ ์งํ ์๋ฃ
cryptoKeyRotationJob
- ๋ชฉ์ : DEK ๋กํ ์ด์ (ํฅํ activate/reencrypt/retire ๋ถ๋ฆฌ ์์ )
- ๋ฐฉ์: Chunk skeleton
- ํ์ฌ ์ํ: skeleton
redisDualWriteJob(์์ )
- ๋ชฉ์ : Redis ์ด์คํ/๋๊ธฐํ
- ๋ฐฉ์: ๋ฏธ์
- ํ์ฌ ์ํ: ๋ฏธ๊ตฌํ
์์:
./gradlew bootRun --args="--job.name=familyRemoveJob --yearMonth=202604"์ง์ ํ๋ผ๋ฏธํฐ:
job.name(ํ์)targetDate(yyyy-MM-dd, ์ ํ)yearMonth(yyyyMM, ์ ํ)
family_remove_schedule์์SCHEDULED && schedule_date <= ์คํ์ผ์กฐํ- ๋์
family_sub์ ๊ฑฐ - ๋์ ํ์ ์
policy_sub,blocked_service_sub๋นํ์ฑํ(is_active=false) family.family_num,family.family_data_amount์ฌ๊ณ์ฐ- ๋จ์
family_sub.data_limit๊ฐฑ์ - ์ฑ๊ณต ์
COMPLETED, ์คํจ ์FAILED
ํ์ ๋์์์ ์ผ์ฃผ์ผ ๊ฐ ์ฌ์ฉ๋์ ์์งํ๊ณ ์งํ๋ฅผ ๊ณ์ฐํ๊ณ ์ด๋ฅผ ๋ถ์ํด ์ฃผ๊ฐ AI ๋ถ์ ๋ฆฌํฌํธ ๋ฅผ ์์ฑํฉ๋๋ค.
usageAggregationJob
- ๋ฆฌํฌํธ ๋์ seed ์์ฑ, Redis ์ฌ์ฉ๋ ์ง๊ณ, ์ ์ฃผ ์ค๋ ์ท ๋น๊ต, ์ ์ ๋ฐ ํ๊ทธ ๊ณ์ฐ
- ์ํ ์ ์ด:
PENDING -> AGGREGATED
llmFeedbackJob
-
์ง๊ณ ์๋ฃ ๋ฆฌํฌํธ ์กฐํ, ํ๋กฌํํธ ์์ฑ, LLM ํธ์ถ, AI ํผ๋๋ฐฑ ์ ์ฅ
-
์ํ ์ ์ด:
AGGREGATED -> COMPLETED -
์ค์ผ์ค ์คํ:
WeeklyReportJobScheduler -
์คํ ์์:
usageAggregationJob์ ํ ์คํ ํ ์ฑ๊ณต ์llmFeedbackJob์คํ
- ์ง๊ณ์ LLM ํธ์ถ์ ์ฅ์ ๋ฒ์ ๋ถ๋ฆฌ
- Step1 ๊ธฐ๋ฐ seed ์ ์ฌ์ ๋ฉฑ๋ฑ์ฑ ํ๋ณด
MOD(weekly_report_id, gridSize)๊ธฐ๋ฐ ํํฐ์ ๋ ๊ตฌ์กฐ- Redis ํ์ดํ๋ผ์ธ๊ณผ ๋น๋๊ธฐ prefetch ๊ธฐ๋ฐ N+1 ์ํ
week_start_date = ?๊ธฐ๋ฐ ์ ์ฃผ ๋น๊ต ์กฐํ ์ต์ ํAsyncItemProcessor+AsyncItemWriter+WebClient+RateLimiter/Retry๊ธฐ๋ฐ ์ธ๋ถ API ๋ณ๋ชฉ ์ํ
-
Chunk Size
- ๋ณ๊ฒฝ๊ฐ:
1000 -> 200 - ํจ๊ณผ: Chunk๋น DB/Redis ๋๊ธฐ ๋ถ๋ด ๊ฐ์ ๋ฐ ์ฒ๋ฆฌ ํ์ ์จ ๊ฐ์
- ๋ณ๊ฒฝ๊ฐ:
-
Grid Size
- ๋ณ๊ฒฝ๊ฐ:
8 -> 4 - ํจ๊ณผ: ๊ณผ๋ํ
Context Switching๋น์ฉ ์ํ ๋ฐ ๋ณ๋ ฌ ์ฒ๋ฆฌ ํจ์จ ๊ฐ์
- ๋ณ๊ฒฝ๊ฐ:
-
์ ์ฃผ ์ค๋ ์ท ์กฐํ
- ๋ณ๊ฒฝ ๊ตฌ์กฐ:
DISTINCT ON๊ธฐ๋ฐ ์กฐํ ->week_start_date = ?์ ํ ์กฐํ - ํจ๊ณผ: ๋ถํ์ํ ์ค์บ ๋ฐ ์ ๋ ฌ ์ ๊ฑฐ, DB ๋ถํ ์ ๊ฐ
- ๋ณ๊ฒฝ ๊ตฌ์กฐ:
- ์ค๊ณ ๋ฐฐ๊ฒฝ, ๋ณ๋ชฉ ์ง์ , ์ฑ๋ฅ ๊ฐ์ ์ ์ฒด ๋ถ์:
docs/WEEKLY_AI_REPORT_ARCHITECTURE.md
- Framework: Spring Boot, Spring Batch, Spring Batch Integration, WebFlux
- Database: PostgreSQL, Redis
- Communication: WebClient, Resilience4j
- AI: OpenAI ํธํ LLM API
- ์์ธ ๊ฐ๋ฐ ๊ฐ์ด๋:
docs/BATCH_ARCHITECTURE_GUIDE.md