Skip to content

chandanboyina/ExpenseSharingApplication

Repository files navigation

Expense Sharing Backend System (Splitwise-like)

Engineering Design Assignment

This project implements a backend system for expense sharing, inspired by applications like Splitwise.

This README is intentionally detailed to clearly explain:

  • How the problem was broken down
  • Why specific design decisions were taken
  • How correctness, scalability, and clarity were prioritized

Objective

Design and implement a backend system that allows users to:

  • Create groups
  • Add shared expenses
  • Track balances
  • Settle dues

Supported split types

  1. Equal split
  2. Exact amount split
  3. Percentage split

Problem-Solving & Design Thinking

1️. Problem Decomposition

The system was divided into four core domains, each with a single responsibility:

Domain Responsibility
Users Identity & ownership
Groups Context for shared expenses
Expenses Recording shared spending
Balances Net money flow between users

This separation ensures:

  • Low coupling
  • High readability
  • Easier testing and debugging

2️. Key Design Decisions (With Reasoning)

Use of BigDecimal for monetary values

  • Why: Floating point (double) leads to rounding errors
  • Trade-off: Slightly more verbose code
  • Benefit: Financial correctness and precision

Balance Simplification Strategy

Instead of storing raw transactions, the system maintains net balances only.

Example:

A owes B ₹500
B owes A ₹300
→ Net: A owes B ₹200

This keeps balances:

  • Minimal
  • Easy to understand
  • Efficient to query

Centralized Balance Logic

All balance-related operations are handled in BalanceService:

  • Expense balance updates
  • Reverse balance cancellation
  • Settlements

This avoids duplicated logic and ensures consistency.


DTO-Based API Design

API requests use DTOs instead of entities to:

  • Prevent over-posting
  • Keep APIs stable if database models change
  • Improve clarity and validation

Architecture Overview

Layer Responsibility
Controller Handles REST APIs
Service Business logic
Repository Database access
Model Domain entities
DTO API contracts

Tech Stack

Category Technology
Language Java
Framework Spring Boot
ORM Hibernate / JPA
Database MySQL
API Style REST
Build Tool Maven
Testing Postman

Project Structure

src/main/java/com/expensesplit
│
├── Controllers
│ ├── UserController.java
│ ├── GroupController.java
│ ├── ExpenseController.java
│ └── BalanceController.java
│
├── Services
│ ├── UserService.java
│ ├── GroupService.java
│ ├── ExpenseService.java
│ └── BalanceService.java
│
├── Repositories
│ ├── UserRepository.java
│ ├── GroupRepository.java
│ ├── ExpenseRepository.java
│ ├── ExpenseSplitRepository.java
│ └── BalanceRepository.java
│
├── DTO
│ ├── CreateExpenseRequest.java
│ ├── ExactSplitRequest.java
│ ├── PercentageSplitRequest.java
│ ├── SettleRequest.java
│ └── BalanceSummary.java
│
├── model
│ ├── User.java
│ ├── Group.java
│ ├── Expense.java
│ ├── ExpenseSplit.java
│ ├── Balance.java
│ └── SplitType.java
│
└── ExpenseApplication.java

Setup Instructions

1. Create Database

CREATE DATABASE expensesplit;

2. Configure application.yaml

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/expensesplit
    username: root
    password: YOUR_PASSWORD
  jpa:
    hibernate:
      ddl-auto: update
    show-sql: true

3. Run application

server starts at http://localhost:8080

Postman Testing Flow

1. Create Users

POST http://localhost:8080/user

{
  "name": "Neha",
  "email": "neha@gmail.com"
}

Output:

image

2. Create Group

POST http://localhost:8080/groups

{
  group name: "group_name",
  userIds: 
  [
  "USER_ID_1",
  "USER_ID_2",
  "USER_ID_3"
  ]
}

Output:

image

3. Add Equal Expense

POST http://localhost:8080/expenses

{
  "groupId": "GROUP_ID",
  "paidBy": "USER_ID",
  "amount": 3000,
  "description": "Hotel"
}

Output:

image

4. Add Exact Split Expense

POST http://localhost:8080/expenses/exact

{
  "groupId": "GROUP_ID",
  "paidById": "USER_ID",
  "description": "Taxi",
  "splits": {
    "USER_ID_1": 500,
    "USER_ID_2": 300
  }
}

Output:

image

5. Add Percentage Split Expense

POST http://localhost:8080/expenses/percentage

{
  "groupId": "GROUP_ID",
  "paidById": "USER_ID",
  "amount": 3000,
  "description": "Resort",
  "splits": {
    "USER_ID_1": 50,
    "USER_ID_2": 30,
    "USER_ID_3": 20
  }
}

image

6. View User Balances

GET http://localhost:8080/balances/user/{userId}

Output:

image

7. User Balance Summary

GET http://localhost:8080/balances/summary/{userId}

Output:

image

8. View Group Balances

GET http://localhost:8080/balances/group/{groupId}

image

9. Settle Dues

POST http://localhost:8080/balances/settle

{
  "fromUserId": "USER_ID",
  "toUserId": "USER_ID",
  "amount": 500
}

Output:

image

About

Backend expense sharing system inspired by Splitwise. Supports group creation, equal/exact/percentage expense splitting, real-time balance tracking, automatic balance simplification, and settlement of dues. Designed with clean architecture, REST APIs, and strong data consistency.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages