Skip to content

2dongyeop/springboot-graphql

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

13 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

springboot-graphql

REST API๊ฐ€ ์•„๋‹Œ GraphQL์„ ์ด์šฉํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„ํ•œ ์‹ค์Šต์šฉ ์„œ๋ฒ„์ž…๋‹ˆ๋‹ค.

GraphQL์ด ์ฒ˜์Œ์ด์‹  ๋ถ„๋“ค์ด๋ผ๋ฉด, ์ „์ฒด๋ฅผ ์ฝ์–ด๋ณด์‹œ๊ธธ ์ถ”์ฒœ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

REST API์˜ ๋‹จ์ ์„ ๊ทน๋ณตํ•˜๊ณ ์ž ๋‚˜์˜จ ๋งŒํผ, ๋‚ด์šฉ์„ ํ•™์Šตํ•ด๋ณด๊ณ  ์ €์˜ ๊ฐœ์ธ์ ์ธ ๊ฒฌํ•ด(์ฑ•ํ„ฐ 8)์™€ ๋น„๊ตํ•ด๋ณด์‹œ๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.


์ž์„ธํ•œ ์ด๋ก ์€ ์•„๋ž˜ ๋ธ”๋กœ๊ทธ ๋งํฌ์—์„œ ํ™•์ธํ•˜์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


๋ชฉ์ฐจ

1. GraphQL ์†Œ๊ฐœ

img.png

1-1. GraphQL ์ด๋ž€?

GraphQL์€ API๋ฅผ ์œ„ํ•œ ์ฟผ๋ฆฌ ์–ธ์–ด์ด๋ฉฐ ์ด๋ฏธ ์กด์žฌํ•˜๋Š” ๋ฐ์ดํ„ฐ๋กœ ์ฟผ๋ฆฌ๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•œ ๋Ÿฐํƒ€์ž„ ์ž…๋‹ˆ๋‹ค.

GraphQL ์€ 2015๋…„์— ์˜คํ”ˆ ์†Œ์Šค๋กœ ๊ณต๊ฐœ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๊ธฐ์กด์˜ API ์ ‘๊ทผ ๋ฐฉ์‹์ธ REST๊ฐ€ ๊ฐ€์ง€๋Š” ํ•œ๊ณ„๋ฅผ ๊ทน๋ณตํ•˜๊ธฐ ์œ„ํ•ด ํƒ„์ƒํ–ˆ์œผ๋ฉฐ, ๋ฐ์ดํ„ฐ ์˜ค๋ฒ„ํŒจ์นญ๊ณผ ์—ฌ๋Ÿฌ API ์—”๋“œํฌ์ธํŠธ๋ฅผ ํ†ตํ•œ ๋ณต์žกํ•œ ๋ฐ์ดํ„ฐ ์š”์ฒญ ๊ณผ์ •์„ ๋‹จ์ˆœํ™” ํ•˜๋ ค๋Š” ๋ชฉํ‘œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.


1-2. GraphQL์˜ ๊ธฐ๋ณธ ๊ฐœ๋… ๋ฐ ์ฒ ํ•™

  • GraphQL ์˜ ํ•ต์‹ฌ ์ฒ ํ•™์€ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ •ํ™•ํžˆ, ํ•„์š”ํ•œ ๋งŒํผ๋งŒ ์š”์ฒญํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋Š”๋ฐ์— ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์„œ๋ฒ„๋Š” ํด๋ผ์ด์–ธํŠธ๊ฐ€ GraphQL ๋กœ ์š”์ฒญํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐ์ดํ„ฐ ํƒ€์ž…๊ณผ ๊ฐ ํƒ€์ž…์— ๋Œ€ํ•ด ์š”์ฒญํ•  ์ˆ˜ ์žˆ๋Š” ํ•„๋“œ๋“ค์„ ์ •์˜ํ•ด ํƒ€์ž… ์‹œ์Šคํ…œ์„ ๊ตฌ์ถ•ํ•ฉ๋‹ˆ๋‹ค.
  • ๊ฐ ํƒ€์ž…์˜ ํ•„๋“œ์— ๋Œ€ํ•œ ์š”์ฒญ์„ ํ•ด์„ ๋ฐ ์ฒ˜๋ฆฌํ•˜๋Š” ๋กœ์ง(Ex. DB์— ์ ‘๊ทผ)์€ Resolver ํ•จ์ˆ˜๋กœ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค.

