# Student Management System

> Category: Full-Stack | Period: 2024 → Rebuilt 2026 | Metric: 11 REST endpoints
> Canonical URL: https://www.arman-portfolio.online/projects/student/
> Live Demo: https://student-management-system-java-springboot.onrender.com
> Source Repository: https://github.com/arman080325/Student-Management-System-Java-Springboot

## Overview
A legacy Java Swing + Oracle desktop app, rebuilt from scratch into a deployed Spring Boot web platform — paginated records, a live analytics dashboard, CSV export, and a hardened, tested, CI/CD'd REST API. Try the live demo below.

## Architecture & Tech Stack
Java 21, Spring Boot, PostgreSQL, Docker, REST API, GitHub Actions

## Case Study

### The Problem
Schools and small institutions often manage student records in spreadsheets or ageing desktop software — no live access, no analytics, no way to search or export data without opening a specific machine. My own 2024 Java Swing + Oracle project had exactly this problem: a single-window desktop app with a hardcoded database password and no path to the web.

### Architecture & Approach
Rebuilt the entire system as a layered Spring Boot service — Controller → Service → Repository → Entity, with DTOs isolating the persistence model from the API. Roll numbers are now generated from a database sequence in a @PrePersist hook instead of random strings, eliminating collisions entirely. The frontend is a zero-build vanilla JS dashboard with server-side pagination, sortable columns, bulk delete, live search, one-click CSV export, and an analytics view with course/branch distribution charts and a top-performer spotlight. Shipped with a full MockMvc integration suite, GitHub Actions CI, hardened security headers (CSP, X-Frame-Options, nosniff), and a Dockerized deploy to Render backed by Neon PostgreSQL.

### Engineering Challenges & Solutions
- Migrating off a hardcoded Oracle password and random roll-number generation to environment-driven config and sequence-based, collision-free roll numbers
- Keeping a single codebase deployable on both a zero-setup local H2 database and a production Neon Postgres instance via Spring profiles, without duplicating logic
- Composing pagination, sorting, and search against the same repository layer safely — whitelisting sortable fields so no raw client string ever reaches a query
- Disabling the destructive bulk-delete endpoint specifically in production via a feature flag, so the public demo can't be wiped by a stranger

### Outcome & Results
A fully deployed, publicly testable Spring Boot application with 11 REST endpoints, an integration test suite running in CI on every push, interactive Swagger docs, and a live analytics dashboard — a complete rewrite of a 2-year-old desktop project into a portfolio-grade, cloud-native service.

### Lessons Learned
Rewriting old code is often more revealing than writing new code — every shortcut in the original (hardcoded secrets, unvalidated input, random IDs) became a concrete lesson in what production-ready actually means, and fixing each one mapped directly onto the AppSec instincts I want to carry into every project after this.

---
Author: Arman Ahemad Khan (https://www.arman-portfolio.online/)
Role: Application Security & Full-Stack Developer
Education: Final-year B.Tech CSE at Silicon University, Bhubaneswar (CGPA 9.15, graduating May 2027)
