스프링 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 비교
요청 방식 | 여러 개의 엔드포인트 필요 | 하나의 엔드포인트에서 다양한 요청 가능 |
데이터 응답 크기 | 정해진 응답 구조 | 원하는 데이터만 요청 가능 |
오버페칭 문제 | 불필요한 데이터까지 응답 | 필요한 데이터만 선택 가능 |
언더페칭 문제 | 여러 번 요청 필요 | 한 번의 요청으로 데이터 제공 |
유연성 | 엔드포인트마다 응답이 정해짐 | 클라이언트가 원하는 응답을 정의 |
📌 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을 활용한 복잡한 쿼리 최적화를 배워봅시다!
'IT Developer > Spring' 카테고리의 다른 글
Spring 기초 <29. Spring Cloud 기반 MSA(Microservices) 아키텍처 설계> (0) | 2025.04.15 |
---|---|
Spring 기초 <28. Spring Boot와 Kubernetes를 활용한 클라우드 배포 전략> (0) | 2025.04.14 |
Spring 기초 <27. Spring Boot에서 트랜잭션 관리 최적화 (@Transactional, REQUIRES_NEW)> (1) | 2025.04.13 |
Spring 기초 <26. JPA + QueryDSL을 활용한 복잡한 쿼리 최적화> (0) | 2025.04.12 |
Spring 기초 <24. Spring Boot에서 Kafka 이벤트 스트리밍 시스템 구축> (0) | 2025.04.10 |
Spring 기초 <23. Spring Boot에서 Multi-Tenancy 아키텍처 구현> (0) | 2025.04.09 |
Spring 기초 <22. Spring Security에서 RBAC(Role-Based Access Control) 적용> (1) | 2025.04.08 |
Spring 기초 <21. Spring Boot에서 웹소켓(WebSocket)과 실시간 데이터 처리> (1) | 2025.04.07 |