프로그래밍/Nest.js

GraphQL 통합: 스키마 및 리졸버 정의의 중요성

shimdh 2025. 3. 20. 09:06
728x90

GraphQL은 현대 웹 애플리케이션에서 API를 설계하는 데 있어 매우 유연하고 효율적인 방법을 제공합니다. 특히 Nest.js와 통합할 경우, 강력한 타입 시스템을 활용하여 클라이언트가 필요한 데이터를 정확히 요청할 수 있도록 지원합니다. 이 과정에서 스키마리졸버를 정의하는 것이 핵심적인 역할을 하며, 이는 GraphQL의 강력한 기능을 최대한 활용하는 데 필수적입니다.

1. 스키마 정의

스키마는 GraphQL API의 구조를 설명하는 중요한 요소입니다. 이는 데이터 모델, 쿼리, 뮤테이션 등을 포함하여 클라이언트가 사용할 수 있는 모든 타입을 명시합니다. 스키마를 통해 클라이언트는 어떤 데이터에 접근할 수 있는지, 그리고 그 데이터가 어떻게 구성되어 있는지를 명확히 이해할 수 있습니다.

스키마의 구성 요소

  • 타입(Type): 객체의 형태를 정의하며, 각 타입은 특정 필드와 그 필드의 데이터 타입을 포함합니다. 예를 들어, 사용자 정보를 담고 있는 User 타입은 사용자의 고유 ID, 이름, 이메일 주소와 같은 필드를 가집니다.
  • 쿼리(Query): 데이터를 조회하기 위한 요청 방식을 정의합니다. 클라이언트는 쿼리를 통해 서버에 특정 데이터를 요청할 수 있으며, 이 요청은 스키마에 정의된 대로 이루어져야 합니다.
  • 뮤테이션(Mutation): 서버의 상태를 변경하기 위한 요청 방식을 정의합니다. 클라이언트는 뮤테이션을 통해 새로운 데이터를 생성하거나 기존 데이터를 수정할 수 있습니다.

예제: 간단한 사용자 스키마

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

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

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

위 예제에서 User라는 타입이 정의되어 있으며, 각 사용자는 고유한 id, name, 그리고 email 속성을 가집니다. 또한, 특정 사용자를 가져오는 쿼리와 새로운 사용자를 생성하는 뮤테이션이 포함되어 있어, 클라이언트는 이 API를 통해 사용자 정보를 쉽게 조회하고 추가할 수 있습니다.

2. 리졸버 정의

리졸버는 클라이언트의 요청에 따라 실제 데이터를 반환하는 함수로, GraphQL의 핵심적인 기능을 수행합니다. 각각의 쿼리나 뮤테이션에 대해 해당되는 리졸버 함수를 작성해야 하며, 이를 통해 클라이언트의 요청에 적절한 응답을 제공할 수 있습니다.

예제: 사용자 리졸버 구현

Nest.js에서는 다음과 같이 리졸버 클래스를 만들 수 있습니다:

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

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

    @Query(() => User)
    async getUser(@Args('id') id: string): Promise<User> {
        return this.userService.findOne(id);
    }

    @Mutation(() => User)
    async createUser(
        @Args('name') name: string,
        @Args('email') email: string,
    ): Promise<User> {
        return this.userService.create({ name, email });
    }
}

위 코드에서:

  • @Resolver() 데코레이터는 이 클래스가 GraphQL 리졸버임을 나타내며, 이를 통해 Nest.js는 이 클래스가 GraphQL 요청을 처리할 수 있도록 인식합니다.
  • getUser 메서드는 특정 ID로 사용자를 검색하며, 이를 위해 서비스 레이어인 userService.findOne() 메서드를 호출하여 실제 데이터베이스에서 사용자 정보를 조회합니다.
  • createUser 메서드는 새로운 사용자를 생성하며, 입력된 이름과 이메일 정보를 바탕으로 서비스를 통해 처리됩니다. 이 과정에서 데이터의 유효성을 검사하고, 필요한 비즈니스 로직을 수행하여 클라이언트에게 적절한 응답을 반환합니다.

결론

GraphQL 통합 시 스키마와 리졸버는 필수적인 요소로, 이 두 가지는 서로 긴밀하게 연결되어 있습니다. 스키마는 데이터 구조와 상호작용 방법을 명확하게 규정하고, 리졸버는 실제 비즈니스 로직을 수행하여 클라이언트에게 필요한 데이터를 제공하는 역할을 합니다. 이러한 과정을 통해 Nest.js 애플리케이션은 더욱 유연하고 효율적으로 작동할 수 있으며, 개발자는 복잡한 데이터 요구 사항을 쉽게 처리할 수 있습니다. GraphQL을 활용한 API 설계는 클라이언트와 서버 간의 상호작용을 최적화하고, 개발 생산성을 높이는 데 기여합니다.

728x90