
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();
}