1. REST API ๋ง๊ณ  GraphQL, ๋„ˆ ํ˜น์‹œ ๋ญ ๋ผ..?!

GraphQL(๊ทธ๋ž˜ํ”„ํ์—˜, ์ดํ•˜ ๊ทธํ์—˜)์€ API๋ฅผ ๋งŒ๋“ค ๋•Œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ฟผ๋ฆฌ ์–ธ์–ด์ž…๋‹ˆ๋‹ค. ํŽ˜์ด์Šค๋ถ ํŒ€์—์„œ ๊ฐœ๋ฐœํ•œ ๊ฒƒ์œผ๋กœ, ํด๋ผ์ด์–ธํŠธ ์ชฝ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฅธ ์‹œ๊ฐ์œผ๋กœ ๋ณด๊ธฐ ์‹œ์ž‘ํ•˜๋ฉด์„œ ๊ทธํ์—˜์„ ๋งŒ๋“ค๊ธฐ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค.

1-1. ๊ทธ ์œ ๋ช…ํ•œ REST API, ๋ญ๊ฐ€ ๋ฌธ์ œ์˜€์„๊นŒ?

REST ์‚ฌ์šฉ์—์„œ๋Š” ํฌ๊ฒŒ ๋‘๊ฐ€์ง€ ์„ฑ๋Šฅ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

  1. OverFetching: ํ•„์š”ํ•˜์ง€ ์•Š์€ ๋ฐ์ดํ„ฐ๋ฅผ ๋„ˆ๋ฌด ๋งŽ์ด ๋ฐ›์•„์˜ค๋Š” ๋ฌธ์ œ โ‡’ ๋„คํŠธ์›Œํฌ ๋‚ญ๋น„
  2. UndefFetching: ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๊ฐ€ ํ•œ ์š”์ฒญ์— ์˜ค์ง€ ์•Š๋Š” ๊ฒƒ โ‡’ ๋„ˆ๋ฌด ๋งŽ์€ ์š”์ฒญ์„ ๋ณด๋‚ผ์ˆ˜๋„!

ํ•„์š”ํ•œ ์‹œ๊ธฐ์— ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋งŒ ์ฃผ๊ณ ๋ฐ›์„ ์ˆ˜ ์žˆ๋„๋ก ๊ทธํ์—˜์ด ๊ฐœ๋ฐœ๋œ ๊ฒƒ์ž…๋‹ˆ๋‹ค..!

์˜ˆ์‹œ

๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ƒํ’ˆ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” ํŽ˜์ด์ง€๋ฅผ ๋งŒ๋“ ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ด…์‹œ๋‹ค! ์•„๋ž˜ ์‚ฌ์ง„์€ ์ƒ‰๊ณผ ๋ถ„์œ„๊ธฐ๋กœ ํ–ฅ์ˆ˜๋ฅผ ๊ฒ€์ƒ‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ์„œ๋น„์Šค ์ปฌํ“ธ์˜ ์ผ๋ถ€๋ฅผ ์บก์ณํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. (์ œ๊ฐ€ ์›น ๊ฐœ๋ฐœ์ž๋กœ ์ฐธ์—ฌํ–ˆ์Šต๋‹ˆ๋‹ค ใ…Žใ…Ž)

๊ทธ๋Ÿฐ๋ฐ ์ƒํ’ˆ ํ•˜๋‚˜๊ฐ€ ๊ฐ€์ง„ ๋ฐ์ดํ„ฐ๋Š” ๋ฌด๊ถ๋ฌด์ง„ํ•ฉ๋‹ˆ๋‹ค.. ๋ธŒ๋žœ๋“œ๋ช…, ์ƒํ’ˆ๋ช…, ์ƒํ’ˆ ์ด๋ฏธ์ง€, ์šฉ๋Ÿ‰, ๊ฐ€๊ฒฉ, ํ–ฅ์˜ ๋ฌ˜์‚ฌ ๋“ฑ๋“ฑ!

