Spring Boot MongoDB - Simple App Tutorial

Sebelumnya kita membuat "Belajar MongoDB Dasar Menggunakan MongoDB Compass (Aman untuk Amazon DocumentDB)" https://undebugable.blogspot.com/2026/01/belajar-mongodb-dasar-menggunakan.html.



Step 1 – Buat Project Spring Boot

Opsi A (Recommended): Spring Initializr (Web)

Buka https://start.spring.io

Project Settings

  • Project: Gradle

  • Language: Java

  • Spring Boot: 3.x

  • Java: 17

Project Metadata

  • Group: com.yusuf

  • Artifact: spring-mongo-clean

  • Name: spring-mongo-clean

  • Package name: com.yusuf.springmongoclean

  • Packaging: Jar

Dependencies

  • Spring Web
  • Spring Data MongoDB

Klik Generate → Extract → Open di IntelliJ

Step 2 – Struktur Project (Clean dari Awal)

Setelah dibuka di IntelliJ, rapikan package:

src/main/java/com/yusuf/springmongoclean

├── SpringMongoCleanApplication.java

├── config
│   └── MongoConfig.java   (nanti)

├── controller
│   └── UserController.java

├── service
│   └── UserService.java

├── repository
│   └── UserRepository.java

├── domain
│   └── User.java

└── dto
    └── UserRequest.java

Kenapa ini clean?

  • Controller = HTTP

  • Service = business logic

  • Repository = data access

  • Domain = entity

  • DTO = request/response (tidak bocor entity)

Step 3 – Konfigurasi MongoDB (application.yml)

Buka src/main/resources/application.yml

server:
port: 8080

spring:
application:
name: spring-mongo-clean
mongodb:
uri: ${MONGO_CONNECTION_STRING:mongodb://root:root@localhost:27017/auth_db?authSource=admin}

logging:
level:
org.mongodb.driver: DEBUG
com.yusuf.springmongoclean: DEBUG

Step 4 – Domain Model (Clean & Modern)

domain/User.java

Gunakan Record (Java 17+)

package com.yusuf.springmongoclean.domain;

import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;

@Document(collection = "users")
public record User(
@Id String id,
String name,
String email
) {}

Step 5 – Repository (Spring Data MongoDB)

repository/UserRepository.java

package com.yusuf.springmongoclean.repository;

import com.yusuf.springmongoclean.domain.User;
import org.springframework.data.mongodb.repository.MongoRepository;

import java.util.Optional;

public interface UserRepository extends MongoRepository<User, String> {

Optional<User> findByEmail(String email);
}

*No implementation needed (Spring auto-generate).


Step 6 – Service Layer (Clean Logic)

service/UserService.java

package com.yusuf.springmongoclean.service;

import com.yusuf.springmongoclean.domain.User;
import com.yusuf.springmongoclean.repository.UserRepository;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class UserService {

private final UserRepository repository;

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

public User create(String name, String email) {
repository.findByEmail(email)
.ifPresent(user -> {
throw new IllegalArgumentException("Email already exists");
});

return repository.save(new User(null, name, email));
}

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

Clean Code check:

  • Fungsi kecil

  • Tidak ada side effect tersembunyi

  • Validasi jelas

Step 7 – DTO (Jangan Langsung Pakai Entity)

dto/UserRequest.java

package com.yusuf.springmongoclean.dto;

public record UserRequest(
String name,
String email
) {}    

Step 8 – Controller (REST API)

controller/UserController.java

package com.yusuf.springmongoclean.controller;

import com.yusuf.springmongoclean.domain.User;
import com.yusuf.springmongoclean.dto.UserRequest;
import com.yusuf.springmongoclean.service.UserService;
import org.springframework.web.bind.annotation.*;

import java.util.List;

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

private final UserService service;

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

@PostMapping
public User create(@RequestBody UserRequest request) {
return service.create(request.name(), request.email());
}

@GetMapping
public List<User> findAll() {
return service.findAll();
}
}

Step 9 – Run & Test

Run:


Step 10 – Test di Postman

Curl:

postman request POST 'http://localhost:8080/users' \
  --header 'Content-Type: application/json' \
  --body '{
  "name": "Yusuf3",
  "email": "yusuf3@gmail.com"
}'






Comments

Popular posts from this blog

Numpang Kerja Remote dari Bandung Creative Hub

Debugging PHP Web dengan XDebug di Intellij IDEA (PHP STORM)

Numpang Kerja Remote dari Bandung Digital Valley