introduce

1. GraphQL ์†Œ๊ฐœ

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

GraphQL์˜ ์ฃผ์š” ํŠน์ง•

GraphQL์˜ ๊ฐ•์ ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ•ต์‹ฌ์ ์ธ ํŠน์ง•์—์„œ ๋น„๋กฏ๋ฉ๋‹ˆ๋‹ค:

  • ๋‹จ์ผ ์—”๋“œํฌ์ธํŠธ: REST API๋Š” ์ž์›๋ณ„๋กœ ์—”๋“œํฌ์ธํŠธ๋ฅผ ๋งŒ๋“ค์–ด์•ผ ํ•˜์ง€๋งŒ, GraphQL์€ /graphql ๊ฐ™์€ ๋‹จ์ผ ์—”๋“œํฌ์ธํŠธ๋ฅผ ํ†ตํ•ด ๋ชจ๋“  ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์—ฌ๋Ÿฌ ์—”๋“œํฌ์ธํŠธ๋ฅผ ๊ด€๋ฆฌํ•  ํ•„์š”๊ฐ€ ์—†์–ด API ๊ด€๋ฆฌ๊ฐ€ ๊ฐ„ํŽธํ•ด์ง‘๋‹ˆ๋‹ค.

  • ๊ฐ•๋ ฅํ•œ ํƒ€์ž… ์‹œ์Šคํ…œ: GraphQL์€ ์Šคํ‚ค๋งˆ๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ์˜ ๊ตฌ์กฐ๋ฅผ ๋ช…ํ™•ํžˆ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. ์ด ์Šคํ‚ค๋งˆ๋Š” ์ฟผ๋ฆฌ(Query), ๋ฎคํ…Œ์ด์…˜(Mutation), ๊ตฌ๋…(Subscription) ๋“ฑ์˜ ํƒ€์ž…์„ ํฌํ•จํ•˜๋ฉฐ, ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„ ๊ฐ„์˜ ์†Œํ†ต์ด ๋” ์•ˆ์ „ํ•˜๊ณ  ์˜ˆ์ธก ๊ฐ€๋Šฅํ•ด์ง‘๋‹ˆ๋‹ค.

  • ์ž์ฒด ๋ฌธ์„œํ™”: GraphQL ์Šคํ‚ค๋งˆ๋Š” API์˜ ๋ฌธ์„œ ์—ญํ• ์„ ํ•˜๋ฏ€๋กœ, ๋ณ„๋„์˜ ๋ฌธ์„œ ์ž‘์—… ์—†์ด๋„ API์˜ ๊ธฐ๋Šฅ์„ ์‰ฝ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๊ฐœ๋ฐœ ํŒ€ ๊ฐ„์˜ ํ˜‘์—…์„ ์›ํ™œํ•˜๊ฒŒ ํ•˜๊ณ , API ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ฆ‰์‹œ ๋ฐ˜์˜ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค.

  • ํด๋ผ์ด์–ธํŠธ ์ฃผ๋„ ๊ฐœ๋ฐœ: GraphQL์€ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ •ํ™•ํžˆ ์š”์ฒญํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค. ์ฆ‰, ์˜ค๋ฒ„ํŽ˜์นญ์ด๋‚˜ ์–ธ๋”ํŽ˜์นญ(under-fetching) ๋ฌธ์ œ๋ฅผ ํ”ผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ํŠน์ง• ๋•๋ถ„์— GraphQL์€ ๋ชจ๋ฐ”์ผ ์•ฑ, ์›น ํ”„๋ก ํŠธ์—”๋“œ, ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค ์•„ํ‚คํ…์ฒ˜ ๋“ฑ ๋‹ค์–‘ํ•œ ํ™˜๊ฒฝ์—์„œ ์ ์  ๋” ๋งŽ์ด ์‚ฌ์šฉ๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.


2. GraphQL ์ž‘๋™ ์›๋ฆฌ

GraphQL์ด ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๋Š”์ง€ ์ดํ•ดํ•˜๋Š” ๊ฒƒ์€ GraphQL์„ ํšจ๊ณผ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๋ฐ ํ•„์ˆ˜์ ์ž…๋‹ˆ๋‹ค. GraphQL์€ ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„ ๊ฐ„์˜ ํ˜‘์—…์„ ํšจ์œจ์ ์œผ๋กœ ๋งŒ๋“œ๋Š” ๋ช‡ ๊ฐ€์ง€ ํ•ต์‹ฌ ๋‹จ๊ณ„๋ฅผ ๊ฑฐ์นฉ๋‹ˆ๋‹ค.

2.1. ์Šคํ‚ค๋งˆ ์ •์˜

GraphQL์˜ ๋ชจ๋“  ๊ฒƒ์€ ์Šคํ‚ค๋งˆ์—์„œ ์‹œ์ž‘๋ฉ๋‹ˆ๋‹ค. ์Šคํ‚ค๋งˆ๋Š” API์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ฐ์ดํ„ฐ์˜ ๊ตฌ์กฐ๋ฅผ ์ •์˜ํ•˜๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค. ์Šคํ‚ค๋งˆ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์š”์†Œ๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค:

  • ํƒ€์ž…(Type): ๋ฐ์ดํ„ฐ์˜ ์ข…๋ฅ˜๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, User ํƒ€์ž…์€ ์‚ฌ์šฉ์ž์˜ ์ด๋ฆ„, ์ด๋ฉ”์ผ ๋“ฑ์˜ ํ•„๋“œ๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์ฟผ๋ฆฌ(Query): ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ๋ฐ์ดํ„ฐ๋ฅผ ์š”์ฒญํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, users ์ฟผ๋ฆฌ๋Š” ๋ชจ๋“  ์‚ฌ์šฉ์ž์˜ ๋ชฉ๋ก์„ ๊ฐ€์ ธ์˜ค๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.

  • ๋ฎคํ…Œ์ด์…˜(Mutation): ๋ฐ์ดํ„ฐ๋ฅผ ์ƒ์„ฑ, ์ˆ˜์ •, ์‚ญ์ œํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, createUser ๋ฎคํ…Œ์ด์…˜์€ ์ƒˆ๋กœ์šด ์‚ฌ์šฉ์ž๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

  • ๊ตฌ๋…(Subscription): ์‹ค์‹œ๊ฐ„ ๋ฐ์ดํ„ฐ๋ฅผ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ํ‘ธ์‹œํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์ฑ„ํŒ… ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์ƒˆ ๋ฉ”์‹œ์ง€๊ฐ€ ๋„์ฐฉํ•  ๋•Œ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์•Œ๋ฆผ์„ ๋ณด๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์Šคํ‚ค๋งˆ๋Š” GraphQL SDL(Schema Definition Language)์ด๋ผ๋Š” ์–ธ์–ด๋กœ ์ž‘์„ฑ๋˜๋ฉฐ, ์ด๋ฅผ ํ†ตํ•ด ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„๊ฐ€ ์„œ๋กœ ์–ด๋–ค ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ ๋ฐ›์„ ์ˆ˜ ์žˆ๋Š”์ง€ ๋ช…ํ™•ํžˆ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

2.2. ์ฟผ๋ฆฌ ์š”์ฒญ

ํด๋ผ์ด์–ธํŠธ๋Š” ์ž์‹ ์ด ์›ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๊ตฌ์ฒด์ ์œผ๋กœ ์š”์ฒญํ•˜๋Š” ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•ด ์„œ๋ฒ„๋กœ ๋ณด๋ƒ…๋‹ˆ๋‹ค. ์ฟผ๋ฆฌ๋Š” GraphQL์˜ ํ•ต์‹ฌ ๊ธฐ๋Šฅ ์ค‘ ํ•˜๋‚˜๋กœ, ํด๋ผ์ด์–ธํŠธ๊ฐ€ ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ์˜ ๊ตฌ์กฐ๋ฅผ ์ •ํ™•ํžˆ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ฟผ๋ฆฌ๋ฅผ ์ƒ๊ฐํ•ด ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

{
  user(id: 1) {
    name
    email
  }
}

