반응형
Recent Posts
Recent Comments
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

Real Vectorism. 훨씬 더 입체적으로...

너무 늦은 R2DBC 학습 본문

Java (based by Spring Boot 2)

너무 늦은 R2DBC 학습

grast 2022. 8. 10. 15:48
반응형

최대한 간단하게. 단, 정석이라고는 안함. 즉, 책임 안짐

 

1. properties 정의

spring.r2dbc.url=r2dbc:mariadb://{domain}:{port}/{databases}
spring.r2dbc.username={database username}
spring.r2dbc.password={database password}

mariadb 사용 기준으로 저렇게 작성한다. 평소 사용하는 jdbc와는 달리 driverClassName 을 정의하지 않는데 이래도 되는지는 모르겠다.

프로토콜은 jdbc:mariadb:// 가 아닌 r2dbc:mariadb:// 로 지정해줘야 한다.

 

2. repository 인터페이스 정의

public interface SampleUserRepository extends R2dbcRepository<SampleUserDetails, Long> {}

끝이다(???) 정말로(......)

단, 평소 iBatis나 myBatis 등을 사용했을 때 사용자가 직접 서비스쿼리를 작성했던것과는 달리 R2DBC 에서는 전부 메소드가 인터페이스화 되어 있어 별개의 메소드를 추가하는것은 가능하지만 iBatis, myBatis 와는 다른 방법으로 추가해야 한다. 현재 비즈니스 서비스를 실제운영 환경에서 성공적으로 돌리고 있는 프로젝트들이 JPA로 넘어가기가 가장 꺼려지는 이유 중 하나가 아닐까 싶다. 기껏 작성한 쿼리들을 전부 버리는 것은 물론, 다중 서브쿼리처럼 엄청 복잡하게 작성한 쿼리를 순수히 자바 로직소스코드로 치환해서 다시 빌드를 해야하는 이유로 추정

 

단순한 기능만 사용하길 원한다면 CrudRepository

페이징처리와 정렬 기능이 포함된것을 사용하려면 PagingAndSortingRepository

JPA에 특화된 기능까지 포함해서 사용하려면 JpaRepository 를 사용하면 된다고 한다.

 

문제는...

 

R2dbcRepository 는 저 Repository 계층에 포함되지 않고 R2dbc 기능을 위해 처음부터 아예 새로 만든 리포지토리라고 한다. 따라서 호환이 되지 않는다는 이야기가 있다. 구체적으로 더 찾아봐야겠지만 아무래도 jpa와 r2dbc 간에 데이터베이스를 blocking 작업으로 점유해서 서로 공유할것 같지 않은 느낌이 쎄하게 든다.

 

R2dbcRepository 에는 주로 Save, Find 와 같이 기존에 사용했을것 같지 않은 JPA 쿼리모델들을 가지고 있다. 별도로 쿼리를 작성해서 사용하길 원한다면 다음과 같은 작업을 해줘야 한다.

 

public interface SampleUserRepository extends R2dbcRepository<UserDetails, Long> {
    @Query("""
    insert into tbl_user(`idx`, `username`, `password`, `mailaddr`) values (:idx, :username, :password, :mailaddr)
    """);
    Mono<Void> insert(UserDetails details);
}

""" (따옴표 3개)는 멀티라인 스트링을 위한 문법으로, Java 1.8 에서 지원되지 않는 기능이다.

 

쿼리를 직접 만들어서 사용할 수도 있지만 문제는 동적쿼리를 지원하지 않는 모양이다. :를 사용할 수도 있고 $를 사용하는 케이스의 문법도 몇번 봤는데 $는 아무래도 iBatis 나 myBatis 에서 썼던 그냥 통째로 바인딩하는 그 기능이 맞는듯 하다. (:를 사용하면 myBatis 기준 #{} 처럼 preparedStatement 처리를 해주는 문법인듯.)

 

동적쿼리가 지원되지 않는것 같으니 동적쿼리에 따른 쿼리분기는 아예 메소드를 통째로 하나 새로 작성해야할 듯 하다. 그리고 웹플럭스와 R2dbc의 사용일 경우에는 리턴값은 Mono 로 감싸진 형태로 전달되어야 한다. 애초에 R2dbcRepository를 구현해서 사용하게 될 경우 Save와 Find 등의 데이터 조회 결과는 모두 Mono로 씌워져서 반환된다.

반응형
Comments