๊ทธ๋Ÿฐ๋ฐ, ์ƒํ’ˆ ๋ฆฌ์ŠคํŠธ๋งŒ ๋ณด๋ฉด ๋˜๋Š” ํŽ˜์ด์ง€์—์„œ ์ œ์กฐ์ผ๊ณผ ์žฌ๊ณ  ์ˆ˜๊นŒ์ง€ ๋ชจ๋‘ ๋ฐ›๋Š” ๊ฒƒ์€ ๋„ˆ๋ฌด ๋‚ญ๋น„๋ผ๋Š” ์ƒ๊ฐ์ด ๋“ค์ง€ ์•Š๋‚˜์œ !? (์ด๊ฒŒ ๋ฐ”๋กœ OverFetching)

๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์•„๋ž˜์™€ ๊ฐ™์€ ํŽ˜์ด์ง€๋ฅผ ๋งŒ๋“ค๋•Œ๋Š” ๋ชจ๋‘ ํ•„์š”ํ•œ ์ •๋ณด์ธ๋ฐ ๋ง์ด์ฃ ! ์ •๋ณด๊ฐ€ ํ•˜๋‚˜๋ผ๋„ ๋ˆ„๋ฝ๋˜๋ฉด ์•ˆ๋˜๊ฒ ๋„ค์š”..! (์ด๊ฒŒ ๋ฐ”๋กœ UndefFetching)

1-2. ๊ทธํ์—˜, ๊ทธ๋ž˜์„œ ๋ญ๊ฐ€ ์ข‹์€๋ฐ?

๊ทธํ์—˜์€ ์œ ์—ฐํ•œ ์ฟผ๋ฆฌ๋ฅผ ๊ฐ€์ง„๋‹ค๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ํฐ ์žฅ์ ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ด์š”!

๋ถ€ํ•˜์™„ํ™”์šฉ ์ฟผ๋ฆฌ์–ธ์–ด๋กœ, ์งˆ์˜๋ฅผ ์œ„ํ•ด ์กด์žฌํ•˜๋Š” ์–ธ์–ด์ž…๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ํ•˜๋‚˜์˜ ์—”๋“œํฌ์ธํŠธ๋งŒ ์ •์˜๋˜์–ด์žˆ์–ด๋„ ์›ํ•˜๋Š” ํ˜•ํƒœ๋กœ ๋ฐ”๊ฟ”๊ฐ€๋ฉฐ ์งˆ์˜ํ•˜๊ธฐ ์ข‹์Šต๋‹ˆ๋‹ค!

์˜ˆ๋ฅผ ๋“ค์–ด, ํ–ฅ์ˆ˜์˜ ๋ชฉ๋ก์„ ๋ณด์—ฌ์ค„ ๋•Œ๋Š” ๋Œ€ํ‘œ์ด๋ฏธ์ง€, ์ด๋ฆ„, ๋ธŒ๋žœ๋“œ๋ช…๋งŒ ์š”์ฒญํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ  ๋ฐ›๊ณ , ํ–ฅ์ˆ˜์˜ ์ƒ์„ธ์ •๋ณด๋ฅผ ๋ณด์—ฌ์ค„ ๋•Œ๋Š” ๊ทธ ๋•Œ ํ•„์š”ํ•œ ์ •๋ณด๋ฅผ ๋ชจ๋‘ ๋ณด๋‚ด๊ฑฐ๋‚˜ ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์œ„์—์„œ ์–ธ๊ธ‰ํ•œ overFetching๊ณผ underFetching์˜ ๋ฌธ์ œ๋ฅผ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ ๊ฒƒ์ด์ฃ ! ๋Œ€๋ฐ•!

2. ํƒ€์ž… ์‹œ์Šคํ…œ

