-
Notifications
You must be signed in to change notification settings - Fork 3
Graphql Subscription โก
- ์์น๊ณต์ , ์ฑํ , ์ค๋์๋ ๊ฐ์ ์ค์๊ฐ ํต์ ์ ๊ตฌํํ๊ธฐ ์ํด 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 ๋๋ถ์ ์ค์๊ฐ ํต์ ์ด ํต์ฌ์ธ ๊ธฐ๋ฅ๋ค์ ๋น๊ต์ ์ฝ๊ฒย ๊ตฌํํ ย ์ ์์๋ ๊ฑฐย ๊ฐ์ต๋๋ค.!
์ธ๋ถ์ ๋ณด๋ ์ฌ์ด๋๋ฐ๋ฅผ ์ด์ฉํด์ฃผ์ธ์๐ โก๏ธโก๏ธ
Daily Scrum
- 201116-scrum
- 201117-scrum
- 201118-scrum
- 201119-scrum
- 201120-scrum
- 201123-scrum
- 201124-scrum
- 201125-scrum
- 201126-scrum
- 201127-scrum
- 201130-scrum
- 201201-scrum
- 201202-scrum
- 201203-scrum
- 201204-scrum
- 201207-scrum
- 201208-scrum
- 201209-scrum
- 201210-scrum
- 201211-scrum
- 201214-scrum
- 201215-scrum
- 201216-scrum
- 201217-scrum
์ฃผ์ฐจ๋ณ ํ๊ณ
์ฃผ์ฐจ๋ณ ํผ์ด์ธ์
๊ธฐ์ ๊ด๋ จ ๋ด์ฉ ๋ ผ์
- JWT Token์ด๋
- GraphQL ์ด๋?
- Apollo Server ํ๊ฒฝ ์ค์
- PR ๋จธ์ง์ ๋ฆฌ๋ทฐ ํ์ ์ค์
- apollo server์์ ์ฌ์ฉ์ ์ธ์ฆ ๊ด๋ฆฌ
- Mongoose ์์ TypeScript ์ฌ์ฉ
- graphql ์ธ์ฆ ๊ณผ์
- IKEYTAX ํ ํฐ์ธ์ฆ ์ ๋ต
- Custom Hook์ ์ด์ฉํ ํ ํฐ ์ฌ๋ฐ๊ธ โณ
- Cypress ์ Jest ๋ฅผ ํ์ฉํ ํ ์คํธ ๐งช
- Subscription์ ํตํ ์ค์๊ฐ ํต์ โก