최대 1 분 소요

[문제]

  • 현재는 가맹점db와 아임포트의 db는 결제 한 건당 동기화를 진행
  • 하지만 불특정하게 동기화가 안되는 경우가 발생
  • 혹은 서버가 불안정하여 웹 훅 요청으로 인한 동기화가 원활히 이루어지지 않아 데이터 정합성에 문제가 있을 수 있다고 판단

[해결]

  • Spring Batch로 특정 시간대에 동기화 작업을 진행

[코드]

1) 동기화 Job을 생성

@StepScope
    @Bean
    @Transactional
    public Tasklet OrderJobTasklet() {
        return (contribution, chunkContext) -> {
            // orders Table 순회
            // orders 의 merchant_uid 로 pg 사 결제 상태를 조회
            // 둘의 상태가 다르다면 동기화
            List<SafekingPayment> result = safekingPaymentRepository.findAll();

            for (SafekingPayment safekingPayment : result) {
                Payment response = client
                        .paymentByImpUid(safekingPayment.getImpUid())
                        .getResponse();

                String iamPortStatus = response.getStatus();

                String dbStatus = safekingPayment.getStatus().getDescription();
                String DBStatus = changeStatus(dbStatus);

                if (iamPortStatus != DBStatus) {

                    safekingPayment.changeSafekingPayment(changeIamPortStatus(iamPortStatus) , response);
                }
            }

            return RepeatStatus.FINISHED;
        };
    }

2) BatchScheduler에 Job 을 적용

@Scheduled(cron = "0 35 4 ? * *")
    public void OrderJobRun()
            throws JobInstanceAlreadyCompleteException
            , JobExecutionAlreadyRunningException
            , JobParametersInvalidException
            , JobRestartException {
        log.info("OrderJob BATCH");
        JobParameters jobParameters = new JobParameters(
                Collections.singletonMap("requestTime", new JobParameter(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd"))))
        );
        jobLauncher.run(OrderJob,jobParameters);
        log.info("success OrderJob");
    }