Введение

Добро пожаловать в новый цикл статей от команды Гиперскилл. Он будет посвящен техническим аспектам программирования!

В этой серии мы познакомим вас с созданием серверного приложения с нуля с использованием среды Spring и языка программирования Kotlin. Независимо от того, являетесь ли вы новичком или опытным разработчиком в другой области, это руководство предоставит вам знания и навыки, необходимые для создания серверного приложения.

Spring — популярный фреймворк на основе Java, широко используемый для создания приложений корпоративного уровня. Он предоставляет полный набор функций, упрощающих создание надежных и масштабируемых приложений. Kotlin же — современный, лаконичный и выразительный язык программирования, полностью совместимый с Java. Он предлагает несколько функций, которые делают его идеальным выбором для создания серверных приложений.

В этом руководстве мы рассмотрим все, от настройки среды разработки до создания RESTful API, обработки взаимодействий с базой данных и развертывания приложения на рабочем сервере. К концу этой серии вы будете иметь четкое представление о том, как создавать серверные приложения с помощью Spring и Kotlin. Итак, приступим!

Настройка среды

Прежде чем мы начнем, на вашем компьютере должно быть установлено следующее:

  • Ява 8 или выше
  • Котлин
  • IntelliJ IDEA или другая IDE
  • Gradle или Maven для создания и управления зависимостями

Когда у вас есть необходимые инструменты, мы можем начать с создания нового проекта в вашей среде IDE. В этом руководстве мы будем использовать IntelliJ IDEA, но процесс должен быть аналогичным в других IDE. Чтобы создать новый проект, перейдите в раздел Файл > Создать > Проект и выберите «Инициализатор Spring» из вариантов.

После создания проекта вам нужно будет добавить необходимые зависимости для фреймворка Spring. В файле build.gradle вы можете добавить следующие зависимости:

  • весна-паутина
  • весна-данные-jpa
  • h2

Или вы можете использовать меню в Intellij, чтобы найти все эти зависимости, как на скриншоте ниже:

Эти зависимости предоставят вам базовые функции для создания RESTful API и обработки взаимодействий с базой данных. Вы также можете добавить другие зависимости, необходимые для вашего приложения.

После настройки среды разработки мы можем двигаться дальше и создать RESTful API для нашего приложения.

Начало работы с весной

IntelliJ IDEA создала для нас проект Spring Boot. Чтобы запустить его, все, что вам нужно сделать, это открыть основной файл и запустить основную функцию.

Журналы приложения говорят нам, что все настроено правильно, и мы можем двигаться дальше!

Создание RESTful API:

Теперь, когда мы настроили среду разработки, мы можем приступить к созданию нашего RESTful API. В этом разделе мы будем использовать платформу Spring для обработки маршрутизации и обработки запросов и Kotlin для логики API.

Во-первых, мы создадим класс контроллера для обработки маршрутизации для нашего API. В классе контроллера мы будем использовать аннотацию @RestController, чтобы указать, что этот класс будет обрабатывать запросы RESTful API.

@RestController
class TasksController {
    //API logic here
}

Далее мы определим конечную точку нашего API с помощью аннотации @RequestMapping. Эта аннотация позволяет нам указать путь, по которому будет доступна конечная точка. Например, мы можем создать конечную точку для получения информации о задаче, используя следующий код:

@GetMapping("/task/{id}")
fun getTask(@PathVariable id: Long): Task {
    //Fetch task with the provided id and return it
}

Мы также можем добавить другие методы запроса, такие как @PostMapping для создания нового ресурса и @DeleteMapping для удаления существующего ресурса.

Подключение к базе данных:

В этом разделе мы будем использовать библиотеку Spring Data JPA для обработки взаимодействий с базой данных. Эта библиотека позволяет нам легко создавать репозитории для взаимодействия с нашей базой данных и предоставляет удобный способ определить нашу схему базы данных с помощью классов Java.

Во-первых, мы создадим класс сущности, который представляет нашу таблицу базы данных. Например, мы можем создать объект Task следующим образом:

@Entity
data class Task(
    @Id @GeneratedValue
    val id: Long,
    val name: String,
    val description: String,
    val complexity: Complexity
)

enum class Complexity {
    EASY, MEDIUM, HARD
}

Затем создайте интерфейс репозитория, который будет обрабатывать операции CRUD для нашей сущности Task. Это можно сделать, расширив интерфейс CrudRepository и указав типы сущности и первичного ключа.

interface TaskRepository : CrudRepository<Task, Long>

Теперь, когда репозиторий настроен, мы можем использовать его в нашем контроллере для извлечения и обновления данных из базы данных.

Использование репозитория в контроллере:

Теперь, когда мы настроили наш репозиторий, мы можем использовать его в нашем контроллере для извлечения и обновления данных из базы данных. Мы можем использовать аннотацию @Autowired для внедрения репозитория в наш контроллер.

