Django

Django & GraphQL

Django๋ฅผ ์‚ฌ์šฉํ•œ GraphQL, Strawberry/Graphene, schema, queries, mutations, subscriptions, ์ธ์ฆ, DataLoader, N+1 ๋ฌธ์ œ

24 ๋ฉด์ ‘ ์งˆ๋ฌธยท
Senior
1

GraphQL์ด๋ž€ ๋ฌด์—‡์ด๋ฉฐ REST์™€์˜ ์ฃผ์š” ์ฐจ์ด์ ์€ ๋ฌด์—‡์ธ๊ฐ€์š”?

๋‹ต๋ณ€

GraphQL์€ Facebook์ด ๊ฐœ๋ฐœํ•œ API์šฉ query ์–ธ์–ด์ž…๋‹ˆ๋‹ค. ๊ณ ์ •๋œ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ์—ฌ๋Ÿฌ endpoint๋ฅผ ๋…ธ์ถœํ•˜๋Š” REST์™€ ๋‹ฌ๋ฆฌ, GraphQL์€ ๋‹จ์ผ endpoint๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ •ํ™•ํžˆ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” REST์—์„œ ํ”ํžˆ ๋ฐœ์ƒํ•˜๋Š” over-fetching(๋„ˆ๋ฌด ๋งŽ์€ ๋ฐ์ดํ„ฐ ์ˆ˜์‹ )๊ณผ under-fetching(์—ฌ๋Ÿฌ ์š”์ฒญ์„ ํ•ด์•ผ ํ•จ) ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค.

2

Django์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋‘ ๊ฐ€์ง€ ์ฃผ์š” GraphQL ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ๋ฌด์—‡์ธ๊ฐ€์š”?

๋‹ต๋ณ€

Strawberry์™€ Graphene-Django๋Š” Django์šฉ ๋‘ ๊ฐ€์ง€ ์ฃผ์š” GraphQL ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ž…๋‹ˆ๋‹ค. Graphene-Django๋Š” ๋” ์„ฑ์ˆ™ํ•˜๊ณ  ๋„๋ฆฌ ์ฑ„ํƒ๋˜์–ด ์žˆ์œผ๋ฉฐ ํด๋ž˜์Šค ๊ธฐ๋ฐ˜ ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. Strawberry๋Š” ๋” ํ˜„๋Œ€์ ์ด๋ฉฐ ๋„ค์ดํ‹ฐ๋ธŒ Python type hints๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ํƒ€์ž… ๊ฒ€์‚ฌ ๋„๊ตฌ์™€์˜ ํ†ตํ•ฉ์ด ๋” ์šฐ์ˆ˜ํ•ฉ๋‹ˆ๋‹ค. Strawberry๋Š” ๋” pythonicํ•œ ๊ตฌ๋ฌธ๊ณผ ๋„ค์ดํ‹ฐ๋ธŒ async ์ง€์› ๋•๋ถ„์— ์‹ ๊ทœ ํ”„๋กœ์ ํŠธ์— ๊ถŒ์žฅ๋ฉ๋‹ˆ๋‹ค.

3

Django User ๋ชจ๋ธ์„ ํ‘œํ˜„ํ•˜๊ธฐ ์œ„ํ•ด Strawberry๋กœ ๊ฐ„๋‹จํ•œ GraphQL ํƒ€์ž…์„ ์ •์˜ํ•˜๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ•˜๋‚˜์š”?

๋‹ต๋ณ€

Strawberry์—์„œ๋Š” @strawberry.type ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋ฅผ dataclass ํด๋ž˜์Šค์— ์‚ฌ์šฉํ•˜์—ฌ GraphQL ํƒ€์ž…์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. ํ•„๋“œ๋Š” ํ‘œ์ค€ Python type hints(str, int ๋“ฑ)๋กœ ์„ ์–ธ๋ฉ๋‹ˆ๋‹ค. ์ด ์ ‘๊ทผ ๋ฐฉ์‹์€ Python์˜ ๋„ค์ดํ‹ฐ๋ธŒ ํƒ€์ž… ์‹œ์Šคํ…œ์„ ํ™œ์šฉํ•˜์—ฌ ์ฝ”๋“œ๋ฅผ ๋” ์ฝ๊ธฐ ์‰ฝ๊ฒŒ ๋งŒ๋“ค๊ณ  IDE ๋ฐ mypy์™€ ๊ฐ™์€ ํƒ€์ž… ๊ฒ€์‚ฌ ๋„๊ตฌ์™€์˜ ํ†ตํ•ฉ์„ ํ–ฅ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค.

4

GraphQL์—์„œ resolver๋ž€ ๋ฌด์—‡์ด๋ฉฐ ๊ทธ ์—ญํ• ์€ ๋ฌด์—‡์ธ๊ฐ€์š”?

