프로그래밍/Nest.js

Nest.js에서 GraphQL 통합: 효율적인 API 설계의 새로운 패러다임

shimdh 2025. 3. 19. 20:54
728x90

현대 웹 애플리케이션의 발전과 함께 API 설계는 점점 더 중요해지고 있습니다. 그 중에서도 GraphQL은 클라이언트가 필요한 데이터를 명확하게 요청할 수 있는 강력한 쿼리 언어로 자리 잡았습니다. 이번 포스트에서는 Nest.js에서 GraphQL을 통합하고 활용하는 방법에 대해 자세히 알아보겠습니다.

Meta description:

Nest.js에서 GraphQL을 통합하여 효율적인 API를 설계하는 방법을 알아보세요. 클라이언트의 요구에 맞춘 데이터 요청과 응답을 통해 개발 생산성을 높일 수 있습니다.

1. GraphQL 개념 이해하기

GraphQL의 기본 개념은 클라이언트가 원하는 데이터의 형태와 구조를 명확히 정의하여 서버에 요청할 수 있다는 점입니다. 이를 통해 불필요한 데이터 전송을 줄이고, 효율적인 API 호출이 가능해집니다. GraphQL의 주요 구성 요소는 다음과 같습니다:

  • 쿼리(Query): 클라이언트가 서버로부터 데이터를 가져오기 위해 요청하는 방식입니다. 쿼리를 통해 필요한 데이터만을 선택적으로 요청할 수 있습니다.
  • 변경(Mutation): 클라이언트가 서버의 데이터를 생성하거나 수정하기 위해 요청하는 방식입니다. 이를 통해 데이터베이스의 상태를 변경할 수 있습니다.
  • 서브스크립션(Subscription): 클라이언트가 실시간으로 데이터 변경 사항을 구독하기 위한 요청입니다. 이를 통해 데이터의 변화를 즉시 반영할 수 있습니다.

2. Nest.js에서의 GraphQL 설정

Nest.js에서 GraphQL을 사용하기 위해서는 몇 가지 단계를 거쳐야 합니다:

2.1 패키지 설치

GraphQL과 관련된 패키지를 설치합니다. 이를 통해 Nest.js에서 GraphQL 기능을 사용할 수 있게 됩니다.

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

2.2 모듈 설정

AppModule 또는 특정 모듈 파일에서 GraphqlModule을 임포트하고 설정합니다. 이 과정은 GraphQL의 기본 설정을 구성하는 중요한 단계입니다.

import { Module } from '@nestjs/common';
import { GraphqlModule } from '@nestjs/graphql';

@Module({
  imports: [
    GraphqlModule.forRoot({
      autoSchemaFile: true,
    }),
  ],
})
export class AppModule {}

2.3 스키마 정의

TypeScript 클래스를 이용해 GraphQL 스키마를 정의합니다. 이 스키마는 클라이언트가 요청할 수 있는 데이터의 구조를 명시합니다.

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

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

  @Field()
  name: string;

  @Field()
  email: string;
}

2.4 리졸버 작성

리졸버는 클라이언트의 쿼리를 처리하는 함수입니다. 이 함수는 요청된 데이터를 반환하는 역할을 합니다.

import { Resolver, Query } from '@nestjs/graphql';

@Resolver(of => User)
export class UsersResolver {
  private users = [{ id: 1, name: 'John Doe', email: 'john@example.com' }];

  @Query(returns => [User])
  async getUsers() {
    return this.users;
  }
}

3. 실제 예제 - 사용자 정보 조회하기

위의 설정이 완료되었다면 이제 사용자 정보를 조회하는 간단한 쿼리를 실행해 볼 수 있습니다. 이 쿼리는 모든 사용자 목록 중에서 ID와 이름만을 반환합니다.

query {
  getUsers {
    id
    name
  }
}

이 쿼리를 통해 클라이언트는 서버로부터 필요한 정보만을 효율적으로 받아올 수 있습니다.

4. Mutation 구현 예시

사용자를 추가하는 변형도 쉽게 구현할 수 있습니다. 이를 통해 클라이언트는 새로운 사용자를 생성할 수 있습니다.

import { Resolver, Mutation, Args } from '@nestjs/graphql';

@Resolver(of => User)
export class UsersResolver {

  // ... 기존 코드 ...

  @Mutation(returns => User)
  async addUser(@Args('name') name: string, @Args('email') email: string) {
     const newUser = { id: Date.now(), name, email };
     this.users.push(newUser);
     return newUser;
  }
}

클라이언트 측에서는 다음과 같은 변형 쿼리를 사용할 수 있습니다:

mutation {
  addUser(name:"Jane Doe", email:"jane@example.com") {
    id,
    name,
  }
}

이렇게 하면 새로운 사용자가 추가되고, 그 결과로 ID와 이름이 반환됩니다. 이를 통해 클라이언트는 서버와의 상호작용을 통해 데이터를 동적으로 관리할 수 있습니다.

결론

Nest.js에서의 GraphQL 통합은 개발자에게 매우 직관적이며 강력한 도구입니다. 이 통합을 통해 동적이고 유연하게 API를 구축할 수 있으며, 클라이언트의 요구사항에 맞춰 최적화된 응답 형식을 제공함으로써 효율성을 높일 수 있습니다. 이러한 접근 방식은 특히 복잡한 데이터 모델이나 다양한 클라이언트를 지원해야 하는 경우 큰 장점을 발휘합니다. GraphQL을 활용함으로써 개발자는 더욱 효율적이고 관리하기 쉬운 API를 설계할 수 있습니다.

728x90