Restful API와 GraphQL 뭐시 다른데?!

김민재·2021년 12월 30일
0

Nest.JS & graphQl

목록 보기
7/7
post-thumbnail

Restful API와 GraphQL 차이점

  • 우선 REST 부터 알아볼까요?REST(REpresentational State Transfer)란 웹에 존재하는 모든 자원(resorce, ex. 이미지, 동영상, 데이터)에 고유한 URI를 부여하여 자원에 대한 주소를 지정하는 방법론, 또는 규칙입니다. 현재 가장 널리 사용되고 있습니다.

1. GraphQL API는 필요한 정보들만 선택해 받아올 수 있다.

  • 사용한 Query문에 따라 응답의 구조가 달라짐
  • Overfetching 문제 해결
  • 데이터 전송량 감소

2. 여러 계층의 정보들을 한 번에 받아올 수 있다.

  • Underfetching 문제 해결
  • 요청 횟수 감소

3. GraphQL은 주로 하나의 endpoint에서 모든 요청을 처리한다.

  • 하나의 URl에서 POST로 모든 요청 가능

GraphQL의 단점이 있다고라?

  • N+1문제는 orm을 사용 하면서 빈번하게 마주하는 문제입니다. N+1이 무엇이고, orm마다 어떻게 해결할 수 있는
  • graphql을 사용하는 사용자로서 graphql의 어떤 특징때문에 N+1문제가 발생하고 어떤 방식으로 해결할 수 있는지 알아보자

n+1 문제란?

  • N+1 문제는 성능에 관한 문제 중 하나로 주로 관계형 데이터베이스에서 one-to-many 관계를 가진 테이블 일어나는 문제이다
query {
	posts {
		id
		title
    contents
    author {...}
	}
}
  • 다음과 같이 posts라는 데이터를 조회하는 쿼리가 있을 때, posts 데이터를 가져오는 쿼리 1개, 그리고 각각의 posts 별로 가지고 있는 author라는 데이터를 가져오는 쿼리가 n개가 필요하며 이를 N + 1 문제라고 한다.
  • 즉, 내부 객체를 얻기 위해 외부 객체에서 N개의 쿼리를 만드는 경우를 말한다.

따라서 N+1 문제를 해결하기 위해서는 보통 세 가지 구성 요소가 필요하다.

  • Data Source: 일괄 가져오기를 지원
  • Data Loader: 요청을 batch
  • Data Fetcher: 컨텍스트를 전달

DataLoader란?

  • DataLoader는 Facebook에서 개발했으며 일괄 처리 및 캐싱을 통해 데이터베이스 또는 웹 서비스와 같은 다양한 원격 데이터 소스 요청에 대한 비용을 줄이는 기능을 한다. 즉, 성능 최적화를 위한 도구이다.

DataLoader의 2가지 특징을 가지고 있다.

1. batch

  • n+1에 대한 문제를 해결해 주는 것이 batch이다.
    DataLoader특정 데이터를 가져오기 위한 각각의 요청을 batch, 즉 모아서 한번의 요청으로 보내주기에 우리는 그 한번의 요청(쿼리)만 짜놓으면 되고 요청으로 받은 결과 값들을 각각에 요청에 맞게 보내준다.
const postsLoader = new DataLoader((author_ids) => getPostsByAuthorIds(author_ids));
postsLoader(1).then((posts) => console.log(posts);) // authorId 1에 해당하는 post들
postsLoader(2).then((posts) => console.log(posts);) // authorId 2에 해당하는 post들
postsLoader(3).then((posts) => console.log(posts);) // authorId 3에 해당하는 post들
// 위 작업이 한 번의 쿼리로 이루어진다.
  • 위와 같이 사용할 수 있다. getPostsByAuthorIds에서 where ~ in이나 join과 같이 한 번의 쿼리로 n개의 결과를 가져오는 데이터베이스에 대한 요청을 해주면, N+1 문제를 해결 할 수 있다. - author들을 가져오는 쿼리 안에서 각각 author에 대한 post를 가져오는 쿼리들이 dataloader를 통해 합쳐져서 하나의 쿼리로 각 author_id에 대한 posts들을 가져올 수 있다.

2. cache

  • 모든 요청을 캐싱하는 것이 아닌 사용자의 단일 요청별로 생성된다.
  • cache에 대한 내용은 설정으로 변경이 가능하며 DataLoader의 instance는 자체적으로 cacheMap 을 가지고 있어 같은 key에 대한 요청이 들어오면 caching된 값을 사용하게 된다.
  • 하지만 web application에서 이런 방식은 메모리가 끊임없이 늘어나 위험할 수 있으므로 요청마다 새로운 DataLoader 객체를 생성해서 사용하는것을 권장하고 있다.

캐싱(Caching)?

  • 캐시(Cache)라고 하는 좀 더 빠른 메모리 영역으로 데이터를 가져와서 접근하는 방식을 말한다.
profile
자기 신뢰의 힘을 믿고 실천하는 개발자가 되고자합니다.

0개의 댓글