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

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: подключение к БД мы научимся считывать данные из базы.


Облако тэгов

Kotlin, Java, Spring, Spring Boot, Spring Data, SQL, PostgreSQL, Oracle, Linux, Hibernate, Collections, Stream API, многопоточность, файлы, Nginx, Apache, maven, gradle, JUnit, YouTube, новости, руководство, ООП, алгоритмы, головоломки, rest, GraphQL, Excel, XML, json, yaml.

Последние статьи


Комментарии

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

×

devmark.ru