diff --git a/src/main/java/com/kusitms/jipbap/event/aop/EventLogAspect.java b/src/main/java/com/kusitms/jipbap/event/aop/EventLogAspect.java index 0d403c0..4376365 100644 --- a/src/main/java/com/kusitms/jipbap/event/aop/EventLogAspect.java +++ b/src/main/java/com/kusitms/jipbap/event/aop/EventLogAspect.java @@ -53,5 +53,6 @@ public void eventLogging(JoinPoint joinPoint, EnterEventResponse result) { @AfterThrowing(value = "execution(* com.kusitms.jipbap.event..*Controller.*(..))", throwing = "ex") public void eventErrorLogging(JoinPoint joinPoint, Exception ex) { log.info("[ERROR][event] error occurred - exception: {}, timestamp: {}", ex.getMessage(), System.currentTimeMillis()); + eventLogService.createEventErrorLog(); } } diff --git a/src/main/java/com/kusitms/jipbap/event/aop/EventLogDto.java b/src/main/java/com/kusitms/jipbap/event/aop/EventLogDto.java new file mode 100644 index 0000000..0b8eb2c --- /dev/null +++ b/src/main/java/com/kusitms/jipbap/event/aop/EventLogDto.java @@ -0,0 +1,10 @@ +package com.kusitms.jipbap.event.aop; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public class EventLogDto { + +} diff --git a/src/main/java/com/kusitms/jipbap/event/aop/EventLogRepository.java b/src/main/java/com/kusitms/jipbap/event/aop/EventLogRepository.java index 073b2d4..e5a74e6 100644 --- a/src/main/java/com/kusitms/jipbap/event/aop/EventLogRepository.java +++ b/src/main/java/com/kusitms/jipbap/event/aop/EventLogRepository.java @@ -1,8 +1,11 @@ package com.kusitms.jipbap.event.aop; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.stereotype.Repository; -@Repository +import java.time.LocalDateTime; + public interface EventLogRepository extends JpaRepository { + Page findByCreatedAtBefore(LocalDateTime time, PageRequest pageRequest); } diff --git a/src/main/java/com/kusitms/jipbap/event/batch/EventLogClearConfig.java b/src/main/java/com/kusitms/jipbap/event/batch/EventLogClearConfig.java new file mode 100644 index 0000000..51c2d7e --- /dev/null +++ b/src/main/java/com/kusitms/jipbap/event/batch/EventLogClearConfig.java @@ -0,0 +1,108 @@ +package com.kusitms.jipbap.event.batch; + +import com.kusitms.jipbap.event.aop.EventLog; +import com.kusitms.jipbap.event.aop.EventLogRepository; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.batch.core.Job; +import org.springframework.batch.core.Step; +import org.springframework.batch.core.configuration.annotation.JobScope; +import org.springframework.batch.core.configuration.annotation.StepScope; +import org.springframework.batch.core.job.builder.JobBuilder; +import org.springframework.batch.core.launch.support.RunIdIncrementer; +import org.springframework.batch.core.repository.JobRepository; +import org.springframework.batch.core.step.builder.StepBuilder; +import org.springframework.batch.item.ItemProcessor; +import org.springframework.batch.item.ItemReader; +import org.springframework.batch.item.data.RepositoryItemWriter; +import org.springframework.batch.item.data.builder.RepositoryItemReaderBuilder; +import org.springframework.batch.item.data.builder.RepositoryItemWriterBuilder; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.data.domain.Sort; +import org.springframework.transaction.PlatformTransactionManager; + +import java.time.LocalDateTime; +import java.util.Collections; +import java.util.List; + +@Slf4j +@RequiredArgsConstructor +@Configuration +public class EventLogClearConfig { + + private final String JOB_NAME = "eventLogClearJob"; + private final String STEP_NAME = "eventLogClearStep"; + + private final EventLogRepository eventLogRepository; + + /** + * Job 등록 + */ + @Bean + public Job eventLogClearJob(JobRepository jobRepository, PlatformTransactionManager transactionManager) { + return new JobBuilder(JOB_NAME, jobRepository) + .incrementer(new RunIdIncrementer()) // job parameter - sequential id + .start(eventLogClearStep(jobRepository, transactionManager)) // step 설정 + .build(); + } + + /** + * Step 등록 + */ + @Bean + @JobScope + public Step eventLogClearStep(JobRepository jobRepository, PlatformTransactionManager transactionManager) { + return new StepBuilder(STEP_NAME, jobRepository) + .chunk(5, transactionManager) // chunkSize: 몇 개 단위로 데이터를 처리할 것인지 지정. 참고로 파라미터로 받아서 사용할 수는 없다. + .reader(eventLogClearReader()) + .processor(eventLogClearProcessor()) + .writer(eventLogClearWriter()) + .build(); + } + + /** + * 실제 데이터 제거 + */ + @Bean + @StepScope + public RepositoryItemWriter eventLogClearWriter() { + + return new RepositoryItemWriterBuilder() + .repository(eventLogRepository) + .methodName("delete") + .build(); + } + + /** + * 데이터 가공 : 현재는 의미없음 + */ + @Bean + @StepScope + public ItemProcessor eventLogClearProcessor() { + return item -> item; + } + + /** + * tb_eventlog 테이블의 일정 기간 이상 된 데이터 제거 + * Spring Batch는 QuerydslItemReader를 지원하지 않는다. + * RepositoryItemReader의 argument는 두번째 인자로 PageRequest객체를 반드시 받도록 되어있는데, 이유를 잘 모르겠다 + */ + @Bean + @StepScope + public ItemReader eventLogClearReader() { + + LocalDateTime dateTime = LocalDateTime.now().plusDays(1); + log.info("EventLog 삭제 기준 DateTime : {}", dateTime); + + return new RepositoryItemReaderBuilder() + .name("eventLogClearReader") + .repository(eventLogRepository) + .methodName("findByCreatedAtBefore") + .arguments(List.of(dateTime)) // 의미없는 PageRequest 전달 + .pageSize(5) // chunkSize와 일치하게 설정 + .sorts(Collections.singletonMap("id", Sort.Direction.ASC)) + .build();제 + + } +} diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index bd8c510..7829ad4 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -41,6 +41,13 @@ spring: max-file-size: 30MB max-request-size: 30MB + batch: + jdbc: + initialize-schema: always + job: + name: eventLogClearJob +# enabled: false # Job 실행을 스케줄러에게 위임하기 위하여 설정 + cloud: aws: s3: