Panduan Lengkap Spring 6 dan Spring Boot 3: 7 Proyek Efektif
Daftar Isi
- Pengantar Spring 6 dan Spring Boot 3
- Persiapan Lingkungan dan Tools
- Proyek 1: Aplikasi RESTful API Sederhana
- Proyek 2: CRUD dengan Spring Data JPA
- Proyek 3: Autentikasi dan Otorisasi dengan Spring Security
- Proyek 4: Upload dan Download File
- Proyek 5: Integrasi dengan Database NoSQL (MongoDB)
- Proyek 6: Pengiriman Email Otomatis
- Proyek 7: Deployment dan Monitoring Aplikasi
- Sumber Belajar dan Source Code
Pengantar Spring 6 dan Spring Boot 3
Spring Framework adalah salah satu framework paling populer untuk pengembangan aplikasi Java. Versi terbaru, Spring 6, membawa banyak peningkatan performa dan dukungan untuk Java 17+. Spring Boot 3 memudahkan pengembangan aplikasi dengan konfigurasi minimal dan integrasi yang kuat.
Dalam ebook ini, Anda akan belajar langkah demi langkah membangun 7 proyek efektif menggunakan Spring 6 dan Spring Boot 3, mulai dari aplikasi RESTful sederhana hingga deployment dan monitoring.

Persiapan Lingkungan dan Tools
Sebelum memulai, pastikan Anda sudah menyiapkan beberapa tools berikut:
- Java Development Kit (JDK) versi 17 atau lebih baru
- IDE favorit seperti IntelliJ IDEA, Eclipse, atau VS Code
- Maven atau Gradle sebagai build tool
- Postman atau Insomnia untuk testing API
- Database seperti MySQL, PostgreSQL, atau MongoDB (tergantung proyek)
Anda juga bisa menggunakan Spring Initializr ( https://start.spring.io ) untuk membuat proyek Spring Boot dengan cepat.

Proyek 1: Aplikasi RESTful API Sederhana
Pada proyek pertama ini, kita akan membuat aplikasi RESTful API sederhana menggunakan Spring Boot 3 yang menyediakan endpoint untuk menampilkan daftar buku.
Langkah 1: Membuat Proyek Spring Boot
Gunakan Spring Initializr dengan konfigurasi berikut:
- Project: Maven Project
- Language: Java
- Spring Boot: 3.x.x
- Dependencies: Spring Web
Langkah 2: Membuat Model Buku
package com.example.demo.model;
public class Book {
private Long id;
private String title;
private String author;
public Book() {}
public Book(Long id, String title, String author) {
this.id = id;
this.title = title;
this.author = author;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
}
Langkah 3: Membuat Controller
package com.example.demo.controller;
import com.example.demo.model.Book;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@RestController
public class BookController {
@GetMapping("/books")
public List getBooks() {
return List.of(
new Book(1L, "Spring in Action", "Craig Walls"),
new Book(2L, "Pro Spring Boot 3", "Felipe Gutierrez"),
new Book(3L, "Spring Microservices", "Rajesh RV")
);
}
}
Langkah 4: Menjalankan dan Menguji API
Jalankan aplikasi dan akses
http://localhost:8080/books
menggunakan browser atau Postman. Anda akan mendapatkan daftar buku dalam format JSON.

Proyek 2: CRUD dengan Spring Data JPA
Pada proyek ini, kita akan membuat aplikasi CRUD (Create, Read, Update, Delete) menggunakan Spring Data JPA dan database H2 untuk manajemen data buku.
Langkah 1: Tambahkan Dependencies
Tambahkan dependencies berikut di
pom.xml
:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>runtime</scope>
</dependency>
Langkah 2: Konfigurasi application.properties
spring.datasource.url=jdbc:h2:mem:testdb
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=
spring.jpa.database-platform=org.hibernate.dialect.H2Dialect
spring.h2.console.enabled=true
spring.jpa.hibernate.ddl-auto=update
Langkah 3: Buat Entity Book
package com.example.demo.entity;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
@Entity
public class Book {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String title;
private String author;
public Book() {}
public Book(String title, String author) {
this.title = title;
this.author = author;
}
// getters and setters
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
}
Langkah 4: Buat Repository
package com.example.demo.repository;
import com.example.demo.entity.Book;
import org.springframework.data.jpa.repository.JpaRepository;
public interface BookRepository extends JpaRepository<Book, Long> {
}
Langkah 5: Buat Controller CRUD
package com.example.demo.controller;
import com.example.demo.entity.Book;
import com.example.demo.repository.BookRepository;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
@RequestMapping("/api/books")
public class BookController {
private final BookRepository bookRepository;
public BookController(BookRepository bookRepository) {
this.bookRepository = bookRepository;
}
@GetMapping
public List<Book> getAllBooks() {
return bookRepository.findAll();
}
@PostMapping
public Book createBook(@RequestBody Book book) {
return bookRepository.save(book);
}
@GetMapping("/{id}")
public ResponseEntity<Book> getBookById(@PathVariable Long id) {
return bookRepository.findById(id)
.map(ResponseEntity::ok)
.orElse(ResponseEntity.notFound().build());
}
@PutMapping("/{id}")
public ResponseEntity<Book> updateBook(@PathVariable Long id, @RequestBody Book bookDetails) {
return bookRepository.findById(id)
.map(book -> {
book.setTitle(bookDetails.getTitle());
book.setAuthor(bookDetails.getAuthor());
Book updated = bookRepository.save(book);
return ResponseEntity.ok(updated);
}).orElse(ResponseEntity.notFound().build());
}
@DeleteMapping("/{id}")
public ResponseEntity<Void> deleteBook(@PathVariable Long id) {
return bookRepository.findById(id)
.map(book -> {
bookRepository.delete(book);
return ResponseEntity.noContent().build();
}).orElse(ResponseEntity.notFound().build());
}
}
Langkah 6: Testing CRUD API
Gunakan Postman untuk menguji endpoint:
-
GET /api/books
- Mendapatkan semua buku -
POST /api/books
- Menambah buku baru (body JSON dengan title dan author) -
GET /api/books/{id}
- Mendapatkan buku berdasarkan ID -
PUT /api/books/{id}
- Mengupdate buku berdasarkan ID -
DELETE /api/books/{id}
- Menghapus buku berdasarkan ID

Proyek 3: Autentikasi dan Otorisasi dengan Spring Security
Pada proyek ini, kita akan menambahkan fitur autentikasi dan otorisasi menggunakan Spring Security untuk mengamankan endpoint aplikasi.
Langkah 1: Tambahkan Dependency Spring Security
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
Langkah 2: Konfigurasi Security
package com.example.demo.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.web.SecurityFilterChain;
@Configuration
public class SecurityConfig {
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http
.csrf().disable()
.authorizeHttpRequests(auth -> auth
.requestMatchers("/public/**").permitAll()
.anyRequest().authenticated()
)
.httpBasic();
return http.build();
}
}
Langkah 3: Menambahkan User Detail Service Sederhana
package com.example.demo.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.provisioning.InMemoryUserDetailsManager;
@Configuration
public class UserConfig {
@Bean
public UserDetailsService userDetailsService() {
var user = User.withDefaultPasswordEncoder()
.username("user")
.password("password")
.roles("USER")
.build();
return new InMemoryUserDetailsManager(user);
}
}
Langkah 4: Membuat Endpoint Public dan Private
package com.example.demo.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HomeController {
@GetMapping("/public/hello")
public String publicHello() {
return "Hello, this is a public endpoint!";
}
@GetMapping("/private/hello")
public String privateHello() {
return "Hello, this is a secured endpoint!";
}
}
Langkah 5: Testing Autentikasi
Akses
/public/hello
tanpa autentikasi, dan
/private/hello
dengan username
user
dan password
password
.

Proyek 4: Upload dan Download File
Pada proyek ini, kita akan membuat fitur upload dan download file menggunakan Spring Boot.
Langkah 1: Buat Controller untuk Upload dan Download
package com.example.demo.controller;
import org.springframework.core.io.Resource;
import org.springframework.core.io.UrlResource;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import java.net.MalformedURLException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
@RestController
@RequestMapping("/files")
public class FileController {
private final Path storageLocation = Paths.get("uploads");
public FileController() throws Exception {
Files.createDirectories(storageLocation);
}
@PostMapping("/upload")
public String uploadFile(@RequestParam("file") MultipartFile file) throws Exception {
Path targetLocation = storageLocation.resolve(file.getOriginalFilename());
Files.copy(file.getInputStream(), targetLocation);
return "File uploaded: " + file.getOriginalFilename();
}
@GetMapping("/download/{filename}")
public ResponseEntity<Resource> downloadFile(@PathVariable String filename) throws MalformedURLException {
Path filePath = storageLocation.resolve(filename).normalize();
Resource resource = new UrlResource(filePath.toUri());
if (!resource.exists()) {
return ResponseEntity.notFound().build();
}
String contentType = "application/octet-stream";
return ResponseEntity.ok()
.contentType(MediaType.parseMediaType(contentType))
.header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + resource.getFilename() + "\"")
.body(resource);
}
}
Langkah 2: Testing Upload dan Download
Gunakan Postman untuk mengirim file ke endpoint
POST /files/upload
dan unduh file dengan
GET /files/download/{filename}
.