GraphQL(๊ทธ๋ž˜ํ”„ ํ์—˜, ์ดํ•˜ ๊ทธํ์—˜)์€ typed language์ž…๋‹ˆ๋‹ค. ๊ทธํ์—˜์˜ ํƒ€์ž…์‹œ์Šคํ…œ์„ ์•Œ์•„์•ผ ํด๋ผ์™€ ์„œ๋ฒ„๋ฅผ ์—ฐ๊ฒฐํ•ด์ฃผ๋Š” ์Šคํ‚ค๋งˆ๋ฅผ ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธํ์—˜ ์ฟผ๋ฆฌ์˜ ํ˜•ํƒœ๊ฐ€ ๊ฒฐ๊ณผ์™€ ๊ฑฐ์˜ ์ผ์น˜ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์„œ๋ฒ„๋ฅผ ์ž˜ ๋ชจ๋ฅด๋”๋ผ๋„ ์ฟผ๋ฆฌ์˜ ๋ฐ˜ํ™˜ ๋‚ด์šฉ์„ ์˜ˆ์ธกํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜๋‘ ์šฐ๋ฆฌ๊ฐ€ ์š”์ฒญํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ์ •ํ™•ํ•œ ์„ค๋ช…์„ ์—ญ์‹œ ํ•„์ˆ˜์ ์ด๊ฒ ์ฃ ! ใ…Žใ…Ž

๊ทธํ์—˜์€ ๋Œ€๋ถ€๋ถ„ ๋ชจ๋“  ์–ธ์–ด์—์„œ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํŠน์ • ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์˜ syntax์— ์˜์กดํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋…์ž์ ์ด๊ณ  ๋‹จ์ˆœํ•œ ์–ธ์–ด(โ€œGraphQL Schema Language[๊ทธํ์—˜ ์Šคํ‚ค๋งˆ ์–ธ์–ด]โ€)๋กœ ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Scalar๋‹จ์ผ ๊ฐ’ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.
Enum๋ฏธ๋ฆฌ ์ง€์ •๋œ ์˜ต์…˜์˜ ๋ฆฌ์ŠคํŠธ๋กœ๋ถ€ํ„ฐ ์œ ์ €๊ฐ€ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋Š” ์ƒํ™ฉ์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
Object์–ด๋–ค ๊ฐ’์ด fetch๋  ์ˆ˜ ์žˆ๋Š”์ง€๋ฅผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.
Query๋‹ค๋ฅธ ํŠน์ • ํƒ€์ž…์—์˜ Entry point ํƒ€์ž…์ž…๋‹ˆ๋‹ค.
Mutation๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ์„ ์œ„ํ•œ Entry point์ž…๋‹ˆ๋‹ค.

์ด๋ ‡๊ฒŒ๋งŒ ๋ด์„œ๋Š” ๋ญ๋ผ๋Š”์ง€ ๋ชจ๋ฅด๊ฒ ๋„ค์š”.. ์ œ๋Œ€๋กœ ํ†บ์•„๋ด…์‹œ๋‹ค!

2-1. Scalar Type

์Šค์นผ๋ผํƒ€์ž…์€ ์›์‹œ ํƒ€์ž…์œผ๋กœ, ์šฐ๋ฆฌ๊ฐ€ ํ”ํžˆ ์•Œ๊ณ  ์žˆ๋Š” ํƒ€์ž…๊ณผ ๋งค์šฐ ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ๊ทธํ์—˜์—์„œ ์ œ๊ณตํ•˜๋Š” ํƒ€์ž…์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

Int32 bit ์ •์ˆ˜
Float๋ถ€ํ˜ธ๊ฐ€ ์žˆ๋Š” ์†Œ์ˆ˜์  ๊ฐ’
StringUTF-8 ๋ฌธ์ž ์‹œํ€€์Šค
BooleanTrue / False
ID๊ฐ์ฒด๋ฅผ ๊ฐ€์ ธ์˜ค๊ธฐ ์œ„ํ•œ ๊ณ ์œ  ์‹๋ณ„์ž ๋˜๋Š” ์บ์‹œ์˜ key๋กœ ์ž์ฃผ ์‚ฌ์šฉ

Int, Float, String, Boolean์€ ์šฐ๋ฆฌ๊ฐ€ ์ตํžˆ ์•Œ๊ณ  ์žˆ๋Š” ํƒ€์ž…์œผ๋กœ ์ดํ•ดํ•˜๋ฉด ๋˜๊ณ , ID์˜ ๊ฒฝ์šฐ ๊ณ ์œ  ์‹๋ณ„์ž๋ฅผ ์œ„ํ•œ ํƒ€์ž…์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

