GraphQL은 API를 위한 쿼리 언어(Query Language)이자, 해당 쿼리를 실행하기 위한 서버 측 런타임입니다. 페이스북(현 메타)에서 개발했습니다.
REST API의 문제점:
GraphQL의 해결책:
| 구분 | REST API | GraphQL |
|---|---|---|
| 엔드포인트 | 여러 개 (e.g., /users, /posts) | 단 하나 (e.g., /graphql) |
| 데이터 구조 | 서버가 정의 (고정적) | 클라이언트가 정의 (유연함) |
| 요청 방식 | HTTP 메서드(GET, POST 등)로 동작 정의 | 항상 POST 요청, 쿼리 내용으로 동작 정의 |
@nestjs/graphql)@nestjs/graphql과 @nestjs/apollo 모듈을 통해 GraphQL 서버를 매우 쉽고 구조적으로 구축할 수 있도록 지원합니다.@ObjectType():Movie 타입)@Field():Int, String)을 명시할 수 있습니다.@Resolver():@Controller와 유사한 역할입니다.@Query():@Mutation():@Args():// movie.dto.ts - GraphQL 타입을 위한 DTO
import { ObjectType, Field, Int } from '@nestjs/graphql';
@ObjectType()
export class Movie {
@Field(() => Int)
id: number;
@Field()
title: string;
}
// movies.resolver.ts
import { Resolver, Query, Mutation, Args, Int } from '@nestjs/graphql';
import { Movie } from './dto/movie.dto';
@Resolver(() => Movie) // 이 리졸버가 Movie 타입을 처리함을 명시
export class MoviesResolver {
constructor(private readonly moviesService: MoviesService) {}
@Query(() => [Movie]) // 'movies'라는 쿼리를 정의하고, 반환 타입은 Movie 배열
movies(): Promise<Movie[]> {
return this.moviesService.findAll();
}
@Mutation(() => Movie) // 'createMovie'라는 뮤테이션을 정의
createMovie(@Args('title') title: string): Promise<Movie> {
return this.moviesService.create(title);
}
}
GraphQL 리졸버는 비즈니스 로직을 서비스에 위임하고, 서비스는 TypeORM 리포지토리를 통해 데이터베이스와 상호작용합니다. 이 구조는 REST API와 동일합니다.
리졸버의 역할: 클라이언트의 GraphQL 쿼리를 해석하여, 적절한 서비스 메서드를 호출하고 그 결과를 반환하는 "번역가"이자 "중개자"입니다.
// movies.service.ts
@Injectable()
export class MoviesService {
constructor(
@InjectRepository(MovieEntity) // TypeORM 엔티티의 리포지토리 주입
private readonly movieRepository: Repository<MovieEntity>,
) {}
async findAll(): Promise<MovieEntity[]> {
// DB에서 모든 영화 조회
return this.movieRepository.find();
}
async create(title: string): Promise<MovieEntity> {
const newMovie = this.movieRepository.create({ title });
// DB에 새 영화 저장
return this.movieRepository.save(newMovie);
}
}```
* **GraphQL Playground**: NestJS는 개발 환경에서 GraphQL API를 쉽게 테스트하고 문서를 확인할 수 있는 **GraphQL Playground**라는 도구를 자동으로 제공합니다.
---
### 📌 요약
* **GraphQL**은 클라이언트가 **필요한 데이터의 구조를 직접 정의**하여 요청하는 API 쿼리 언어로, **Over-fetching과 Under-fetching 문제를 해결**합니다.
* NestJS는 **`@nestjs/graphql`** 모듈과 **Code-First** 접근 방식을 통해, TypeScript 클래스와 데코레이터만으로 **GraphQL 스키마를 자동으로 생성**하고 서버를 쉽게 구축할 수 있습니다.
* GraphQL의 **리졸버(`@Resolver`)**는 클라이언트의 쿼리와 뮤테이션을 받아, 기존에 만들어 둔 **서비스(Service)**와 **TypeORM 리포지토리(Repository)**를 호출하여 비즈니스 로직을 처리합니다.
* 결과적으로, NestJS에서는 데이터베이스 로직을 재사용하면서, 기존의 REST API 엔드포인트와 GraphQL 엔드포인트를 **동시에 제공**하는 유연한 아키텍처를 쉽게 구현할 수 있습니다.