Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

2 Commits
ย 
ย 

Repository files navigation

letsgitit

let's GIT it

๐Ÿ“† 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%)
        1. ์œ ์ €์˜ ์ด์Šˆ ์ˆ˜ (5์ )
        2. ์œ ์ €๊ฐ€ ํฌํฌ๋ฅผ ํ•œ ๋ ˆํฌ์ง€ํ† ๋ฆฌ ์ˆ˜ (4์ )
        3. ์œ ์ €๊ฐ€ ์Šคํƒ€๋ฅผ ๋ˆ„๋ฅธ ๋ ˆํฌ์ง€ํ† ๋ฆฌ ์ˆ˜ (2์ )
        4. ์œ ์ €๊ฐ€ ํŒ”๋กœ์šฐ ํ•˜๋Š” ์œ ์ €์˜ ์ˆ˜ (1์ )
      • ์—ด์ • (20%)
        1. ์œ ์ €์˜ ์ปค๋ฐ‹ ์ˆ˜ (5์ )
        2. ์œ ์ €์˜ PR ์ˆ˜ (4์ )
        3. ์œ ์ €๊ฐ€ PR์— ๋‚จ๊ธด ๋ฆฌ๋ทฐ์˜ ๊ฐฏ์ˆ˜ (2์ )
        4. ์œ ์ €๊ฐ€ ์ƒ์„ฑํ•œ ๋ ˆํฌ์ง€ํ† ๋ฆฌ ์ˆ˜ (1์ )
      • ๋ช…์„ฑ (35%)
        1. ์œ ์ €์˜ ํŒ”๋กœ์›Œ ์ˆ˜ (5์ )
        2. ์œ ์ €์˜ ์ „์ฒด ๋ ˆํฌ์ง€ํ† ๋ฆฌ์˜ ํฌํฌ ์ˆ˜ (4์ )
        3. ์œ ์ €์˜ ์ „์ฒด ๋ ˆํฌ์ง€ํ† ๋ฆฌ์˜ ์™€์น˜ ์ˆ˜ (3์ )
      • ๋Šฅ๋ ฅ (35%)
        1. ์Šคํฐ ๋ฐ›์€ ์ˆ˜ (5์ )
        2. ์œ ์ €์˜ ์ „์ฒด ๋ ˆํฌ์ง€ํ† ๋ฆฌ์˜ ์Šคํƒ€ ์ˆ˜ (4์ )
        3. ์œ ์ €๊ฐ€ ๊ธฐ์—ฌํ•œ ์ €์žฅ์†Œ๋“ค์˜ ์Šคํƒ€ ์ˆ˜ (3์ )

Team let's GIT it

FE ๊น€๋ณด์œค, ๋ฐ•์ง€์˜, ์‹ฌ๋™์„ญ, ํ™์„ํ˜„
BE ์˜คํ˜„์ƒ, ์ด๋ช…์„, ์ง€์†กํ˜„


๋‹ด๋‹น๊ธฐ๋Šฅ

1. ๋‹ค์–‘ํ•œ ์ •๋ ฌ์ด ๊ฐ€๋Šฅํ•œ ๋žญํ‚น ํŽ˜์ด์ง€

  • 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 ํ•˜์—ฌ ์„ธ๋ถ€ ๋žญํ‚น ํ™•์ธํ•˜๋„๋ก ๊ตฌํ˜„ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

2. ์ปค๋ฎค๋‹ˆํ‹ฐ ๊ธ€๋ชฉ๋ก ํŽ˜์ด์ง€

  • ๊นƒํ—™ ํ™œ๋™์„ ํ•˜๋Š” ์œ ์ €๋“ค์ด ๋ชจ์—ฌ์„œ ๋‹ค์–‘ํ•œ ์ •๋ณด๋ฅผ ๊ณต์œ ํ•˜๋Š” ์ปค๋ฎค๋‹ˆํ‹ฐ ํƒญ์œผ๋กœ ์ปค๋ฎค๋‹ˆํ‹ฐ ์นดํ…Œ๊ณ ๋ฆฌ ๋ณ„๋กœ 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]);
      