2-2. Enum Type

Enum ํƒ€์ž…์€ ์Šค์นผ๋ผ ํƒ€์ž…๊ณผ ๋‹ฎ์•„์žˆ์Šต๋‹ˆ๋‹ค. Enum์€ ๊ฐ’์ด ์ง€์ •๋œ ์˜ต์…˜ ๋ชฉ๋ก์—์„œ ๊ฐ€์ ธ์™€์•ผ ํ•˜๋Š” ์ƒํ™ฉ์—์„œ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

๊ตญ๋‚ด ์ตœ๋Œ€ ๊ทœ๋ชจ์˜ IT ๋ฒค์ฒ˜ ์ฐฝ์—… ๋™์•„๋ฆฌ The SOPT์˜ ํŒŒํŠธ๋ฅผ ์˜ˆ์‹œ๋กœ ๋“ค์–ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค! 30๊ธฐ๋ฅผ ๊ธฐ์ค€์œผ๋กœ SOPT์—๋Š” ๊ธฐํš, ๋””์ž์ธ, ์„œ๋ฒ„, ์›น, iOS, ์•ˆ๋“œ๋กœ์ด๋“œ ํŒŒํŠธ๋งŒ์ด ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. RAMEN_PART ๊ฐ™์€ ์ด์ƒํ•œ ํŒŒํŠธ๊ฐ€ ํฌํ•จ๋˜๋ฉด ์•ˆ๋œ๋‹ค๋Š” ์ ์—์„œ enum type์œผ๋กœ ์ œํ•œํ•˜๋ฉด ์ข‹๊ฒ ์ฃ ?!

enum SoptParts {
	PLAN,
  	DESIGN,
	SERVER,
	WEB,
	iOS,
	ANDROID,
}

2-3. Object Type

๊ฐ์ฒด ํƒ€์ž…์€ ์Šคํ‚ค๋งˆ์™€ ๊ทธ๋ฃนํ™”๋œ ํ•„๋“œ๋ฅผ ํ‘œํ˜„ํ•  ๋•Œ ๊ฐ€์žฅ ํ”ํ•˜๊ฒŒ ์‚ฌ์šฉ๋˜๋Š” ํƒ€์ž…์ž…๋‹ˆ๋‹ค. ๊ฐ์ฒด ์œ ํ˜• ๋‚ด์˜ ๊ฐ ํ•„๋“œ๋Š” ๋‹ค๋ฅธ ์œ ํ˜•์— ์ค‘์ฒฉ๋˜์–ด ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, ๊ฐ์ฒด ์œ ํ˜•์€ ์Šค์นผ๋ผ๋‚˜ ๊ฐ์ฒด ์œ ํ˜•์œผ๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค.

๊ทธํ์—˜ ์Šคํ‚ค๋งˆ์˜ ๋Œ€๋ถ€๋ถ„์˜ ๊ธฐ๋ณธ ์ปดํฌ๋„ŒํŠธ๋Š” ๊ฐ์ฒด ํƒ€์ž…์œผ๋กœ, ์„œ๋น„์Šค์—์„œ fetchํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ์ฒด์˜ ์ข…๋ฅ˜๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

๊ฐ€๋ น, ๊ทธํ์—˜ ์Šคํ„ฐ๋””์›๋“ค์˜ ํƒ€์ž…์„ ์ง€์ •ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

type GqlMember {
	memberId: ID,
	name: String,
	latestSopt: Int,
	part: SoptParts,
	isOnDiet: Boolean,
}

3. ์ด๊ฒƒ๋„ ์•Œ์•„์•ผํ•ด์š”!

ํƒ€์ž…์ด๋ผ๊ธฐ์—” ์•ฝ๊ฐ„ ์• ๋งคํ•˜๊ณ , ์œ„์—์„œ ์–ธ๊ธ‰ํ•˜์ง€๋Š” ์•Š์•˜์ง€๋งŒ, ์ถ”๊ฐ€๋กœ ์•Œ์•„์•ผํ•˜๋Š” ๋‚ด์šฉ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

