개발놀이터

GraphQL 본문

CS 지식/네트워크

GraphQL

마늘냄새폴폴 2023. 2. 25. 10:30

우리는 이전 시간 RESTful API에 대해서 알아봤습니다. 그리고 크리티컬한 단점인 유연하지 못하다는 특징에 대해서도 잠깐 알아봤죠. 

 

RESTful이 유연하지 못하다는 것은 앞서 설명했듯이 요구사항이 계속 추가될 때마다 새로운 API를 만들어야 한다는 것도 있지만 Over Fetching, Under Fetching 이 두가지 문제도 큰 문제 중 하나입니다. 이번 포스팅에서는 RESTful API가 가진  한계에 대해 자세히 알아보고 그 대안책으로 나온 GraphQL에 대해 자세히 알아보도록 하겠습니다. 

 

 

RESTful API의 한계

REST API의 한계는 너무 명확합니다. 요구사항이 추가될 때마다 새로운 API를 만들어야 하기 때문에 유지보수가 장난아니게 힘들다는 점이 크리티컬했죠. 

 

REST API는 간단한 애플리케이션에선 빛을 발하지만 애플리케이션이 점점 커지면서 대규모 서비스로 발전해나가면 점점 힘들어집니다. 관리해야 하는 API가 한두개가 아니기 때문이죠

 

또한 Over-Fetching과 Under-Fetching이라는 문제도 있습니다. 생소하니 바로 알아보시죠

 

Over-Fetching

예를 들어, 사용자의 데이터를 조회하는 /user API가 있다고 가정해봅시다. 이 때, userId : 1에 해당하는 데이터를 조회한다면 아래와 같은 형태가 됩니다. 

 

request : GET /user/1

response body
{
	"user_id" : 1,
    "user_name" : "철수",
    "user_grade" : "VIP",
    "last_login_timestamp" : "2023-02-25 12:11:45"
    ...
}

여기서 클라이언트는 1번에 해당하는 유저의 이름만을 사용하고 싶습니다. 이름만 반환하는 API가 따로 없다면 같은 /user/1 API를 호출한 다음 user_name에 해당하는 필드만 가져와서 사용해야 합니다.

 

이 때, user_grade나 last_login_timestamp와 같은 필드도 같이 반환됩니다. 이는 곧 리소스 낭비라고 볼 수 있고 이와 같은 낭비를 Over-Fetching이라고 합니다. 

 

Under-Fetching

만약 쇼핑몰의 서비스인 경우, 로그인한 사용자의 장바구니 정보를 보여준다고 가정하면 여러 API를 호출하게 됩니다. 

 

ex) /user/1/cart/notification/wish/.....

 

요청에 맞게 유효한 데이터를 보여주기 위해 여러 API를 호출하게 되는 경우를 Under-Fetching이라고 합니다. 

 

 

GraphQL

GraphQL은 위에서 설명한 것처럼 REST API의 한계를 극복하고자 나왔습니다. Endpoint는 통상 1개만 생성하고 클라이언트에게 필요한 데이터는 클아이너트가 직접 쿼리를 작성, 호출하여 반환받습니다. 

 

위의 문제인 Over-Fetching과 Under-Fetching은 GraphQL을 사용하면 손쉽게 해결할 수 있습니다.

 

request
query {
	user(user_id: 1) {
    	user_name
    }
}

response body
{
	"data": {
    	"user": {
        	"user_name": "철수"
        }
    }
}

 

이렇게 함으로써 Under-Fetching이 해결됩니다. 

 

또한, Over-Fetching 문제도 해결할 수 있습니다. 아래와 같이 말이죠

 

query {
	cart {
    	product_name
        price
    }
    
    notification {
    	is_read
    }
    
    user(user_id: 1) {
    	user_name
        user_grade
    }
}

response body
{
	"cart": [{
    	"product_name": "shoes",
        "price": 12000
    }, ...
    ],
    "user": {
    	"user_name": "철수",
        "user_grade": "VIP"
    }
}

 

정말 너무 좋아보이는 GraphQL의 장점과 단점에 대해 알아보죠

 

장점

  • 클라이언트가 필요한 데이터만 반환할 수 있음
  • 1번의 호출로 원하는 데이터를 한번에 가져올 수 있음
  • REST API의 N + 1 문제를 해결할 수 있음
  • 확장이 용이함

 

장점중에 좀 이상한게 섞여있는 것 같습니다. N + 1 문제? 이거 ORM에서만 일어나는 문제 아니었나? API에서도 N + 1 문제가 발생하나?

 

N + 1 문제는 ORM만의 특별한 문제가 아닙니다. N + 1 문제는 REST API와 같은 web API에서도 발생할 수 있습니다. 

 

우리가 흔히 알고있는 N + 1 문제와 같이 자식 리소스를 N 번 컬렉션 리소스로 가져오기 위해 N + 1 번 서버로 응답이 요청되는 상황을 말합니다. 

 

