티스토리 뷰

반응형

📌 NestJS 백엔드 개발: 기초부터 실전까지 - NestJS에서 GraphQL API 구축하기

NestJS는 REST API뿐만 아니라 GraphQL을 완벽하게 지원하여, 유연하고 강력한 API 개발을 가능하게 합니다.
이번 글에서는 NestJS에서 GraphQL을 사용하는 이유, 설정 방법, 쿼리/뮤테이션 작성, 그리고 실전 예제를 중심으로 설명합니다. 🚀


11.1 왜 GraphQL인가?

GraphQL은 Facebook에서 만든 API 쿼리 언어로, 클라이언트가 필요한 데이터만 요청할 수 있게 해줍니다.

✅ GraphQL vs REST

항목 REST API GraphQL

데이터 요청 엔드포인트별 고정 응답 원하는 필드만 선택적 요청 가능
Over-fetching 있음 (필요 없는 데이터까지 수신) 없음 (필요한 데이터만 요청)
문서화 별도 작성 필요 Playground로 자동 문서화

💡 GraphQL은 프론트엔드 친화적인 API 설계 방식입니다.


11.2 NestJS에서 GraphQL 설정하기

✅ 1) 패키지 설치

npm install @nestjs/graphql @nestjs/apollo apollo-server-express graphql

✅ 2) GraphQL 모듈 설정 (Code First 방식)

📂 app.module.ts

import { Module } from '@nestjs/common';
import { GraphQLModule } from '@nestjs/graphql';
import { join } from 'path';

@Module({
  imports: [
    GraphQLModule.forRoot({
      autoSchemaFile: join(process.cwd(), 'src/schema.gql'),
      playground: true,
    }),
  ],
})
export class AppModule {}

✅ autoSchemaFile을 사용해 코드 기반으로 자동 스키마 생성
✅ playground: true로 브라우저에서 쿼리 테스트 가능 (http://localhost:3000/graphql)


11.3 GraphQL 기본 개념 (Code First 기준)

반응형
  • Resolver: 요청을 처리하는 GraphQL 컨트롤러
  • Schema: API의 데이터 구조 정의
  • DTO (InputType): 요청을 받는 타입
  • ObjectType: 응답 타입 정의

11.4 실전 예제: 사용자 GraphQL API 만들기

📂 user.entity.ts

import { ObjectType, Field, Int } from '@nestjs/graphql';

@ObjectType()
export class User {
  @Field(() => Int)
  id: number;

  @Field()
  name: string;

  @Field()
  email: string;
}

📂 create-user.input.ts

import { InputType, Field } from '@nestjs/graphql';

@InputType()
export class CreateUserInput {
  @Field()
  name: string;

  @Field()
  email: string;
}

📂 user.service.ts

import { Injectable } from '@nestjs/common';
import { User } from './user.entity';

@Injectable()
export class UserService {
  private users: User[] = [];
  private id = 1;

  create(userData: CreateUserInput): User {
    const user = { id: this.id++, ...userData };
    this.users.push(user);
    return user;
  }

  findAll(): User[] {
    return this.users;
  }
}

📂 user.resolver.ts

import { Resolver, Query, Mutation, Args } from '@nestjs/graphql';
import { UserService } from './user.service';
import { User } from './user.entity';
import { CreateUserInput } from './create-user.input';

@Resolver(() => User)
export class UserResolver {
  constructor(private readonly userService: UserService) {}

  @Query(() => [User])
  users() {
    return this.userService.findAll();
  }

  @Mutation(() => User)
  createUser(@Args('input') input: CreateUserInput) {
    return this.userService.create(input);
  }
}

11.5 GraphQL 요청 예시

✅ 쿼리: 사용자 목록 조회

query {
  users {
    id
    name
    email
  }
}

✅ 뮤테이션: 사용자 생성

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

💡 GraphQL Playground를 통해 실시간 테스트 가능


11.6 NestJS GraphQL 개발 팁

✔ GraphQL은 REST보다 유연하지만 학습 곡선이 존재함
✔ DTO와 ObjectType을 분리하여 명확한 구조 유지
✔ Code First 방식은 타입 안정성과 유지보수성이 뛰어남
✔ Apollo Federation, Subscription도 지원 (후속 심화편에서 다룸 예정)


11.7 결론: NestJS에서 GraphQL로 API를 더 유연하게!

✅ NestJS는 GraphQL을 완벽하게 통합 지원
✅ Code First 방식으로 타입 안정성과 스키마 자동 생성
✅ Resolver, Input, ObjectType을 통해 강력한 데이터 흐름 관리
✅ 실시간 개발자 문서(Playground) 제공으로 프론트와 협업 수월

다음 글에서는 NestJS 테스트 전략과 TDD 기반 개발 흐름을 다룹니다! 🚀


🔍 다음 글 예고: NestJS의 테스트 전략과 TDD 흐름 구축

📌 다음 편: 12. NestJS에서 테스트 작성과 TDD 실천

 

 

※ 이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/07   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
글 보관함
반응형