파란하늘의 지식창고
Published 2019. 12. 11. 09:19
Spring Data R2DBC 써보기 Study/Java
반응형

R2DBC 0.8.0.RELEASE 가 2019년 12월 01일에 나왔다. (R2DBC 0.8.0 goes GA)

RELEASE 버전은 처음 나온 것이고 기존엔 1.0.0.M5, 1.0.0.M6처럼 마일스톤 버전을 올리다가  M8부터 0.8.0.M8과 같이 major 버전을 하향했다.

이유는 SPI (Service Provider Interface)를 확정하지 못했기 때문이라고 한다. (R2DBC 0.8 Milestone 8 released 참고)

(즉 추후 변경될 소지가 있음)

이에 대응하는 Spring Data R2DBC도 2019년 12월 6일에 RELEASE 버전이 나왔다. (Spring Data R2DBC goes GA)

reference documentSpring Data R2DBC - Reference Documentation

이에 대응하는 Spring Boot는 아직 0.1.0.M3 버전이고 별도로 제공되며 (spring-boot-bom-r2dbc) experimental 딱지가 붙어있는 상태이다.

하여간 테스트할 수 있는 Spring Getting Started Content도 제공된다.

사용해보기

사용 방법은 기존 Spring Data JPA와 비슷하다.

pom.xml에 마일스톤 버전의 spring-boot-bom-r2dbc를 쓰기 위해 우선 milestone repository를 설정해준다.

<repositories>
    <repository>
        <id>spring-milestones</id>
        <name>Spring Milestones</name>
        <url>https://repo.spring.io/milestone</url>
    </repository>
</repositories>

spring-boot-bom-r2dbc를 dependencyManagement에 추가해준다.

 <dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot.experimental</groupId>
            <artifactId>spring-boot-bom-r2dbc</artifactId>
            <version>0.1.0.M3</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

data-r2dbc starter를 추가하고 사용할 r2dbc database를 추가한다.

현재  H2, MsSQL, MySql, PostgreSQL을 지원한다.

Spring Getting Started는 내장 database인 H2로 예제를 설명하는데 개인적으론 MySQL로 테스트를 해보았다.

<dependencies>
    <dependency>
        <groupId>org.springframework.boot.experimental</groupId>
        <artifactId>spring-boot-starter-data-r2dbc</artifactId>
    </dependency>
    <dependency>
        <groupId>dev.miku</groupId>
        <artifactId>r2dbc-mysql</artifactId>
    </dependency>
    
    <!-- (s) test dependency  -->
    <dependency>
        <groupId>org.springframework.boot.experimental</groupId>
        <artifactId>spring-boot-test-autoconfigure-r2dbc</artifactId>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>io.projectreactor</groupId>
        <artifactId>reactor-test</artifactId>
        <scope>test</scope>
    </dependency>
    <!-- (e) test dependency  -->
</dependencies>

테스트할 db 설정을 properties에 선언한다.

간단한 테스트기 때문에 multi database를 쓰는 경우를 가정하지 않고 spring이 제공하는 R2dbcProperties 설정을 해주었다.

여러 DB를 사용하고자 하는 경우 connectionFactory나 DatabaseClient를 별도 빈선언 처리하면 된다.

#spring.r2dbc.url=r2dbc:mysql://[아이디]:[비밀번호]@[호스트]:[port]/[database]
spring.r2dbc.url=r2dbc:mysql://root:root@127.0.0.1:3306/bookkeeping

autoConfiguration 설정은 다음과 같다.

@Configuration
@PropertySource("classpath:bookkeeping-r2dbc-${net-profile}.properties")
@EnableR2dbcRepositories(basePackages = "net.bluesky.bookkeeping.**.repository")
public class BookkeepingReactiveR2dbcConfiguration {

}

domain, repository를 만든다.

@Data
public class Bookkeeping {

	@Id
	private Long id;

	@NotBlank(groups = { Create.class, Update.class })
	private String name;

}

public interface BookkeepingRepository extends ReactiveCrudRepository<Bookkeeping, Long> {

}

적당히 테스트 코드를 만들어 호출하면 잘 동작한다.

지금 시점에 현업에 쓸 만한가?

아직 시기상조인 것 같다.

첫 번째로 Spring Data의 Repository에서 사용하는 query method를 아직 제대로 지원하지 않는다.

만약 위 Repository에 대해 다음과 같이 findByName method를 만들고 호출하면

public interface BookkeepingRepository extends ReactiveCrudRepository<Bookkeeping, Long> {

    Flux<Bookkeeping> findByName(String name);

}

다음과 같은 에러를 보게 된다.

Caused by: java.lang.UnsupportedOperationException: Query derivation not yet supported!

아직 지원을 안 하기 때문이며 현재는 임시로 @Query annotation을 사용하면 해당 문제는 일단 사용은 가능하다.

public interface BookkeepingRepository extends ReactiveCrudRepository<Bookkeeping, Long> {

    @Query("select * from bookkeeping where name = :name")
    Flux<Bookkeeping> findByName(String name);

}

두 번째로 아직 converter가 지원이 아직 많지 않다.

UUID 같은 타입을 사용하면 다음과 같은 에러를 보게 된다.

Caused by: org.springframework.core.convert.ConverterNotFoundException: No converter found capable of converting from type [java.nio.HeapByteBuffer] to type [java.util.UUID]

관련해서 Spring Data R2DBC 문서의 type mapping 부분을 보면 아직 지원하지 않아 Explicit Converter를 사용해야 하는 타입에 대한 열거가 있다.

Default Type Mapping

위 항목에 해당하는 타입은 모두 현재로서는 Explicit Converter를 만들어서 써야 한다.

Overriding Mapping with Explicit Converters

내용을 보니 성능을 위해 모든 conveter를 기본 제공하지 않는 방향으로 가는 것 같다.

설정은 하지 않더라도 기본 구현은 제공해주면 좋을거 같은데 그렇게 해줄지 모르겠다.

눈에 띄게 쓰지 못하는 부분은 위 두 가지였는데 아마 더 많은 부분들이 현재 모자란 상태일 것 같다.

Spring Data R2DBC는 아직 좀 더 시간이 흐른 뒤에 쓸만해지지 않을까 싶다.

반응형
profile

파란하늘의 지식창고

@Bluesky_

내용이 유익했다면 광고 배너를 클릭 해주세요