IT Developer/Spring

Spring 기초 <25. Spring Boot에서 GraphQL API 개발 (Spring GraphQL)>

TEMA_ 2025. 4. 11. 13:23
반응형

스프링 Spring

25. Spring Boot에서 GraphQL API 개발 (Spring GraphQL)

 

안녕하세요! 태마입니다.

Spring 기초 강좌입니다.

 

강좌의 경우 

1. 주제 간단 정리

2. 상세 주제 정리

으로 이루어져 있습니다.

 

스프링 Spring

포스팅 시작하겠습니다 :)

 


 

1. 주제 간단 정리

 

1. GraphQL이란?

GraphQL은 Facebook에서 개발한 API 쿼리 언어로, 클라이언트가 원하는 데이터를 정확히 요청할 수 있는 API 방식
REST API의 단점을 해결하며, 효율적인 데이터 요청이 가능함

📌 GraphQL의 주요 특징

특징설명
클라이언트가 원하는 데이터만 요청 가능 불필요한 데이터 전송을 줄여 성능 최적화
하나의 엔드포인트로 다양한 데이터 요청 가능 REST API처럼 여러 개의 엔드포인트가 필요 없음
타입 시스템(Type System) 제공 API의 구조를 명확하게 정의 가능
서버에서 필드 단위로 데이터를 가져옴 프론트엔드에서 필요한 데이터만 선택 가능

📌 GraphQL을 사용하면 "불필요한 데이터 전송을 줄이고 API 요청을 최적화 가능"


2. REST API vs GraphQL 비교

REST API는 고정된 엔드포인트를 사용하고, GraphQL은 하나의 엔드포인트에서 다양한 요청을 처리 가능

📌 REST API vs GraphQL 비교

비교 항목REST APIGraphQL
요청 방식 여러 개의 엔드포인트 필요 하나의 엔드포인트에서 다양한 요청 가능
데이터 응답 크기 정해진 응답 구조 원하는 데이터만 요청 가능
오버페칭 문제 불필요한 데이터까지 응답 필요한 데이터만 선택 가능
언더페칭 문제 여러 번 요청 필요 한 번의 요청으로 데이터 제공
유연성 엔드포인트마다 응답이 정해짐 클라이언트가 원하는 응답을 정의

📌 GraphQL을 활용하면 "유연한 API 설계가 가능하고, 클라이언트에서 필요한 데이터만 요청 가능"


✅ 여기까지 GraphQL의 개념과 REST API와의 차이를 배웠습니다!
👉 "그렇다면, Spring Boot에서 GraphQL을 어떻게 구현할까?"
✅ 2부에서 Spring Boot에서 GraphQL을 설정하고, 쿼리(Query) & 변이(Mutation) 구현하는 방법을 배워봅시다!

 

반응형

 


 

2. 상세 주제 정리

 

1. Spring Boot 프로젝트에서 GraphQL 설정

GraphQL을 사용하려면 spring-boot-starter-graphql 의존성을 추가해야 함

📌 1️⃣ build.gradle 설정

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-web'
    implementation 'org.springframework.boot:spring-boot-starter-graphql'
    implementation 'org.springframework.graphql:spring-graphql'
    implementation 'com.graphql-java:graphql-java-tools:5.2.4'
}

GraphQL을 지원하는 라이브러리 추가


2. GraphQL 스키마 정의

GraphQL에서는 schema.graphqls 파일을 사용하여 데이터 구조를 정의함

📌 GraphQL 스키마 예제 (src/main/resources/graphql/schema.graphqls)

type Query {
    getUser(id: ID!): User
    getAllUsers: [User]
}

type Mutation {
    createUser(name: String!, email: String!): User
}

type User {
    id: ID!
    name: String!
    email: String!
}

GraphQL에서 Query는 데이터를 조회하는 역할, Mutation은 데이터를 변경하는 역할
User 타입을 정의하고, id, name, email을 포함

📌 GraphQL을 활용하면 "데이터 타입과 API 구조를 명확하게 정의 가능"


3. GraphQL 서비스 및 데이터 모델 구현

GraphQL API에서 사용할 데이터 모델 및 서비스 클래스를 구현

📌 User 엔티티 생성 (User.java)

import jakarta.persistence.*;

@Entity
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
    private String email;

    // 기본 생성자 및 Getter, Setter
}

JPA를 활용하여 User 엔티티를 생성

📌 User Repository 생성 (UserRepository.java)

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

public interface UserRepository extends JpaRepository<User, Long> {}

JPA를 활용하여 데이터베이스에서 사용자 정보를 조회 및 저장

📌 User Service 생성 (UserService.java)

import org.springframework.stereotype.Service;
import java.util.List;
import java.util.Optional;

@Service
public class UserService {

    private final UserRepository userRepository;

    public UserService(UserRepository userRepository) {
        this.userRepository = userRepository;
    }

    public List<User> getAllUsers() {
        return userRepository.findAll();
    }

    public Optional<User> getUser(Long id) {
        return userRepository.findById(id);
    }

    public User createUser(String name, String email) {
        User user = new User();
        user.setName(name);
        user.setEmail(email);
        return userRepository.save(user);
    }
}

사용자 정보를 조회 및 생성하는 서비스 로직 구현

📌 GraphQL을 적용하면 "데이터 조회 및 변경을 간단한 쿼리 언어로 처리 가능"


4. GraphQL 컨트롤러 구현 (쿼리 & 변이 지원)

GraphQL의 Query 및 Mutation을 처리하는 컨트롤러 구현

📌 User GraphQL 컨트롤러 (UserGraphQLController.java)

import org.springframework.graphql.data.method.annotation.Argument;
import org.springframework.graphql.data.method.annotation.MutationMapping;
import org.springframework.graphql.data.method.annotation.QueryMapping;
import org.springframework.stereotype.Controller;
import java.util.List;
import java.util.Optional;

@Controller
public class UserGraphQLController {

    private final UserService userService;

    public UserGraphQLController(UserService userService) {
        this.userService = userService;
    }

    @QueryMapping
    public List<User> getAllUsers() {
        return userService.getAllUsers();
    }

    @QueryMapping
    public Optional<User> getUser(@Argument Long id) {
        return userService.getUser(id);
    }

    @MutationMapping
    public User createUser(@Argument String name, @Argument String email) {
        return userService.createUser(name, email);
    }
}

GraphQL에서 @QueryMapping은 데이터 조회, @MutationMapping은 데이터 변경 역할

📌 GraphQL을 활용하면 "하나의 엔드포인트에서 다양한 요청을 처리 가능"


5. GraphQL API 테스트 (GraphiQL 사용)

Spring Boot에서 기본적으로 제공하는 GraphiQL을 활용하여 API 테스트 가능

📌 1️⃣ 모든 사용자 조회 (getAllUsers 쿼리 실행)

query {
    getAllUsers {
        id
        name
        email
    }
}

📌 2️⃣ 특정 사용자 조회 (getUser 쿼리 실행)

query {
    getUser(id: 1) {
        name
        email
    }
}

📌 3️⃣ 사용자 생성 (createUser 변이 실행)

mutation {
    createUser(name: "Alice", email: "alice@example.com") {
        id
        name
        email
    }
}

📌 GraphQL을 활용하면 "클라이언트가 원하는 데이터만 요청 가능"


✅ 여기까지 Spring Boot에서 GraphQL API 개발 방법을 배웠습니다!
👉 "그렇다면, JPA + QueryDSL을 활용한 복잡한 쿼리 최적화는 어떻게 할까?"
✅ 다음 회차에서 JPA + QueryDSL을 활용한 복잡한 쿼리 최적화를 배워봅시다!

 

반응형