Post

Graph QL(3) - typeDefs์™€ resolvers

๐Ÿ“Œ์‹œ์ž‘ํ•˜๋ฉฐ

์œ ํŠœ๋ธŒ ๊ฐ•์˜๋ฅผ ๋“ฃ๊ณ  ๋ฐฑ์—”๋“œ์—์„œ ๋งŒ๋“ค์–ด ๋‘” ๋‚ด์šฉ์„ readํ•˜๋Š” ๊ฐ„๋‹จํ•œ ์•ฑ์„ ๋งŒ๋“ค์–ด๋ดค๋Š”๋ฐ, ๋ฐฑ์—”๋“œ ์„ค์ •๋ถ€๋ถ„์—์„œ ์ดํ•ด๊ฐ€ ๋ถ€์กฑํ•œ ๋ถ€๋ถ„์„ ์ฑ„์šฐ๊ณ ์ž ํ•œ๋‹ค.๐Ÿ˜Ž

โœ…typeDefs

typeDef(Type Definition)๋Š” GraphQL์Šคํ‚ค๋งˆ ๊ตฌ์กฐ๋ฅผ ์ •์˜ํ•œ๋‹ค. ๊ฐ ํ•„๋“œ๋Š” ์ง€์ •๋œ ์œ ํ˜•์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š”๋ฐ, ํ•„๋“œ์˜ ๋ฐ˜ํ™˜ ์œ ํ˜•์€ scalar, object, enum, union, interface๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.

โžก๏ธScalar types

GraphQL์˜ ๊ธฐ๋ณธ ์Šค์นผ๋ผ ์œ ํ˜•์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

ํƒ€์ž…์„ค๋ช…
Int32๋น„ํŠธ ์ •์ˆ˜ ์ˆซ์ž
Float์†Œ์ˆ˜์ ์ด ์žˆ๋Š” ์ˆซ์ž
String๋ฌธ์ž์—ด (๋ฌธ์ž๋“ค์˜ ๋ชจ์Œ)
Booleantrue ๋˜๋Š” false (์ฐธ ๋˜๋Š” ๊ฑฐ์ง“)
ID๊ฐ์ฒด๋ฅผ ๋‹ค์‹œ ๊ฐ€์ ธ์˜ค๊ฑฐ๋‚˜ ์บ์‹œ์˜ ํ‚ค๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ณ ์œ  ์‹๋ณ„์ž.
๋ฌธ์ž์—ด๋กœ ์ €์žฅ๋˜์ง€๋งŒ ์‚ฌ๋žŒ์ด ์ฝ๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋˜์ง€๋Š” ์•Š์Œ.

โžก๏ธObject types

์ฒด ํƒ€์ž…์€ ๊ฐ๊ธฐ ๋‹ค๋ฅธ ํƒ€์ž…์˜ ํ•„๋“œ๋“ค์„ ๋ชจ์•„ ๋†“์€ ๊ฒƒ์œผ๋กœ ๋‘ ๊ฐœ์˜ ๊ฐ์ฒด ํƒ€์ž…์€ ์„œ๋กœ๋ฅผ ํ•„๋“œ๋กœ ํฌํ•จํ•  ์ˆ˜ ์žˆ๋‹ค.

1
2
3
4
5
6
7
8
9
type Book {
  title: String
  author: Author
}

type Author {
  name: String
  books: [Book]
}
  • Book ํƒ€์ž…: ์ฑ…์˜ ์ œ๋ชฉ๊ณผ ์ €์ž ์ •๋ณด๋ฅผ ๊ฐ€์ง.
  • Author ํƒ€์ž…: ์ €์ž์˜ ์ด๋ฆ„๊ณผ ์ €์ž๊ฐ€ ์“ด ์ฑ…๋“ค์˜ ๋ฆฌ์ŠคํŠธ๋ฅผ ๊ฐ€์ง.

