ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Spring Batch 구현 - 1
    [공부] 프로그래밍/Spring・Spring Boot (JAVA) 2024. 4. 16. 16:33

     

    ♧ 전체 코드 : https://github.com/woodisco/pass-batch

    GitHub - woodisco/pass-batch

    Contribute to woodisco/pass-batch development by creating an account on GitHub.

    github.com

     

    프로젝트 생성 및 샘플 코드 작성
    • Spring boot
    • Gradle
    • Spring Batch
    • MySQL 8
    • JPA
    • Lombok
    • ModelMapper

    1. 프로젝트 생성

     
    2. application.yml 파일 수정
    => 일단 테스트를 위해 h2를 사용

    spring:
      datasource:
        url: jdbc:h2:mem:mydb
        username: woojoo
        password: 0425
        driver-class-name: org.h2.Driver

     
    3. @EnableBatchProcessing 설정
    => 버전업으로 인해 설정할 필요 없이 4번 진행하기

     
    @EnableBatchProcessing은 Spring Batch 프레임워크에서 제공하는 어노테이션으로, 배치 처리를 활성화하는 데 사용됩니다. 이 어노테이션을 사용하면 Spring Batch에서 필요한 설정을 자동으로 구성할 수 있습니다.
    @EnableBatchProcessing 어노테이션은 Spring Boot 애플리케이션에서 배치 처리를 구성하고 실행하는 데 필요한 여러 빈(bean)들을 자동으로 설정합니다.
    이 어노테이션을 사용하면 Spring Batch에서 다음과 같은 기본적인 구성이 활성화됩니다:
    ・ JobRepository: 배치 작업의 메타데이터를 저장하는 데 사용되는 레포지토리를 구성합니다.
    ・ JobLauncher: 배치 작업을 실행하는 데 사용되는 런처를 구성합니다.
    ・ JobRegistry: 배치 작업을 등록하고 검색하는 데 사용되는 레지스트리를 구성합니다.
    ・ TransactionManager: 배치 작업의 트랜잭션 관리를 위한 트랜잭션 매니저를 구성합니다.

     
    4. Config 파일 생성 : 간단한 샘플 만들어 보기
    => 버전업으로 인해 JobBuilderFactory, StepBuilderFactory를 사용할 수 없게 되었기 때문에 Config를 만들어 해결하기

    'org.springframework.batch.core.configuration.annotation.jobbuilderfactory' is deprecated

    참조 : https://mindasom.tistory.com/168 

    package com.fastcampus.pass.config;
    
    import org.springframework.context.annotation.Configuration;
    import org.springframework.batch.core.Job;
    import org.springframework.batch.core.Step;
    import org.springframework.batch.core.job.builder.JobBuilder;
    import org.springframework.batch.core.repository.JobRepository;
    import org.springframework.batch.core.step.builder.StepBuilder;
    import org.springframework.batch.core.step.tasklet.Tasklet;
    import org.springframework.batch.repeat.RepeatStatus;
    import org.springframework.context.annotation.Bean;
    import org.springframework.transaction.PlatformTransactionManager;
    
    @Configuration
    public class BatchConfig {
        @Bean
        public Job passJob(JobRepository jobRepository, Step passStep) {
            return new JobBuilder("passJob", jobRepository)
                    .start(passStep)
                    .build();
        }
    
        @Bean
        public Step passStep(final JobRepository jobRepository,
                             final Tasklet passTasklet,
                             final PlatformTransactionManager platformTransactionManager) {
            return new StepBuilder("passStep", jobRepository)
                    .tasklet(passTasklet, platformTransactionManager)
                    .build();
        }
    
        @Bean
        public Tasklet passTasklet() {
            return ((contribution, chunkContext) -> {
                System.out.println("======Execute PassStep======");  //성공이면 출력
                return RepeatStatus.FINISHED;
            });
        }
    }

    여기까지 작업 후 실행하면 로그가 잘 나오는것을 확인 할 수 있다


    Docker MySQL 설치 및 생성
    Docker Compose란?
    도커 컴포즈는 여러 개의 도커 컨테이너를 정의하고 실행하기 위한 도구입니다. 보통 하나 이상의 도커 컨테이너로 구성된 애플리케이션을 관리하고 배포할 때 사용됩니다. 도커 컴포즈 파일은 YAML 형식으로 작성되며, 각 컨테이너의 설정과 서비스 간의 의존성을 정의합니다.
    도커 컴포즈 파일을 사용하면 docker-compose up 명령어를 실행하여 모든 서비스를 한 번에 실행할 수 있습니다. 도커 컴포즈는 각 서비스의 의존성을 파악하고, 정의된 설정에 따라 컨테이너를 생성하고 실행합니다.

     
    1. Docker Compose 파일 만들기

    touch docker-compose.yml

    ① Docker Hub의 MySQL 자료에서 Docker Compose 참조하기
    https://hub.docker.com/_/mysql

    mysql - Official Image | Docker Hub

    Quick reference Supported tags and respective Dockerfile links 8.3.0, 8.3, 8, innovation, latest, 8.3.0-oraclelinux8, 8.3-oraclelinux8, 8-oraclelinux8, innovation-oraclelinux8, oraclelinux8, 8.3.0-oracle, 8.3-oracle, 8-oracle, innovation-oracle, oracle 8.0

    hub.docker.com

    ② docker.docs의 volume에서 Docker Compose 참조하기
    https://docs.docker.com/storage/volumes/

    Volumes

    Learn how to create, manage, and use volumes instead of bind mounts for persisting data generated and used by Docker.

    docs.docker.com

    volumes가 필요한 이유?
    도커 컨테이너는 기본적으로 컨테이너가 삭제될 때 데이터가 함께 사라지게 되는데 계속 데이터를 유지할 수 있도록 하는 방법 중 하나가 볼륨이다.
    # Docker Compose의 버전 정보
    version: '3.8'
    
    services:
      mysql: # 서비스의 이름
        container_name: mysql_local
        image: mysql:8.0.30
        volumes:
          - ./db/conf.d:/etc/mysql/conf.d
          - ./db/initdb.d:/docker-entrypoint-initdb.d # 컨테이너가 시작되면 이 폴더 내의 sh, sql파일 실행
        ports:
          - "3306:3306"
        environment: # 환경 변수
          - MYSQL_DATABASE=pass_local
          - MYSQL_USER=test
          - MYSQL_PASSWORD=test
          - MYSQL_ROOT_PASSWORD=test
          - TZ=Asia/Tokyo

    ③ 호스팅 디렉토리 만들기

    • db/conf.d/my.cnf
    • db/initdb.d/create_table.sql
    • db/initdb.d/insert_data.sql

     
    2. 실행하기

    make db-up

    위의 커맨드 실행 시, 해당 에러 발생

    make: *** No rule to make target `db-up'. Stop.

    해결 : Makefile 파일 생성하기

    db-up: # 시작, 실행
    	docker-compose up -d --build --force-recreate 
    	# -d: 백그라운드 실행, --force-recreate: 강제 재생성 (수정시에 반드시 필요)
    
    db-down: # 정지, 종료
    	docker-compose down -v
    	# -v: volume 삭제

    DBeaver 연결

     

    출처 : 패스트캠퍼스 10개 프로젝트로 완성하는 백엔드 웹개발(Java/Spring) 초격차 패키지 Online

    '[공부] 프로그래밍 > Spring・Spring Boot (JAVA)' 카테고리의 다른 글

    Spring Batch 구현 - 3  (0) 2024.04.24
    Spring Batch 구현 - 2  (0) 2024.04.18
    Scheduler 구현  (0) 2024.04.09
    MessageSource 처리  (0) 2024.04.04
    ApplicationContext 란  (0) 2024.04.03
Designed by Tistory.