woodisco 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

반응형