Proyek 5: Integrasi dengan Database NoSQL (MongoDB)
Pada proyek ini, kita akan menggunakan MongoDB sebagai database NoSQL dan mengintegrasikannya dengan Spring Boot.
Langkah 1: Tambahkan Dependencies MongoDB
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
Langkah 2: Konfigurasi application.properties
spring.data.mongodb.uri=mongodb://localhost:27017/springbootdb
Langkah 3: Buat Entity dan Repository
package com.example.demo.model;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;
@Document(collection = "books")
public class Book {
@Id
private String id;
private String title;
private String author;
public Book() {}
public Book(String title, String author) {
this.title = title;
this.author = author;
}
// getters and setters
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
}
package com.example.demo.repository;
import com.example.demo.model.Book;
import org.springframework.data.mongodb.repository.MongoRepository;
public interface BookRepository extends MongoRepository<Book, String> {
}
Langkah 4: Buat Controller CRUD MongoDB
package com.example.demo.controller;
import com.example.demo.model.Book;
import com.example.demo.repository.BookRepository;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
@RequestMapping("/mongo/books")
public class BookMongoController {
private final BookRepository bookRepository;
public BookMongoController(BookRepository bookRepository) {
this.bookRepository = bookRepository;
}
@GetMapping
public List<Book> getAllBooks() {
return bookRepository.findAll();
}
@PostMapping
public Book createBook(@RequestBody Book book) {
return bookRepository.save(book);
}
@GetMapping("/{id}")
public ResponseEntity<Book> getBookById(@PathVariable String id) {
return bookRepository.findById(id)
.map(ResponseEntity::ok)
.orElse(ResponseEntity.notFound().build());
}
@PutMapping("/{id}")
public ResponseEntity<Book> updateBook(@PathVariable String id, @RequestBody Book bookDetails) {
return bookRepository.findById(id)
.map(book -> {
book.setTitle(bookDetails.getTitle());
book.setAuthor(bookDetails.getAuthor());
Book updated = bookRepository.save(book);
return ResponseEntity.ok(updated);
}).orElse(ResponseEntity.notFound().build());
}
@DeleteMapping("/{id}")
public ResponseEntity<Void> deleteBook(@PathVariable String id) {
return bookRepository.findById(id)
.map(book -> {
bookRepository.delete(book);
return ResponseEntity.noContent().build();
}).orElse(ResponseEntity.notFound().build());
}
}
Langkah 5: Testing MongoDB CRUD
Pastikan MongoDB berjalan di localhost:27017, lalu gunakan Postman untuk menguji endpoint CRUD di
/mongo/books
.

Proyek 6: Pengiriman Email Otomatis
Pada proyek ini, kita akan mengirim email otomatis menggunakan Spring Boot dan JavaMailSender.
Langkah 1: Tambahkan Dependency Spring Boot Starter Mail
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
Langkah 2: Konfigurasi application.properties
spring.mail.host=smtp.gmail.com
spring.mail.port=587
spring.mail.username=your-email@gmail.com
spring.mail.password=your-app-password
spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.starttls.enable=true
Langkah 3: Buat Service Pengiriman Email
package com.example.demo.service;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.stereotype.Service;
@Service
public class EmailService {
private final JavaMailSender mailSender;
public EmailService(JavaMailSender mailSender) {
this.mailSender = mailSender;
}
public void sendSimpleEmail(String to, String subject, String text) {
SimpleMailMessage message = new SimpleMailMessage();
message.setFrom("your-email@gmail.com");
message.setTo(to);
message.setSubject(subject);
message.setText(text);
mailSender.send(message);
}
}
Langkah 4: Buat Controller untuk Mengirim Email
package com.example.demo.controller;
import com.example.demo.service.EmailService;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class EmailController {
private final EmailService emailService;
public EmailController(EmailService emailService) {
this.emailService = emailService;
}
@PostMapping("/send-email")
public String sendEmail(
@RequestParam String to,
@RequestParam String subject,
@RequestParam String body) {
emailService.sendSimpleEmail(to, subject, body);
return "Email sent to " + to;
}
}
Langkah 5: Testing Pengiriman Email
Gunakan Postman untuk mengirim request POST ke
/send-email
dengan parameter
to
,
subject
, dan
body
.

Proyek 7: Deployment dan Monitoring Aplikasi
Pada proyek terakhir ini, kita akan membahas cara deployment aplikasi Spring Boot dan monitoring performa menggunakan Actuator.
Langkah 1: Tambahkan Dependency Spring Boot Actuator
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
Langkah 2: Konfigurasi application.properties
management.endpoints.web.exposure.include=health,info,metrics,httptrace
Langkah 3: Menjalankan Aplikasi dan Mengakses Endpoint Actuator
Jalankan aplikasi dan akses endpoint berikut:
-
/actuator/health
- Status kesehatan aplikasi -
/actuator/info
- Informasi aplikasi -
/actuator/metrics
- Statistik performa -
/actuator/httptrace
- Trace HTTP request

Langkah 4: Deployment ke Heroku (Contoh)
Berikut langkah singkat deploy aplikasi ke Heroku:
-
Install Heroku CLI dan login dengan
heroku login
-
Buat aplikasi baru dengan
heroku create nama-aplikasi
-
Push kode ke Heroku dengan
git push heroku main
-
Set konfigurasi environment jika perlu dengan
heroku config:set
- Akses aplikasi melalui URL yang diberikan Heroku

Sumber Belajar dan Source Code
Berikut beberapa sumber belajar dan repository source code yang bisa Anda gunakan untuk memperdalam pemahaman Spring 6 dan Spring Boot 3:
- Official Spring Boot Documentation
- Spring Guides (Tutorials resmi dari Spring)
- Repository Spring Boot di GitHub
- Baeldung - Tutorial Spring Boot Lengkap
- Channel YouTube Java Brains (Tutorial Spring Boot dan Java)
- Contoh Source Code 7 Proyek Spring Boot (GitHub)
