Kembali ke Beranda
DevOps

Tutorial Spring Boot dari Awal dengan PostgreSQL dan IntelliJ IDEA

Tutorial ini membahas pembuatan aplikasi Spring Boot dari awal menggunakan IntelliJ IDEA dan PostgreSQL, mulai dari instalasi Java, Maven, PostgreSQL, pembuatan database, konfigurasi koneksi, pembuatan REST API CRUD, hingga pengujian koneksi database dan endpoint API.

Tutorial Spring Boot dari Awal dengan PostgreSQL dan IntelliJ IDEA

1. Tujuan Tutorial

Tutorial ini membahas cara membuat aplikasi Spring Boot dari awal menggunakan:

  • Java
  • Spring Boot
  • Maven
  • PostgreSQL
  • IntelliJ IDEA
  • Spring Web
  • Spring Data JPA
  • REST API
  • Test koneksi database PostgreSQL
  • CRUD sederhana

Target akhirnya adalah membuat API sederhana untuk data users.

Contoh endpoint:

TEXT
GET    /api/users
GET    /api/users/{id}
POST   /api/users
PUT    /api/users/{id}
DELETE /api/users/{id}

---

2. Persiapan Instalasi

2.1 Install Java JDK

Spring Boot modern membutuhkan Java versi 17 atau lebih baru.

Cek apakah Java sudah terinstall:

BASH
java -version

Jika belum ada, install JDK.

Ubuntu / Debian

BASH
sudo apt update
sudo apt install openjdk-17-jdk -y

Cek versi:

BASH
java -version

AlmaLinux / Rocky Linux / RHEL

BASH
sudo dnf install java-17-openjdk java-17-openjdk-devel -y

Cek versi:

BASH
java -version

Windows

Install JDK dari salah satu pilihan berikut:

  • Eclipse Temurin JDK
  • Oracle JDK
  • Amazon Corretto
  • Microsoft Build of OpenJDK

Setelah install, cek dari Command Prompt:

BASH
java -version

---

2.2 Install Maven

Maven digunakan untuk build project dan mengelola dependency.

Cek Maven:

BASH
mvn -version

Ubuntu / Debian

BASH
sudo apt install maven -y

AlmaLinux / Rocky Linux / RHEL

BASH
sudo dnf install maven -y

Windows

Bisa install Maven manual atau gunakan Maven bawaan IntelliJ IDEA.

Untuk pemula, Maven bawaan IntelliJ sudah cukup.

---

2.3 Install PostgreSQL

Ubuntu / Debian

BASH
sudo apt update
sudo apt install postgresql postgresql-contrib -y

Cek service:

BASH
sudo systemctl status postgresql

Aktifkan service:

BASH
sudo systemctl enable postgresql
sudo systemctl start postgresql

AlmaLinux / Rocky Linux / RHEL

BASH
sudo dnf install postgresql-server postgresql-contrib -y

Inisialisasi database:

BASH
sudo postgresql-setup --initdb

Aktifkan service:

BASH
sudo systemctl enable postgresql
sudo systemctl start postgresql

Windows

Download PostgreSQL installer, lalu install seperti aplikasi biasa.

Saat install, biasanya diminta membuat password untuk user:

TEXT
postgres

Simpan password tersebut karena akan dipakai di Spring Boot.

---

2.4 Install IntelliJ IDEA

Gunakan salah satu:

  • IntelliJ IDEA Community Edition
  • IntelliJ IDEA Ultimate

Untuk development Spring Boot, Ultimate lebih lengkap, tetapi Community Edition tetap bisa digunakan untuk project Maven Spring Boot biasa.

---

3. Setup Database PostgreSQL

3.1 Masuk ke PostgreSQL

Di Linux:

BASH
sudo -u postgres psql

Di Windows, bisa pakai:

BASH
psql -U postgres

Atau gunakan pgAdmin.

---

3.2 Buat Database dan User

Jalankan query berikut di PostgreSQL:

SQL
CREATE DATABASE springboot_demo;

CREATE USER springuser WITH PASSWORD 'springpass';

GRANT ALL PRIVILEGES ON DATABASE springboot_demo TO springuser;

Keluar dari PostgreSQL:

SQL
\q

---

3.3 Test Login Database

Coba login menggunakan user yang baru dibuat:

BASH
psql -U springuser -d springboot_demo -h localhost

Jika berhasil, berarti database sudah siap.

---

4. Membuat Project Spring Boot di IntelliJ IDEA

4.1 Buat Project Baru

Buka IntelliJ IDEA, lalu pilih:

TEXT
New Project

Pilih:

TEXT
Spring Boot

