격리 방식
플랫폼이 공유하는 데이터를 제외하면 모든 비즈니스 테이블에는 tenant_id 열이 있습니다. 요청이 들어오면 필터 체인이 로그인한 계정의 테넌트를 현재 스레드에 바인딩하고, Hibernate의 테넌트 필터가 자동으로 쿼리에 테넌트 조건을 추가하며, 쓸 때는 tenant_id를 자동으로 채웁니다. 비즈니스 코드는 테넌트 조건을 "잊어버릴" 수 없습니다.
테넌트를 넘나들어야 하는 몇 가지 경우(예: 로그인 시 사용자 이름으로 계정을 찾기, 테넌트별 계정 수 세기, 백그라운드 예약 작업)는 반드시 명시적으로 "시스템 컨텍스트"에 들어가야 하므로, 코드 리뷰에서 한눈에 찾을 수 있습니다.
공유와 독립
| 플랫폼 공유 | 테넌트별 독립 |
|---|---|
| 애플리케이션과 리소스 카탈로그, API 카탈로그, OAuth 클라이언트, 플러그인 | 계정, 부서, 사용자 그룹, 직위, 역할, 권한 부여, 배정, 데이터와 필드 정책, 직무 분리, 요청과 검토, 신원 소스, 데이터 서비스, 감사 |
사용자 이름은 플랫폼 전체에서 유일하므로, 로그인할 때 테넌트를 선택할 필요가 없습니다.
플랫폼 테넌트
플랫폼 테넌트는 초기화 시 생성되며 비활성화할 수 없습니다. 이 테넌트의 관리자는 플랫폼이 공유하는 데이터와 다른 테넌트를 관리하며, 플랫폼 테넌트의 역할만 "전체 테넌트" 데이터 범위를 사용할 수 있습니다.
ID
모든 기본 키는 TSID입니다. 64비트, 시간 순서대로 증가하며, 클러스터 안에서는 노드 번호로 유일성이 보장됩니다. TSID는 JavaScript가 정확히 나타낼 수 있는 정수보다 크므로, JSON에서는 항상 문자열로 전달합니다. 클러스터의 각 인스턴스는 서로 다른 GRANTFORGE_ID_NODE가 필요합니다.
