2023. 4. 3. 13:12ใComputer Science
๐กGraphQL ๊ฐ์
- GraphQL์ด๋ ๋ฌด์์ธ๊ฐ์?
GraphQL์ ํ์ด์ค๋ถ์์ ๋ง๋ ์ฟผ๋ฆฌ ์ธ์ด์
๋๋ค.
QL์ด ๋ค์ด๊ฐ์ ๋ญ๊ฐ SQL(Structured Query Language)์ ๋์ผํ ๊ฒ ๊ฐ์ง๋ง, GraphQL์ ์น ํด๋ผ์ด์ธํธ์ ์๋ฒ ์ฌ์ด์ ์ฌ์ฉ๋๋ Query Language์
๋๋ค.
SQL์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์คํ ์ ์ ์ฅ๋ ๋ฐ์ดํฐ๋ฅผ ํจ์จ์ ์ผ๋ก ๊ฐ์ง๊ณ ์ค๋ ๊ฒ์ด ๋ชฉ์ ์ธ ๋ฐ๋ฉด, GQL์ ์น ํด๋ผ์ด์ธํธ๊ฐ ์๋ฒ๋ก๋ถํฐ ๋ฐ์ดํฐ๋ฅผ ํจ์จ์ ์ผ๋ก ๊ฐ์ ธ์ค๋ ๊ฒ์ด ๋ชฉ์ ์ ๋๋ค. ์ฝ๋ ์์ผ๋ก ๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ์ด ํ์ฐํ๊ฒ ๋ ์ธ์ด์ ์ฐจ์ด๋ฅผ ํ์ธํ ์ ์์ต๋๋ค.
SELECT plot_id, species_id, sex, weight, ROUND(weight / 1000.0, 2) FROM surveys;
/SQL ์ฟผ๋ฆฌ ์์
{
hero {
name
friends {
name
}
}
}
/GQL ์ฟผ๋ฆฌ ์์
์ฟผ๋ฆฌ๋ก๋ง ๋ดค์ ๋ ๋ญ๊ฐ..๊ฐ์ฒด ์งํฅ์ด ๋ ์ค๋ฅด์ฃ ? ์ค์ ๋ก ์ด๋์ ๋ ๊ฐ์ฒด์งํฅ ํจ๋ฌ๋ค์์ ๊ฐ์ง๊ณ ์๋ต๋๋ค!
2. ๊ทธ๋์ GraphQL์ ์ด๋ป๊ฒ ์๋ํ๋์? REST API์์ ์ฐจ์ด์ ์์?
GraphQL์ API Layer์์ ์๋ํ๋ ์ฟผ๋ฆฌ์ธ์ด๋ผ๊ณ ํ์์ฃ .
์ ์๋ง ๋ดค์ ๋๋ REST API์ ๋ณ๋ค๋ฅธ ์ฐจ์ด์ ์ด ์์ด ๋ณด์ด๋๋ฐ์, ์ค์ ๋ฐ์ดํฐ ์กฐํ ๋ฐฉ์์ ํตํด REST API์ GraphQL๊ฐ์ ์ฐจ์ด์ ์ ์์๋ณด๊ฒ ์ต๋๋ค.
REST ๋ฐฉ์์์๋ ์๋์ ๊ฐ์ด ํน์ URL๋ก ์์ฒญ์ ๋ณด๋ด๊ณ , ๊ทธ ์์ฒญ์ ํด๋นํ๋ ๋ฐ์ดํฐ๋ฅผ ๋ค์ ํด๋ผ์ด์ธํธ์๊ฒ ์ ๋ฌํฉ๋๋ค. ํ์ง๋ง ์ฌ์ฉ์๊ฐ ์ํ๋ ๋ฐ์ดํฐ๋ฅผ ์กฐํํ๋ ค๋ฉด ์๋ฒ ์ธก์์ ์๊ตฌํ๋ ๋ฐ์ดํฐ๋ฅผ ์ ๊ณตํด์ค์ผ ํฉ๋๋ค.
๊ทธ๋ฌ๋ GraphQL์ ์์ฒญ ์ฌํญ์ ๋ฐ๊ณ ์ถ์ ๋ฐ์ดํฐ๋ง์ ๋ช ์ํ์ฌ, ํ๋์ URL๋ก ํต์ผ๋์ด ์๋ฒ์ ์์ฒญ์ด ๊ฐ๋ฅํฉ๋๋ค.
GraphQL ๋ฐ์ดํฐ ์กฐํ ๋ฐฉ์ ์์
REST API๋ URL, METHOD(get,post…)๋ฑ์ ์กฐํฉํ๊ธฐ ๋๋ฌธ์ ๋ค์ํ Endpoint๊ฐ ์กด์ฌ ํฉ๋๋ค. ๋ฐ๋ฉด, gql์ ๋จ ํ๋์ Endpoint(POST)๊ฐ ์กด์ฌ ํฉ๋๋ค. ๋ํ, gql API์์๋ ๋ถ๋ฌ์ค๋ ๋ฐ์ดํฐ์ ์ข ๋ฅ๋ฅผ ์ฟผ๋ฆฌ ์กฐํฉ์ ํตํด์ ๊ฒฐ์ ํฉ๋๋ค.
REST API์ GQL์ ์ฐจ์ด์ ์ ๊ฐ๋จํ๊ฒ ๋์ํํ๋ค๋ฉด ์๋์ ๊ฐ์ ๊ทธ๋ฆผ์ผ๋ก ๋ํ๋ผ ์ ์์ต๋๋ค.
GraphQL์ ํน์ง์ ์ ๋ฆฌํ๋ฉด ๋ค์๊ณผ ๊ฐ์ด ์ธ ๊ฐ์ง๋ก ์์ฝํ ์ ์์ต๋๋ค.
- ๋จ์ผ ์์ฒญ์ผ๋ก ๋ง์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ฌ ์ ์๋ค.
- ๊ฐ๋ฅํ ์ผ์ด์ค๋ฅผ ํ์ ์์คํ ์ผ๋ก ํํํ ์ ์๋ค.
- ํ์ํ ๊ฒ๋ง์ ์์ฒญํ๊ณ ๋ฐ์์ฌ ์ ์๋ค.
์๋ ๋ค์ด๋ฒ์์ ์ค์ ๋ก ์ฌ์ฉํ๊ณ ์๋ ์ผ์ด์ค์ ํจ๊ป GraphQL ๊ตฌ์กฐ๋ฅผ ์ดํดํด๋ด ์๋ค.
๐กGraphQL ์ฌ์ฉ ์ฌ๋ก - ‘ํ๋์ ๋คํธ์ํฌ ํธ์ถ’
๋ค์ด๋ฒ Myํ๋ ์ด์ค ๊ธฐ๋ฅ์ ๋ค์ํ ๋ฐ์ดํฐ ์์ค๋ฅผ ์๊ตฌํ๋ ํธ์ถ์ด ๋น๋ฒํฉ๋๋ค.
์์๋ก ๋ฉ์ธ ํ์ด์ง๋ฅผ ์ดํด๋ณด๋ฉด, ์ ์ ๋ฐ์ดํฐ์ ๊ฒฝ์ฐ ๋ด๋ถ ์์ฒด ๋ฐ์ดํฐ๋ฒ ์ด์ค, ๊ธฐํ ๋ฐ์ดํฐ์ ๊ฒฝ์ฐ ์ธ๋ถ API๋ฅผ ์ฌ์ฉํ๊ณ ๋ฏธ์
๋ฌ์ฑ ์ N pays๋ก ์ฐ๊ฒฐ๋๋ ๋ฑ ์ฌ๋ฌ ๋ฐ์ดํฐ ์์ค๋ฅผ ์ฌ์ฉํ๊ณ ์๋๋ฐ์.
GraphQL์ ์ฌ์ฉํ ๊ฒฝ์ฐ ํ๋์ ๋คํธ์ํฌ ํธ์ถ๋ก ํจ์จ์ ์ผ๋ก ์ฒ๋ฆฌ๊ฐ ๊ฐ๋ฅํฉ๋๋ค.
ํ๋์ ๋คํธ์ํฌ ํธ์ถ๋ก ์ฒ๋ฆฌ๋๋ค๋ ๊ฐ๋
์ด ์ง๊ด์ ์ผ๋ก ์ ๋ฟ์ง ์์ ์ ์๋๋ฐ์,
GraphQL์ ๊ฐ๋
์ ์ดํด๋ณด๋ฉด์ ์ผ์ด์ค๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
๐กGraphQL ์ฌ์ฉ ์ฌ๋ก - ‘Schema’
GraphQL์๋ Schema๋ผ๊ณ ํ๋ ๊ฐ๋ ์ด ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์์ ์ผ๋ฐ์ ์ผ๋ก ํต์ฉ๋๋ Schema์๋ ์กฐ๊ธ ๋ค๋ฅธ๋ฐ์.
Database ์์์ ์ฌ์ฉ๋๋ Schema๋ ๋ฐ์ดํฐ๋ฅผ R/Wํ๊ธฐ ์ํ ์ต์ ํ ๋ฐฉ์์ ๊ด๊ณ์ ์ฐธ์กฐ(์ ๊ทํ)๋ก ํด์ํ๋ ๋ฐ๋ฉด, GraphQL ์์์์ Schema๋ ‘๋ฐ์ดํฐ ํ์ ์ ์งํฉ’์ ์๋ฏธํฉ๋๋ค. view์์ ์ฌ์ฉ๋๋ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์คํค๋ง๋ฅผ ์์ฑํ๊ฒ ๋ฉ๋๋ค.
GraphQL Schema๋ type์ด๋ผ๋ ๋จ์๋ก ์ด๋ฃจ์ด์ ธ ์์ด์, ํด๋ผ์ด์ธํธ ์ค์ฌ์ผ๋ก Type์ ์ค์ ํ๊ฒ ๋ฉ๋๋ค.
GraphQL Shema Type ์์
type Character {
name: String!
appearsIn: [Episode!]!
}
๋ฐ๋ผ์ ํด๋ผ์ด์ธํธ๋ ๋ฐ์ดํฐ ์์ค๋ฅผ ์ ํ์ ์์ด, GraphQL์ Schema๋ง์ ๋ฐ๋ผ๋ณด๊ฒ ๋๋ฉฐ, View์์ ์์ฒญํ๋ ๋ฐ์ดํฐ๋ง์ ํธ์ถํ ์ ์์ต๋๋ค.
๐ก GraphQL ์ฌ์ฉ ์ฌ๋ก - ‘Field Argument’
๋ค์ด๋ฒ Myplace ๋ด ๋ง์ด ํ์ด์ง์๋ ๋ค์ํ ํฌ๊ธฐ์ ์ธ๋ค์ผ๋ค์ด ์์ต๋๋ค. ์ผ๋ฐ์ ์ผ๋ก๋ ์ธ๋ค์ผ์ ๋ํด์ ํด๋ผ์ด์ธํธ๊ฐ ๋ฆฌ์ฌ์ด์ง๋ ์ด๋ฏธ์ง๋ฅผ ๋ฐ์์ ์ฌ์ฉ์ ํ๋๋ฐ์.
GraphQL์์๋ ๋ค์๊ณผ ๊ฐ์ด ์ธ๋ค์ผ์ด ํ์ํ๋ค๊ณ ํ์ ๋, ๋ค์๊ณผ ๊ฐ์ด ์ค๊ณํ ์ ์์ต๋๋ค.
type Profile {
name: String
thumbnailUrl: String
}
๊ทธ๋ฐ๋ฐ ๋ง์ฝ ํ๋กํ ํ์ ์ด ๋ค๋ฅธ ์ง๋ฉด์ ๋ ธ์ถ์ด ๋๋ฉด์, ์๊ตฌ๋๋ ์ธ๋ค์ผ์ ํฌ๊ธฐ๊ฐ ๋ฌ๋ผ์ง๋ค๋ฉด ์ด๋ป๊ฒ ๊ตฌํํ ์ ์์๊น์?
type Profile {
name: String
thumbnailUrl: String
bigThumbnailUrl: String
bigThumbnailUrl_100px: String
reviewThumbnailUrl: String
bigReviewThumbnailUrl: String
bigReviewThumbnailUrl_200px: String
}
์กฐ๊ธ ๋นํจ์จ์ ์ด๊ณ , ์ง๊ด์ ์ด์ง ์๋ค๋ ์๊ฐ์ด ๋ญ๋๋ค.
์ด๋ฌํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด, GraphQL์์๋ Field Argument๋ผ๊ณ ํ๋ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค.
ํด๋ผ์ด์ธํธ์์ ์ํ๋ ์ธ์๊ฐ๋ง์ ๋ฐ์ ์ ์๋๋ก, Field์ ์ํ๋ ๊ฐ์ ์ธ์๋ก ๋ฐ๋๋ก ์ค์ ํ ์ ์์ต๋๋ค.
User๋ผ๊ณ ํ๋ Schema์ type์ ์ด๋ฏธ์ง๋ฅผ ์ธ์๊ฐ์ ๋ฐ๋๋ก ์ค์ ํ๊ณ , ์ค์ ๋ก ํด๋น ์ ์ ์ ๋ํด Client์์ ์ฌ์ด์ฆ๋ฅผ ์์ฒญํ ๋ ํ๊ธฐ์ ๊ฐ์ด ์ฟผ๋ฆฌ๋ฅผ ์์ฑํ์ฌ Filed๋ฅผ ์ถ๊ฐ๋ก ์์ฑํ ํ์ ์์ด ํธ์ถ์ด ๊ฐ๋ฅํฉ๋๋ค.
๋ํ, ์ง์ํ๋ ์ด๋ฏธ์ง ์ฌ์ด์ฆ๋ฅผ ๋ชจ๋ฅธ๋ค๊ณ ํ๋๋ผ๋ px์ ๋ํ ๋ฐ์ดํฐ ๊ท๊ฒฉ์ ์ ํํ ์ ์์ต๋๋ค.
์ด๋ฌํ ๋ฐ์ดํฐ ๊ท๊ฒฉ์ ์ ํ์ enum์ด๋ผ๊ณ ํ๋ ํ์
์ ํตํด ํ ์ ์์ต๋๋ค.
์ด๋ฏธ์ง์ ํฌ๊ธฐ๋ฅผ enum ํ์
์ ํตํด ์ ์ํ๊ณ , Userํ์
์์ Image์ ๋ํ ์ธ์๊ฐ์ด ์์ ๊ฒฝ์ฐ๋ฅผ ๋๋นํ์ฌ ๊ธฐ๋ณธ ์ธ์๊ฐ์ ์ค์ ํ ์ ์๋๋ก ํ ์ ์์ต๋๋ค.
Field Argument์ enum ํ์
์ ์ฌ์ฉํ๋ฉด, ๋ค์๊ณผ ๊ฐ์ด ์คํค๋ง๋ฅผ ๊ฐ๋จํ๊ฒ ์ ์ํ ์ ์์ต๋๋ค.
๐กGraphQL ์ฌ์ฉ ์ฌ๋ก - ‘Error Handling’
์๋น์ค ๋ด์์ ๋๋ค์์ ์์ฑํ๋ค๊ณ ํ์ ๋, ์ค์ ์ ๋ํด ์ฌ๋ฌ๊ฐ์ง ๊ท์น๋ค์ด ์กด์ฌํฉ๋๋ค.
๋๋ค์์ด ์ค์ ๋ก ์ฌ์ฉ ๊ฐ๋ฅํ ์๋ ์๊ณ , ์ค๋ณต๋์ด์๋ ์๋ ์๋ ์๊ณ , ๊ธ์น์ด ์ฌ์ฉ์ผ๋ก ์ธํด ์์ฑ์ด ๋ถ๊ฐ๋ฅํ ์๋ ์์ฃ .
GraphQL๋ก ๋๋ค์ ์ค์ ์ ๋ํด ์คํค๋ง๋ฅผ ์ค๊ณํ๋ค๊ณ ํ์ ๋, ์ค๋ฅ ์ฝ๋๋ฅผ ์ด๋ป๊ฒ ๊ด๋ฆฌํ ์ ์์๊น์?
์๋์ ๊ฐ์ด ์คํค๋ง๋ฅผ ์ค๊ณํ ์ ์์ ๊ฒ ๊ฐ์๋ฐ์.
type ValidateNicknameResult {
success: Boolean!
isDuplicate: Boolean!
words: [String!]!
}
๊ทธ๋ฐ๋ฐ ๋ง์ฝ ํด๋น ์คํค๋ง์ 1์ผ 5ํ ์ ํ์ด๋ผ๋ ์ ์ฑ ์ ์ถ๊ฐํ๊ฒ ๋๋ค๋ฉด ํ์ ์ ์ด๋ป๊ฒ ๋ณํํด์ผ ํ ๊น์?
type ValidateNicknameResult {
success: Boolean!
isDuplicate: Boolean!
words: [String!]!
} isCountOver: Boolean!
todayCount: Int!
}
success ํ๋๊ฐ true์ผ ๋ isCountOver ํ๋๋ True๋ผ๋ฉด, ํด๋ผ์ด์ธํธ๊ฐ ์ด๋ป๊ฒ ๋ถ๊ธฐ๋ฅผ ํด์ผ ํ ์ง ๋ชจํธํด์ง ์ ์์ต๋๋ค.
์ด๋ฌํ ๋ชจํธ์ฑ์ ์ค์ด๊ณ , ์ฌ๋ฌ ๊ฐ์ ํ์ ๋ค์ ๊ฐ๊ฒฐํ๊ฒ ๊ตฌํํ๊ธฐ ์ํด GraphQL์์๋ Unionํ์ ์ ์ง์ํฉ๋๋ค.
'GraphQL์์ Union์ ์๋ก ๋ค๋ฅธ ๊ฐ์ฒด ํ์ ์ ํ๋์ ํ์ ์ผ๋ก Reserveํ ์ ์๋ค'
์๊ธฐ ์ด๋ฏธ์ง์ ๊ฐ์ด, ๋๋ค์ ์ค๋ณต์ด๋ ๊ธ์น์ด์ ๋ํด ๊ฐ์ฒด ํ์ ์ ์ ์ํ๊ณ , ๊ฐ๊ฐ์ ๊ฐ์ฒด ํ์ ์ ๋ํด Union ํ์ ์ Output์ ์ ์ธํ ์ ์์ต๋๋ค.
ํด๋น ์ ๋์จ ํ์ ์ ๊ธฐ์ค์ผ๋ก ๋ค์๊ณผ ๊ฐ์ด ์ฟผ๋ฆฌ๋ฅผ ์ค๊ณํ ์ ์์ต๋๋ค.
query {
checkNickname(nickname: "๋์ง์ฌ์ง๋ง๊ป") {
__typename
... on NicknameSucceed {
nickname
}
... on DuplicatedNickname {
message
}
... on PwordError {
}
ํด๋น ์ฟผ๋ฆฌ๋ฅผ ์คํํ๊ฒ ๋๋ค๋ฉด, ์ ๋์จ ํ์ ์ ์ ์๋ ๋๋ก ๊ฐ๊ฐ์ ๋ฐํ ๊ฐ์ ๋ฐ์ ์ ์์ต๋๋ค. (56p ์ฐธ๊ณ )
๊ทธ๋ฐ๋ฐ ๋ง์ฝ ํด๋น ์ ๋์จ ํ์ ์ ์๋ก์ด ์๋ฌ๊ฐ ์ธ์ ๋๋ค๋ฉด, ๊ธฐ์กด์ ์ฌ์ฉํ๋ ํด๋ผ์ด์ธํธ ์ฟผ๋ฆฌ๋ก๋ ํด๋น ์๋ฌ๋ฅผ ํ์ ํ ์ ์์ต๋๋ค. on ๊ตฌ๋ฌธ์ ์ถ๊ฐํด๋ ๋์ง๋ง, ํ์ฅ์ฑ์ ๋ฌธ์ ๊ฐ ์์ฃ .
์ด๋ฌํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด, graphQL์์๋ interface๋ฅผ ์ ๊ณตํฉ๋๋ค.
‘GraphQL์์ Interface๋ ํ์ ์์คํ ์์ ๊ณตํต๋ ํ๋๋ฅผ ๊ฐ์ง ๊ฐ์ฒด ํ์ ๋ค์ ์งํฉ’
์ผ๋ฐ์ ์ผ๋ก ์๋ฐ์์ ํต์ฉ๋๋ ๋ฐ๋ก ๊ทธ interface์ ๊ฐ๋ ์ ์ผ๋ก ๋งค์ฐ ์ ์ฌํ๋ค๊ณ ์๊ฐํ๋ฉด ์ดํด๊ฐ ์ฌ์ธ ๊ฒ ๊ฐ์๋ฐ์. ์ธํฐํ์ด์ค๋ก ๊ทธ ์ธ ์ฒ๋ฆฌ๋๋ ์๋ฌ์ ๋ํด ์ ์ธ์ ํด๋ณด๊ฒ ์ต๋๋ค.
interface BaseError {
message: String!
}
/base error interface ์์
์ด๋ ๊ฒ ์ค๊ณ๋ ์ธํฐํ์ด์ค๋ฅผ ์์ํด์ ๊ฐ๊ฐ์ ํ์ ์ ์ ์ธํ ์ ์๊ฒ ์ฃ !
์ด๋ ๊ฒ ์ค๊ณ๋ ํ์ ์ผ๋ก ๊ตฌํ๋ Union ํ์ ์ ์๋ก ์ธ์ ๋ ์ ์ฑ ์ ๋ช ์ํ์ง ์๋๋ผ๋ ๋ฉ์์ง ํ๋๋ฅผ ๋ฐ๊ธฐ ๋๋ฌธ์ ์๋ฌ๋ฅผ ์ธ์งํ ์ ์์ต๋๋ค.
๐กGraphQL ์ฌ์ฉ ์ฌ๋ก - ‘Field Resolver’
๋ง์ง๋ง ์ฌ๋ก๋ ๋ง์ด ํ๋ ์ด์ค ๋ด ‘๊ฒ์๋ฌผ ๋ ธ์ถ ์กฐ๊ฑด’์ ์ฌ๋ก๋ก ๋ค๊ณ ์ ํฉ๋๋ค.
๋ค์๊ณผ ๊ฐ์ ํฌ์คํ ์ ํ์์๊ฒ ๋ณด์ฌ์ง ๋ ์ ์ฑ ์ด ์์๋๋ฐ์.
- ํด๋น ๊ฒ์๊ธ์ด ๊ณต๊ฐ์ผ ๋
- ํด๋น ๊ฒ์๊ธ์ด ๊ฒ์๋ ๊ฒ์๊ธ์ผ ๋
- ํด๋น ๊ฒ์๊ธ์ด ์ ๊ณ ๋ฐ์ ๊ฒ์๊ธ์ด ์๋ ๋
์ด๋ฌํ ์ ์ฑ ์ iOS, AOS, WEB ์์ ๊ฐ๋ฐํ ๋ ๊ฐ๊ฐ์ ๊ฐ๋ฐ์๊ฐ ํด๋น ์ ์ฑ ์ ๋ํด ์ดํดํ๊ณ ๊ฐ๋ฐํด์ผํ๋ค๋ ์ ์์ ๋ถํธํจ์ ๊ฐ์ง๊ณ ์์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ด๋ ๊ฒ ๊ฐ๋ฐํ๊ฒ ๋๋ฉด ์ค์ํ ํ๋ฅ ๋ ๋ ๋์์ง๊ฒ ์ฃ .
์ด๋ฌํ ์ ์ ๊ฐ์ ํ๊ธฐ ์ํด, GraphQL์์๋ Field Resolver๋ผ๋ ํจ์๋ฅผ ์ ๊ณตํฉ๋๋ค.
'Field Resolver๋ ๋ฐ์ดํฐ๋ฅผ ๊ฒ์ํ๊ฑฐ๋ ๊ฐ๊ณตํ ๋ ๊ฐ ํ๋์ ๋ํ ๊ฐ์ ๊ฒฐ์ ํ๋ ํจ์'
Field resolver๋ getter ํจ์์ ์ ์ฌํ๋ฐ์, ์์ฑํ ์ฟผ๋ฆฌ์ ๋ํ Resolver๋ฅผ ์ ์ธํ๊ณ , ํด๋น Resolver์์ ๋ฆฌํด๋ ๊ฐ์ Filed resolver์์ ๊ฐ๊ณตํ์ฌ ๋ฐํํฉ๋๋ค.
Rest API์์๋ Field resolver์ ๋น์ทํ๊ฒ ๊ตฌํํ ์ ์์ง๋ง, ๋ค์๊ณผ ๊ฐ์ ์ธ๊ฐ์ง ๋ฌธ์ ์ ์ด ์์ต๋๋ค.
- ํ์์ ์๊ด์์ด ํญ์ ๊ณ์ฐํด์ผ ํ๋ค.
- ํ์ ์ ๋ฐ๊ฒ๋ ๊ตฌํํ๋ ค๋ฉด ํ๋ผ๋ฏธํฐ ๋๋ ์๋ ํฌ์ธํธ๋ฅผ ์ถ๊ฐํด์ผ ํ๋ค.
๋ฐ๋ฉด field resolver์ ๊ฒฝ์ฐ query์์ ํด๋น filed๊ฐ ์์ฒญ๋ ๋๋ง ์คํ์ด ๋๊ธฐ ๋๋ฌธ์, ํผํฌ๋จผ์ค์ ์ ๋ฆฌํ๋ค๋ ์ฅ์ ์ด ์์ต๋๋ค.
์ด๋ฌํ ํน์ฑ ๋๋ถ์, ๊ฐ๋ฐ ์ฒด๊ณ๊ฐ ๋ค๋ฅด๋๋ผ๋ GraphQL์์ ๋น์ฆ๋์ค ๋ก์ง์ ์ ์ํ์ฌ ๋ฐํ๊ฐ์ ๋๋ ค์ฃผ๊ธฐ ๋๋ฌธ์, ํด๋ผ์ด์ธํธ์ ์ค์๋ฅผ ์ค์ผ ์ ์๋ค๋ ์ฅ์ ์ ๊ฐ์ง๊ณ ์์ต๋๋ค.
GraphQL์ด ์ฃผ๋ ์์ฌ์
graphQL์ 2016๋
์ดํ๋ก ๊พธ์คํ๊ฒ ์ธ๊ธฐ๋๊ฐ ์์น ์ค์ธ ๋งค๋ ฅ์ ์ธ ์ฟผ๋ฆฌ์ธ์ด์
๋๋ค.
ํนํ GraphQL์ ํด๋ผ์ด์ธํธ ์ธก์์ ํ์ํ ๋ฐ์ดํฐ๋ง ์์ฒญํ ์ ์์ผ๋ฉฐ, ์๋ฒ์์๋ ํด๋ผ์ด์ธํธ ์์ฒญ์ ํ์ํ ๋ฐ์ดํฐ๋ง ์ ๊ณตํจ์ผ๋ก์จ ๋คํธ์ํฌ ํธ๋ํฝ์ ์ต์ ํํ ์ ์๊ธฐ ๋๋ฌธ์ ๋ฐ์ดํฐ ์์ฒญ๊ณผ ์๋ต์ด ๋งค์ฐ ๋ค์ํ๊ณ ๋ณต์กํ ๊ฒฝ์ฐ์ ์ ์ฉํ ์ ์์ต๋๋ค.
๋ํ, GraphQL์ ์ฌ๋ฌ ๋ฐ์ดํฐ ์์ค๋ฅผ ํ๋์ API๋ก ํตํฉํ๊ธฐ๋ ์ฝ๊ธฐ ๋๋ฌธ์, MSA ์ ํ ๊ณผ์ ์์ ๋ค์ํ ๋ฐ์ดํฐ ์์ค๋ฅผ ํตํฉํ๋๋ฐ ์ ์ฉํ ์ ์์ต๋๋ค.
- ํ์ํ ๋ฐ์ดํฐ๋ง ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค.
GraphQL์ ํด๋ผ์ด์ธํธ์์ ์์ฒญํ ํ๋๋ง ๊ฐ์ ธ์ค๊ธฐ ๋๋ฌธ์, ๋ฐ์ดํฐ์ ์ค๋ฒํ์นญ(Overfetching)๊ณผ ์ธ๋ํ์นญ(Underfetching) ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์์ต๋๋ค. ์ด๋ ๋ฐ์ดํฐ ์ ์ก๋์ ์ค์ด๊ณ , ๋คํธ์ํฌ ๋์ญํญ์ ์ ์ฝํ ์ ์์ต๋๋ค. - ํ๋์ ์์ฒญ์ผ๋ก ์ฌ๋ฌ ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค.
REST API์์๋ ์ฌ๋ฌ ์์ฒญ์ ๋ณด๋ด์ผ ํ์ง๋ง, GraphQL์์๋ ํ๋์ ์์ฒญ์ผ๋ก ์ฌ๋ฌ ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค. ์ด๋ ๋คํธ์ํฌ ๋น์ฉ์ ์ค์ด๊ณ , ์ฑ๋ฅ์ ํฅ์์ํต๋๋ค. - ํ์
์์คํ
์ ์ ๊ณตํฉ๋๋ค.
GraphQL์ ๊ฐ๋ ฅํ ํ์ ์์คํ ์ ๊ฐ์ง๊ณ ์์ต๋๋ค. ์ด๋ฅผ ํตํด API์ ์ ํจ์ฑ์ ๊ฒ์ฆํ๊ณ , ๋ฌธ์ํ๋ฅผ ์ฝ๊ฒ ํ ์ ์์ต๋๋ค. ์ด๋ API์ ์ดํด๋์ ์ ์ง ๋ณด์์ฑ์ ํฅ์์ํต๋๋ค.
'Computer Science' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Trouble Shooting] OS ERROR: Can't load tokenizer for 'cardiffnlp/twitter-roberta-base-sentiment' (0) | 2022.08.22 |
---|---|
[Trouble shooting] google trans 'NoneType' object has no attribute 'group' (0) | 2022.08.19 |
MSA ์ํคํ ์ณ์ ์ดํด (0) | 2022.08.10 |
[ํ๋ก๊ทธ๋๋จธ์ค C++] ๊ฒ์ ๋งต ์ต๋จ๊ฑฐ๋ฆฌ (0) | 2022.07.21 |
[๋ฐฑ์ค 1922๋ฒ C++] ๋คํธ์ํฌ ์ฐ๊ฒฐ (0) | 2022.07.21 |