새로운 삽질을 시작해봅시다.
WebFlux에서 일반적인 JDBC를 쓰면 block때문에 쓸 수 없던 걸로 기억하는데 R2DBC라는게 있다길래 한 번 써보려고 한다.
CREATE TABLE test.test_table (
id INT PRIMARY KEY AUTO_INCREMENT,
message TEXT,
created_at DATETIME DEFAULT NOW()
)
spring:
r2dbc:
url: r2dbc:mariadb://maria.db.server:port
username: some_user_name
password: some_user_password
name: test # Database Name
@Table("test_table")
class TestEntity {
var id: Int = 0
var message: String? = null
var createdAt: Timestamp? = null
}
@Repository
interface TestRepository : R2dbcRepository<TestEntity, Int>
@Service
class TestService(private val testRepository : TestRepository) {
fun findAll(start: Long, display: Long): Flux<TestEntity> {
return testRepository
.findAll(Sort.by(Sort.Order.by("created_at")).descending())
.skip(start)
.take(display)
}
// 귀찮으니 findAll만 작성
}
@Configuration
@EnableWebFlux
class WebConfig(private val testService: TestService) {
@Bean
fun router(): RouterFunctions<ServerResponse> {
return RouterFunctions.nest(
RequestPredicates.path("api"),
RouterFunctions.nest(
RequestPredicates.path("test"),
RouterFunctions.route(RequestPredicates.GET("")) { request ->
testService.findAll(
request.queryParam("start").orElse("0").toLong(),
request.queryParam("display").orElse("10").toLong()
)
.let {
ServerResponse
.ok()
.body(BodyInserters.fromPublisher(it, TestEntity::class.java))
}
}
)
)
}
}
이제 test_table에 몇 개 넣어보고 /api/test
를 호출해본다.
잘되네
끗.