3-1. Non-Nullable Type

๊ทธํ์—˜์˜ ํƒ€์ž… ์ง€์ •์—์„œ ์š”์ƒํ•œ ๋Š๋‚Œํ‘œ!๊ฐ€ ์žˆ๋Š” ๊ฒƒ์„ ๋ณด์‹  ์ ์ด ์žˆ์„๊ฑฐ์—์š”! ๋Š๋‚Œํ‘œ๋Š” ํ•ด๋‹น ํƒ€์ž…์ด Null๊ฐ’์ด ๋  ์ˆ˜ ์—†์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

๊ฐ€๋ น, ๊ณ ์œ  ์‹๋ณ„์ž์ธ id๊ฐ€ ์žˆ๋‹ค๋ฉด, null๊ฐ’์ด ๋˜๋ฉด ์•ˆ๋˜๊ฒ ์ฃ ? ๊ทธ๋ฆฌ๊ณ  ๊ผญ ํ•„์š”ํ•œ ์ •๋ณด(๊ฐ€๋ น, ์ด๋ฆ„, ํŒŒํŠธ ๋“ฑ)๋„ Non-Nullable๋กœ ์ง€์ •ํ•ด๋‘๋ฉด ์ข‹์Šต๋‹ˆ๋‹ค. ์•„๊นŒ ๊ทธํ์—˜ ๋ฉค๋ฒ„ ํƒ€์ž…์„ ์ˆ˜์ •ํ•ด๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

type GqlMember {
	memberId: ID!,
	name: String!,
	// ๊ณ ์ธ๋ฌผ๋“ค์—๊ฒŒ๋Š” ๋ฏผ๊ฐํ•œ ์ •๋ณด์ผ ์ˆ˜ ์žˆ์œผ๋‹ˆ ์ตœ๊ทผ ํ™œ๋™ ๊ธฐ์ˆ˜๋Š” null์ด ๋  ์ˆ˜ ์žˆ๊ฒŒ!
	latestSopt: Int,
	part: SoptParts!,
	isOnDiet: Boolean,
}

3-2. List Type

๋ฐฐ์—ด์„ ํ‘œํ˜„ํ•ด์•ผํ•˜๋Š” ๊ฒฝ์šฐ๋„ ์žˆ๊ฒ ์ฃ ? ๊ทธํ์—˜์—์„œ ๋ฆฌ์ŠคํŠธ๋ฅผ ํ‘œํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋งค์šฐ ์ง๊ด€์ ์ž…๋‹ˆ๋‹ค.
๊ฐ์ฒด, ์Šค์นผ๋ผ, Enum ํƒ€์ž…์„ []๋กœ ๊ฐ์‹ธ๋ฉด๋ฉ๋‹ˆ๋‹ค. ์ฐธ ์‰ฝ์ฃ ์ž‰?

type GqlMemberList {
	memberList: [GqlMember],
}

3-3. โœ‹ ์—ฌ๊ธฐ์„œ ์ž ๊น ๋ฌธ์ œ!

๋‹ค์Œ์˜ ๋นˆ์นธ์„ ์ฑ„์›Œ๋ณด์„ธ์š”!

null[ ][ ..., null, ... ]
[String]
[String!]
[String]!
[String!]!

์ด ๋ฌธ์ œ๋Š” ์ธํ”„๋Ÿฐ ์–„ํŒํ•œ GraphQL๊ณผ Apollo ๊ฐ•์˜์—์„œ ์ถ”์ถœํ–ˆ์Šต๋‹ˆ๋‹ค.
์ •๋‹ต์ด ๊ถ๊ธˆํ•˜์‹  ๋ถ„๋“ค์€ ๊ฐ•์˜๋ฅผ ์ˆ˜๊ฐ•ํ•ด๋ณด์‹œ๋Š” ๊ฒƒ์„ ์ถ”์ฒœ!!

