- Define each stateful resource (DB pool, HTTP server, cache) as a `defrecord` implementing `component/Lifecycle` with `start` and `stop` methods.
- Use `component/system-map` to declare the dependency graph and `component/start-system` to start all components in topological order.
- Inject dependencies through the component record fields — access them as `(:db this)` inside `start` and handler functions.
- Use `integrant` as a data-driven alternative to Component — define the system as an EDN config map and implement `ig/init-key` and `ig/halt-key!` multimethods.
- Use `ig/load-namespaces` to automatically require the namespaces containing `ig/init-key` implementations based on the config key namespace.
- In tests, start only the components under test using `component/system-using` to limit startup overhead and isolate the system under test.
- Store the running system in an atom (`(defonce system (atom nil))`) for REPL-driven development with `reset!` on each code reload.