Skip to content

Graphql Subscription โšก

์˜ค์ง€ํ›ˆ edited this page Dec 20, 2020 · 1 revision

๋ฐ”์˜์‹  ๋ถ„๋“ค์„ ์œ„ํ•œ 3์ค„ ์š”์•ฝ!

  • ์œ„์น˜๊ณต์œ , ์ฑ„ํŒ…, ์˜ค๋”์•Œ๋žŒ ๊ฐ™์€ ์‹ค์‹œ๊ฐ„ ํ†ต์‹ ์„ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด GraphQL Subscription ์‚ฌ์šฉ
  • Subscription ์ด๋ž€ ํŠน์ • ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒ์‹œ ์„œ๋ฒ„์—์„œ ํด๋ผ์ด์–ธํŠธ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•ด์ฃผ๋Š” ๊ธฐ์ˆ 
  • GraphQL Subscription ์˜ withFilter ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜์—ฌ ํŠน์ • ๊ตฌ๋…์ž์—๊ฒŒ๋งŒ ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†ก

GraphQL Subscription ์ด๋ž€ โ“

์ €ํฌ์˜ ํ•ต์‹ฌ ๊ธฐ๋Šฅ์ธ ์‹ค์‹œ๊ฐ„ ์œ„์น˜๊ณต์œ , ์ฑ„ํŒ…, ์˜ค๋” ์•Œ๋ฆผ์„ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด GraphQL Subscription์„ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. Subscription ์€ GraphQL์˜ ํ•œ ๊ธฐ๋Šฅ์œผ๋กœ ํŠน์ •ํ•œ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ์— ์„œ๋ฒ„์—์„œ ํด๋ผ์ด์–ธํŠธ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋‚ผ ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค.

GraphQL Subscription์„ ์‚ฌ์šฉํ•œ ์ด์œ โ—

์ €ํฌ ํ”„๋กœ์ ํŠธ์—๋Š” ์˜ค๋”ย ์•Œ๋ฆผ์ด๋ผ๋Š” ๊ธฐ๋Šฅ์ดย ์žˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ ๋“œ๋ผ์ด๋ฒ„๋ฅผย ํ˜ธ์ถœํ•˜๊ธฐ ์œ„ํ•ดย ํƒ์ƒ‰๋ฒ„ํŠผ์„ย ํด๋ฆญํ•˜๋ฉด ๋“œ๋ผ์ด๋ฒ„๋Š”ย ์ƒˆ๋กœ์šดย ์˜ค๋” ์•Œ๋ฆผ์„ย ๋ฐ›๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ฆ‰ ์‚ฌ์šฉ์ž์˜ ๋“œ๋ผ์ด๋ฒ„ ํ˜ธ์ถœ์ด๋ผ๋Š” ํŠน์ • ์ด๋ฒคํŠธ์— ์˜ํ•ด์„œ ๋“œ๋ผ์ด๋ฒ„๋Š” ์„œ๋ฒ„์—์„œ ์ƒˆ๋กœ์šด ์˜ค๋”์— ๋Œ€ํ•œ ๋ฐ์ดํ„ฐ๋ฅผย ๋ฐ›๊ฒŒ ๋˜๋Š” ๊ฒ๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒย ๋ชจ๋“  ๋“œ๋ผ์ด๋ฒ„๊ฐ€ย ์•Œ๋žŒ์„ ๋ฐ›์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์˜ค๋”๋ฅผ ํ˜ธ์ถœํ•œ ์‚ฌ์šฉ์ž๋ฅผ ๊ธฐ์ค€์œผ๋กœ 10km ์•ˆ์— ์žˆ๋Š” ๋“œ๋ผ์ด๋ฒ„๋งŒ ์•Œ๋žŒ์„ ๋ฐ›๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด ์ €ํฌ๋Š” Subscriptionย withFilter ์„ย ํ†ตํ•ด ํŠน์ • ๋“œ๋ผ์ด๋ฒ„์—๊ฒŒ๋งŒ ์ƒˆ๋กœ์šดย ์˜ค๋” ์•Œ๋žŒ์„ย ๋„์›Œ ์ฃผ๋„๋ก ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿผ ์–ด๋–ป๊ฒŒ GraphQL Subscription ์„ ๊ตฌํ˜„ํ• ๊นŒ โ“

