๋Œ€์ฒด ๋ญ”๋ฐ ๐Ÿ‘ฟ ํ•˜์ˆ˜๋ผ ๐Ÿ‘ฟ

3649 ๋‹จ์–ด beginnersprogrammingjavascriptwebdev
๋‹น์‹ ์€ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์—ฌ์ •์„ ์‹œ์ž‘ํ–ˆ๊ณ  ์œ ๋ช…ํ•œ "Hello World"๋ฅผ ๋“ฑ์žฅ์‹œ์ผฐ๊ณ  ๋‹น์‹ ์ด ์„ธ์ƒ์„ ์ •๋ณตํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ๋Š๊ผˆ์Šต๋‹ˆ๋‹ค! ๋‹น์‹ ์€ ์กฐ๊ธˆ ๋ฐฐ์› ๊ณ HTML, ์•ฝ๊ฐ„์˜ Javascript์— ๋“ค์–ด๊ฐ”๊ณ , ํ•ด์•ผ ํ•  ์ผ ๋ชฉ๋ก์„ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๋‹น์‹ ์€ ์ƒˆ๋กœ ๊ณ ์นจํ•˜๊ณ  ํœ™! ๋ชจ๋“  ๊ฒƒ์ด ์‚ฌ๋ผ์กŒ์Šต๋‹ˆ๋‹ค!


๋ฐ์ดํ„ฐ๋ฅผ ์œ ์ง€ํ•˜๋ ค๋ฉด ๋ฐฑ์—”๋“œ ์„œ๋ฒ„๊ฐ€ ํ•„์š”ํ•˜๋‹ค๋Š” ๊ฒƒ์„ ๊นจ๋‹ซ๊ณ  ๊ฐ‘์ž๊ธฐ Django, NodeJS, Server, Nginx, Apache, Postgres, SQL๊ณผ ๊ฐ™์€ ๋‹จ์–ด๊ฐ€ ์–ด์ง€๋Ÿฌ์›Œ์ง‘๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ๊ฑฑ์ •ํ•˜์ง€ ๋งˆ์„ธ์š”. ๋” ์‰ฌ์šด ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ์˜คํ”ˆ ์†Œ์Šค ๊ฒฝ์ด๋กœ์›€์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์‹œ์ž‘ํ•˜๊ธฐ ์ „์— ์ด๋ฏธ ์•Œ์•„์•ผ ํ•  ์‚ฌํ•ญ



1. API๊ฐ€ ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋Š”์ง€ ์•Œ์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

2.Graphql ์ž‘๋™ ๋ฐฉ์‹

3.Apollo ํด๋ผ์ด์–ธํŠธ์˜ ๊ธฐ๋ณธ ์‚ฌํ•ญ(๊ทธ๋Œ€๋กœ ์ง„ํ–‰)Nice Video on basic setup for apollo client

Hasura๊ฐ€ ๋‹จ์ˆœํ™”ํ•˜๋Š” ๊ฒƒ



Hasura๊ฐ€ ๋‹จ์ˆœํ™”ํ•˜๋Š” ๊ฒƒ์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ด€๋ฆฌ ๋˜๋Š” ์ƒ์„ฑ(sql, mongo, postgres), ์ž์ฒด ์„œ๋ฒ„ ์„ค์ •(nginx, apache), ํ•ด๋‹น ์„œ๋ฒ„ ํ˜ธ์ŠคํŒ…(aws, gcp, azure)์ž…๋‹ˆ๋‹ค.

ํ•˜์ˆ˜๋ผ๊ฐ€ ๋ถ€์กฑํ•œ ๊ฒƒ



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

๊ฐ„๋‹จํ•œ ์˜ˆ๋ฅผ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

๋‚ด ๊ฒŒ์ž„์„ ์œ„ํ•ด Hasura์—์„œ ๊ฐ„๋‹จํ•œ LeaderBoard๋ฅผ ๋งŒ๋“  ๋ฐฉ๋ฒ•:



๊ฐ„๋‹จํ•œ ๊ฒŒ์ž„์„ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. game link
React๋กœ ๋งŒ๋“  ๊ฐ„๋‹จํ•œ ์นด๋“œ ํ”Œ๋ฆฌํผ ๋ฉ”๋ชจ๋ฆฌ ๊ฒŒ์ž„์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ GITHUB repository์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์ด์ œ Hasura์—์„œ ๋‚ด heroku ๊ณ„์ •์„ ์—ฐ๊ฒฐํ•˜๋Š” postgres ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๋งŒ๋“ค๊ณ  LeaderBoard๋ผ๋Š” ํ…Œ์ด๋ธ”์„ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ๊ฒƒ๋“ค์€ ๋‚ฏ์„ค๊ฒŒ ๋“ค๋ฆด ์ˆ˜ ์žˆ์ง€๋งŒ ํ”„๋กœ๊ทธ๋žจ์„ ์„ค์น˜ํ•˜๊ธฐ ์œ„ํ•ด ์ˆ˜ํ–‰ํ•˜๋Š” ๋‹ค์Œ>๋‹ค์Œ>๋‹ค์Œ>์„ค์น˜์™€ ๊ฐ™์ด ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค.

