본문으로 건너뛰기

public 스키마

목적

public 스키마에는 세 종류의 테이블이 섞여 있습니다.

  • tenants, tenant_settings 같은 플랫폼 소유 제어 평면 테이블
  • users, staff, classes, exams 같은 tenant 범위 제품 테이블
  • event_publication, shedlock, idempotency_keys 같은 운영 지원 테이블

이 페이지는 이들 계열 사이의 경계에 대한 reference 문서입니다. 스키마의 모든 테이블을 나열하기보다 지속적인 소유권과 RLS 의미에 집중해 ERD를 유지합니다.

소스 경로

경로역할
lumie-backend/app/src/main/resources/db/migration/public/V1__create_platform_tables.sqltenants, tenant_settings
lumie-backend/app/src/main/resources/db/migration/public/V18__rls_baseline.sqlbaseline tenant 범위 도메인 테이블과 FK 관계
lumie-backend/app/src/main/resources/db/migration/public/V26__rename_admin_tables_to_staff.sqladminsstaff로, admin_permissionsstaff_permissions로 이름 변경
lumie-backend/app/src/main/resources/db/migration/public/V13__create_event_publication.sqlSpring Modulith event publication 테이블
lumie-backend/app/src/main/resources/db/migration/public/V14__create_shedlock.sql스케줄 작업 lock 테이블
lumie-backend/app/src/main/resources/db/migration/public/V16__create_idempotency_keys.sqlidempotency 테이블
lumie-backend/libs/common/src/main/java/com/lumie/common/domain/TenantScopedEntity.javatenant 범위 행에 tenant_id를 제공하는 JPA base class

경계 ERD

이 다이어그램은 의도적으로 tenants -> tenant table hard edge를 그리지 않습니다. baseline migration은 모든 tenant 범위 테이블에 대해 tenants(id)로 향하는 FK 대신 tenant_id와 RLS를 사용해 tenant 소유권을 구현합니다.

운영 지원 테이블

event_publication, shedlock, idempotency_keys는 같은 스키마에 있지만 tenant-domain ERD의 일부는 아닙니다.

  • event_publication은 Spring Modulith publication 상태를 저장하며 tenant-domain 관계를 갖지 않습니다.
  • shedlock은 스케줄 작업 lock을 조정합니다.
  • idempotency_keystenant_slug, endpoint_path, idempotency_key를 기준으로 요청 재실행 방지를 저장합니다.

RLS 경계

런타임 계약은 백엔드 코드가 app.tenant_id를 설정한 뒤에만 tenant 범위 접근이 이뤄진다는 점입니다. tenant 컨텍스트가 없을 때는 cross-tenant 접근으로 조용히 fallback되면 안 됩니다.

tenant 범위 엔티티를 뒷받침하는 JPA base class도 이 계약을 코드에 드러냅니다.

@MappedSuperclass
public abstract class TenantScopedEntity extends BaseEntity {
@Column(name = "tenant_id", nullable = false, updatable = false)
private Long tenantId;
}

검증

cd /path/to/Lumie
rg -n "CREATE TABLE (admins|users|students|classes|exams)|CREATE TABLE IF NOT EXISTS event_publication|CREATE TABLE IF NOT EXISTS shedlock|CREATE TABLE idempotency_keys" \
lumie-backend/app/src/main/resources/db/migration/public/V18__rls_baseline.sql \
lumie-backend/app/src/main/resources/db/migration/public/V13__create_event_publication.sql \
lumie-backend/app/src/main/resources/db/migration/public/V14__create_shedlock.sql \
lumie-backend/app/src/main/resources/db/migration/public/V16__create_idempotency_keys.sql

예상 성공 신호: baseline tenant 테이블에 대한 검색 결과와 event_publication, shedlock, idempotency_keys에 대한 별도 검색 결과가 모두 나타납니다.

cd /path/to/Lumie
rg -n "ALTER TABLE admins RENAME TO staff|ALTER TABLE admin_permissions RENAME TO staff_permissions" \
lumie-backend/app/src/main/resources/db/migration/public/V26__rename_admin_tables_to_staff.sql

예상 성공 신호: V26에 두 rename 작업이 모두 나타나며, public-schema ERD가 staff, staff_permissions를 사용해야 함을 확인할 수 있습니다.

참고

  • V18__rls_baseline.sql에는 migration 체인의 뒤쪽에서 V26이 rename을 수행하므로 여전히 원래 이름인 admins, admin_permissions가 남아 있습니다.
  • announcement targeting, lecture targeting 같은 더 새로운 join 테이블도 같은 경계를 따릅니다. 즉, public 안의 tenant 범위 행이며 RLS로 보호됩니다.