@Autowired
lateinit var taskRepository: TaskRepository

После внедрения репозитория вы можете использовать его в конечных точках API для получения и обновления данных. Например, в нашей конечной точке getTask мы можем получить задачу по ее идентификатору, используя метод findById, предоставляемый репозиторием.

@GetMapping("/task/{id}")
    fun getTask(@PathVariable id: Long): Task {
        return taskRepository.findById(id).orElseThrow { TaskNotFoundException(id) }
    }

Задачи с данным идентификатором может не быть. Поэтому нам нужно это учесть и создать исключение для этого случая.

class TaskNotFoundException(id: Long) :
    Exception("Task with id = $id not found")

Не забывайте, что вам нужно обрабатывать исключения в Spring! Для этого существует так называемый ControllerAdvice. ControllerAdvice — это механизм в Spring, который позволяет разработчикам централизовать обработку исключений и применять общее поведение к нескольким контроллерам в приложении. Он позволяет отделить сквозные задачи от бизнес-логики, делая код более модульным и удобным в сопровождении.

Мы подробно рассмотрим использование различных шаблонов Spring в будущем, а пока давайте создадим простой обработчик TaskNotFoundException:

@ControllerAdvice
class ControllerAdvice {
    @ExceptionHandler
    fun handleTaskNotFoundException(ex: TaskNotFoundException): ResponseEntity<ErrorMessage> {
        val errorMessage = ErrorMessage(
            ex.message, HttpStatus.NOT_FOUND.toString(),
        )
        return ResponseEntity(errorMessage, HttpStatus.NOT_FOUND)
    }
}

Поместите соответствующие аннотации (@ControllerAdvice, @ExceptionHandler), чтобы все работало в Spring. Мы также создаем специальный класс для возврата ошибок:

class ErrorMessage(
    var message: String?,
    var status: String
)

Мы также можем использовать метод save для создания задачи в базе данных.

@PostMapping("/task")
    fun createTask(@RequestBody task: Task): Task {
        return taskRepository.save(task)
    }

Кроме того, мы можем использовать метод deleteById для удаления задачи из базы данных.

 @DeleteMapping("/task/{id}")
    fun deleteTask(@PathVariable id: Long) {
        taskRepository.deleteById(id)
    }

Давайте попробуем наш API с HTTP-файлами IDEA:Новое –›HTTP-запрос:

После выполнения запроса мы увидим следующий ответ консоли:

Теперь давайте попробуем GET localhost:8080/task/1. И мы получим тот же вывод, что и выше.

УДАЛИТЬ localhost:8080/task/1:‹Тело ответа пусто›

Снова GET localhost:8080/task/1после удаления:

Так что все идет по плану!

Реализовав эти основные операции CRUD, мы успешно создали простое серверное приложение с использованием Spring и Kotlin.

Имейте в виду, что это всего лишь базовый пример, и вы можете использовать методы репозитория и другие функции, предоставляемые Spring, для создания более сложных приложений.

Подведение итогов

В заключение, создание серверного приложения с помощью Spring и Kotlin — это простой процесс. Благодаря мощным функциям Spring и выразительному и лаконичному синтаксису Kotlin вы можете создавать надежные и удобные в сопровождении приложения. Мы рассмотрели основы настройки проекта Spring, создания моделей и использования репозиториев для взаимодействия с базой данных. Мы надеемся, что эта статья предоставила вам прочную основу для создания серверных приложений.

Если вы хотите узнать больше о создании серверных приложений с помощью Spring и Kotlin, мы рекомендуем посетить hyperskill.org — онлайн-платформу для проектного обучения компьютерным языкам, науке о данных и математике.

В сотрудничестве с нашим основным поставщиком контента, JetBrains, мы предлагаем интерактивные и всеобъемлющие треки по Spring и Kotlin, а также другим языкам программирования и технологиям.

Вот ссылки на некоторые темы, где вы можете продолжить изучение Spring, с хорошей теорией и практическими задачами и вопросами:

Также, если вы хотите изучить Kotlin, выбирайте наши направления Основы Kotlin и Разработчик Kotlin!

Если вы хотите изучать курсы с качественным содержанием, персонализированным учебным планом и увлекательными практическими заданиями — добро пожаловать в Гиперскилл!

Мы надеемся, что вы нашли это полезным. Если у вас есть какие-либо вопросы или отзывы, сообщите нам об этом в комментариях ниже. Если вам понравилась эта статья и вы хотите быть в курсе подобных материалов, вы можете подписаться на нашу рассылку.

Вы также можете следить за нами в социальных сетях, чтобы быть в курсе наших последних статей и проектов. Мы есть на Reddit, LinkedIn и Facebook.

Спасибо за чтение и удачного кодирования!