
Spring Boot와 JPA로 시작하는 데이터베이스 멀티테넌시
두줄요약
Hibernate 멀티테넌시로 행·스키마·DB 분리와 테넌트별 조회 흐름을 설명했습니다.\n세션 경계, 네이티브 SQL, 커넥션 풀 운영 시 주의점을 정리했습니다.
문제 상황
- Repository 메서드마다 반복되는 테넌트 조건과 누락 시 타 테넌트 데이터 조회·수정·삭제 위험
- 행·스키마·DB 분리 방식별 테넌트 데이터 격리 지점의 차이
구조와 흐름
- 요청 헤더의 테넌트 ID를
ScopedValue기반TenantContext에 요청 범위로 바인딩 CurrentTenantIdentifierResolver가 세션 생성 시점의 테넌트 ID 제공- 행 분리는 SQL 조건, 스키마 분리는
Connection.setSchema(), DB 분리는 테넌트별DataSource선택
해결 방법
- Hibernate
@TenantId로 엔티티 저장 시 테넌트 ID 설정 및 JPQL 기반 조회 조건 자동 적용 TenantSchemaMapper로 테넌트별 스키마 매핑,MultiTenantConnectionProvider로 테넌트별 커넥션 풀 라우팅- 동일한 엔티티·Repository·서비스 코드에서 설정 기반으로 스키마 분리와 DB 분리 전환
주의할 점
- 네이티브 SQL에는
@TenantId조건 미적용 - 테넌트 전환 시 새 세션 필요, 기존 트랜잭션이나 OSIV 세션 재사용 시 조회 대상 미변경
- 테넌트별 권한 검증, 커넥션 풀 총량, 스키마·DB 생성과 마이그레이션·백업 절차 고려


