https://github.com/git-marvel/commit-guardians-client
๐
์ปค๋ฐ ํ๋ฆฌํฐ๋ฅผ ์ ์๋ก, ๋ฑ์ง๋ก ์๋ํ์ธ์! Show off your commit quality with scores and a badge!
https://github.com/git-marvel/commit-guardians-client
firebase-storage github-api javascript react repository-badge zustand
Last synced: 4 months ago
JSON representation
๐ ์ปค๋ฐ ํ๋ฆฌํฐ๋ฅผ ์ ์๋ก, ๋ฑ์ง๋ก ์๋ํ์ธ์! Show off your commit quality with scores and a badge!
- Host: GitHub
- URL: https://github.com/git-marvel/commit-guardians-client
- Owner: git-marvel
- Created: 2024-11-01T12:55:18.000Z (about 1 year ago)
- Default Branch: dev
- Last Pushed: 2025-04-24T04:53:49.000Z (9 months ago)
- Last Synced: 2025-04-24T05:28:53.447Z (9 months ago)
- Topics: firebase-storage, github-api, javascript, react, repository-badge, zustand
- Language: JavaScript
- Homepage: https://commitguardians.site
- Size: 24.7 MB
- Stars: 2
- Watchers: 0
- Forks: 1
- Open Issues: 1
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# Commit Guardians
## ํ๋ก์ ํธ ์๊ฐ

