JDK11, Gradle, Kotlin 1.6.21, Springboot2.7.6, Mysql 5.7, R2DBC(jasync-sql)
implementation("org.springframework.boot:spring-boot-starter-data-r2dbc")
implementation("org.springframework.boot:spring-boot-starter-webflux")
implementation("com.fasterxml.jackson.module:jackson-module-kotlin")
implementation("io.projectreactor.kotlin:reactor-kotlin-extensions")
implementation("org.jetbrains.kotlin:kotlin-reflect")
implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8")
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-reactor")
implementation("com.github.jasync-sql:jasync-r2dbc-mysql:2.1.7")
developmentOnly("org.springframework.boot:spring-boot-devtools")
annotationProcessor("org.springframework.boot:spring-boot-configuration-processor")
testImplementation("org.springframework.boot:spring-boot-starter-test")
testImplementation("io.projectreactor:reactor-test")
r2dbc 구현체로 jasync-sql 을 사용한 이유는 dev.miku는 2020년 이후로 버전업이 중단된 반면에 jasync-sql 은 지금도 계속 버전업 중이라 jasync-sql을 선택했다.
spring:
r2dbc:
url: r2dbc:mysql://localhost:3306
name: example
username: test
password: test
enabled: true
pool:
initial-size: 2
max-size: 8
validation-query: select 1
data:
r2dbc:
repositories:
enabled: true
data.r2dbc.repositories.enabled: true 이 옵션은 application.yaml 대신에 Applcation 클래스 파일에 @EnableR2dbcRepositories 를 선언하는 방식으로도 설정 가능하다.
@Table(value = "member")
class Member(
@Id
var memberId: Long,
var name: String
)
@Repository
interface MemberRepository: R2dbcRepository<Member, Long>
다른 예제들을 찾아봤을때 ReactiveCrudRepository 를 상속받는 예제도 많이 보였는데 어차피
R2dbcRepository 가 ReactiveCrudRepository 상속받는 interface 이기 때문에 R2dbcRepository를 상속받도록 MemberRepository를 선언했다.
@Service
class MemberService(
private val memberRepository: MemberRepository
) {
fun getMembers(): Flux<Member> {
return memberRepository.findAll()
}
}
심플하게 memberRepositry에서 findAll 을 호출해서 바로 리턴하도록 했다.
@RestController
class MemberController(
private val memberService: MemberService
) {
@GetMapping("/apis/members")
fun getMembers(): Flux<Member> {
return memberService.getMembers()
}
}
[
{
"memberId": 1,
"name": "회원1"
},
{
"memberId": 2,
"name": "회원2"
}
]
Postman을 이용해서 호출하면 위와 같은 형태의 JSON 응답을 받을수 있다.