Deview๋กœ ์•Œ์•„๋ณด๋Š” GraphQL

2023. 4. 3. 13:12ใ†Computer Science

๋ฐ˜์‘ํ˜•
๐Ÿ’กGraphQL ๊ฐœ์š”
  1. 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์˜ ์ฐจ์ด์ ์„ ๊ฐ„๋‹จํ•˜๊ฒŒ ๋„์‹ํ™”ํ•œ๋‹ค๋ฉด ์•„๋ž˜์™€ ๊ฐ™์€ ๊ทธ๋ฆผ์œผ๋กœ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

REST API vs GraphQL API
 

GraphQL์˜ ํŠน์ง•์„ ์ •๋ฆฌํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์„ธ ๊ฐ€์ง€๋กœ ์š”์•ฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  1. ๋‹จ์ผ ์š”์ฒญ์œผ๋กœ ๋งŽ์€ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋‹ค.
  2. ๊ฐ€๋Šฅํ•œ ์ผ€์ด์Šค๋ฅผ ํƒ€์ž… ์‹œ์Šคํ…œ์œผ๋กœ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.
  3. ํ•„์š”ํ•œ ๊ฒƒ๋งŒ์„ ์š”์ฒญํ•˜๊ณ  ๋ฐ›์•„์˜ฌ ์ˆ˜ ์žˆ๋‹ค.

์•„๋ž˜ ๋„ค์ด๋ฒ„์—์„œ ์‹ค์ œ๋กœ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š” ์ผ€์ด์Šค์™€ ํ•จ๊ป˜ 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’

๋งˆ์ง€๋ง‰ ์‚ฌ๋ก€๋Š” ๋งˆ์ด ํ”Œ๋ ˆ์ด์Šค ๋‚ด ‘๊ฒŒ์‹œ๋ฌผ ๋…ธ์ถœ ์กฐ๊ฑด’์„ ์‚ฌ๋ก€๋กœ ๋“ค๊ณ ์ž ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ๊ณผ ๊ฐ™์€ ํฌ์ŠคํŒ…์€ ํšŒ์›์—๊ฒŒ ๋ณด์—ฌ์งˆ ๋•Œ ์ •์ฑ…์ด ์žˆ์—ˆ๋Š”๋ฐ์š”.

  1. ํ•ด๋‹น ๊ฒŒ์‹œ๊ธ€์ด ๊ณต๊ฐœ์ผ ๋•Œ
  2. ํ•ด๋‹น ๊ฒŒ์‹œ๊ธ€์ด ๊ฒ€์ˆ˜๋œ ๊ฒŒ์‹œ๊ธ€์ผ ๋•Œ
  3. ํ•ด๋‹น ๊ฒŒ์‹œ๊ธ€์ด ์‹ ๊ณ  ๋ฐ›์€ ๊ฒŒ์‹œ๊ธ€์ด ์•„๋‹ ๋•Œ

์ด๋Ÿฌํ•œ ์ •์ฑ…์„ iOS, AOS, WEB ์—์„œ ๊ฐœ๋ฐœํ•  ๋•Œ ๊ฐ๊ฐ์˜ ๊ฐœ๋ฐœ์ž๊ฐ€ ํ•ด๋‹น ์ •์ฑ…์— ๋Œ€ํ•ด ์ดํ•ดํ•˜๊ณ  ๊ฐœ๋ฐœํ•ด์•ผํ•œ๋‹ค๋Š” ์ ์—์„œ ๋ถˆํŽธํ•จ์„ ๊ฐ€์ง€๊ณ  ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด๋ ‡๊ฒŒ ๊ฐœ๋ฐœํ•˜๊ฒŒ ๋˜๋ฉด ์‹ค์ˆ˜ํ•  ํ™•๋ฅ ๋„ ๋” ๋†’์•„์ง€๊ฒ ์ฃ .

์ด๋Ÿฌํ•œ ์ ์„ ๊ฐœ์„ ํ•˜๊ธฐ ์œ„ํ•ด, GraphQL์—์„œ๋Š” Field Resolver๋ผ๋Š” ํ•จ์ˆ˜๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

'Field Resolver๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๊ฒ€์ƒ‰ํ•˜๊ฑฐ๋‚˜ ๊ฐ€๊ณตํ•  ๋•Œ ๊ฐ ํ•„๋“œ์— ๋Œ€ํ•œ ๊ฐ’์„ ๊ฒฐ์ •ํ•˜๋Š” ํ•จ์ˆ˜'

Field resolver๋Š” getter ํ•จ์ˆ˜์™€ ์œ ์‚ฌํ•œ๋ฐ์š”, ์ƒ์„ฑํ•œ ์ฟผ๋ฆฌ์— ๋Œ€ํ•œ Resolver๋ฅผ ์„ ์–ธํ•˜๊ณ , ํ•ด๋‹น Resolver์—์„œ ๋ฆฌํ„ด๋œ ๊ฐ’์„ Filed resolver์—์„œ ๊ฐ€๊ณตํ•˜์—ฌ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

 

 