4. Query Type

query์™€ mutation์€ ์Šคํ‚ค๋งˆ์—์„œ ํŠน๋ณ„ํ•˜๊ฒŒ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

schema {
  query: Query
  mutation: Mutation
}

๊ทธํ์—˜์—์„œ์˜ Query๋Š” ๋ฐ์ดํ„ฐ fetch์— ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. REST-API์˜ GET ์š”์ฒญํ•˜๋Š” ๊ฒƒ๊ณผ ๋‹ฎ์•„์žˆ์Šต๋‹ˆ๋‹ค.
๋‹ค๋งŒ ์กฐ๊ธˆ ๋” ์‹ฌํ”Œํ•˜๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด, ํด๋ผ์ด์–ธํŠธ์—์„œ ์„œ๋ฒ„๋กœ Query type์˜ ์š”์ฒญ์„ ๋ณด๋ƒ…๋‹ˆ๋‹ค. ๊ทธํ์—˜์€ ์ฟผ๋ฆฌ๋ฅผ ์ •์˜ํ•˜๊ธฐ ์œ„ํ•ด Schema Definition Language(SDL: ์Šคํ‚ค๋งˆ ์ •์˜ ์–ธ์–ด)์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

type Query {
	member: GqlMember
}

5. Mutation Type

Mutation์€ ๋ฐ์ดํ„ฐ์˜ ์ƒ์„ฑ(create), ์ˆ˜์ •(update), ์‚ญ์ œ(delete)๋ฅผ ์œ„ํ•œ ์˜คํผ๋ ˆ์ด์…˜์ž…๋‹ˆ๋‹ค. REST API์—์„œ์˜ PUT, POST, PATCH, DELETE์™€ ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค. query ํƒ€์ž…์€ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๊ธฐ ์œ„ํ•œ entry point๋ฅผ ์ •์˜ํ•˜๋Š”๋ฐ, mutation์˜ ๊ฒฝ์šฐ ๋ฐ์ดํ„ฐ ์ˆ˜์ •์„ ์œ„ํ•œ entry point๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

์–ด๋Š ๊ฒƒ์ด๋“  ์ด๋ฆ„์€ ์–ธ์ œ๋‚˜ ์ค‘์š”ํ•˜์ง€๋งŒ, ๊ฐœ์ธ์ ์œผ๋กœ๋Š” ์ด ๋ถ€๋ถ„์—์„œ ์ด๋ฆ„์„ ์ž˜ ์ง“๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๊ฒ ๋‹ค๋Š” ์ƒ๊ฐ์„ ํ–ˆ์Šต๋‹ˆ๋‹ค.

6. Query & Mutation ์˜ˆ์‹œ ๋ง›๋ณด๊ธฐ!

๊ทธ๋ž˜ํ”„ํ์—˜์„ ๊ณต๋ถ€ํ•˜๋Š” SOPT ์Šคํ„ฐ๋””์›๋“ค์˜ ์ •๋ณด๋ฅผ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋Š” ๊ทธํ์—˜์„ ๋งŒ๋“ค์–ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

์Šคํ„ฐ๋””์— ๋“ค์–ด์˜ค๊ธฐ ์œ„ํ•ด์„œ ํ•„์š”ํ•œ ๊ฒƒ์€ ์ด๋ฆ„๊ณผ ์†Œ์†ํŒŒํŠธ์ž…๋‹ˆ๋‹ค. SOPT ๋‚ด ์Šคํ„ฐ๋””๋ผ์„œ ์†Œ์†ํŒŒํŠธ๊ฐ€ ๋ถˆ๋ช…ํ™•ํ•˜๋‹ค๋ฉด ์‰ฝ๊ฒŒ ๋“ค์–ด์˜ค๊ธฐ๋Š” ํž˜๋“ญ๋‹ˆ๋‹ค.ใ…  ๋™๋ช…์ด์ธ์ด ์žˆ์„ ์ˆ˜๋„ ์žˆ์œผ๋‹ˆ, ์Šคํ„ฐ๋””์— ์†Œ์†๋œ ํ›„์—๋Š” ์ž์‹ ๋งŒ์˜ ๊ณ ์œ ํ•œ ๋ฒˆํ˜ธ๋ฅผ ๋ถ€์—ฌํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅ๋  ์ •๋ณด๋Š” ๋‹ค์Œ ๋‚ด์šฉ์„ ํ•„์ˆ˜์ ์œผ๋กœ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.