Jika menggunakan Spring Initializr, isi konfigurasi seperti berikut:

TEXT
Language    : Java
Build Tool  : Maven
Group       : com.example
Artifact    : springboot-postgres-demo
Name        : springboot-postgres-demo
Package     : com.example.springbootpostgresdemo
Java        : 17 atau lebih baru
Packaging   : Jar

---

4.2 Pilih Dependency

Tambahkan dependency berikut:

TEXT
Spring Web
Spring Data JPA
PostgreSQL Driver
Validation
Lombok

Penjelasan singkat:

DependencyFungsi
Spring WebMembuat REST API
Spring Data JPAAkses database dengan repository
PostgreSQL DriverKoneksi ke PostgreSQL
ValidationValidasi request body
LombokMengurangi boilerplate getter/setter

Klik:

TEXT
Create

---

5. Struktur Project

Struktur project kira-kira seperti ini:

TEXT
springboot-postgres-demo
├── src
│   ├── main
│   │   ├── java
│   │   │   └── com.example.springbootpostgresdemo
│   │   │       ├── SpringbootPostgresDemoApplication.java
│   │   │       ├── controller
│   │   │       ├── entity
│   │   │       ├── repository
│   │   │       └── service
│   │   └── resources
│   │       ├── application.properties
│   │       └── static
│   └── test
├── pom.xml

---

6. Konfigurasi PostgreSQL di Spring Boot

Buka file:

TEXT
src/main/resources/application.properties

Isi dengan konfigurasi berikut:

PROPERTIES
spring.application.name=springboot-postgres-demo

server.port=8080

spring.datasource.url=jdbc:postgresql://localhost:5432/springboot_demo spring.datasource.username=springuser spring.datasource.password=springpass spring.datasource.driver-class-name=org.postgresql.Driver

spring.jpa.hibernate.ddl-auto=update spring.jpa.show-sql=true spring.jpa.properties.hibernate.format_sql=true

spring.jpa.database-platform=org.hibernate.dialect.PostgreSQLDialect

Penjelasan:

PropertiFungsi
server.port=8080Aplikasi jalan di port 8080
spring.datasource.urlURL koneksi PostgreSQL
spring.datasource.usernameUsername database
spring.datasource.passwordPassword database
spring.jpa.hibernate.ddl-auto=updateTable otomatis dibuat/update
spring.jpa.show-sql=trueQuery SQL ditampilkan di console

Untuk development, ddl-auto=update masih aman.

Untuk production, sebaiknya gunakan migration tool seperti Flyway atau Liquibase.

---

7. Membuat Entity User

Buat package:

TEXT
entity

Buat file:

TEXT
User.java

Isi:

JAVA
package com.example.springbootpostgresdemo.entity;

import jakarta.persistence.*; import jakarta.validation.constraints.Email; import jakarta.validation.constraints.NotBlank; import lombok.Data;

@Entity @Table(name = "users") @Data public class User {

@Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id;

@NotBlank(message = "Nama tidak boleh kosong") @Column(nullable = false) private String name;

@Email(message = "Format email tidak valid") @NotBlank(message = "Email tidak boleh kosong") @Column(nullable = false, unique = true) private String email; }

Penjelasan:

AnnotationFungsi
@EntityClass ini menjadi table database
@Table(name = "users")Nama table adalah users
@IdPrimary key
@GeneratedValueID otomatis
@ColumnKonfigurasi kolom
@NotBlankValidasi tidak boleh kosong
@EmailValidasi format email

---

8. Membuat Repository

Buat package:

TEXT
repository

Buat file:

TEXT
UserRepository.java

Isi:

JAVA
package com.example.springbootpostgresdemo.repository;

import com.example.springbootpostgresdemo.entity.User; import org.springframework.data.jpa.repository.JpaRepository;

import java.util.Optional;

public interface UserRepository extends JpaRepository<User, Long> {

Optional<User> findByEmail(String email); }

Dengan JpaRepository, kita otomatis punya method:

JAVA
findAll()
findById()
save()
deleteById()
existsById()

---

9. Membuat Service

Buat package:

TEXT
service

Buat file:

TEXT
UserService.java

Isi:

JAVA
package com.example.springbootpostgresdemo.service;

import com.example.springbootpostgresdemo.entity.User; import com.example.springbootpostgresdemo.repository.UserRepository; import org.springframework.stereotype.Service;

import java.util.List;