1-3. REST API ์™€์˜ ๋น„๊ต

img.png

REST API ๋Š” ๋ฆฌ์†Œ์Šค ๊ธฐ๋ฐ˜์˜ ์•„ํ‚คํ…์ฒ˜์ž…๋‹ˆ๋‹ค.

  • ๊ฐ ๋ฆฌ์†Œ์Šค(URL ์—”๋“œํฌ์ธํŠธ) ์— ๋Œ€ํ•ด HTTP ๋ฉ”์„œ๋“œ๋ฅผ ์ด์šฉํ•ด CRUD ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ณ , ๊ฐ ๋ฆฌ์†Œ์Šค์— ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๊ทธ์— ๋งž๋Š” URL ์—”๋“œํฌ์ธํŠธ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด API ์˜ ๊ตฌ์กฐ๋ฅผ ๋ช…ํ™•ํ•˜๊ฒŒ ํ•˜๊ณ  ๋ฌธ์„œํ™”๊ฐ€ ์šฉ์ดํ•ด ์‚ฌ์šฉํ•˜๊ธฐ ์‰ฝ์Šต๋‹ˆ๋‹ค.
  • ํ•˜์ง€๋งŒ REST API ๋ฐฉ์‹์€ ๋ฐ์ดํ„ฐ ์š”๊ตฌ๊ฐ€ ๋ณต์žกํ•ด์งˆ ๊ฒฝ์šฐ ์—ฌ๋Ÿฌ ์—”๋“œํฌ์ธํŠธ๋ฅผ ์‚ฌ์šฉํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์ง‘๊ณ„ํ•ด์•ผํ•˜๊ณ , ๋ถˆํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ํŒจ์นญํ•˜๋Š” ์ผ์ด ์ƒ๊ธธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฐ˜๋ฉด GraphQL์€ ๋‹จ์ผ ์—”๋“œํฌ์ธํŠธ๋ฅผ ํ†ตํ•ด ํด๋ผ์ด์–ธํŠธ๊ฐ€ ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ์˜ ํ˜•ํƒœ๋กœ ์š”์ฒญํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


2. GraphQL์˜ ์žฅ์ 

2-1. ๋ฐ์ดํ„ฐ ์˜ค๋ฒ„ํŒจ์นญ ๋ฐ ์–ธ๋”ํŒจ์นญ ๋ฌธ์ œ ํ•ด๊ฒฐ

  • ์˜ค๋ฒ„ํŒจ์นญ : ํด๋ผ์ด์–ธํŠธ๊ฐ€ ํ•„์š”๋กœ ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ณด๋‹ค ๋” ๋งŽ์€ ๋ฐ์ดํ„ฐ๋ฅผ ์š”์ฒญํ•˜๋Š” ๊ฒƒ
  • ์–ธ๋”ํŒจ์นญ : ํด๋ผ์ด์–ธํŠธ๊ฐ€ ํ•„์š”๋กœ ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ณด๋‹ค ๋” ์ ์€ ๋ฐ์ดํ„ฐ๋ฅผ ์š”์ฒญํ•˜๋Š” ๊ฒƒ

3. GraphQL์˜ ๋‹จ์ 

3-1. GraphQL ์‚ฌ์šฉ ์‹œ ํŒŒ์ผ ์—…๋กœ๋“œ ์ž‘์—…์ด ๋ถˆํŽธํ•˜๋‹ค.

  • GraphQL์—์„œ๋Š” ์‚ฌ์ง„์„ ์—…๋กœ๋“œํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ฐ”์ดํŠธ ๋ฐฐ์—ด๋กœ ์ „๋‹ฌํ•ด์•ผ ํ•œ๋‹ค.

  • ๊ฒฐ๊ตญ GraphQL์„ REST API์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ๋‹ค๊ณ ๋Š” ํ•˜์ง€๋งŒ, ๋ถˆํŽธํ•˜๋‹ค.

    type Mutation {
        # ์ด๋ฏธ์ง€ ์—…๋กœ๋“œ๋ฅผ ์œ„ํ•œ ๋ฎคํ…Œ์ด์…˜
        uploadImage(file: UploadInput!): String!
    }
    
    input UploadInput {
        fileName: String!
        contentType: String!
        data: String!   # ๋ฐ”์ดํŠธ ๋ฐฐ์—ด์„ ์ „๋‹ฌ
    }

