Spring Batch 입문 3.7. 오래된 접속 로그 자동 삭제 하는 기능 구현하기(3) - 작성한 배치 Step과 Job으로 등록하기

admin | | 조회 10


[주요 목차]

Config 클래스에 Step과 Job을 등록하는 방법

Tasklet과 Step을 실제로 구성하는 과정

Job 실행 후 오래된 로그 삭제 결과 확인


Spring Batch로 오래된 접속 로그 자동 삭제 기능을 만들고 계신가요? 앞선 영상에서 Tasklet까지 만들었는데, 이걸 실제로 돌리려면 Step과 Job에 등록해야 하잖아요. 이번 글에서는 파일 클린업 컨피그 클래스를 만들고, Tasklet을 빈으로 등록한 뒤 Step과 Job까지 연결하는 과정을 자세히 정리했어요. 이 글을 읽으면 Spring Batch 입문자도 배치 Job을 터미널에서 바로 실행해 볼 수 있는 실전 흐름을 완전히 이해할 수 있어요. 오래된 접속 로그 삭제 기능을 끝까지 마무리하고 싶다면 끝까지 따라와 보세요.


Spring Batch 입문 3.7. 오래된 접속 로그 자동 삭제 하는 기능 구현하기(3) - 작성한 배치 Step과 Job으로 등록하기 - 주요 포인트 1 - SpringBatchSpring Batch 입문 3.7. 오래된 접속 로그 자동 삭제 하는 기능 구현하기(3) - 작성한 배치 Step과 Job으로 등록하기 · 주요 포인트 1

Config 클래스에 Step과 Job을 등록하는 방법

자, 이제 Tasklet을 실제 배치에 넣어야 하는데요. 가장 먼저 파일 클린업 컨피그라는 클래스를 새로 만들었어요. 이 클래스에 @Configuration, @RequiredArgsConstructor, @Slf4j 어노테이션을 달아주면 기본 설정이 끝나죠.

여기서 중요한 건 두 가지 의존성을 주입하는 거예요. 바로 로그를 감시할 Repository와 PlatformTransactionManager예요. Repository는 이전에 만든 접속 로그 테이블을 다루는 친구고, 트랜잭션 매니저는 배치 실행 중 데이터 일관성을 지켜주는 역할을 하거든요.

이렇게 의존성을 넣어두면 나중에 Step을 만들 때 바로 꺼내 쓸 수 있어요. 제가 테스트해 보니 이 구조로 만들면 나중에 Job이 여러 개 생겨도 설정이 엉키지 않더라고요.

Spring Batch 입문 3.7. 오래된 접속 로그 자동 삭제 하는 기능 구현하기(3) - 작성한 배치 Step과 Job으로 등록하기 - 참고 컷 2 - SpringBatchSpring Batch 입문 3.7. 오래된 접속 로그 자동 삭제 하는 기능 구현하기(3) - 작성한 배치 Step과 Job으로 등록하기 · 참고 컷 2

Tasklet과 Step을 실제로 구성하는 과정

Tasklet을 빈으로 등록할 때는 메서드 이름을 fileCleanupTasklet으로 지었어요. return new FileCleanupTasklet("./test-logs", 30)처럼 경로와 보관 기간을 넘겨주면 끝이죠. 30일로 설정했더니 30일 이전 파일만 대상이 되더라고요.

Step은 StepBuilder를 사용해서 만들었어요. 이름은 fileCleanupStep으로 하고, tasklet(fileCleanupTasklet, transactionManager)로 연결한 뒤 .build()를 호출하면 완성돼요. Tasklet 방식이라 chunk보다는 간단하지만, 트랜잭션 매니저를 꼭 넣어야 배치가 정상적으로 커밋되더라고요.

이렇게 Step까지 만들고 나니 Job을 연결하는 게 훨씬 수월했어요. 앞서 만든 Step을 그대로 Job에 넣기만 하면 되니까요.

[이미지�입용태그3]

Job 실행 후 오래된 로그 삭제 결과 확인

Job은 fileCleanerJob이라는 이름으로 만들었어요. JobBuilder를 사용해 start(fileCleanupStep).build() 형태로 연결했죠. Job 이름은 나중에 터미널에서 실행할 때 정확히 맞춰야 하니까 신경 써서 지었어요.

실행은 터미널에서 ./gradlew bootRun --args='--spring.batch.job.names=fileCleanerJob' 명령어로 했어요. 이전에 쓰던 cafeJob 대신 fileCleanerJob으로만 바꾸면 되더라고요.

실행 결과, 50일 전과 100일 전 파일은 삭제됐고, 2일 전과 오늘 만든 파일은 남아 있었어요. system.comp처럼 확장자가 다른 파일도 삭제되지 않아서 로직이 제대로 동작했음을 확인할 수 있었어요. 여러분도 같은 방식으로 테스트 파일을 만들어서 30일 기준을 직접 확인해 보세요.


[자주 묻는 질문]

Spring Batch에서 Tasklet을 Step에 등록할 때 트랜잭션 매니저는 꼭 넣어야 하나요?

네, 넣는 게 안전해요. Tasklet은 chunk처럼 자동으로 트랜잭션을 관리하지 않기 때문에 PlatformTransactionManager를 직접 넘겨줘야 배치 실행 중 예외가 발생해도 데이터 일관성이 유지돼요. 실제로 트랜잭션 매니저 없이 돌리면 중간에 실패했을 때 로그가 제대로 롤백되지 않는 경우가 있더라고요.

오래된 접속 로그 삭제 배치 Job을 실행하는 명령어가 어떻게 되나요?

./gradlew bootRun --args='--spring.batch.job.names=fileCleanerJob'처럼 job 이름을 정확히 지정하면 돼요. 기존에 cafeJob을 쓰던 자리에 fileCleanerJob만 바꿔 넣으면 되고, 여러 Job이 있을 때는 이 옵션으로 원하는 Job만 골라 실행할 수 있어요.

보관 기간을 30일로 설정했는데 실제 운영에서는 어떻게 조정하나요?

application.yml에 retention.days=30처럼 외부 설정으로 빼는 걸 추천해요. Tasklet 생성자에 @Value("${retention.days}")로 주입하면 코드 수정 없이 기간을 바꿀 수 있죠. 이렇게 하면 개발·운영 환경에서 다른 값을 쉽게 적용할 수 있어요.

목록
글쓰기
한국 서버호스팅
전체보기 →

댓글 0