// project ·
Cloud Resource Inventory
Built a Spring Boot MVC app to track cloud resources, ownership, catalogs, and planned changes. Stack: Java 21, Thymeleaf, Spring MVC.
Role: University project · IT355 · Year: 2026 · Status: shipped
tldr: A server-rendered inventory for cloud resources and planned changes. Spring MVC and Thymeleaf handle the web flow. An application-scoped store keeps the first assignment focused on domain rules, validation, and testing without adding a database.
Problem
Resource data gets split between provider consoles, spreadsheets, and team notes. A name and a provider are not enough for day-to-day operations. A team also needs to know who owns a resource, where it runs, which service depends on it, and whether a change is planned. Free-text fields make those relationships hard to keep consistent.
Constraints
- The assignment set the scope. Database persistence, authentication, and a REST API were outside PZ1, so the weight sits on domain rules, validation, and tests.
- Relationships have to hold. Teams, environments, resource types, cloud accounts, managed services, and tags are separate catalogs. A resource references them by ID, and none of them can disappear while something still points at it.
- Change requests follow a fixed path: draft, review, then approval or rejection.
Decisions
- Spring MVC controllers bind forms and prepare the view model. Business rules stay in the service layer.
- Thymeleaf renders on the server, so there is no separate frontend build and no client-side state layer.
InventoryStorekeeps data in application scope withConcurrentHashMapcollections andAtomicLongidentifiers.- Services block deleting a catalog record that a resource, managed service, or change request still references.
- Bean Validation errors render next to the field that caused them instead of a raw server response.
Outcome
The final suite has 162 tests across storage, services, validation, controllers, and rendered HTML. It also covers the regressions browser testing found: invalid edit URLs, raw 400 pages, and table overflow on narrow screens. The cost of the in-memory store is deliberate and visible. Restarting the application resets every change back to the demonstration dataset.