Front-End ์ž‘์—…์‹ค/React.js

GraphQL๊ณผ Apollo ์—ด ๋„ค๋ฒˆ์งธ ์ด์•ผ๊ธฐ - React์™€ Apollo Client

์ฃผ๋‹ˆ์“ฐ๐Ÿง‘‍๐Ÿ’ป 2023. 12. 9. 03:00
728x90
๋ฐ˜์‘ํ˜•

 

 

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

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

qr.kakaopay.com

 

 

 

 

 

 

 

๋ฆฌ์•กํŠธ๋ฅผ ๋‹ค๋ฃจ๋Š” ๊ธฐ์ˆ 

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 ์—ด ๋„ค๋ฒˆ์งธ ์ด์•ผ๊ธฐ

    ๐Ÿ”ฝ React์™€ Apollo Client

        ๐Ÿ“ฆ ๊ฐœ์š”

์ด ์ „ ์‹œ๊ฐ„๊นŒ์ง€ BackEnd์—์„œ GraphQL์„ ์–ด๋–ป๊ฒŒ ๊ตฌ์„ฑํ•˜๋Š”์ง€์— ๋Œ€ํ•ด ๊ณต๋ถ€ํ•˜๊ณ , Java(์ž๋ฐ”), Spring Boot(์Šคํ”„๋ง ๋ถ€ํŠธ), TypeScript(ํƒ€์ž… ์Šคํฌ๋ฆฝํŠธ), Nest.js(๋„ค์ŠคํŠธ)๋ฅผ ์ด์šฉํ•˜์—ฌ ์‹ค์Šตํ•ด๋ณด๋Š” ์‹œ๊ฐ„์„ ๊ฐ€์กŒ์–ด์š”.

์ด์ œ FrontEnd์—์„œ๋Š” ๊ตฌ์„ฑ๋œ BackEnd API๋ฅผ ์–ด๋–ป๊ฒŒ ํ˜ธ์ถœํ•˜๊ณ , ์ƒํ˜ธ ์ž‘์šฉํ•  ์ˆ˜ ์žˆ๋Š”์ง€์— ๋Œ€ํ•ด ๊ณต๋ถ€ํ•ด ๋ณผ๊ฒŒ์š”.

์ด๋ฒˆ ๊ธ€์€ ์–„์ฝ”๋‹˜์˜ ๊ฐ•์˜๋ฅผ ๋“ค์œผ๋ฉฐ, ์ •๋ฆฌํ•˜๋Š” ๋‚ด์šฉ์ž…๋‹ˆ๋‹ค.

 

 

 

 

 

    ๐Ÿ”ฝ ์‹ค์Šต ํ™˜๊ฒฝ

        ๐Ÿ“ฆ BackEnd

๊ฐ•์˜์—์„œ๋Š” ์–„์ฝ”๋‹˜์ด ๋งŒ๋“œ์‹  Node.js ๊ธฐ๋ฐ˜์—์„œ ์ง„ํ–‰ํ•˜์ง€๋งŒ, ์ฃผ๋‹ˆ๋Š” ์ด ์ „์— ๋งŒ๋“  Nest.js ํ™˜๊ฒฝ์œผ๋กœ BackEnd๋ฅผ ์‚ฌ์šฉํ•ด ๋ณด๋ ค๊ณ  ํ•ด์š”.

 

GitHub - junyharang-coding-study/GraphQL-Study: GraphQL์„ ๊ณต๋ถ€ํ•˜๊ณ , ์‹ค์Šตํ•œ ์ฝ”๋“œ์—์š” ๐Ÿ˜€

GraphQL์„ ๊ณต๋ถ€ํ•˜๊ณ , ์‹ค์Šตํ•œ ์ฝ”๋“œ์—์š” ๐Ÿ˜€. Contribute to junyharang-coding-study/GraphQL-Study development by creating an account on GitHub.

github.com

 

์†Œ์Šค ์ฝ”๋“œ๋Š” ์ด ๊ณณ์—์„œ ๋ฐ›์œผ์‹ค ์ˆ˜ ์žˆ์–ด์š”.

 

npm run start:dev


