Spring Boot: создание REST API с нуля

Введение:

В эпоху микросервисов и облачных решений Spring Boot остается одним из самых востребованных фреймворков для создания REST API. Его популярность обусловлена:

✅ Быстрой настройкой — автоконфигурация и встроенные серверы (Tomcat, Netty)
✅ Богатой экосистемой — Spring Data, Security, Cloud и сотни интеграций
✅ Готовностью к production — метрики, health-checks, контейнеризация «из коробки»

В этом руководстве мы разберем практический подход к созданию REST API с нуля, включая:

  • Сквозную разработку — от модели данных до документации API

  • Профессиональные практики — валидация, безопасность, кеширование

  • Оптимизацию — асинхронная обработка, мониторинг, тестирование

1. Настройка проекта

1.1. Инициализация через Spring Initializr

dependencies {
implementation ‘org.springframework.boot:spring-boot-starter-web’
implementation ‘org.springframework.boot:spring-boot-starter-data-jpa’
runtimeOnly ‘com.h2database:h2’
}

Выбор зависимостей:

  • spring-boot-starter-web — для REST-контроллеров

  • spring-boot-starter-data-jpa — работа с БД

  • h2 — встроенная база для разработки

2. Создание CRUD-API

2.1. Модель и репозиторий

@Entity
public class Product {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private double price;
}

public interface ProductRepository extends JpaRepository<Product, Long> {}

2.2. Контроллер

@RestController
@RequestMapping(«/api/products»)
public class ProductController {
private final ProductRepository repository;

@GetMapping
public List<Product> getAll() {
return repository.findAll();
}

@PostMapping
public Product create(@RequestBody Product product) {
return repository.save(product);
}
}

3. Валидация и обработка ошибок

3.1. Валидация запросов

@PostMapping
public Product create(@Valid @RequestBody Product product) {
return repository.save(product);
}

3.2. Глобальный обработчик исключений

@ControllerAdvice
public class GlobalExceptionHandler {
@ResponseStatus(HttpStatus.BAD_REQUEST)
@ExceptionHandler(MethodArgumentNotValidException.class)
public Map<String, String> handleValidationExceptions(MethodArgumentNotValidException ex) {
Map<String, String> errors = new HashMap<>();
ex.getBindingResult().getAllErrors().forEach(error -> {
String fieldName = ((FieldError) error).getField();
String errorMessage = error.getDefaultMessage();
errors.put(fieldName, errorMessage);
});
return errors;
}
}

4. Документирование API

4.1. Настройка Swagger

@Configuration
public class SwaggerConfig {
@Bean
public OpenAPI springShopOpenAPI() {
return new OpenAPI()
.info(new Info().title(«Product API»)
.version(«v1»));
}
}

Доступ: http://localhost:8080/swagger-ui.html

5. Безопасность (JWT + Spring Security)

5.1. Конфигурация Security

@Configuration
@EnableWebSecurity
public class SecurityConfig {
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http
.csrf().disable()
.authorizeHttpRequests()
.requestMatchers(«/api/auth/**»).permitAll()
.anyRequest().authenticated()
.and()
.sessionManagement()
.sessionCreationPolicy(SessionCreationPolicy.STATELESS);
return http.build();
}
}

6. Оптимизация производительности

6.1. Кеширование с Spring Cache

@SpringBootApplication
@EnableCaching
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}

@RestController
@RequestMapping(«/api/products»)
public class ProductController {
@Cacheable(«products»)
@GetMapping(«/{id}»)
public Product getById(@PathVariable Long id) {
return repository.findById(id).orElseThrow();
}
}

Используемые аннотации:

  • @Cacheable — кеширует результат метода

  • @CacheEvict — очищает кеш при обновлении данных

  • @CachePut — обновляет кеш без проверки наличия

6.2. Пагинация и сортировка

@GetMapping
public Page<Product> getAll(
@RequestParam(defaultValue = «0») int page,
@RequestParam(defaultValue = «10») int size,
@RequestParam(defaultValue = «name») String sort) {
return repository.findAll(PageRequest.of(page, size, Sort.by(sort)));
}

7. Асинхронная обработка запросов

7.1. Использование CompletableFuture

@Async
@GetMapping(«/async»)
public CompletableFuture<List<Product>> getAllAsync() {
return CompletableFuture.completedFuture(repository.findAll());
}

Настройка:

@Configuration
@EnableAsync
public class AsyncConfig implements AsyncConfigurer {
@Override
public Executor getAsyncExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(5);
executor.setMaxPoolSize(10);
executor.setQueueCapacity(25);
executor.initialize();
return executor;
}
}

8. Мониторинг и метрики

8.1. Spring Boot Actuator

# application.properties
management.endpoints.web.exposure.include=*
management.endpoint.health.show-details=always

Доступные эндпоинты:

  • /actuator/health — состояние приложения

  • /actuator/metrics — метрики производительности

  • /actuator/prometheus — данные для Prometheus

Заключение: 

Разработка REST API на Spring Boot — это сочетание скорости, надежности и гибкости. В этом руководстве мы прошли полный путь:

✅ От инициализации проекта до production-деплоя
✅ Все ключевые аспекты — данные, безопасность, документирование
✅ Профессиональные инструменты — кеширование, мониторинг, тестирование


Для дальнейшего изучения

  1. Spring Cloud

    • Сервис-дискавери (Eureka)

    • Распределенная конфигурация (Config Server)

    • Circuit Breaker (Resilience4j)

  2. Реактивное программирование

    • Spring WebFlux

    • R2DBC для реактивных БД

    • RSocket для двусторонней связи

  3. Оптимизация производительности

    • Настройка пулов соединений (HikariCP)

    • JVM-тюнинг для контейнеров

    • Грамотное использование кешей (Caffeine, Redis)

  4. Безопасность нового уровня

    • OAuth2 + Keycloak

    • RBAC и ABAC модели

    • Защита от OWASP Top 10

  5. Kubernetes-интеграция

    • Helm-чарты для Spring Boot

    • Horizontal Pod Autoscaling

    • Liveness/Readiness пробы

  6. Генерация кода

    • OpenAPI Generator

    • Spring Data REST для быстрых прототипов

    • Кастомные Spring Boot Starter’ы

  7. Event-Driven архитектура

    • Spring Cloud Stream

    • Kafka-интеграция

    • Saga-паттерн для распределенных транзакций