์ฆ‰, ์œ„์™€ ๊ฐ™์ด type์ด ์ •์˜๋˜์—ˆ๋‹ค๋ฉด, ์ด๋Ÿฌํ•œ ๋ฐ์ดํ„ฐ ํ˜•ํƒœ๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
{
  "title": "ํ•ด๋ฆฌํฌํ„ฐ",
  "author": {
    "name": "JK ๋กค๋ง",
    "books": [
      {
        "title": "ํ•ด๋ฆฌํฌํ„ฐ์™€ ์ฃฝ์Œ์˜ ์„ฑ๋ฌผ"
      },
      {
        "title": "ํ•ด๋ฆฌํฌํ„ฐ์™€ ๋น„๋ฐ€์˜ ๋ฐฉ"
      }
    ]
  }
}

โžก๏ธThe Query type

Query ํƒ€์ž…์€ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์„œ๋ฒ„์— ์š”์ฒญํ•  ์ˆ˜ ์žˆ๋Š” ์ฝ๊ธฐ ์ž‘์—…์˜ ์ง„์ž…์ ์„ ์ •์˜ํ•œ๋‹ค. ์ฆ‰, REST API๋กœ ์ƒ๊ฐํ•ด๋ณด๋ฉด, READ์— ํ•ด๋‹นํ•˜๋Š” ์ž‘์—…์„ ํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์œผ๋กœ, ์ฝ๊ธฐ ์ž‘์—…์— ํ•„์š”ํ•œ ๋‚ด์šฉ(ํƒ€์ž…)์„ ๋ชจ๋‘ ์ž‘์„ฑํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

์•„๋ž˜์˜ ์ฝ”๋“œ๋ฅผ ์‚ดํŽด๋ณด์ž. Query ํƒ€์ž…์—๋Š” books์™€ authors ํ•„๋“œ๊ฐ€ ์žˆ๊ณ , ๊ฐ๊ฐ Book๊ณผ Author ๊ฐ์ฒด์˜ ๋ฐฐ์—ด์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
const { gql } = require("apollo-server")

const typeDefs = gql`
  type Query {
    books: [Book]
    authors: [Author]
  }

  type Book {
    title: String
    author: Author
  }

  type Author {
    name: String
    books: [Book]
  }
`

โžก๏ธThe Mutation type

Mutation ํƒ€์ž…์€ ๊ตฌ์กฐ์™€ ๋ชฉ์  ๋ฉด์—์„œ Query ํƒ€์ž…๊ณผ ๋น„์Šทํ•˜๋‹ค. Query ํƒ€์ž…์ด ์ฝ๊ธฐ ์ž‘์—…(READ)์˜ ์ง„์ž…์ ์„ ์ •์˜ํ•œ๋‹ค๋ฉด, Mutation ํƒ€์ž…์€ ์“ฐ๊ธฐ ์ž‘์—…(CREATE, DELETE, UPDATE)์˜ ์ง„์ž…์ ์„ ์ •์˜ํ•œ๋‹ค.

1
2
3
4
5
6
7
8
9
10
11
12
type Book {
  title: String
  author: Author
}
type Author {
  name: String
  books: [Book]
}

type Mutation {
  addBook(title: String, author: Author): Book
}

์—ฌ๊ธฐ์„œ addBook์€ ์ƒˆ๋กœ์šด ์ฑ…์„ ์ถ”๊ฐ€ํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋˜๋Š” ๋ณ€์ด(mutator)๋ฅผ ์ •์˜ํ•œ๋‹ค. ์ด๋•Œ ์ด mutator๋Š” ๋‘ ๊ฐœ์˜ ์ธ์ž title๊ณผ author๋ฅผ ๋ฐ›์•„ Book ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

์—ฌ๊ธฐ์„œ Book์€ ์œ„์—์„œ ์ •์˜ํ•œ type Book์„ ๊ฐ€๋ฆฌํ‚ค๋ฉฐ Author ๋˜ํ•œ type Author ํƒ€์ž…์„ ๊ฐ€๋ฆฌํ‚ค๊ฒŒ ๋œ๋‹ค.