์ด ์ฟผ๋ฆฌ๋Š” "ID๊ฐ€ 1์ธ ์‚ฌ์šฉ์ž์˜ ์ด๋ฆ„๊ณผ ์ด๋ฉ”์ผ๋งŒ ๊ฐ€์ ธ์™€"๋ผ๋Š” ๋œป์ž…๋‹ˆ๋‹ค. REST API์—์„œ๋Š” ์‚ฌ์šฉ์ž์˜ ๋ชจ๋“  ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ์—”๋“œํฌ์ธํŠธ๋ฅผ ํ˜ธ์ถœํ•œ ๋’ค ํ•„์š”ํ•œ ํ•„๋“œ๋งŒ ๊ณจ๋ผ๋‚ด์•ผ ํ–ˆ์ง€๋งŒ, GraphQL์—์„œ๋Š” ์„œ๋ฒ„๊ฐ€ ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์— ๋งž์ถฐ ์ •ํ™•ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

2.3. ๋ฆฌ์กธ๋ฒ„ ํ•จ์ˆ˜ ์‹คํ–‰

์„œ๋ฒ„๋Š” ํด๋ผ์ด์–ธํŠธ์˜ ์ฟผ๋ฆฌ๋ฅผ ๋ฐ›์œผ๋ฉด, ์ด๋ฅผ ๋ถ„์„ํ•ด ํ•ด๋‹น ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๊ธฐ ์œ„ํ•ด ๋ฆฌ์กธ๋ฒ„(resolver) ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋ฆฌ์กธ๋ฒ„๋Š” ์Šคํ‚ค๋งˆ์— ์ •์˜๋œ ๊ฐ ํ•„๋“œ์— ๋Œ€ํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๋กœ์ง์„ ๋‹ด๋‹นํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, user ์ฟผ๋ฆฌ์˜ ๋ฆฌ์กธ๋ฒ„๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ํ•ด๋‹น ID์˜ ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ์กฐํšŒํ•˜๊ณ , name๊ณผ email ํ•„๋“œ๋ฅผ ์ถ”์ถœํ•ด ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

2.4. ์‘๋‹ต ๋ฐ˜ํ™˜

๋งˆ์ง€๋ง‰์œผ๋กœ, ์„œ๋ฒ„๋Š” ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์š”์ฒญํ•œ ๊ตฌ์กฐ์— ๋งž์ถฐ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์‘๋‹ต์€ JSON ํ˜•์‹์œผ๋กœ ์ œ๊ณต๋˜๋ฉฐ, ์ฟผ๋ฆฌ์—์„œ ์š”์ฒญํ•œ ํ•„๋“œ๋งŒ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์œ„์˜ ์ฟผ๋ฆฌ์— ๋Œ€ํ•œ ์‘๋‹ต์€ ๋‹ค์Œ๊ณผ ๊ฐ™์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

{
  "data": {
    "user": {
      "name": "John Doe",
      "email": "john@example.com"
    }
  }
}

์ด์ฒ˜๋Ÿผ GraphQL์€ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ํ•„์š”๋กœ ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋งŒ ์ •ํ™•ํžˆ ๋ฐ˜ํ™˜ํ•˜๋ฏ€๋กœ, ๋„คํŠธ์›Œํฌ ๋Œ€์—ญํญ์„ ์ ˆ์•ฝํ•˜๊ณ  ํด๋ผ์ด์–ธํŠธ์˜ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ๋กœ์ง์„ ๊ฐ„์†Œํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


3. ์ฝ”ํ‹€๋ฆฐ์„ ์‚ฌ์šฉํ•œ GraphQL ์ƒ˜ํ”Œ ์„ค์น˜๋ฒ•

์ด์ œ ์ด๋ก ์—์„œ ๋ฒ—์–ด๋‚˜, ์‹ค์ œ๋กœ ์ฝ”ํ‹€๋ฆฐ๊ณผ Spring Boot๋ฅผ ํ™œ์šฉํ•ด ๊ฐ„๋‹จํ•œ GraphQL ์„œ๋ฒ„๋ฅผ ๋งŒ๋“ค์–ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ฝ”ํ‹€๋ฆฐ์€ ๊ฐ„๊ฒฐํ•˜๊ณ  ์•ˆ์ „ํ•œ ๋ฌธ๋ฒ•์„ ์ œ๊ณตํ•˜๋Š” JVM ๊ธฐ๋ฐ˜ ์–ธ์–ด๋กœ, GraphQL ์„œ๋ฒ„ ๊ฐœ๋ฐœ์— ๋งค์šฐ ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค. ์•„๋ž˜๋Š” ๋‹จ๊ณ„๋ณ„ ์„ค์น˜๋ฒ•์ž…๋‹ˆ๋‹ค.