GraphQL Subscription์€ WebSocket์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ตฌํ˜„๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ํด๋ผ์ด์–ธํŠธ์—์„œ ์„œ๋ฒ„๋กœ ์š”์ฒญ์„ ๋ณด๋‚ธ ํ›„ ์‘๋‹ต์„ ๋ฐ›๊ณ  ์—ฐ๊ฒฐ์„ ์ข…๋ฃŒํ•˜๋Š” HTTP ์š”์ฒญ๊ณผ ๋‹ฌ๋ฆฌ GraphQL Subscription ์—์„œ๋Š” ์„œ๋ฒ„๊ฐ€ ๊ตฌ๋…์ค‘์ธ ํด๋ผ์ด์–ธํŠธ์™€ ์ง€์†์ ์ธ ์—ฐ๊ฒฐ์„ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.

์ €ํฌ ์„œ๋น„์Šค๋กœ ์˜ˆ๋ฅผ ๋“ค๋ฉด ํด๋ผ์ด์–ธํŠธ์— ํ•ด๋‹นํ•˜๋Š” ๋“œ๋ผ์ด๋ฒ„๋Š” ์•„๋ž˜ ์ฝ”๋“œ์™€ ๊ฐ™์ด ์˜ค๋”์ƒ์„ฑ ์ด๋ผ๋Š” ๊ด€์‹ฌ์žˆ๋Š” ์ด๋ฒคํŠธ๋ฅผ ๋ช…์‹œํ•œ(SUB_NEW_ORDER) ๊ตฌ๋…์ฟผ๋ฆฌ๋ฅผ ์„œ๋ฒ„์— ์ „์†กํ•˜์—ฌ ์„œ๋ฒ„์™€ ์ง€์†์ ์ธ ์—ฐ๊ฒฐ์„ ํ˜•์„ฑํ•ฉ๋‹ˆ๋‹ค. ๋“œ๋ผ์ด๋ฒ„์— ํ•ด๋‹นํ•˜๋Š” ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์˜ค๋”์ƒ์„ฑ ์ด๋ผ๋Š” ๊ด€์‹ฌ์žˆ๋Š” ์ด๋ฒคํŠธ๋ฅผ ๊ตฌ๋…(Subscribe)ํ•˜๊ฒŒ ๋˜๋Š”๊ฒƒ์ด์ฃ !

์ด๋ ‡๊ฒŒ ๋˜๋ฉด ์„œ๋ฒ„์— ์ƒˆ๋กœ์šด ์˜ค๋”์— ๋Œ€ํ•œ ์š”์ฒญ์ด ์™”์„๋•Œ ์ด๋ฅผ ๊ตฌ๋…ํ•˜๊ณ  ์žˆ๋Š” ๋“œ๋ผ์ด๋ฒ„์—๊ฒŒ ์˜ค๋” ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•˜๊ณ  ์˜ค๋” ๋ฐ์ดํ„ฐ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋“œ๋ผ์ด๋ฒ„ ํ™”๋ฉด์— ์˜ค๋”์•Œ๋ฆผ ํŒ์—…์ฐฝ์„ ๋„์›Œ ์ค„ ์ˆ˜ ์žˆ๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด์ฃ !

useSubscription<SubNewOrder>(**SUB_NEW_ORDER**); // **๋‚˜ ์˜ค๋” ์ƒ์„ฑ ์ด๋ฒคํŠธ ๊ตฌ๋…ํ• ๊ฑฐ์•ผ!!**

์ž์„ธํ•œ ์ฝ”๋“œ๊ฐ€ ๊ถ๊ธˆํ•˜์‹œ๋‹ค๋ฉด ์—ฌ๊ธฐโ—๏ธ๋ฅผ ํด๋ฆญํ•ด์ฃผ์„ธ์š” ๐Ÿ˜Š

๋‹ค์Œ์€ ์„œ๋ฒ„ ์ชฝ์ž…๋‹ˆ๋‹ค. ํŠน์ • ์ด๋ฒคํŠธ๋ฅผ ๊ตฌ๋…ํ•˜๊ณ , ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ์— ์•Œ๋ฆผ์„ ์ฃผ๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•œ PubSub ์ด๋ผ๋Š” ๋…€์„์ด ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. PubSub์€ Apollo Server์—์„œ ์ œ๊ณตํ•˜๋Š” ํด๋ž˜์Šค์ธ๋ฐ ํŠน์ • ์ด๋ฒคํŠธ์˜ ๋ฐœ์ƒ์„ ์•Œ๋ฆฌ๊ณ (Publish) ์ด๋ฒคํŠธ๋ฅผ ๊ฐ์ง€ํ•˜์—ฌ(AsyncIterator) ์ด๋ฅผ ๊ตฌ๋…ํ•˜๊ณ  ์žˆ๋Š” ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•  ์ˆ˜ ์žˆ๋Š” ์œ ์šฉํ•œ API๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

