GraphQL

alirz-pixel·2025년 4월 29일
0

GraphQL은 필요한 데이터만 가져오겠다는 접근 방식을 채택한 데이터 질의 언어이다.

기존 REST API의 문제점

오버패치 (over-fetching)

오버 패치는 영어 문장 그대로 불필요한 데이터까지 같이 가져오는 문제를 말한다.
어느 부분에서는 name, email 값만 필요하더라도 /users/1/을 요청하면 "주소, 생일, 가입일" 등의 불필요한 데이터까지 가져오게 된다.

문제점

  1. 네트워크 낭비: 불필요한 데이터까지 전송하기 때문에 데이터 양이 커지게 되고, 이로 인해 네트워크 성능이 느려질 가능성이 있다
  2. 메모리 낭비: 전송 받은 데이터는 우선 메모리에 저장되기 때문에 메모리를 차지한다.
  3. 클라이언트 리소스 낭비: 받아온 데이터 중 필요한 데이터를 추출하는 과정에서의 렌더링 비용 (CPU 연산, 메모리 사용) 증가 가능성이 있다.

받아온 데이터 중 필요한 것만 추려야 해서 메모리 사용량 증가, 렌더링 비용 증가 가능성이 있음

언더패치 (under-fetching)

언더 패치도 문장 그대로 여러 종류의 데이터가 필요한데, /users/1, /users/1/friends처럼 여러 번 요청 해야 필요한 정보를 다 채울 수 있는 문제를 말한다.

문제점

  1. 다수의 HTTP 요청: 하나의 기능을 위해 여러 번의 API 요청을 보내야 한다. 이로 인해 지연 (latency) 발생 가능성이 있음.
  2. 요청 순서 의존성 발생: API 요청 시, 요청 순서에 의존된다면 비동기 흐름의 복잡성이 증가될 수 있다.
    • /posts/123 (123번 게시글 가져오기)
    • /users/45 (45번 작성자 가져오기)
      123번 게시글이 로드되어야 45번 작성자 정보를 사용할 수 있는 상황과 같이 순서 의존이 발생할 수 있음

Graph QL

쿼리

기존 RestAPI 방식과 다르게 GraphQL은 하나의 엔드포인트에서 요청마다 원하는 필드만 선택적으로 받아올 수 있다.

qeury {  # User 타입에서 name만 가져옴
	user {
    	name
    }
}

query {  # User 타입에서 name과 friends 필드의 name 필드를 가져옴
	user {
    	name
      	friends {
        	name
        }
    }
}

리졸버

리졸버는 GraphQL 스키마의 각 필드에 데이터를 채워주는 함수이다.
(default resolver가 사전에 정의되어 있으며, 가공이 필요한 경우엔 커스텀 리졸버를 제작하여 사용 가능)

// 커스텀 리졸버
const resolvers = {
	Query: {
    	numberSix() {
        	return 6;
        }
    }
}

// 쿼리
query {
	numberSix
}

// 반환 결과
{
	"data": {
    	"numberSix": 6
    }
}

위의 예시는 numberSix 필드에 대해 요청이 들어온 경우, 커스텀 리졸버를 통해 6을 반환받도록 한 예시이다.

0개의 댓글