Spring WebFlux - R2DBC

달달한단밤·2024년 11월 28일

Spring WebFlux

목록 보기
2/2

R2DBC란?

  • 관계형 DB에서 reactive programming을 가능하게 해주는 데이터베이스 접근 API
  • JDBCtive Streams를유사하게 데이터베이스와 애플리케이션 간의 연결을 관리하지만 Reactive Streams를 기반으로 동작하며 Non-Blocking I/O를 사용한다.

장점

  • Blocking programming일 때보다 높은 동시성이 요구되는 상황에서 더 좋은 성능을 낼 수 있다.
  • 동시성이 높아짐에 따라 MVC-JDBC를 사용하는 것보다 Latencty가 줄고 Throughput은 더 증가

단점

  • 모든 데이터베이스에 대한 드라이버가 제공되지 않는다.
  • 관련 레처런스 문서가 부족하다

Configurations

R2dbcConfig

  • @CreatedBy@CreatedDate@LastModifiedBy@LastModifiedDate annotation을 활성화
@Configuration
@EnableR2dbcAuditing 
public class R2dbcConfig {
}

Repository

MemberRepository

  • PK인 ID가 varchar라 회원 가입 시 입력한 ID로 PK값을 설정하려 했지만 ReactiveCrudRepository.save()에 PK값이 있으면 이미 생성된 객체로 받아들여 INSERT가 아니라 UPDATE 쿼리가 발생한다.
import com.example.webfluxtest.domain.member.model.Member;
import org.springframework.data.r2dbc.repository.Query;
import org.springframework.data.repository.reactive.ReactiveCrudRepository;
import org.springframework.stereotype.Repository;
import reactor.core.publisher.Mono;

@Repository
public interface MemberRepository extends ReactiveCrudRepository<Member, String> {
    @Query("INSERT INTO member (id, pass, name, create_at, update_at) VALUES (:id, :pass, :name, SYSDATE(), SYSDATE())")
    Mono<Void> saveMember(String id, String pass, String name);
}

BoardRepository

import com.example.webfluxtest.domain.board.model.Board;
import com.example.webfluxtest.domain.board.model.dto.BoardDto;
import org.springframework.data.r2dbc.repository.Query;
import org.springframework.data.repository.reactive.ReactiveCrudRepository;
import org.springframework.stereotype.Repository;
import reactor.core.publisher.Flux;

@Repository
public interface BoardRepository extends ReactiveCrudRepository<Board, Long> {
    @Query("""
            SELECT mb.member_id, b.title, b.content
            FROM board b
            JOIN member_board mb
            ON b.id = mb.board_id
            ORDER BY create_at DESC
           """)
    Flux<BoardDto> getBoards();
}

0개의 댓글