"Spring Batch로 사용자 활동 로그 데이터를 집계하여 요약 보고서 생성하기"를 주제로 진행해보겠습니다.
대규모 데이터를 효율적으로 처리하고 자동화하기 위해 Spring Batch는 강력한 도구를 제공합니다.
이번 글에서는 Spring Batch를 활용해 사용자 활동 로그 데이터를 주기적으로 집계하여 요약 보고서를 생성"하는 실무 예제를 소개합니다.
이 작업은 데이터 분석, 보고, 모니터링 등 다양한 비즈니스 요구에 활용할 수 있습니다.
1. 프로젝트 설정
Spring Batch 프로젝트를 설정하고 필요한 의존성을 추가합니다.
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-batch</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
2. 데이터베이스 테이블
사용자 활동 로그를 저장하는 테이블과 요약 결과를 저장할 테이블을 생성합니다.
CREATE TABLE user_activity_logs (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
user_id BIGINT NOT NULL,
action VARCHAR(100) NOT NULL,
timestamp TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE activity_summary (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
action VARCHAR(100) NOT NULL,
action_count BIGINT NOT NULL,
generated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
3. Spring Batch 구성
3.1 Reader 설정
활동 로그 데이터를 읽기 위한 JdbcCursorItemReader
를 설정합니다.
@Bean
public JdbcCursorItemReader<UserActivityLog> reader(DataSource dataSource) {
return new JdbcCursorItemReaderBuilder<UserActivityLog>()
.name("activityLogReader")
.dataSource(dataSource)
.sql("SELECT action, COUNT(*) AS action_count FROM user_activity_logs GROUP BY action")
.rowMapper((rs, rowNum) -> new UserActivitySummary(
rs.getString("action"),
rs.getLong("action_count")
))
.build();
}
3.2 Writer 설정
집계 결과를 activity_summary
테이블에 저장합니다.
@Bean
public JdbcBatchItemWriter<UserActivitySummary> writer(DataSource dataSource) {
return new JdbcBatchItemWriterBuilder<UserActivitySummary>()
.itemSqlParameterSourceProvider(new BeanPropertyItemSqlParameterSourceProvider<>())
.sql("INSERT INTO activity_summary (action, action_count, generated_at) VALUES (:action, :actionCount, NOW())")
.dataSource(dataSource)
.build();
}
3.3 Step 설정
Reader와 Writer를 연결하여 배치 Step을 정의합니다.
@Bean
public Step step(StepBuilderFactory stepBuilderFactory, ItemReader<UserActivitySummary> reader, ItemWriter<UserActivitySummary> writer) {
return stepBuilderFactory.get("step")
.<UserActivitySummary, UserActivitySummary>chunk(10)
.reader(reader)
.writer(writer)
.build();
}
3.4 Job 설정
Step을 포함하는 Job을 정의합니다.
@Bean
public Job job(JobBuilderFactory jobBuilderFactory, Step step) {
return jobBuilderFactory.get("activitySummaryJob")
.incrementer(new RunIdIncrementer())
.start(step)
.build();
}
4. 실행 주기 설정
Spring Scheduler를 사용하여 Job을 주기적으로 실행하도록 설정합니다.
@Configuration
@EnableScheduling
public class BatchScheduler {
@Autowired
private JobLauncher jobLauncher;
@Autowired
private Job job;
@Scheduled(cron = "0 0 * * * ?") // 매시간 실행
public void runBatchJob() {
try {
JobParameters params = new JobParametersBuilder()
.addString("JobID", String.valueOf(System.currentTimeMillis()))
.toJobParameters();
jobLauncher.run(job, params);
} catch (Exception e) {
e.printStackTrace();
}
}
}
5. 엔티티 클래스
Reader와 Writer에서 사용할 데이터 모델을 정의합니다.
UserActivityLog.java
@Data
@NoArgsConstructor
@AllArgsConstructor
public class UserActivityLog {
private String action;
private Long actionCount;
}
6. 실행 결과
Spring Batch Job 실행 후 activity_summary
테이블에는 집계된 결과가 저장됩니다.
action | action_count | generated_at
-----------------------------------------------------
LOGIN | 1000 | 2025-01-20 14:00:00
PURCHASE | 200 | 2025-01-20 14:00:00
LOGOUT | 800 | 2025-01-20 14:00:00
7. 정리
이 예제는 Spring Batch를 활용하여 사용자 활동 로그 데이터를 주기적으로 집계하고 요약 보고서를 생성하는 방법을 보여줍니다.
이 작업은 데이터 분석, 모니터링, 비즈니스 인사이트 제공 등 다양한 목적으로 활용될 수 있습니다.
실무에서 요구되는 배치 작업에 이 예제를 응용해 보세요!
'Spring & Spring Boot 실무 가이드' 카테고리의 다른 글
[Spring] Spring Boot에서 API 응답 속도를 높이는 5가지 방법 (2) | 2025.01.21 |
---|---|
[Spring]Spring 개발자를 위한 Annotation 원리와 커스텀 Annotation 실습 (0) | 2025.01.18 |
[spring] AOP(관점 지향 프로그래밍) 이해하기: 실용적인 예제로 배우는 AOP (1) | 2024.01.21 |
[Spring] yml 암호화를 해보자(feat. jasypt) (2) | 2024.01.03 |
[Spring] 메세지 컨버터란 (Spring message converter) (5) | 2023.11.01 |