Проект для управления мастер-классами с REST API на Spring Boot.
- Java 21 - современная версия Java
- Spring Boot 3.5.7 - фреймворк для создания приложений
- Spring Data JDBC - работа с базой данных
- PostgreSQL - реляционная база данных
- Lombok - уменьшение boilerplate кода (геттеры, сеттеры, конструкторы)
- JUnit 5 - тестирование с группировкой и современными практиками
- Spotless - автоматическое форматирование кода
- Docker Compose - контейнеризация базы данных
-
Убедитесь, что установлены
Docker(включаетdocker compose) и Java 21. -
Поднимите базу данных:
docker compose up -d
-
Запустите backend:
cd backend ./gradlew bootRun -
Приложение доступно по адресу
http://localhost:8080, база данных PostgreSQL — на порту5432. -
Если нужно остановить приложение: lsof -ti :8080 | xargs kill
Вы можете переопределить значения по умолчанию, экспортировав переменные перед запуском docker compose:
export DB_NAME=mydb
export DB_USER=myuser
export DB_PASSWORD=secret
docker compose up -dВсе переменные необязательные, значения по умолчанию: godo / godo / godo.
- Entity класс для работы с таблицей
master_classes - Использует Lombok для генерации геттеров/сеттеров
- Spring Data JDBC автоматически преобразует camelCase в snake_case (например,
durationMinutes→duration_minutes)
- Интерфейс для работы с БД
- Наследуется от
CrudRepository - Автоматическая генерация SQL-запросов Spring Data
- REST контроллер с эндпоинтами:
GET /api/master-classes- получить все мастер-классыPOST /api/master-classes- создать новый мастер-класс
- Автоматически устанавливает
createdAtпри создании записи
cd backend
./gradlew testТесты организованы с использованием современных практик:
- @Nested - группировка тестов по функциональности
- @DisplayName - читаемые названия тестов
- Helper-методы - устранение дублирования кода
- GetAllMasterClassesTests - тесты получения всех мастер-классов
- CreateMasterClassTests - тесты создания мастер-классов
- ✅ Успешные сценарии (GET, POST)
- ✅ Получение пустого списка
- ✅ Получение всех записей
- ✅ Создание мастер-класса
- ✅ Автоматическая установка
createdAt - ✅ Создание и последующее получение записи
http://localhost:8080
Метод: GET
URL: http://localhost:8080/api/master-classes
- Статус:
200 OK - Тело ответа: Массив мастер-классов (может быть пустым
[])
Метод: POST
URL: http://localhost:8080/api/master-classes
{
"title": "Java для начинающих",
"description": "Изучите основы Java программирования",
"instructor": "Иван Иванов",
"durationMinutes": 120,
"price": 5000.00
}{
"title": "Spring Boot продвинутый",
"description": "Углубленное изучение Spring Boot фреймворка",
"instructor": "Петр Петров",
"durationMinutes": 180,
"price": 8000.50
}{
"title": "React с нуля",
"description": "Изучите React с нуля до профи",
"instructor": "Мария Сидорова",
"durationMinutes": 240,
"price": 10000.00
}- Статус:
201 Created - Тело ответа: Созданный объект с полями:
{ "id": 1, "title": "Java для начинающих", "description": "Изучите основы Java программирования", "instructor": "Иван Иванов", "durationMinutes": 120, "price": 5000.00, "createdAt": "2024-01-15T10:30:00" }
Параметры подключения:
- Host:
localhost - Port:
5432 - Database:
godo - Username:
godo - Password:
godo
CREATE TABLE master_classes (
id BIGSERIAL PRIMARY KEY,
title VARCHAR(255) NOT NULL,
description TEXT,
instructor VARCHAR(255),
duration_minutes INTEGER,
price DECIMAL(10, 2),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
Проект использует Lombok для уменьшения boilerplate кода:
@Getter/@Setter- автоматическая генерация геттеров и сеттеров@NoArgsConstructor- конструктор без параметров@RequiredArgsConstructor- конструктор для final полей
Spring Data JDBC автоматически преобразует имена полей из camelCase в snake_case:
durationMinutes→duration_minutescreatedAt→created_attitle→title(без изменений)
Аннотация @Column не требуется, если имя колонки соответствует автоматическому преобразованию.
Тесты написаны с использованием современных практик:
- Интеграционные тесты с реальной БД
- Группировка тестов с помощью
@Nestedдля лучшей читаемости - Helper-методы для устранения дублирования кода
- Использование
@DisplayNameдля читаемых названий тестов