@Service public class UserService {

private final UserRepository userRepository;

public UserService( UserRepository userRepository ) { this.userRepository = userRepository; }

public List<User> getAllUsers() { return userRepository.findAll(); }

public User getUserById( Long id ) { return userRepository.findById(id) .orElseThrow(() -> new RuntimeException("User tidak ditemukan")); }

public User createUser( User user ) { return userRepository.save(user); }

public User updateUser( Long id, User request ) { User user = getUserById(id);

user.setName(request.getName()); user.setEmail(request.getEmail());

return userRepository.save(user); }

public void deleteUser( Long id ) { User user = getUserById(id);

userRepository.delete(user); } }

---

10. Membuat Controller REST API

Buat package:

TEXT
controller

Buat file:

TEXT
UserController.java

Isi:

JAVA
package com.example.springbootpostgresdemo.controller;

import com.example.springbootpostgresdemo.entity.User; import com.example.springbootpostgresdemo.service.UserService; import jakarta.validation.Valid; import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController @RequestMapping("/api/users") public class UserController {

private final UserService userService;

public UserController( UserService userService ) { this.userService = userService; }

@GetMapping public List<User> getAllUsers() { return userService.getAllUsers(); }

@GetMapping("/{id}") public User getUserById( @PathVariable Long id ) { return userService.getUserById(id); }

@PostMapping public User createUser( @Valid @RequestBody User user ) { return userService.createUser(user); }

@PutMapping("/{id}") public User updateUser( @PathVariable Long id, @Valid @RequestBody User user ) { return userService.updateUser(id, user); }

@DeleteMapping("/{id}") public String deleteUser( @PathVariable Long id ) { userService.deleteUser(id);

return "User berhasil dihapus"; } }

---

11. Menjalankan Aplikasi dari IntelliJ IDEA

11.1 Jalankan dari Main Class

Buka file:

TEXT
SpringbootPostgresDemoApplication.java

Isinya kira-kira:

JAVA
package com.example.springbootpostgresdemo;

import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication public class SpringbootPostgresDemoApplication {

public static void main(String[] args) { SpringApplication.run( SpringbootPostgresDemoApplication.class, args ); } }

Klik tombol hijau di samping method main.

Atau klik kanan file tersebut, lalu pilih:

TEXT
Run SpringbootPostgresDemoApplication

Jika berhasil, console akan menampilkan log seperti:

TEXT
Started SpringbootPostgresDemoApplication
Tomcat started on port 8080

---

12. Test Koneksi Database PostgreSQL

Saat aplikasi dijalankan, Spring Boot akan mencoba koneksi ke PostgreSQL.

Jika koneksi berhasil, akan muncul log Hibernate dan table otomatis dibuat.

Cek table di PostgreSQL:

BASH
psql -U springuser -d springboot_demo -h localhost

Lalu jalankan:

SQL
\dt

Harusnya muncul table:

TEXT
users

Cek struktur table:

SQL
\d users

---

13. Test API Menggunakan Curl

13.1 Create User

BASH
curl -X POST http://localhost:8080/api/users \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Budi",
    "email": "budi@example.com"
  }'

Contoh response:

JSON
{
  "id": 1,
  "name": "Budi",
  "email": "budi@example.com"
}

---

13.2 Get Semua User

BASH
curl http://localhost:8080/api/users

Contoh response:

JSON
[
  {
    "id": 1,
    "name": "Budi",
    "email": "budi@example.com"
  }
]

---

13.3 Get User Berdasarkan ID

BASH
curl http://localhost:8080/api/users/1

---

13.4 Update User

BASH
curl -X PUT http://localhost:8080/api/users/1 \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Budi Santoso",
    "email": "budi.santoso@example.com"
  }'

---

13.5 Delete User

BASH
curl -X DELETE http://localhost:8080/api/users/1

---

14. Test API Menggunakan Postman

Selain curl, bisa juga pakai Postman.

14.1 POST User

Method:

TEXT
POST

URL:

TEXT
http://localhost:8080/api/users

Body:

JSON
{
  "name": "Andi",
  "email": "andi@example.com"
}

Header:

TEXT
Content-Type: application/json

---

14.2 GET Users

Method:

TEXT
GET

URL:

TEXT
http://localhost:8080/api/users

---

15. Test Langsung dari PostgreSQL

Masuk ke database:

BASH
psql -U springuser -d springboot_demo -h localhost

Cek data:

SQL
SELECT * FROM users;

Contoh hasil:

TEXT
id | name | email
----+------+------------------
  1 | Budi | budi@example.com

---

16. Membuat Health Check Database

Agar lebih mudah mengecek apakah aplikasi bisa konek ke database, buat endpoint khusus.

Buat file:

TEXT
DatabaseTestController.java

Di package:

TEXT
controller

Isi:

JAVA
package com.example.springbootpostgresdemo.controller;

