GitHub ์ ์ ์ ์ ๋ณด๋ฅผ ๊ทธ๋ํ ๋ทฐ๋ก ์ ๊ณตํ๋ ์ ํ๋ฆฌ์ผ์ด์ ๐
๐ฅ ์๊ฐ ( Demo )
GitHub Graph๋ GitHub API๋ฅผ ํ์ฉํด์ ๊ฒ์ํ GitHub ์ ์ ์ ์ ๋ณด๋ฅผ ๋ฆฌ์คํธ์ ๊ทธ๋ํ ๋ทฐ๋ก ํ์ธํ ์ ์๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋๋ค.
์ด ํ๋ก์ ํธ๋ ์ ๊ฐ ํ์ฌ ์ฌ์ฉํ๊ณ ์๋ ๋ฉ๋ชจ์ฑ์ธ Obsidian์ ๊ทธ๋ํ ๋ทฐ๋ฅผ ๋ณด๊ณ ์ธ์ ๊น๊ฒ ๋๊ปด์ ์ด๋ฅผ ์ ์ฉํด ๋ณผ ์์ดํ
์ ๊ณ ๋ฏผํด๋ณด๋ค๊ฐ GitHub์ ์ ์ฉํ๋ฉด ์ฌ์ฉ์์๊ฒ ์๋ก์ด ๊ฒฝํ์ ์ ๊ณตํ ์ ์์ ๊ฒ ๊ฐ์์ ์์ํ๊ฒ ๋ ํ๋ก์ ํธ์
๋๋ค. ์ด๊ธฐ์๋ GitHub์์ ์ ๊ณตํ๋ REST API๊ธฐ๋ฐ์ผ๋ก ๊ตฌํํ๋ค๊ฐ Over-Fetching ๋ฌธ์ ๋ฅผ ๊ฒช์ด๋ณด๊ณ ๋ ๋นํจ์จ์ ์ด๋ผ๊ณ ์๊ฐํด์ GraphQL๊ธฐ๋ฐ์ผ๋ก ๋ณ๊ฒฝํ์ต๋๋ค. ํ์ง๋ง GraphQL ์ฌ์ฉ์ด ์ฒ์์ด๋ค๋ณด๋ ์ ๋ฐ์ ์ธ ๋์ ๋ฐฉ์์ ์ตํ ํ์๊ฐ ์๋ค๊ณ ํ๋จํด์ ๊ณต์ ๋ฌธ์์ ๊ฐ๋จํ ๊ฐ์๋ฅผ ์ฐธ๊ณ ํด์ ์ํ ์ ํ๋ฆฌ์ผ์ด์
์ ๊ตฌํํด๋ณธ ๋ค ํ๋ก์ ํธ๋ฅผ ๋ค์ ์งํํ์ต๋๋ค. ๋ํ API ํ์
์ ์ธ์ ์๋ํ๋ฅผ ์ํด์ GraphQL Code Generateor๋ฅผ ์ฌ์ฉํ์ผ๋ฉฐ ์ด๋ฅผ ํตํด ์์ฑ๋ ํ์
์ ์ธ ํ์ผ(generated.ts)์ ํฐ ์ฉ๋ ๋๋ฌธ์ Git์ ํฌํจํ์ง๋ ์์์ต๋๋ค.
$ git clone https://github.com/Leo-Xee/github-graph.git$ npm install
# or
$ yarn installGitHub API๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์ GitHub API Docs๋ฅผ ์ฐธ๊ณ ํด์ Personal Token์ ์์ฑํฉ๋๋ค. ๋ค๋ง ์๋์ ํญ๋ชฉ์ ํ์๋ก ์ฒดํฌํด์ผํฉ๋๋ค.
repoadmin:repo_hookuserproject
Personal Token ์์ฑ์ ์๋ฃํ๋ค๋ฉด ๋ฃจํธ ์์น์ .env.example์ ์ฐธ๊ณ ํด์ .env๋ฅผ ์์ฑํ๊ณ Token๊ฐ์ ํ ๋นํฉ๋๋ค.
ํ์ฌ API ํ์
์ ๋ณด๊ฐ ํ๋ก์ ํธ์ ์กด์ฌํ์ง ์๊ธฐ ๋๋ฌธ์ ๋ค์ ๋ช
๋ น์ด๋ก ์์ฑํ๋ฉด ํ์
์ ๋ณด๋ฅผ ๊ฐ์ง src/graphql/generated.ts ๊ฐ ์์ฑ๋ฉ๋๋ค.
$ npm run generate
# or
$ yarn generate$ npm run dev
# or
$ yarn dev| Typescript | React.js | Emotion | GraphQL |
|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
| Apollo-Client | D3.js | Zustand |
|---|---|---|
![]() |
![]() |
![]() |
.
โโโ public
โโโ src
โโโ assets // ์ ์ ํ์ผ
โโโ components
โ โโโ common // ๊ณตํต ์ปดํฌ๋ํธ
โโโ graphql // graphQL ์ฟผ๋ฆฌ
โโโ hooks // ์ปค์คํ
Hooks
โโโ pages // Page ์ปดํฌ๋ํธ
โโโ shared
โ โโโ utils // ์ ํธ ํจ์
โโโ styles
โโโ types // ํ์
GitHub ์ ์ ๊ฒ์ ์์ ๊ฒ์ ๋ฐ ๋ก๋ฉ ์์ด์ฝ์ด ํ์ฑํ๋๊ณ ์ต๋ 5๊ฐ์ ์ถ์ฒ ๊ฒ์์ด๋ฅผ ๋ณด์ฌ์ค๋๋ค. ์ฌ์ฉ์๋ ์ถ์ฒ ๊ฒ์์ด๋ฅผ ํด๋ฆญํ๊ฑฐ๋ ๊ฒ์์ฐฝ์ ์ ๋ ฅํ ์์ด๋๋ก ์ ์ ๋ฅผ ๊ฒ์ํ ์ ์์ต๋๋ค. ๋ํ ์ถ์ฒ ๊ฒ์์ด๋ฅผ ์ํ API ์์ฒญ์ด ๋ฌด๋ถ๋ณํ๊ฒ ๋ฐ์ํ๋ ๋ฌธ์ ๋ฅผ ๋ฐฉ์งํ๊ณ ์ ๊ด๋ จ ํจ์์ ๋๋ฐ์ด์ค๋ฅผ ์ ์ฉํ์ต๋๋ค.
์ ์ ๊ฒ์์ด ์คํ๋๋ฉด ์ ์ ์ค์ผ๋ ํค UI๋ฅผ ๋ณด์ฌ์ค ํ์ ๊ฒ์ํ ์ ์ ์ ๊ธฐ๋ณธ ์ ๋ณด์ Followings, Followers, Repositories, StarredRepositories ๋ฆฌ์คํธ๋ฅผ Tab ๋ณ๋ก ๊ตฌ๋ถํด์ ๋ณด์ฌ์ค๋๋ค. ๊ฐ ๋ฆฌ์คํธ๋ ์ด๊ธฐ ์ง์ฐ ์๊ฐ์ ๊ณ ๋ คํด์ ์ต์ด์๋ 20๊ฐ๋ง ๋ณด์ฌ์ฃผ๊ณ ์ฌ์ฉ์๊ฐ ์คํฌ๋กค ํ๋ค๊ฐ ๋ฆฌ์คํธ์ ์ค๊ฐ์ ๋๋ฌํ๋ ๊ฒ์ Intersection Observer๋ก ๊ฐ์งํด์ ๊ทธ ๋ค์ 20๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ๋ณด์ฌ์ฃผ๋๋ก ๋ฌดํ์คํฌ๋กค์ ๊ตฌํํ์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ฆฌ์คํธ์ ์์ดํ
์ ํด๋ฆญํ๋ฉด ํด๋น ์ ์ ๋ ๋ ํฌ์งํ ๋ฆฌ GitHub ์ฃผ์๋ก ์ด๋ํ๋๋ก ํ์ต๋๋ค.
Tab ๋ณ๊ฒฝ ์์๋ Tab ์ํ๋ฅผ ์์กดํ๊ณ ์๋ ์ปดํฌ๋ํธ๋ง ๋ฆฌ๋ ๋๋ง๋๊ธฐ๋ฅผ ์ํ๊ธฐ ๋๋ฌธ์ ์ ์ญ ์ํ๊ด๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ค ํ๋์ธ Zustand๋ฅผ ์ฌ์ฉํด์ ๊ตฌํํ์ต๋๋ค.
D3.js๋ ๋ฐ์ดํฐ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก DOM์ ์กฐ์ํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด๋ฉฐ ๋ค์ํ ๋ชจ๋์ ์ ๊ณตํฉ๋๋ค. ์ด ์ค์ Force, Selections, Zoom ๋ชจ๋์ ์ฌ์ฉํด์ ๊ทธ๋ํ ๋ทฐ๋ฅผ ๊ตฌํํ์ผ๋ฉฐ Tab์ ์ํ์ ๋ฐ๋ผ์ ๋ค๋ฅธ ๊ฒฐ๊ณผ๋ฅผ ์ต๋ 100๊ฐ์ ๋ ธ๋๋ก ๋ณด์ฌ์ค๋๋ค.
๊ทธ๋ํ ๋ทฐ์ ๋์์ runForceGraph ํจ์๊ฐ ๋ด๋นํ๋ฉฐ ๋ค์ ๊ณผ์ ์ ํตํด ์คํ๋ฉ๋๋ค.
-
๋ฐ์ดํฐ ํํฐ๋ง
- GitHub Graph์ ๊ทธ๋ํ ๋ทฐ๋ Tab์ ์ํ์ ๋ฐ๋ผ ๋ค๋ฅธ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์ฌ์ค์ผํฉ๋๋ค. ๊ทธ๋์ ์ํ๋ณ๋ก ๋ฐ์ดํฐ๋ฅผ ํํฐ๋งํด์ ์๋ฎฌ๋ ์ด์
์ด ํ์๋กํ๋ ๋ฐ์ดํฐ ํ์์ผ๋ก ๊ตฌ์ฑํ๋ ์์
์
FilterDataํจ์์์ ์ฒ๋ฆฌํฉ๋๋ค. - ๊ฒ์๋ ์ฌ์ฉ์ ๋
ธ๋๋ฅผ ์ค์ฌ์ผ๋ก ๊ทธ๋ํ ๋ทฐ๋ฅผ ๋ณด์ฌ์ฃผ๊ธธ ์ํ๊ธฐ ๋๋ฌธ์
FilterDataํจ์์์ ๊ฒ์๋ ์ ์ ์ ์ ๋ณด์ธuserData๋ฅผ ์ฒซ ์์๋ก ์ฝ์ ํฉ๋๋ค.
- GitHub Graph์ ๊ทธ๋ํ ๋ทฐ๋ Tab์ ์ํ์ ๋ฐ๋ผ ๋ค๋ฅธ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์ฌ์ค์ผํฉ๋๋ค. ๊ทธ๋์ ์ํ๋ณ๋ก ๋ฐ์ดํฐ๋ฅผ ํํฐ๋งํด์ ์๋ฎฌ๋ ์ด์
์ด ํ์๋กํ๋ ๋ฐ์ดํฐ ํ์์ผ๋ก ๊ตฌ์ฑํ๋ ์์
์
-
์๋ฎฌ๋ ์ด์ ์์ฑ ๋ฐ ๋ ธ๋์ ๊ฐ์ ๋ฑ๋ก
- ์๋ฎฌ๋ ์ด์ ์ ์์ฑํ๊ณ ํํฐ๋งํ ๋ฐ์ดํฐ๋ฅผ ๋ ธ๋(Nodes), ๊ฐ์ (Links)์ผ๋ก ๋ฑ๋กํฉ๋๋ค.
svg์์ ๋ด๋ถ์ ๋ ธ๋์ ๊ฐ์ ์g์์๋ฅผ ์ฌ์ฉํด์ ๋ฐ๋ก ๊ทธ๋ฃนํํ๊ณ ๋ ธ๋๋ค ์ค์ ๊ฒ์๋ ์ฌ์ฉ์ ๋ ธ๋์ ๊ทธ ์ธ์ ๋ ธ๋๋ค์ class ์์ฑ์ผ๋ก ๊ตฌ๋ถํ ๋ค ์๋ก ๋ค๋ฅธ ์คํ์ผ์ ์ ์ฉํฉ๋๋ค.- ๋ฐ์ดํฐ๊ฐ Followings๋ Followers์ธ ๊ฒฝ์ฐ์๋ ํด๋น ์ ์ ์ Followers์ ์์ ๋ฐ๋ผ์ ๋ค๋ฅธ ์คํ์ผ์ ์ง์ ํ๊ณ ๋ฐ์ดํฐ๊ฐ Repositories๋ StarredRepositories์ธ ๊ฒฝ์ฐ์๋ ํด๋น ๋ ํฌ์งํ ๋ฆฌ์ Star ๊ฐ์์ ๋ฐ๋ผ์ ๋ค๋ฅธ ์คํ์ผ์ ์ง์ ํฉ๋๋ค.
-
Zoom ์์ฑ ๋ฐ ๋ฑ๋ก
- Zoom ๊ธฐ๋ฅ์ ์ถ๊ฐํ๊ธฐ ์ํด์ Zoom ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ
svg์์์ ์ด๋ฒคํธ๋ฅผ ๋ฑ๋กํฉ๋๋ค. - Zoom์ scale์ด ๋๋ฌด ์ปค์ง๊ฑฐ๋ ์์์ง๋ฉด ์ฌ์ฉ์ฑ์ ๋ฌธ์ ๊ฐ ์๊ธฐ ๋๋ฌธ์ ์ ์ ํ ์ต์๊ฐ๊ณผ ์ต๋๊ฐ์ ์ค์ ํฉ๋๋ค.
- Zoom ๊ธฐ๋ฅ์ ์ถ๊ฐํ๊ธฐ ์ํด์ Zoom ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ
-
Drag ์์ฑ ๋ฐ ๋ฑ๋ก
- Drag ๊ธฐ๋ฅ์ ์ถ๊ฐํ๊ธฐ ์ํด์ Drag ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ
svg์์์ ์ด๋ฒคํธ๋ฅผ ๋ฑ๋กํฉ๋๋ค.
- Drag ๊ธฐ๋ฅ์ ์ถ๊ฐํ๊ธฐ ์ํด์ Drag ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ
-
Graph ์ปดํฌ๋ํธ๊ฐ Unmount๋ ๋, ์๋ฎฌ๋ ์ด์ ์ ์ง ๋ฐ DOM ์ ๊ฑฐ
- D3.js๋ DOM์ ์ง์ ์กฐ์ํ๊ธฐ ๋๋ฌธ์ ์ํ ๊ธฐ๋ฐ์ผ๋ก DOM์ ์กฐ์ํ๋ React.js์์ ์ฌ์ฉํ ๋์๋ ๋ฌด์กฐ๊ฑด ํด๋น ์ปดํฌ๋ํธ๊ฐ Unmount ๋ ๋ ์๋ฎฌ๋ ์ด์
์ ๊ณ์ฐ์ ์ ์งํ๊ณ ์ถ๊ฐํ DOM ์์๋ฅผ ์ ๊ฑฐํด์ค์ผํฉ๋๋ค. ๊ทธ๋์ ๊ด๋ จ ํจ์๋ฅผ
runForceGraphํจ์์ ๋ฐํ๊ฐ์ผ๋ก ์์ฑํ๊ณ ์ด๋ฅผ Unmount ์์ ์คํํฉ๋๋ค.
- D3.js๋ DOM์ ์ง์ ์กฐ์ํ๊ธฐ ๋๋ฌธ์ ์ํ ๊ธฐ๋ฐ์ผ๋ก DOM์ ์กฐ์ํ๋ React.js์์ ์ฌ์ฉํ ๋์๋ ๋ฌด์กฐ๊ฑด ํด๋น ์ปดํฌ๋ํธ๊ฐ Unmount ๋ ๋ ์๋ฎฌ๋ ์ด์
์ ๊ณ์ฐ์ ์ ์งํ๊ณ ์ถ๊ฐํ DOM ์์๋ฅผ ์ ๊ฑฐํด์ค์ผํฉ๋๋ค. ๊ทธ๋์ ๊ด๋ จ ํจ์๋ฅผ
์ฐ์ธก ์๋จ์ ๋คํฌ๋ชจ๋ ๋ฒํผ์ ํด๋ฆญํด์ ์ ํ๋ฆฌ์ผ์ด์
์ ํ
๋ง๋ฅผ ๋ค๋ณ๊ฒฝํ ์ ์์ต๋๋ค. ์ด๋ฅผ ์ํด์ Emotion์ ํ
๋ง ๊ธฐ๋ฅ์ ์ฌ์ฉํด์ ํ
๋ง๋ณ ๋ณ์์ ์คํ์ผ์ theme.ts์์ ๋ฐ๋ก ์ง์ ํ๊ณ Zustand๋ฅผ ํตํด์ ์ํ๋ฅผ ๊ด๋ฆฌํ์ต๋๋ค.
- ํ๋ก์ ํธ ์ด๊ธฐ์๋ ํ์ด์ง๊ฐ ๋ง์ง ์๋ค๋ณด๋ ๋ผ์ฐํฐ์ ํ์์ฑ์ ๋๋ผ์ง ๋ชปํ๋๋ฐ ๊ฒ์๋ ์ ์ ์ ์ฃผ์๋ก ์ง์ ์ ๊ทผํ๊ฑฐ๋ ๊ฒ์๋ ํ์ด์ง๋ฅผ ๊ณต์ ํ ๋ ์ ์ฉํ ๊ฒ ๊ฐ์์ ๋ผ์ฐํฐ๋ฅผ ์ฌ์ฉํ๊ธฐ๋ก ๊ฒฐ์ ํ๋ค. ๊ทธ ๋๋ถ์
username์ URL์ ํ๋ผ๋ฏธํฐ๋ก ๊ด๋ฆฌํ ์ ์์ด์ ์ค๋ณต๋๋ ๋ก์ง์ ์กฐ๊ธ ์ค์ผ ์ ์์๋ ๊ฒ ๊ฐ๋ค.
-
UserDetailํ์ด์ง ๋ด๋ถ์์Search์Profile์ปดํฌ๋ํธ ๋ฅผ ์ ์ธํGraph,ListContainer,Tab์ปดํฌ๋ํธ๊ฐ Tab์ ์ํ์ ๋ฐ๋ผ์ ๋ณ๊ฒฝ๋์ด์ผ ํ์๋ค. ์ด๋ฅผ ์ํด์ Context API๋ฅผ ์ฌ์ฉํ ์ง ์ํ๊ด๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ ์ง ๊ณ ๋ฏผํ๋๋ฐ Tab ์ํ์ ๋ฐ๋ผ์ ์ํ๋ ์ปดํฌ๋ํธ๋ง ๋ฆฌ๋ ๋๋งํ๊ธธ ์ํ๊ณ ์ ์ญ์ผ๋ก ๊ด๋ฆฌํด์ผํ ์ํ๊ฐ ๋ง์ง ์๋ค๊ณ ํ๋จํด์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํ๋ณด ์ค ๊ฐ์ฅ ๊ฐ๋ฒผ์ด Zustand๋ฅผ ์ ํํ๋ค. -
๋ฌผ๋ก Context API๋ฅผ ์ฌ์ฉํ๊ณ ์ปดํฌ๋ํธ ์ต์ ํ ์์ ์ ํด์ค๋ค๋ฉด ๋์ผํ ํจ๊ณผ๋ฅผ ๋ผ ์ ์๊ฒ ์ง๋ง ๊ทธ๋ ๊ฒ๊น์ง ํด์ ์ฌ์ฉํด์ผํ ์ด์ ๋ฅผ ์ฐพ์ง ๋ชปํ๋ค. ํ์ง๋ง ํ๋ก๋ํธ์ ์ค์ผ์ผ์ด ์ํฐํ๋ผ์ด์ฆ๊ธ์ผ๋ก ์ปค์ง๋ค๋ฉด ํน์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ํ ์ถ๊ฐ์ ์ธ ์์กด์ฑ์ ์ฝ๋์ ๋ณต์ก๋๋ฅผ ์ ๋ฐํ๊ธฐ ๋๋ฌธ์ Context API๋ ์ ๋๋ก๋ ์ํ๊ด๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ ํธ์ด ๋์ ๊ฒ ๊ฐ๋ค๋ ์๊ฐ๋ ๋ค์๋ค.
๐ค ๊ฒ์ํ ์ ์ ๋ฐ์ดํฐ์ Tab๋ณ ๋ฆฌ์คํธ ๋ฐ์ดํฐ๋ฅผ ์ธ์ ์ผ๋ง๋ ํจ์นญํด์ผํ ๊น?
-
GitHub Graph์์ ์ฌ์ฉ๋๋ ๋ฐ์ดํฐ์ ์ข ๋ฅ๋ ํฌ๊ฒ ๊ฒ์ํ ์ ์ ๋ฐ์ดํฐ์ Tab ์ํ๋ณ ๋ฆฌ์คํธ ๋ฐ์ดํฐ๋ก 2๊ฐ์ง์ด๋ค. ํ์ง๋ง GraphQL ์ฟผ๋ฆฌ๋ฅผ ์ด๋ป๊ฒ ๊ตฌ์ฑํด์ ์ธ์ ์ผ๋ง๋ ํจ์นญํด์ผํ ์ง์ ๋ํด์ ๊ณ ๋ฏผ์ด ๋ง์๋ค. ๊ทธ๋ฌ๋ค๊ฐ ๊ฒ์ํ ์ ์ ๋ฐ์ดํฐ์ ๊ฒฝ์ฐ์๋ ์ ์ ์ ๊ธฐ๋ณธ ๋ฐ์ดํฐ์ followings, followers, repositories, starredRepositories์ count๋ง ์ฟผ๋ฆฌํ๊ณ
UserDetailํ์ด์ง๊ฐ ๋ง์ดํธ๋ ๋ ํจ์นญํ๋ ๊ฒ์ผ๋ก ๊ฒฐ์ ํ๋ค. ๊ทธ๋ฆฌ๊ณ Tab๋ณ ๋ฆฌ์คํธ ๋ฐ์ดํฐ๋ ๋ฌดํ์คํฌ๋กค๋ก ๋ณด์ฌ์ค ๊ฒ์ด๊ธฐ ๋๋ฌธ์ Tab ๋ณ๋ก ์ฟผ๋ฆฌ๋ฅผ ๊ตฌ์ฑํด์ ํจ์นญํ๋ ๊ฒ์ผ๋ก ๊ฒฐ์ ํ๋ค. -
ํ์ง๋ง
ListContainer์ปดํฌ๋ํธ์์ ๊ฐ๊ฐ์ Tab ๋ณ ๋ฆฌ์คํธ๋ฅผ ๋ณด์ฌ์ฃผ๊ธฐ ์ํด์ ์ปดํฌ๋ํธ๋ฅผ ์ด๋ป๊ฒ ํจ์จ์ ์ผ๋ก ๋ถ๋ฆฌํ ์ ์์์ง์ ๋ํ ๋ ๋ค๋ฅธ ๊ณ ๋ฏผ์ด ์๊ฒผ๋ค. ๊ทธ๋์ ์ด๊ธฐ์๋ Tab ๋ณ๋ก ์์ดํ ์ ๋ทฐ๊ฐ ๋น์ทํ๋ค๊ณ ์๊ฐ๋์ ๋ฐ๋ณต๋๋ ์ฝ๋๋ฅผ ์ค์ด๊ณ ์ListContainer์ปดํฌ๋ํธ์์ Tab ๋ณ ๋ฆฌ์คํธ๋ฅผ ๋ชจ๋ ์ฒ๋ฆฌํด์ฃผ๋ ค๊ณ ํ๋ค๊ฐ ์ฝ๋ ๊ฐ๋ ์ฑ์ด ๋งค์ฐ ๋จ์ด์ง๋ ๋ฌธ์ ๊ฐ ์๊ฒผ๋ค. ๊ทธ๋์ ์ฝ๋์ ๋ฐ๋ณต์ด ์กฐ๊ธ ์๊ธฐ๋๋ผ๋ ๋ถ๋ฆฌํ๋ ํธ์ด ๋์ ๊ฑฐ๋ผ๊ณ ํ๋จํ๊ณ ๊ฐ๊ฐ์ ๋ฆฌ์คํธ๋ฅผ ๋ฐ๋ก ๊ตฌํํ๋ค. ์ฝ๋ ๊ฐ๋ ์ฑ๊ณผ ๋ฐ๋ณต ์ ๊ฑฐ๋ ํธ๋ ์ด๋ ์คํ ๊ด๊ณ์ ์๋ ๊ฒ ๊ฐ์๋ฐ ์ ์ ํ ๊ท ํ์ ์ก๋ ๊ฒ์ด ์ค์ํ๋ค๊ณ ๋๊ผ๋ค.
-
ํ์ด์ง๋ค์ด์ ๊ณผ ๋ฌดํ์คํฌ๋กค ๊ธฐ๋ฅ์ ์ฒ์ ๊ตฌํํ๋ ๊ฒ์ ์๋์ง๋ง ์ด๋ฅผ GraphQL๊ณผ Apollo-Client ๊ธฐ๋ฐ์์ ๊ตฌํํ๋ ๊ฒ์ ์ฒ์์ด์๋ค. ๊ทธ๋์ ๊ณต์๋ฌธ์์ ๊ฒ์ํ๋ค ์ฐพ์ ์์์ ๋ณด๊ณ ๊ตฌํํ๋ค๊ฐ
fetchMore์ธ์๋กupdateQuery๋ฅผ ์ฌ์ฉํด์ ์บ์ฑ๋ ๋ฐ์ดํฐ์ ์๋ก์ด ๋ฐ์ดํฐ๋ฅผ ๋ถ์ฌ์ค ๋ ์ ์ ๋์ํ์ง ์๋ ๋ฌธ์ ๊ฐ ์๊ฒผ๋ค. ๊ทธ๋์ ๊ตฌ๊ธ๋งํ๋ ์ค ๋์ด์updateQuery๋ก ์ฌ์ฉํ์ง๋ ์๋๋ค๋ ๊ธ์ ๋ณด๊ณapollo.ts์InMemoryCache์ ๊ด๋ จ ๋ก์ง์ ์์ฑํ๋ ๊ฒ์ผ๋ก ๋ณ๊ฒฝํ๋ ์ ๋์ํ๋ค. ์ฐธ๊ณ ๋ก ํ์ด์ง๋ค์ด์ ์๋ ํ์ด์ง ๊ธฐ๋ฐ๊ณผ ์ปค์ ๊ธฐ๋ฐ์ด ์๋๋ฐ ์ปค์ ๊ธฐ๋ฐ์ด ์กฐํ ์์ ์ค๋ณต ๋ฐ์ดํฐ๋ฅผ ๋ณด์ฌ์ฃผ๋ ๋ฌธ์ ๊ฐ ์๊ณ GitHub API๊ฐ Relay ์คํ์ผ์ ์ปค์ ๊ธฐ๋ฐ ํ์ด์ง๋ค์ด์ ์ ์ง์ํ๊ธฐ ๋๋ฌธ์ ์ปค์ ๊ธฐ๋ฐ ํ์ด์ง๋ค์ด์ ์ ์ฌ์ฉํ๋ค. -
ํ์ด์ง๋ค์ด์ ์ ๋ต์๋ ํฌ๊ฒ 2๊ฐ์ง๊ฐ ์๋ค. offset ๊ธฐ๋ฐ๊ณผ ์ปค์ ๊ธฐ๋ฐ์ด๋ค. ๋ฌดํ ์คํฌ๋กค์ ์ ์ฉํ ์ปค์ ๊ธฐ๋ฐ์ผ๋ก ์ฌ์ฉํ๊ธฐ๋ก ๊ฒฐ์ ํ๋ค. ์ ์ ์ followings, followers, repos, stars์ ๋ฆฌ์คํธ๋ฅผ ๊ฐ๊ฐ ํ์ด์ง๋ค์ด์ ๋ฐ ์บ์ ๊ด๋ฆฌ๋ฅผ ํด์ผํ๋๋ฐ ์ด๊ฑธ ์ด๋ป๊ฒ ๋ฐ๋ก ๊ตฌ๋ถํด์ ๊ด๋ฆฌํ ์ง๊ฐ ๊ณ ๋ฏผ์ด์๋ค.
- D3.js์ ๋์ ๋ฐฉ์์ ์ดํดํ๊ธฐ๊น์ง๋ ๊ฝค ์๊ฐ์ด ๊ฑธ๋ ธ๋ค. ๊ฒ๋ค๊ฐ GitHub Graph์์ ์ฌ์ฉํ๋ ค๋
Force๋ชจ๋์ ๋ค๋ฅธ ๋ชจ๋๊ณผ ๋์๋ฐฉ์์ด ๋งค์ฐ ๋ฌ๋๊ณ ๋ ํผ๋ฐ์ค๋ ๋ง์ง ์์์ผ๋ฉฐ SVG์ ์ต์ํ ํธ๋ ์๋์๋ค. ๊ทธ๋์ ์์ ํ๋ก์ ํธ๋ฅผ ํด๋ก ํด๋ณด๋ฉฐ ์ตํ๋ณผ ํ์์ฑ์ ๋๋ผ๊ณ ์์๋๋ฐ ์ด ์์ ์ ๊ณต์๋ฌธ์ ๋ฐ ๋ฒ์ญ๋ ๋ฌธ์๊ฐ D3.js๋ฅผ ์ดํดํ๋๋ฐ ํฐ ๋์์ด ๋์๊ณ SVG๋ MDN์ ๋ด์ฉ์ ์์๋ก ๋ณด๋ฉด์ ์งํํด๋๊ฐ๋ค.
- ๊ฒ์์ฐฝ์ ๊ฒ์์ถ์ฒ ๊ธฐ๋ฅ์ ์ํด์ ์ฌ์ฉ์๊ฐ ์ ๋ ฅํ ๊ฐ๋ง๋ค API ์์ฒญํด์ ๋ฐ์ดํฐ๋ฅผ ๋ฟ๋ ค์ค์ผํ๋๋ฐ ๊ฐ๋ณ ํ์ดํ๋ง๋ค ์์ฒญํ๊ธฐ์๋ ์ฑ๋ฅ์ ํฐ ๋ฌธ์ ๊ฐ ์๊ธฐ ๋๋ฌธ์ lodash์ ๋๋ฐ์ด์ค๋ฅผ ์ ์ฉํ๋๋ฐ ์ ๋๋ก ๋์ํ์ง ์์๋ค. ๊ทธ๋ฌ๋ค ์๊ฐํด๋ณด๋ useCallback์ผ๋ก ํด๋น ํจ์๋ฅผ ๊ฐ์ธ์ฃผ์ง ์์์ ๋ฆฌ๋ ๋๋ง ์๋ง๋ค ํญ์ ๋ค๋ฅธ ํจ์๋ก ์ธ์ํด์ ๋ฐ์ํ๋ ๋ฌธ์ ์๋ค. ๊ทธ๋์ useCallback์ผ๋ก ๊ฐ์ธ์ฃผ๋ ์ ์ ๋์ํ์ง๋ง ์ฝ๋๊ฐ ์๊ฐ๋ณด๋ค ๊น๋ํ์ง ๋ชปํด์ ์ฐพ์๋ณด๋ ์ปค๋ง์ผ๋ก ์ฒ๋ฆฌํ๋ ์์ ๊ฐ ์์ด์ ์ถํ์ ์ปค๋ง์ ๊ณต๋ถํด๋ณด๊ณ ๋ฆฌํฉํ ๋ง ํด๋ด์ผ๊ฒ ๋ค๊ณ ๋๊ผ๋ค.
โ ๏ธ ๊ฒ์๋ ์ ์ ๋ฅผ ์ฃผ์๋ก ์ ๊ทผํ๊ฑฐ๋ ์๋ก๊ณ ์นจํ ๋ ํ๋ฆฌ์ปค ํ์์ด ๋ฐ์ํ๋ ๋ฌธ์
UserDetailํ์ด์ง์์๋ ์ ์ ๊ฐ ์ด๋ฏธ ๊ฒ์๋ ์ํ์ด๊ธฐ ๋๋ฌธ์ ๊ฒ์์ฐฝ์ ๊ฒ์๋ ์ ์ ์์ด๋๊ฐ ํ์๋์ด์ผํ๋ค. ์ผ๋ฐ์ ์ผ๋ก๋ ๋ฌธ์ ๊ฐ ์๋๋ฐ ํ์ด์ง๋ฅผ ์๋ก๊ณ ์นจํ๊ฑฐ๋ ํด๋น ํ์ด์ง๋ก ์ง์ ์ ๊ทผํ๋ ๊ฒฝ์ฐ์ ๊ฒ์์ฐฝ์ ์ ์ ์์ด๋๊ฐ ์ ๊น ๋น์ด์๋ค๊ฐ ๋ค์ ํ์๋๋ ๋ฌธ์ ์ธ ์ผ๋ช ํ๋ฆฌ์ปค ํ์์ด ์๊ฒผ๋ค. ์์ธ์ ์ฐพ์๋ณด๋ ๊ฒ์์ฐฝ์input์ URL๋ก๋ถํฐuseParams๋ฅผ ์ฌ์ฉํด ๋ฐ์์์useEffect๋ด๋ถ์์setInput์ ํตํด์ ๋ณ๊ฒฝํด์คฌ๊ธฐ ๋๋ฌธ์ด์๋ค. ์ด๋ฌ๋ฉด ๋ง์ดํธ ์ดํ์ ๋ฆฌ๋ ๋๋ง์ด ์ผ์ด๋๋๋ฐ ๊ทธ ์ฌ์ด์ ๊ฒ์์ฐฝ์ ๋น๊ฐ์ด ๋ณด์ฌ์ง๋ ๋ฌธ์ ๊ฐ ์๊ธฐ๋ ๊ฒ์ด๋ค. ์ด ๋ฌธ์ ์ ํด๊ฒฐ์ ์ํด์ ๋ง์ดํธ ์ด์ ์ ์คํ๋๋useLayoutEffect๋ฅผ ์ฌ์ฉํด์ ์์ ํ๋ค๊ฐURL์ ํ๋ผ๋ฏธํฐ๊ฐ ์์ ๊ฒฝ์ฐ์๋ ๊ทธ ๊ฐ์input์ํ๊ฐ์ ๋ํดํธ๋ก ์ฃผ๋ ๊ฒ์ด ํจ์ฌ ๊ฐ๊ฒฐํ ๊ฒ ๊ฐ์์ ์ฌ์์ ํ๋ค.
- GraphQL์ ์ฒ์ ์ฌ์ฉํ๋ ํ๋ก์ ํธ๋ผ์ Inline Fragment๋ผ๋ ๊ฐ๋ ์ ์์ง ๋ชปํ๋ค. ๊ทธ๋์ ์ ๋์จ ํ์ ์ ๋ฐฐ์ด๋ก ์ด๋ฃจ์ด์ง ์ถ์ฒ ๊ฒ์์ด ๋ฐ์ดํฐ์ ์ฟผ๋ฆฌ๋ฅผ ์์ฑํ ๋์ ์๋ต์ผ๋ก ๋ฐ์ ๋ฐ์ดํฐ๋ฅผ map์ผ๋ก ๋ฟ๋ ค์ค ๋ ์ํ์ฐฉ์ค๊ฐ ์์๋ค. ํด๊ฒฐ์ ์ํด ๊ณต์๋ฌธ์๋ฅผ ์ดํด๋ณด๋ ์ฟผ๋ฆฌ๋ฅผ ์ํด ์ ๋์จ ํ์ ์ ์ ๊ทผํ ๋๋ Inline Fragment๋ฅผ ์ฌ์ฉํ๋ผ๋ ๋ด์ฉ์ด ์์ด์ ์ด๋ฅผ ์ฐธ๊ณ ํ๊ณ map ์ฌ์ฉ ์์๋ ํ์ ๊ฐ๋๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ผ๋ก ํด๊ฒฐํ๋ค.
- ์ฌ์ฉ์์ ๋ฆฌ์คํธ ๋ทฐ์ ๊ทธ๋ํ ๋ทฐ๊ฐ ํ์๋ก ํ๋ ๋ฐ์ดํฐ์ ๊ตฌ์ฑ์์์ ๊ฐ์๊ฐ ๋ฌ๋๊ธฐ ๋๋ฌธ์ ๊ฐ๊ฐ ๋ค๋ฅธ ์ฟผ๋ฆฌ๋ฅผ ๊ตฌ์ฑํด์ผํ๋ค. ํ์ง๋ง ๋์ผํ ์ฌ์ฉ์์ ๋ํ ์์ฒญ์ด๊ธฐ ๋๋ฌธ์ Apollo-Client๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ด๋ค์ ๋ฐ์ดํฐ๋ฅผ ๋์ผํ ํ๋๋ก ๊ฐ์ฃผํด์ ์บ์๋ฅผ ๋ฎ์ด์ฐ๊ธฐ ๋๋ฌธ์ ์ ์์ ์ผ๋ก ๋์ํ์ง ์์๋ค. ๊ทธ๋์ ์บ์๋ฅผ ๋ฐ๋ก ๊ด๋ฆฌํ ํ์๊ฐ ์์๋๋ฐ ๊ณต์๋ฌธ์์ keyArgs๋ถ๋ถ์ ์ฝ์ด๋ณด๋
keyArgs๋ผ๋ ๋ฐฐ์ด์ ์ฌ์ฉํด์ ๋์ผํ ํ๋์ ์บ์๋ฅผ ๋ถ๋ฆฌํ ์ ์์์ ํ์ธํ๋ค. ๋์ ๊ฒฝ์ฐ์๋ ๋ฆฌ์คํธ ๋ทฐ์ ๊ทธ๋ํ ๋ทฐ๊ฐ ์์ฒญํ๋ ๋ฐ์ดํฐ์ ๊ฐ์์ ๋ํ ์ธ์๊ฐ ๋ฌ๋ผ์ key๊ฐ์ผ๋กfirst๋ผ๋ ์ธ์๊ฐ์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ผ๋ก ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ค.
- ๊ทธ๋ํ ๋ทฐ์์ ๊ฒ์๋ ์ฌ์ฉ์์ ์๋ฐํ๋ฅผ ์ํด
svg์ ์ด๋ฏธ์ง๋ฅผ ์ฝ์ ํ๊ณborder-radius๋ก ์คํ์ผ์ ์ฃผ๊ณ ์ถ์๋๋ฐ ์ผ๋ฐ์ ์ธ ๋ฐฉ๋ฒ์ผ๋ก๋ ์ ์ฉ๋์ง ์์๋ค. ๊ทธ๋์ ๊ตฌ๊ธ๋ง์ ํ์ฐธํ๋ค๊ฐ ์ด ๊ธ์ ๋ณด๊ณforeignObject๋ฅผ ์ฌ์ฉํ๋ฉด ๊ฐ๋ฅํ๋ค๋ ๊ฒ์ ํ์ธํ๊ณ ํด๋น ํ๊ทธ์์imgํ๊ทธ๋ฅผ ์ฝ์ ํ๊ณ ์คํ์ผ์ ์ฃผ๋ ๋ฐฉ์์ผ๋ก ํด๊ฒฐํ๋ค.
-
ํ์ด์ดํญ์ค์์ ๋ ธ๋์
alignment-baseline์์ฑ์ด ๋์ํ์ง ์์์ ๋ ธ๋ ์์ ์๋ ํ ์คํธ์ ๋ ์์ด์์ด ๊นจ์ง๋ ๋ฌธ์ ๊ฐ ์์๋ค. ๊ทธ๋์ ๊ณต์๋ฌธ์์ ์คํ์ค๋ฒํ๋ก์ฐ๋ฅผ ์ฐพ์๋ณด๋alignment-base๋์dominant-baseline์ ์ฌ์ฉ์ ๊ถ์ฅํ๋ ๋ด์ฉ์ ๋ณด๊ณ ๋ ์์ ํด์ ํด๊ฒฐํ๋ค. -
์ฌํ๋ฆฌ์์ ๊ฒ์๋ ์ฌ์ฉ์์ ๋ ธ๋ ์ด๋ฏธ์ง์
border-radius์์ฑ์ด ๋์ํ์ง ์๋ ๋ฌธ์ ๊ฐ ์์๋ค. ๊ธฐ์กด์๋ ํด๋น ์์ฑ์ด ์ด๋ฏธ์ง์ ์์ ์๋ฆฌ๋จผํธ์ธforeignObject์ ์ ์ฉ๋์ด ์์๋๋ฐ ์ด๋ฅผxhtml:img์๋ฆฌ๋จผํธ์ ์ง์ ์ ์ฉํด์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ค.











