dev.Log
Spring Batch 활용 본문
관리도구
- Cron
- Spring MVC + API Call
- Spring Batch Admin (Deprecated)
- Quartz로 Admin을 만듬
- CI Tools (Jenkins / Teamcity 등등)
모든 Batch Job에서 공통으로 사용되는 코드가 있다.
java - jar \
-XX:+UseG1GC \
-Dspring.profiles.active=dev \
Application.jar \
--job.name=job이름 \
job파라미터이름1=job파라미터값1 \
job파라미터이름2=job파라미터값2 \
-XX:+UseG1GC \
-Dspring.profiles.active=dev \
Application.jar \
이 부분 중복발생
=> 젠킨스에서 Global Properties 로 등록하면 모든 배치 호출시에 이용 가능
java - jar
$BATCH_JAR \
--job.name=job이름 \
이렇게 줄여짐
보안상 배포하는 젠킨스랑 배치 돌리는 젠킨스는 따로 두는 것이 좋다..
기존에 실행되고 있는 Batch jar를 종료하지 않고 배포하는 방법?
readlink
링크를 건다... app.jar가 v1을 보다가 배포끝나면 v2보도록..
심볼릭 링크 교체 : ln -s -f v2.jar app.jar
* 참고 : ln 명령어 옵션
-s : 심볼릭 링크파일을 생성한다
-f : 동일 링크파일이 있을경우 기존 파일을 지우고 링크파일을 생성한다.
파이프라인
: 여러 Job을 순서대로 실행도 하고싶고 개별로도 실행하고 싶을 때 사용
같은 Job인데 스케줄만 다르게 / 파라미터만 다르게 하고 싶을 수 있으므로 여러 작업이 순차적으로 실행이 필요할때 Step으로 나누기 보다는 파이프라인을 우선 고려한다..
* 멱등성 : 연산을 여러번 적용하더라도 결과가 달라지지 않는 성질
어제 데이터를 다시 돌려야하면..? LocalDate.now()이런식으로 배치를 작성하면...
멱등성을 지키려면 원하는 날짜를 입력받아서 실행하도록 배치를 작성해야 한다.
젠킨스에서 어떻게 오늘 일자를 yyyy-MM-dd로 보낼려면?
Data Parameter Plugin ...!! 설치하면 됨!
테스트시 @ConditionalOnProperty때문에 테스트 수행 속도가 느려질 수 있다.
이유는 스프링은 전체 테스트 수행시 Environment가 변경될 때마다 SpringContext를 재시작하기 때문이다.
* Environment가 변경되는 조건
- 테스트 코드에서 @MockBean / @SpyBean 사용할 때
- 테스트 코드에서 @TestPropertySource로 환경변수 변경할 때
- @ConditionalOnProperty로 테스트마다 Config가 다를 때
=> 테스트가 느려지는원인인 @TestPropertySource와 @ConditionalOnProperty를 제거하기 위해
모든 Config를 Loading한 뒤 원하는 배치 Job Bean을 실행한다.
JPA N + 1 문제란?
@OneToMany 관계에서 하위 엔티티들을 Lazy Loading으로 가져올때마다 조회 쿼리가 추가로 발생하는 이슈
=> 해결방법
1. Join Fetch
"SELECT DISTINCT adBond FROM AdBond adBond JOIN FETCH adBond.offsetAdBonds"
* 문제점 : 하위 엔티티 2개 종류 이상에서 Join Fetch 사용시 MultipleBagFetchException 발생한다.
2. default_batch_fetch_size 설정 지정
하위 엔티티를 loading할때 지정된 숫자만큼 상위 엔티티 ID를 Where in에 넣어서 조회한다.
출처 : https://www.youtube.com/watch?v=_nkJkWVH-mo