A Spring Boot REST API for a simple banking system with authentication, account management, deposits, withdrawals, and transaction tracking.
This project demonstrates backend development skills including:
- Spring Boot REST APIs
- Spring Security (JWT authentication)
- JPA/Hibernate ORM
- MySQL database integration
- Docker containerization
- User authentication (JWT secured)
- Create bank accounts
- Deposit and withdraw funds
- Transaction history tracking
- Pagination and filtering of transactions
- Global exception handling
- Input validation
- POST
/auth/register - POST
/auth/login
- POST /bank/create
- POST /bank/deposit
- POST /bank/withdraw
- GET /bank/{accNo}/transactions
Query params:
- type
- start
- end
- page
- size
{
"status": "success",
"message": "Transactions retrieved",
"data": [...]
}All errors follow a consistent structure:
{
"status": "error",
"message": "Account not found",
"data": null
}POST /bank/create
{ "accountNumber": "540", "accountName":"Henry", "initialDeposit": 5000 }
- JPA Entity Relationships (
@OneToMany,@ManyToOne) - DTO Mapping
- Java Streams (filtering, sorting, pagination)
- Global Exception Handling
- Validation
- Add unit & integration tests
- Add CI/CD pipeline
- Improve security (refresh tokens, roles)
- Add Swagger API documentation
- Add Redis caching
- Implemented DTO-based request handling using
CreateAccountRequest - Added validation with Jakarta Validation annotations
- Improved separation between API requests and database entities
- Refactored
BankAccountentity structure - Separated internal database ID (
Long id) from business account number (String accNo) - Added proper auto-generated primary keys using JPA/Hibernate
- Added unique constraints for account numbers
- Updated repository structure to use
JpaRepository<BankAccount, Long> - Added custom repository method:
findByAccNo(String accNo)
- Fixed Hibernate schema generation and table mapping issues
- InvalidAmountException
- ResourceNotFoundException
- account names
- balances
- deposits
- withdrawals
- Integrated Spring Security authentication context handling
- Added ownership validation logic for secured account operations
- Improved access control structure for protected endpoints
- Added transaction filtering by:
- transaction type
- date range
- Added pagination support
- Added transaction sorting by latest activity
- Java 21
- Spring Boot
- Spring Security (JWT)
- Spring Data JPA
- Hibernate
- MySQL8
- Docker & Docker Compose
- Maven
git clone https://github.com/johnmacha/Banking-System-Api.git
cd banking_system- Update application.properties : spring.datasource.url=jdbc:mysql://localhost:3306/Bank spring.datasource.username=root spring.datasource.password=my_password
./mvnw spring-boot:run
./mvnw.cmd clean package -DskipTests
docker compose up --build
- This will start:
Spring Boot API → http://localhost:8080 MySQL Database → port 3307 (host)
Spring Boot (banking-api) │ ▼ MySQL (banking-mysql)
-Communication inside Docker: jdbc:mysql://mysql:3306/Bank
- Configured in docker-compose.yml :
SPRING_DATASOURCE_URL=jdbc:mysql://mysql:3306/Bank SPRING_DATASOURCE_USERNAME=root SPRING_DATASOURCE_PASSWORD=my_password
- Image: mysql:8.0
- Port: 3307 (host) → 3306 (container)
- Database: Bank
- Spring Boot container
- Port: 8080
John Macharia