Thinking in GraphQL๐Ÿงš

query {
  person(id: "24601") {
    name
    occupation
    location {
      name
      population
    }
  }
}

Edge

type User {
  id: ID!
  name: String!
  friends: [User]     # ๋‹จ์ˆœ ๋ฐฐ์—ด ๊ด€๊ณ„
  city: City          # ๋‹จ์ผ ๊ด€๊ณ„
}
type User {
  id: ID!
  name: String!
  friends: FriendsConnection  # Connection ํŒจํ„ด ์‚ฌ์šฉ
}

# Edge์— ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ํฌํ•จ
type FriendsConnection {
  edges: [FriendEdge]
  pageInfo: PageInfo!
}

type FriendEdge {
  node: User              # ์‹ค์ œ ์นœ๊ตฌ ๋ฐ์ดํ„ฐ
  cursor: String!         # ํŽ˜์ด์ง€๋„ค์ด์…˜ ์ •๋ณด
  friendshipDate: String  # ๊ด€๊ณ„์˜ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ
  isCloseFriend: Boolean  # ์ถ”๊ฐ€ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ
}

Connection ํŒจํ„ด์ด๋ž€?

type User {
  id: ID!
  friends(
    first: Int        # ํ•œ ํŽ˜์ด์ง€๋‹น ๊ฐฏ์ˆ˜
    after: String     # ์ปค์„œ ์ดํ›„์˜ ๋ฐ์ดํ„ฐ
    last: Int         # ๋’ค์—์„œ๋ถ€ํ„ฐ ๊ฐ€์ ธ์˜ฌ ๋•Œ
    before: String    # ์ปค์„œ ์ด์ „์˜ ๋ฐ์ดํ„ฐ
  ): FriendsConnection
}

type FriendsConnection {
  edges: [FriendEdge]
  pageInfo: PageInfo!
  totalCount: Int     # ์ „์ฒด ๊ฐฏ์ˆ˜
}

type FriendEdge {
  node: User          # ์‹ค์ œ ๋ฐ์ดํ„ฐ
  cursor: String!     # ํŽ˜์ด์ง€๋„ค์ด์…˜ ์ปค์„œ
}

type PageInfo {
  hasNextPage: Boolean!
  hasPreviousPage: Boolean!
  startCursor: String
  endCursor: String
}

์ด๋Ÿฐ ๊ทธ๋ž˜ํ”„ ๊ตฌ์กฐ์ฒ˜๋ฆฌ๋Š” ์–ด๋–ป๊ฒŒ ํ•˜๋Š”๊ฑธ๊นŒ? -> resolver

# ์Šคํ‚ค๋งˆ ์ •์˜
type User {
  id: ID!
  name: String!
  friends: [User]
  city: City
}

type City {
  id: ID!
  name: String!
  residents: [User]
}
// Resolver ์˜ˆ์‹œ
const resolvers = {
  User: {
    // friends ํ•„๋“œ ๋ฆฌ์กธ๋ฒ„
    friends: async (parent) => {
      // parent.id๋กœ ์นœ๊ตฌ ๋ชฉ๋ก ์กฐํšŒ
      return await db.users.findFriends(parent.id);
    },
    // city ํ•„๋“œ ๋ฆฌ์กธ๋ฒ„
    city: async (parent) => {
      // parent.cityId๋กœ ๋„์‹œ ์ •๋ณด ์กฐํšŒ
      return await db.cities.findById(parent.cityId);
    }
  },
  
  City: {
    // residents ํ•„๋“œ ๋ฆฌ์กธ๋ฒ„
    residents: async (parent) => {
      // parent.id๋กœ ํ•ด๋‹น ๋„์‹œ์˜ ๊ฑฐ์ฃผ์ž ๋ชฉ๋ก ์กฐํšŒ
      return await db.users.findByCityId(parent.id);
    }
  }
}
query {
  user(id: "1") {    # 1. ๋จผ์ € user ์กฐํšŒ
    name
    friends {        # 2. friends ๋ฆฌ์กธ๋ฒ„ ํ˜ธ์ถœ
      name
      city {         # 3. ๊ฐ ์นœ๊ตฌ์˜ city ๋ฆฌ์กธ๋ฒ„ ํ˜ธ์ถœ
        name
        residents {  # 4. residents ๋ฆฌ์กธ๋ฒ„ ํ˜ธ์ถœ
          name
        }
      }
    }
  }
}