Статьи Утилиты Telegram YouTube RuTube Отзывы

Spring Data JPA, REST и Kotlin: заготовка проекта

Исходники

13 марта 2023

Тэги: gradle, Kotlin, PostgreSQL, rest, Spring Boot, Spring Data, YouTube, руководство.

Содержание

  1. Заготовка проекта
  2. Контроллер и сервисный слой

Это первая статья из цикла о создании restful-сервиса на Kotlin, который будет взаимодействовать с СУБД Postgres с помощью Spring Data JPA.

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

Данный материал также доступен на Youtube. Пример проекта вы можете посмотреть на Github.

Заготовка проекта

Давайте создадим заготовку проекта с помощью Spring Initializr. В настройках проекта выбираем Gradle-Kotlin, язык – Kotlin. Версию Spring Boot оставляем по умолчанию. Из зависимостей выбираем Spring Web, Spring Data Jpa и драйвер Postgres.

Создание проекта в Spring Initializr

После того как вы скачаете заготовку проекта и откроете файл build.gradle.kts, то в секции dependencies среди прочих у вас должны быть следующие зависимости:

// implementation("org.springframework.boot:spring-boot-starter-data-jpa")
implementation("org.springframework.boot:spring-boot-starter-web")
// runtimeOnly("org.postgresql:postgresql")

Пока что мы ещё не добавили настройки подключения к БД, поэтому все зависимости, связанные с базой, временно закомментируем.

Контроллер и сервисный слой

Типичный rest-сервис разделяют на 3 слоя:

  1. Контроллер – реализует rest-api для взаимодействия с сервисом.
  2. Сервисный слой – содержит всю бизнес-логику.
  3. Репозиторий – взаимодействует с базой данных или другим хранилищем.

Начнём проектировать наш Rest API. Будем возвращать список всех стран. Пока ещё хардкодом, без подключения к базе.

Сначала создадим data-класс, в котором будем на уровне rest передавать информацию о стране. Назовём его CountryDto (dto – data transfer object).

data class CountryDto(
    val id: Int,
    val name: String,
    val population: Int,
)

В этом классе содержатся числовой id страны, её название и количество людей, в ней проживающих.

Затем создадим CountryService, в котором будет бизнес-логика по обработке данных. Для удобства сначала создаём интерфейс:

interface CountryService {
    fun getAll(): List<CountryDto>
}

Затем его реализацию CountryServiceImpl:

@Service
class CountryServiceImpl: CountryService {
    override fun getAll(): List<CountryDto> = listOf(
        CountryDto(id = 1, name = "Германия", population = 1_000_000),
        CountryDto(id = 2, name = "Франция", population = 1_500_000),
    )
}

Как видите, список стран мы здесь хардкодим.

Теперь создадим класс контроллера CountryController:

@RestController
@RequestMapping("/countries")
class CountryController(
    private val countryService: CountryService,
) {
}

Аннотация @RestController говорит о том, что данный класс реализует REST API. Аннотация @RequestMapping определяет, на какой урл относительно корня «привязано» это API. В данном случае оно будет доступно по адресу http://127.0.0.1:8080/countries. В урлах название сущности обычно указывается во множественном числе.

Обратите внимание, что в конструкторе мы указываем именно интерфейс CountryService, а не реализацию. Если реализация одна, Spring сам найдёт её и подставит в данный сервис. Таким образом мы уменьшаем связанность между слоями.

Далее добавим в контроллер метод getAll():

@GetMapping
fun getAll(): List<CountryDto> = countryService.getAll()

Здесь мы просто вызываем соответствующий метод сервисного слоя. Аннотация @GetMapping указывает на то, что данный метод доступен через GET-метод протокола http.

Теперь запустим наш проект и выполним GET-запрос:

curl http://127.0.0.1:8080/countries

В ответ получим наш список:

[
    {
        "id": 1,
        "name": "Германия",
        "population": 1000000
    },
    {
        "id": 2,
        "name": "Франция",
        "population": 1500000
    }
]

В следующей статье Spring Data JPA, REST и Kotlin: подключение к БД мы научимся считывать данные из базы.


См. также


Комментарии

Добавить комментарий

×

devmark.ru