728x90
@Bean
@StepScope
fun synchronizedReader(@Value("#{jobParameters[date]}") date: String?): JpaPagingItemReader<Entity> {
val baseDate = LocalDate.parse(date.substring(0, 10))
val threshold = baseDate.minusDays(400)
return JpaPagingItemReaderBuilder<Bill>()
.name("billReader")
.entityManagerFactory(entityManagerFactory)
.queryString("SQL Query")
.parameterValues(mapOf("threshold" to threshold))
.pageSize(1000)
.saveState(false)
.build()
}
private val entityManagerFactory: EntityManagerFactory,
entityManagerFactory 에 기본 entityManagerFactory 가 들어가서 writer DB 로 조회 요청을 보낼 것이다.
우선 writerDB 와 readOnlyDB 가 구성 되어 있다는 가정을 한다.
구성 방법은 아래 링크에 있음 !
https://soobysu.tistory.com/222
[spring] read , write 분리하기 (DB Replication)
problem배치서버(On Prem)와 운영서버(AWS)가 있다.배치서버에서는 RDS 에서 데이터의 중복을 확인하는 구문 들이 포함 되어있다.RDS 는 데이터 삽입에는 돈이 들지 않지만, 조회시 요금이 청구되는 구
soobysu.tistory.com
1. config 구성
@Configuration
@Profile("prod","develop")
class ReadOnlyJpaConfig(
private val builder: EntityManagerFactoryBuilder
){
@Bean
fun readEntityManagerFactory(
@Qualifier("readerDataSource") readerDataSource: DataSource
): LocalContainerEntityManagerFactoryBean {
return builder
.dataSource(readerDataSource)
.packages("com.ex.pakage")
.persistenceUnit("read")
.build()
}
@Primary
@Bean(name = ["entityManagerFactory"])
fun defaultEmf( dataSource: DataSource): LocalContainerEntityManagerFactoryBean {
return builder
.dataSource(dataSource)
.packages("com.ex.pakage")
.persistenceUnit("default")
.build()
}
}
readOnly DB 의 datasource 를 포함한 LocalContainerEntityManagerFactoryBean 를 만들어 준다.
defaultEmf 를 만들어 준 이유는 gradle 빌드시 test 환경에서 붙여줄 EntityManagerFactory 이다.
2. 적용하기
@Configuration
class BillDetailStep(
private val transactionManager: PlatformTransactionManager,
private val jobRepository: JobRepository,
private val defaultEntityManagerFactory: EntityManagerFactory,
) {
fun entityManagerFactoryToUse(): EntityManagerFactory {
return entityManagerFactory ?: defaultEntityManagerFactory
}
@Qualifier("readEntityManagerFactory")
@Autowired(required = false)
var readEntityManagerFactory: EntityManagerFactory? = null
application 초기화 시 defaultEntityManagerFactory 기본 entityManager 로 초기화 해준다.
해당 batch 의 step 에서 entityManager 를 사용할때 readEntityManagerFactory 를 불러와서 ItemReader 에서 불러서 사용해준다.
@Bean
@StepScope
fun synchronizedReader(@Value("#{jobParameters[date]}") date: String?): JpaPagingItemReader<Entity> {
val baseDate = LocalDate.parse(date.substring(0, 10))
val threshold = baseDate.minusDays(400)
// 여기서 생성해서 불러준다.
val emf = entityManagerFactoryToUse()
return JpaPagingItemReaderBuilder<Bill>()
.name("billReader")
// 생성한 entityManagerFactory 사용
.entityManagerFactory(emf)
.queryString("SQL Query")
.parameterValues(mapOf("threshold" to threshold))
.pageSize(1000)
.saveState(false)
.build()
}
728x90
'개-발 > Java + Spring + Kotlin' 카테고리의 다른 글
| [Spring] Apple 소셜 로그인 구현 (f.Expo) (0) | 2025.12.17 |
|---|---|
| [Spring] chatGpt api 연동 (0) | 2025.09.18 |
| [spring] React Native FCM 푸시 알림 구현 (f.Kotlin) (0) | 2025.08.20 |
| [Spring] storekit2 / expo 인 앱 아이템 구매 확인 구현 3 (AOS) (0) | 2025.08.07 |
| [Spring] storekit2 / expo 인 앱 아이템 구매 확인 구현 2 (IOS) (2) | 2025.08.07 |