자동 설정 · 조건 · 소유권

Spring Boot Exposed 활성화와 소유권

JDBC 활성화는 Spring의 DataSource에 Exposed를 연결하고, 정해진 이름의 트랜잭션 관리자를 조건부로 제공합니다. R2DBC 활성화는 의도적으로 더 얇습니다. 풀과 R2dbcDatabase, 트랜잭션 범위, 종료 절차는 여전히 애플리케이션이 맡습니다.

01

소유권부터 확인

JPA 자동 설정의 전제를 Exposed에 그대로 적용하지 마세요

JPA / Hibernate

관례 중심으로 조립되는 영속성 계층

DataSource → EntityManagerFactory → JpaTransactionManager → JPA 저장소 프록시

Spring Boot가 JPA 공급자를 중심으로 익숙하고 통합된 영속성 경로를 구성할 수 있습니다.

영속성 컨텍스트의 상태, 변경 감지, 트랜잭션 가로채기가 프로그래밍 방식에 포함됩니다.

JetBrains Exposed

의도적으로 범위를 제한한 연동

JDBC: DataSource → Database.connect → 이름 있는 관리자 · R2DBC: 매핑 + 저장소 팩터리

SQL과 데이터베이스 객체, Coroutine 트랜잭션 경계를 애플리케이션 설계에 분명히 드러낼 수 있습니다.

R2DBC 기반 객체와 여러 호출의 원자성은 추론되는 기본값이 아니라 애플리케이션의 책임입니다.

02

원본 아키텍처

JDBC와 R2DBC 활성화 경로를 나란히 읽으세요

두 모듈은 저장소 탐색과 매핑 개념을 공유하지만 같은 기반 객체를 소유하지는 않습니다. 각 원본 다이어그램을 열면 전체 크기로 확인할 수 있습니다.

JDBC · 컨테이너에 참여하는 경로 DataSource가 있어야 이름 있는 트랜잭션 관리자를 추가할 수 있습니다.
애플리케이션, Spring Boot, Exposed 매핑, 데이터베이스 연결, 트랜잭션 관리자 소유권을 보여 주는 JDBC 자동 설정 아키텍처
JDBC · 컨테이너에 참여하는 경로
애플리케이션, Spring Boot, Exposed 매핑, 데이터베이스 연결, 트랜잭션 관리자 소유권을 보여 주는 JDBC 자동 설정 아키텍처
R2DBC · 애플리케이션 소유 경로 매핑은 제공하지만 풀과 R2dbcDatabase는 제공하지 않습니다.
애플리케이션 소유 풀과 R2dbcDatabase, Spring 매핑, 저장소 탐색을 보여 주는 R2DBC 자동 설정 아키텍처
R2DBC · 애플리케이션 소유 경로
애플리케이션 소유 풀과 R2dbcDatabase, Spring 매핑, 저장소 탐색을 보여 주는 R2DBC 자동 설정 아키텍처
03

조건 실험실

조건 하나를 바꾸고 결과 빈 구성을 확인하세요

각 시나리오는 Spring이 평가하는 항목과 애플리케이션이 계속 제공해야 하는 항목을 구분합니다. 선택한 카드는 조건·결과 원장과 시퀀스 다이어그램을 함께 바꿉니다.

조건 평가

  1. 충족
    Classpath에 EntityClass 있음

    자동 설정 클래스가 활성화 대상이 됩니다.

  2. 충족
    DataSource 빈 있음

    이름 있는 트랜잭션 관리자 메서드를 실행할 수 있습니다.

  3. 없음
    springTransactionManager 이름의 빈 없음

    JDBC 자동 설정이 후퇴하지 않습니다.

최종 소유권

  1. 생성
    ExposedMappingContext 생성

    Spring Data가 Exposed 엔티티를 해석할 수 있습니다.

  2. 생성
    Database.connect(DataSource) 호출

    Exposed JDBC가 애플리케이션 DataSource에 연결됩니다.

  3. 생성
    이름 있는 관리자 생성

    저장소 프록시는 기본으로 springTransactionManager를 사용합니다.

04

호출 → 평가 → 결과

활성화 시퀀스: 애플리케이션 입력에서 시작해 프레임워크 결과로 끝남

생성됨

JDBC 준비 완료

DataSource가 있고 기본 관리자 이름을 사용 중인 빈이 없으므로 JDBC 연동이 전체 빈 구성을 추가할 수 있습니다.

경계 소유자
Spring Boot가 추가하고 애플리케이션이 DataSource 소유
애플리케이션 설정
Spring Boot
조건 평가
Exposed JDBC 연동
  1. 1 호출 DataSource 제공 및 저장소 활성화
  2. 2 호출 클래스·빈·이름 조건 평가
  3. 3 생성 매핑과 이름 있는 관리자 생성
  4. 4 반환 연결된 JDBC 저장소 제공
생성됨 매핑 컨텍스트, Exposed 데이터베이스 연결, 이름 있는 관리자를 사용할 수 있습니다.
05

소유권

빈과 생명주기의 소유권은 JDBC와 R2DBC가 다릅니다