์œ„ ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ•˜๋ฉด ์ž๋™์œผ๋กœ ๊ธฐ์กด Mock Data ๋ฐ Table ๋‚ด์šฉ์„ ๋‚ ๋ฆฌ๊ณ , ๋‹ค์‹œ Seed๋ฅผ ํ†ตํ•ด Table์„ ๋งŒ๋“ค๊ณ , Mock Data๋ฅผ Ebedded SQLite์— ์ž…๋ ฅํ•˜๋„๋ก ํ•ด ๋‘์—ˆ์–ด์š”.

ํ•ด๋‹น ์„œ๋ฒ„๋Š” 8081 ํฌํŠธ๋กœ ๊ธฐ๋™ ๋ฉ๋‹ˆ๋‹ค.


 

 

    ๐Ÿ”ฝ ์‹ค์Šต

        ๐Ÿ“ฆ FrontEnd

React์˜ ํ™˜๊ฒฝ์€ ์–„์ฝ”๋‹˜์ด ๋งŒ๋“œ์‹  ํ™˜๊ฒฝ์—์„œ ์ง„ํ–‰ํ•ด ๋ณด๋„๋ก ํ• ๊ฒŒ์š”.
๋‹ค๋งŒ, BackEnd ์ฝ”๋“œ๊ฐ€ ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์— FrontEnd๋„ ์•ฝ๊ฐ„์€ ๋‹ค๋ฅธ ๋ฐฉํ–ฅ์œผ๋กœ ์ง„ํ–‰ํ•  ๊ฑฐ์—์š”.


 

GitHub - junyharang-coding-study/GraphQL-Study: GraphQL์„ ๊ณต๋ถ€ํ•˜๊ณ , ์‹ค์Šตํ•œ ์ฝ”๋“œ์—์š” ๐Ÿ˜€

GraphQL์„ ๊ณต๋ถ€ํ•˜๊ณ , ์‹ค์Šตํ•œ ์ฝ”๋“œ์—์š” ๐Ÿ˜€. Contribute to junyharang-coding-study/GraphQL-Study development by creating an account on GitHub.

github.com

์‹ค์Šต ์ฝ”๋“œ๋Š” ์œ„์—์„œ ๋‚ด๋ ค ๋ฐ›์„ ์ˆ˜ ์žˆ์–ด์š”.

์ฃผ๋‹ˆ๋Š” FrontEnd IDE๋กœ JetBrain์˜ WebStorm์„ ์‚ฌ์šฉํ•  ๊ฑฐ์—์š”.





JetBrain ์‚ฌ์˜ IDE๋กœ ํ”„๋กœ์ ํŠธ๋ฅผ ์ตœ์ดˆ ์—ด๋ฉด ์œ„์™€ ๊ฐ™์ด ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ•˜์ง€ ์•Š์•„๋„ Module์„ ์„ค์น˜ํ•  ์ˆ˜ ์žˆ๋Š” ๋‚ด์šฉ์ด ๋‚˜์™€์š”.
์œ„์˜ RUN 'YARN INSTALL' ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๊ฑฐ๋‚˜, Terminal์—์„œ npm install ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ•˜์—ฌ Module์„ ์„ค์น˜ํ•ด ์ฃผ์„ธ์š”.


npm install




npm start

Error [ERR_PACKAGE_PATH_NOT_EXPORTED]: Package subpath './lib/tokenize' is not defined by "exports"


๋งŒ์•ฝ ์œ„์™€ ๊ฐ™์ด npm start๋กœ ๊ธฐ๋™ ํ•ด ์ฃผ์—ˆ๋Š”๋ฐ, ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธฐ๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ํ•ด ์ฃผ๋ฉด ํ•ด๊ฒฐ ๋ฉ๋‹ˆ๋‹ค.

 

npm update

 

rm -rf node_modules && npm install

 

 

Error: error:0308010C:digital envelope routines::unsupported


๊ทธ๋Ÿฐ๋ฐ ์ด๋ฒˆ์—” ์œ„์™€ ๊ฐ™์ด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜์˜€์–ด์š”.

์ด๋Ÿด ๋• ์•„๋ž˜์™€ ๊ฐ™์ด ํ•ด๊ฒฐ ํ•ด ์ฃผ์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.




npm uninstall react-scripts




npm install react-scripts

 

๋‹ค์‹œ npm start ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ•˜๋ฉด ์ •์ƒ ์ž‘๋™๋  ๊ฑฐ์—์š”.


npm start



localhost:3000

 

 

React.js ์ฝ”๋“œ๋ฅผ ์ข€ ๋ถ„์„ํ•ด ๋ณด๋ฉด App.js๋Š” 

src/components



4-1-react-before-apollo/src/App.js


์œ„ Component(์ปดํฌ๋„ŒํŠธ) ๋“ค์„ Import ํ•œ ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์–ด์š”.

 

 

4-1-react-before-apollo/src/App.js


App.js์˜ NavMenus()๋Š” menu ๊ฐ’์— ๋”ฐ๋ผ ์ƒ๋‹จ App-header์˜ Button์„ ํ‘œ์‹œํ•˜๋Š” ํ•จ์ˆ˜์—์š”.
mainComp()๋Š” App-header ์•„๋ž˜ Main ํ™”๋ฉด์— ๋‚˜ํƒ€๋‚  Component Mapping์ด์—์š”.

20๋ฒˆ์งธ ์ค„์— Roles, Teams, People ์ด๋ผ๋Š” ๋ฌธ์ž์—ด ๋ฐฐ์—ด๋กœ ๋ถ€ํ„ฐ HTML li Element(์—˜๋ฆฌ๋จผํŠธ)๋ฅผ ๋งŒ๋“ค์–ด 


์ด๋ ‡๊ฒŒ Navigation์„ ๋งŒ๋“ค์–ด ์ฃผ๋Š” ์—ญํ• ์„ ํ•˜๊ณ  ์žˆ์–ด์š”.

์ด์ฒ˜๋Ÿผ ํŠน์ • Data(๋ฐ์ดํ„ฐ)๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ฐ„๋‹จํ•œ Code(์ฝ”๋“œ)๋ฅผ ํ†ตํ•ด ์›ํ•˜๋Š” HTML ์—˜๋ฆฌ๋จผํŠธ๋ฅผ ๋งŒ๋“ค์–ด ๋‚ผ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด React.js ๋ผ๋Š” Library(๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ)์—์š”.



4-1-react-before-apollo/src/App.js

 

src/components


๊ทธ๋ฆฌ๊ณ , ์œ„ ์„ธ ์ปดํฌ๋„ŒํŠธ๋“ค์€ ๊ฐ๊ฐ ํŒŒ์ผ์—์„œ ๋งŒ๋“ค์–ด์ง„ ๋‚ด์šฉ์ด ๋ฐ”๋กœ 


40๋ฒˆ์งธ ์ค„์— ์˜ํ•˜์—ฌ ํ™”๋ฉด์— ์ถœ๋ ฅํ•ด ์ฃผ๊ณ  ์žˆ์–ด์š”.



์ฆ‰, App.js์˜ App()์€ ํฌ๊ฒŒ Header ๋ถ€๋ถ„๊ณผ Main ๋ถ€๋ถ„์˜ ์ฝ”๋“œ๋กœ ๋‚˜๋‰˜์–ด ์žˆ๊ณ ,
Main์„ ์ฑ„์šธ ๊ฐ๊ฐ์˜ ๋‚ด์šฉ๋“ค์€ ๋ฐ”๋กœ ์ด ์ปดํฌ๋„ŒํŠธ Directory(๋””๋ ‰ํ„ฐ๋ฆฌ) ์•ˆ์—
componentes ๋””๋ ‰ํ„ฐ๋ฆฌ ๋ฐ‘์— ๊ฐ๊ฐ ํŒŒ์ผ์— ๋“ค์–ด ์žˆ๋Š” ๊ฒƒ์ด์—์š”.


๊ทธ๋ฆฌ๊ณ , roles.js, teams.js, people.js๋Š” ๊ณตํ†ต์ ์œผ๋กœ AsideItems(Main ํ™”๋ฉด ์™ผ์ชฝ์˜ Side Section - List๊ฐ€ ๋‚˜ํƒ€๋‚  ๊ณณ)๊ณผ MainContens(Main ํ™”๋ฉด - List ๊ฐ ํ•ญ๋ชฉ์˜ ๋‚ด์šฉ๋ถ€๊ฐ€ ํ‘œ์‹œ๋  ๊ณณ)์„ ํ†ตํ•ด ํ™”๋ฉด์„ ๊ทธ๋ ค๋‚ด๋Š” ์—ญํ• ์„ ํ•ด์š”.

4-1-react-before-apollo/src/components/roles.js


AsideIteams()๋Š”

localhost:3000


์œ„ ํ™”๋ฉด์—์„œ ์™ผ์ชฝ ๊ฒ€์ •์ƒ‰ ๋ถ€๋ถ„์„ ๊ทธ๋ ค๋‚ด๋Š” ์—ญํ• ์„ ํ•˜๊ณ  ์žˆ๊ณ ,

MainContens()๋Š” ์˜ค๋ฅธ์ชฝ์— ํšŒ์ƒ‰ ๋ถ€๋ถ„์„ ๊ทธ๋ ค๋‚ด๋Š” ์—ญํ• ์„ ํ•˜๊ณ  ์žˆ์–ด์š”.

์„ธ ์ปดํฌ๋„ŒํŠธ ํŒŒ์ผ ๋ชจ๋‘ ๊ฐ™์€ ๋‚ด์šฉ์œผ๋กœ ์ฑ„์›Œ์ ธ ์žˆ์–ด์š”.

์ด์ œ React์—์„œ Apollo(์•„ํด๋กœ) Client(ํด๋ผ์ด์–ธํŠธ)๋ฅผ ์ด์šฉํ•ด์„œ GraphQL Server๋กœ๋ถ€ํ„ฐ ์ •๋ณด๋“ค์„ ๋ฐ›์•„์™€์„œ
ํ™”๋ฉด๋“ค์„ ์ฑ„์›Œ๋‚˜๊ฐ€๋Š” ์ž‘์—…์„ ํ•ด๋ณผ๊ฑฐ์—์š”.


 

 

 

 

 

    ๐Ÿ”ฝ Apollo Client ์‚ฌ์šฉํ•˜๊ธฐ

์ด๋ฒˆ ๊ธ€์„ ํ†ตํ•ด ๋‹ค ์•Œ์ง€ ๋ชปํ•œ ๋ถ€๋ถ„์— ๋Œ€ํ•ด์„œ๋Š” Apollo Client Document๋ฅผ ์ฐธ๊ณ ํ•ด ์ฃผ์‹œ๋ฉด ์ข‹์„ ๊ฑฐ ๊ฐ™์•„์š”.

 

        ๐Ÿ“ฆ Apollo Client Module ์ ์šฉ

npm i @apollo/client graphql


์ตœ์ดˆ ์œ„ ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด ์•„ํด๋กœ ํด๋ผ์ด์–ธํŠธ๋ฅผ ์„ค์น˜ํ•ด ์ฃผ์–ด์•ผ ํ•ด์š”.

4-1-react-before-apollo/src/App.js


๊ทธ๋ฆฌ๊ณ  ์œ„ 3 ~ 4๋ฒˆ์งธ์™€ ๊ฐ™์ด import ๋ฌธ์„ ํ†ตํ•ด ์•„ํด๋กœ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด ์ฃผ์–ด์•ผ ํ•ด์š”.


4-1-react-before-apollo/src/App.js


๊ทธ๋ฆฌ๊ณ  ์œ„์™€ ๊ฐ™์ด Code๋ฅผ ์ž…๋ ฅํ•ด ์ฃผ์—ˆ๋Š”๋ฐ,
๊ฐ•์˜์—์„œ๋Š” uri๋ฅผ 4000๋ฒˆ ํฌํŠธ๋กœ ํ•˜์˜€์ง€๋งŒ, ์ฃผ๋‹ˆ๋Š” 8081 Nest.js Server๋กœ ํ…Œ์ŠคํŠธ๋ฅผ ํ•ด ๋ณผ๊ฑฐ๋ผ์„œ ์œ„์™€ ๊ฐ™์ด ํ•ด ์ฃผ์—ˆ์–ด์š”.

์•„ํด๋กœ ํด๋ผ์ด์–ธํŠธ ๊ฐ์ฒด๋Š” GraphQL Server๋ฅผ ์ƒ๋Œ€๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ  ๋ฐ›๋Š” ์—ญํ• ์„ ํ•˜๋Š” ์นœ๊ตฌ์—์š”.

REST API๋ฅผ ์ด์šฉํ•ด FrontEnd๋ฅผ ๊ฐœ๋ฐœํ•ด ๋ณด์•˜๋‹ค๋ฉด Axiox ํ˜น์€ Ajax ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์—ญํ• ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋ผ์š”.

12๋ฒˆ์งธ ์ค„์— InMemoryCache() ๊ฐ์ฒด๋Š” GraphQL ํด๋ผ์ด์–ธํŠธ๊ฐ€ ํ•œ๋ฒˆ ๋ฐ›์•„์˜จ ์ •๋ณด๋“ค์„ ํ•„์š” ์ด์ƒ์œผ๋กœ ๋‹ค์‹œ Request(์š”์ฒญ)ํ•  ํ•„์š”๊ฐ€ ์—†๋„๋ก Cache(์บ์‹œ)๋ฅผ ๊ด€๋ฆฌํ•ด ์ฃผ๋Š” ์—ญํ• ์„ ํ•˜๊ณ  ์žˆ์–ด์š”.


4-1-react-before-apollo/src/App.js


์œ„ ์ฝ”๋“œ๋ฅผ ๋ณ€๊ฒฝํ•ด ์ฃผ์—ˆ๋Š”๋ฐ, ApolloProvider Tag๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ , ๊ธฐ์กด์— ์žˆ๋˜ ๋‚ด์šฉ์„ ์•ˆ์— ๋„ฃ์–ด์ฃผ์—ˆ์–ด์š”.
์•ˆ์— ๋“ค์–ด๊ฐ„ ๋‚ด์šฉ ์ฆ‰, ์ปดํฌ๋„ŒํŠธ๋“ค์ด mainComp()๋กœ ๋“ค์–ด๊ฐˆ ๊ฑฐ๋ผ๊ณ  ์ด์•ผ๊ธฐ ํ–ˆ์—ˆ๋Š”๋ฐ, ํ•ด๋‹น ์ปดํฌ๋„ŒํŠธ๋“ค์—์„œ๋Š” ์ด ์•„ํด๋กœ ํด๋ผ์ด์–ธํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ๋ฐ์ดํ„ฐ๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๊ณ , ๋‹ค์‹œ ์ปดํฌ๋„ŒํŠธ๋“ค์—๊ฒŒ ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด ์ค€ ๋ถ€๋ถ„์ด์—์š”.







        ๐Ÿ“ฆ GraphQL ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ๋ชฉ๋ก ๋ฐ›์•„์™€ ํ‘œ์‹œ

๋ณธ๊ฒฉ์ ์œผ๋กœ Roles Tab์— GraphQL ์ ์šฉ์„ ํ•ด๋ณด๋„๋ก ํ•ด๋ณผ๊ฒŒ์š”.
GraphQL Server๋กœ๋ถ€ํ„ฐ ์—ญํ• ๋“ค์˜ ์ •๋ณด๋ฅผ ๋ฐ›์•„ ๋ชฉ๋ก์„ ํ‘œ์‹œํ•ด ๋ณผ๊ฒŒ์š”.

src/components/roles.js


์ตœ์ดˆ ์œ„์™€ ๊ฐ™์ด 2 ~ 3๋ฒˆ์งธ ์ค„์—์„œ useState, useQuery, gql์„ Import ํ•ด ์ฃผ์—ˆ์–ด์š”.


BackEnd - src/graphql/schema/schema.graphqls

 

http://localhost:8081/graphql



GraphQL์—์„œ Role ๋ชฉ๋ก์„ ๋ฐ›์•„์˜ค๊ธฐ ์œ„ํ•ด์„œ๋Š” getRoles()๋กœ ์š”์ฒญ์„ ๋ณด๋‚ด์•ผ ํ•ด์š”.

src/components/roles.js


๊ทธ๋ฆฌ๊ณ  ์œ„์™€ ๊ฐ™์ด ์š”์ฒญ์„ ๋ณด๋‚ด ๊ฐ’์„ ๋ฐ›์•„์˜ฌ ์ˆ˜ ์žˆ๋Š” Schma๋ฅผ ๋„ฃ์–ด ์š”์ฒญ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์–ด ์ฃผ์—ˆ์–ด์š”.


src/components/roles.js


ํ˜„์žฌ ์„ ํƒ๋œ ID๋ฅผ ์ €์žฅํ•˜๋Š” ์ฝ”๋“œ๋„ Roles() ์•ˆ์— ๋„ฃ์–ด ์ฃผ์—ˆ์–ด์š”.

localhost:3000

 

src/components/roles.js



์ด์ œ ์™ผ์ชฝ ๊ฒ€์ • ๊ณต๊ฐ„์„ ๋‚˜ํƒ€๋‚ด๋Š” asideItems()๋Š” ์•„๋ฌด๊ฒƒ๋„ ์—†๋Š” div Tag๋งŒ ๋“ค์–ด ์žˆ๊ณ , ์ด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฑธ ์•Œ ์ˆ˜ ์žˆ์–ด์š”.

src/components/roles.js


ํ•ด๋‹น ์ฝ”๋“œ๋ฅผ ์œ„์™€ ๊ฐ™์ด ๋ณ€๊ฒฝํ•ด ์ฃผ์—ˆ์–ด์š”.

๊ทธ๋Ÿฐ ๋’ค npm start ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด ๋‹ค์‹œ ์‹คํ–‰ํ•ด ์ฃผ์—ˆ์–ด์š”.

http://localhost:3000/


๊ทธ๋žฌ๋”๋‹ˆ ์œ„์™€ ๊ฐ™์ด CORS Error๊ฐ€ ๋ฐœ์ƒํ•œ ๊ฑธ ํ™•์ธํ•  ์ˆ˜ ์žˆ์–ด์š”.

์ฃผ๋‹ˆ๋Š” Nest.js Server๋ฅผ ์“ฐ๊ธฐ ๋•Œ๋ฌธ์— Nest.js์—์„œ CORS ํ—ˆ์šฉ์„ ํ•ด์ฃผ๋„๋ก ํ• ๊ฒŒ์š”.

BackEnd - src/main.ts

728x90


14๋ฒˆ์งธ ์ค„๊ณผ ๊ฐ™์ด app.enableCors()๋ฅผ ๋„ฃ์–ด ์ฃผ์—ˆ์–ด์š”.
์ฐธ๊ณ ๋กœ HTTP Methods๋Š” GET๊ณผ POST๋งŒ ํ—ˆ์šฉํ•ด ์คฌ๋Š”๋ฐ, ์ด๋Š” GraphQL์€ GET๊ณผ POST๋งŒ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์ด์—์š”.

๊ทธ๋Ÿฐ ๋’ค ์„œ๋ฒ„๋ฅผ ์žฌ๊ธฐ๋™ ํ•ด ์ค๋‹ˆ๋‹ค.


http://localhost:3000/


๊ทธ๋Ÿผ ์œ„์™€ ๊ฐ™์ด ๋‚˜์˜ค๋Š” ๊ฑธ ํ™•์ธํ•  ์ˆ˜ ์žˆ์–ด์š”.


http://localhost:3000/


๊ฐœ๋ฐœ์ž ๋„๊ตฌ๋กœ graphql ์š”์ฒญ์„ ํ™•์ธํ•ด ๋ณด๋ฉด Reponse(์‘๋‹ต) Value(๊ฐ’) ์œผ๋กœ ๋ฐ›์•„์˜จ ๋ฐ์ดํ„ฐ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์–ด์š”.


src/components/roles.js


์ด ๋•Œ, ์œ„์™€ ๊ฐ™์ด ์‘๋‹ต ํ•„๋“œ๊ฐ’์„ roleId๋งŒ ๋ฐ›๊ฒ ๋‹ค๊ณ  ํ•˜์—ฌ ์ฟผ๋ฆฌ๋ฅผ ๋งŒ๋“ค๊ณ , ์š”์ฒญ์„ ๋‹ค์‹œ ๋ณด๋‚ด๋ฉด


http://localhost:3000/


์œ„์™€ ๊ฐ™์ด roleId ํ•„๋“œ๋งŒ ๋ฐ˜ํ™˜๋œ๊ฑธ ํ™•์ธํ•  ์ˆ˜ ์žˆ์–ด์š”.

์–ด์ฐจํ”ผ ํ™”๋ฉด์—๋Š” roleId ๊ฐ’๋งŒ ํ•„์š”ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์•„๋ž˜์™€ ๊ฐ™์ด ์ˆ˜์ •ํ•ด ์ค„๊ฒŒ์š”.


src/components/roles.js

 

http://localhost:3000/



src/components/roles.js


์œ„ ์ฝ”๋“œ๋ฅผ ๋ถ„์„ํ•ด ๋ณผ๊ฒŒ์š”.

23 ~ 27๋ฒˆ์งธ ์ค„์€ ์•„์ด์ฝ˜ ํ‘œ์‹œ๋ฅผ ์œ„ํ•œ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์–ด ์ค€๊ฑฐ์—์š”.

29๋ฒˆ์งธ ์ค„์— useQuery() ์ด ๋ถ€๋ถ„์— GraphQL Query ๋ฌธ์„ ๋„ฃ์–ด์„œ Loading๊ณผ Error ๊ทธ๋ฆฌ๊ณ , Data๋ฅผ Server๋กœ๋ถ€ํ„ฐ ๋ฐ›์•„์˜ค๊ฒŒ ๋ผ์š”.

Loading์€ Server๋กœ ๋ถ€ํ„ฐ Data๋ฅผ ๋ฐ›์•„์˜ค๋Š” ์งง์€ ์ˆœ๊ฐ„์— Loading ํ‘œ์‹œ๋ฅผ ๋งŒ๋“ค์–ด ์ฃผ์—ˆ๋Š”๋ฐ, ์ฃผ๋‹ˆ์˜ ๋งฅ๋ถ์€ ์ด Loading์„ ๋ณผ ๊ธฐํšŒ๋ฅผ ๋ณด์—ฌ์ฃผ์ง€ ์•Š๋”๋ผ๊ตฌ์š”. ์•„์ฃผ ๋นจ๋ผ์š”!
์ด๋ฅผ 31๋ฒˆ์งธ ์ค„ ๋ถ„๊ธฐ๋ฌธ์œผ๋กœ ํ™•์ธ์„ ํ•ด ์ฃผ๊ณ  ์žˆ๊ณ , Loading ์ค‘์ด๋ผ๋ฉด 32๋ฒˆ์งธ ์ค„ P Tag ์•ˆ์˜ ๋ฌธ๊ตฌ๊ฐ€ ๋ณด์ด๊ฒŒ ๋  ๊ฑฐ์—์š”.

Error์— ๊ฒฝ์šฐ Query๋ฅผ ์ž˜ ๋ชป ์š”์ฒญํ•˜๋Š” ๋“ฑ์˜ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜์˜€์„ ๋•Œ, ๋ฌธ์ œ๋ฅผ ๋„์šฐ๊ธฐ ์œ„ํ•œ ๋ถ€๋ถ„์ด์—์š”.
์ด๋ฅผ 35๋ฒˆ์งธ ์ค„์—์„œ Error ๊ฐ’์ด ๋“ค์–ด ์žˆ๋Š”์ง€์™€ Server์˜ statusCode๊ฐ€ 200์ด ์•„๋‹Œ์ง€๋ฅผ ํ™•์ธํ•ด์„œ ํ•ด๋‹น ์กฐ๊ฑด์— ๋ถ€ํ•ฉํ•˜๊ฒŒ ๋˜๋ฉด Error๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค๊ณ  ํ™”๋ฉด์— ํ‘œ์‹œ๋˜๊ฒŒ ํ•ด๋†จ์–ด์š”.

data๋Š” ์‹ค์ œ Server๊ฐ€ ๋ฐ˜ํ™˜ํ•œ Data๋ฅผ ๋‹ด๊ณ  ์žˆ๋Š” ๋ถ€๋ถ„์ด์—์š”.


์œ„์˜ ์‘๋‹ต๊ฐ’์„ ๋ณด๋ฉด data ๊ฐ์ฒด ์•ˆ์— getRoles ๊ฐ์ฒด ์•ˆ์— pagination ๊ฐ์ฒด ์•ˆ์— data ๋ฐฐ์—ด ๊ฐ์ฒด ์•ˆ์— ์‹ค์ œ ๋ฐ์ดํ„ฐ ๊ฐ์ฒด๋“ค์ด ๋‹ด๊ฒจ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— 41๋ฒˆ์งธ ์ค„์—์„œ ํ•ด๋‹น ๋ฐฐ์—ด์„ ๋ฐ˜๋ณตํ•˜์—ฌ ๋Œ๋ฆฐ ๋’ค roleId ๊ฐ’์„ Parsing(ํŒŒ์‹ฑ)ํ•˜๋„๋ก ํ•ด ์ค€ ๋ถ€๋ถ„์ด์—์š”.

 

http://localhost:3000/


ํ•ด๋‹น roleId๋ฅผ ํ†ตํ•ด Icon๊ณผ ํ•จ๊ป˜ ์ด๋ ‡๊ฒŒ ํ™”๋ฉด์„ ๊พธ๋ฉฐ์ฃผ๋„๋ก ํ•ด ์ค€๊ฑฐ์—์š”.

