Публикация

Пишем REST на Kotlin используя Spring Boot

Два года назад я полностью перешел на Kotlin и начал переводить большинство своих проектов написанных на Java. Тут я хочу показать как создать базовый проект на Spring Boot с использованием базы данных и конечно же Kotlin.

Что нам потребуется?

Прежде чем приступить давайте составим список всего необходимого нам:

Подготовительные работы

Переходим на start.spring.io и выбираем Gradle, Kotlin, а также актуальную стабильную версию Spring Boot.

https://api.bcode.dev/v1/content/storage/post/100034/f7d95888d8f443d1be5f133faf55ad51.png

Также, дополнительно я добавил следующие зависимости:

  • Spring Web - позволит нам создавать REST API;
  • Spring Data JPA - даст нам возможность коммуницировать с базой данных;
  • PostgreSQL Driver - драйвер базы данных Postgres с который мы будем работать в этом примере.

Жмем Generate и открываем проект в IDEA, также весь исходный код, который будет рассматриваться в этом примере можно найти на нашем GitHub.

Создаем сущность

Давайте представим, что у нас будет API позволяющее получить список все пользователей. Соответственно нам нужно будет работать с сущностью User создаем data class UserEntity():

@Entity
@Table(name = "users")
data class UserEntity(
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        @Column(nullable = false)
        var id: Long = 0,
        @Column(nullable = false)
        var email: String,
) {
        fun dto(): UserDTO = UserDTO(id, email)
}

data class UserDTO(
        val id: Long,
        val email: String,
)

Как вы могли заметить с примера выше, то там уже описан метод преобразующий нашу сущность в DTO (Data Transfer Object) UserDTO.

Хорошим тоном является, предоставлять в ответах нашего API не сущности напрямую, а DTO объекты. Так как их можно менять и представлять в любом удобном для вас виде, что не требует изменений в нашем Entity.

Обратите также внимание, что я создал один Kotlin файл в пакете dev.bcode.kotlinapi.users.User.kt и уже в нем буду создавать все нужные мне Data классы, касающиеся нашей сущности UserEntity.

Настраиваем Spring Data

Уже сейчас имея описанный UserEntity с нужными нам аннотациями с пакета javax.persistence.* мы можем запустить наш проект и получить отображение данной сущности в базе данных в виде таблицы users.

Для этого нужно в папке resources переименовать файл application.propertiesapplication.yml со следующим содержимым:

spring:
  jpa:
    show-sql: true
    hibernate:
      ddl-auto: create
  datasource:
    driver-class-name: org.postgresql.Driver
    url: jdbc:postgresql://localhost:5432/spring_boot_api_db
    username: postgres
    password: postgres

Тут в поле jpa мы настраиваем JPA Framework:

  • show-sql - показывать выполняемые запросы;
  • hibernate.ddl-auto - режим работы при котором JPA будет создавать таблицы на основе entities, либо проверять их верность сравнивая существующие таблицы и entities.

Также, мы должны указать как будет осуществляться подключение к нашей базе данных. За это отвечает поле datasource:

  • driver-class-name - имя драйвера, зависит от базы данных, которую вы будите использовать;
  • url - путь по которому будет происходить подключение к БД. Состоит с jdbc:[имя драйвера]://[хост]:[порт]/[имя базы данных];
  • username, password - имя и пароль пользователя вашей базы данных.

Запускаем проект, и в результате мы увидим, что в нашей БД была создана таблица users.

https://api.bcode.dev/v1/content/storage/post/100034/f1177ce6002b47b3a487038a0358d684.png

Чтобы ваши таблицы не пересоздавались каждый раз при перезапуске вашего проекта, вам необходимо поменять режим ddl-auto на validate.

Теперь у нас есть таблица в базе, но пока мы не можем с ней коммуницировать, для этого нам нужно создать UserRepository интерфейс и унаследовать JpaRepository<>:

package dev.bcode.kotlinapi.users

import org.springframework.data.jpa.repository.JpaRepository

interface UserRepository : JpaRepository<UserEntity, Long> { }

JpaRepository уже имеет необходимый список методов для базовой коммуникации с нашей сущностью.

Пишем API

Пришло время создать UserController:

package dev.bcode.kotlinapi.users

import org.springframework.web.bind.annotation.GetMapping
import org.springframework.web.bind.annotation.RequestMapping
import org.springframework.web.bind.annotation.RestController

@RestController
@RequestMapping("/users")
class UserController(val userService: UserService) {

    @GetMapping
    fun getUsers(): List<UserDTO> {
        return userService.getAll().map { it.dto() }
    }

}

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

Давайте сразу же и заложим в нашу архитектуру слой сервис создав UserService:

package dev.bcode.kotlinapi.users

import org.springframework.stereotype.Service

@Service
class UserService(val userRepository: UserRepository) {
    fun getAll(): List<UserEntity> {
        return userRepository.findAll()
    }
}

Ну вот, теперь сервис будет выполнять всю необходимую бизнес-логику, а наш контролер использовать его и предоставлять API.

Тестируем

Для того чтобы протестировать написаное мной API я буду использовать Insomnia REST Client вы же можете использовать любой REST клиент, который вам удобен.

https://api.bcode.dev/v1/content/storage/post/100034/91041dbf951946989a3278b6e69b3909.png

Заранее, я вручную добавил несколько пользователей в базу данных.

Как мы можем видеть все работает и созданием базового скелета для нашего будущего API готово с использованием Kotlin.

Опубликовано: 11 августа 2021 г.Просмотров: 194

Комментарии

Мы не даем слово анониму 😶
Войдите, пожалуйста.

Еще никто не комментировал эту публикацию 🤔