input NewGqlMember {
	id: ID!,
	name: String!,
	part: SoptParts!,
}

๋ น์ด๋ผ๋Š” ์ƒˆ๋กœ์šด ๋ฉค๋ฒ„๊ฐ€ ์Šคํ„ฐ๋””์— ๋“ค์–ด์˜ค๊ธฐ๋กœ ํ–ˆ์Šต๋‹ˆ๋‹ค! ์ด๋ฆ„๊ณผ ์†Œ์†ํŒŒํŠธ๋ฅผ ์ ์–ด์„œ api๋ฅผ ์š”์ฒญํ•˜๋ ค๊ณ  ํ–ˆ๋Š”๋ฐ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅ๋  id๊ฐ’์ด ์—†๋„ค์š”.. ์ƒˆ๋กœ์šด ๋ฉค๋ฒ„๋ฅผ ์ถ”๊ฐ€ํ•  ๋•Œ ์‚ฌ์šฉํ•  ํƒ€์ž…์ด ํ•„์š”ํ•˜๋‹ˆ input ํƒ€์ž…์„ ์ƒ์„ฑํ•ด์ค๋‹ˆ๋‹ค.

input NewGqlMember {
	name: String!,
	part: SoptParts!,
}

6-1. โœจ [CREATE] ๋ฉค๋ฒ„ ์ถ”๊ฐ€ ๋˜๋Š” ์ƒ์„ฑ

์ด์ œ ๊ณ ์œ  id๋ฅผ ๋ฏธ๋ฆฌ ๋ถ€์—ฌ๋ฐ›์ง€ ์•Š์•„๋„, ์ด๋ฆ„๊ณผ ํŒŒํŠธ๋งŒ ๋ช…ํ™•ํ•˜๋ฉด ์šฐ๋ฆฌ ์Šคํ„ฐ๋””์— ๋“ค์–ด์˜ฌ ์ˆ˜ ์žˆ๋„๋ก ํ–ˆ์Šต๋‹ˆ๋‹ค! ์ด์ œ ๋ฉค๋ฒ„ ์ถ”๊ฐ€๋ฅผ ์œ„ํ•œ Mutation์„ ์ง€์ •ํ•ด๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

type Mutation {
	addGqlMember(newInput: NewGqlMember): GqlMember,
}

arguments:
๊ทธํ์—˜์˜ ๊ฐ์ฒด ํƒ€์ž…์€ ๋ชจ๋‘ arguments๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•„์ˆ˜๊ฐ’์ด ๋  ์ˆ˜๋„ ์žˆ๊ณ , ์˜ต์…”๋„์ด ๋  ์ˆ˜๋„ ์žˆ์–ด default๊ฐ’์„ ์ •ํ•˜๋Š” ๊ฒƒ๋„ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

type Person {
	id: ID!
	name: String!
	length(unit: LengthUnit = METER): Float
}

ํ•ด๋‹น ์ฟผ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ๋Š” NewGqlMember์— ๋งž๋Š” ํ˜•์‹์œผ๋กœ ์ด๋ฆ„๊ณผ ํŒŒํŠธ๋ฅผ ๊ฐ€์ง„ ๋‚ด์šฉ์„ ์ „๋‹ฌ์ฃผ๋ฉด, ์ ์ ˆํ•œ id๊ฐ’์„ ๋งŒ๋“ค์–ด GqlMember์— ๋งž๋Š” ํ˜•์‹์œผ๋กœ ์ €์žฅ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ƒˆ๋กœ ๋งŒ๋“ค์–ด์ง„ id๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค! ์š”์ฒญ์˜ ๋ชจ์–‘์€ ๋‹ค์Œ๊ณผ ๊ฐ™๊ฒ ์ฅฌ!

mutation {
	addGqlMember(newInput: {
		name: "ryeongE"
		part: WEB
	}) {
		id
	}
}

6-2. โœ๏ธ [UPDATE || DELETE] ์Šคํ„ฐ๋””์› ์ •๋ณด ์ˆ˜์ • ๋˜๋Š” ์‚ญ์ œ

๊ทธ๋Ÿฐ๋ฐ, ๊ฐ‘์ž๊ธฐ ๋‹ค์ด์–ดํŠธ์— ๋Œ์ž…ํ•œ๋‹ค๊ฑฐ๋‚˜, ์†Œ์† ํŒŒํŠธ๋ฅผ ๋ฐ”๊พผ๋‹ค๊ฑฐ๋‚˜ ํ•˜๋Š” ๋“ฑ์˜ ์ผ์ด ์ƒ๊ธด๋‹ค๋ฉด ์ˆ˜์ •์„ ํ•ด์•ผํ•˜๊ณ , ๊ทธํ์—˜ ์–ด๋ ต๋‹ค๊ณ  ์ซ„์•„์„œ ๋„๋ง๊ฐ€๋Š” ์‚ฌ๋žŒ์„ ์œ„ํ•ด ์‚ญ์ œ ๊ธฐ๋Šฅ๋„ ์žˆ์–ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๋งŒ๋“ค์–ด๋ณผ๊นŒ์œ ?

์ˆ˜์ •์„ ์œ„ํ•ด์„œ๋Š” id๊ฐ’์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์‹๋ณ„ํ•˜๊ณ  ์ˆ˜์ •ํ•  ๋‚ด์šฉ์„ ๋‹ด์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ž˜ ์ˆ˜์ •๋˜์—ˆ์Œ์„ ๋ณด์—ฌ์ฃผ๋Š” ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•ด์ฃผ์–ด์•ผํ•ฉ๋‹ˆ๋‹ค.

์‚ญ์ œ๋ฅผ ์œ„ํ•ด์„œ๋Š” id๊ฐ’์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์‹๋ณ„ํ•˜๊ณ  ์‚ญ์ œ ํ›„ ์ž˜ ์‚ญ์ œ๋˜์—ˆ์Œ์„ ์•Œ๋ฆฌ๋Š” ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐ˜ํ™˜ํ•ด์ฃผ์–ด์•ผํ•ฉ๋‹ˆ๋‹ค.

type Mutation {
	addGqlMember(newInput: NewGqlMember): GqlMember,
	updateGqlMember(id: ID!, modified: GqlMember): GqlMember,
	deleteX(id: ID!): String, // ๋„๋ง๊ฐ€๋Š” ์‚ฌ๋žŒ์€ ๋ฉค๋ฒ„๊ฐ€ ์•„๋‹Œ X๋‹ค!!
}

์•„ ํƒ€์ž…์„ ์ด๋ ‡๊ฒŒ ๊ณต๋ถ€ํ•ด์„œ๋Š” ๋ญ”๊ฐ€ ๋ถ•-๋œฌ ๋Š๋‚Œ์ด์ฃ ? ๋‹ค์Œ ๊ธ€(ํด๋ฆญ)์—์„œ ์˜ˆ์‹œ๋ฅผ ๋“ค์–ด์„œ ์ž˜ ์„ค๋ช…ํ•ด์ค„ํ…Œ๋‹ˆ ๊ธฐ๋‹ค๋ฆฌ๋ผ๊ตฟ 0_<โญ


์ฐธ๊ณ 

๊ทธ๋ž˜ํ”„ํ์—˜ ๊ณต์‹๋ฌธ์„œ - ํƒ€์ž… ์‹œ์Šคํ…œํ…์ŠคํŠธ

profile
์›น ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์ž ๋ น์ด์˜ ์–ด์ฉŒ๊ตฌ ์ €์ฉŒ๊ตฌ

0๊ฐœ์˜ ๋Œ“๊ธ€