3-2. ๋ฌธ์„œํ™”์˜ ๋ถˆํŽธํ•จ

  • ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์ž‘์„ฑํ•˜๊ณ ๋‚˜์„œ, schema.graphqls ํŒŒ์ผ์— ๋ฐ˜๋“œ์‹œ ํƒ€์ž…๊ณผ ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•ด์•ผ ํ•œ๋‹ค.
    • ์ด๋•Œ ์ง์ ‘ ํƒ€์ดํ•‘์„ ํ•˜๋Š” ๋ฐฉ์‹์ด๊ธฐ ๋•Œ๋ฌธ์—, ์‹ค์ˆ˜๋ฅผ ๋ถˆ๋Ÿฌ์ผ์œผํ‚ค๊ธฐ ์‰ฝ๋‹ค.
    • ex. ์œ„์— ๋‚˜์˜จ Mutation์— ์„ ์–ธํ•œ uploadImage๋ผ๋Š” ๋ฉ”์„œ๋“œ๋ช…์—์„œ ์˜คํƒ€๊ฐ€ ๋ฐœ์ƒํ•  ๊ฒฝ์šฐ, ์„œ๋ฒ„์—์„œ ๊ตฌํ˜„ํ•œ ๋ฆฌ์กธ๋ฒ„์˜ ๋ฉ”์„œ๋“œ๋ช…๊ณผ ๋‹ฌ๋ผ ํ˜ธ์ถœ์ด ๋˜์ง€ ์•Š๋Š”๋‹ค. โ†’ null ์„ ๋ฆฌํ„ด.. ๋”ฐ๋ผ์„œ ๋””๋ฒ„๊น…ํ•˜๊ธฐ ํž˜๋“ฌ.
  • ๋˜ํ•œ ๋ชจ๋“  ์—”ํ‹ฐํ‹ฐ๋ฅผ ํƒ€์ž…์œผ๋กœ ์ •์˜ํ•˜๊ธฐ์—๋Š” ์–‘์ด ๋„ˆ๋ฌด ๋งŽ์•„ ๋ฌด๋ฆฌ๊ฐ€ ์žˆ๋‹ค.
  • GraphQL์—์„œ ๊ณต์‹์ ์œผ๋กœ ์ง€์›ํ•˜๋Š” API ๋ฌธ์„œํ™” ๋ฐฉ์‹์€ GraphiQL์—์„œ ์ง€์›ํ•˜๋Š” Docs ๊ธฐ๋Šฅ์ด๋‹ค.
    • ๋‹ค๋งŒ, ์ด๋Š” ์ง์ ‘ ํด๋ฆญ์„ ํ•ด์„œ ๋“ค์–ด๊ฐ€์•ผ ๋ณด์ด๋ฉฐ, ์ถ”๊ฐ€์ ์ธ ์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜๋Š” ์—†๋‹ค.

      img.png

3-3. ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์ด ์ž์œ ๋กœ์›Œ์ง์— ์žˆ์–ด์„œ ์ƒ๊ธฐ๋Š” ๋ถ€์ž‘์šฉ

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

4. ์ฃผ์š” ๊ฐœ๋…๊ณผ ํŠน์ง•