ํ…Œ์ด๋ธ”์—๋Š” ๋ฌธ์ž์—ด์ธ Name , ์ˆซ์ž์ธ score , UUID ์ธ ID ์˜ 3๊ฐœ ์—ด์ด ์žˆ์Šต๋‹ˆ๋‹ค. is (hasura์˜ ๋์—์„œ ์ž๋™ ์ƒ์„ฑ๋จ)

์ด์ œ Leaderboard API๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ React์— ๋Œ€ํ•ด apollo client์„ ์‚ฌ์šฉํ•˜์—ฌ ์ž๋™ ์ƒ์„ฑ๋œ Graphql ์ฟผ๋ฆฌ ์กฐ๊ฐ์„ ํ˜ธ์ถœํ•˜๊ณ  ์งœ์ž”! ์šฐ๋ฆฌ๋Š” ๋ชจ๋“  ์ง€๋„์ž๋ฅผ ์–ป์Šต๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ์‹คํ–‰ํ•œ ํŠน์ • ์ฟผ๋ฆฌ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

query getLeaderBoard {
    Leaders {
      Name
      Score
    }
  }


๊ทธ๋Ÿฌ๋ฉด ์ด๋ฆ„๊ณผ ์ ์ˆ˜๊ฐ€ ํฌํ•จ๋œ ๋ฆฌ๋”๋ณด๋“œ๊ฐ€ ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค.

Hasura ๋Œ€์‹œ๋ณด๋“œ์—์„œ ์ด๋Ÿฌํ•œ ์ฟผ๋ฆฌ๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


์ด์ œ ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ๊ฒŒ์ž„์—์„œ ์ด๊ธฐ๋ฉด useEffect๊ฐ€ ๋˜ ๋‹ค๋ฅธ ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ์ด๋ฒˆ์—๋Š” ์ˆœ์œ„ํ‘œ์— ํ”Œ๋ ˆ์ด์–ด๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

mutation AddScore($Name: String!, $Score: Int!) {
    insert_Leaders_one(object: { Name: $Name, Score: $Score }) {
      id
    }
  }


ํ•˜๋‚˜๋Š” ํ”Œ๋ ˆ์ด์–ด์˜ ์ด๋ฆ„(๋กœ์ปฌ ์ƒํƒœ์˜ ์‚ฌ์šฉ์ž๋กœ๋ถ€ํ„ฐ ๊ฐ€์ ธ์˜ด)๊ณผ ํ•˜๋‚˜์˜ ์ ์ˆ˜(useContext์˜ ์ƒํƒœ๋กœ ์œ ์ง€๋จ)์ž…๋‹ˆ๋‹ค.

์ด API๋Š” ๋ฆฌ๋”๋ณด๋“œ์— ํ”Œ๋ ˆ์ด์–ด๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

์ด์ œ ์ดˆ๋ณด ์ดˆ์‹ฌ์ž์—๊ฒŒ ์ด๊ฒƒ์€ ๋งŽ์€ ๊ฒƒ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋ฐฑ์—”๋“œ ์„ค์ •, ๋ฐฐํฌ ๋ฐ ๊ธฐํƒ€ ๋งŽ์€ ์ž‘์—…์„ ๋ช‡ ์ฃผ ๋™์•ˆ ์ ˆ์•ฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด์ œ ๋‚˜๋Š” ์ดˆ๋ณด์ž๊ฐ€ ๋œ ๋‚ด ์ž์‹ ์„ ์ƒ๊ฐํ•˜๊ณ  Hasura๊ฐ€ ๋„ˆ๋ฌด ์ข‹์€ ์ œํ’ˆ์ด๋ผ๊ณ  ๋งํ•˜๊ณ  ๋” ๋งŽ์ด ์‚ฌ์šฉํ•˜๊ธฐ๋ฅผ ๊ธฐ๋Œ€ํ•ฉ๋‹ˆ๋‹ค!

์ œ ๋ง์„ ๋“ค์–ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์–ธ์ œ๋“ ์ง€ ์ œ๊ฒŒ ์—ฐ๋ฝํ•˜์…”์„œ ์ œ github์„ ๋ณด์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๋‹ค์Œ ์‹œ๊ฐ„๊นŒ์ง€...

์ข‹์€ ์›นํŽ˜์ด์ง€ ์ฆ๊ฒจ์ฐพ๊ธฐ