Rest API์—์„œ๋„ Field resolver์™€ ๋น„์Šทํ•˜๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์„ธ๊ฐ€์ง€ ๋ฌธ์ œ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  1. ํ•„์š”์™€ ์ƒ๊ด€์—†์ด ํ•ญ์ƒ ๊ณ„์‚ฐํ•ด์•ผ ํ•œ๋‹ค.
  2. ํ•„์š” ์‹œ ๋ฐ›๊ฒŒ๋” ๊ตฌํ˜„ํ•˜๋ ค๋ฉด ํŒŒ๋ผ๋ฏธํ„ฐ ๋˜๋Š” ์—”๋“œ ํฌ์ธํŠธ๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผ ํ•œ๋‹ค.

๋ฐ˜๋ฉด field resolver์˜ ๊ฒฝ์šฐ query์—์„œ ํ•ด๋‹น filed๊ฐ€ ์š”์ฒญ๋  ๋•Œ๋งŒ ์‹คํ–‰์ด ๋˜๊ธฐ ๋•Œ๋ฌธ์—, ํผํฌ๋จผ์Šค์— ์œ ๋ฆฌํ•˜๋‹ค๋Š” ์žฅ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ํŠน์„ฑ ๋•๋ถ„์—, ๊ฐœ๋ฐœ ์ฒด๊ณ„๊ฐ€ ๋‹ค๋ฅด๋”๋ผ๋„ GraphQL์—์„œ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์ •์˜ํ•˜์—ฌ ๋ฐ˜ํ™˜๊ฐ’์„ ๋Œ๋ ค์ฃผ๊ธฐ ๋•Œ๋ฌธ์—, ํด๋ผ์ด์–ธํŠธ์˜ ์‹ค์ˆ˜๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค๋Š” ์žฅ์ ์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

GraphQL์ด ์ฃผ๋Š” ์‹œ์‚ฌ์ 

graphQL์€ 2016๋…„ ์ดํ›„๋กœ ๊พธ์ค€ํ•˜๊ฒŒ ์ธ๊ธฐ๋„๊ฐ€ ์ƒ์Šน ์ค‘์ธ ๋งค๋ ฅ์ ์ธ ์ฟผ๋ฆฌ์–ธ์–ด์ž…๋‹ˆ๋‹ค.

ํŠนํžˆ GraphQL์€ ํด๋ผ์ด์–ธํŠธ ์ธก์—์„œ ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋งŒ ์š”์ฒญํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์„œ๋ฒ„์—์„œ๋Š” ํด๋ผ์ด์–ธํŠธ ์š”์ฒญ์— ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋งŒ ์ œ๊ณตํ•จ์œผ๋กœ์จ ๋„คํŠธ์›Œํฌ ํŠธ๋ž˜ํ”ฝ์„ ์ตœ์ ํ™”ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—  ๋ฐ์ดํ„ฐ ์š”์ฒญ๊ณผ ์‘๋‹ต์ด ๋งค์šฐ ๋‹ค์–‘ํ•˜๊ณ  ๋ณต์žกํ•œ ๊ฒฝ์šฐ์— ์œ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๋˜ํ•œ, GraphQL์€ ์—ฌ๋Ÿฌ ๋ฐ์ดํ„ฐ ์†Œ์Šค๋ฅผ ํ•˜๋‚˜์˜ API๋กœ ํ†ตํ•ฉํ•˜๊ธฐ๋„ ์‰ฝ๊ธฐ ๋•Œ๋ฌธ์—, MSA ์ „ํ™˜ ๊ณผ์ •์—์„œ ๋‹ค์–‘ํ•œ ๋ฐ์ดํ„ฐ ์†Œ์Šค๋ฅผ ํ†ตํ•ฉํ•˜๋Š”๋ฐ ์œ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

  1. ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋งŒ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    GraphQL์€ ํด๋ผ์ด์–ธํŠธ์—์„œ ์š”์ฒญํ•œ ํ•„๋“œ๋งŒ ๊ฐ€์ ธ์˜ค๊ธฐ ๋•Œ๋ฌธ์—, ๋ฐ์ดํ„ฐ์˜ ์˜ค๋ฒ„ํŽ˜์นญ(Overfetching)๊ณผ ์–ธ๋”ํŽ˜์นญ(Underfetching) ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๋ฐ์ดํ„ฐ ์ „์†ก๋Ÿ‰์„ ์ค„์ด๊ณ , ๋„คํŠธ์›Œํฌ ๋Œ€์—ญํญ์„ ์ ˆ์•ฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  2. ํ•˜๋‚˜์˜ ์š”์ฒญ์œผ๋กœ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    REST API์—์„œ๋Š” ์—ฌ๋Ÿฌ ์š”์ฒญ์„ ๋ณด๋‚ด์•ผ ํ•˜์ง€๋งŒ, GraphQL์—์„œ๋Š” ํ•˜๋‚˜์˜ ์š”์ฒญ์œผ๋กœ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๋„คํŠธ์›Œํฌ ๋น„์šฉ์„ ์ค„์ด๊ณ , ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค.
  3. ํƒ€์ž… ์‹œ์Šคํ…œ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
    GraphQL์€ ๊ฐ•๋ ฅํ•œ ํƒ€์ž… ์‹œ์Šคํ…œ์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด API์˜ ์œ ํšจ์„ฑ์„ ๊ฒ€์ฆํ•˜๊ณ , ๋ฌธ์„œํ™”๋ฅผ ์‰ฝ๊ฒŒ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” API์˜ ์ดํ•ด๋„์™€ ์œ ์ง€ ๋ณด์ˆ˜์„ฑ์„ ํ–ฅ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค.
๋ฐ˜์‘ํ˜•