5

GraphQL์—์„œ Query์™€ Mutation์˜ ์ฐจ์ด์ ์€ ๋ฌด์—‡์ธ๊ฐ€์š”?

+21 ๋ฉด์ ‘ ์งˆ๋ฌธ

๊ธฐํƒ€ Django ๋ฉด์ ‘ ์ฃผ์ œ

Python ๊ธฐ์ดˆ

Junior
25๊ฐœ ์งˆ๋ฌธ

Python ๊ฐ์ฒด ์ง€ํ–ฅ

Junior
20๊ฐœ ์งˆ๋ฌธ

Django ๊ธฐ์ดˆ

Junior
20๊ฐœ ์งˆ๋ฌธ

Django Models - ๊ธฐ์ดˆ

Junior
22๊ฐœ ์งˆ๋ฌธ

Django ๋ทฐ

Junior
20๊ฐœ ์งˆ๋ฌธ

Django ํ…œํ”Œ๋ฆฟ

Junior
18๊ฐœ ์งˆ๋ฌธ

Django ํผ

Mid-Level
22๊ฐœ ์งˆ๋ฌธ

๊ณ ๊ธ‰ QuerySet

Mid-Level
25๊ฐœ ์งˆ๋ฌธ

Django ์ธ์ฆ

Mid-Level
22๊ฐœ ์งˆ๋ฌธ

Django ๋ฏธ๋“ค์›จ์–ด

Mid-Level
18๊ฐœ ์งˆ๋ฌธ

Django Admin

Mid-Level
20๊ฐœ ์งˆ๋ฌธ

Django REST Framework

Mid-Level
30๊ฐœ ์งˆ๋ฌธ

Django ์‹œ๊ทธ๋„

Mid-Level
18๊ฐœ ์งˆ๋ฌธ

ํŒŒ์ผ ์—…๋กœ๋“œ

Mid-Level
20๊ฐœ ์งˆ๋ฌธ

Django ์บ์‹ฑ

Mid-Level
20๊ฐœ ์งˆ๋ฌธ

Django ์„ธ์…˜

Mid-Level
18๊ฐœ ์งˆ๋ฌธ

Django ์ด๋ฉ”์ผ

Mid-Level
18๊ฐœ ์งˆ๋ฌธ

Django ํ…Œ์ŠคํŠธ

Mid-Level
22๊ฐœ ์งˆ๋ฌธ

Django ๋ณด์•ˆ

Mid-Level
22๊ฐœ ์งˆ๋ฌธ

Django ๋ฐฐํฌ

Mid-Level
24๊ฐœ ์งˆ๋ฌธ

Django ORM ๊ณ ๊ธ‰

Senior
28๊ฐœ ์งˆ๋ฌธ

Django ์„ฑ๋Šฅ

Senior
24๊ฐœ ์งˆ๋ฌธ

Django & Celery

Senior
22๊ฐœ ์งˆ๋ฌธ

Django Channels

Senior
24๊ฐœ ์งˆ๋ฌธ

Django & Docker

Senior
20๊ฐœ ์งˆ๋ฌธ

๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค ์ƒํƒœ๊ณ„์—์„œ์˜ Django

Senior
24๊ฐœ ์งˆ๋ฌธ

์‚ฌ์šฉ์ž ์ •์˜ Django ๋ช…๋ น์–ด

Senior
18๊ฐœ ์งˆ๋ฌธ

Django ๊ตญ์ œํ™”

Senior
20๊ฐœ ์งˆ๋ฌธ

Django ๋””์ž์ธ ํŒจํ„ด

Senior
24๊ฐœ ์งˆ๋ฌธ

Django Async ๋ฐ ASGI

Senior
26๊ฐœ ์งˆ๋ฌธ

Settings ๋ฐ ํ”„๋กœ๋•์…˜ ๊ตฌ์„ฑ

Senior
22๊ฐœ ์งˆ๋ฌธ

๊ด€์ธก ๊ฐ€๋Šฅ์„ฑ ๋ฐ ๋ชจ๋‹ˆํ„ฐ๋ง

Senior
24๊ฐœ ์งˆ๋ฌธ

๋‹ค์Œ ๋ฉด์ ‘์„ ์œ„ํ•ด Django์„ ๋งˆ์Šคํ„ฐํ•˜์„ธ์š”

๋ชจ๋“  ์งˆ๋ฌธ, flashcards, ๊ธฐ์ˆ  ํ…Œ์ŠคํŠธ, ์ฝ”๋“œ ๋ฆฌ๋ทฐ ์—ฐ์Šต, ๋ฉด์ ‘ ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ์— ์ ‘๊ทผํ•˜์„ธ์š”.

๋ฌด๋ฃŒ๋กœ ์‹œ์ž‘ํ•˜๊ธฐ