Repository
The repository for the backend implementation of Tabunganku is available here.
Technology
I develop the backend using Java 17 with Spring Boot, and Postgres 15.3 as the data store. Other Java libraries that I use in this project:
- spring-dotenv: a library to load environment variables from .env file. I use it to load database information and others.
- MapStruct: a library to create mapping between two Java Beans. I use it to transform entity objects into DTO objects.
- jOOQ: a library to generate Java code from database structure. I use it as an interface to interact with the database.
Directory Structure
All classes are stored in the package com.willystw.tabunganku. TabungankuApplication is the main class to start the application. The subdirectories here manage different classes:
- configuration: stores classes with
@Configurationannotation.@Configurationindicates that the class has@Beandefinition. - controller: stores classes with
@RestControllerannotation. - dto: stores request and response classes, as well as DTO classes.
- mapper: stores classes with
@Mapperannotation.@Mapperannotation is used to generate a class that can transform one class into another. - model: stores model classes, such as: Category, Transaction, and User.
- repository: stores classes with
@Repositoryannotation.@Repositoryannotation is used to indicate that a class connects to a database to manipulate a data. - resolver: stores classes with
@RestControllerAdviceannotation.@RestControllerAdviceoverrides the default exception handling in Spring Boot. - service: stores classes that perform business logic or data manipulation tasks.
SQL Script
I put the script to initialize the tables in src/resources/initial_table.sql. The script will recreate all tables by first deleting and then creating them.
Application Setup
To properly start the application, we need to do several steps:
Create a New User
Currently, there is no user data available. Accessing the front page of Tabunganku will result in an error 500. To resolve the issue, we need to create a new user data by following several steps:
- Start the backend application
- Run this command to hit the API in backend to create a new user:
curl --location 'http://localhost:8080/users/add' \
--header 'Content-Type: application/json' \
--data-raw '{
"username": "Foobar_1",
"email": "foo@bar.com"
}'
http://localhost:8080 is the backend endpoint, while Foobar_1 serves as the desired username, and foo@bar.com as the desired email. Modify these values accordingly, with the caveat that the username value must be unique.
- The system should return a JSON response like this:
{"message":null,"user_id":169166405720426381}. Take note of theuser_idvalue.
Put the New User ID Value
Substitute the USER_ID value in .env file in tabunganku-fe project with the user_id value from the previous process.

Start the Services
There are property values set in pom.xml file that are used by jOOQ plugin: pg.url, pg.username, and pg.password. We can modify the values to start the service by overriding the VM options:
mvn spring-boot:run -Dpg.url=jdbc_url -Dpg.username=foo -Dpg.password=bar. After starting the backend, we can start the frontend service.
Improvement Idea
The process of creating a new user is unintuitive. I want to have a “Sign In with Google” button in the future to simplify the user creation process. That way user data can be easily managed.