프로젝트 기본세팅

지능바바·2022년 11월 30일
0

springboot+webflux

목록 보기
1/2

스펙

JDK11, Gradle, Kotlin 1.6.21, Springboot2.7.6, Mysql 5.7, R2DBC(jasync-sql)

코드 작성

1. Gradle Depencencies 세팅

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을 선택했다.

2. application.yaml 세팅

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 를 선언하는 방식으로도 설정 가능하다.

3. 비지니스 코드작성

  • Entity 코드
@Table(value = "member")
class Member(
    @Id
    var memberId: Long,
    var name: String
)
  • Repository 코드
@Repository
interface MemberRepository: R2dbcRepository<Member, Long>

다른 예제들을 찾아봤을때 ReactiveCrudRepository 를 상속받는 예제도 많이 보였는데 어차피
R2dbcRepository 가 ReactiveCrudRepository 상속받는 interface 이기 때문에 R2dbcRepository를 상속받도록 MemberRepository를 선언했다.

  • Service 코드
@Service
class MemberService(
    private val memberRepository: MemberRepository
) {

    fun getMembers(): Flux<Member> {
        return memberRepository.findAll()
    }
}

심플하게 memberRepositry에서 findAll 을 호출해서 바로 리턴하도록 했다.

  • Contrtoller 코드
@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 응답을 받을수 있다.

0개의 댓글