๐ 2023.01.11~ 2023.03.02
let's GIT it ๋ฐ๋ก๊ฐ๊ธฐ : https://let-s-git-it.vercel.app/
๋ ํฌ์งํ ๋ฆฌ ๋ฐ๋ก๊ฐ๊ธฐ : https://github.com/zhwltlr/let-s-Git-it-front
- ๊ฐ๋ฐ ๋๊ธฐ๋ถ์ฌ๋ฅผ ์ํ ๋ญํน ์๋น์ค
- ํธ๊ธฐ์ฌ(10%), ์ด์ (20%), ๋ช ์ฑ(35%), ๋ฅ๋ ฅ(35%)๋ก ์ฐ์ถ๋ ์ข ํฉ ์ ์๋ฅผ ํ ๋๋ก ๋ํ๋ธ github ๋ญํน ์์คํ
- ๊ฐ๊ฐ์ ์งํ๋ ๋ค์ ์ธ๋ถํ๋ ์งํ๋ก ์ ์ ์ฐ์ถ
- ํธ๊ธฐ์ฌ (10%)
- ์ ์ ์ ์ด์ ์ (5์ )
- ์ ์ ๊ฐ ํฌํฌ๋ฅผ ํ ๋ ํฌ์งํ ๋ฆฌ ์ (4์ )
- ์ ์ ๊ฐ ์คํ๋ฅผ ๋๋ฅธ ๋ ํฌ์งํ ๋ฆฌ ์ (2์ )
- ์ ์ ๊ฐ ํ๋ก์ฐ ํ๋ ์ ์ ์ ์ (1์ )
- ์ด์ (20%)
- ์ ์ ์ ์ปค๋ฐ ์ (5์ )
- ์ ์ ์ PR ์ (4์ )
- ์ ์ ๊ฐ PR์ ๋จ๊ธด ๋ฆฌ๋ทฐ์ ๊ฐฏ์ (2์ )
- ์ ์ ๊ฐ ์์ฑํ ๋ ํฌ์งํ ๋ฆฌ ์ (1์ )
- ๋ช
์ฑ (35%)
- ์ ์ ์ ํ๋ก์ ์ (5์ )
- ์ ์ ์ ์ ์ฒด ๋ ํฌ์งํ ๋ฆฌ์ ํฌํฌ ์ (4์ )
- ์ ์ ์ ์ ์ฒด ๋ ํฌ์งํ ๋ฆฌ์ ์์น ์ (3์ )
- ๋ฅ๋ ฅ (35%)
- ์คํฐ ๋ฐ์ ์ (5์ )
- ์ ์ ์ ์ ์ฒด ๋ ํฌ์งํ ๋ฆฌ์ ์คํ ์ (4์ )
- ์ ์ ๊ฐ ๊ธฐ์ฌํ ์ ์ฅ์๋ค์ ์คํ ์ (3์ )
- ํธ๊ธฐ์ฌ (10%)
FE ๊น๋ณด์ค, ๋ฐ์ง์, ์ฌ๋์ญ, ํ์ํ
BE ์คํ์, ์ด๋ช
์, ์ง์กํ
-
th๋ณ ์ค๋ฆ์ฐจ์ ๋ด๋ฆผ์ฐจ์ ์ ๋ ฌ ๊ธฐ๋ฅ์ ์ถ๊ฐํ์ฌ ์ฌ์ฉ์๊ฐ ํธ๋ค๋งํ ์ ์๋๋ก ๊ตฌํํ์์ต๋๋ค.
const sortRank = (key: string, sort = false) => { const sortList = [...currentList]; const comparator = (name: string, sort: boolean): any => { if (!sort) return ( prevRanker: { [x: string]: number }, nextRanker: { [x: string]: number } ) => prevRanker[name] === nextRanker[name] ? 0 : prevRanker[name] < nextRanker[name] ? -1 : 1; else { return ( nextRanker: { [x: string]: number }, prevRanker: { [x: string]: number } ) => prevRanker[name] === nextRanker[name] ? 0 : prevRanker[name] < nextRanker[name] ? -1 : 1; } }; sortList.sort(comparator(key, sort)); setCurrentList(sortList); }; -
Followers, Contributions, Stars์ ์ ๋ ฌ์ ํ๋ฒ์ ๊ด๋ฆฌํ๊ธฐ ์ํด comparator ํจ์์์ th์ name ๊ฐ์ ๋ฐ์์ ์ฌ์ฉ์๊ฐ ํด๋ฆญํ ๋ ํด๋นํ๋ column์ด ์ ๋ ฌ๋ ์ ์๋๋ก ํ์์ต๋๋ค.
- select box์์ ์ฌ์ฉ์๊ฐ ์ํ๋ ์ธ์ด ํด๋ฆญ์ filtering๋ ๋ฐ์ดํฐ๋ฅผ fetch ํ์ฌ ์ธ๋ถ ๋ญํน ํ์ธํ๋๋ก ๊ตฌํํ์์ต๋๋ค.
-
๊นํ ํ๋์ ํ๋ ์ ์ ๋ค์ด ๋ชจ์ฌ์ ๋ค์ํ ์ ๋ณด๋ฅผ ๊ณต์ ํ๋ ์ปค๋ฎค๋ํฐ ํญ์ผ๋ก ์ปค๋ฎค๋ํฐ ์นดํ ๊ณ ๋ฆฌ ๋ณ๋ก community list๋ฅผ ์์ฒญํฉ๋๋ค.
-
์ต์ ์/์ธ๊ธฐ์์ ๊ตฌ๋ถํ๋ sort, ์ธ๊ธฐ์์์ ๊ธฐ๊ฐ๋ณ ์กฐํ๋ฅผ ๊ตฌ๋ถํ๋ date, pagination์ ๊ตฌ๋ถํ๋ offset๊ณผ limit, ๊ฒ์ ๋ชฉ๋ก ์กฐํ๋ฅผ ๊ตฌ๋ถํ๋ option๊ณผ keyword๋ฅผ ์ฟผ๋ฆฌ ์คํธ๋ง์ผ๋ก ๊ด๋ฆฌํ์ฌ ์ฌ์ฉ์๊ฐ ์ํ๋ ์กฐ๊ฑด์ ํธํ๊ฒ ํธ๋ค๋งํ ์ ์๋๋ก ๊ตฌํํ์์ต๋๋ค.
-
Recoil์ ์ฌ์ฉํ์ฌ ์ ์ ๊ฐ ์ ํํ ์นดํ ๊ณ ๋ฆฌ state๋ฅผ ์ ์ญ์ผ๋ก ๊ด๋ฆฌ, articleList ๋ฟ๋ง ์๋๋ผ
article ์์ธ ํ์ด์ง๋ฐ๋ง์ดํ์ด์ง ๋ด๊ฐ ์ด ๊ธ ๋ชฉ๋ก์์ ์ ํํ ์นดํ ๊ณ ๋ฆฌ๋ฅผ ์ง์์ ์ผ๋ก ์ ๋ฐ์ดํธ ํฉ๋๋ค. -
๋ฐฐํฌ ํ ๊ฐ์ ์ฌํญ
- ์ฌ์ฉ์๊ฐ ๋งํฌ๋ก ๊ธ ๊ณต์ ์, ์นดํ
๊ณ ๋ฆฌ id ๊ฐ์ด ๋ณํ๋๋ก ์ค์ ํ์ง ์์ default ๊ฐ์ผ๋ก ๊ณต์ ๋๋ ํ์ ๋ฐ์ => id ๊ฐ์ params๋ฅผ ํตํด ๋ณ๊ฒฝํ ์ ์๋๋ก ์์ ํ์ต๋๋ค.
const categoryId = Number(params.id); useEffect(() => { setSelectActive(categoryId); ... articleFetch(); }, [categoryId]);
- ์ฌ์ฉ์๊ฐ ๋งํฌ๋ก ๊ธ ๊ณต์ ์, ์นดํ
๊ณ ๋ฆฌ id ๊ฐ์ด ๋ณํ๋๋ก ์ค์ ํ์ง ์์ default ๊ฐ์ผ๋ก ๊ณต์ ๋๋ ํ์ ๋ฐ์ => id ๊ฐ์ params๋ฅผ ํตํด ๋ณ๊ฒฝํ ์ ์๋๋ก ์์ ํ์ต๋๋ค.
-
์ ๋ชฉ, ๊ธ์ด์ด, ์ ๋ชฉ+๊ธ์ด์ด์ ๊ฒ์ ์ต์ ๊ณผ ๊ฒ์ ํค์๋์ ํด๋นํ๋ ๊ธ ๋ชฉ๋ก ์กฐํ ๊ธฐ๋ฅ์ ๊ตฌํํ์์ต๋๋ค.
-
๋ฐฐํฌ ํ ๊ฐ์ ์ฌํญ
-
์ฌ์ฉ์์ ํผ๋๋ฐฑ์ ๋ฐ๋ผ ๊ฒ์ ํค์๋์ ๋ํ ํ์ด๋ผ์ดํธ ํ์๋ฅผ ํด์ฃผ์์ต๋๋ค.
-
์ฌ์ฉ์์ ํผ๋๋ฐฑ์ ๋ฐ๋ผ ํน์๋ฌธ์ ๊ฒ์์ ๋ํด ์ฒ๋ฆฌํด์ฃผ๋ ์ ๊ทํํ์ ๋ก์ง์ ์ถ๊ฐํ์์ต๋๋ค.
// ํน์๋ฌธ์ ์ ์ด ๋ก์ง const escapeRegExp = (string: string) => { return string.replace(/[.*+?^$`~'":<>{}()|[\]\\]/g, '\\$&'); }; // ํค์๋์ ํค์๋๊ฐ ์๋ ๊ฒ์ ๋ํ ๊ตฌ๋ถ ๋ก์ง const getHighlightedText = (text: string, highlight: string) => { const escapedHighlight = escapeRegExp(highlight); const parts = text.split(new RegExp(`(${escapedHighlight})`, 'gi')); } // ์ ๋ชฉ, ๊ธ์ด์ด, ์ ๋ชฉ+๊ธ์ด์ด ๊ฒฝ์ฐ์ ๋ํ ์กฐ๊ฑด ์ฒ๋ฆฌ {searchOption === 'author' ? getHighlightedText(article.userName, searchKeyword) : searchOption === 'title_author' ? getHighlightedText(article.userName, searchKeyword) : article.userName} {searchOption === 'title' ? getHighlightedText(article.post_title, searchKeyword) : searchOption === 'title_author' ? getHighlightedText(article.post_title, searchKeyword) : article.post_title}
-
Notion,Trello,Github,Slack
- ๐ป FE:
JavaScript,React,SCSS,TypeScript
- let's GIT it ํ๊ณ (blog)
- ๊ธ ๋ชฉ๋ก ํ์ด์ง์์ ์ฌ์ฉ์๊ฐ ๋ค์ํ ํ๋์ ํ ์ ์๊ฒ ์ฟผ๋ฆฌ์คํธ๋ง์ผ๋ก ๋ง์ ์กฐ๊ฑด ์ฒ๋ฆฌ๋ฅผ ํด์ฃผ์์ต๋๋ค. ๊ตฌํ์ ํ๋ค๋ณด๋ ๋ค๋ก๊ฐ๊ธฐ๊ฐ ๋์ง ์๋ ๊ฒ์ ์๊ฒ ๋์๊ณ ๋ฌด๋ถ๋ณํ๊ฒ searchParams๋ฅผ ์ฌ์ฉํ ๊ฒ์ ๊นจ๋ฌ์์ต๋๋ค. ํ์ค ํ์ค ํ๋์ด ์ฌ์ฉ๋๋ ์ฝ๋๊ฐ ์๋๋ก ๋ ์ ๋ ํด์ผ๊ฒ ๋ค๋ ๊ฒ์ ๋๊ผ์ต๋๋ค.
- ์ฌ์ฉ์์ ์ค์ ํผ๋๋ฐฑ์ ํตํด ํฌ๊ณ ์์ ์ค์ ๋ฐ ์ค๋ฅ๋ค์ ๋ฐ๊ฒฌํ๋ ๊ฒ์ด ์ ๊ธฐํ์๊ณ ์ค๋ฅ๋ฅผ ํ์๋ค๊ณผ ๊ฐ์ด ๋จธ๋ฆฌ๋ฅผ ๋ง๋๋ฉฐ ํด๊ฒฐํด ๋๊ฐ๋ ๊ฒ์ด ์ฆ๊ฑฐ์ด ๊ฒฝํ์ด ๋์์ต๋๋ค.
- ์์ง ์ด์ฉํด๋ณด์ง ์์ผ์ จ๋์?? ๊ผญ ์ด์ฉํด๋ณด์ธ์!!