4-1. Query & Mutation

  • Query : ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๊ธฐ ์œ„ํ•œ ์š”์ฒญ์ž…๋‹ˆ๋‹ค.
    • GraphQL ์„ ์‚ฌ์šฉํ•˜๋ฉด ํด๋ผ์ด์–ธํŠธ๋Š” ์„œ๋ฒ„์—๊ฒŒ ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ์˜ ๊ตฌ์กฐ๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ์š”์ฒญํ•˜๋ฉฐ, ์„œ๋ฒ„๋Š” ํ•ด๋‹น ๊ตฌ์กฐ์— ๋งž๊ฒŒ ๋ฐ์ดํ„ฐ๋ฅผ ์‘๋‹ตํ•ฉ๋‹ˆ๋‹ค.
    • HTTP ๋ฉ”์„œ๋“œ ์ค‘ GET์— ํ•ด๋‹นํ•ฉ๋‹ˆ๋‹ค.
  • Mutation : ๋ฐ์ดํ„ฐ๋ฅผ ์ƒ์„ฑ, ์ˆ˜์ •, ์‚ญ์ œํ•˜๊ธฐ ์œ„ํ•œ ์š”์ฒญ์ž…๋‹ˆ๋‹ค.
    • ์ฟผ๋ฆฌ์™€ ์œ ์‚ฌํ•œ ๋ฌธ๋ฒ•์„ ์‚ฌ์šฉํ•˜์ง€๋งŒ, ์„œ๋ฒ„์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€ํ˜•์‹œํ‚ฌ ๋•Œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
    • HTTP ๋ฉ”์„œ๋“œ ์ค‘ POST, PUT, PATCH, DELETE ๋ฉ”์„œ๋“œ์— ํ•ด๋‹นํ•ฉ๋‹ˆ๋‹ค.

4-2. Schema & Type System

  • Schema
    • GraphQL์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐ์ดํ„ฐ์˜ ์ข…๋ฅ˜์™€ ๊ทธ ๊ด€๊ณ„๋ฅผ ์ •์˜ํ•˜๋Š” ๋ฌธ์„œ์ž…๋‹ˆ๋‹ค.
    • ์Šคํ‚ค๋งˆ๋Š” ์„œ๋ฒ„์—์„œ ์ง€์›ํ•˜๋Š” ์ฟผ๋ฆฌ, ๋ฎคํ…Œ์ด์…˜, ๊ฐ์ฒด ํƒ€์ž…๋“ฑ์„ ๋ช…์‹œํ•ฉ๋‹ˆ๋‹ค.
    • Spring Boot์˜ ๊ฒฝ์šฐ, resources/graphql/schema.graphqls ๋กœ ์ž‘์„ฑํ•˜๊ณค ํ•ฉ๋‹ˆ๋‹ค.
  • Type System
    • GraphQL ์€ ๊ฐ•๋ ฅํ•œ ํƒ€์ž… ์‹œ์Šคํ…œ์„ ์‚ฌ์šฉํ•ด API ๋ฅผ ์ฃผ๊ณ ๋ฐ›์„ ๋ฐ์ดํ„ฐ ํ˜•ํƒœ๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.
    • ์ด ์‹œ์Šคํ…œ์€ API๋ฅผ ๋” ์•ˆ์ •์ ์œผ๋กœ ๋งŒ๋“ค๊ณ , ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„๊ฐ„์˜ ๋ช…ํ™•ํ•œ ์•ฝ์†์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.
  • Spring Boot์˜ ๊ฒฝ์šฐ, ์•„๋ž˜์™€ ๊ฐ™์ด ์Šคํ‚ค๋งˆ ํŒŒ์ผ ์•ˆ์— ํƒ€์ž…์„ ๋ช…์‹œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ์ด๋•Œ, viewAllPost ์™€ ๊ฐ™์€ ๋ช…์นญ์€ ๋ฆฌ์กธ๋ฒ„์˜ ๋ฉ”์„œ๋“œ๋ช…๊ณผ ๋ฐ˜๋“œ์‹œ ๋™์ผํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
    • ์ผ์น˜ํ•˜์ง€ ์•Š์„ ๊ฒฝ์šฐ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€๋Š” ์•Š์ง€๋งŒ, ๋ฆฌ์กธ๋ฒ„๋ฅผ ํ˜ธ์ถœํ•˜์ง€ ๋ชปํ•ด null์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
    # schema.graphqls
    ### Query ์ •์˜ (GET ์—ญํ• )
    type Query {
      viewAllPost: [Post]
      getCommentsByPostId(postId: ID): [Comment]
    }
    
    ### Mutation ์ •์˜ (POST, PUT, PATCH, DELETE ์—ญํ• )
    type Mutation {
      viewPost(postId: ID): Post
      savePost(request: RequestPost!): Post
      saveComment(postId: ID, request: RequestComment!): Comment
    }
    
    type Post {
      id: ID
      title: String
      content: String
      views: String
      author: User
      comments: [Comment]
    }

