GraphQL 실행, 전송, 그리고 실전 문제 해결까지!
GraphQL.js와 GraphQL Java를 사용하여 GraphQL 쿼리를 실행하는 방법 설명
HTTP 프로토콜을 통한 GraphQL API 전송 시 상태 코드 및 엔드포인트 문제점 제시
카카오스타일의 엔드포인트 및 operation name 컨벤션으로 모니터링 문제 해결
GraphQL 쿼리 실행: GraphQL.js vs GraphQL Java
GraphQL.js는 `graphql` 메소드를 사용하여 쿼리를 실행하며, GraphQLObjectType과 GraphQLSchema를 정의한다. 구체적으로, `graphql` 함수에 스키마와 쿼리 소스를 전달하여 결과를 얻는다. 반면, GraphQL Java는 `GraphQL.execute` 메소드를 사용하며, DataFetcher와 GraphQLCodeRegistry를 통해 데이터 로직을 구현한다. 따라서, 각 라이브러리별 실행 방식에 대한 이해가 중요하다.
HTTP 전송의 함정: 상태 코드와 에러 처리
GraphQL은 HTTP 상태 코드 매핑에 대한 명확한 가이드라인이 없어, 200 OK와 에러 응답 간의 모호성이 존재한다. 구체적으로, express-graphql은 data가 없는 경우 500을 반환하지만, Apollo Server는 200을 반환한다. 따라서, 부분 성공과 어플리케이션 에러를 구분하여, 모니터링 툴에서 오탐지를 방지해야 한다.
카카오스타일의 GraphQL 엔드포인트 컨벤션
단일 엔드포인트로 인한 모니터링 문제를 해결하기 위해, 카카오스타일은 엔드포인트 분리 및 operation name 컨벤션을 도입했다. 구체적으로, `/graphql/` 경로를 사용하고, 마이크로서비스 간 호출 시 서비스명을 추가한다. 결과적으로, API gateway 환경에서 요청 추적 및 문제 해결이 용이해졌다.