Skip to content

Commit 6a73f94

Browse files
authored
Merge pull request #3 from Team-Retrip/feature-01/batch
Spring Batch와 Es 연동
2 parents e77b262 + d738f3a commit 6a73f94

17 files changed

Lines changed: 269 additions & 18 deletions

File tree

build.gradle.kts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,14 +35,15 @@ dependencies {
3535
implementation("org.springdoc:springdoc-openapi-starter-webmvc-api:2.8.5")
3636
implementation("org.springdoc:springdoc-openapi-starter-webmvc-ui:2.8.5")
3737
implementation("com.querydsl:querydsl-jpa:5.1.0:jakarta")
38+
3839
kapt("com.querydsl:querydsl-apt:5.1.0:jakarta") // annotationProcessor → kapt로 변경
3940

4041
implementation("com.fasterxml.jackson.module:jackson-module-kotlin")
4142
implementation("org.jetbrains.kotlin:kotlin-reflect")
42-
implementation("com.h2database:h2")
43+
runtimeOnly("com.mysql:mysql-connector-j")
4344
compileOnly("org.projectlombok:lombok")
4445
annotationProcessor("org.projectlombok:lombok")
45-
46+
testImplementation("org.springframework.batch:spring-batch-test")
4647
testImplementation("org.springframework.boot:spring-boot-starter-test")
4748
testImplementation("org.jetbrains.kotlin:kotlin-test-junit5")
4849
testRuntimeOnly("org.junit.platform:junit-platform-launcher")

src/main/kotlin/com/retrip/map/MapApplication.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import org.springframework.boot.autoconfigure.SpringBootApplication
44
import org.springframework.boot.runApplication
55

66
@SpringBootApplication
7-
class MapApplication
7+
class MapApplication()
88

99
fun main(args: Array<String>) {
1010
runApplication<MapApplication>(*args)
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package com.retrip.map.application.`in`.service
2+
3+
import com.retrip.map.application.`in`.usecase.LocationIndexUseCase
4+
import com.retrip.map.application.out.repository.LocationElasticRepository
5+
import com.retrip.map.infra.adapter.out.search.elasticsearch.entity.LocationDocument
6+
import org.springframework.stereotype.Service
7+
import org.springframework.transaction.annotation.Transactional
8+
9+
@Service
10+
@Transactional
11+
class LocationIndexService(
12+
private val locationElasticRepository: LocationElasticRepository
13+
) : LocationIndexUseCase {
14+
override fun indexLocationDocuments(documents: List<LocationDocument>?) {
15+
documents?.let { locationElasticRepository.saveAll(it) }
16+
}
17+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package com.retrip.map.application.`in`.usecase
2+
3+
import com.retrip.map.infra.adapter.out.search.elasticsearch.entity.LocationDocument
4+
5+
interface LocationIndexUseCase {
6+
fun indexLocationDocuments(documents: List<LocationDocument>?)
7+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package com.retrip.map.application.out.repository
2+
3+
import com.retrip.map.infra.adapter.out.search.elasticsearch.entity.LocationDocument
4+
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository
5+
import org.springframework.stereotype.Repository
6+
import java.util.UUID
7+
8+
@Repository
9+
interface LocationElasticRepository: ElasticsearchRepository<LocationDocument, UUID> {
10+
11+
}
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
11
package com.retrip.map.application.out.repository
22

33
import com.retrip.map.application.`in`.response.LocationResponse
4+
import com.retrip.map.domain.entity.Location
45
import org.springframework.data.domain.Page
56
import org.springframework.data.domain.Pageable
7+
import java.time.LocalDate
68
import java.util.UUID
79

810
interface LocationQueryRepository {
911
fun findLocations(id: UUID?, page: Pageable): Page<LocationResponse>
12+
fun findLocationsByEditedAt( editedAt: LocalDate): List<Location>
1013
}

src/main/kotlin/com/retrip/map/domain/entity/Location.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,15 @@ import jakarta.persistence.Column
99
import jakarta.persistence.Embedded
1010
import jakarta.persistence.Entity
1111
import jakarta.persistence.Id
12+
import jakarta.persistence.Table
1213
import jakarta.persistence.Version
1314
import lombok.AccessLevel
1415
import lombok.NoArgsConstructor
1516
import lombok.Setter
1617
import java.util.*
1718

1819
@Entity
20+
@Table(name = "location")
1921
@NoArgsConstructor(access = AccessLevel.PROTECTED)
2022
@Setter(value = AccessLevel.PROTECTED)
2123
class Location(

src/main/kotlin/com/retrip/map/infra/adapter/in/batch/DestinationReader.kt

Lines changed: 0 additions & 14 deletions
This file was deleted.
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
package com.retrip.map.infra.adapter.`in`.batch
2+
3+
import com.retrip.map.domain.entity.Location
4+
import com.retrip.map.infra.adapter.out.search.elasticsearch.entity.LocationDocument
5+
import org.springframework.batch.core.Job
6+
import org.springframework.batch.core.Step
7+
import org.springframework.batch.core.configuration.annotation.EnableBatchProcessing
8+
import org.springframework.batch.core.job.builder.JobBuilder
9+
import org.springframework.batch.core.repository.JobRepository
10+
import org.springframework.batch.core.step.builder.StepBuilder
11+
import org.springframework.beans.factory.annotation.Value
12+
import org.springframework.context.annotation.Bean
13+
import org.springframework.context.annotation.Configuration
14+
import org.springframework.transaction.PlatformTransactionManager
15+
16+
@Configuration
17+
//@EnableBatchProcessing
18+
class MapBatchConfig(
19+
@Value("\${spring.batch.job.name}")
20+
private val jobName: String,
21+
private val reader: MapReader,
22+
private val processor: MapProcessor,
23+
private val writer: MapWriter,
24+
) {
25+
26+
@Bean
27+
fun mapJob(
28+
jobRepository: JobRepository,
29+
mapStep: Step
30+
): Job {
31+
return JobBuilder(jobName, jobRepository)
32+
.start(mapStep)
33+
.build()
34+
35+
}
36+
37+
@Bean
38+
fun mapStep(
39+
jobRepository: JobRepository,
40+
transactionManager: PlatformTransactionManager
41+
): Step {
42+
return StepBuilder("map-step", jobRepository)
43+
.chunk<List<Location>, List<LocationDocument>>(10, transactionManager)
44+
.reader(reader)
45+
.processor(processor)
46+
.writer(writer)
47+
.build()
48+
}
49+
50+
51+
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package com.retrip.map.infra.adapter.`in`.batch
2+
3+
import com.retrip.map.domain.entity.Location
4+
import com.retrip.map.infra.adapter.out.search.elasticsearch.entity.LocationDocument
5+
import org.springframework.batch.item.ItemProcessor
6+
import org.springframework.stereotype.Component
7+
8+
@Component
9+
class MapProcessor()
10+
: ItemProcessor<List<Location>, List<LocationDocument>> {
11+
override fun process(item: List<Location>): List<LocationDocument>? {
12+
return item.map { LocationDocument.of(it) }
13+
14+
}
15+
}

0 commit comments

Comments
 (0)