4-3. ๊ตฌ๋…์œผ๋กœ ์‹ค์‹œ๊ฐ„ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ

  • ๊ตฌ๋… : ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›๊ธฐ ์œ„ํ•œ ๋ฉ”์ปค๋‹ˆ์ฆ˜ ์ž…๋‹ˆ๋‹ค.
    • query์™€ mutation๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋งˆ์ง€๋ง‰ operation type์ž…๋‹ˆ๋‹ค.
    • GraphQL Subscription์€ WebSocket์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ตฌํ˜„๋˜์–ด, ์„œ๋ฒ„๊ฐ€ ๊ตฌ๋…์ค‘์ธ ํด๋ผ์ด์–ธํŠธ์™€ ์ง€์†์ ์ธ ์—ฐ๊ฒฐ์„ ์œ ์ง€
  • ์‹ค์‹œ๊ฐ„ ์ฑ„ํŒ…, ์•Œ๋ฆผ ์‹œ์Šคํ…œ ๋“ฑ ์‹ค์‹œ๊ฐ„ ๋ฐ์ดํ„ฐ ์—…๋ฐ์ดํŠธ๊ฐ€ ํ•„์š”ํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ตฌํ˜„ํ•˜๊ธฐ ์šฉ์ดํ•ฉ๋‹ˆ๋‹ค.

4-4. ํ•˜๋‚˜์˜ ์—”๋“œํฌ์ธํŠธ

  • GraphQL์€ ๋ชจ๋“  ์ฟผ๋ฆฌ์™€ ๋ฎคํ…Œ์ด์…˜, ๊ตฌ๋… ์š”์ฒญ์„ ๋‹จ์ผ ์—”๋“œํฌ์ธํŠธ๋ฅผ ํ†ตํ•ด ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
  • ์ด ์ ‘๊ทผ ๋ฐฉ์‹์€ API์˜ ๊ตฌ์กฐ๋ฅผ ๋‹จ์ˆœํ™”ํ•˜๋ฉฐ, ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์—ฌ๋Ÿฌ ์—”๋“œํฌ์ธํŠธ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๋ณต์žก์„ฑ์„ ์ค„์—ฌ์ค๋‹ˆ๋‹ค.

6. Spring Boot with GraphQL

6-1. GraphiQL๋กœ ๊ฒฐ๊ณผ ํ™•์ธํ•˜๊ธฐ

GraphQL์€ ์ฟผ๋ฆฌ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋„๋ก GraphiQL์ด๋ผ๋Š” GUI๋ฅผ ์ œ๊ณตํ•œ๋‹ค.

  • http://54.180.90.48:8888/graphiql

  • Spring Boot์˜ ๊ฒฝ์šฐ, application.yml์— ์•„๋ž˜์™€ ๊ฐ™์ด ์ž‘์„ฑํ•  ๊ฒฝ์šฐ GraphiQL์„ ํ™œ์„ฑํ™”์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.

    spring:
      graphql:
        graphiql:
          enabled: true   # default : false
          path: /graphiql # default : /graphiql

    img.png

6-2. ์‹ค์Šต์šฉ ์ฟผ๋ฆฌ ๋ฐ ๋ฎคํ…Œ์ด์…˜

  • ์ „์ฒด ๊ฒŒ์‹œ๊ธ€ ์กฐํšŒ : query

    query {
      viewAllPost {
        id
        title
        content
        author {
          id
          name
        }
      }
    }
  • ํŠน์ • ๊ฒŒ์‹œ๊ธ€ ์กฐํšŒ : mutation

    mutation {
      viewPost(postId: 1) {
        id
        title
        content
        author {
          id
          name
        }
        comments {
          id
          content
          writer {
            id
            name
          }
        }
      }
    }
  • ๊ฒŒ์‹œ๊ธ€ ์ž‘์„ฑ : mutation

    mutation {
      savePost(request: {title: "hi title", content: "hi content"}) {
        title
        content
      }
    }
  • ๋Œ“๊ธ€ ์ €์žฅ : mutation

    mutation {
      saveComment(postId: 1, request: {content: "hi content"}) {
        id
        content
      }
    }
  • ํŠน์ • ๊ฒŒ์‹œ๊ธ€์˜ ๋Œ“๊ธ€ ๋ชฉ๋ก : query

    query {
      getCommentsByPostId(postId: 1) {
        id
        content
        writer {
          id
          name
        }
      }
    }