3.1. ์‚ฌ์ „ ์ค€๋น„

GraphQL ์„œ๋ฒ„๋ฅผ ๊ตฌ์ถ•ํ•˜๊ธฐ ์ „์— ๋ช‡ ๊ฐ€์ง€ ๋„๊ตฌ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค:

  • JDK 11 ์ด์ƒ: Java Development Kit์ด ์„ค์น˜๋˜์–ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • IDE: IntelliJ IDEA๋ฅผ ์ถ”์ฒœํ•˜์ง€๋งŒ, Eclipse๋‚˜ VS Code ๋“ฑ ๋‹ค๋ฅธ IDE๋ฅผ ์‚ฌ์šฉํ•ด๋„ ๋ฌด๋ฐฉํ•ฉ๋‹ˆ๋‹ค.

  • ๋นŒ๋“œ ๋„๊ตฌ: Gradle์ด๋‚˜ Maven ์ค‘ ํ•˜๋‚˜๋ฅผ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค. ์ด ์˜ˆ์ œ์—์„œ๋Š” Gradle์„ ์‚ฌ์šฉํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

3.2. ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ

3.3. GraphQL ์˜์กด์„ฑ ์ถ”๊ฐ€

build.gradle.kts ํŒŒ์ผ์— GraphQL ๊ด€๋ จ ์˜์กด์„ฑ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

dependencies {
    implementation("org.springframework.boot:spring-boot-starter-web")
    implementation("com.graphql-java:graphql-spring-boot-starter:5.0.2")
    implementation("com.graphql-java:graphql-java-tools:5.2.4")
}

์˜์กด์„ฑ์„ ์ถ”๊ฐ€ํ•œ ํ›„, Gradle์„ ํ†ตํ•ด ํ”„๋กœ์ ํŠธ๋ฅผ ๋ฆฌํ”„๋ ˆ์‹œํ•˜์—ฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋‹ค์šด๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค.

3.4. ์Šคํ‚ค๋งˆ ์ •์˜

src/main/resources ํด๋”์— schema.graphqls ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๊ณ , ๋‹ค์Œ ๋‚ด์šฉ์„ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค:

type Query {
    hello: String
}

์ด ์Šคํ‚ค๋งˆ๋Š” "hello"๋ผ๋Š” ์ฟผ๋ฆฌ๋ฅผ ์š”์ฒญํ•˜๋ฉด ๋ฌธ์ž์—ด์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

3.5. ๋ฆฌ์กธ๋ฒ„ ๊ตฌํ˜„

src/main/kotlin/com/example/graphql_demo ํด๋”์— QueryResolver.kt ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๊ณ , ๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค:

package com.example.graphql_demo

import com.coxautodev.graphql.tools.GraphQLQueryResolver
import org.springframework.stereotype.Component

@Component
class QueryResolver : GraphQLQueryResolver {
    fun hello(): String {
        return "Hello, GraphQL!"
    }
}

์ด ์ฝ”๋“œ๋Š” hello ์ฟผ๋ฆฌ์— ๋Œ€์‘ํ•˜๋Š” ๋ฆฌ์กธ๋ฒ„๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

3.6. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‹คํ–‰

src/main/kotlin/com/example/graphql_demo/Application.kt ํŒŒ์ผ์„ ์—ด๊ณ , ์„œ๋ฒ„๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. IDE์—์„œ "Run" ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๊ฑฐ๋‚˜, ํ„ฐ๋ฏธ๋„์—์„œ ./gradlew bootRun ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜์„ธ์š”.

3.7. ์ฟผ๋ฆฌ ํ…Œ์ŠคํŠธ

๋ธŒ๋ผ์šฐ์ €์—์„œ http://localhost:8080/graphiql์— ์ ‘์†ํ•ด ๋‹ค์Œ ์ฟผ๋ฆฌ๋ฅผ ํ…Œ์ŠคํŠธํ•ฉ๋‹ˆ๋‹ค:

{
    hello
}

์‘๋‹ต์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

{
    "data": {
        "hello": "Hello, GraphQL!"
    }
}

Last updated