3. ๊ธ€ ๊ฒ€์ƒ‰ ๋ฐ ํ•˜์ด๋ผ์ดํŠธ ๊ธฐ๋Šฅ

  • ์ œ๋ชฉ, ๊ธ€์“ด์ด, ์ œ๋ชฉ+๊ธ€์“ด์ด์˜ ๊ฒ€์ƒ‰ ์˜ต์…˜๊ณผ ๊ฒ€์ƒ‰ ํ‚ค์›Œ๋“œ์— ํ•ด๋‹นํ•˜๋Š” ๊ธ€ ๋ชฉ๋ก ์กฐํšŒ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

  • ๋ฐฐํฌ ํ›„ ๊ฐœ์„ ์‚ฌํ•ญ

    • ์‚ฌ์šฉ์ž์˜ ํ”ผ๋“œ๋ฐฑ์— ๋”ฐ๋ผ ๊ฒ€์ƒ‰ ํ‚ค์›Œ๋“œ์— ๋Œ€ํ•œ ํ•˜์ด๋ผ์ดํŠธ ํ‘œ์‹œ๋ฅผ ํ•ด์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.

    • ์‚ฌ์šฉ์ž์˜ ํ”ผ๋“œ๋ฐฑ์— ๋”ฐ๋ผ ํŠน์ˆ˜๋ฌธ์ž ๊ฒ€์ƒ‰์— ๋Œ€ํ•ด ์ฒ˜๋ฆฌํ•ด์ฃผ๋Š” ์ •๊ทœํ‘œํ˜„์‹ ๋กœ์ง์„ ์ถ”๊ฐ€ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

      // ํŠน์ˆ˜๋ฌธ์ œ ์ œ์–ด ๋กœ์ง
        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}
      

Tools

  • Notion, Trello, Github, Slack

๊ธฐ์ˆ ์Šคํ…

  • ๐Ÿ’ป FE:
    • JavaScript, React, SCSS, TypeScript



ํšŒ๊ณ  ๋ฐ ๋А๋‚€์ 

  • let's GIT it ํšŒ๊ณ  (blog)
  • ๊ธ€ ๋ชฉ๋ก ํŽ˜์ด์ง€์—์„œ ์‚ฌ์šฉ์ž๊ฐ€ ๋‹ค์–‘ํ•œ ํ™œ๋™์„ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ์ฟผ๋ฆฌ์ŠคํŠธ๋ง์œผ๋กœ ๋งŽ์€ ์กฐ๊ฑด ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ตฌํ˜„์„ ํ•˜๋‹ค๋ณด๋‹ˆ ๋’ค๋กœ๊ฐ€๊ธฐ๊ฐ€ ๋˜์ง€ ์•Š๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ ๋˜์—ˆ๊ณ  ๋ฌด๋ถ„๋ณ„ํ•˜๊ฒŒ searchParams๋ฅผ ์‚ฌ์šฉํ•œ ๊ฒƒ์„ ๊นจ๋‹ฌ์•˜์Šต๋‹ˆ๋‹ค. ํ•œ์ค„ ํ•œ์ค„ ํ—›๋˜์ด ์‚ฌ์šฉ๋˜๋Š” ์ฝ”๋“œ๊ฐ€ ์—†๋„๋ก ๋” ์œ ๋…ํ•ด์•ผ๊ฒ ๋‹ค๋Š” ๊ฒƒ์„ ๋А๊ผˆ์Šต๋‹ˆ๋‹ค.
  • ์‚ฌ์šฉ์ž์˜ ์‹ค์ œ ํ”ผ๋“œ๋ฐฑ์„ ํ†ตํ•ด ํฌ๊ณ  ์ž‘์€ ์‹ค์ˆ˜ ๋ฐ ์˜ค๋ฅ˜๋“ค์„ ๋ฐœ๊ฒฌํ•˜๋Š” ๊ฒƒ์ด ์‹ ๊ธฐํ•˜์˜€๊ณ  ์˜ค๋ฅ˜๋ฅผ ํŒ€์›๋“ค๊ณผ ๊ฐ™์ด ๋จธ๋ฆฌ๋ฅผ ๋งž๋Œ€๋ฉฐ ํ•ด๊ฒฐํ•ด ๋‚˜๊ฐ€๋Š” ๊ฒƒ์ด ์ฆ๊ฑฐ์šด ๊ฒฝํ—˜์ด ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  • ์•„์ง ์ด์šฉํ•ด๋ณด์ง€ ์•Š์œผ์…จ๋‚˜์š”?? ๊ผญ ์ด์šฉํ•ด๋ณด์„ธ์š”!!

About

ReadMe

Resources

Stars

Watchers

Forks

Releases

Packages

Contributors