Java for Beginner
742 subscribers
708 photos
196 videos
12 files
1.14K links
Канал от новичков для новичков!
Изучайте Java вместе с нами!
Здесь мы обмениваемся опытом и постоянно изучаем что-то новое!

Наш YouTube канал - https://www.youtube.com/@Java_Beginner-Dev

Наш канал на RUTube - https://rutube.ru/channel/37896292/
Download Telegram
Введение в GraphQL


GraphQL — это язык запросов для приложения, который позволяет клиентам (например, мобильным приложениям или веб-сайтам) запрашивать ровно те данные, которые им нужны, без лишнего. Он был создан компанией Facebook в 2012 году и стал открытым стандартом в 2015. В отличие от традиционных подходов, где сервер диктует, какие данные отдавать, здесь клиент сам формирует запрос. Это делает систему гибкой и эффективной.

Почему GraphQL вместо привычных методов?

Представь, что у тебя есть интернет-магазин. В старом подходе, называемом REST (это аббревиатура от "Representational State Transfer", что значит "передача состояния представления" — способ организации API, где каждый запрос идёт по фиксированному адресу), ты бы создал отдельные точки входа: одну для списка товаров, другую для деталей пользователя, третью для отзывов. Клиент запрашивает всё сразу, даже если ему нужно только имя товара и цена — и получает кучу лишних данных. Это тратит трафик и замедляет приложение.

GraphQL решает это одной точкой входа (обычно /graphql). Клиент пишет запрос на языке, похожем на JSON, указывая, какие поля нужны. Сервер возвращает только их.

Плюсы:
Меньше запросов: Можно получить данные из нескольких источников за один раз.
Типизация: Всё строго описано в схеме (это как каркас данных, где указано, какие типы полей и как они связаны).
Версионирование не нужно: Клиенты сами выбирают, что запрашивать, без изменений в API.
Интроспекция: Клиент может "спросить" сервер о доступных данных.


В экосистеме Java GraphQL интегрируется легко, особенно с Spring Boot — это фреймворк для быстрой разработки приложений на Java, который упрощает настройку серверов. Есть библиотека graphql-java, но для Spring лучше использовать spring-graphql — она берёт на себя интеграцию.


Настройка проекта: Шаги для старта

Давай создадим простой проект. Предполагаем, у тебя есть Java 17+ и Maven (система сборки проектов). Если новичок, скачай Spring Initializr с сайта spring.io — это онлайн-генератор проектов.

Создай проект Spring Boot с зависимостями:
Spring Web (для HTTP-сервера).
Spring
GraphQL (для поддержки GraphQL).
Spring Data JPA (если нужно база данных, для хранения данных).
H2 Database (встроенная база для тестов).


В файле pom.xml (это конфигурация Maven) добавь:
xml<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-graphql</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>runtime</scope>
</dependency>
</dependencies>


Определи схему. Схема — это файл с описанием типов данных.

Создай файл schema.graphqls в resources/graphql:
graphqltype Query {
bookById(id: ID): Book
allBooks: [Book]
}

type Book {
id: ID
title: String
author: Author
}

type Author {
id: ID
name: String
books: [Book]
}
Здесь Query — это корневой тип для запросов. ID — уникальный идентификатор, String — текст. [Book] значит список книг. Это позволяет запрашивать книги с авторами, и сервер сам свяжет данные.


Создай модель данных. В Java это классы с аннотациями (метками для фреймворка).

Для книги:
javaimport jakarta.persistence.Entity;
import jakarta.persistence.Id;
import jakarta.persistence.ManyToOne;

@Entity
public class Book {
@Id
private Long id;
private String title;
@ManyToOne
private Author author;

// Геттеры и сеттеры (методы для чтения и записи полей)
public Long getId() { return id; }
public void setId(Long id) { this.id = id; }
public String getTitle() { return title; }
public void setTitle(String title) { this.title = title; }
public Author getAuthor() { return author; }
public void setAuthor(Author author) { this.author = author; }
}



#Java #middle #on_request #GraphQL
🔥3👍1
Репозитории для доступа к данным. Spring Data упрощает это:
javaimport org.springframework.data.jpa.repository.JpaRepository;

public interface BookRepository extends JpaRepository<Book, Long> {
}
Это интерфейс, который автоматически генерирует методы вроде findById.



Резолверы: Где происходит магия

Резолверы — это методы, которые "разрешают" запросы, то есть вычисляют данные.

В Spring создай класс:
javaimport graphql.kickstart.tools.GraphQLQueryResolver;
import org.springframework.beans.factory.annotation.Autowired;

public class QueryResolver implements GraphQLQueryResolver {
@Autowired
private BookRepository bookRepository;

public Book bookById(Long id) {
return bookRepository.findById(id).orElse(null); // Возвращает книгу или null, если не найдена
}

public List<Book> allBooks() {
return bookRepository.findAll(); // Все книги
}
}
@Autowired — это инъекция зависимости, Spring сам подставит репозиторий. Для автора аналогично создай AuthorResolver для поля books.


Чтобы связать автора с книгами, добавь резолвер для типа Book:
javaimport graphql.kickstart.tools.GraphQLResolver;

public class BookResolver implements GraphQLResolver<Book> {
public Author author(Book book) {
return book.getAuthor(); // Просто возвращает автора из модели
}
}
Это позволяет в запросе GraphQL получить автора без дополнительных усилий.



Запуск и тестирование

В основном классе приложения (обычно с @SpringBootApplication) ничего менять не нужно — Spring сам настроит /graphql.

Запусти приложение:
mvn spring-boot:run.


Теперь протестируй в инструменте вроде GraphiQL (встроен в Spring GraphQL, доступен по /graphiql).

Пример запроса:
graphqlquery {
bookById(id: 1) {
title
author {
name
}
}
}


Сервер вернёт:
json{
"data": {
"bookById": {
"title": "Война и мир",
"author": {
"name": "Лев Толстой"
}
}
}
}


Только то, что запрошено! Если нужно мутации (изменения данных), добавь type Mutation в схему и резолверы для createBook и т.д.


Продвинутые советы для опытных

Обработка ошибок: Используй GraphQLError для кастомных сообщений.
Производительность: Добавь DataLoader для batch-запросов, чтобы избежать N+1 проблемы (когда для списка из N элементов делается N запросов в базу).
Безопасность: Включи аутентификацию с Spring Security, ограничи поля по ролям.
Интеграция с другими сервисами:
GraphQL может агрегировать данные из микросервисов.


Пример с DataLoader для оптимизации:

Сначала добавь зависимость graphql-java-tools.

Затем в конфигурации:
@Bean
public DataLoaderRegistry dataLoaderRegistry(BookRepository bookRepo) {
DataLoaderRegistry registry = new DataLoaderRegistry();
registry.register("authorLoader", DataLoader.newDataLoader((List<Long> authorIds) ->
CompletableFuture.supplyAsync(() -> bookRepo.findAuthorsByIds(authorIds)))); // Batch-запрос
return registry;
}


В резолвере используй контекст для загрузки.
Это делает систему масштабируемой.


#Java #middle #on_request #GraphQL
🔥3👍1