관심사JDBC 경로R2DBC 경로운영 결과
저장소 탐색@EnableExposedJdbcRepositories@EnableExposedR2dbcRepositories두 경로 모두 애플리케이션이 패키지 경계를 정합니다.
매핑 컨텍스트EntityClass가 있으면 생성기존 빈이 없을 때만 생성R2DBC 경로에서는 사용자 정의 ExposedMappingContext가 우선합니다.
데이터베이스 객체관리자 생성 시 Database.connect(DataSource)애플리케이션이 R2dbcDatabase 생성R2DBC 시작과 종료 절차는 명시적으로 남습니다.
트랜잭션 관리자springTransactionManager라는 이름이 없을 때만 생성ReactiveTransactionManager를 제공하지 않음JDBC 프록시 연결은 이름에 민감하고, R2DBC는 Exposed Coroutine 트랜잭션을 사용합니다.
여러 호출의 원자성Spring 서비스 트랜잭션으로 묶을 수 있음하나의 suspendTransaction으로 묶음저장소 탐색은 비즈니스 트랜잭션 경계를 정하지 않습니다.
06

구성 레시피

의도별 최소 구성

의도애플리케이션이 제공활성화·연결검증
기본 JDBCDataSource@EnableExposedJdbcRepositoriesspringTransactionManager 빈과 두 저장소 호출의 롤백을 확인합니다.
사용자 정의 JDBC 관리자이름 있는 PlatformTransactionManagertransactionManagerRef = "ordersTransactionManager"생성된 저장소 정의가 정확히 그 이름을 가리키는지 확인합니다.
Coroutine R2DBCConnectionPool, R2dbcDatabase, 생명주기@EnableExposedR2dbcRepositories관련 작업을 하나의 명시적인 suspendTransaction이 소유하는지 확인합니다.
JDBC + R2DBC두 기반 객체 집합저장소 패키지 분리매핑 컨텍스트가 하나이고 저장소 인터페이스가 모호하지 않은지 확인합니다.
07

실패 진단

증상이 아니라 충족되지 않은 조건에서 진단을 시작하세요

증상의심할 경계확인할 항목해결
Exposed 빈이 없음EntityClass 부재Classpath와 조건 평가 보고서해당 Exposed DAO·core 의존성을 추가하거나 연동을 제거합니다.
JDBC 저장소가 관리자를 찾지 못함빈 이름 불일치transactionManagerRef와 빈 이름참조한 이름과 정확히 같은 빈을 제공하거나 기본 이름을 사용합니다.
R2DBC 저장소는 시작하지만 DB 접근 실패기반 객체 미생성풀과 R2dbcDatabase 초기화애플리케이션이 기반 객체를 만들고 등록하며 종료합니다.
두 호출이 따로 커밋됨저장소 메서드마다 경계를 생성서비스 호출 구조관련 작업을 하나의 Spring 트랜잭션이나 suspendTransaction으로 옮깁니다.
예상과 다른 매핑 동작사용자 정의 컨텍스트로 자동 설정 후퇴ExposedMappingContext의도한 컨텍스트 하나만 두고 엔티티 해석을 테스트합니다.
08

선택 기준

원하는 소유권 방식에 맞춰 연동을 선택하세요

판단JDBC 연동이 적합한 경우R2DBC 연동이 적합한 경우추정하면 안 되는 것
실행 방식요청 경로가 블로킹이고 Spring 트랜잭션 가로채기가 필요합니다.전체 경로가 Coroutine·논블로킹이고 명시적인 suspend 실행이 필요합니다.웹 프레임워크 이름만으로 드라이버 방식을 결정합니다.
기반 객체Spring 관리 DataSource가 이미 안정적인 경계입니다.애플리케이션이 풀, R2dbcDatabase, 준비 상태, 종료를 관리할 수 있습니다.R2DBC 자동 설정이 이 객체들을 만듭니다.
트랜잭션 조합여러 저장소를 서비스 트랜잭션에 참여시켜야 합니다.관련 작업을 하나의 명시적인 Coroutine 트랜잭션으로 표현할 수 있습니다.활성화 애노테이션이 비즈니스 원자성을 만듭니다.
사용자 정의이름 있는 관리자를 명시적으로 연결하고 테스트할 수 있습니다.명시적인 팩터리와 데이터베이스 객체를 애플리케이션 코드로 관리할 수 있습니다.선언만 되고 실제로 쓰이지 않는 애노테이션 속성이 런타임을 바꿉니다.
09

검증 근거

모든 주장은 운영 코드와 집중 테스트로 추적할 수 있습니다

주장 근거 파일
JDBC 활성화는 EntityClass 조건을 확인하고 매핑 빈과 이름 조건이 있는 관리자를 제공합니다.
JDBC 관리자 경로는 Exposed를 애플리케이션 DataSource에 연결합니다.
JDBC 저장소 탐색은 등록기와 JDBC 자동 설정을 가져옵니다.
JDBC 확장은 transactionManagerRef를 생성된 저장소 팩터리 빈에 전달합니다.
JDBC 저장소는 Spring Data 트랜잭션 팩터리 지원을 통해 참여합니다.
R2DBC 자동 설정은 JDBC 단계 이후 누락된 매핑 컨텍스트만 제공합니다.
R2DBC 저장소 탐색은 활성화 애노테이션과 등록기를 통해 명시적으로 시작합니다.
R2DBC 확장은 suspend와 Flow 저장소 메서드를 허용하지만 transactionManagerRef를 사용하지 않습니다.
R2DBC 저장소는 Spring 트랜잭션 가로채기 대신 일반 팩터리 지원과 Exposed suspend 트랜잭션을 사용합니다.
한·영 매뉴얼은 JDBC·R2DBC 기반 객체와 트랜잭션 소유권 경계를 기록합니다.
선택한 활성화 시나리오: