GraphQL๊ณผ Apollo ๋„ค๋ฒˆ์งธ ์ด์•ผ๊ธฐ - Apollo๋ž€?

2023. 11. 17. 14:10ใ†Back-End ์ž‘์—…์‹ค/๊ธฐํƒ€ ์ฐธ๊ณ  ์ž๋ฃŒ

728x90
๋ฐ˜์‘ํ˜•

 

 

 

์นด์นด์˜คํŽ˜์ด | ๋งˆ์Œ ๋†“๊ณ  ๊ธˆ์œตํ•˜๋‹ค

์—ฌ๊ธฐ๋ฅผ ๋ˆŒ๋Ÿฌ ๋งํฌ๋ฅผ ํ™•์ธํ•˜์„ธ์š”.

qr.kakaopay.com

 

 

 

GraphQL๊ณผ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋กœ ๊ฐœ๋ฐœํ•˜๋Š” ์›น ์„œ๋น„์Šค:์„ค๊ณ„๋ถ€ํ„ฐ ๊ฐœ๋ฐœ·๋ฐฐํฌ๊นŒ์ง€ ๋”ฐ๋ผ ํ•˜๋ฉฐ ์™„์„ฑํ•˜๋Š” ์›น ํ’€

COUPANG

www.coupang.com

"์ด ํฌ์ŠคํŒ…์€ ์ฟ ํŒก ํŒŒํŠธ๋„ˆ์Šค ํ™œ๋™์˜ ์ผํ™˜์œผ๋กœ, ์ด์— ๋”ฐ๋ฅธ ์ผ์ •์•ก์˜ ์ˆ˜์ˆ˜๋ฃŒ๋ฅผ ์ œ๊ณต๋ฐ›์Šต๋‹ˆ๋‹ค."

 




๐Ÿ—‚ ๋ชฉ์ฐจ

โœ… GraphQL๊ณผ Apollo ์ฒซ๋ฒˆ์งธ ์ด์•ผ๊ธฐ - ๊ฐœ๋… ์ตํžˆ๊ธฐ
โœ… GraphQL๊ณผ Apollo ๋‘๋ฒˆ์งธ ์ด์•ผ๊ธฐ - REST API๋ž€?
โœ… GraphQL๊ณผ Apollo ์„ธ๋ฒˆ์งธ ์ด์•ผ๊ธฐ - GraphQL์˜ ์ •๋ณด ์ฃผ๊ณ  ๋ฐ›๋Š” ๋ฐฉ์‹

โœ… GraphQL๊ณผ Apollo ๋„ค๋ฒˆ์งธ ์ด์•ผ๊ธฐ - Apollo๋ž€?
โœ… GraphQL๊ณผ Apollo ๋‹ค์„ฏ๋ฒˆ์งธ ์ด์•ผ๊ธฐ - GraphQL์„ ๊ฐ„๋‹จํ•˜๊ฒŒ ๊ตฌํ˜„ํ•ด ๋ณด์•„์š” ๐Ÿ˜€
โœ… GraphQL๊ณผ Apollo ์—ฌ์„ฏ๋ฒˆ์งธ ์ด์•ผ๊ธฐ - GraphQL Moduleํ™”์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์•„์š” ๐Ÿ˜€
โœ… GraphQL๊ณผ Apollo ์ผ๊ณฑ๋ฒˆ์งธ ์ด์•ผ๊ธฐ - GraphQL Data Type์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์•„์š” ๐Ÿ˜€
โœ… GraphQL๊ณผ Apollo ์—ฌ๋Ÿ๋ฒˆ์งธ ์ด์•ผ๊ธฐ - GraphQL Union๊ณผ Interface ๊ทธ๋ฆฌ๊ณ  ์ธ์ž์™€ ์ธํ’‹ ํƒ€์ž…์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์•„์š” ๐Ÿ˜€
โœ… GraphQL๊ณผ Apollo ์•„ํ™‰๋ฒˆ์งธ ์ด์•ผ๊ธฐ - Java + Spring Boot์—์„œ GraphQL ์‚ฌ์šฉํ•ด ๋ณด๊ธฐ - ์‹ค์Šต ํ™˜๊ฒฝ ๊ตฌ์„ฑ
โœ… GraphQL๊ณผ Apollo ์—ด๋ฒˆ์งธ ์ด์•ผ๊ธฐ - Java + Spring Boot์—์„œ GraphQL ์‚ฌ์šฉํ•ด ๋ณด๊ธฐ - ์‹ค์Šต ํ•ด๋ณด๊ธฐ
โœ… GraphQL๊ณผ Apollo ์—ด ํ•œ๋ฒˆ์งธ ์ด์•ผ๊ธฐ - TypeScript + Nest.js์—์„œ GraphQL ์‚ฌ์šฉํ•ด ๋ณด๊ธฐ - ์‹ค์Šต ํ™˜๊ฒฝ ๊ตฌ์„ฑ
โœ… 
GraphQL๊ณผ Apollo ์—ด ๋‘๋ฒˆ์งธ ์ด์•ผ๊ธฐ - TypeScript + Nest.js์—์„œ GraphQL ์‚ฌ์šฉํ•ด ๋ณด๊ธฐ - ์‹ค์Šต ํ™˜๊ฒฝ ํ…Œ์ŠคํŠธ
โœ… GraphQL๊ณผ Apollo ์—ด ์„ธ๋ฒˆ์งธ ์ด์•ผ๊ธฐ - TypeScript + Nest์—์„œ GraphQL ์‚ฌ์šฉํ•ด ๋ณด๊ธฐ - ์‹ค์Šต ํ•ด๋ณด๊ธฐ
โœ… 
GraphQL๊ณผ Apollo ์—ด ๋„ค๋ฒˆ์งธ ์ด์•ผ๊ธฐ - React์™€ Apollo Client
โœ… GraphQL๊ณผ Apollo ์—ด๋‹ค์„ฏ๋ฒˆ์งธ ์ด์•ผ๊ธฐ - React์™€ Apollo Client - Query์™€ Mutation ์‚ฌ์šฉํ•˜์—ฌ ์›น ํŽ˜์ด์ง€ ๋งŒ๋“ค๊ธฐ
โœ… GraphQL๊ณผ Apollo ์—ด ์—ฌ์„ฏ๋ฒˆ์งธ ์ด์•ผ๊ธฐ - Kotlin + Spring Boot์—์„œ GraphQL ์‚ฌ์šฉํ•ด ๋ณด๊ธฐ - ์‹ค์Šต ํ™˜๊ฒฝ ๊ตฌ์„ฑ
โœ… GraphQL๊ณผ Apollo ์—ด ์ผ๊ณฑ๋ฒˆ์งธ ์ด์•ผ๊ธฐ - Kotlin + Spring Boot์—์„œ GraphQL ์‚ฌ์šฉํ•ด ๋ณด๊ธฐ - ์‹ค์Šต ํ•ด๋ณด๊ธฐ


๐Ÿค” ๋‚ด๊ฐ€ ๋งŒ๋‚œ ๋ฌธ์ œ

โš ๏ธ [Nest.js] TypeORM Table ๊ด€๊ณ„๊ฐ€ ๋งบ์–ด์กŒ์„ ๋•Œ, Seeding (feat. Migration)
โš ๏ธ [Spring Boot 3.0] Could not resolve org.springframework.boot:spring-boot-gradle-plugin
โš ๏ธ [Spring Boot 3] Spring Doc(Swagger) White Label Error


๐Ÿ“‹ ๋ถ€๋ก

๐Ÿ” [Nest.js] ์ดˆ๊ธฐ ํ™˜๊ฒฝ ๊ตฌ์„ฑ (feat. TypeORM, QueryBuilder, GraphQL, Apollo)
๐Ÿ” [SOLID][Nest.js][Java + Spring] Interface๋ฅผ ํ™œ์šฉํ•œ ๊ฒฐํ•ฉ๋„ ๋ถ„๋ฆฌ (Interface๋ฅผ ์ด์šฉํ•œ Dependency Injection - DI)

 

 

 

 

๐Ÿš€ GraphQL๊ณผ Apollo ๋„ค๋ฒˆ์งธ ์ด์•ผ๊ธฐ

    ๐Ÿ”ฝ Apollo๋ž€?

        ๐Ÿ“ฆ ๊ฐœ์š”

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

GraphQL์„ ๊ตฌํ˜„ํ•  ์†”๋ฃจ์…˜ ์ฆ‰, Libray(๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ)๊ฐ€ ํ•„์š”ํ•ด์š”.
๊ทธ ์†”๋ฃจ์…˜์€ ์•„๋ž˜์˜ ์—ญํ• ์„ ํ•ด์ฃผ๊ณ  ์žˆ๊ณ , ์—ฌ๋Ÿฌ ์ข…๋ฅ˜๊ฐ€ ์žˆ์–ด์š”.

โˆ™ ๋ฐฑ์—”๋“œ์—์„œ ์ •๋ณด๋ฅผ ์ œ๊ณต ๋ฐ ์ฒ˜๋ฆฌ
   - ์„œ๋ฒ„๋‹จ์— ์š”์ฒญ์ด ๋“ค์–ด์˜ค๋ฉด GraphQL ์š”์ฒญ์„ ํ•ด์„ํ•˜์—ฌ Database(๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค)๋กœ ๋ถ€ํ„ฐ ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์™€ ๊ฐ€๊ณต ๋ฐ ์ฒ˜๋ฆฌํ•˜์—ฌ
      ํ”„๋ก ํŠธ์—”๋“œ์—๊ฒŒ ์ „์†ก.
โˆ™ ํ”„๋ก ํŠธ์—”๋“œ์—์„œ ์š”์ฒญ ์ „์†ก
โˆ™ GraphQL.js(Backend Library), GraphQL Yoga(Backend Library), AWS Amplify(Frontend Library),
   Relay(Frontend Library), ๋“ฑ๋“ฑ..

๊ทธ๋ ‡๋‹ค๋ฉด ์ด๋ ‡๊ฒŒ๋‚˜ ๋งŽ์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์กด์žฌํ•˜๋Š”๋ฐ, ์™œ?! Apolllo๋ฅผ ์‚ฌ์šฉํ• ๊นŒ์š”?
Apollo๋Š” ๋ฐฑ์—”๋“œ์™€ ํ”„๋ก ํŠธ์—”๋“œ ๋ชจ๋‘์—๊ฒŒ ํ•ด๋‹น ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๊ณ  ์žˆ๋‹ค๋Š” ๊ฒŒ ๋„ˆ๋ฌด ํฐ ์ด์œ ์—์š”.
๊ทธ๋ฆฌ๊ณ , ์‚ฌ์šฉํ•˜๊ธฐ ๋งค์šฐ ๊ฐ„ํŽธํ•˜๊ณ  ์‰ฌ์šด ์„ค์ •์„ ํ•  ์ˆ˜ ์žˆ๊ณ , ๋งŽ์€ ๊ธฐ๋Šฅ๋“ค์„ ์ œ๊ณตํ•œ๋‹ค๋Š” ์ ์ด ํฐ ์žฅ์ ์ด์—์š”.

 

728x90

 

 

 

 

 

    ๐Ÿ”ฝ Apollo Server ๊ตฌ์ถ• ๋ฐ ๊ตฌ์„ฑ

        ๐Ÿ“ฆ JavaScript + Node.js

๊ทธ๋Ÿผ ๋ณธ๊ฒฉ์ ์œผ๋กœ Apollo๋ฅผ ์ด์šฉํ•œ ๋ฐฑ์—”๋“œ ์„œ๋ฒ„ ๊ตฌ์ถ•์„ ์‹ค์Šตํ•ด ๋ณด๋ ค๊ณ  ํ•ด์š”.
ํ˜„์žฌ ์–„์ฝ”๋‹˜์˜ ๊ฐ•์˜์—์„œ๋Š” ์œ„์™€ ๊ฐ™์ด ์ง„ํ–‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ฐœ๋…์„ ์ตํžˆ๊ธฐ ์œ„ํ•ด JavaScript์™€ Node.js๋กœ ์‹ค์Šต์„ ํ•ด๋ณด๊ณ ,
์ฃผ๋‹ˆ๋Š” ์ถ”๊ฐ€์ ์œผ๋กœ Java์™€ Spring Boot๋ฅผ ์ด์šฉํ•œ ์‹ค์Šต์„ ํ•œ๋ฒˆ ๋” ์ง„ํ–‰ํ•ด ๋ณด๋ ค๊ณ  ํ•ด์š”.
๊ทธ๋ฆฌ๊ณ , TypeScript์™€ Node.js ๊ทธ๋ฆฌ๊ณ  Nesj.js๋ฅผ ์ด์šฉํ•ด์„œ ๋˜ ํ•œ๋ฒˆ ์‹ค์Šต์„ ์ง„ํ–‰ํ•ด ๋ณด๋„๋ก ํ• ๊ฒŒ์š”.


npm init

๋ฐ˜์‘ํ˜•


์ตœ์ดˆ Project(ํ”„๋กœ์ ํŠธ)๋ฅผ ๋งŒ๋“ค์–ด ์ฃผ๊ธฐ ์œ„ํ•ด ์œ„์™€ ๊ฐ™์ด ์›ํ•˜๋Š” Directory(๋””๋ ‰ํ„ฐ๋ฆฌ)์—์„œ ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ•ด ์ฃผ์—ˆ์–ด์š”.


์ฃผ๋‹ˆ๋Š” ์œ„์™€ ๊ฐ™์ด author๋ฅผ ๋นผ๊ณ ๋Š” ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ํ•˜๊ธฐ ์œ„ํ•ด ์—”ํ„ฐ๋ฅผ ๋ˆŒ๋Ÿฌ ์ฃผ์—ˆ์–ด์š”.


์œ„์™€ ๊ฐ™์ด Is this OK?๊ฐ€ ๋‚˜์˜ค๋ฉด yes๋ผ๊ณ  ์ž…๋ ฅํ•ด ์ฃผ๋ฉด ๋ผ์š”.



๊ทธ๋Ÿผ ์œ„์™€ ๊ฐ™์ด package.json์ด ๋งŒ๋“ค์–ด์ง„๊ฑธ ํ™•์ธํ•  ์ˆ˜ ์žˆ์–ด์š”.

์ด ํ”„๋กœ์ ํŠธ๋ฅผ InteliJ๋กœ ์—ด์–ด์ค„๊ฒŒ์š”.


์ด๋ ‡๊ฒŒ InteliJ๋กœ ์—ด์–ด์ฃผ์—ˆ์–ด์š”.

 


๊ทธ๋ฆฌ๊ณ  ์œ„์™€ ๊ฐ™์ด index.js๋ฅผ ๋งŒ๋“ค์–ด ๋ณด๋„๋ก ํ• ๊ฑฐ์—์š”.


index.js


๊ทธ๋ฆฌ๊ณ  ์œ„์™€ ๊ฐ™์ด ์ž…๋ ฅํ•ด ์ฃผ์—ˆ์–ด์š”.

node index.js


InteliJ Terminal(ํ„ฐ๋ฏธ๋„)์—์„œ ์œ„์™€ ๊ฐ™์ด ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ•˜๋‹ˆ ๋ฌธ์ž์—ด์ด ์ •์ƒ์ ์œผ๋กœ ์ถœ๋ ฅ๋˜๋Š” ๊ฑธ ํ™•์ธํ•  ์ˆ˜ ์žˆ์–ด์š”.

nodemon index.js


node ๋ช…๋ น์–ด ๋ง๊ณ , ์œ„์™€ ๊ฐ™์ด nodemon ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋ฉด ์ฝ”๋“œ ๋ณ€๊ฒฝ ๋’ค
์ €์žฅํ•˜๋ฉด ๋ฐ”๋€ ์ฝ”๋“œ๋Œ€๋กœ ์žฌ ์‹คํ–‰ ๋˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ์–ด์š”.

๋ณ€๊ฒฝ ์ „ package.json

 

๋ณ€๊ฒฝ ๋’ค package.json


8๋ฒˆ์งธ ์ค„์ฒ˜๋Ÿผ "start": "nodemon index.js"๋ฅผ ์ถ”๊ฐ€ํ•ด์ฃผ๋ฉด npm start ๋ช…๋ น์–ด๋กœ ์‹คํ–‰๋˜์—ˆ์„ ๋•Œ,
nodemon index.js ๋ช…๋ น์–ด๊ฐ€ ์ธ์‹๋˜์„œ ์ž‘๋™ํ•˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ์–ด์š”.

 

 

 

        ๐Ÿ“ฆ Insert Mock Database Module

์ด๋ฒˆ์—๋Š” ํ…Œ์ŠคํŠธ์šฉ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์ธ Mock ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๊ตฌ์ถ•ํ•ด ๋ณผ๊ฒŒ์š”.
์‹ค์ œ ์„œ๋น„์Šค๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด์„œ ์ฝ”๋”ฉํ•  ๋•Œ๋Š” RDBMS๋‚˜, NoSQL DBMS๋ฅผ ์‚ฌ์šฉํ•˜๊ฒ ์ง€๋งŒ, ์ด๋ฒˆ์—” ์‹ค์Šต์ด๊ธฐ ๋•Œ๋ฌธ์ด์—์š”.


์œ„์™€ ๊ฐ™์ด ๋””๋ ‰ํ„ฐ๋ฆฌ์™€ ํŒŒ์ผ์„ ๋งŒ๋“ค์–ด ์ฃผ์–ด์•ผ ํ•ด์š”.

ํ•ด๋‹น ํŒŒ์ผ์€ ์ด ๊ณณ์— ์ค€๋น„ ๋˜์–ด ์žˆ์–ด์š”.

์ด ํŒŒ์ผ์„ ํ”„๋กœ์ ํŠธ ์ตœ์ƒ์œ„ ๋””๋ ‰ํ„ฐ๋ฆฌ์— ๋„ฃ์–ด์ฃผ๋ฉด ๋œ๋‹ต๋‹ˆ๋‹ค.



์ฐธ๊ณ ๋กœ CSV Editor๋ผ๋Š” Plugin(ํ”Œ๋Ÿฌ๊ทธ์ธ)์„ ์„ค์น˜ํ•˜๋ฉด



์ด๋ ‡๊ฒŒ ์˜ˆ์œ ์ƒ‰๊น”๋กœ ๋‚˜๋‰˜์–ด ์ง€๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๊ณ ,


Table ํ˜•ํƒœ๋กœ๋„ ํ™•์ธ ๋ฐ ์ž‘์—…ํ•  ์ˆ˜ ์žˆ์–ด์š”.


index.js

 

const database = require('./database');
console.log(database);


Index.js๋ฅผ ์œ„์™€ ๊ฐ™์ด ์ˆ˜์ •ํ•ด ์ฃผ์—ˆ์–ด์š”.

์•„์ง database.js์˜ Module(๋ชจ๋“ˆ)์ด ์„ค์น˜ ๋˜์–ด ์žˆ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์•„๋ž˜ ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ•ด ์ฃผ์–ด์•ผ ํ•ด์š”.

npm i convert-csv-to-json


์œ„ ๋ช…๋ น์–ด๋ฅผ convert csv to json ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์„ค์น˜ํ•˜๋Š” ๋ช…๋ น์–ด์—์š”.


npm start


๊ทธ๋Ÿฐ ๋’ค ์œ„ ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ•˜์—ฌ ๊ธฐ๋™ ์‹œ์ผœ ์ฃผ๋ฉด ๊ฐ๊ฐ์˜ CSV Data๊ฐ€ json ํ˜•์‹์œผ๋กœ ์ถœ๋ ฅ๋˜๋Š” ๊ฑธ ํ™•์ธํ•  ์ˆ˜ ์žˆ์„๊ฑฐ์—์š”.

console.log(database.people);


์œ„์™€ ๊ฐ™์ด index.js 2๋ฒˆ์งธ ์ค„์„ ์ˆ˜์ •ํ•˜๊ฒŒ ๋˜๋ฉด nodemon์ด ๊ธฐ๋™์ค‘์ด๊ธฐ ๋•Œ๋ฌธ์— 


์œ„์™€ ๊ฐ™์ด ์•Œ์•„์„œ node Deamon(๋ฐ๋ชฌ)์ด ๋‹ค์‹œ ๊ธฐ๋™ ๋˜๋ฉด์„œ people.csv(์‚ฌ๋žŒ๋“ค ์ •๋ณด)๋งŒ
์ถœ๋ ฅํ•˜๋Š” ๊ฑธ ํ™•์ธํ•  ์ˆ˜ ์žˆ์„๊ฑฐ์—์š”.

 

 

 

        ๐Ÿ“ฆ Apollo Server Install

๋ณธ๊ฒฉ์ ์œผ๋กœ Apollo ์„ค์น˜๋ฅผ ์ง„ํ–‰ํ•ด ๋ณผ๊ฒŒ์š”.

npm i apollo-server


์œ„ ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด Apollo Module๋ฅผ ์„ค์น˜ํ•ด ์ค„ ์ˆ˜ ์žˆ์–ด์š”.

๋งŒ์•ฝ npm i(install) ๋’ค์— -g๋ฅผ ๋ถ™์ด๊ฒŒ ๋˜๋ฉด ์ „์—ญ์ ์œผ๋กœ ์„ค์น˜๊ฐ€ ๋˜๊ณ , ์œ„์™€ ๊ฐ™์ด -g๋ฅผ ๋ถ™ํžˆ์ง€ ์•Š์œผ๋ฉด ํ•ด๋‹น ํ”„๋กœ์ ํŠธ์—๋งŒ
์„ค์น˜๋˜๋Š” ๊ฒƒ์ด์—์š”.


index.js


const database = require('./database')
const { ApolloServer, gql } = require('apollo-server')
const typeDefs = gql`
  type Query {
    teams: [Team]
  }
  type Team {
    id: Int
    manager: String
    office: String
    extension_number: String
    mascot: String
    cleaning_duty: String
    project: String
  }
`
const resolvers = {
    Query: {
        teams: () => database.teams
    }
}
const server = new ApolloServer({ typeDefs, resolvers })
server.listen().then(({ url }) => {
    console.log(`๐Ÿš€ ์ฃผ๋‹ˆ์˜ Apollo ์‹ค์Šต Server ์ค€๋น„ ์™„๋ฃŒ! ${url}`)
})


๊ธฐ์กด์— index.js์— ์žˆ๋˜ ๋ชจ๋“  ๋‚ด์šฉ์„ ์ง€์šฐ๊ณ , ์œ„์˜ ๋‚ด์šฉ์œผ๋กœ ๋ณ€๊ฒฝํ•ด ์ฃผ์—ˆ์–ด์š”.


npm start


๊ทธ๋Ÿฐ ๋’ค ๋‹ค์‹œ ์„œ๋ฒ„๋ฅผ ๊ธฐ๋™ํ•ด ์ฃผ๊ณ , http://localhost:4000/ ์„ ๋ธŒ๋ผ์šฐ์ €์— ์ž…๋ ฅํ•ด ์ฃผ๋ฉด



์œ„์™€ ๊ฐ™์€ ํ™”๋ฉด์„ ๋งŒ๋‚  ์ˆ˜ ์žˆ๋Š”๋ฐ, Query your server๋ฅผ ํด๋ฆญํ•ด ์ฃผ๋ฉด ๋œ๋‹ต๋‹ˆ๋‹ค.


๊ทธ๋Ÿผ ์œ„์™€ ๊ฐ™์ด playgroud๊ฐ€ ๋‚˜์˜ค๊ฒŒ ๋œ๋‹ต๋‹ˆ๋‹ค

query {
  teams {
    id
    manager
    office
    extension_number
    mascot
    cleaning_duty
    project
  }
}


์œ„ ๋‚ด์šฉ์„ ๋ณต์‚ฌํ•˜์—ฌ ํ…Œ์ŠคํŠธ ํ•ด ๋ณผ๊ฒŒ์š”.



์ด๋ ‡๊ฒŒ ์ •์ƒ์ ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„ ์˜ค๋Š” ๊ฑธ ํ™•์ธํ•  ์ˆ˜ ์žˆ์–ด์š”.


index.js


์œ„ ์ฝ”๋“œ๋ฅผ ๋ถ„์„ํ•ด ๋ณด๋ฉด 22๋ฒˆ์งธ ์ค„์— new ์—ฐ์‚ฐ์ž๋กœ ApolloServer ๊ฐ์ฒด๋ฅผ ๋งŒ๋“œ๋Š”๋ฐ, ์ด ๊ฐ์ฒด๋Š” typedef์™€ resolovers๋ฅผ ๋งค๊ฐœ ๋ณ€์ˆ˜๋กœ ๋ฐ›์•„ ์„œ๋ฒ„๋ฅผ ์ƒ์„ฑํ•˜๊ฒŒ ๋˜๊ณ , 23๋ฒˆ์งธ ์ค„์— ํ•ด๋‹น ์„œ๋ฒ„ ๊ฐ์ฒด์˜ listen()์„ ํ˜ธ์ถœํ•˜์—ฌ url์„ ๋งค๊ฐœ ๋ณ€์ˆ˜๋กœ ๋„ฃ์–ด์ค€ ๋’ค ์‹คํ–‰ํ•˜๊ฒŒ ํ•ด์ฃผ๋Š” ๋ถ€๋ถ„์ด์—์š”. 

typeDefs๋Š” 3 ~ 16๋ฒˆ์งธ ์ค„์—์„œ ๋งŒ๋“ค์–ด ์ฃผ์—ˆ๊ณ , resolvers๋Š” 17 ~ 21๋ฒˆ์งธ ์ค„์„ ํ†ตํ•ด ๋งŒ๋“ค์–ด ์ค€๊ฑธ ํ™•์ธํ•  ์ˆ˜ ์žˆ์–ด์š”.

๊ทธ๋ ‡๋‹ค๋ฉด?! typeDef๋Š” ๋ญ˜๊นŒ์š”?
์ด ์นœ๊ตฌ๋Š” GraphQL์—์„œ ์‚ฌ์šฉํ•  ๋ฐ์ดํ„ฐ๋“ค์˜ ๊ตฌ์กฐ์™€ ํƒ€์ž…์„ ์ง€์ •ํ•œ ๊ฒƒ์ด์—์š”.

์œ„ index.js์˜ 7 ~ 15๋ฒˆ์งธ ์ค„ Team์ด๋ผ๋Š” ๊ฐ์ฒด๋ฅผ ๋ณด๋ฉด ์–ด๋–ค ํ•ญ๋ชฉ๋“ค๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋Š”์ง€ ๊ทธ๋ฆฌ๊ณ , ์ด๋ฅผ ์š”์ฒญํ•  ์ฟผ๋ฆฌ(4 ~ 6๋ฒˆ์งธ ์ค„)์—๋„ ์–ด๋–ค ํ˜•์‹์œผ๋กœ ์š”์ฒญ์ด ๋“ค์–ด๊ฐ€๋Š”์ง€ ์ด๋Ÿฐ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๊ฐ€ ์„ ์–ธ๋œ ๊ฒƒ์ด๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ์–ด์š”.

resolver๋Š” ์„œ๋ฒ„์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ฑฐ๋‚˜ ์ž…๋ ฅ, ์ˆ˜์ •, ์‚ญ์ œํ•˜๋Š”
CRUD์— ๋Œ€ํ•œ ์ฒ˜๋ฆฌ๋ฅผ ํ•จ์ˆ˜ ํ˜•ํƒœ๋กœ ์ง€์ •๋˜์–ด ์žˆ๋Š” ๊ฒƒ์ด์—์š”.



typeDef

โˆ™ GraphQL ๋ช…์„ธ์—์„œ ์‚ฌ์šฉ๋  Data, Request(์š”์ฒญ)์˜ Type(ํƒ€์ž…) ์ง€์ •.
โˆ™ gql(templat literal tag)๋กœ ์ƒ์„ฑ.

resolver

โˆ™ ์„œ๋น„์Šค์˜ ์•ก์…˜๋“ค์„ ํ•จ์ˆ˜๋กœ ์ง€์ •.
โˆ™ ์š”์ฒญ์— ๋”ฐ๋ผ ๋ฐ์ดํ„ฐ ๋ฐ˜ํ™˜, ์ž…๋ ฅ, ์ˆ˜์ •, ์‚ญ์ œ ์ฒ˜๋ฆฌ.

GraphQL Plygroud

โˆ™ ์ž‘์„ฑํ•œ GraphQL type, resolver ๋ช…์„ธ ํ™•์ธ
โˆ™ ๋ฐ์ดํ„ฐ ์š”์ฒญ ๋ฐ ์ „์†ก ํ…Œ์ŠคํŠธ (REST API Test Tool Postman์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ์‰ฌ์›€.)




 

GraphQL๊ณผ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋กœ ๊ฐœ๋ฐœํ•˜๋Š” ์›น ์„œ๋น„์Šค:์„ค๊ณ„๋ถ€ํ„ฐ ๊ฐœ๋ฐœ·๋ฐฐํฌ๊นŒ์ง€ ๋”ฐ๋ผ ํ•˜๋ฉฐ ์™„์„ฑํ•˜๋Š” ์›น ํ’€

COUPANG

www.coupang.com

"์ด ํฌ์ŠคํŒ…์€ ์ฟ ํŒก ํŒŒํŠธ๋„ˆ์Šค ํ™œ๋™์˜ ์ผํ™˜์œผ๋กœ, ์ด์— ๋”ฐ๋ฅธ ์ผ์ •์•ก์˜ ์ˆ˜์ˆ˜๋ฃŒ๋ฅผ ์ œ๊ณต๋ฐ›์Šต๋‹ˆ๋‹ค."

 

 

 

๐Ÿง ์ฐธ๊ณ  ์ž๋ฃŒ

ํ•ด๋‹น ๋‚ด์šฉ์€ ์•„๋ž˜ ๊ฐ•์˜๋ฅผ ๊ณต๋ถ€ํ•˜๋ฉด์„œ ์ •๋ฆฌํ•œ ๋‚ด์šฉ์ž„์„ ์•Œ๋ ค ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

 

[๋ฌด๋ฃŒ] ์–„ํŒํ•œ GraphQL๊ณผ Apollo - ์ธํ”„๋Ÿฐ | ๊ฐ•์˜

โšก ์งง๊ณ  ๊ตต์€ ์ „์ฒด 90๋ถ„ ๊ฐ•์ขŒ! ์‚ฌ์ดํŠธ์˜ ์ฝ”๋“œ๋“ค์„ ๋ณต๋ถ™ํ•˜๋ฉฐ ๋น ๋ฅด๊ฒŒ GraphQL์„ ๋ฐฐ์šฐ๊ณ  ์•„ํด๋กœ ์‚ฌ์šฉ๋ฒ•์„ ์ตํžˆ์„ธ์š”., โฑ ์—ฌ๋Ÿฌ๋ถ„์˜ ์‹œ๊ฐ„์€ ์†Œ์ค‘ํ•ฉ๋‹ˆ๋‹ค. [์‚ฌ์ง„] ๐ŸŽข  GraphQL์ด ๋ญ”๊ฐ€์š”? ์„œ๋น„์Šค๋ฅผ ๊ตฌ์„ฑํ•˜๋Š”

www.inflearn.com

 

 

 

 

์นด์นด์˜คํŽ˜์ด | ๋งˆ์Œ ๋†“๊ณ  ๊ธˆ์œตํ•˜๋‹ค

์—ฌ๊ธฐ๋ฅผ ๋ˆŒ๋Ÿฌ ๋งํฌ๋ฅผ ํ™•์ธํ•˜์„ธ์š”.

qr.kakaopay.com

 

 

 

728x90
๋ฐ˜์‘ํ˜•