← Back to Dashboard

Spring Boot Microservices [Backend Engineering Track - v0.1]

A 3-month backend engineering track for Java developers. Build a Task Board API that evolves from a clean Spring Boot monolith to a fully containerized microservices system. ~40h per month.

3 months  ·  3 lanes

Required Materials 13 materials ~30.5h
Sprint 1 (Month 1): Spring Boot Foundations Months 1–1 ~17.5h total
Spring Framework ~10.0h
Month 1 ~10.0h

Materials

Tasks

  • Build the Task Board monolith: Projects and Tasks CRUD API ~4h

    Scaffold the Task Board monolith with Spring Initializr (Spring Web, Spring Data JPA, H2 or PostgreSQL, Lombok). Implement two entities — Project and Task — with a one-to-many relationship. Expose full CRUD REST endpoints for both. Use Spring Data JPA repositories — do not write any raw SQL. Validate inputs with @Valid and return structured error responses. Commit with a clean package structure: controller, service, repository, entity, dto.

SOLID & Design Patterns ~3.5h
Month 1 ~3.5h

Materials

Tasks

  • Apply SRP and OCP to the Task Board service layer ~2h

    Review the service classes from the Spring Framework task. Identify every Single Responsibility violation: classes that handle both business logic and persistence decisions, methods that do more than one thing. Refactor them — one service class per entity domain, each method with a single, name-revealing purpose. Then find one place to apply the Open/Closed Principle: introduce an interface or abstraction that lets you add new task filtering strategies without modifying existing code. Commit with a message naming each SOLID principle addressed.

Microservices Architecture ~4.0h
Month 1 ~4.0h

Materials

Tasks

  • Write the monolith architecture doc and identify 3 future service boundaries ~1.5h

    Write ARCHITECTURE.md in the repo. Include: a component diagram of the current monolith (entities, services, repositories, controllers), the data flow for creating a task, and a section titled "Future Service Boundaries" where you identify exactly 3 places you would draw a service boundary and why. Use Fowler's vocabulary: bounded context, single responsibility at the service level, cohesion. This document will be updated in sprints 2 and 3 — do not delete it, only evolve it.

Sprint 2 (Month 2): Security, Testing & Clean Design Months 2–2 ~18.0h total
Spring Framework ~8.0h
Month 2 ~8.0h

Materials

Tasks

  • Add JWT authentication and write unit tests for the service layer ~4h

    Add user registration and login endpoints that issue JWT tokens. Protect all Task and Project endpoints so only authenticated users can access them. Use a JwtAuthenticationFilter that reads the Authorization: Bearer <token> header. Then write JUnit 5 unit tests for every method in your service classes using Mockito to mock the repositories. Target: above 70% line coverage on the service layer. Run ./mvnw test and commit the passing test run output in the PR description.

SOLID & Design Patterns ~5.0h
Month 2 ~5.0h

Materials

Tasks

  • Apply Dependency Inversion across the full stack and document the design ~2h

    Review every place in the Task Board where a high-level module (service) directly instantiates or references a low-level module (repository, external service). Refactor to inject dependencies via constructor injection using interfaces. Every service class should depend only on an interface, never on a concrete implementation. Add a diagram to ARCHITECTURE.md showing the dependency flow — controllers → service interfaces → implementations → repositories — making it visually clear that dependency arrows point inward.

Microservices Architecture ~5.0h
Month 2 ~5.0h

Materials

Tasks

  • Define service contracts as OpenAPI specs and draw the bounded context diagram ~2h

    Define the API contracts for your three planned services (user-service, task-service, notification-service) as OpenAPI 3 YAML specs — even though the services do not exist yet. Each spec should define the endpoints, request/response schemas, and authentication requirements. Commit all three specs under docs/openapi/. Update ARCHITECTURE.md with a bounded context diagram showing each service, its data ownership, and the events or API calls that cross boundaries. From this point forward, any contract change must update the spec first.

Sprint 3 (Month 3): Decompose & Containerize Months 3–3 ~19.5h total
Spring Framework ~8.0h
Month 3 ~8.0h

Materials

Tasks

  • Extract services, wire them with Feign, and add Spring Cloud Config ~4h

    Extract the monolith into three independent Spring Boot applications: user-service (registration, login, JWT issuance), task-service (projects, tasks, assignments — calls user-service via Feign to validate tokens), and notification-service (consumes task-assigned events from RabbitMQ and logs notifications). Add a config-server Spring Boot app that serves application properties from a local Git repo. Each service must load its config from the config server at startup. Document the startup order in README.md.

SOLID & Design Patterns ~3.5h
Month 3 ~3.5h

Materials

Tasks

  • Apply hexagonal architecture (ports and adapters) to task-service ~2h

    Refactor task-service to follow the ports-and-adapters pattern: the domain model and use-case classes in a domain package must have zero Spring or JPA imports. Persistence is an adapter behind a TaskRepository port interface. The REST controller is an adapter behind an inbound port interface. The Feign client to user-service is an adapter behind an outbound port interface. Draw the updated architecture diagram and add it to ARCHITECTURE.md. Confirm the domain package compiles cleanly without Spring on the classpath — this is the only reliable test for genuine hexagonal architecture.

Microservices Architecture ~8.0h
Month 3 ~8.0h

Materials

  • Microservices Patterns – Ch. 1–4: Decomposition, IPC, Sagas, and messaging ~4h

    Chris Richardson's book is the most practical microservices text available. Chapter 1 defines the patterns vocabulary. Chapter 2 covers decomposition strategies. Chapter 3 covers inter-process communication (REST vs async messaging). Chapter 4 introduces the Saga pattern for distributed data management.

  • Docker Getting Started Tutorial (docs.docker.com) ~1h

    Official Docker tutorial covering Dockerfile syntax, layer caching, volumes, and Docker Compose. Deliberately short — delivers the mechanical fluency needed for the Sprint 3 containerisation task in under 2 hours. Free.

Tasks

  • Containerize the full system with Docker Compose and add an API Gateway ~3h

    Write a Dockerfile for each service (user-service, task-service, notification-service, config-server). Write a docker-compose.yml at the root that starts all services plus a PostgreSQL container and a RabbitMQ container. Add a Spring Cloud Gateway service as the single entry point — route /api/users/** to user-service and /api/tasks/** to task-service. Confirm the full system starts with a single "docker-compose up" from a clean machine. Update README.md with the architecture diagram, the startup command, and example curl requests for the main flows. Tag the release on GitHub as v1.0.0-ms.