import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController;

@RestController public class DatabaseTestController {

private final JdbcTemplate jdbcTemplate;

public DatabaseTestController( JdbcTemplate jdbcTemplate ) { this.jdbcTemplate = jdbcTemplate; }

@GetMapping("/api/db-test") public String testDatabase() { Integer result = jdbcTemplate.queryForObject( "SELECT 1", Integer.class );

return "Database connected. Result: " + result; } }

Lalu test:

BASH
curl http://localhost:8080/api/db-test

Jika berhasil:

TEXT
Database connected. Result: 1

---

17. Tambahkan Dependency JDBC jika Dibutuhkan

Biasanya JdbcTemplate sudah tersedia jika menggunakan starter tertentu. Jika belum, tambahkan dependency ini di pom.xml:

XML
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>

Lalu reload Maven di IntelliJ:

TEXT
Maven > Reload All Maven Projects

---

18. Contoh pom.xml Lengkap

Contoh pom.xml:

XML
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="
            http://maven.apache.org/POM/4.0.0
            https://maven.apache.org/xsd/maven-4.0.0.xsd">

<modelVersion>4.0.0</modelVersion>

<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>3.5.0</version> <relativePath/> </parent>

<groupId>com.example</groupId> <artifactId>springboot-postgres-demo</artifactId> <version>0.0.1-SNAPSHOT</version> <name>springboot-postgres-demo</name> <description>Demo Spring Boot PostgreSQL</description>

<properties> <java.version>17</java.version> </properties>

<dependencies>

<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>

<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency>

<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validation</artifactId> </dependency>

<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> </dependency>

<dependency> <groupId>org.postgresql</groupId> <artifactId>postgresql</artifactId> <scope>runtime</scope> </dependency>

<dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency>

<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency>

</dependencies>

<build> <plugins>

<plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin>

</plugins> </build>

</project>

Catatan:

Jika membuat project dari Spring Initializr, biasanya pom.xml sudah otomatis dibuat. Anda cukup memastikan dependency yang dibutuhkan sudah ada.

---

19. Membuat Unit Test Koneksi Database

Buka folder:

TEXT
src/test/java

Buat file:

TEXT
DatabaseConnectionTest.java

Isi:

JAVA
package com.example.springbootpostgresdemo;

import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.jdbc.core.JdbcTemplate;

import static org.junit.jupiter.api.Assertions.assertEquals;

@SpringBootTest public class DatabaseConnectionTest {

@Autowired private JdbcTemplate jdbcTemplate;

@Test void testDatabaseConnection() { Integer result = jdbcTemplate.queryForObject( "SELECT 1", Integer.class );

assertEquals(1, result); } }

Jalankan test dari IntelliJ:

TEXT
Klik kanan file test > Run DatabaseConnectionTest

Jika sukses, berarti Spring Boot bisa konek ke PostgreSQL saat test berjalan.

---

20. Error yang Sering Muncul

20.1 Password Authentication Failed

Error:

TEXT
password authentication failed for user "springuser"

Penyebab:

  • Password salah
  • User database belum dibuat
  • Konfigurasi application.properties salah

Solusi:

Cek ulang:

PROPERTIES
spring.datasource.username=springuser
spring.datasource.password=springpass

Coba login manual:

BASH
psql -U springuser -d springboot_demo -h localhost

---

20.2 Connection Refused

Error:

TEXT
Connection refused

Penyebab:

  • PostgreSQL belum berjalan
  • Port salah
  • Host salah

Solusi:

Cek service PostgreSQL:

BASH
sudo systemctl status postgresql

Start PostgreSQL:

BASH
sudo systemctl start postgresql

Pastikan port default PostgreSQL:

TEXT
5432

---

20.3 Database Does Not Exist

Error:

TEXT
database "springboot_demo" does not exist

Solusi:

Masuk PostgreSQL:

BASH
sudo -u postgres psql

Buat database:

SQL
CREATE DATABASE springboot_demo;

---

20.4 Relation Users Does Not Exist

Error:

TEXT
relation "users" does not exist

Penyebab:

  • Table belum dibuat
  • Entity belum terbaca
  • ddl-auto tidak aktif

Solusi:

Pastikan ada:

PROPERTIES
spring.jpa.hibernate.ddl-auto=update

Pastikan class entity ada annotation:

JAVA
@Entity
@Table(name = "users")

---

20.5 Lombok Tidak Jalan di IntelliJ

Gejala:

TEXT
Cannot resolve method getName()
Cannot resolve method setName()

Solusi:

Aktifkan annotation processing:

