이번 파이프라인 작업과 무관하게 작업 트리에 남아 있던 것을 그대로 올린다. 사용자가 「전부 커밋」으로 정했고, 이번 작업과 섞이지 않게 커밋만 나눴다. 대부분은 clean-architecture-backend-template 의 그림 정본 재배치다 — final/assets/diagrams/<이름>/ 에 있던 것이 CLAUDE.md 가 적은 배치인 final/assets/<이름>/ 로 옮겨졌고 .techviz/<이름>/ 이 함께 들어왔다. 삽입 줄의 대부분(3.15M)이 그 .techviz context.json 이다. 그 밖에 ca-tmpl·document-haness 의 정리, .claude/agents/ 열한 개, writing-practitioner-guides 스킬, .playwright-mcp 세션 산출물, scripts/check-ssot-facts.py 와 그 시험이 들어 있다. 이 커밋의 내용은 내가 만든 것이 아니라 이전 세션이 남긴 것이고 검증하지 않았다. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
3.3 KiB
kind, slug, title, topic, project, status, sourceRevision, rootTreeNode, decisionStatus, decidedOn, source
| kind | slug | title | topic | project | status | sourceRevision | rootTreeNode | decisionStatus | decidedOn | source | ||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| PROJECT_DECISION | classpath-presence-is-not-consent | 클래스패스에 있는 것은 실행 동의가 아니다 | multitenancy-isolation | clean-architecture-backend-template | 게시 전 | 21234e38cdb9a926cbc92bb97a2aee2e4a7d2916 | decision:classpath-presence-is-not-consent | ADOPTED | 2026-08-30 |
|
클래스패스에 있는 것은 실행 동의가 아니다
실험 모듈은 명시적 플래그가 설정될 때만 동작하고, 플래그가 없으면 조용히 꺼지는 대신 오류로 실패한다. 실험 모듈은 전이 의존으로 도착할 수 있어서, 테넌트 격리가 jar 가 있다는 이유로 스스로 켜지면 켜졌는지 모르는 격리를 신뢰하게 된다.
결정문
실험 모듈은 명시적 플래그가 설정될 때만 동작하고, 플래그가 없으면 조용히 꺼지는 대신 오류로 실패한다.
판단 이유
실험 모듈은 전이 의존으로 도착할 수 있다. 누군가 다른 것을 가져오면서 함께 들어온다.
그 상태에서 테넌트 격리나 복제본 라우팅 기능이 jar 가 있다는 이유로 스스로 켜지면, 가능한 최악의 기본값이 된다. 켜졌는지 모르는 격리를 신뢰하게 되기 때문이다.
그래서 게이트가 결정의 부재를 활성화가 아니라 오류로 만든다. 그리고 실패 메시지가 설정해야 할 정확한 속성 이름을 부른다.
그것이 실제로 강제되도록 세 클래스가 생성자를 패키지 전용으로 바꾸고 게이트를 받는 정적 팩토리만 남겼다.
게이트를 정적 참조가 아니라 파라미터로 받는 것이 요구사항을 시그니처의 일부로 만든다. 호출자는 컴파일러가 요구하는 인자를 잊을 수 없다.
영향
감수하는 것
실험 기능을 쓰려면 플래그를 명시해야 한다. 편의를 위해 기본 활성화하는 선택지가 없다.
전이 의존으로 들어온 모듈이 플래그 없이 사용되면 기동이 실패한다. 그 실패가 무엇 때문인지 메시지가 말해야 한다.
세 클래스의 생성자가 패키지 전용이므로 외부에서 직접 생성할 수 없다. 테스트도 팩토리를 지나야 한다.
얻는 것
켜지지 않은 격리를 신뢰하는 상태가 없다.
요구사항이 컴파일러가 강제하는 형태가 된다. 규약이 아니다.
근거
- 네 가지 멀티테넌시 전략과 각각의 격리 경계 이 게이트 뒤에 있는 것들이다.
- Hibernate filter는 보안 경계가 아니다 잘못된 격리 신뢰가 만드는 문제를 다룬 규칙이다.
- runtime_memberships를 먼저 읽고 심각도를 정한다 실행되지 않는 코드의 심각도를 판정하는 같은 계열의 규칙이다.
- 마스터 스위치는 루트 하나가 소유하고 자식 설정은 조건을 갖지 않는다 같은 조립 원칙의 다른 표현이다.