Post

2024-07-31-TIL

2024-07-31-TIL

Today I Learned

예치금

  • https://blog.naver.com/tepasa/222058610867

원장 데이터

  • https://brunch.co.kr/@ravi-y-kim/2

이력 유형

  • https://dataonair.or.kr/db-tech-reference/d-lounge/expert-column/?mod=document&uid=52906#:~:text=%EC%9D%B4%EB%A0%A5%EC%9D%80%20%EC%8B%9C%EA%B0%84%EC%97%90%20%EB%94%B0%EB%9D%BC,%EC%97%90%20%EC%A0%95%EB%B3%B4%EA%B0%80%20%EB%B0%9C%EC%83%9D%EB%90%9C%EB%8B%A4.

sLock vs xLock

  • https://jaeseongdev.github.io/development/2021/06/16/Lock%EC%9D%98-%EC%A2%85%EB%A5%98-(Shared-Lock,-Exclusive-Lock,-Record-Lock,-Gap-Lock,-Next-key-Lock)/
  • https://velog.io/@soongjamm/Select-%EC%BF%BC%EB%A6%AC%EB%8A%94-S%EB%9D%BD%EC%9D%B4-%EC%95%84%EB%8B%88%EB%8B%A4.-X%EB%9D%BD%EA%B3%BC-S%EB%9D%BD%EC%9D%98-%EC%B0%A8%EC%9D%B4
  • https://velog.io/@impala/DB-Concurrency-Control

Billing System Design

  • https://vertabelo.com/blog/billing-system-database-model/
  • https://www.slideteam.net/system-architecture-of-billing-software.html
  • http://www.siplnet.com/CallBilling/Prod_TechArch.aspx?Mode=
  • https://mecha-mind.medium.com/system-design-billing-system-844047e916ff

Payment System Design

  • https://medium.com/@sriram.inc/payment-processing-architecture-9651e7292b0c
  • https://medium.com/@erande.kedar/payment-system-architecture-3040b323368a
  • https://newsletter.pragmaticengineer.com/p/designing-a-payment-system
  • https://www.oreilly.com/library/view/hacking-point-of/9781118810071/9781118810071c02.xhtml
  • https://hazelcast.com/use-cases/payment-processing/
  • https://devoxsoftware.com/blog/the-2022-manual-to-payment-system-architecture/

Settlement System Design

  • https://forum.interledger.org/t/settlement-architecture/545
  • https://greypencil.tistory.com/87

Inventory Management System Design

  • https://vertabelo.com/blog/data-model-for-inventory-management-system/

Java ExecutorService

  • https://www.baeldung.com/java-executor-service-tutorial
  • https://mangkyu.tistory.com/259

Spring Batch Step

스프링 배치(Spring Batch)에서 잡(Job)을 순서대로 진행하려면 여러 방법이 있지만, 가장 흔히 사용되는 두 가지 방법은 다음과 같습니다.

  1. JobLauncher를 이용한 순차 실행: Spring Batch에서 제공하는 JobLauncher를 사용하여 여러 잡을 순차적으로 실행할 수 있습니다. 예를 들어, 첫 번째 잡이 완료된 후 두 번째 잡을 실행하도록 설정할 수 있습니다.

  2. JobOperator를 이용한 실행: JobOperator를 사용하여 잡을 제어할 수 있습니다. 이를 통해 잡의 시작, 중지, 재시작 등을 제어할 수 있으며, 여러 잡을 순서대로 실행하는 로직을 구성할 수 있습니다.

예를 들어, 첫 번째 방법을 사용하여 잡을 순서대로 실행하는 예제를 보겠습니다:

1. JobLauncher를 이용한 순차 실행

1.1. 설정 파일 (Java Configuration)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
@Configuration
@EnableBatchProcessing
public class BatchConfiguration {

    @Autowired
    private JobBuilderFactory jobBuilderFactory;

    @Autowired
    private StepBuilderFactory stepBuilderFactory;

    @Bean
    public Job job1() {
        return jobBuilderFactory.get("job1")
            .start(step1())
            .build();
    }

    @Bean
    public Job job2() {
        return jobBuilderFactory.get("job2")
            .start(step2())
            .build();
    }

    @Bean
    public Step step1() {
        return stepBuilderFactory.get("step1")
            .tasklet((contribution, chunkContext) -> {
                System.out.println("Executing step1 of job1");
                return RepeatStatus.FINISHED;
            })
            .build();
    }

    @Bean
    public Step step2() {
        return stepBuilderFactory.get("step2")
            .tasklet((contribution, chunkContext) -> {
                System.out.println("Executing step2 of job2");
                return RepeatStatus.FINISHED;
            })
            .build();
    }
}

1.2. JobLauncher를 이용한 잡 실행

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
@SpringBootApplication
public class BatchApplication implements CommandLineRunner {

    @Autowired
    private JobLauncher jobLauncher;

    @Autowired
    private Job job1;

    @Autowired
    private Job job2;

    public static void main(String[] args) {
        SpringApplication.run(BatchApplication.class, args);
    }

    @Override
    public void run(String... args) throws Exception {
        // 첫 번째 잡 실행
        JobExecution job1Execution = jobLauncher.run(job1, new JobParametersBuilder().toJobParameters());
        
        if (job1Execution.getStatus() == BatchStatus.COMPLETED) {
            // 첫 번째 잡이 완료되면 두 번째 잡 실행
            JobExecution job2Execution = jobLauncher.run(job2, new JobParametersBuilder().toJobParameters());
        }
    }
}

2. JobOperator를 이용한 실행

2.1. 설정 파일 (Java Configuration)

위의 Job 및 Step 설정은 동일하게 사용할 수 있습니다.

2.2. JobOperator를 이용한 잡 실행

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
@SpringBootApplication
public class BatchApplication implements CommandLineRunner {

    @Autowired
    private JobOperator jobOperator;

    @Autowired
    private Job job1;

    @Autowired
    private Job job2;

    public static void main(String[] args) {
        SpringApplication.run(BatchApplication.class, args);
    }

    @Override
    public void run(String... args) throws Exception {
        // 첫 번째 잡 실행
        Long job1ExecutionId = jobOperator.start("job1", "");

        // 첫 번째 잡이 완료될 때까지 대기
        boolean job1Completed = false;
        while (!job1Completed) {
            Thread.sleep(1000); // 1초 대기
            job1Completed = jobOperator.getJobExecution(job1ExecutionId).getStatus() == BatchStatus.COMPLETED;
        }

        // 첫 번째 잡이 완료되면 두 번째 잡 실행
        jobOperator.start("job2", "");
    }
}

이렇게 설정하면 스프링 배치에서 여러 잡을 순서대로 실행할 수 있습니다. 이 방법 외에도 다양한 방법이 있을 수 있으며, 요구사항에 맞는 방법을 선택하여 사용하면 됩니다.

  • https://docs.spring.io/spring-batch/reference/index.html
This post is licensed under CC BY 4.0 by the author.