TEXT
Settings
> Build, Execution, Deployment
> Compiler
> Annotation Processors
> Enable annotation processing

Atau install plugin Lombok jika belum ada.

---

21. Menjalankan Aplikasi dari Terminal

Selain dari IntelliJ, aplikasi juga bisa dijalankan dari terminal.

Masuk ke folder project:

BASH
cd springboot-postgres-demo

Jalankan:

BASH
mvn spring-boot:run

Atau build jar:

BASH
mvn clean package

Jalankan file jar:

BASH
java -jar target/springboot-postgres-demo-0.0.1-SNAPSHOT.jar

---

22. Best Practice Development

22.1 Jangan Simpan Password di Git

Untuk development lokal masih boleh di application.properties.

Tapi untuk production, gunakan environment variable.

Contoh:

PROPERTIES
spring.datasource.url=${DB_URL}
spring.datasource.username=${DB_USERNAME}
spring.datasource.password=${DB_PASSWORD}

Jalankan aplikasi:

BASH
DBURL=jdbc:postgresql://localhost:5432/springbootdemo \
DB_USERNAME=springuser \
DB_PASSWORD=springpass \
mvn spring-boot:run

---

22.2 Pisahkan Layer

Struktur yang rapi:

TEXT
controller -> menerima request
service    -> logic aplikasi
repository -> akses database
entity     -> mapping table database

Jangan menaruh logic bisnis terlalu banyak di controller.

---

22.3 Gunakan DTO untuk Project Serius

Untuk project sederhana, langsung memakai entity di request masih oke.

Untuk project serius, sebaiknya gunakan DTO.

Contoh struktur:

TEXT
dto
├── UserRequest.java
└── UserResponse.java

Tujuannya agar struktur API tidak terlalu bergantung langsung ke struktur table database.

---

22.4 Gunakan Migration Tool

Untuk production, jangan mengandalkan:

PROPERTIES
spring.jpa.hibernate.ddl-auto=update

Lebih baik gunakan:

  • Flyway
  • Liquibase

Contoh production:

PROPERTIES
spring.jpa.hibernate.ddl-auto=validate

---

23. Ringkasan Alur Development

Alur kerja umum development Spring Boot dengan PostgreSQL:

TEXT
1. Install Java
  1. Install Maven
  2. Install PostgreSQL
  3. Buat database dan user
  4. Buat project Spring Boot di IntelliJ
  5. Tambahkan dependency Spring Web, JPA, PostgreSQL
  6. Konfigurasi application.properties
  7. Buat Entity
  8. Buat Repository
  9. Buat Service
  10. Buat Controller
  11. Jalankan aplikasi
  12. Test API
  13. Cek data di PostgreSQL
  14. Tambahkan unit test koneksi database

---

24. Checklist Berhasil

Project dianggap berhasil jika:

  • Aplikasi Spring Boot bisa running di port 8080
  • Tidak ada error koneksi PostgreSQL
  • Table users otomatis dibuat
  • Endpoint /api/users bisa diakses
  • Data bisa insert ke PostgreSQL
  • Data bisa dibaca dari PostgreSQL
  • Endpoint /api/db-test menghasilkan Database connected
  • Unit test database berhasil

---

25. Endpoint Akhir

Daftar endpoint:

TEXT
GET    http://localhost:8080/api/users
GET    http://localhost:8080/api/users/1
POST   http://localhost:8080/api/users
PUT    http://localhost:8080/api/users/1
DELETE http://localhost:8080/api/users/1
GET    http://localhost:8080/api/db-test

---

26. Contoh Request Body

Untuk create dan update user:

JSON
{
  "name": "Budi",
  "email": "budi@example.com"
}

---

27. Penutup

Dengan tutorial ini, Anda sudah memiliki pondasi dasar untuk membuat aplikasi backend menggunakan Spring Boot dan PostgreSQL.

Materi yang sudah dipelajari:

  • Setup Java
  • Setup PostgreSQL
  • Membuat project Spring Boot di IntelliJ IDEA
  • Konfigurasi koneksi database
  • Membuat entity
  • Membuat repository
  • Membuat service
  • Membuat REST controller
  • Menjalankan aplikasi
  • Test API
  • Test koneksi database
  • Unit test sederhana

Setelah ini, pengembangan bisa dilanjutkan ke:

  • Login dan JWT
  • Role user
  • Pagination
  • Search API
  • Upload file
  • Global exception handler
  • DTO dan mapper
  • Flyway migration
  • Docker Compose
  • Deployment ke server
spring bootpostgresqlintellij ideajavamavenrest apicrudjpahibernatedatabasebackendspring data jpajdbcunit testdevelopment