์ด๋ฅผ ํ†ตํ•ด ์ €ํฌ๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์˜ค๋”๋ฅผ ์ƒ์„ฑํ–ˆ์„ ๋•Œ ํŠน์ • ์˜ค๋” ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐœํ–‰(Publish)ํ•  ์ˆ˜ ์žˆ๊ณ  ์ด ์ด๋ฒคํŠธ๋ฅผ ๊ฐ์ง€ํ•˜์—ฌ ๊ตฌ๋…ํ•˜๊ณ  ์žˆ๋Š” ๋“œ๋ผ์ด๋ฒ„์—๊ฒŒ ์•Œ๋ฆผ์„ ์ค„ ์ˆ˜ ์žˆ๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด์ฃ !

//์˜ค๋”๊ฐ€ ์ƒ์„ฑ ๋์–ด์š”!!!
pubsub.publish(CREATE_NEW_ORDER, {
        subNewOrder: { newOrder: createdOrder },
      });

//์•Œ๊ฒ ์–ด์š” ๊ตฌ๋…ํ•˜๊ณ  ์žˆ๋Š” ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์˜ค๋”๋ฐ์ดํ„ฐ ์•Œ๋ ค์ค„๊ฒŒ์š”!!!
pubsub.asyncIterator(CREATE_NEW_ORDER),

์ž์„ธํ•œ ์ฝ”๋“œ๊ฐ€ ๊ถ๊ธˆํ•˜์‹œ๋‹ค๋ฉด ์—ฌ๊ธฐโ—๏ธ๋ฅผ ํด๋ฆญํ•ด์ฃผ์„ธ์š” ๐Ÿ˜Š

์ด๋ฅผ ๊ทธ๋ฆผ์œผ๋กœ ๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค!

ํ•˜์ง€๋งŒ ์ œ์ฃผ๋„์— ์žˆ๋Š”ย ์‚ฌ์šฉ์ž๊ฐ€ ๋“œ๋ผ์ด๋ฒ„๋ฅผ ํ˜ธ์ถœย ํ–ˆ์„ ๋•Œย ์„œ์šธ์— ์žˆ๋Š” ๋“œ๋ผ์ด๋ฒ„์—๊ฒŒ ์š”์ฒญ์ดย ๊ฐ€๋ฉด ์•ˆ ๋˜๊ฒ ์ฃ ? ์ด๋ฅผย ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์ €ํฌ๋Š” Subscriptionย withFilterย ์„ ํ™œ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ง ๊ทธ๋Œ€๋กœ ํŠน์ • ์ด๋ฒคํŠธ๋ฅผ ๊ตฌ๋…ํ•˜๊ณ  ์žˆ๋Š” ๋ชจ๋“  ์‚ฌ์šฉ์ž์—๊ฒŒ ์•Œ๋ฆผ์„ย ์ฃผ๋Š” ๊ฒƒ์ด ์•„๋‹Œย ํŠน์ • ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ์‚ฌ์šฉ์ž์—๊ฒŒ๋งŒ ์•Œ๋ฆผ์„ย ์ฃผ๋Š” ๊ฒƒ์ด์ฃ .

