Frontend/Nest.js

REST와 GraphQL: Controller와 Resolver의 차이점 이해하기

wam 2024. 7. 30. 18:34

 

REST와 GraphQL은 서버와 클라이언트 간의 데이터 통신을 위한 두 가지 주요 방식이다.

각 방식은 NestJS에서 각각 Controller와 Resolver를 사용하여 구현된다.

Resolver와 Controller는 목적과 사용되는 환경에서 차이가 있다. 둘 다 요청을 처리하고 응답을 반환하는 역할을 하지만, 사용하는 프로토콜과 구체적인 사용 사례에서 차이를 보인다.

 

 

REST와 Controller

@Controller('users')
export class UserController {
  constructor(private readonly userService: UserService) {}

  @Get()
  findAll(): Promise<User[]> {
    return this.userService.findAll();
  }

  @Post()
  create(@Body() createUserDto: CreateUserDto): Promise<User> {
    return this.userService.create(createUserDto);
  }
}
  • 사용되는 프로토콜 - 주로 REST API와 함께 사용

  • 역할 - HTTP 요청(GET, POST, PUT, DELETE 등)을 처리하고, 적절한 응답을 반환하는 역할

  • 사용 예 - URL 라우팅을 통해 특정 엔드포인트로 들어오는 요청을 처리

  • 이 예시에서 UserController는 /users 엔드포인트에서의 요청을 처리한다.

 

 

GraphQL과 Resolver

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

  @Query(() => [User])
  async getUsers(): Promise<User[]> {
    return this.userService.findAll();
  }

  @Mutation(() => User)
  async createUser(@Args('name') name: string): Promise<User> {
    return this.userService.create({ name });
  }
}
  • 사용되는 프로토콜 - 주로 GraphQL API와 함께 사용

  • 역할 - GraphQL 쿼리 및 변이 요청을 처리하고, 필요한 데이터를 반환하거나 데이터베이스에 변경을 가하는 역할

  • 사용 예 - GraphQL 스키마에 정의된 쿼리 및 변이에 대한 요청을 처리

  • 이 예시에서 UserResolver는 GraphQL 쿼리 getUsers와 변이 createUser를 처리한다.

 

 

주요 차이점

 

  1. 프로토콜:
    • Controller - HTTP RESTful API 요청을 처리.

    • Resolver - GraphQL 요청을 처리.




  2. 데이터 처리 방식:
    • Controller - REST API의 각 HTTP 메서드(GET, POST 등)에 대한 핸들러를 작성.

    • Resolver - GraphQL 스키마에 정의된 타입과 필드에 대한 핸들러를 작성.




  3. 클라이언트와의 상호작용 방식:
    • REST API에서는 클라이언트가 특정 엔드포인트로 요청을 보내고 서버는 이를 처리하여 응답을 보낸다.

    • GraphQL에서는 클라이언트가 요청 시 필요한 데이터와 그 구조를 명시하고 서버는 이를 처리하여 지정된 형식으로 응답을 반환한다.




두 방식 모두 데이터를 관리하고 처리하는 역할을 하지만, 클라이언트와 서버 간의 통신 방식에 따라 적합한 기술을 선택하면 된다.