์ด๋ฒˆ์—๋Š” ํšŒ์ƒ‰ ํ™”๋ฉด์„ ๊พธ๋ฉฐ ๋ณด๋„๋ก ํ• ๊ฒŒ์š”.


์ด์ œ roleId ๊ฐ’์„ ํด๋ฆญํ–ˆ์„ ๋•Œ, ์ƒ์„ธ ์ •๋ณด๊ฐ€ ๋‚˜ํƒ€๋‚˜๊ฒŒ ๋งŒ๋“ค์–ด ๋ณผ๊ฑฐ์—์š”.


BackEnd - src/graphql/schema/schema.graphqls


ํ˜ธ์ถœ ๋Œ€์ƒ์€ 24๋ฒˆ์งธ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•ด ๋ณผ๊ฑฐ์—์š”.


FrontEnd - src/components/roles.js



FrontEnd - src/components/roles.js

๋ฐ˜์‘ํ˜•

FrontEnd - src/components/roles.js



http://localhost:3000/


์ตœ์ดˆ ์—ญํ• ์ด ์•„๋ฌด๊ฒƒ๋„ ์„ ํƒ์ด ์•ˆ ๋˜์–ด ์žˆ๋‹ค๋ฉด ์œ„์™€ ๊ฐ™์ด ๋‚˜์˜ฌ๊ฑฐ์—์š”.

Developer ์ˆœ์œผ๋กœ ํ•˜๋‚˜ํ•˜๋‚˜ ํด๋ฆญํ•ด ๋ณผ๊ฒŒ์š”.

http://localhost:3000/ Developer ํด๋ฆญ





http://localhost:3000/ Designer ํด๋ฆญ



http://localhost:3000/ Planner ํด๋ฆญ

 

 



์œ„์™€ ๊ฐ™์ด ์ •์ƒ ๋™์ž‘ํ•˜๋Š” ๊ฑธ ํ™•์ธํ•  ์ˆ˜ ์žˆ์–ด์š”.


 

FrontEnd - src/components/roles.js


์ตœ์ดˆ ์—ญํ• ์„ ์„ ํƒํ•˜๊ฒŒ ๋˜๋ฉด ํ•ด๋‹น ์—ญํ• ์˜ ๋ฌธ์ž์—ด์ด roleId์ด๊ณ ,
์ด๊ฒƒ์ด useState() ํ•จ์ˆ˜์— ์ €์žฅ๋˜๊ฒŒ ๋˜๊ณ , ์ด ๊ฑธ ๋ถ„๋ฆฌํ•œ contentId ๋ณ€์ˆ˜์— ์ €์žฅํ•˜๊ฒŒ ๋ผ์š”.

 

 

 

FrontEnd - src/components/roles.js


์ฝ”๋“œ๋ฅผ ๋ถ„์„ํ•ด ๋ณด๋ฉด ์ตœ์ดˆ ์ด ๊ณณ์—์„œ useQuery()๋ฅผ ์ด์šฉํ•˜์—ฌ GraphQL์— ์š”์ฒญ์„ ๋ณด๋‚ด๋Š”๋ฐ, ์„ ํƒ๋œ roleId๋ฅผ ์‹ค์–ด ๋ณด๋‚ด์„œ
๋ฐ›์•„์˜จ ๋ฐ์ดํ„ฐ ์ •๋ณด๋ฅผ ์ด์šฉํ•˜์—ฌ React๋กœ ํ™”๋ฉด์„ ๊ตฌ์„ฑํ•ด ์ค€๊ฑฐ์—์š”.






 

 

์‹ค์ „! ์Šคํ”„๋ง ๋ถ€ํŠธ์™€ ๋ฆฌ์•กํŠธ๋กœ ์‹œ์ž‘ํ•˜๋Š” ๋ชจ๋˜ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ

COUPANG

www.coupang.com


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

 

 

 

 

 

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

 

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

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

www.inflearn.com

 

 

 

Get started with Apollo Client

Hello! ๐Ÿ‘‹ This short tutorial gets you up and running with Apollo Client. If you're using a React sandbox from CodeSandbox and you encounter a TypeError, try downgrading the version of the graphql package to 15.8.0 in the Dependencies panel. If you encou

www.apollographql.com

 

 

 

 

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

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

qr.kakaopay.com

 

 

 

728x90
๋ฐ˜์‘ํ˜•