Ответ
Идея: Создать внутренний RESTful API для управления проектами и задачами (канбан-доска) с использованием Spring Boot, обеспечив чистую архитектуру и полный цикл разработки.
Реализация (ключевые компоненты):
-
Чистая структура проекта (слоистая архитектура):
src/main/java/com/example/taskboard/ ├── controller/ # REST endpoints (TaskController, ProjectController) ├── service/ # Бизнес-логика (TaskServiceImpl) ├── repository/ # Доступ к данным (JPA Repository) ├── model/ # Сущности (Task, Project, User) └── dto/ # Data Transfer Objects (TaskRequest, TaskResponse) -
Пример контроллера с обработкой ошибок:
@RestController @RequestMapping("/api/tasks") @RequiredArgsConstructor // Lombok для внедрения зависимости public class TaskController { private final TaskService taskService; @GetMapping public ResponseEntity<List<TaskResponse>> getAllTasks() { return ResponseEntity.ok(taskService.findAll()); } @PostMapping public ResponseEntity<TaskResponse> createTask(@Valid @RequestBody TaskRequest request) { // @Valid автоматически проверяет ограничения (Bean Validation) TaskResponse createdTask = taskService.create(request); return ResponseEntity .created(URI.create("/api/tasks/" + createdTask.getId())) .body(createdTask); } @ExceptionHandler(ResourceNotFoundException.class) public ResponseEntity<ErrorResponse> handleNotFound(ResourceNotFoundException ex) { return ResponseEntity.status(HttpStatus.NOT_FOUND) .body(new ErrorResponse("Not Found", ex.getMessage())); } } -
Пример DTO с валидацией:
public class TaskRequest { @NotBlank(message = "Title is mandatory") @Size(max = 100) private String title; @NotNull private Long projectId; @Enumerated(EnumType.STRING) private TaskStatus status = TaskStatus.TODO; // Геттеры и сеттеры }
Что было сделано и почему это важно:
| Действие | Технология/Подход | Результат |
|---|---|---|
| Разделение слоёв | Controller-Service-Repository | Упростило тестирование (можно мокать сервис) и поддержку кода. |
| Использование DTO | Отдельные классы для запроса/ответа API | Защитило модель данных от прямого воздействия извне, скрыло лишние поля. |
| Автоматическая документация | SpringDoc OpenAPI (Swagger UI) | /swagger-ui.html предоставил интерактивную документацию для фронтенд-разработчиков. |
| Контейнеризация | Dockerfile | Упростила развёртывание и обеспечение идентичного окружения. |
| Интеграционное тестирование | @SpringBootTest с TestRestTemplate |
Проверил корректность работы всего стека, включая эндпоинты и БД (H2). |
Итог: Реализованный API использовался небольшой командой (~5 человек) для трекинга задач в рамках нескольких проектов. Практика показала важность чистого кода, автоматических тестов и документации даже для внутренних инструментов.