Spring Batch

Chaostocosmos·2022년 11월 22일
4

Spring Batch

목록 보기
1/3
post-thumbnail

[본 포스팅은 인프런 정수원 강사님의 Spring Batch 강의를 정리한 Post 입니다.]

스프링 배치 소개

스프링 배치 탄생 배경

자바 기반 표준 배치 기술 부재

  • 일괄처리를 위한 배치 기술이 없었음

스프링 배치 핵심 패턴

  1. Read - 데이터베이스 , 파일 큐에서 다량의 데이터를 조회한다.
  2. Process - 특정 방법으로 데이터를 가공한다.
  3. Write - 데이터를 수정된 양식으로 다시 저장한다.
  • DATABASE의 용어 ETL과 유사함
    • Extract : Read
    • Transform : Process
    • Load : Write

배치 시나리오

  • 배치 프로세스를 주기적으로 commit

    • 대용량의 Data를 DB에 insert한다면 한 번에 Commit할 시 리스크가 큼
    • 최소한의 자원을 가지고 최대한을 효과를 내도록 전략을 제공함
  • 동시 다발적인 Job 의 배치 처리 , 대용량 병렬 처리
    - Job 간의 간섭 방지 , 병렬 처리 -> Multi Thread

  • 실패 후 수동 또는 스케줄링에 의한 재시작

  • 의존관계가 있는 step 여러 개를 순차적으로 처리

  • 조건적 Flow 구성을 통한 체계적이고 유연한 배치 모델 구성

  • 반복 , 재시도 , Skip 처리

Spring Batch Layers

  • Application : 개발자가 만든 모든 배치 Job과 커스텀 코드를 포함
  • Batch Core : Job을 실행, 모니터링 관리하는 API 로 구성 JobLauncher , Job , Step, Flow 등이 속한다.

  • Batch Infrastructure : Application , Core 모두 공통 Infrastructure 위에서 빌드한다. Job 실행의 흐름과 처리를 위한 틀을 제공함

++ 여기 외부 라이브러리 추가 예정 !
  • 개발환경

    Spring Boot 2.7.4
    IDE : IntelliJ 2022
    Databases : MySQL
    JAVA : 11

MySQL을 Docker를 활용하여 설치해보자

( 본 강의에서는 docker를 사용하여 진행하므로 따라서 진행해보자 ! )

Docker 설치하기

그전에 Docker란 ?

Docker : Docker는 개발자가 컨테이너화된 애플리케이션을 빠르게 빌드, 테스트 및 배포할 수 있게 해주는 소프트웨어 플랫폼

도커(Docker)는 리눅스의 응용 프로그램들을 프로세스 격리 기술들을 사용해 컨테이너로 실행하고 관리하는 오픈 소스 프로젝트이다.

도커 웹 페이지의 기능을 인용하면 다음과 같다:

도커 컨테이너는 일종의 소프트웨어를 소프트웨어의 실행에 필요한 모든 것을 포함하는 완전한 파일 시스템 안에 감싼다. 여기에는 코드, 런타임, 시스템 도구, 시스템 라이브러리 등 서버에 설치되는 무엇이든 아우른다. 이는 실행 중인 환경에 관계 없이 언제나 동일하게 실행될 것을 보증한다.[5]

도커는 리눅스에서 운영 체제 수준 가상화의 추상화 및 자동화 계층을 추가적으로 제공한다.[6] 도커는 cgroups와 커널 이름공간과 같은 리눅스 커널의 기능들과 OverayFS, aufs와 같은 유니언 가능 파일 시스템의 리소스 격리 기능을 사용하며,[7] 이를 통해 독립적인 "컨테이너"가 하나의 리눅스 인스턴스 안에서 실행할 수 있게 함으로써 가상 머신을 시작하여 유지보수해야 하는 부담을 없애준다.[8]

리눅스 커널의 이름공간 지원은 대체적으로[9] 프로세스 트리, 네트워크 사용자 ID, 마운트된 파일 시스템을 포함한 운영 환경에 대한 응용 프로그램의 관점을 격리시키지만, 커널의 cgroup들은 CPU, 메모리, 블록 입출력, 네트워크를 포함한 리소스 제한을 제공한다. 버전 0.9부터 도커는 libvirt, LXC (리눅스 컨테이너), systemd-nspawn을 통한 추상화된 가상화 인터페이스를 사용하는 것 뿐 아니라 리눅스 커널이 제공하는 가상화 기능을 직접 사용하기 위한 유일한 수단으로 libcontainer 라이브러리를 포함하고 있다.[10][11][12]

출처 : 위키백과