โœ…resolvers

GraphQL ์Šคํ‚ค๋งˆ๋Š” ๋ฐ์ดํ„ฐ์˜ ๊ตฌ์กฐ์™€ ํƒ€์ž…์„ ์ •์˜ํ•˜์ง€๋งŒ ์‹ค์ œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๊ฑฐ๋‚˜ ๊ณ„์‚ฐํ•˜๋Š” ์ž‘์—…์€ Resolver๊ฐ€ ๋‹ด๋‹นํ•œ๋‹ค. ์ฆ‰, Resolver๊ฐ€ ์—†์œผ๋ฉด ์•„ํด๋กœ ์„œ๋ฒ„๋Š” ์–ด๋–ป๊ฒŒ ๋ฐ์ดํ„ฐ๋ฅผ ๋ถˆ๋Ÿฌ์™€์•ผ ํ•˜๋Š”์ง€ ์•Œ ์ˆ˜ ์—†๊ณ  ํด๋ผ์ด์–ธํŠธ ์š”์ฒญ์— ๋Œ€ํ•œ ์‘๋‹ต์„ ์ƒ์„ฑํ•  ์ˆ˜ ์—†๋‹ค.

์•„๋ž˜ ์˜ˆ์ œ๋ฅผ ๋‹ค์‹œ ์‚ดํŽด๋ณด์ž. ์—ฌ๊ธฐ์„œ typeDefs๋ฅผ ํ†ตํ•ด ์Šคํ‚ค๋งˆ๋ฅผ ์ •์˜ํ•  ๋•Œ ๋ฐ์ดํ„ฐ๋ฅผ ์–ด๋–ป๊ฒŒ ์š”์ฒญํ•˜๊ณ  ๊ฐ€์ ธ์˜ฌ์ง€ ๊ฒฐ์ •ํ–ˆ๋‹ค.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
const { gql } = require("apollo-server")

const typeDefs = gql`
  type Query {
    books: [Book]
    authors: [Author]
  }

  type Book {
    title: String
    author: Author
  }

  type Author {
    name: String
    books: [Book]
  }
`

๊ทธ๋ฆฌ๊ณ  ์‹ค์ œ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ œ๊ณตํ•˜๋Š” ์—ญํ• ์€ resolvers๊ฐ€ ํ•˜๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด๋‹ค!

1
2
3
4
5
6
const resolvers = {
  Query: {
    books: () => books,
    movies: () => movies,
  },
}

โžก๏ธmutation typeDefs์™€ resolvers

์ถ”๊ฐ€๋กœ mutation์„ ์ด์šฉํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์—…๋ฐ์ดํŠธ ํ•ด๋ณด์ž! ๋จผ์ € ์•„๋ž˜์™€ ๊ฐ™์ด type Book๊ณผ type Mutation์„ ์ •์˜ํ•ด์คฌ๋‹ค. ์ด๋•Œ type Mutation์€ type Book ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

1
2
3
4
5
6
7
8
9
10
11
const typeDefs = gql`
  type Book {
    id: Int
    title: String
    author: String
  }

  type Mutation {
    addBook(id: Int, title: String, author: String): Book
  }
`

์ด๋ ‡๊ฒŒ ๋งŒ๋“  Mutation์•ˆ์˜ addBook์ด๋ผ๋Š” mutator์— ์–ด๋–ป๊ฒŒ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ  ์—…๋ฐ์ดํŠธ ํ• ์ง€์— ๊ด€ํ•ด resolvers๋ฅผ ์ž‘์„ฑํ•œ๋‹ค.

1
2
3
4
5
6
7
8
9
10
11
let nextBookId = 3

const resolvers = {
  Mutation: {
    addBook: (_, { title, author }) => {
      const newBook = { id: nextBookId++, title, author }
      books.push(newBook)
      return newBook
    },
  },
}

๐Ÿ—‚๏ธ์ฐธ๊ณ  ์‚ฌ์ดํŠธ

This post is licensed under CC BY 4.0 by the author.