Architectures
Modular Architecture
A feature-first layout where each module keeps its related files together.
Modular architecture organizes code by feature.
Each feature gets its own folder under src/modules. That folder can contain a route, controller, service, repository, interface, and validator depending on the layer depth you choose.
When To Use Modular
Use modular when:
- Your API has several features
- You want each feature to be easy to find
- You prefer
usersfiles to live together - You want more structure than minimal, but less ceremony than layered
- Your team works by feature area
Structure
src/
server.ts
routes/
index.ts
modules/
health/
health.route.ts
health.controller.ts
users/
users.route.ts
users.controller.ts
users.service.ts
users.repository.ts
users.interface.ts
users.validation.ts
shared/
config/Request Flow
Request
|
v
routes/index.ts
|
v
modules/users/users.route.ts
|
v
modules/users/users.controller.ts
|
v
optional service/repository
|
v
ResponseFile Responsibilities
| File | Responsibility |
|---|---|
users.route.ts | Defines HTTP paths and attaches handlers |
users.controller.ts | Reads request data and returns responses |
users.service.ts | Contains business logic |
users.repository.ts | Contains data access code |
users.interface.ts | Defines shared TypeScript shapes |
users.validation.ts | Keeps validation schemas or validation helpers |
Why Use Modular
Modular projects are easy to navigate:
Need to work on users?
open src/modules/users
Need to work on orders?
open src/modules/ordersThe feature folder is the boundary. That makes modular a good default for many APIs.
Trade-Off
Modular keeps related files together, but large projects can still become dense if every module grows many layers. If your team needs all controllers together, all services together, or all repositories together, use layered.