🔑 용어 체크
스칼라 타입 : 단 하나의 값만을 저장할 수 있는 데이터 타입
컴포지트 데이터 타입 : 두개 이상의 값을 저장할 수 있는 데이터 타입
오픈 소스로 제공된 쿼리 언어.
- API를 위한 쿼리 언어


🤔 그래프 자료 구조와 트리 구조의 차이 이미지

query {
책(ISBN이 "9780674430006") {
책 이름
저자 {
이름
}
}
}
{
책 : {
책 이름 : "GraphQL은 어렵지 않다",
저자 : [
{ 이름 : "김코딩"},
{ 이름 : "박해커"},
]
}
}


GraphQL로 Blog 앱을 구현할 때


GET 요청이 있었다면,간단한 쿼리와 실행 결과
//실행
{
hero {
name
}
}
//결과
{
"data": {
"hero": {
"name": "R2-D2"
}
}
}
name은 String 타입을 반환히어로의 이름과 히어로의 친구 이름을 같이 쿼리
//요청
{
hero {
name
# 이런 식으로 GraphQL 내에서 주석도 작성할 수 있습니다.
friends {
name
}
}
}
//결과
{
"data": {
"hero": {
"name": "R2-D2",
"friends": [
{
"name": "Luke Skywalker"
},
{
"name": "Han Solo"
},
{
"name": "Leia Organa"
}
]
}
}
}
필드에 인수를 전달하는 부분을 추가하게 되면 쿼리의 필드 및 중첩된 객체들에 전달하여 원하는 데이터만 받아올 수 있다.
//요청
// id가 1000인 human의 name과 height를 쿼리
{
human(id: "1000") {
name
height
}
}
// 결과
// id가 1000인 human의 이름과 키를 쿼리
{
"data": {
"human": {
"name": "Luke Skywalker",
"height": 1.72
}
}
}
필드 이름을 중복해서 사용할 수 없으므로, 필드 이름을 중복으로 사용해서 쿼리를 해야 할 때는 별명을 붙여서 쿼리
// ❌ 필드 이름을 중복해서 사용 불가.
{
hero(episode: EMPIRE) {
name
}
hero(episode: JEDI) {
name
}
}
// 알아볼수 있는 별명 작성 시 쿼리 가능
// 요청
{
empireHero: hero(episode: EMPIRE) {
name
}
jediHero: hero(episode: JEDI) {
name
}
}
// 결과
{
"data": {
"empireHero": {
"name": "Luke Skywalker"
},
"jediHero": {
"name": "R2-D2"
}
}
}
// query keyword와 query name 작성
query HeroNameAndFriends {
hero {
name
friends {
name
}
}
}
// 결과
{
"data": {
"hero": {
"name": "R2-D2",
"friends": [
{
"name": "Luke Skywalker"
},
{
"name": "Han Solo"
},
{
"name": "Leia Organa"
}
]
}
}
}
query 는 오퍼레이션 타입
query 뿐만 아니라 mutation, subscription, describes 등이 있습니다.query HeroNameAndFriends($episode: Episode) {
hero(episode: $episode) {
name
friends {
name
}
}
}
$episode: Episode 일때, $episode: Episode!가 되면 반드시 episode는 Episode여야 한다는 뜻. !는 옵셔널한 사항.GET 요청을 사용하여 데이터를 수정하지 않고, POST 혹은 PUT 요청을 사용하는 것처럼 GraphQL도 유사하다.mutation 키워드를 사용하여 서버측 데이터 수정mutation CreateReviewForEpisode($ep: Episode!, $review: ReviewInput!) {
createReview(episode: $ep, review: $review) {
stars
commentary
}
}
GraphQL 스키마의 가장 기본적인 구성 요소는 서비스에서 가져올 수 있는 객체의 종류, 그리고 포함하는 필드를 나타내는 객체 유형
type Character {
name: String!
appearsIn: [Episode!]!
}
Character은 GraphQL 객체 타입이며, 필드가 있는 타입임을 의미. 스키마에 있는 대부분의 타입은 객체 타입name과 appearIn은 Character 타입의 필드String은 내장된 스칼라 타입 중 하나입니다.!가 붙는다면 필드는 nullable 하지 않고 반드시 값이 들어온다는 의미.[] 배열을 의미. 배열에도 !가 붙을 수 있다.(항상 0개 이상의 요소를 포함한 배열)Resolver 에서 정의const db = require("./../db")
const resolvers = {
Query: { // **Query :** 저장된 데이터 가져오기 (REST 에 GET 과 비슷합니다.)
getUser: async (_, { email, pw }) => {
db.findOne({
where: { email, pw }
}) ... // 실제 디비에서 데이터를 가져오는 로직을 작성합니다.
...
}
},
Mutation: { // **Mutation :** 저장된 데이터 수정하기 ( Create , Update , Delete )
createUser: async (_, { email, pw, name }) => {
...
}
}
Subscription: { // **Subscription :** 실시간 업데이트
newUser: async () => {
...
}
}
};