Spring Boot Project Structure Example
Table of Contents
Project Structure
my-spring-boot-app
├── src
│ ├── main
│ │ ├── java
│ │ │ └── com
│ │ │ └── example
│ │ │ ├── MySpringBootApplication.java
│ │ │ ├── controller
│ │ │ │ └── UserController.java
│ │ │ ├── service
│ │ │ │ └── UserService.java
│ │ │ ├── dto
│ │ │ │ └── UserDTO.java
│ │ │ ├── dao
│ │ │ │ └── UserDAO.java
│ │ │ └── model
│ │ │ └── User.java
│ │ └── resources
│ │ └── application.properties
│ └── test
│ └── java
│ └── com
│ └── example
│ └── MySpringBootApplicationTests.java
└── pom.xml
pom.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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>my-spring-boot-app</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>my-spring-boot-app</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.6.1</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<java.version>11</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-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
Controller Layer
UserController.java
package com.example.controller;
import com.example.dto.UserDTO;
import com.example.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
@RequestMapping("/users")
public class UserController {
@Autowired
private UserService userService;
@GetMapping
public List<UserDTO> getAllUsers() {
return userService.getAllUsers();
}
@GetMapping("/{id}")
public UserDTO getUserById(@PathVariable Long id) {
return userService.getUserById(id);
}
@PostMapping
public UserDTO createUser(@RequestBody UserDTO userDTO) {
return userService.createUser(userDTO);
}
@PutMapping("/{id}")
public UserDTO updateUser(@PathVariable Long id, @RequestBody UserDTO userDTO) {
return userService.updateUser(id, userDTO);
}
@DeleteMapping("/{id}")
public ResponseEntity<Void> deleteUser(@PathVariable Long id) {
userService.deleteUser(id);
return ResponseEntity.noContent().build();
}
}
Service Layer
UserService.java
package com.example.service;
import com.example.dto.UserDTO;
import com.example.dao.UserDAO;
import com.example.model.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.stream.Collectors;
@Service
public class UserService {
@Autowired
private UserDAO userDAO;
public List<UserDTO> getAllUsers() {
return userDAO.findAll().stream().map(UserDTO::new).collect(Collectors.toList());
}
public UserDTO getUserById(Long id) {
return userDAO.findById(id).map(UserDTO::new).orElse(null);
}
public UserDTO createUser(UserDTO userDTO) {
User user = new User(userDTO);
user = userDAO.save(user);
return new UserDTO(user);
}
public UserDTO updateUser(Long id, UserDTO userDTO) {
User user = userDAO.findById(id).orElse(null);
if (user != null) {
user.setName(userDTO.getName());
user.setEmail(userDTO.getEmail());
user = userDAO.save(user);
return new UserDTO(user);
}
return null;
}
public void deleteUser(Long id) {
userDAO.deleteById(id);
}
}
Data Transfer Objects (DTOs)
UserDTO.java
package com.example.dto;
import com.example.model.User;
public class UserDTO {
private Long id;
private String name;
private String email;
public UserDTO() {}
public UserDTO(User user) {
this.id = user.getId();
this.name = user.getName();
this.email = user.getEmail();
}
// Getters and Setters
}
Data Access Object (DAO)
UserDAO.java
package com.example.dao;
import com.example.model.User;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface UserDAO extends JpaRepository<User, Long> {
}
Plain Old Java Objects (POJOs)
User.java
package com.example.model;
import com.example.dto.UserDTO;
import javax.persistence.*;
@Entity
@Table(name = "users")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(nullable = false)
private String name;
@Column(nullable = false, unique = true)
private String email;
public User() {}
public User(UserDTO userDTO) {
this.name = userDTO.getName();
this.email = userDTO.getEmail();
}
// Getters and Setters
}
MySpringBootApplication.java
package com.example;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class MySpringBootApplication {
public static void main(String[] args) {
SpringApplication.run(MySpringBootApplication.class, args);
}
}