GraphQL

양동귀·2024년 11월 3일

cs

목록 보기
5/5

GraphQL

GraphQL(Graph Query Language)
API를 위한 쿼리 언어, SQL이 데이터베이스 시스템으로부터 데이터를 가져오는 목적을 가진다면, GraphQL은 클라이언트가 데이터를 서버로부터 가져오는 것을 목적으로 한다.

특징

  • restful api 와는 다르게 하나의 엔드 포인트를 사용, 모든 요청을 post로 보냅니다
  • restful api는 호출할때에 각 리소스의 모든 데이터가 반환 → overfetching (필요 이상의 데이터가 전송) 발생
    → GraphQL방식 → 쿼리에서 요청한 데이터만 응답
  • Caching 캐싱이 어렵다
    요청들이 복잡한 graphQL 메시지로 되어있어서 이것을 기준으로 캐싱하기 용이하지 않음
  • 쿼리를 서버에서 해석해서 작업을 수행하기 때문에 서버에 부담이 갈 수 있음

RESTful API로 구현했을때 문제점을 개선

Underfetching 문제 → 하나의 요청으로는 충분한 데이터를 모두 받아오지 못하는 문제
Overfetching → 필요 없는 데이터까지 모두 받아오게 되는 문제

책 상세 페이지 (책 정보, 리뷰 리스트, 리뷰 유저 정보)
1. 책정보, 2. 리뷰, 3. 리뷰쓴 사용자 정보, … → 여러번 API를 호출, 이때마다 필요없는 정보도 같이 받아오게됨
api를 여러번 호출 해서 받은 데이터를 다시 조합하여 사용, 이때 필요없는 데이터도 생기게 되는 문제점을 개선 → graphQL

데이터 추가 수정 삭제는 어떻게?

  • mutation을 사용한다 (메소드 같은 개념)

addbook -> 책 추가 하는 타입 -> 책 추가 하는 동작 수행
addbook 내부의 데이터로 책의 데이터를 추가
그 아래 타입의 형태로 데이터를 반환

구독 기능

Subscription 구독

실시간 데이터 변화를 감지하여 표시하여야 할때

  • restful api → 새로운 리뷰 쌓이는거 확인하기 위해 수시로 api 요청해서 데이터를 받아와야한다
  • graphql 특정 리소스 데이터 업데이트 마다 알림을 받을 수 있음, 리소스 업데이트때 보내주는 정보로 프론트에서 반응하여 화면을 업데이트 해서 보여주게됨 → 웹소켓을 사용
subscription{
	reviewAdded(bookId: "1") {
	//보내줄 정보
		comment
		rating
		user {
			name
		}
	}
}

graphQL 규칙 문서 (Schema 스키마)

graphQL이 적합한 서비스

  • 다양한 데이터 요구가 있는 모바일/웹 애플리케이션
    소셜 미디어 앱 (예: Facebook, Instagram 등)
    → 사용자 피드, 프로필 정보, 알림 등 여러 개의 리소스중 필요한 리소스만 가져오게 하는 graphQL이 적합

  • 복잡하고 방대한 데이터 모델을 가진 서비스
    대용량 데이터를 다루는 대시보드/분석 애플리케이션
    데이터 시각화/분석 도구 (예: Google Analytics, Tableau)
    → Overfetching, Underfetching으로 발생하는 오버헤드가 큰 서비스 → graphQL 적합

  • 데이터 업데이트 실시간 반응이 필요한 서비스 (graphQL 구독 기능 활용)
    채팅 애플리케이션 (예: Slack, Discord)
    → 실시간으로 많은 데이터가 업데이트되는 경우, 필요한 정보만 선택적으로 구독

  • 클라이언트가 데이터 요청에 많은 제어권을 가진 서비스 (예시..?)

참고: https://www.youtube.com/watch?v=lYuWfoWD67Q

0개의 댓글