그런데 ! 문제가 발생했다 Docker에서는 Windows의 가상화 시스템 Hyper-V를 사용하는데,
Windows home 에디션에서는 이러한 Hyper-v를 지원해 주지 않는다,
별도의 Batch파일을 실행시켜 Hyper-V를 활성화 해야하는데,

Hyper-v의 활성화는 아래 출처를 통하여 진행한다.

마이크로소프트 하이퍼 V(Hyper-V, 코드이름 Viridian[1])는 
x64 시스템을 위한 하이퍼바이저 기반의 가상화 시스템이다.
[2] 윈도우 서버 가상화(Windows Server Virtualization)라는 이름으로도 알려져 있다. 
하이퍼 V 베타 버전은 윈도우 서버 2008 x64 에디션에도 추가되어 있으며 마지막 버전은(윈도우 업데이트를 통해 자동으로 업데이트됨) 윈도우 10에 적용되었다.[3]

출처 : 위키백과

hyper-v home eddition에 기능 추가하기

핵심은 해당 코드를 메모장의 .bat 으로 확장자 명을 설정한 다음,
관리자 권한으로 실행 시킨 후 재시작 하면 된다.

pushd "%~dp0"
dir /b %SystemRoot%\servicing\Packages\*Hyper-V*.mum >hyper-v.txt
for /f %%i in ('findstr /i . hyper-v.txt 2^>nul') do dism /online /norestart /add-package:"%SystemRoot%\servicing\Packages\%%i"
del hyper-v.txt
Dism /online /enable-feature /featurename:Microsoft-Hyper-V -All /LimitAccess /ALL
pause

짠 ! 등록 완료

Docker.exe 관리자 권한으로 실행하기

Docker를 설치한 이 휘 Restart 되는데 이 후 Pop up이 올라오고,
accept를 눌렀더니, 다음과 같은 WSL 2 Installation is incomplete가 발생하였다
Msi Update가 필요한 것으로 보이는데. 진행 후 restart 하자.. !

해당 링크를 클릭 시
https://learn.microsoft.com/ko-kr/windows/wsl/install-manual#step-4---download-the-linux-kernel-update-package
으로 이동하게 된다.

관리자 권한으로 실행해서 업데이트해보자..!

업데이트 완료 이 후 microsoft의 5번 지시를 수행 후
자주 사용했던 Linux ubuntu를 설치했다.
root 계정 외에 개인 계정을 등록 할 수 있어서 등록했다. ( Mysql 과 무관. 그냥 다운 받음 )

WSL 2 installation is incomplete. 이 install 된 것 같으니.. restart 진행하겠다..

띠용.. ! 눌렀더니 error가 발생했는데..
docker 실행 실패로 확인된다.. 별다른 작업도 한게 없는데 실패라니
설정이나 환경이 많이 바뀐것으로 생각하고 reset 진행 하였다.. 과연 될까..?

restart 후 Stopped error가 발생한 Docker 가 정상..? 실행 된 것 같다
Docker tutorial 을 통해 회원 가입과 메일 인증일 마쳤다.. 이제 스프링 배치를 시작 할 수 있을까..?

Docker 설치를 완료하였으니 MySql Container를 만들어보자 !

Mysql을 pull 했는데 여기서 mysql을 docker에서는 image로 부르는 듯 싶다.
Mysql 설치를 마치고 컨테이너를 만들려 명령어를 쳤다

Docker 컨테이너 생성 명령어 입력

docker run --name mysql-container -e MYSQL_ROOT_PASSWORD=<password> -d -p 3300:3306 mysql:latest 

그런데 ! 이전에 Local에 설치한 Mysql으로 인하여 3306포트가 점유! 해당 error 가 발생한다. local에 있는 port를 뽑아버리자 !

netstat -ano | 에서 3306 포트 사용 ppid를 찾고 찾은 후 제거한다 !

taskkill /f /pid 6656

이 때 ! 권한 문제로 deny 될 수 있으니 !

프로세스 트리로 꺼버린다 !

이 후 컨테이너에 mysql-container 가 run 되어있는지 확인 ~

docker ps -a 를 입력해서 docker에 올라온 프로세스를 확인한다.

그리고 mysql 접속확인 !

오홍.. 잘된당

profile
개발새발

1개의 댓글

comment-user-thumbnail
2023년 1월 11일

오r~ 정말 유익한 ஊ청보0ㅔள요✕~✧ 감ㅅr합L1➶ㄷr~
ㅎr트 눑르ټ고✼ 칿❁요~ண
종◌종 찾0r봅1겠씂L1✌➚ㄷr.☞

답글 달기