일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 스프링배치 메타테이블
- 아이템 리더 커스텀
- executioncontext
- executioncontext 변수 공유
- flatfileitemwriter
- 스프링 배치 5
- JSONObject 분할
- JSON 분할
- aop proxy
- JSON 분리
- 읽기 작업과 쓰기 작업 분리
- api 아이템 리더
- spring batch 변수 공유
- spring batch 5
- 아이템 리더 페이징 처리
- abstractpagingitemreader
- 스프링배치 엑셀
- step 값 공유
- 스프링 트랜잭션 관리
- stepexecutionlistener
- mybatis
- job parameter
- 마이바티스 트랜잭션
- step 여러개
- 선언적 트랜잭션 관리
- step 사이 변수 공유
- 스프링배치 csv
- JSONArray 분할
- 트랜잭션 분리
- Spring Batch
- Today
- Total
목록HANDS-ON (9)
ebson
Spring Boot 의 Transaction 관리 Spring Boot에서는 Transaction 관리를 위해 TransactionManager 인터페이스와 이를 확장한 다양한 종류의 인터페이스 및 구현체들을 제공한다. TransactionManager를 사용하는 일반적인 방법은 Transaction 단위의 메서드에 @Transactional 어노테이션을 적용하는 것인데, 어노테이션을 적용한 메서드가 호출되면 트랜잭션을 생성하고 메서드가 종료하면 commit, 예외가 발생하면 rollback한다. package org.springframework.transaction;import org.springframework.lang.Nullable;public interface PlatformTransacti..
Spring Batch 에서 Step 개발 Spring Batch를 사용한 Batch Application에서 대부분의 경우에는 단일 Step으로 요구사항을 충족할 수 있다. 그러나 비즈니스 로직을 분리하면서 모듈화하고 가독성을 향상하거나, 큰 작업을 작은 작업들로 나누면서 재사용성을 향상하려는 경우, 또는 필요에 따라 새로운 Step을 추가하고 제거, 순서 변경하는 등 유연성과 확장성을 가지려는 경우에 여러 Step으로 Job을 구성할 수 있다. 여러 Step으로 Job을 구성하고 개발하다보면 Step 사이에 변수를 공유해야 하는 경우가 생긴다. 다른 스텝에서의 계산 결과나 데이터베이스 쿼리 결과, API 호출 결과를 사용하거나, 앞선 스텝의 결과 값으로 조건 분기 처리하여 다음 스텝을 결정해야 하는 ..
Spring Batch Application에서 사용할 수 있는 데이터소스들 대부분의 경우 Spring Batch를 사용한 배치 어플리케이션에서는 데이터소스로 RDBMS를 연동해 사용하기 때문에, MyBatis와 JPA를 사용할 수 있으면 된다. 직접 MyBatis와 JPA를 사용하는 코드를 작성할 수도 있고 Spring Batch가 제공하는 전용 Item Reader 클래스와 Item Writer 클래스를 사용할 수도 있다. ex) MyBatisCursorItemReader, MyBatisPagingItemReader, MybatisBatchItemWirter, JpaPagingItemReader, JpaItemWriter ... 그러나 배치 어플리케이션의 읽기 데이터소스가 항상 MyBatis와 ..
JPA 개발자들이 스프링 프레임웍을 함께 사용하는 이유 중 하나가 스프링에서는 트랜잭션 관리를 해주기 때문이라고 한다. 내가 실무에서 만난 프로젝트도 스프링 프레임웍 기반의 프로젝트였고 트랜잭션 설정 파일이 있었다. 서비스 메서드를 호출한 후 트랜잭션을 처리하도록 하되 insert, update, delete 으로 시작하는 서비스 메서드에서 예외가 발생하는 경우에 트랜잭션을 롤백하도록 설정할 수 있었다. 트랜잭션 과다 생성으로 인한 성능저하 그런데 서비스 메서드를 호출할 때 적용되는 트랜잭션 설정과 어울리지 않는 일부 소스에서 성능저하를 일으키는 경우가 있었다. 서비스단에서 모아서 처리해야 할 트랜잭션 작업을 컨트롤러에서 for문을 돌면서 개별적으로 요청하고 같은 쿼리를 여러번 호출했기 때문이다. .....
외부 API ENDPOINT 으로 JSON, FORM DATA 등의 데이터셋을 POST 요청하여 성공/실패 응답을 받고 처리하는 것 만큼이나 GET 요청을 통해 데이터셋을 받아 정제하고 사용하는 것도 실무에서 만날 수 있는 흔한 요구사항이다. 그리고 GET 요청을 통해 받는 데이터셋이 JSON 포맷인 경우도 많다. 그래서 외부 API ENDPOINT으로 HTTP GET 요청을 효율적으로 실행하며 결과 JSON 데이터셋을 용도에 맞게 수집, 정제, 활용하는 작업이 필요할 수 있다. 내가 실무에서 만난 작업은 데이터베이스의 특정 테이블의 정보를 바탕으로 brightcove 에서 제공하는 비디오정보 데이터셋을 특정 기간내 조회하여 데이터베이스의 특정 테이블에 해당 비디오정보의 상태정보를 업데이트 하는 배치 잡..