์ €ํฌ๋Š” ์˜ค๋”๊ฐ€ ์ƒ์„ฑ๋˜์—ˆ์„ ๊ฒฝ์šฐ ์‚ฌ์šฉ์ž์˜ย ์œ„์น˜ ๊ธฐ์ค€ย 10KM ์ด๋‚ด์— ์žˆ๋Š”ย ๋“œ๋ผ์ด๋ฒ„์—๊ฒŒ๋งŒย ์ƒˆ๋กœ์šด ์˜ค๋”์— ๋Œ€ํ•œ ์•Œ๋ฆผ์„ ์ฃผ๋„๋ก ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค!

   subscribe: withFilter(
        (_, __, { pubsub }) => pubsub.asyncIterator(CREATE_NEW_ORDER), **//์ด๋ฒคํŠธ ๊ฐ์ง€!!**
        (payload, variables) => {
          return ( **// ํŠน์ • ๊ฑฐ๋ฆฌ์ด๋‚ด์— ๋“œ๋ผ์ด๋ฒ„์—๊ฒŒ๋งŒ ์ƒˆ๋กœ์šด ์˜ค๋”์•Œ๋ฆผ!!!**
            calcLocationDistance(newOrderStartingPoint, driverLocation) <= ORDER.POSSIBLE_DISTANCE
          );
        },

์ž์„ธํ•œ ์ฝ”๋“œ๊ฐ€ ๊ถ๊ธˆํ•˜์‹œ๋‹ค๋ฉด ์—ฌ๊ธฐโ—๏ธ๋ฅผ ํด๋ฆญํ•ด์ฃผ์„ธ์š” ๐Ÿ˜Š

๊ตฌํ˜„ ๊ฒฐ๊ณผ โ—โ—โ—

์งœ์ž” GraphQL Subscription์„ ํ™œ์šฉํ•˜์—ฌ ์˜ค๋” ์ƒ์„ฑ์‹œ 10KM ์ด๋‚ด์˜ ๋“œ๋ผ์ด๋ฒ„์—๊ฒŒ๋งŒ ์•Œ๋ฆผ์ด ๋„์›Œ์ง‘๋‹ˆ๋‹ค.

์ฑ„ํŒ…๋„ย ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ ์ฑ„ํŒ… ์ƒ์„ฑ์— ๋Œ€ํ•œย ๊ตฌ๋…์ฟผ๋ฆฌ๋ฅผย ๋ณด๋‚ด์–ด ์„œ๋ฒ„์™€ ์—ฐ๊ฒฐ์„ ๋งบ๊ณ  ์ฑ„ํŒ…์ดย ์ƒ์„ฑ๋˜์—ˆ์„๋•Œ ์ฑ„ํŒ…์ƒ์„ฑ์„ย ๊ตฌ๋…ํ•˜๊ณ  ์žˆ๋Š”ย ์‚ฌ์šฉ์ž ์ค‘ย Subscriptionย withFilter๋ฅผย ํ†ตํ•ด ํ˜„์žฌ ๋งค์นญ๋œย ์‚ฌ์šฉ์ž์—๊ฒŒ๋งŒย ์ฑ„ํŒ…๋ฐ์ดํ„ฐ๋ฅผย ์ „์†กํ•˜์—ฌ ์‹ค์‹œ๊ฐ„์œผ๋กœย ํ†ต์‹ ํ• ย ์ˆ˜ย ์žˆ๋Š” ๊ฒƒ์ด์ฃ !

๊ฒฐ๋ก  PubSub(๋ฐœํ–‰/๊ตฌ๋…) ๋ชจ๋ธ์„ ์ดํ•ดํ•˜๊ณ ย GraphQLย Subscription์„ย ํ™œ์šฉํ•ด๋ณด๋‹ˆ ์„œ๋ฒ„์—์„œ ๋ฐœ์ƒํ•˜๋Š” ์ด๋ฒคํŠธ๋ฅผ ํด๋ผ์ด์–ธํŠธ์—์„œ ํšจ๊ณผ์ ์œผ๋กœย ์ธ์ง€ํ• ย ์ˆ˜ย ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œย ์˜ค๋” ์•Œ๋ฆผ, ์œ„์น˜๊ณต์œ , ์ฑ„ํŒ… ๊ธฐ๋Šฅ๋“ค์€ ํŠน์ • ์‚ฌ์šฉ์ž์™€ ํ†ต์‹ ์„ย ํ•˜๋ฏ€๋กœย ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด Subscriptionย withFilterย ์ด๋ผ๋Š” ์œ ์šฉํ•œ ๊ธฐ๋Šฅ๋„ ์ ์šฉํ•ด ๋ณผ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ํ”„๋กœ์ ํŠธ๋ฅผ ํ•˜๋ฉด์„œย GraphQLย Subscription ๋•๋ถ„์— ์‹ค์‹œ๊ฐ„ ํ†ต์‹ ์ด ํ•ต์‹ฌ์ธ ๊ธฐ๋Šฅ๋“ค์„ ๋น„๊ต์  ์‰ฝ๊ฒŒย ๊ตฌํ˜„ํ• ย ์ˆ˜ ์žˆ์—ˆ๋˜ ๊ฑฐย ๊ฐ™์Šต๋‹ˆ๋‹ค.!

๐Ÿ“† Planning

๐Ÿ‘จโ€๐Ÿ’ป Agile Process

Daily Scrum
์ฃผ์ฐจ๋ณ„ ํšŒ๊ณ 
์ฃผ์ฐจ๋ณ„ ํ”ผ์–ด์„ธ์…˜
๊ธฐ์ˆ ๊ด€๋ จ ๋‚ด์šฉ ๋…ผ์˜
๋ฉ˜ํ† ๋‹˜๊ณผ์˜ ๋‘๊ทผ๋‘๊ทผ ๋ฏธํŒ…

๐Ÿ“š Ground Rule

Clone this wiki locally