이런 경우 대게 컬렉션 리소스가 자식리소스에 대해 충분한 정보를 제공하지 않았기 때문에 발생합니다. 

 

한가지 예시를 들어보죠

 

<books uri="/books" size="100">
	<book uri="/books/1" id="1">
		<isbn>3434253561</isbn>
	</book>
	<book uri="/books/2" id="2">
		<isbn>3423423534</isbn>
	</book>
	<book uri="/books/3" id="3">
		<isbn>5352342344</isbn>
	</book>
	...
	...
</books>

위의 예제는 book의 id와 isbn만을 포함한 정보를 가진 book list를 반환하는 /books API입니다. 이 API는 뭔가 부실하죠? 보통 우리가 책에 대한 정보를 가져오기 위해 ISBN 말고 책 이름이나 저자를 주로 찾아올텐데 위와 같은 API에는 해당 정보가 들어있지 않습니다. 

 

위와 같은 시나리오에서 클라이언트 애플리에키션은 반드시 /books/{id}에 있는 각각의 book에 대한 리소스를 N개만큼 더 요청해야 합니다. 결과적으로 REST API는 N + 1 번의 요청을 수행하게 되죠

 

위의 예제는 단 하나의 예제만을 보여주는 것이고 이렇듯이 REST API에서도 불충분한 정보로 인한 N + 1 문제가 발생할 수 있습니다. 

 

단점

  • 백엔드, 프론트엔드 개발자 양쪽 다 러닝커브가 있음
  • 단순한 서비스에서는 사용하기가 복잡함
  • 캐싱 기능의 구현이 복잡함
  • 요청이 text로 날아가기 때문에 File 전송 등을 구현하기가 까다로움
  • 접근성과 호환성이 아직 부족함

 

이번 GraphQL도 REST와 마찬가지로 마지막 단점이 크리티컬한데요. REST는 HTTP의 규약을 그대로 따르기 때문에 HTTP를 사용하는 서비스에 그냥 아무렇게나 갖다 붙여도 돌아가기 마련입니다. 하지만 GraphQL은 그렇지 않죠...

 

REST API는 전 세계에서 오랫동안 사랑받았으며, 지금도 여전히 유용한 패러다임입니다. 현재 구현된 대부분의 API 서비스가 REST를 따른다고 해도 과언이 아니죠. 모두가 사용하고 따르는 기술이든 무엇이든 그럴만한 이유가 있는 것 같습니다. 

 

GraphQL이 신기술이며 새로운 패러다임을 제공하긴 했지만 REST를 대체할만한 기술인 것 같지는 않은것 같습니다. 

 

REST는 REST만의 특징이 있고 GraphQL은 GraphQL만의 특징이 있으니 상황에 맞게 적절히 골라 사용하면 좋을 것 같습니다. 

 

 

여기까지 GraphQL에 대해 알아봤습니다. 처음에 이해하는데 조금 애먹었던 주제였습니다. 제가 사용해보지 않았던 기술이기 때문에 어떤 느낌인지 처음엔 와닿지않았는데 계속 보다보니 이해가 된 것 같습니다. 

 

긴 글 읽어주셔서 감사합니다. 오늘도 좋은 하루 보내세요!

 

 

출처

https://hwasurr.io/api/rest-graphql-differences/

 

GraphQL과 REST의 차이점

GraphQL은 API에 대한 새로운 패러다임으로 여겨지고 있습니다. GraphQL에서는 API서버에서 엄격하게 정의된 endpoint 들에 요청하는 대신, 한번의 요청으로 정확히 가져오고 싶은 데이터를 가져올 수

hwasurr.io

https://velopert.com/2318

 

GraphQL 강좌 1편: GraphQL이 무엇인가? | VELOPERT.LOG

최근 페이스북에서 만든 어플리케이션 레이어 쿼리 언어인 GraphQL 이 공식릴리즈되어 여기저기서 적용한 사례가 생기고있죠 (페이스북은 원래부터 사용하고있었고, 대표적으로 갓 GitHub..) 이 Gra

velopert.com

https://brownbears.tistory.com/450

 

GraphQL이란?

GraphQL은 facebook에서 만든 Graph Query Language로 어플리케이션 레이어 쿼리 언어입니다. 다시 말해서 API를 위한 쿼리 언어이며 타입 시스템을 사용하여 쿼리를 실행하는 서버사이드 런타임입니다. Gra

brownbears.tistory.com

https://restfulapi.net/rest-api-n-1-problem/

 

What is N+1 Problem in REST?

Like in ORM applications, the insufficient information in collection resources may lead to the N+1 problem in the REST APIs.

restfulapi.net

 

'CS 지식 > 네트워크' 카테고리의 다른 글

동기, 비동기 프로그래밍  (0) 2023.03.16
OSI 7 계층, TCP / IP 4 계층  (0) 2023.03.02
RESTful API  (0) 2023.02.25
TCP와 UDP의 특징과 차이점  (0) 2022.12.24
HTTP 캐시와 조건부 동작  (0) 2021.08.17