티스토리 뷰
📌 NestJS 백엔드 개발: 기초부터 실전까지 - NestJS에서 GraphQL API 구축하기
octo54 2025. 3. 21. 11:48📌 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 실천
'project > NestJS + Kubernetes & 마이크로서비스 배포' 카테고리의 다른 글
📌 NestJS 백엔드 개발: 기초부터 실전까지 + NestJS 모노레포 구조와 실전 적용법 (0) | 2025.03.23 |
---|---|
📌 NestJS 백엔드 개발: 기초부터 실전까지 - NestJS에서 테스트 작성과 TDD 실천 (0) | 2025.03.22 |
📌 NestJS 백엔드 개발: 기초부터 실전까지 - NestJS와 WebSocket을 활용한 실시간 기능 구현 (2) | 2025.03.21 |
📌 NestJS 백엔드 개발: 기초부터 실전까지 - NestJS에서 파일 업로드 및 스트리밍 처리 (0) | 2025.03.21 |
📌 NestJS 백엔드 개발: 기초부터 실전까지 - NestJS에서 API 유효성 검사 및 파이프(Pipes) 활용 (0) | 2025.03.21 |
- Total
- Today
- Yesterday
- NestJS
- kotlin
- llm
- gatsbyjs
- 프론트엔드
- flax
- App Router
- 백엔드개발
- AI챗봇
- Python
- 프론트엔드면접
- SEO최적화
- SEO 최적화
- Prisma
- rag
- nextJS
- 웹개발
- Docker
- REACT
- CI/CD
- Ktor
- JAX
- nodejs
- 개발블로그
- PostgreSQL
- Next.js
- fastapi
- 딥러닝
- seo 최적화 10개
- 파이썬알고리즘
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |