NodeJS에서 Spring 전환하기 4

장달진·2024년 4월 23일

R2DBC 사용해보기


시작하기전

webflux를 사용해보려했는데 RxJava부터 나온다! 아마도 RxJs랑 동일할거라고 생각한다. 리액티브가 거기서 거기겠지 🤔

의존성 추가

implementation("org.springframework.boot:spring-boot-starter-data-r2dbc")
runtimeOnly("io.r2dbc:r2dbc-h2")

H2로 예시가 나와서 진행해보자! H2가 100% 다 리액티브를 지원하는 것이 아니라고 적혀있다.

application.properties

//JPA
spring.jpa.hibernate.ddl-auto=create-drop
spring.datasource.url=jdbc:h2:mem:local
spring.datasource.username=sa
spring.datasource.password=
spring.datasource.driver-class-name=org.h2.Driver

//R2DBC
spring.r2dbc.url=r2dbc:h2:mem:///local
spring.r2dbc.username=sa
spring.r2dbc.password=

이것때문에 2시간을 삽질했다.

첫번째로는 JPA와 R2DBC의 형식이 달랐다. Invali URL부터 해서 뭘 해도 데이터베이스가 없다. 테이블이 없다 난리난리 힘들었다...

두번째로는 spring.jpa.hibernate.ddl-auto=create-drop이 부분이 작동하지 않았다. 직접 resource/schema.sql를 만들어줘야했다.

//schema.sql
CREATE TABLE coffee (
  id varchar(255) PRIMARY KEY,
  name varchar(255) DEFAULT NULL
);

R2dbcRepository

interface CoffeeRepository : R2dbcRepository<Coffee, String>

Repository를 CrudRepository에서 R2dbcRepository로 변경해줘야 했다.
책에는 ReactiveCrudRepository 사용하라고 나와있는데 실행하면 에러난다.

H2R2dbcConfig

@Configuration
class H2R2dbcConfig {
    @Bean
    fun init(coffeeRepository: CoffeeRepository): CommandLineRunner {
        return CommandLineRunner {
            coffeeRepository.saveAll(
                listOf(
                    Coffee("Espresso"),
                    Coffee("Cafe Latte")
                )
            ).thenMany(coffeeRepository.findAll())
                .subscribe(System.out::println)
        }
    }
}

빈 초기화시 기초 데이터를 밀어 넣는 코드이다. thenMany를 보는순간 Promise가 생각났다. 으악! subscribe를 보니까 RxJS와 코드가 동일할 것으로 보인다.

Controller는 다음 시간에 해야겠다 시간이 너무 늦었다. 내일 회사에서 빌빌거리겠다...

[오늘의 결론]
Webflux 시작부터 삐그덕거리는데 이게 맞나 무섭다..

profile
아무것도 모르는 개발자

0개의 댓글