3.4 KiB
3.4 KiB
| domain | last_rule_review_commit | last_rule_updated_at |
|---|---|---|
| platform | unborn-head | 2026-07-23 |
platform
목적 / 책임
Go 서버와 마이그레이션 프로세스를 조립하고, 설정·로깅·HTTP·PostgreSQL 연결 및 조직 격리와 최소 권한을 운영 경계에서 강제한다.
포함 경로
internal/platform/— 설정, Fx 부트스트랩, 로깅, HTTP 서버, 데이터베이스 연결과 마이그레이션을 제공한다.apps/server/— Ariadne 서버 실행 진입점이다.apps/migrate/— 별도 자격 증명을 사용하는 마이그레이션 진입점이다.deploy/— PostgreSQL 역할 등 개발·배포 기반 구성을 제공한다.
제외 경로
internal/domain/— 오류·조직·수정 작업의 비즈니스 불변 규칙은 domain-model 책임이다.internal/integration/— IOP 실행 포트와 외부 이벤트 검증은 integrations 책임이다.apps/client/— Flutter 사용자 경험과 화면 구성은 client 책임이다.
주요 구성 요소
bootstrap.New— Fx로 설정, 로깅, 데이터베이스, HTTP 서버 수명주기를 조립한다.database.Database— runtime·identity 연결과 schema/권한 호환 상태를 관리한다.database.WithinOrganization— 트랜잭션 로컬 조직 컨텍스트를 설정하는 유일한 조직 소유 데이터 접근 경계다.database.runtimeTableAccess— 조직 소유 테이블별 runtime 역할의 최소 권한 목록이다.database.RunMigrations— 전용 역할, advisory lock, checksum과 schema 검증을 적용한다.httpserver.Server—/healthz,/readyz와 보안 헤더를 제공한다.
유지할 패턴
- 모든 환경 변수는
ARIADNE_접두사를 사용하고config.Load에서 기본값과 양의 duration을 검증한다. - runtime, identity, migration 연결과 역할을 분리하고 서버 시작 시 실제 역할·권한·소유권·RLS를 검증한다.
- 조직 소유 데이터 작업은
WithinOrganization의 단일 트랜잭션 안에서 수행한다. - 새 조직 소유 테이블은 강제 RLS, 조직 범위 정책,
runtimeTableAccess최소 권한을 같은 변경에 포함한다. - 적용된 마이그레이션 파일은 불변으로 두고 새 순번의 상향 마이그레이션을 추가한다.
- HTTP 수명주기는 Fx hook과 제한된 timeout을 사용한다.
다른 도메인과의 경계
- domain-model:
organization.ID같은 값 타입을 받지만 도메인 판정을 데이터베이스나 HTTP 구현으로 대체하지 않는다. - integrations: IOP 구현체와 외부 API를 조립하되 실행 정책의 권한 불변식은 integrations 경계에서도 검증한다.
- client: 서버는 API와 상태를 제공하고 client의 Flutter 위젯·테마를 직접 소유하지 않는다.
금지 사항
- 원시
pgxpool.Pool을 조직 소유 repository나 다른 패키지에 노출하지 않는다. - 서버 runtime 또는 identity 역할에 슈퍼사용자,
BYPASSRLS, schema create, 테이블 소유권을 부여하지 않는다. - 감사 이벤트·오류 발생·승인 같은 불변 이력 테이블에 runtime 수정·삭제 권한을 추가하지 않는다.
- 운영 환경 쓰기나 최초 전역 사용자·조직 생성 권한을 일반 서버 경계에 임의로 추가하지 않는다.
- 이미 적용된 마이그레이션의 내용을 수정하지 않는다.