8. GraphQL์— ๋Œ€ํ•œ ๊ฐœ์ธ์ ์ธ ๊ฒฌํ•ด

๊ฒฐ๋ก ์ ์œผ๋กœ ์•„๋ž˜์™€ ๊ฐ™์€ ์ด์œ ๋กœ GraphQL์ด REST API๋ฅผ ๋Œ€์ฒดํ•˜๊ธฐ์—๋Š” ๋ฌด๋ฆฌ๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐ์ด ๋“ญ๋‹ˆ๋‹ค.

8-1. ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ž์œ ๋กญ๊ฒŒ ์ฟผ๋ฆฌ๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๋„๋ก ์—ด์–ด์คŒ์œผ๋กœ์จ ๋ถ€์ž‘์šฉ์ด ๋ฐœ์ƒ

  • ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์š”์ฒญ์„ ๋ถˆํ•„์š”ํ•˜๊ฒŒ ๋ฌด๊ฑฐ์šด ์ฟผ๋ฆฌ๋ฅผ ๋ณด๋ƒ„์œผ๋กœ์จ ์„œ๋ฒ„์— ๋ถ€๋‹ด์ด ๊ฐ€ํ•ด์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

8-2. ๋งˆ์ดํฌ๋กœ ์„œ๋น„์Šค(MSA)์—์„œ์˜ ๋ณต์žก์„ฑ ์ฆ๊ฐ€

  • ๋ฐฑ์—”๋“œ ์„œ๋ฒ„๊ฐ€ MSA์ธ ๊ฒฝ์šฐ ํด๋ผ์ด์–ธํŠธ์—์„œ ๊ฐ ์„œ๋น„์Šค์— API ์š”์ฒญ์„ ๊ฐ๊ฐ ๋ณด๋‚ด์•ผ ํ•ด์„œ ๋˜๋‹ค์‹œ ์–ธ๋”ํŽ˜์นญ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
  • ์–ธ๋”ํŽ˜์นญ์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋ณต์žก์„ฑ์„ ๊ฐ์ˆ˜ํ•˜๋ฉฐ GraphQL์„ ์ฑ„ํƒํ–ˆ๋Š”๋ฐ, ๋‹ค์‹œ ์–ธ๋”ํŽ˜์นญ์ด ๋ฐœ์ƒํ•œ๋‹ค๋ฉด ๊ฒฐ๊ตญ ๋ณต์žกํ•˜๋‹ค๋Š” ๋‹จ์ ๋งŒ ๋‚จ๊ฒŒ ๋œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

8-3. ํ•˜๋‚˜์˜ ์—”๋“œํฌ์ธํŠธ

  • ๊ธฐ๋Šฅ๋ณ„๋กœ ์ง€์—ฐ์‹œ๊ฐ„(letency)๋‚˜ ์—๋Ÿฌ์œจ ๋“ฑ์„ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๊ธฐ ์–ด๋ ค์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

8-4. HTTP ์ƒํƒœ ์ฝ”๋“œ์˜ ๋ชจํ˜ธํ•จ

  • express-graphql์—์„œ๋Š” ์š”์ฒญํ•œ ๋ฐ์ดํ„ฐ๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ ์ƒํƒœ์ฝ”๋“œ 500์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
  • Apollo Server๋Š” ์ˆœ ์—๋Ÿฌ์ธ ๊ฒฝ์šฐ์—๋„ 200์„ ๋ฐ˜ํ™˜ ํ•ฉ๋‹ˆ๋‹ค.
  • spring-graphql์—์„œ๋„ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒ์‹œ, ์ƒํƒœ ์ฝ”๋“œ๊ฐ€ 200์œผ๋กœ ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค. img.png

9. ์ฐธ๊ณ ์ž๋ฃŒ

About

Spring Boot With GraphQL, Not REST API

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages