Spring Boot для курсової: швидкий старт
12 лютого 2026 | 30 хв читання
Spring Framework з'явився у 2003 році як відповідь на складність J2EE. Spring Boot, випущений у 2014, зробив Spring доступним для всіх: автоконфігурація, вбудований сервер, production-ready за хвилини. У 2026 році це де-факто стандарт для enterprise Java. У цій статті — все, що потрібно для курсової.
Чому Spring Boot?
Швидкий старт
Spring Initializr генерує проект за секунди. Вбудований Tomcat — не потрібно окремо налаштовувати сервер.
Автоконфігурація
Spring Boot сам конфігурує компоненти на основі залежностей. Мінімум XML.
Екосистема
Spring Data, Spring Security, Spring Cloud — модулі для будь-якої задачі.
Вакансії
Java + Spring — одна з найбільш затребуваних комбінацій на ринку праці.
Структура проекту
my-spring-app/
├── src/
│ ├── main/
│ │ ├── java/com/example/app/
│ │ │ ├── MySpringAppApplication.java # Точка входу
│ │ │ ├── controller/ # REST Controllers
│ │ │ │ └── UserController.java
│ │ │ ├── service/ # Бізнес-логіка
│ │ │ │ └── UserService.java
│ │ │ ├── repository/ # Доступ до БД
│ │ │ │ └── UserRepository.java
│ │ │ ├── model/ # Entities
│ │ │ │ └── User.java
│ │ │ ├── dto/ # Data Transfer Objects
│ │ │ │ └── UserDTO.java
│ │ │ ├── config/ # Конфігурація
│ │ │ │ └── SecurityConfig.java
│ │ │ └── exception/ # Обробка помилок
│ │ │ └── GlobalExceptionHandler.java
│ │ └── resources/
│ │ ├── application.yml # Налаштування
│ │ ├── static/ # Статичні файли
│ │ └── templates/ # Thymeleaf templates
│ └── test/java/com/example/app/
│ └── controller/
│ └── UserControllerTest.java
├── pom.xml # Maven залежності
└── README.md
Створення REST API
Entity (JPA)
// model/User.java
package com.example.app.model;
import jakarta.persistence.*;
import jakarta.validation.constraints.*;
import lombok.*;
import java.time.LocalDateTime;
@Entity
@Table(name = "users")
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@NotBlank(message = "Username is required")
@Size(min = 3, max = 50, message = "Username must be 3-50 characters")
@Column(unique = true, nullable = false)
private String username;
@Email(message = "Invalid email format")
@NotBlank(message = "Email is required")
@Column(unique = true, nullable = false)
private String email;
@NotBlank(message = "Password is required")
@Size(min = 8, message = "Password must be at least 8 characters")
private String password;
@Enumerated(EnumType.STRING)
private Role role = Role.USER;
@Column(name = "created_at")
private LocalDateTime createdAt = LocalDateTime.now();
@Column(name = "updated_at")
private LocalDateTime updatedAt;
@PreUpdate
public void preUpdate() {
this.updatedAt = LocalDateTime.now();
}
}
enum Role {
USER, ADMIN
}
Repository (Spring Data JPA)
// repository/UserRepository.java
package com.example.app.repository;
import com.example.app.model.User;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.stereotype.Repository;
import java.util.List;
import java.util.Optional;
@Repository
public interface UserRepository extends JpaRepository<User, Long> {
// Spring Data автоматично генерує SQL на основі назви методу
Optional<User> findByUsername(String username);
Optional<User> findByEmail(String email);
List<User> findByRole(Role role);
boolean existsByUsername(String username);
boolean existsByEmail(String email);
// Кастомний JPQL запит
@Query("SELECT u FROM User u WHERE u.createdAt >= :date")
List<User> findUsersCreatedAfter(LocalDateTime date);
// Native SQL запит
@Query(value = "SELECT * FROM users WHERE role = :role LIMIT :limit",
nativeQuery = true)
List<User> findTopUsersByRole(String role, int limit);
}
Service (Бізнес-логіка)
// service/UserService.java
package com.example.app.service;
import com.example.app.dto.UserDTO;
import com.example.app.dto.CreateUserRequest;
import com.example.app.exception.ResourceNotFoundException;
import com.example.app.exception.DuplicateResourceException;
import com.example.app.model.User;
import com.example.app.repository.UserRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
import java.util.stream.Collectors;
@Service
@RequiredArgsConstructor
@Transactional
public class UserService {
private final UserRepository userRepository;
private final PasswordEncoder passwordEncoder;
public List<UserDTO> getAllUsers() {
return userRepository.findAll().stream()
.map(this::convertToDTO)
.collect(Collectors.toList());
}
public UserDTO getUserById(Long id) {
User user = userRepository.findById(id)
.orElseThrow(() -> new ResourceNotFoundException("User not found with id: " + id));
return convertToDTO(user);
}
public UserDTO createUser(CreateUserRequest request) {
// Перевірка на дублікати
if (userRepository.existsByUsername(request.getUsername())) {
throw new DuplicateResourceException("Username already exists");
}
if (userRepository.existsByEmail(request.getEmail())) {
throw new DuplicateResourceException("Email already exists");
}
User user = User.builder()
.username(request.getUsername())
.email(request.getEmail())
.password(passwordEncoder.encode(request.getPassword()))
.build();
User savedUser = userRepository.save(user);
return convertToDTO(savedUser);
}
public UserDTO updateUser(Long id, CreateUserRequest request) {
User user = userRepository.findById(id)
.orElseThrow(() -> new ResourceNotFoundException("User not found"));
user.setUsername(request.getUsername());
user.setEmail(request.getEmail());
return convertToDTO(userRepository.save(user));
}
public void deleteUser(Long id) {
if (!userRepository.existsById(id)) {
throw new ResourceNotFoundException("User not found");
}
userRepository.deleteById(id);
}
private UserDTO convertToDTO(User user) {
return UserDTO.builder()
.id(user.getId())
.username(user.getUsername())
.email(user.getEmail())
.role(user.getRole().name())
.createdAt(user.getCreatedAt())
.build();
}
}
Controller (REST endpoints)
// controller/UserController.java
package com.example.app.controller;
import com.example.app.dto.UserDTO;
import com.example.app.dto.CreateUserRequest;
import com.example.app.service.UserService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
@RequestMapping("/api/v1/users")
@RequiredArgsConstructor
@Tag(name = "Users", description = "User management API")
public class UserController {
private final UserService userService;
@GetMapping
@Operation(summary = "Get all users")
public ResponseEntity<List<UserDTO>> getAllUsers() {
return ResponseEntity.ok(userService.getAllUsers());
}
@GetMapping("/{id}")
@Operation(summary = "Get user by ID")
public ResponseEntity<UserDTO> getUserById(@PathVariable Long id) {
return ResponseEntity.ok(userService.getUserById(id));
}
@PostMapping
@Operation(summary = "Create new user")
public ResponseEntity<UserDTO> createUser(@Valid @RequestBody CreateUserRequest request) {
UserDTO created = userService.createUser(request);
return ResponseEntity.status(HttpStatus.CREATED).body(created);
}
@PutMapping("/{id}")
@Operation(summary = "Update user")
public ResponseEntity<UserDTO> updateUser(
@PathVariable Long id,
@Valid @RequestBody CreateUserRequest request) {
return ResponseEntity.ok(userService.updateUser(id, request));
}
@DeleteMapping("/{id}")
@Operation(summary = "Delete user")
public ResponseEntity<Void> deleteUser(@PathVariable Long id) {
userService.deleteUser(id);
return ResponseEntity.noContent().build();
}
}
Spring Security: базова автентифікація
// config/SecurityConfig.java
package com.example.app.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.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.http.SessionCreationPolicy;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.web.SecurityFilterChain;
@Configuration
@EnableWebSecurity
public class SecurityConfig {
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http
.csrf(csrf -> csrf.disable()) // Вимкнути для REST API
.sessionManagement(session ->
session.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
.authorizeHttpRequests(auth -> auth
.requestMatchers("/api/v1/auth/**").permitAll()
.requestMatchers("/swagger-ui/**", "/v3/api-docs/**").permitAll()
.requestMatchers("/api/v1/admin/**").hasRole("ADMIN")
.anyRequest().authenticated()
)
.httpBasic(basic -> {}); // Або JWT
return http.build();
}
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
}
Потрібна допомога з проектом?
Spring Boot, JPA, Spring Security — наші розробники створять якісний backend для вашої курсової з Java. Без передоплати, оплата після демонстрації.
Замовити курсову з JavaТестування
// test/controller/UserControllerTest.java
package com.example.app.controller;
import com.example.app.dto.CreateUserRequest;
import com.example.app.service.UserService;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
import org.springframework.boot.test.mock.mockito.MockBean;
import org.springframework.http.MediaType;
import org.springframework.test.web.servlet.MockMvc;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.when;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;
@WebMvcTest(UserController.class)
class UserControllerTest {
@Autowired
private MockMvc mockMvc;
@MockBean
private UserService userService;
@Autowired
private ObjectMapper objectMapper;
@Test
void createUser_ShouldReturnCreated() throws Exception {
CreateUserRequest request = new CreateUserRequest();
request.setUsername("testuser");
request.setEmail("test@example.com");
request.setPassword("password123");
UserDTO response = UserDTO.builder()
.id(1L)
.username("testuser")
.email("test@example.com")
.build();
when(userService.createUser(any())).thenReturn(response);
mockMvc.perform(post("/api/v1/users")
.contentType(MediaType.APPLICATION_JSON)
.content(objectMapper.writeValueAsString(request)))
.andExpect(status().isCreated())
.andExpect(jsonPath("$.id").value(1))
.andExpect(jsonPath("$.username").value("testuser"));
}
@Test
void getUserById_NotFound_ShouldReturn404() throws Exception {
when(userService.getUserById(99L))
.thenThrow(new ResourceNotFoundException("User not found"));
mockMvc.perform(get("/api/v1/users/99"))
.andExpect(status().isNotFound());
}
}
application.yml
# src/main/resources/application.yml
spring:
application:
name: my-spring-app
datasource:
url: jdbc:postgresql://localhost:5432/mydb
username: ${DB_USERNAME:postgres}
password: ${DB_PASSWORD:postgres}
driver-class-name: org.postgresql.Driver
jpa:
hibernate:
ddl-auto: update # create, create-drop, validate, none
show-sql: true
properties:
hibernate:
format_sql: true
dialect: org.hibernate.dialect.PostgreSQLDialect
# Swagger
springdoc:
api-docs:
path: /v3/api-docs
swagger-ui:
path: /swagger-ui.html
server:
port: 8080
logging:
level:
com.example.app: DEBUG
org.springframework.security: DEBUG
Замовити курсову з Java Spring Boot
REST API, Security, JPA — повний стек. Без передоплати!
Детальніше