## ๋ชฉ์ฐจ
- [ํ๋ก์ ํธ ๋ฑ์ฅ ๋ฐฐ๊ฒฝ](#%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EB%93%B1%EC%9E%A5-%EB%B0%B0%EA%B2%BD)
- [๊ธฐ๋ฅ](#%EA%B8%B0%EB%8A%A5)
- [1. ๋ฉ์ธ ํ์ด์ง](#1-%EB%A9%94%EC%9D%B8-%ED%8E%98%EC%9D%B4%EC%A7%80)
- [2. ์ปค๋ฐ ๋ฑ์ง ํ์ด์ง](#2-%EC%BB%A4%EB%B0%8B-%EB%B1%83%EC%A7%80-%ED%8E%98%EC%9D%B4%EC%A7%80)
- [3. ์ปค๋ฐ ๋ถ์ ๊ฒฐ๊ณผ ํ์ด์ง](#3-%EC%BB%A4%EB%B0%8B-%EB%B6%84%EC%84%9D-%EA%B2%B0%EA%B3%BC-%ED%8E%98%EC%9D%B4%EC%A7%80)
- [๊ธฐ์ ์คํ](#%EA%B8%B0%EC%88%A0-%EC%8A%A4%ED%83%9D)
- [๐ค ๊ณ ๋ฏผํ๊ณ ๊ฒฐ์ ํ ๋ถ๋ถ](#1-%EB%8D%B0%EC%9D%B4%ED%84%B0-%ED%9A%A8%EC%9C%A8%EC%84%B1-vs-%EC%82%AC%EC%9A%A9%EC%9E%90-%EA%B2%BD%ED%97%98-rest-api-%EC%84%A0%ED%83%9D)
- [1. ๋ฐ์ดํฐ ํจ์จ์ฑ vs ์ฌ์ฉ์ ๊ฒฝํ: REST API ์ ํ](#1-%EB%8D%B0%EC%9D%B4%ED%84%B0-%ED%9A%A8%EC%9C%A8%EC%84%B1-vs-%EC%82%AC%EC%9A%A9%EC%9E%90-%EA%B2%BD%ED%97%98-rest-api-%EC%84%A0%ED%83%9D)
- [2. GitHub API Rate Limit ํํผ๋ฅผ ์ํ ํ ํฐ ๋กํ
์ด์
๊ตฌํ](#2-github-api-rate-limit-%ED%9A%8C%ED%94%BC%EB%A5%BC-%EC%9C%84%ED%95%9C-%ED%86%A0%ED%81%B0-%EB%A1%9C%ED%85%8C%EC%9D%B4%EC%85%98-%EA%B5%AC%ED%98%84)
- [3. ๊นํ๋ธ ๋ก๊ทธ์ธ ๊ธฐ๋ฅ์ ํ์ ๋์
๊ณผ ๋น๋ก๊ทธ์ธ ์ฌ์ฉ์ ์ ๊ทผ์ฑ ํฅ์](#3-%EA%B9%83%ED%97%88%EB%B8%8C-%EB%A1%9C%EA%B7%B8%EC%9D%B8-%EA%B8%B0%EB%8A%A5%EC%9D%98-%ED%95%84%EC%88%98-%EB%8F%84%EC%9E%85%EA%B3%BC-%EB%B9%84%EB%A1%9C%EA%B7%B8%EC%9D%B8-%EC%82%AC%EC%9A%A9%EC%9E%90-%EC%A0%91%EA%B7%BC%EC%84%B1-%ED%96%A5%EC%83%81)
- [4. ๋์ฉ๋ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ณ ์ฒ๋ฆฌ: IndexedDB ์ฌ์ฉ](#4-%EB%8C%80%EC%9A%A9%EB%9F%89-%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%A5%BC-%EC%A0%80%EC%9E%A5%ED%95%98%EA%B3%A0-%EC%B2%98%EB%A6%AC-IndexedDB-%EC%82%AC%EC%9A%A9)
- [5. ๋ง์ ์ปดํฌ๋ํธ๋ค์ ํ๋ฉด์ ๋ ๋๋งํ๊ธฐ ์ํ virtual scroll ๋์
](#5-%EB%A7%8E%EC%9D%80-%EC%BB%B4%ED%8F%AC%EB%84%8C%ED%8A%B8%EB%93%A4%EC%9D%84-%ED%99%94%EB%A9%B4%EC%97%90-%EB%A0%8C%EB%8D%94%EB%A7%81%ED%95%98%EA%B8%B0-%EC%9C%84%ED%95%9C-virtual-scroll-%EB%8F%84%EC%9E%85)
- [6. ์ปค๋ฐ ๋ถ์์ ์ํ ์ปค๋ฐ ํ์
๊ธฐํ](#6-%EC%BB%A4%EB%B0%8B-%EB%B6%84%EC%84%9D%EC%9D%84-%EC%9C%84%ED%95%9C-%EC%BB%A4%EB%B0%8B-%ED%83%80%EC%9E%85-%EA%B8%B0%ED%9A%8D)
- [ํ์
](#%ED%98%91%EC%97%85)
- [1. ๊น ์ปค๋ฐ ์ปจ๋ฒค์
](#1-%EA%B9%83-%EC%BB%A4%EB%B0%8B-%EC%BB%A8%EB%B2%A4%EC%85%98)
- [ํ์ ์๊ฐ](#%ED%8C%80%EC%9B%90-%EC%86%8C%EA%B0%9C)
## [ํ๋ก์ ํธ ๋ฑ์ฅ ๋ฐฐ๊ฒฝ](#๋ชฉ์ฐจ)
**ํ์ฌ ๊นํ ๋ ํฌ์งํ ๋ฆฌ์ ์ปค๋ฐ๋ค์ ๊ณผ์ฐ ๊ฑด๊ฐํ ์ํ์ผ๊น์?**
์ด ์ง๋ฌธ์์ ์์๋ Commit Guardians ํ ํ๋ก์ ํธ๋, **์ปค๋ฐ ๋ฉ์์ง์ ์ฝ๋ ๋ณ๊ฒฝ ๊ฐ์ ์ผ์น์ฑ์ ์ ๊ฒํ๊ณ , ๋ณด๋ค ๋์ ์ปค๋ฐ ๋ฌธํ๋ฅผ ํ์ฑํ๊ธฐ ์ํด ๋ฑ์ฅ**ํ๊ฒ ๋์์ต๋๋ค.
๊ฐ๋ฐ์์ ์ผ์์ ์ฝ๋๋ง ์์ฑํ๋ ๊ฒ์ด ์๋ **โ๊ธฐ๋กโ์ ๋จ๊ธฐ๊ณ ๊ณต์ ํ๋ ๊ณผ์ ๊น์ง๋ ํฌํจ**๋๋ค๊ณ ์๊ฐํฉ๋๋ค. ํนํ ํ ํ๋ก์ ํธ๋ ๊ฐ์ธ ํ๋ก์ ํธ ๋ฟ๋ง ์๋๋ผ ์คํ์์ค์์๋ **์ปค๋ฐ ๋ฉ์์ง**๋ ์์
ํ๋ฆ์ ์ดํดํ๊ณ ์ง๋ ์์
์ ๋๋์๋ณด๋ฉฐ ํ๋ก์ ํธ์ ๋งฅ๋ฝ์ ํ์
ํ๋ ๋ฐ์ ์ค์ํ ์ญํ ์ ํ๊ณ ์์ต๋๋ค.
์ปค๋ฐ๋ฉ์์ง๋ ์ฝ๋๊ฐ ์ด๋ป๊ฒ ๋ณ๊ฒฝ๋์๋์ง ์์ฝํด ์ค ๋ฟ๋ง ์๋๋ผ, โ์โ ๋ณ๊ฒฝ๋์๋์ง๋ฅผ ์ค๋ช
ํฉ๋๋ค. ๊ทธ๋์ ์ฝ๋ ๋ฆฌ๋ทฐ๋ ๋๋ฒ๊น
์ ํ ๋ ์ฝ๋์ ๋ณ๊ฒฝ ์ฌํญ์ ๋น ๋ฅด๊ฒ ํ์
ํ ์ ์๋ ์ค์ํ ์ญํ ์ ํ๊ณ ์์ต๋๋ค. ๊ฐ ์ปค๋ฐ ํ์
์ ๋ฐ๋ผ ๋ฆด๋ฆฌ์ฆ ๋
ธํธ๋ฅผ ์๋์ผ๋ก ์์ฑํ ์๋ ์์ด์ ์์
๋จ์๋ฅผ ์๊ฒ ์ชผ๊ฐ์ด ์ปค๋ฐ์ ํ๋ ๊ฒ์ ํ์
์ ์์ด์ ์ข์ ์ต๊ด์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ๊ทธ๋ ๊ธฐ์ **์ปค๋ฐ ๋ฉ์์ง์ ๋ฐ๋ฅธ ์ฝ๋ ์์ ์ด ์๋ก ์ผ์นํด์ผ** ํฉ๋๋ค.
์ผ๋ฐ์ ์ผ๋ก ์ข์ ์ปค๋ฐ ๋ฉ์์ง์ ๋ด์ฉ์ **์๋ฏธ ์๋ ์ปค๋ฐ ๋ฉ์์ง๋ฅผ ์ฐ๋ ๊ฒ**์ด๋ฉฐ, ์ต๋ํ ๋
ผ๋ฆฌ์ ์ธ ๋จ์๋ก ๋ณ๊ฒฝ ์ฌํญ์ ๋๋๋ ๊ฒ์
๋๋ค. ๋
ผ๋ฆฌ ๋จ์๋ณ๋ก ๋๋์ด ์ปค๋ฐ์ ํ๋ ๊ฒ์ด ๊ฐ๋ณ ๋ณ๊ฒฝ ์ฌํญ์ผ๋ก ๋๋๋ฆฌ๊ธฐ ํธํ๊ณ ์ด๋ ๋ถ๋ถ์์ ์ค๋ฅ๊ฐ ๋ฌ๋์ง ํ์ธํ๊ธฐ ์์ํ๊ธฐ ๋๋ฌธ์
๋๋ค. ์ด๋ฌํ ๊ผผ๊ผผํ ์ปค๋ฐ๋ค์ด ๋ชจ์ฌ์ ์ ์ง๋ณด์๊ฐ ์ฉ์ดํ๊ณ ํ์
ํ๊ธฐ ์ข์ ํ๋ก์ ํธ๋ฅผ ๋ง๋๋ ๊ธฐ์ด๊ฐ ๋ ๊ฒ์ผ๋ก ์๊ฐํฉ๋๋ค.
## [๊ธฐ๋ฅ](#๋ชฉ์ฐจ)
### [1. ๋ฉ์ธ ํ์ด์ง](#๋ชฉ์ฐจ)
**1-1. ๊นํ๋ธ ๋ก๊ทธ์ธ**
- ๋ก๊ทธ์ธ ์ ์ฌ์ฉ์๊ฐ ์ํ๋ ๋ ํฌ์งํ ๋ฆฌ URL ์
๋ ฅ์ด ๊ฐ๋ฅํฉ๋๋ค.
- ๋ก๊ทธ์ธ ์ ์๋ ์์ ๋ ํฌ์งํ ๋ฆฌ๋ก ์๋น์ค๋ฅผ ๋ฏธ๋ฆฌ ์ด์ฉํด ๋ณผ ์ ์์ต๋๋ค.
**1-2. ์๋น์ค ์ด์ฉ ๊ฐ๋ฅ ์ฌ๋ถ ํ์ธํ๊ธฐ**
- ํค๋์ ์ฐ์ธก ์๋จ ๋ถ๋ถ์๋ Github API์ ์ํ๋ฅผ ๋ณด์ฌ์ฃผ๊ณ , ์ํ๊ฐ ์ ์์ธ ๊ฒฝ์ฐ์๋ง URL ์
๋ ฅ(์ปค๋ฐ ๋ถ์)์ด ๊ฐ๋ฅํฉ๋๋ค.
- Github API status ๋ฒํผ ์ ํ ์ ์์ธ ๋ด์ญ์ ๋ณผ ์ ์์ต๋๋ค.
**1-3. ํ์ฌ ๋์ ๊ฐ๋ฅํ ์ปค๋ฐ ํ์
ํ์ธํ๊ธฐ**
- `remove` `docs` `style` `test`
- ๋ก๊ณ ์๋จ์๋ ์ด ํ๋ก์ ํธ์์ ๋ถ์ํ๊ณ ์๋ 4๊ฐ์ ์ปค๋ฐ ํ์
์ ์ ์ ์์ต๋๋ค.
**1-4. ์ปค๋ฐ ๋ถ์ ์์ํ๊ธฐ**
- ๋งจ ์ฒ์ ๋ณด์ด๋ ํ๋ฉด์ผ๋ก ์ฌ์ฉ์๊ฐ ์ปค๋ฐ์ ๋ถ์ ๋ฐ๊ณ ์ถ์ ๊นํ๋ธ ๋ ํฌ์งํ ๋ฆฌ์ URL์ ์
๋ ฅํ ์ ์์ต๋๋ค.
- URL ์
๋ ฅํ์ฌ ์ ์ถํ๋ฉด ๊ธฐ๋ณธ ๋ธ๋ ์น์ ์ปค๋ฐ ๋ถ์์ ์์ํ ์ ์์ต๋๋ค.
### [2. ์ปค๋ฐ ๋ฑ์ง ํ์ด์ง](#๋ชฉ์ฐจ)

๋ฉ์ธ ํ์ด์ง์์ ์ปค๋ฐ ํ๋ฆฌํฐ ๋ถ์์ด ๋๋ ํ ๋ณด์ฌ์ง๋ ํ์ด์ง์
๋๋ค.
**2-1. ์ ์์ ๋ฐ๋ฅธ ๋ฑ์ง ์ฐจ๋ณํ**
- ์ฌ์ฉ์์ ์ ์์ ๋ฐ๋ผ ๊ฐ๊ฐ ๋ค๋ฅธ ๋ฑ์ง๊ฐ ์ฃผ์ด์ง๋ฉฐ 4๊ฐ์ ๋ฑ์ง๋ก ๊ตฌ์ฑ๋์ด ์์ต๋๋ค.
์ ์ ๊ตฌ๊ฐ์ 80์ ์ด์, 50์ ์ด์, 30์ ์ด์, 30์ ๋ฏธ๋ง์ผ๋ก ์ฑ์ ๋ฉ๋๋ค.
- `Copy your Badge` ๋ฒํผ์ ํตํด ์ฌ์ฉ์์ ๋ ํฌ์งํ ๋ฆฌ README ์ ๋ฑ์ง๋ฅผ ๋ถ์ฌ ๋ฃ๊ธฐ ํ ์ ์๋ HTML ํ๊ทธ๋ฅผ ๋ณต์ฌํ ์ ์์ต๋๋ค.

**2-2. ์ปค๋ฐ ํต๊ณ ๊ทธ๋ํ**
- ๋๋ ๊ทธ๋ํ
- ์ค์์ ๊ฒ์ฌํ ์ปค๋ฐ์ ์ด ๊ฐ์๋ฅผ ๋ณผ ์ ์์ต๋๋ค.
- ๊ฒ์ฌํ ์ปค๋ฐ๋ค์ ์ปค๋ฐ ํ์
๋ณ๋ก ๋ถ๋ฅํ์ฌ ๋น์จ์ ๋ํ๋์ต๋๋ค.
- ๋ง๋ ๊ทธ๋ํ
- ๊ฐ์ฅ ๋ง์ด ๊ธฐ์ฌํ ์์ 3๋ช
์ ์ ์ ํ์ฌ ๊ฐ์์ ์ปค๋ฐ์ ์ปค๋ฐ ํ์
๋ณ๋ก ๋ถ๋ฅํด ๋ํ๋์ต๋๋ค.
**2-3. ์ปค๋ฐ ํ๋ฆฌํฐ ์ต์ข
์ ์**
- 100์ ๋ง์ ์ ๊ธฐ์ค์ผ๋ก ์ฌ์ฉ์์ ์ ์๋ฅผ ๋ณผ ์ ์์ต๋๋ค.
- `View All Results` ๋ฒํผ์ ํตํด ์ปค๋ฐ ๋ถ์ ๊ฒฐ๊ณผ ํ์ด์ง๋ก ์ด๋ํ ์ ์์ผ๋ฉฐ ๊ฐ๊ฐ์ ์ปค๋ฐ๋ง๋ค์ ์ ์๋ฅผ ํ์ธํ ์ ์์ต๋๋ค.
**2-4. FAQ**
- ๋ฉ์ธ ํ์ด์ง์์ ์
๋ ฅ ๊ฐ๋ฅํ ๋ ํฌ์งํ ๋ฆฌ ์ปค๋ฐ ๋ฉ์์ง ํ์์ ์ ์ ์์ต๋๋ค.
- ์ด ํ๋ก์ ํธ์์ ํ์ธํ๋ ์ปค๋ฐ ํ์
๊ณผ ์ฑ์ ๋ฐฉ์์ ํ์ธํ ์ ์์ต๋๋ค.
**2-5. ์ฌ์ฉ์์์ ์ํต์ ์ํ ์ด๋ฉ์ผ์ฃผ์์ ๊นํ๋ธ ๋งํฌ**
- ํธํฐ์๋ ์ฌ์ฉ์๊ฐ ์์ด๋์ด๋ฅผ ์ ์ํ ์ ์๋ ์ด๋ฉ์ผ ์ฃผ์์ ํด๋น ํ๋ก์ ํธ์ ๊นํ๋ธ ๋ ํฌ์งํ ๋ฆฌ ๋งํฌ๊ฐ ์์ต๋๋ค.
### [3. ์ปค๋ฐ ๋ถ์ ๊ฒฐ๊ณผ ํ์ด์ง](#๋ชฉ์ฐจ)

์ปค๋ฐ ํ๋ฆฌํฐ๋ฅผ ๋ถ์ํ ๊ฐ ์ปค๋ฐ์ ๋ํ ์์ธ ์ ๋ณด๋ฅผ ์ ์ ์์ต๋๋ค.
- ๊นํ๋ธ ์์ ์์ ๋ ํฌ์งํ ๋ฆฌ ์ด๋ฆ
- ์ปค๋ฐ ๋ฉ์์ง ํ์๋ณ๋ก ๋ถ๋ฅ๋ ๋น์จ
1. Prefix Style
2. Simple Text
3. Template Based Style
- ๊ฐ ์ปค๋ฐ์ ์ ๋ณด
- COMMIT MESSAGE : ์ ํ ์ ํด๋น ์ปค๋ฐ์ ๊นํ๋ธ ๋ ํฌ์งํ ๋ฆฌ ํ์ด์ง๊ฐ ์ด๋ฆฝ๋๋ค.
- CHANGES : ๋ณ๊ฒฝ๋ ํ์ผ ๊ฐ์๋ฟ๋ง ์๋๋ผ, -/+ ์ ๋ฌถ์์ Change ๋ก ์ ์ํ์ฌ ๋ง๋๊ทธ๋ํ๋ฅผ ํตํด ์ผ์น์จ์ ํ์ธํ ์ ์์ต๋๋ค.
- Change ๋จ์ ์์
- change 2๊ฐ
- DATE : ๋ก์ปฌ๋ ์ง์ ์๊ฐ์ ๊ธฐ์ค์ผ๋ก ํ์ธํ ์ ์์ต๋๋ค.
- SHA : ์ ์ฒด SHA ๊ฐ์ ๋ณต์ฌํ๊ฑฐ๋ 7์๋ฆฌ๋ง ๋ณต์ฌํ ์ ์์ต๋๋ค.
## [๊ธฐ์ ์คํ](#๋ชฉ์ฐจ)
### ๋ฉ์ธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ





  

 
### ๊ธฐํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
- `diff-match-patch` : ๊ตฌ๊ธ์ Neil Fraser๊ฐ ๊ฐ๋ฐํ ์คํ์์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก, ํ
์คํธ์ ์ฐจ์ด์ (diffs)์ ๊ณ์ฐํ๊ณ ํจ์น๋ฅผ ์์ฑ ๋ฐ ์ ์ฉํ๋ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค. ๋๋์ ์ปค๋ฐ์ ์ ํํ๊ณ ๋น ๋ฅด๊ฒ ๋ถ์ํ์ฌ ์ฝ๋ ๋ณ๊ฒฝ ์ฌํญ์ ํ์ธํ๋ ๋ฐ ์ฌ์ฉํ์์ต๋๋ค.
- `idb-keyval` : IndexedDB๋ฅผ ๊ฐํธํ๊ฒ ์ฌ์ฉํ ์ ์๊ฒ ํด์ฃผ๋ ๊ฒฝ๋ ์คํ์์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก, key-value ํ์์ ๋ฐ์ดํฐ ์ ์ฅ ๋ฐ ์กฐํ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค. zustand ์ํ ๊ด๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ํจ๊ป ์ฌ์ฉํ์ฌ ์ํ๋ฅผ ๋ธ๋ผ์ฐ์ ์ IndexedDB์ ์ ์ฅํ ์ ์์ด ๋๋์ ์ํ ๋ฐ์ดํฐ๋ฅผ ํจ์จ์ ์ผ๋ก ์ฒ๋ฆฌํ๊ณ , ์ฌ์ฉ์ ๊ฒฝํ์ ํฅ์ํ ์ ์์์ต๋๋ค.
## [๐ค ๊ณ ๋ฏผํ๊ณ ๊ฒฐ์ ํ ๋ถ๋ถ](#๋ชฉ์ฐจ)
### [1. ๋ฐ์ดํฐ ํจ์จ์ฑ vs ์ฌ์ฉ์ ๊ฒฝํ: REST API ์ ํ](#๋ชฉ์ฐจ)
1๏ธโฃ **Problem**
REST API๋ฅผ ์ด์ฉํ์ฌ ์์ฒญํ ๊ฒฝ์ฐ, ์๋ํฌ์ธํธ๋ง๋ค ์ ๋ฌ๋ฐ๋ ๋ฐ์ดํฐ ํ์์ด ๊ณ ์ ๋์ด ์์ด ๋ถํ์ํ ์ ๋ณด๋ ํจ๊ป ์ ๋ฌ๋ฉ๋๋ค. ์ด์ ๋ฐ๋ผ ๋คํธ์ํฌ, ๋ฉ๋ชจ๋ฆฌ, ํ๋ก์ธ์ ๋ฑ์ ๋ฆฌ์์ค๊ฐ ๋ญ๋น๋ฉ๋๋ค. ์ค์ ๋ก, [facebook/react](https://github.com/facebook/react)์ ๊ฐ์ ๋๊ท๋ชจ ํ๋ก์ ํธ์ ๋ ํฌ์งํ ๋ฆฌ๋ฅผ ๋ถ์ํ ๊ฒฝ์ฐ ๋๋ต 1,500๋ฒ์ ์์ฒญ์ ๋ณด๋ด๊ณ ์๋ต์ ๋ฐ์ 2๋ง ๊ฐ ์ ๋์ ์ปค๋ฐ์ ๊ฒ์ฌํ๊ฒ ๋๋๋ฐ, ์ต์ 5~10์ด ์ ๋์ ๋ก๋ฉ ์๊ฐ์ ๋ฐ์๊ณผ ๋ ์ ์ฒด๊ฐํ ์ ์์์ต๋๋ค.
2๏ธโฃย **Action**
๊นํ๋ธ๋ ์ฌ์ฉ์์ ์์ฒญ์ ๋์ฑ ์ ์ฐํ๊ฒ ์ฒ๋ฆฌํ ์ ์๋๋ก GraphQL์ด๋ผ๋ ๋ฐ์ดํฐ ์ฟผ๋ฆฌ ์ธ์ด๋ฅผ ์ฌ์ฉํ API๋ฅผ ์ ๊ณตํ๊ณ ์์ต๋๋ค. ํ์ํ ์ ๋ณด๋ง ์คํค๋ง์ ๋ช
์ํ์ฌ ์์ฒญํ ์ ์๊ธฐ ๋๋ฌธ์, ์ฌ์ฉ์๋ ๋์ญํญ๊ณผ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ ์ฝํ ์ ์์ต๋๋ค.
ํ์ง๋ง GraphQL์ ์ฌ์ฉํ ๋ ๋ ๊ฐ์ง ์ฃผ์ ์ฐจ์ด์ ์ด ์กด์ฌํ์ต๋๋ค.
1. ํ ํฐ ๊ธฐ๋ฐ ํ์ด์ง๋ค์ด์
(Token-Based Pagination)
GraphQL์ ํ์ด์ง๋ค์ด์
์ ์ง์ํ์ง๋ง, ํ์ด์ง ๋ฒํธ ๊ธฐ๋ฐ์ด ์๋ ํ ํฐ ๊ธฐ๋ฐ์ ์ฌ์ฉํฉ๋๋ค. ์ด์ ๋ฐ๋ผ ์์ฐจ์ ์ผ๋ก ๋ค์ ํ์ด์ง์ ๋ด์ฉ์ ์์ฒญํด์ผ ํ๊ณ , REST API์ฒ๋ผ ๋น๋๊ธฐ์ ์ผ๋ก ์ปค๋ฐ ๋ชฉ๋ก์ ๋ณ๋ ฌ๋ก ์์ฒญํ ์ ์์ด ํ์ด์ง ๋ก๋ฉ ์๊ฐ์ด ๋ง์ด ์ฆ๊ฐํ์ต๋๋ค.
2. ์ปค๋ฐ ๋ณ๊ฒฝ ์ฌํญ ๋ฏธ์ ๊ณต
GraphQL์ ์ปค๋ฐ์ ๋ณ๊ฒฝ ์ฌํญ ์ ๊ณตํ์ง ์์์ต๋๋ค.
3๏ธโฃย **Result**
๋ฐ์ดํฐ๋ฅผ ์ฟผ๋ฆฌ์ธ์ด์ธ GraphQL๋ก ์ ํํ์ฌ ๋ฆฌ์์ค์ ์ฌ์ฉ์ ์ต์ ํํ๋ ค ํ์์ง๋ง, ์ ์ ์ฌ์ฉ์ฑ์ ์ํด ๊ธฐ์กด REST API๋ก ์์ฒญํ๋ ๋ฐฉ์์ ์ ์งํ๊ธฐ๋ก ํ์ต๋๋ค.
### [2. GitHub API Rate Limit ํํผ๋ฅผ ์ํ ํ ํฐ ๋กํ
์ด์
๊ตฌํ](#๋ชฉ์ฐจ)
Github API Rate Limit ์ฐธ๊ณ ๋งํฌ
1๏ธโฃ **Problem**
**Github API ํธ์ถ ์ธ์ฆ๋ ํ ํฐ ์๊ฐ๋น 5,000ํ ์ ํ**
Github API ์ ์์กด๋๊ฐ ๋์ ํ๋ก์ ํธ์๊ธฐ์ **Github API ์์ฒญ ์ ํ ์๋ ์ ํฌ ํ๋ก์ ํธ์์ ์น๋ช
์ **์ด์์ต๋๋ค. ์ปค๋ฐ ๋ถ์ ๋ก์ง์ API ํธ์ถ์ ํตํด ํ์ํ ๊ฐ๋ค์ ๋ถ๋ฌ์ค๊ณ , ์ปค๋ฐ ๋ฉ์์ง์ ์ปค๋ฐ ํ์
์ ๋ถ์ํ ์ดํ, ๊ฒ์ฌ ๊ฐ๋ฅํ ์ปค๋ฐ ํ์
๋ค๋ง์ ํํฐ๋งํฉ๋๋ค. ํํฐ๋งํ ์ปค๋ฐ์ `owner`, `repo`, `sha` ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก API ํธ์ถ์ ํตํด ์ฝ๋์ ์์ ์ ๋ณด์ธ diff ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ต๋๋ค.
ํนํ๋ ํ ์ธ์ฆ๋ ํ ํฐ ์๊ฐ๋น 5,000ํ๊ฐ ์ต๋์๊ธฐ ๋๋ฌธ์ ์๋ฅผ ๋ค์ด, facebook/react ์ ๊ฐ์ด ์ปค๋ฐ ๊ฐฏ์๊ฐ 19,000๊ฐ ์ด์์ ๊ฒฝ์ฐ 19,000/100 = **190**ํ API ํธ์ถ์ ํตํด ์ ์ฒด ์ปค๋ฐ์ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ค๊ณ , ๊ฒ์ฌ ๊ฐ๋ฅํ ์ปค๋ฐ์ ์ถ์ถํ๋ฉด (2024.12.25 ์ผ ๊ธฐ์ค์ผ๋ก) 1450 ๊ฐ์ด๋ฏ๋ก, **1,450**ํ์ diff API ํธ์ถ์ ๋ ํ๊ฒ ๋ฉ๋๋ค.
์ฆ, facebook/react ๋ 190 + 1,450 = **1,640**ํ์ API ํธ์ถ์ ํ๊ฒ ๋ฉ๋๋ค. ๊ทธ๋ผ ์ฌ์ค 2, 3๋ฒ์ facebook/react ์ ๋์ ๋ ํฌ์งํ ๋ฆฌ๋ง ์กฐํํ๋๋ผ๋ GitHub API Rate Limit๋ฅผ ๋ชจ๋ ์์งํ๊ฒ ๋๋ ๋ฌธ์ ๊ฐ ์์์ต๋๋ค.
๋ํ, ๊ฒ์ฌ ๊ฐ๋ฅํ ์ปค๋ฐ ํ์
์ด ์ถ๊ฐ๊ฐ ๋๋ค๋ฉด ๋ ๋ง์ API ํธ์ถ์ ์์ํ ์ ์์ต๋๋ค. ๋ง์ฝ ๋ชจ๋ ์ปค๋ฐ์ด ๊ฒ์ฌ ๋์์ด๋ผ๋ฉด ์ปค๋ฐ ๊ฐ์์ 101%๋งํผ API ํธ์ถ์ ํ๊ฒ ๋ฉ๋๋ค.
**์ธ์ฆ๋ ํ ํฐ ๋กํ
์ด์
๋ฐฉ์ ๊ฒํ **
GitHub API ์์ฒญ ์ ํ์ ํ ํฐ๋ง๋ค ๋
๋ฆฝ์ ์ผ๋ก ์ ์ฉ๋๊ณ ์์ต๋๋ค. API ํธ์ถ์ด ๋ง์ ์์
์์ Rate Limit๋ฅผ ์ด๊ณผํ๋ ๋ฌธ์ ๊ฐ ๋น๋ฒํ๊ฒ ๋ฐ์ํ๊ณ , ํ๋์ ํ ํฐ๋ง์ผ๋ก๋ ํ๋ก์ ํธ ์๊ตฌ ์ฌํญ์ ์ถฉ์กฑํ ์ ์์์ต๋๋ค. ์ฌ๋ฌ Personal Access Token(PAT)์ ํ๊ฒฝ ๋ณ์๋ก ๋ฐ์ ์ด๋ฅผ ํจ์จ์ ์ผ๋ก ๋กํ
์ด์
ํ๋ ๋ฐฉ์์ ์ฐจ ์ฐ์ ์ผ๋ก ๊ฒํ ํ์ต๋๋ค.
2๏ธโฃย **Action**
**ํ ํฐ ๋กํ
์ด์
๋ก์ง ๊ตฌํํ์ฌ ์ผ์์ ์ผ๋ก ํด๊ฒฐํ์ต๋๋ค**. ์ฌ๋ฌ ํ ํฐ์ `tokenStates`์ด๋ผ๋ ๋ฐฐ์ด๋ก ๊ด๋ฆฌํ๋ฉฐ, ๊ฐ ํ ํฐ์ ๋จ์ ํธ์ถ ๊ฐ๋ฅ ํ์(remaining)๋ฅผ ์ถ์ ํ๋๋ก ์ค๊ณํ์ต๋๋ค. API ํธ์ถ ์, ๋จ์ ์์ฒญ๋์ด ๊ฐ์ฅ ๋ง์ ํ ํฐ์ ์ ํํด Rate Limit ์ด๊ณผ๋ฅผ ๋ฐฉ์งํ์ต๋๋ค. ํธ์ถ ํ, GitHub API์ ์๋ต ํค๋์์ ๋ฐํ๋๋ `X-RateLimit-Remaining` ๊ฐ์ ์ฌ์ฉํด ํ ํฐ ์ํ๋ฅผ ์
๋ฐ์ดํธํ์ต๋๋ค. `getBestGithubToken()` ํ์ฌ ์ฌ์ฉ ๊ฐ๋ฅํ ํ ํฐ ์ค ๊ฐ์ฅ ๋ง์ ๋จ์ ์์ฒญ ํ์๋ฅผ ๊ฐ์ง ํ ํฐ์ ๋ฐํํ๋๋ก ํ์ต๋๋ค. `updateTokenState()` ํธ์ถ ํ, ์ฌ์ฉํ ํ ํฐ์ ์ํ๋ฅผ ์ต์ ์ํ๋ก ์
๋ฐ์ดํธํ์ฌ ํ ํฐ์ ๋ค๊ณ ์ฌ ๋ ๋จ์ ํธ์ถ ๊ฐ๋ฅ ํ์๋ฅผ ๊ฐ์ ธ์ฌ ์ ์๋๋ก ํฉ๋๋ค.
```js
const GITHUB_REQUEST_LIMIT = 5000;
const tokenStates = [
{
token: import.meta.env.VITE_GITHUB_TOKEN,
remaining: GITHUB_REQUEST_LIMIT,
},
...
];
const getBestGithubToken = () => {
tokenStates.sort((a, b) => b.remaining - a.remaining);
return tokenStates[0].token;
};
const updateTokenState = (token, remaining) => {
const tokenState = tokenStates.find((t) => t.token === token);
if (tokenState) {
tokenState.remaining = remaining;
}
};
export { getBestGithubToken, updateTokenState };
```
3๏ธโฃย **Result**
์ฌ๋ฌ ํ ํฐ์ ํ์ฉํ ๋กํ
์ด์
๋ฐฉ์์ผ๋ก, ๋๊ท๋ชจ ๋ฐ์ดํฐ๋ฅผ ์์ ์ ์ผ๋ก ์ฒ๋ฆฌํ ์ ์์์ต๋๋ค. ๊ทธ๋์ facebook/react์ฒ๋ผ ์ปค๋ฐ์ด ๋ง์ ๋ ํฌ์งํ ๋ฆฌ์์๋ ๋ถ์์ด ์ค๋จ๋์ง ์๊ณ ์๋ฃ๋ ์ ์์์ต๋๋ค. ํ ํฐ์ด ์ถ๊ฐ๋ ๊ฒฝ์ฐ `tokenStates` ๋ฐฐ์ด์๋ง ์ถ๊ฐํ๋ฉด ์๋์ผ๋ก ์ ์ฉ๋๋๋ก ์ค๊ณํ์ต๋๋ค.
### [3. ๊นํ๋ธ ๋ก๊ทธ์ธ ๊ธฐ๋ฅ์ ํ์ ๋์
๊ณผ ๋น๋ก๊ทธ์ธ ์ฌ์ฉ์ ์ ๊ทผ์ฑ ํฅ์](#๋ชฉ์ฐจ)
1๏ธโฃ **Problem**
๊ฒ์ฌํ ์ปค๋ฐ์ด ๋จ์ผ ํ ํฐ์ ์์ฒญ๋์ธ 5,000๊ฐ ์ด์์ ๋ ํฌ์งํ ๋ฆฌ๋ ์ ์์ ์ผ๋ก ๋ชจ๋ ๊ฒ์ฌํ ์ ์๋๋ก ํ ํฐ ๋กํ
์ด์
๋ฐฉ์์ ๊ตฌํํ์์ต๋๋ค. ๋ฐฐํฌํ์ง ์๊ณ ๋ก์ปฌ์์๋ง ์ด์ํ๋ค๋ฉด ํ ํฐ ๋กํ
์ด์
๋ฐฉ์์ผ๋ก๋ ๋ฌธ์ ๊ฐ ์๊ฒ ์ง๋ง, ๋ฐฐํฌํ์ฌ ์๋น์คํ๋ค๋ฉด ๋ง์ ์ฌ๋๋ค์ด ์ด์ฉํ๋ API ์ฌ์ฉ๋์ด ์ ํฌ๊ฐ ์๋์ผ๋ก ์ถ๊ฐํ ํ ํฐ์ ์์ฒญ๋์ ๊ฐ๋นํ ์ ์์ ๊ฒ์
๋๋ค.
์ ์ ์ ์ ๊ทผ์ฑ์ ์ํด ๋ก๊ทธ์ธ ๊ธฐ๋ฅ์ ์ถ๊ฐํ์ง ์์ผ๋ ค ํ์ง๋ง, ๋ฐฐํฌ๋ ์๋น์ค๊ฐ ์ ์์ ์ผ๋ก ๋์๊ฐ๋ ค๋ฉด ๊ฐ ์ ์ ์ ํ ํฐ์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ต์ ์ด๊ณ ๊ฒฐ๊ตญ ๋ก๊ทธ์ธ์ ํ์ ๋ถ๊ฐ๊ฒฐ์ด ๋์์ต๋๋ค. ํ์ง๋ง ๋ก๊ทธ์ธํ์ง ์๊ณ ์๋น์ค๋ฅผ ๊ฒฝํํ๋ ๊ฒ๋ ์ค์ํ๋ค ์๊ฐํ์ฌ ๋ฐฉ๋ฒ์ ์ฐพ๊ฒ ๋์์ต๋๋ค.
2๏ธโฃย **Action**
**- ๋ฐ๋ชจ ๋ฒ์ ์ ๊ณต ๊ณ ๋ ค**
์ฒ์์๋ ๋ก๊ทธ์ธํ์ง ์์ ์ฌ์ฉ์๊ฐ ๋งํฌ๋ฅผ ์ ์ถํ๋ฉด ๊ธฐ๋ณธ ํ ํฐ์ ์์ฒญ๋(์๊ฐ๋น 60๊ฐ)์ ์ด์ฉํ์ฌ ์ผ๋ถ๋ง ๋ณด์ฌ์ฃผ๋๋ก ํ๊ณ ๋ก๊ทธ์ธ์ ์ ๋ํ๋ ค ํ์ต๋๋ค. ํ์ง๋ง ์ ๋ง ์ผ๋ถ์ ์ปค๋ฐ ๋ถ์๋ง ๋ณด์ฌ์ค ์ ์๊ณ ํต๊ณ ๊ธฐ๋ฅ์ ์ฌ์ฉํ ์ ์์ผ๋ฉฐ, ํ ํฐ์ ์์ฒญ๋์ ๋น ๋ฅด๊ฒ ์์งํ๊ธฐ ๋๋ฌธ์ ๋ค๋ฅธ ๋ ํฌ์งํ ๋ฆฌ๋ฅผ ๋ถ์ํ ์ ์๋ค๋ ๋ฌธ์ ๊ฐ ์์์ต๋๋ค. ๋ํ, ์ผ๋ถ ๊ฒฝ์ฐ์๋ API์ ์ ๊ทผ ์์ฒด๊ฐ ๋์ง ์๋ ๋ฌธ์ ๋ ๋ฐ์ํ์ต๋๋ค.
**- ๋ชฉ์
๋ฐ์ดํฐ๋ฅผ ์ด์ฉํ ๋์ผํ ๊ฒฝํ ์ ๊ณต**
๋ฐ๋ผ์ ์ผ๋ถ ์ ๋ช
ํ ๋ ํฌ์งํ ๋ฆฌ์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ ๋ชฉ์
๋ฐ์ดํฐ๋ก ์ ๊ณตํ๊ธฐ๋ก ํ์ต๋๋ค. ๋ํ ์ฌ์ฉ์๊ฐ ๋ก๊ทธ์ธํ ์ ์ ์ ์ต๋ํ ๋น์ทํ ์ฒดํ์ ํ๊ธฐ ์ํด ๊ธฐ๋ฅ๊ณผ ์ธํฐํ์ด์ค์ ์์๋ฅผ ๋๊ฐ์ด ์ด์ฉํ๊ฒ ํ๋ ๊ฒ์ด ์ค์ํ๋ค๊ณ ์๊ฐํ์ต๋๋ค.
3๏ธโฃย **Result**
๋น๋ก๊ทธ์ธ ์ํ์์๋ ํ
์คํธ ์
๋ ฅ ๋ฐ์ค๋ฅผ ์ ํ ๋ฐ์ค๋ก ๋ณ๊ฒฝํ๊ณ , ์ ๊ณต๋๋ ์ ํ์ง๋ฅผ ์ด์ฉํด ์ ์ถํ๊ฒ ๋๋ฉด ๋ชฉ์
๋ฐ์ดํฐ๋ฅผ ์ด์ฉํด ์ค์ ๊ธฐ๋ฅ๊ณผ ๋์ผํ ๊ฒฝํ์ ํ ์ ์๊ฒ ํ์์ต๋๋ค. ๋ํ, ๋ฌธ๊ตฌ๋ฅผ ๋ฐ์ค ์์ ๋์ด ๋ก๊ทธ์ธ ์ ์ง์ ์
๋ ฅํ ์ ์๋ ์ ์ ์๊ฒ ํ์์ต๋๋ค.


ํ๋ก์ธ์ค๊ฐ ๊ฑฐ์ ๋๊ฐ๊ธฐ ๋๋ฌธ์ ์ฌ์ฉ์๊ฐ ๋ก๊ทธ์ธํ์ง ์๊ณ ์ฒดํํ๋ฉด์ ํํ ๋ฆฌ์ผ์ ๊ธฐ๋ฅ๋ ๊ฐ์ง ์ ์๊ฒ ๋์์ต๋๋ค.
### [4. ๋์ฉ๋ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ณ ์ฒ๋ฆฌ: IndexedDB ์ฌ์ฉ](#๋ชฉ์ฐจ)
1๏ธโฃ **Problem**
**- ๋์ฉ๋ ๋ฐ์ดํฐ ์ฒ๋ฆฌ ์ ์๋ฌ ๋ฐ์**
์ปค๋ฐ์ ๋ํ ๋ฐ์ดํฐ ๊ด๋ฆฌ๋ก ํ์ด์ง ๋ฆฌ๋ก๋ ์ ์ํ๊ฐ ์ด๊ธฐํ๋๋ ๊ฒ์ ๋ฐฉ์งํ๊ธฐ ์ํด sessionStorage์ ์ ์ฅํ์ต๋๋ค.
GitHub API๋ฅผ ํตํด ์ปค๋ฐ๋ค์ ๋ณ๊ฒฝ ๋ด์ฉ(diff)์ ๊ฐ์ ธ์ค๋ ๊ณผ์ ์์ ์ฝ๋์ ๋ณ๊ฒฝ ์ฌํญ์ด ๋ง์ ๊ฒฝ์ฐ ์ ์ฅ๋๋ ๋ฐ์ดํฐ์ ํฌ๊ธฐ๊ฐ ๋งค์ฐ ์ปค์ก๊ณ ์ด์ ๋ฐ๋ผ ๋ฐ์ดํฐ ์ ์ฅ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๊ฒ ๋์์ต๋๋ค.
sessionStorage๋ ๋์ฉ๋์ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ ๊ฒฝ์ฐ ๋ฐ์ดํฐ๊ฐ ์ ์ฅ๋์ง ์๊ณ ์ฉ๋์ด ์ด๊ณผํ์๋ค๋ ์๋ฌ๊ฐ ๋ฐ์ํ๋ ๋ฌธ์ ๊ฐ ์์์ต๋๋ค.
sessionStorage๋ ๋ธ๋ผ์ฐ์ ๋ง๋ค ์ฝ 5MiB์ ์ฉ๋ ์ ํ์ด ์์๊ณ ์ด ์ฉ๋ ์ด์์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ธฐ์๋ ์ ํฉํ์ง ์์์ต๋๋ค. GitHub API๋ก ์๋ต๋ฐ๋ ์ปค๋ฐ diff ๋ฐ์ดํฐ๋ ๋ณ๊ฒฝ๋ ์ฝ๋์์ ๋ฐ๋ผ ๋งค์ฐ ํฐ ํฌ๊ธฐ์ ๋ฐ์ดํฐ๊ฐ ๋ ์ ์๊ธฐ ๋๋ฌธ์ ๊ธฐ์กด์ sessionStorage๋ก๋ ๋ฐ์ดํฐ ์ ์ฅ ์คํจ๋ก ์ธํ ์๋ฌ ๋ฐ์ ๊ฐ๋ฅ์ฑ์ด ์ปค์ก์ต๋๋ค.
2๏ธโฃย **Action**
์ด ๋ฌธ์ ์ ํด๊ฒฐ์ ์ํด sessionStorage๋์ IndexedDB๋ฅผ ์ฌ์ฉํ์ต๋๋ค.
- IndexedDB
๋ธ๋ผ์ฐ์ ๋ด์์ ๋๊ท๋ชจ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ์ ์ฅํ๊ณ ๊ณ ์ฑ๋ฅ ๊ฒ์์ ์ํด ์ธ๋ฑ์ฑํ๋ ์น API์
๋๋ค.
idb-keyval ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํตํด ๊ฐ๋จํ API(`get()`, `set()`, `del()` ๋ฑ)์ ์จ์ IndexedDB๋ฅผ ๋ค๋ฃฐ ์ ์๋๋ก ๊ตฌํํ์ต๋๋ค. ๋ํ zustand๋ฅผ ํตํด ์ํ๋ฅผ ๊ด๋ฆฌํ๋ฉด์ ๋ฐ์ดํฐ๋ฅผ IndexedDB์ ์ ์ฅํ๋ ๋ฐฉ์์ผ๋ก ์ ํํ์ต๋๋ค.
- zustand์ persist ๋ฏธ๋ค์จ์ด(`storage: createJSONStorage(() => IndexedDB)`)๋ฅผ ํ์ฉํ์ฌ zustand ์ํ๋ฅผ IndexedDB์ ์ ์ฅํ๋๋ก ์ค์ ํ์ต๋๋ค.
- IndexedDB์์ ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์ค๊ฑฐ๋ ์ญ์ ํ ๋ ๋ฐ์ํ ์ ์๋ ์๋ฌ๋ฅผ ์ฒ๋ฆฌํด ์ฃผ๋ ๋ถ๋ถ์ ์ถ๊ฐํ์ต๋๋ค.
```jsx
import { create } from "zustand";
import { createJSONStorage, persist } from "zustand/middleware";
import { get, set, del } from "idb-keyval";
import { throwIndexedDBErrorMessage } from "../../../shared/error/throwCustomErrorMessage";
const IndexedDB = {
getItem: async (name) => {
try {
const value = await get(name);
return value || null;
} catch (error) {
throwIndexedDBErrorMessage(error);
}
},
setItem: async (name, value) => {
try {
await set(name, value);
} catch (error) {
throwIndexedDBErrorMessage(error);
}
},
removeItem: async (name) => {
try {
await del(name);
} catch (error) {
throwIndexedDBErrorMessage(error);
}
},
};
const initialState = {};
const useCommitStore = create(
persist(
(set) => ({
...initialState,
}),
{
name: "commit-storage",
storage: createJSONStorage(() => IndexedDB),
}
)
);
export default useCommitStore;
```
3๏ธโฃย **Result**
**- sessionStorage์์ ๋ฐ์ํ๋ ์ ์ฅ ์ฉ๋ ์ด๊ณผ ๋ฌธ์ ๋ฅผ ํด๊ฒฐ**
IndexedDB๋ 5MiB๋ณด๋ค ํจ์ฌ ํฐ ์ฉ๋(GB ๋จ์)์ ์ง์ํ์ฌ ์ปค๋ฐ diff ๋ฐ์ดํฐ์ ๊ฐ์ ๋๋์ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ ๋ ์๋ฌ๊ฐ ๋ฐ์ํ์ง ์๊ณ ์ํํ๊ฒ ์ ์ฅํ ์ ์๊ฒ ๋์์ต๋๋ค.
zustand์ ๊ฒฐํฉํ์ฌ ์ปค๋ฐ ๊ด๋ จ ์ํ๋ฅผ ์ง์์ ์ผ๋ก ๊ด๋ฆฌํ ์ ์๊ฒ ๋์๊ณ idb-keyval ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํตํด ์ฝ๋ ๋ณต์ก๋๋ฅผ ์ค์ด๊ณ ๋์ฉ๋ ๋ฐ์ดํฐ๋ฅผ ์์ ์ ์ผ๋ก ์ฒ๋ฆฌํ ์ ์๊ฒ ๋์์ต๋๋ค.
### [5. ๋ง์ ์ปดํฌ๋ํธ๋ค์ ํ๋ฉด์ ๋ ๋๋งํ๊ธฐ ์ํ virtual scroll ๋์
](#๋ชฉ์ฐจ)
virtual scroll ๋์
ํ PR ๋งํฌ

1๏ธโฃ **Problem**
**- INP ์ง์ ์์น ๋ฐ ํ๋ฉด ๋ฒ๋ฒ
์**
์ด๋ฏธ ๊ฒ์ฌ๊ฐ ๋๋ ๋ชจ๋ ์ปค๋ฐ๋ค์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ง๊ณ ์ปดํฌ๋ํธ๋ฅผ ๋ ๋๋งํ๋ ๋ํ
์ผ ๋ทฐ์๋ **ํ๋ฉด ์ฑ๋ฅ์ ๊ดํ ๋ฌธ์ **๊ฐ ์์์ต๋๋ค. ์ ์ ์์ ์ปดํฌ๋ํธ๋ค์ ์คํฌ๋กค ํ ๋๋ ํฐ ๋ฌธ์ ๊ฐ ์์์ง๋ง, ๋ง์ ์์ ์ปดํฌ๋ํธ๋ค์ (๋๋ต 1์ฒ ๊ฐ ์ด์์ ์ปค๋ฐ ์ปดํฌ๋ํธ) ๊ฐ์ง ๋ํ
์ผ ํ๋ฉด์ ์ฒซ ์ง์
์ ํ๋ฉด ๋ ๋๋ง์ ์๊ฐ์ด ์ง์ฐ๋์์ต๋๋ค. ๋ธ๋ผ์ฐ์ ํผํฌ๋จผ์ค ํญ์ ํ์ธํด ๋ณด๋ **INP**(**Interaction to Next Paint**) ์ง์๊ฐ ๊ธ๊ฒฉํ ์์นํ๊ณ , ํ๋ฉด์ด ๋์ ์ผ๋ก ๋ณํ ๋, ํนํ๋ ๋ฒ๋ฒ
์ด๋ ๋ฌธ์ ๊ฐ ์์์ต๋๋ค. ์ด ๋ฌธ์ ๋ ์ฌ์ฉ์๋ ํ๋ฉด ์ ํ ์์ ๋๋ฆฐ ๋ฐ์ ์๋์ ์ง์ฐ์ผ๋ก ์ธํด ๋ต๋ตํจ์ ๋๋ผ๊ฒ ํ๊ณ , ์ ์ฒด์ ์ธ ์ฌ์ฉ์ ๊ฒฝํ์ ์ ํํ๊ณ , ์ฑ ์ฑ๋ฅ์ ๋ํ ๋ถ์ ์ ์ธ ์ํฅ์ ๋ผ์น ๊ฒ์ผ๋ก ์์ํ์ต๋๋ค.
๋ธ๋ผ์ฐ์ ๊ฐ ๋ชจ๋ ์ปดํฌ๋ํธ๋ฅผ ํ ๋ฒ์ ๋ ๋๋งํ๋ ค๋ ๊ณผ์ ์์ ๋ธ๋ผ์ฐ์ ๊ฐ ํ์ํ์ง ์์ ๋ฐ์ดํฐ๊น์ง ๋ชจ๋ DOM์ ๋ ๋๋งํ๋ ๋ฐฉ์์ด ๋ณ๋ชฉํ์์ ์ฃผ์ ์์ธ์์ ํ์ธํ ์ ์์์ต๋๋ค. ์คํฌ๋กค์ด ํ์ํ ๋ํ
์ผ ํ๋ฉด์์ ์คํฌ๋กค ์ฌ์ฉ ์ ์ฑ๋ฅ ์ ํ๊ฐ ๋์ฑ ์ฌ๊ฐํ๊ฒ ๋ํ๋๋ ๊ฒ์ ํ์ธํ์ต๋๋ค. ๋ฐ๋ผ์ INP ์ง์๋ฅผ ๊ฐ์ ํ๊ณ , ์คํฌ๋กค ์ ๋ถ๋๋ฌ์ด ์ฌ์ฉ์ ๊ฒฝํ์ ์ ๊ณตํ ๋ฐฉ๋ฒ์ ์ฐพ์์ผ ํ์ต๋๋ค.
2๏ธโฃย **Action**
**- Virtual Scroll ๋์
**
์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์ ํฌ๋ **Virtual Scroll** ๊ธฐ์ ์ ๋์
ํ์์ต๋๋ค. Virtual Scroll ์ ์ฌ์ฉ์๊ฐ **ํ์ฌ ํ๋ฉด์์ ๋ณด๊ณ ์๋ ๋ถ๋ถ์ ํด๋นํ๋ ๋ฐ์ดํฐ๋ง DOM์ ๋ ๋๋งํ๊ณ , ๋ณด์ด์ง ์๋ ๋ถ๋ถ์ ๋ ๋๋งํ์ง ์์**์ผ๋ก์จ ๋ธ๋ผ์ฐ์ ์ ๋ถํ์ํ ์์
์ ์ค์ฌ์ฃผ๋ ๊ธฐ์ ์
๋๋ค. ์ด๋ฐ ๋ฐฉ์์ ํตํด ์ด๊ธฐ ๋ ๋๋ง ์ ํ์ํ์ง ์์ ๋ฐ์ดํฐ ์ฒ๋ฆฌ๋ฅผ ์ต์ํํ๊ณ , ๋ ๋๋ง ์๋๋ฅผ ํฌ๊ฒ ํฅ์ํ ์ ์์์ต๋๋ค. ๋๋ถ์ด ๋ฌดํ ์คํฌ๋กค์ฒ๋ผ ํ์ด์ง๋ค์ด์
์ ํตํ ๋ฐ์ดํฐ ์์ฒญ์ ํตํด์๋ ๊ฐ์ ํ ์ ์์์ง๋ง, ์ด๋ฏธ ์ปค๋ฐ๋ค์ด ๋ถ์๋ ๋ค์ ๋ํ
์ผ ํ๋ฉด ํ์ด์ง๋ฅผ ๋ณด๋ ๊ฒ์ด๊ธฐ์ ๋ฌดํ ์คํฌ๋กค ๊ธฐ๋ฅ์ ํ์ ์๋ค๊ณ ํ๋จํ์ต๋๋ค. Virtual Scroll์ ๋์
ํ๊ณ ๋ ๋๋ง ์ต์ ํ๋ฅผ ์ํด ์ปดํฌ๋ํธ ๋ถ๋ฆฌ ๋ฐ ๋ฉ๋ชจ์ด์ ์ด์
์ ์ฉํ์ฌ ์ฑ๋ฅ์ ๊ฐ์ ํ์ต๋๋ค.
3๏ธโฃย **Result**

์ด๊ธฐ ๋ ๋๋ง ์ ๋ถํ์ํ DOM ์์
์ ์ค์ด๊ณ , ์คํฌ๋ฆฐ์ ๋ณด์ฌ์ฃผ๋ ๋ถ๋ถ๋ง DOM์ ๊ทธ๋ฆฌ๋๋ก ํ๋ฉด์ INP ์ง์๋ฅผ ๊ฐ์ ํ ์ ์์์ต๋๋ค. ์ด๋ก์จ, ๋ ๊ฐ์ง ์ด์ ์ ๋ ์ป์ ์ ์์์ต๋๋ค.
1. **์คํฌ๋กค ์ฑ๋ฅ ํฅ์**: ๋๊ท๋ชจ ์ปค๋ฐ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ง ํ๋ฉด์์๋ ์คํฌ๋กค์ด ๋ถ๋๋ฝ๊ฒ ์๋ํ๊ณ ์ฆ๊ฐ์ ์ธ ๋ฐ์์ฑ ์ ๊ณตํ ์ ์๊ฒ ๋์์ต๋๋ค.
2. **์ฌ์ฉ์ ๊ฒฝํ ๊ฐ์ **: ํ๋ฉด ์ ํ ์๋๊ฐ ๋นจ๋ผ์ง๊ณ , ๋ฐ์ดํฐ๊ฐ ๋ง์ ํ๋ฉด์์๋ ๋์ ์ฑ๋ฅ ์ ์งํ ์ ์์ต๋๋ค.
๊ฒฐ๊ณผ์ ์ผ๋ก, ๋๊ท๋ชจ ์ปค๋ฐ ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃจ๋ ๋ ํฌ์งํ ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ๋ณผ ๋์๋ ์์ ์ ์ธ ์ฑ๋ฅ๊ณผ ์ํํ ์ฌ์ฉ์ ๊ฒฝํ์ ๋ฌ์ฑํ๊ฒ ๋์์ต๋๋ค.
### [6. ์ปค๋ฐ ๋ถ์์ ์ํ ์ปค๋ฐ ํ์
๊ธฐํ](#๋ชฉ์ฐจ)
์ข์ ์ปค๋ฐ์ธ์ง๋ฅผ ํ๋จํ๊ธฐ ์ํด ์ปค๋ฐ์ ๋ฉ์์ง์ ์ค์ ๋ณ๊ฒฝ ๋ด์ฉ์ ๋งฅ๋ฝ์ด ์ผ์นํ๋์ง ๊ฒ์ฌ๊ฐ ํ์ํ์ต๋๋ค. ์๋ฅผ ๋ค์ด ์ปค๋ฐ ๋ฉ์์ง์ โtest: ํ
์คํธ ์ฝ๋ ์์ โ์ด๋ผ๊ณ ์ ํ์์ผ๋ ๋ณ๊ฒฝ ๋ด์ฉ์ ํด๋น ๋ด์ฉ๊ณผ ๊ด๋ จ ์๋ ๋ถ๋ถ์ด ํฌํจ๋๋ ๊ฒฝ์ฐ์๋ ์ปค๋ฐ์ ์ง์ ๋ฎ์ถ๋ค๊ณ ํ๋จ๋์ด์ผ ํฉ๋๋ค.
1๏ธโฃ **Problem**
1. ์ปค๋ฐ ๋ฉ์์ง ํ์์ ๋น์ผ๊ด์ฑ
์ปค๋ฐ ๋ฉ์์ง์ ๋ํ ์ปจ๋ฒค์
์ด ์กด์ฌํ์ง๋ง, ํ๋ก์ ํธ๋ง๋ค ๋ค๋ฅธ ๊ท์น์ ์ ์ฉํ๊ฑฐ๋ ์ปจ๋ฒค์
์ ๊ฐ์ ํ์ง ์์ ๊ฒฝ์ฐ๊ฐ ๋ง์๊ณ ๋์ผํ ์ปค๋ฐ ํ์
์ด์ด๋ ์์ฑ์์ ์คํ์ผ์ ๋ฐ๋ผ ๋ฉ์์ง ํ์์ด ๋ฌ๋์ต๋๋ค.
2. ์ปค๋ฐ ๋ฉ์์ง์ ์ฝ๋ ๋ณ๊ฒฝ ๋ด์ฉ ๊ฐ์ ๋ชจํธํ ๊ธฐ์ค
์๋ฅผ ๋ค์ด, ์ปค๋ฐ ๋ฉ์์ง ํ์
์ด `fix`์ด๊ณ CSS ๊ด๋ จ UI ๋ณ๊ฒฝ์ด ๋ ๊ฒฝ์ฐ์๋ `fix`์ธ์ง `design`์ธ์ง ํ๋จํ๋ ๊ธฐ์ค์ด ๋ชจํธํ์ต๋๋ค. `refactor`, `feat` ๋ฑ์ ๊ฒฝ์ฐ์๋ ํด๋น ์ปค๋ฐ์ ์ฝ๋ ๋ณ๊ฒฝ ๋ด์ฉ๋ง์ ๋ณด๊ณ ์ ํํ๋ ๊ท์น๋ง์ผ๋ก ์ผ์น์ฑ์ ํ๋จํ๊ธฐ์๋ ์ด๋ ค์ ์ต๋๋ค.
3. ๋์ผํ ํ์
์ด์ง๋ง ๋ค์ํ ํด์
๊ฐ์ ๋จ์ด์ด์ง๋ง ๋ค์ํ ์๋ฏธ๋ก ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๊ฐ ๋น๋ฒํ์ต๋๋ค. ์ปค๋ฐ ๋ฉ์์ง ํ์
์ด `style`์ผ ๋ ์ฝ๋ ํฌ๋งท ๋ณ๊ฒฝ์ ๋ํ๋ด๋ ๊ฒฝ์ฐ๋ ์์ง๋ง ๋์์ธ์ ์ธ ์คํ์ผ ๋ณ๊ฒฝ์ ์ฌ์ฉ๋๊ธฐ๋ ํ์ผ๋ฉฐ `chore`์ธ ๊ฒฝ์ฐ์๋ ๋น๋์ ๊ด๋ จ ์์ ๋ง์ ๋ํ๋ด๋ ์๋ฏธ๋ก ์ฐ์ด๊ฑฐ๋ ์์ํ ์์ ์ ์๋ฏธ๊น์ง ํฌํจํ์ฌ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๋ ์์์ต๋๋ค.
2๏ธโฃย **Action**
**1. ์์ฑ์์ ์คํ์ผ์ ๋ฐ๋ฅธ ์ปค๋ฐ ๋ฉ์์ง ํ์ ๋ถ์**
์ปค๋ฐ ๋ฉ์์ง๋ฅผ ์ธ ๊ฐ์ง ์ฃผ์ ํ์์ผ๋ก ๋ถ๋ฅํ์ต๋๋ค. ๋ค์ํ ํ์์ ์ปค๋ฐ ๋ฉ์์ง๊ฐ ์
๋ ฅ๋๋๋ผ๋ ์ง์ ๋ ํ์์ ๋ฐ๋ฅผ ๊ฒฝ์ฐ ์ปค๋ฐ ํ๋ฆฌํฐ๋ฅผ ๋ถ์ํ ์ ์๋๋ก ํ์ต๋๋ค.
- ์
๋ ฅํ ์ ์๋ ์ปค๋ฐ ๋ฉ์์ง ํ์ ์ง์
๋์๋ฌธ์ ๊ตฌ๋ถ์ด ์์ต๋๋ค. (Case-insensitive)
1. ํ๋ฆฌ ํฝ์ค ์คํ์ผ (Prefix Style)
`type(scope): subject`
์์: feat(auth): ๋ก๊ทธ์ธ API ์ฐ๋
2. ์ผ๋ฐ ํ
์คํธ ์คํ์ผ (Simple Text Style)
`type subject`
์์: Add ๋ก๊ทธ์ธ API ์ฐ๋
3. ํ
ํ๋ฆฟ ๊ธฐ๋ฐ ์คํ์ผ (Template Based Style)
`[type] subject`
์์: [ADD] ๋ก๊ทธ์ธ API ์ฐ๋
**2. ๋ชจํธํ ์ปค๋ฐ ํ์
์ ๋ฌธ์ ํด๊ฒฐ์ ์ํ ํํฐ๋ง**
| ์ปค๋ฐ ๋ด์ฉ[์นดํ
๊ณ ๋ฆฌ] | ํ์
| ์ถ์ /๋ถ์ ์์ธ |
| -------------------------------------------------------------- | ----------------------------------------------------------------------------------- | ------------------------------------------ |
| 1. ๊ธฐ๋ฅ์ ์ถ๊ฐ | feat, make, implement | |
| 2. ํ์ผ์ ์ญ์ | remove, removed, removes, delete, deletes, deleted, erase, erases, erased, discard, | |
| 3. ๋ฌธ์ ์์
๋ง | docs, doc, documentation, readme | ํ์ผ ํ์ฅ์๋ช
(.md, .mdx, .docs, ...) |
| 4. ๋ฒ๊ทธ ์์ | fix, fixed | |
| 5. ๋ฆฌํฉํ ๋ง | refactor | |
| 6. ์ฝ๋ ํฌ๋ฉงํ
| style, format, beautify, "reformatโ | |
| 7. ๋์์ธ ์คํ์ผ๋ง๋ง | design, css | ํ์ผ ํ์ฅ์๋ช
(.css, .scss) / tailwind (โฆ) |
| 8. ํ
์คํธ๋ฅผ ์ถ๊ฐํ๊ฑฐ๋ ๋ณ๊ฒฝํ๋ ์ฝ๋ | test, tests, verify, unittest | ํ์ผํ์ฅ์ ๋ฐ ์๋๊ฒฝ๋ก (.jest, ...) |
| 9. ๋น๋ ๋ฐ ์ค์ ํ์ผ ์์ (ํ๋ก์ ํธ์ ๊ธฐ๋ฅ๊ณผ ์ง์ ์ ์ผ๋ก ์ฐ๊ด x) | chore | |
`fix`, `feat`, `refactor`์ ๊ฐ์ ์ปค๋ฐ ํ์
์ ์ฝ๋ ๋ณ๊ฒฝ ๋ด์ฉ์ ๊ธฐ๋ฐ์ผ๋ก ๋ถ์ํ ์ ์๋ ๊ฒฝ์ฐ๋ ์์์ง๋ง, ๋๋ถ๋ถ์ ๋ช
ํํ ๊ธฐ์ค์ ๊ฐ์ง๊ณ ํ๋จํ๊ธฐ ์ด๋ ค์ด ๊ฒฝ์ฐ๊ฐ ๋ง์์ต๋๋ค. ์ปค๋ฐ ๋ฉ์์ง์ ๋ด์ฉ๋ฟ๋ง ์๋๋ผ ์ ์ฒด ์ฝ๋์ ๋ด์ฉ๋ ํ์
์ด ๋์ด์ผ ์ปค๋ฐ ๋ฉ์์ง์ ์ฝ๋ ๋ณ๊ฒฝ ๋ด์ฉ์ ์ผ์น์ฑ์ ์ ์ ์์๊ธฐ ๋๋ฌธ์ ํ๋์ ์ปค๋ฐ์ ๋ณ๊ฒฝ ๋ด์ฉ(diff)์ผ๋ก๋ ์ข์ ์ปค๋ฐ์ธ์ง ์๊ธฐ ์ด๋ ค์ ์ต๋๋ค.
๋ฐ๋ผ์ ๋ถ์ ๊ฐ๋ฅ์ฑ์ด ๋์ ์ปค๋ฐ ํ์
์ ํํฐ๋งํ์ฌ ๋ชจํธ์ฑ์ ์ต์ํํ๊ณ ์ผ๊ด๋ ํ๊ฐ๋ฅผ ๊ฐ๋ฅํ๊ฒ ํ์ต๋๋ค.
๋๋ถ๋ถ์ ์คํ์์ค ํ๋ก์ ํธ์์ ์๋ฏธ๊ฐ ๋ช
ํํ ๊ตฌ๋ถ๋๊ณ ์ค์ ์ฝ๋์ ๋ณ๊ฒฝ ๋ด์ฉ๊ณผ ์ปค๋ฐ ๋ฉ์์ง ๊ฐ์ ์ผ์น์ฑ์ ํ๋จํ๋ ๊ธฐ์ค์ ์ธ์ธ ์ ์๋ค๋ ์ ์์ `style`, `remove`, `docs`, `test` 4๊ฐ์ง ํ์
์ผ๋ก ๋ถ์ ๋์์ ์ ํํ์ต๋๋ค.
**3. ์ปค๋ฐ ๋ฉ์์ง ํ์
๊ณผ ์๋ฏธ์ ๋ํ ๋ช
ํํ ๊ธฐ์ค ์ค์ **
๋์ผํ ํ์
์ด์ง๋ง ๋ค์ํ ํด์์ด ๋ ์ ์๋ ๋ฌธ์ ๋ฅผ ๊ฐ์ ํ๊ธฐ ์ํด 4๊ฐ์ง ํ์
์ด ์ค์ ๋ก ์ด๋ค ์๋ฏธ๋ก ์ฐ์ด๊ณ ๊ทธ์ ๋ฐ๋ฅธ ์ฝ๋ ๋ณ๊ฒฝ ์ฌํญ์ ์ด๋ป๊ฒ ๋๋์ง ๋ถ์ํ์ต๋๋ค.
ํ์
๋ง๋ค ๊ณตํต๋ ์ฝ๋ ๋ณ๊ฒฝ ์ฌํญ์ ์ฐพ๊ณ ์ผ๋ฐ์ ์ผ๋ก ์์ฃผ ์ฐ์ด๋ ์๋ฏธ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋ช
ํํ ๊ธฐ์ค์ ์ค์ ํ์ต๋๋ค. ์๋ฅผ ๋ค์ด, `style` ํ์
์ HTML ํ๊ทธ์ ์ธ์ด ์์ฑ ์ถ๊ฐ, configํ์ผ ์์ , ์ฐ์ด์ง ์์ ์ฝ๋๋ฅผ ์ญ์ ํ ๊ฒฝ์ฐ ๋ฑ ํ๋จ ๊ธฐ์ค์ ์ธ์ฐ๊ธฐ ์ด๋ ค์ด ์ผ์ด์ค๋ณด๋ค๋ ์ผ๋ฐ์ ์ผ๋ก ์ฐ์ด๋ ์ฝ๋ ํฌ๋งท์ ๊ดํ ์์ ์ ๋ํด ๋ถ์ํ์ฌ ๊ธฐ์ค์ ์ค์ ํ์ต๋๋ค.
3๏ธโฃย **Result**
ํ์ฌ๋ ๋ณ๊ฒฝ ๋ด์ฉ๊ณผ ์ปค๋ฐ ๋ฉ์์ง๋ฅผ ํ๋จํ ๋ ๋ช
ํํ ๋์์ด ๊ฐ๋ฅํ ํ์
๋ง์ ์ฐ์ ์ ์ผ๋ก ์ ํํ์ผ๋ฉฐ ์ถํ ํํฐ๋ง ๊ธฐ์ค์ ํ์ฅํ์ฌ `feat`, `fix` ๋ฑ์ ํฌํจํ๊ธฐ ์ํ ์ถ๊ฐ ๊ฐ์ ์ ์งํํ ์์ ์
๋๋ค.
**- ์ด ํ๋ก์ ํธ์์ ํ์ธํ๋ ์ปค๋ฐ ํ์
๊ณผ ๊ธฐ์ค**
- remove
- ํ์ผ ๋ฐ ํด๋, ์ฝ๋๋ฅผ ์ญ์ ํ ์ปค๋ฐ
- ๋ณ๊ฒฝ ์ฌํญ์ ์ญ์ ํ ๋ถ๋ถ๋ง ํฌํจ๋๋์ง ํ์ธํฉ๋๋ค.
- ํด๋นํ์ง ์๋ ๊ฒฝ์ฐ ์์
- ํ์ผ ์ญ์ ์ ์ฝ๋ ์์ ์ ๊ฐ์ด ์ปค๋ฐํ์ ๊ฒฝ์ฐ์ ํด๋นํฉ๋๋ค.
- ๋ณ๊ฒฝ ์ฌํญ์ ์ฝ๋์ ์ถ๊ฐ๋ ๋ถ๋ถ์ด ํฌํจ๋ ๊ฒฝ์ฐ์ ํด๋นํฉ๋๋ค.
- docs
- ๋ฌธ์ ์์
๋ง์ ํ ์ปค๋ฐ
- ๋ฌธ์์ ์ฌ์ฉ๋๋ ํ์ผ๋ง ํฌํจ๋๋์ง ํ์ธํฉ๋๋ค.
- ์ด๋ฏธ์ง ํ์ผ -ย `.img`,ย `.png`,ย `.jpeg`,ย `.svg`,ย `.ai`
- ๊ธฐํ ๋ฌธ์ ํ์ผ - `.pdf` ,`.docs`,ย `.md`,ย `.mdx`,ย `.rst`
- ํด๋นํ์ง ์๋ ๊ฒฝ์ฐ ์์
- ๋ฌธ์ ํ์ผ๊ณผ ์์ค ์ฝ๋ ํ์ผ์ ์์ ์ฌํญ์ ๊ฐ์ด ์ปค๋ฐํ์ ๊ฒฝ์ฐ์ ํด๋นํฉ๋๋ค.
- style
- ์ฃผ๋ก ์ฝ๋ ํฌ๋งคํ
, ๋ค์ฌ์ฐ๊ธฐ, ์ฝ๋ ์ ๋ ฌ ๋ฑ ์ฝ๋์ ๋์์ ์ํฅ์ ์ฃผ์ง ์๋ ์์ ์ ํ ์ปค๋ฐ
- ํ์ผ๋ช
์ style์ ๋ํ๋ด๋ ๋จ์ด ํ์ธ ("prettier", "eslint", "configโ)
- ๋ณ๊ฒฝ ์ฌํญ์ ํน์๋ฌธ์(`,` , `'` , `"` , `\n` , `;` ๋ฑ)๋ง ์์ ๋๋์ง ํ์ธํฉ๋๋ค.
- ๋ณ๊ฒฝ ์ฌํญ์ด `console.log` ์ ๊ด๋ จ๋๋์ง ํ์ธํฉ๋๋ค.
- ์์๋ค์ ์์น ๋ณ๊ฒฝ ํ์ธํฉ๋๋ค.
- Tailwind CSS className์ ์์ฑ ์์๋ฅผ ํ์ธํฉ๋๋ค.
- ๊ฐ์ฒด ์์ฑ๋ค์ ์์๋ฅผ ํ์ธํฉ๋๋ค.
- ํด๋นํ์ง ์๋ ๊ฒฝ์ฐ ์์
- ๋ณ์๋ช
๋ณ๊ฒฝ ๋ฑ style ์ฒดํฌ ์ฌํญ์ ๋ฒ์ด๋ ๊ฒฝ์ฐ์ ํด๋นํฉ๋๋ค.
- test
- ํ
์คํธ๋ฅผ ์ถ๊ฐํ๊ฑฐ๋ ๋ณ๊ฒฝํ ์ปค๋ฐ
- ํ
์คํธ ์ฝ๋๋ฅผ ์์ฑํ ํ์ผ๋ง ํฌํจ๋๋์ง ํ์ธํฉ๋๋ค.
- `test`, `tests`, `spec`, `mock`
- ํด๋นํ์ง ์๋ ๊ฒฝ์ฐ ์์
- test ๊ฒ์ฆ ํค์๋๊ฐ ํ์ผ๋ช
์ ์๊ฑฐ๋ ๋์ ์์นํ์ง ์์ ๊ฒฝ์ฐ์ ํด๋นํฉ๋๋ค.
- `a/src/compiler-worker.ts`
- `a/mock_feed_repository_impl.dart`
- ํ
์คํธ ์ฝ๋ ๊ด๋ จ ํ์ผ์ด ์๋ ์ค์ ํ์ผ ๋ฑ์ ์์ ์ฌํญ์ ๊ฐ์ด ์ปค๋ฐํ์ ๊ฒฝ์ฐ์ ํด๋นํฉ๋๋ค.
## [ํ์
](#๋ชฉ์ฐจ)
### [1. ๊น ์ปค๋ฐ ์ปจ๋ฒค์
](#๋ชฉ์ฐจ)
| ์ ๋ชฉ | ๋ด์ฉ |
| -------- | ---------------------------------------- |
| feat | ์๋ก์ด ๊ธฐ๋ฅ์ ๋ํ ์ปค๋ฐ |
| fix | ๋ฒ๊ทธ ์์ ์ ๋ํ ์ปค๋ฐ |
| chore | ๋น๋ ์์ ์ ๋ํ ์ปค๋ฐ |
| docs | ๋ฌธ์ ์์ ์ ๋ํ ์ปค๋ฐ |
| style | ์ฝ๋ ์คํ์ผ ํน์ ํฌ๋งท ๋ฑ์ ๊ดํ ์ปค๋ฐ |
| refactor | ์ฝ๋ ๋ฆฌํฉํ ๋ง์ ๋ํ ์ปค๋ฐ |
| design | CSS ๋์์ธ์ ๋ํ ์ปค๋ฐ |
| test | ํ
์คํธ ์ฝ๋ ์ถ๊ฐ, ์ญ์ , ๋ณ๊ฒฝ์ ๋ํ ์ปค๋ฐ |
| remove | ๋ถํ์ํ ํ์ผ์ด๋ ๋ก์ง ์ญ์ ์ ๊ดํ ์ปค๋ฐ |
## [ํ์ ์๊ฐ](#๋ชฉ์ฐจ)
**์ ์ฒ ํ** (๊นํ๋ธ ์ฃผ์)
์๋น์ค์ ๋ชฉ์ ์ ๊ฐ์ง ํ๋ก์ ํธ์ ํ์
์ ์ด๋ฒ์ด ์ฒ์์
๋๋ค. ๊ทธ์ ์๋ ํ์๋ค๊ณผ ๊ฐ์ด ์ฝ๋ฉํ๋ฉด์ ํ์
์ด๋ ๋ฌด์์ธ์ง์ ๋ํด ์ด๋ก ์ ์ผ๋ก ์ ๊ทผํ์ง, ํฌ๊ฒ ์๋ฟ์ง๋ ์์์ต๋๋ค. ํ๋ก์ ํธ๋ฅผ ์งํํ๋ ๋ช ์ฃผ ๋์ ์ญํ ์ ๋๋๊ณ , ๋ง์ ์๊ฐ์ ํ๋์ ๋ชฉํ์ ๋ํด ์ง์คํ๊ฒ ๋๋ฉด์ ํ์
์ ๋ํด ๋ง์ด ์๊ฐํ๊ฒ ๋์์ต๋๋ค.
์ ํฌ ํ๋ก์ ํธ ์ฃผ์ ๋ก ์ปค๋ฐ์ ์ฌ๋ฐ๋ฅด๊ฒ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ๋ํด ์กฐ์ฌํ๋ฉด์ ๋จ์ํ ์ปค๋ฐ์ด ๊ธฐ๋ก์ ์๋จ์ด ์๋๋ผ ์ ํฌ๊ฐ ํ๋ ํ์
์ โ์ธ์ดโ๋ผ๋ ๋๋์ ๋ง์ด ๋ฐ์์ต๋๋ค. ๊ฐ๋ ๋ง์ด ๊ณ ์์ผ ์ค๋ ๋ง์ด ๊ณฑ๋ค๋ ์๋ด์ฒ๋ผ ์ปค๋ฐ๋ ์ ์์ฑํ๊ณ ์ ๋ฌํด์ผ ์ํต์ด ์ ์งํ๋๋ ๊ฒ ๊ฐ์์ต๋๋ค.
๊ทธ๋์ ์ ์๊ฒ ํ์
์ ์ํ๋๊ณ ๋ฌผ์ผ๋ฉด ์ ๋ ์ด๋ฒ์๋ ์ปค๋ฐ์ ์ ์ฐ์ง ๋ชปํด์ ์์ฝ๋ค๊ณ ๋๋ตํ ๊ฒ๋๋ค. ํ์ง๋ง ๋์ค์๋ ๋ฉ์ง ์ปค๋ฐ์ ์ฐ๊ณ ๋น๋นํ๊ฒ โ๋คโ๋ผ๊ณ ๋ตํ ๊ฒ๋๋ค.
**ํ์ ์ง** (๊นํ๋ธ ์ฃผ์)
์ด๋ฒ ํ๋ก์ ํธ๋ฅผ ์งํํ๋ฉด์ ์ปค๋ฐ์ด ๋จ์ํ ๊ธฐ๋ก์ด ์๋๋ผ, ํ๋ก๋ํธ์ ๊ธฐ๋ฐ์ ์ด๋ฃจ๋ ์ค์ํ ์์๋ผ๋ ์ฌ์ค์ ๋ค์ ํ๋ฒ ์ค๊ฐํ๊ฒ ๋์์ต๋๋ค. ์ฌ์ค, ์ปค๋ฐ์ ์ค์์ฑ์ ๋ํ ์ด์ผ๊ธฐ๋ ์์ฃผ ๋ค์์์ง๋ง, ์ด ํ๋ก์ ํธ๋ฅผ ๊ฒฝํํ๊ธฐ ์ ๊น์ง๋ ๊น์ด ๊ณต๊ฐํ์ง ๋ชปํ์ต๋๋ค. ์ด๋ฒ ํ๋ก์ ํธ ๊ฒฝํ์ ํตํด, ์ข์ ์ปค๋ฐ์ด ๋๋ฃ ๊ฐ๋ฐ์์ ์์ฐ์ฑ์ ์ผ๋ง๋ ํฌ๊ฒ ํฅ์ํ ์ ์๋์ง๋ฅผ ์ฒด๊ฐํ๊ฒ ๋์์ต๋๋ค.
๋, ํ ํ๋ก์ ํธ๋ก ํจ๊ป ํ์
ํ๋ฉด์ ์๋ก์ ์๊ฐ์ ๋ง์ถฐ๋๊ฐ๋ ๊ณผ์ ์ด ์ฆ๊ฑฐ์ ์ต๋๋ค. ์ง๊ธ์ ์ ํฌ ํ๋ก์ ํธ๊ฐ `style`, `remove`, `test`, `docs`์ ์ปค๋ฐํ์
๋ง ๊ฐ๋ฅํ์ง๋ง, ์ดํ ํ๋์ฉ ํ๋์ฉ ๋ ์ถ๊ฐํ์ฌ ์
๋ฐ์ดํธํ ์ ์์์ผ๋ฉด ์ข๊ฒ ์ต๋๋ค!
**๊น์ํ** (๊นํ๋ธ ์ฃผ์)
ํ๋ก์ ํธ ์งํ ์ด๊ธฐ์๋ ์ปค๋ฐ๋ฉ์์ง์ ๊ดํ ๊ธฐ์ค์ ์ ํ๋ ๊ณผ์ ์ด ์์์ต๋๋ค. ์ฌ๋๋ง๋ค ๋ค๋ฅด๊ฒ ์์ฑ๋ ์ปค๋ฐ ๋ฉ์์ง์ ๋ณ๊ฒฝ ๋ด์ฉ์ ์ผ์น์ฑ์ ๊ท๊ฒฉํ๋ ๊ธฐ์ค์ ์ ํด ํ๋จํด์ผ ํ๊ธฐ ๋๋ฌธ์ ์๋ก์ด ์ผ์ด์ค๊ฐ ๋์ฌ ๋๋ง๋ค ์ด๋ค ์์ผ๋ก ๊ท๊ฒฉํ๋ฅผ ์์ผ์ผ ํ ์ง ๊ณ ๋ฏผ์ ๋ง์ด ํ๋ ๊ฒ ๊ฐ์ต๋๋ค. ๋ํ API๋ก ์๋ต๋ฐ์ ๋ฐ์ดํฐ ์ฒ๋ฆฌ ๊ด๋ จํด์ ๋ค์ํ ๋ฌธ์ ๋ค์ ๋ง์ฃผํ๊ฒ ๋์์ต๋๋ค. ์ด๋ฅผ ํด๊ฒฐํ๋ ๊ณผ์ ์์ IndexedDB ํ์ฉ๊ณผ ๋ง์ ์์ ๋ฐ์ดํฐ๋ฅผ API ์์ฒญ์ ๋ณด๋ผ ๋ ํจ์จ์ ์ผ๋ก ๋ณด๋ผ ์ ์๋ ๋ฐฉ์ ๋ฑ ์ฌ๋ฌ ๊ฐ์ง๋ฅผ ๋ฐฐ์ฐ๊ฒ ๋์์ต๋๋ค.
์์ํ์ง ๋ชปํ ๋ฌธ์ ๊ฐ ์๊ฒผ์ ๋ ํ์๋ค๊ณผ ๊ฐ์์ ์๊ฒฌ์ ๊ณต์ ํ๊ณ ํ์๋ฅผ ํ๋ค ๋ณด๋ฉด ์๋ก์ด ๋ฐฉํฅ์ ํด๊ฒฐ์ฑ
๋ค์ด ๋์์ ๋ค์ํ ์๋๋ฅผ ํด๋ณผ ๊ธฐํ๊ฐ ๋์์ต๋๋ค. ์งง์ ๊ธฐ๊ฐ์ด์์ง๋ง ์๋ก์ด ๊ฐ๋
๋ค์ ๋ฐฐ์ฐ๊ฒ ๋์๊ณ ํจ์จ์ ์ธ ์ํต ๋ฐฉ์์ ๋ํด ์๊ฐํด ๋ณด๊ณ ์ ์ฉํด ๋ณผ ์ ์์๋ ์ข์ ๊ฒฝํ์ด์์ต๋๋ค.