티스토리 뷰

Books

[GraphQL] 3장 Graph 쿼리어

U_pic 2022. 6. 4. 01:34

출처: yes24(http://image.yes24.com/goods/81537382/XL)

 

SQL과 GraphQL

GraphQL은 쿼리 데이터베이스용으로 만들어진 개념을 인터넷에 적용해 만들어진 것

GraphQL 쿼리 하나로 데이터 베이스 내에 존재하는 데이터를 모아서 전달할 수 있다.

GraphQL과 SQL 둘다 Query Language이지만 사용환경이 다르다.

SQL의 경우 데이터 베이스로 보내지만, GraphQLAPI로 보낸다.

SQL의 데이터는 데이터 테이블 내에 존재하지만,

GraphQL의 데이터는 단일 데이터 베이스, 여러 개의 데이터 베이스, 파일 시스템, RestAPI, WebSocket, 다른 GraphQL API에서 데이터를 받아올 수 있다.

정리하면 SQL데이터 베이스용, GraphQL인터넷용 쿼리 언어이다.

SELECT, INSERT, DELETE, UPDATE로 동작하는 SQL과 달리,

GraphQLQuery를 통해 데이터를 select 하고, mutation이라는 데이터 타입을 통해 데이터를 조작한다. 그리고 Subscription을 통해 데이터 변경 사항을 감지한다

 

Query

단순한 문자열로 POST 요청 본문에 담겨 GraphQL 엔드포인트로 전달된다

{
	animal {
		name
	}
}

위와 같은 형태의 쿼리를 GraphQL 스키마가 처리할 수 있으면 응답 데이터를 전달해주고, data 내에 요청한 데이터가 포함된다.

Mutation

Query와 형태가 비슷하다. 상태를 수정하고자 할 때 사용한다.

mutation {
	setAnimal(id: 1234) {
		name,
		age	
	}
}

 

GraphQL API Tool

GraphiQL - Link

GraphQL 플레이 그라운드 - Link

 

GraphQL 쿼리

query liftsAndTrails {
	liftCount(status: OPEN)
	allLifts {
		name
		status
	}
	allTrails {
		name
		difficulty
	}
}

쿼리 하나에 여러 종류의 데이터를 받을 수 있고, 작업은 한 번에 하나의 쿼리에 대해서만 이루어진다.

쿼리에 추가할 수 있는 필드는 API 문서에 정의되어있다.

여러 쿼리를 추가할 수 있지만, 필요한 필드만 추가하는 것이 GraphQL의 장점을 살리는 방법이다.

  • 각 필드명은 쿼리의 필드명과 동일하지만 쿼리 안에서 따로 이름을 부여할 수 있다.
  • 중괄호로 묶인 영역을 셀렉션 세트(selection set)라고 하는데, 셀렉션 세트는 중첩시켜 사용할 수 있다.
  • 쿼리 인자(Query Argument)를 사용하여 쿼리 결과에 필터링 작업을 할 수 있다.
query liftsAndTrails {
	open: liftCount(status: OPEN)
	chairLift: allLifts {
		name
		status
	}
	skiSlopes: allTrails {
		name
		difficulty
	}
}

 

에지와 연결

GraphQL 커리어에서 필드는 스칼라(scala) 타입객체(object) 타입 둘 중 하나에 속한다.

스칼라 타입(Scala Type) : 원시타입과 비슷, 정수(Int), 실수(Float), 문자열(String), 불(Boolean), 고유 식별자(ID)

객체 타입(Object Type): 스키마에 정의한 필드를 그룹으로 묶어둔 것

query trailsAccessedByJazzCat {
	Lift(id:'jazz-cat') {
		capacity
		trailAccess {
			name
			difficulty
		}	
	}	
}

capacity의 경우 스칼라 타입에 해당하고, trailAccess는 Lift 타입 내에 존재하는 객체 타입으로 id로 필터링된 값에 대해서 trailAccess 객체의 값을 return 한다.

Lift 노드와 Trail 노드 간 연결을 위처럼 표현할 수 있다.

 

프래그먼트 (Fragment)

쿼리 내 필요한 필드의 중복을 프래그먼트로 줄일 수 있다.

fragment liftInfo on Lift {
	name
	status
	capacity
}

fragment 식별자를 통해 만들 수 있고, 반드시 어떤 타입에 대한 프래그먼트인지 명시해주어야 한다.

프래그먼트를 쿼리에 추가하려면 아래와 같이 사용하면 된다.

query trailsAccessedByJazzCat {
	Lift(id:'jazz-cat') {
		...liftInfo
		trailAccess {
			name
			difficulty
		}	
	}	
}

자바스크립트 spread 연산자와 비슷해 보인다.

 

인터페이스(interface)

인터페이스(interface)는 필드 하나로 객체 타입을 여러 개 반환할 때 사용한다.

추상적 타입으로 유사한 객체 타입을 여러개 만들 때 구현해야 하는 필드 타입을 모아둔 것.

인터페이스를 가지고 타입을 구현할 때는 정의할 때 포함한 필드를 모두 넣어야 하며, 추가로 필드를 넣을 수 도 있다.

 

뮤테이션(Mutation)

뮤테이션은 데이터를 새로 쓰는 방법. 쿼리를 작성하는 방식과 비슷하며, 객체 타입이나 스칼라 타입을 리턴하는 셀렉션 세트가 포함되어야 한다.

mutation burnItDown {
	deleteAllData
}

Query와 동일하게 Mutation은 루트 타입 객체이다. Mutation에 사용할 수 있는 필드를 미리 정의해두어야 사용할 수 있다.

새로운 데이터를 추가할 수 있다.

mutation createSong {
	addSong(title:"No Scrub", numberOne: true, performeName: "TLC") {
		id
		title
		numberOne
	}
}

기존 데이터 변경도 가능하다

mutation cloaseLift {
	ssetLiftStateus(id: "jass-cat", status: CLOSED) {
		name
		status
	}
}

서브스크립션(Subscription)

데이터 서브스크립션을 하면 GraphAPI를 통해 실시간 데이터 변경 내용을 받을 수 있다.

ex) 페이스북 좋아요 기능

subscription {
	liftStatusChange {
		name
		capacity
		status
	}
}

 

인트로스펙션(introspection)

현재 API 스키마의 세부 사항에 관한 쿼리를 작성할 수 있다.

GraphQL API 인트 로스 펙션 쿼리를 사용하면 주어진 API 스키마를 통해 어떤 데이터를 반환받을 수 있는지 조사할 수 있다.

query {
	__schema {
		types {
			name
			description
		}
	}
}

//특정 타입에 대한 결과
query liftDetails {
	__type(name:'Lift') {
		name
		fields {
			name
			description
			type {
				name
			}
		}
	}
}

인트로스팩션에서도 동일하게 프래그먼트를 통해 중복 필드를 줄여줄 수 있다.

'Books' 카테고리의 다른 글

Naming Convention  (0) 2022.07.01
[GraphQL] 4장 스키마 설계하기  (0) 2022.06.08
[GraphQL] 2장 그래프 이론  (0) 2022.06.04
[GraphQL] 1장 GraphQL이란  (0) 2022.06.02
[Clean Code] #13 동시성  (0) 2022.05.12
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함