실무에서 JSON 데이터를 외부 API ENDPOINT로 POST 전송하는 것은 흔한 요구사항이다. XML 포맷에 비해 JSON 포맷을 사용할 때의 이점은 최소한의 용량으로 가독성이 더 좋은 데이터를 주고 받을 수 있다는 것이다. 내 경우는 기존 XML파일로 생성하던 데이터들을 JSON 방식으로 변환해 전송하는 요구사항과 데이터베이스 등에 적재된 데이터들을 검색 페이지에 사용하기 위한 용도로 JSON 방식으로 전송하는 요구사항이 있었다. 두 요구사항 모두 외부 API ENDPOINT 으로 JSON을 POST 요청하는 요구사항이다. 첫번째 요구사항에 대해 유틸 클래스를 개발해본 경험에 대한 내용은 다른 글에서 정리하도록 하겠다. 이 글에서는 최소한의 용량으로 압축한 JSON 포맷의 데이터마저 API END..
대형 서비스에서 데이터베이스를 여러대로 분산해 효용성을 높이고 규모를 조절하는 것은 일반적인 방법이다. 그리고 데이터베이스당 트랜잭션 처리가 이루어지는 특성상 한 기능단위에서 2개 이상 데이터 소스에 접근하고자 할 때 스프링에서 별도의 작업을 취하지 않으면, 한개의 데이터 소스로만 commit 되고 다른 데이터 소스에 대한 commit이 누락될 수 있다. 즉 A 데이터 소스와 B 데이터 소스에 대한 스프링의 트랜잭션 매니저들 중 하나만 동작한다는 것이다. 이때는 스프링에서 제공하는 ChainedTransactionManager를 적용해 A, B 데이터 소스에 대한 트랜잭션이 모두 동작하도록 할 수 있다. 위 클래스의 동작 방식은 공식 문서에 따르면, 생성자의 인자로 전달받은 트랜잭션 매니저를 순서대로 처..

스프링 부트 배치 개발 중에 org.springframework.dao.TransientDataAccessResourceException: Cannot change the ExecutorType when there is an existing transaction 예외가 발생했다. MyBatisItemReader로 읽은 데이터를 ItemProcessor가 처리하면서 마이바티스 매퍼를 사용하고자 할 때 발생하는 것으로 추적되었다. 원인을 분석해보니, MyBatisItemReader는 트랜잭션을 생성할 때, ExecuteType.BATCH로 생성하는 반면, Mybatis의 트랜잭션 생성 기본 전략은 ExecuteType.SIMPLE 인 것이 문제였다. 동일한 트랜잭션에서 ExecuteType을 변경하여 쿼리를..