- GraphQL ์ ๋ฐ์ดํฐ๋ฅผ
๊ทธ๋ํ
๋ก ๊ตฌ์ฑํ๋ค.
- ๊ทธ๋ํ๋
Node(๊ฐ์ฒด ํน์ ๋ ์ฝ๋)
์ Edge(ํ ๋
ธ๋์์ ๋ค๋ฅธ ๋
ธ๋๋ก ๊ฐ๋ ํฌ์ธํฐ)
๋ก ๊ตฌ์ฑ๋๋ค.

- ํ ๋
ธ๋์์ ๋ค๋ฅธ ๋
ธ๋๋ก ๊ฐ๋ ์ฃ์ง๋ฅผ ๋ฐ๋ผ๊ฐ์, ๋ฐฉ๋ฌธํ๋ ๊ฐ ๋
ธ๋์ ๋ํ ์ ๋ณด๋ฅผ ์์ฒญ ๊ฐ๋ฅํจ!
query {
person(id: "24601") {
name
occupation
location {
name
population
}
}
}
- ์ฌ๊ธฐ์
location
์ city ์ ๋ํ edge
๊ฐ ๋จ!
- GraphQL ์๋ฒ์์๋ ์คํค๋ง๋ฅผ ์ ๊ณตํ๊ณ , ์ด ์คํค๋ง๋ฅผ ํตํด์ ๋
ธ๋์ ์ข
๋ฅ, ๋
ธ๋๊ฐ ์ด๋ป๊ฒ ์ฐ๊ฒฐ๋๋์ง, ๊ฐ ๋
ธ๋์ ์ด๋ค ์ ๋ณด๊ฐ ํฌํจ๋์ด์๋์ง ์ค๋ช
์ด ๋จ.
Edge
- SimpleEdge
- ๋จ์ ๊ด๊ณ ์ฌ์ฉ. ๋ฉํ๋ฐ์ดํฐ ํ์ ์์.
type User {
id: ID!
name: String!
friends: [User] # ๋จ์ ๋ฐฐ์ด ๊ด๊ณ
city: City # ๋จ์ผ ๊ด๊ณ
}
- Complex Edge (๋ฉํ๋ฐ์ดํฐ๊ฐ ํ์ํ ๊ด๊ณ)
- ํ์ด์ง๋ค์ด์
ํน์ ๋ฉํ๋ฐ์ดํฐ๊ฐ ํ์ํ ๋
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
}
}
}
}
}
- ์ฆ, ๊ฐ ํ๋๋ง๋ค ๋ฆฌ์กธ๋ฒ ํจ์๊ฐ ์กด์ฌํ๊ณ , ๋ฆฌ์กธ๋ฒ๊ฐ ์ค์ ๋ฐ์ดํฐ ์ฐ๊ฒฐ์ ์ฒ๋ฆฌํ๋ค.
- ๊ฐ ๋ฆฌ์กธ๋ฒ๋ ํ์ํ ๋ฐ์ดํฐ์์ค์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์จ๋ค.