Skip to content

[create-croco-app] Boot generated apps with DI validation enabled #1641

Description

@kang-heewon

Priority

P1

Problem

#965는 DI bootstrap validation을 일급 계약으로 만들었고, acceptance criteria에 "diValidation: "off" 또는 explicit unsafe flag 없이 missing registration이 조용히 new type() fallback으로 숨지 않는다"를 포함했다. 정책은 구현됐다.

그런데 그 정책을 구현한 커밋이 같은 커밋에서 모든 진입 템플릿에 diValidation: "off"를 추가했다. 결과적으로 생성된 앱은 예외 없이 새 계약을 우회한 상태로 시작하고, 이후 커밋에서 그 우회가 테스트로 고정됐다. 사용자가 scaffold로 만든 앱은 registration 누락을 부팅 시점에 잡지 못한다.

diValidation: "off"가 필요한 기술적 이유가 코드나 이슈에 남아 있지 않다. 템플릿 컨트롤러는 모두 @Component가 붙어 있어 검증을 켜도 통과할 것으로 보인다.

Evidence

  • 5403360 fix: validate HTTP DI bootstrap contractspackages/transports-http/src/libs/CrocoApp.ts에 정책을 추가하면서 동시에 템플릿 5개에 diValidation: "off" 한 줄씩을 추가했다.
  • 현재 diValidation: "off"가 있는 위치:
    • packages/create-croco-app/templates/saas/apps/api-server/src/app.ts:40
    • packages/create-croco-app/templates/spa-be-split/apps/api-server/src/app.ts:49
    • packages/create-croco-app/templates/ai-saas/apps/api-server/src/app.ts.hbs:41
    • packages/create-croco-app/templates/admin-console/apps/api-server/src/app.ts.hbs:48
    • packages/create-croco-app/templates/addons/web-meta-vite-fullstack/api-worker/src/index.ts:57
  • packages/create-croco-app/templates/saas/apps/api-server/src/tests/SaasDemo.spec.ts:66-67이 이 우회를 테스트로 고정한다:
    // The template production bootstrap intentionally configures diValidation: "off".
    validation: { di: "off" },
    주석은 "intentionally"라고 하지만 사유는 적혀 있지 않다.
  • 템플릿 컨트롤러 3개는 모두 @Component가 붙어 있다: templates/saas/apps/api-server/src/controllers/JobsController.ts, OperationsController.ts, SaasController.ts.
  • packages/transports-http/src/libs/CrocoApp.ts:312-314에 따르면 NODE_ENV가 development/test면 기본값이 이미 warn이므로, 로컬 개발 편의를 위한 명시적 off는 불필요하다.
  • packages/transports-http/src/libs/CrocoApp.ts:363-374di-missing-provider 진단은 provider별 사용처(route, guard, interceptor)를 역추적해 제공하는데, 템플릿 사용자는 이 진단을 받지 못한다.

Desired outcome

생성된 앱이 DI bootstrap 계약을 켠 상태로 시작한다. registration 누락이 부팅 시점 진단으로 드러나며, 검증을 끄는 선택은 문서화된 사유가 있는 경우로 한정된다.

Proposed implementation path

  1. 템플릿 5개에서 diValidation: "off"를 제거하고 각 템플릿의 generated app smoke를 실행해 실제로 실패하는지 확인한다.
  2. 실패하는 템플릿이 있으면 원인을 특정한다. 누락된 provider는 @Component 추가 또는 명시적 registration으로 해결한다.
  3. 구조적으로 켤 수 없는 템플릿이 남으면 off 대신 warn을 사용하고, 사유를 코드 주석이 아니라 이 이슈와 템플릿 README에 기록한다.
  4. SaasDemo.spec.tsvalidation: { di: "off" } override를 제거해, 템플릿 테스트가 production bootstrap을 그대로 검증하게 한다.
  5. pnpm create-croco-app:smokepnpm --filter create-croco-app smoke:generated-apps가 변경된 템플릿으로 통과하는지 확인한다.

Acceptance criteria

  • grep -rn 'diValidation' packages/create-croco-app/templates/"off"를 출력하지 않는다.
  • templates/saas/.../SaasDemo.spec.tsvalidation override 없이 production bootstrap을 부팅한다.
  • 모든 goal에 대한 generated app smoke가 통과한다.
  • warn으로 남기는 템플릿이 있다면 그 사유가 문서로 설명된다.
  • 템플릿에서 provider registration을 누락시킨 fixture가 결정적 transports-http/di-missing-provider 진단을 낸다.

Validation

  • pnpm create-croco-app:smoke
  • pnpm --filter create-croco-app smoke:generated-apps
  • pnpm first-success:verify
  • pnpm --filter create-croco-app test
  • pnpm check

Scope boundaries

  • diValidation의 기본값이나 CrocoApp 정책 로직 변경은 포함하지 않는다.
  • 프레임워크 패키지 테스트의 검증 우회 정리는 포함하지 않는다.
  • examples/securityValidation 문제는 별도 이슈에서 다룬다.

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions