Skip to content

๐Ÿ ์›ํ‹ฐ๋“œ ํ”„๋ฆฌ์˜จ๋ณด๋”ฉ ์ธํ„ด์‹ญ 3์ฃผ์ฐจ ๊ณผ์ œ

Notifications You must be signed in to change notification settings

wanted-FE-team1/pre-onboarding-11th-3-1

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

79 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

preonboarding

์›ํ‹ฐ๋“œ ํ”„๋ฆฌ์˜จ๋ณด๋”ฉ ํ”„๋ก ํŠธ์—”๋“œ ์ธํ„ด์‹ญ 3์ฃผ์ฐจ ๊ณผ์ œ

๋™๋ฃŒํ•™์Šต์„ ํ†ตํ•ด์„œ ํŒ€์—์„œ ์ƒ๊ฐํ•œ ์›ํ‹ฐ๋“œ ํ”„๋ฆฌ์˜จ๋ณด๋”ฉ ํ”„๋ก ํŠธ์—”๋“œ ์ธํ„ด์‹ญ ์„ ๋ฐœ ๊ณผ์ œ์˜ Best Pratice๋ฅผ ๋งŒ๋“ค๊ณ  ์ œ์ถœํ•ด์ฃผ์„ธ์š”.
Best Practice๋ž€ ๋ชจ๋ฒ”์‚ฌ๋ก€๋ผ๋Š” ๋ง๋กœ์„œ, ํŠน์ • ๋ฌธ์ œ๋ฅผ ํšจ๊ณผ์ ์œผ๋กœ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ๊ฐ€์žฅ ์„ฑ๊ณต์ ์ธ ํ•ด๊ฒฐ์ฑ… ๋˜๋Š” ๋ฐฉ๋ฒ•๋ก ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

์ง„ํ–‰ ๊ธฐ๊ฐ„: 2023.07.11 ~ 2023.07.14






๋ชฉ์ฐจ


๐Ÿ”— ๋ฐฐํฌ ๋งํฌ

๋ฐฐํฌ์‚ฌ์ดํŠธ ๋ฐ”๋กœ๊ฐ€๊ธฐ


โš™๏ธ ์‹คํ–‰ ๋ฐฉ๋ฒ•

์„ค์น˜ ๋ฐ ์‹คํ–‰

$ npm install
$ npm start

๐Ÿค ํŒ€ ๊ทœ์น™

๋ธŒ๋žœ์น˜ ์ „๋žต

  • upstream์—๋Š” main ๋ธŒ๋žœ์น˜๋งŒ ์กด์žฌ
  • ๋ธŒ๋žœ์น˜๋ช…: feature/#์ด์Šˆ๋ฒˆํ˜ธ-๊ฐ„๋‹จํ•œ์„ค๋ช…
    • ex: feature/#7-setting
  • fork ํ•ด์„œ ๋ธŒ๋žœ์น˜ํŒŒ์„œ ์ž‘์—…ํ•œ๋’ค upstream:main์œผ๋กœ PR ๋‚ ๋ฆผ
  • ์ฝ”๋“œ๋ฆฌ๋ทฐ ๋ฐ›๊ณ  ์Šน์ธ ๋ฐ›์œผ๋ฉด upstream:main์— merge

๐Ÿ“‚ ํด๋” ๊ตฌ์กฐ

๐Ÿ“ฆsrc
  โ”œโ”€โ”€ ๐Ÿ“„index.css
  โ”œโ”€โ”€ ๐Ÿ“„index.tsx
  โ”œโ”€โ”€ ๐Ÿ“„App.tsx
  โ”œโ”€โ”€ ๐Ÿ“‚apis
  โ”œโ”€โ”€ ๐Ÿ“‚contexts
  โ”œโ”€โ”€ ๐Ÿ“‚components
  โ”œโ”€โ”€ ๐Ÿ“‚hooks
  โ”œโ”€โ”€ ๐Ÿ“‚pages
  โ”œโ”€โ”€ ๐Ÿ“‚utils
  โ””โ”€โ”€ ๐Ÿ“‚router

๐Ÿ› ๏ธ ๊ธฐ์ˆ  ์Šคํƒ


๐Ÿ“– ์„œ๋น„์Šค ์†Œ๊ฐœ

ํŠน์ • ๊นƒํ—ˆ๋ธŒ ๋ ˆํŒŒ์ง€ํ† ๋ฆฌ์˜ ์ด์Šˆ ๋ชฉ๋ก๊ณผ ์ƒ์„ธ ๋‚ด์šฉ์„ ์กฐํšŒํ•  ์ˆ˜ ์žˆ๋Š” ์›น ์‚ฌ์ดํŠธ ๊ตฌ์ถ•

๊ธฐ๋Šฅ ๊ตฌํ˜„

  • ์ด์Šˆ ๋ฆฌ์ŠคํŠธ ์กฐํšŒ
  • ๊ฐœ๋ณ„ ์ด์Šˆ ์กฐํšŒ
  • ์ด์Šˆ 5๊ฐœ๋งˆ๋‹ค ๊ด‘๊ณ  ์‚ฝ์ž…

ํŽ˜์ด์ง€

์ด์Šˆ ๋ชฉ๋ก ๊ฐœ๋ณ„ ์ด์Šˆ
์ด์Šˆ๋ชฉ๋ก ๊ฐœ๋ณ„์ด์Šˆแ…ตแ†ฏ

๐Ÿ‘‘ Best Practice

์„ ์ • ๊ธฐ์ค€

  1. ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ ๋ฐ ์žฌ์‚ฌ์šฉ์„ฑ
  • ๊ฐ€๋…์„ฑ์€ ํ˜‘์—…์„ ํ•˜๋ฉด์„œ๋„ ์ค‘์š”ํ•˜๋ฉฐ, ์œ ์ง€ ๋ณด์ˆ˜์„ฑ์„ ํ–ฅ์ƒ
  • ์ค‘๋ณต ์ฝ”๋“œ๋ฅผ ์ตœ์†Œํ™” ํ•˜๊ณ  ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์œ ํ‹ธ๋ฆฌํ‹ฐ ํ•จ์ˆ˜ ์ž‘์„ฑ(useHook)
  1. ํ™•์žฅ์„ฑ
  • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๊ธฐ๋Šฅ์„ ์œ ์—ฐํ•˜๊ฒŒ ํ™•์žฅํ•˜๊ณ  ์œ ์ง€ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ์ž‘์„ฑ
  1. ์‚ฌ์šฉ์ž ํŽธ์˜์„ฑ
  • ์‚ฌ์šฉ์ž๋“ค์ด ์›น ๋˜๋Š” ์•ฑ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‰ฝ๊ฒŒ ์ดํ•ดํ•˜๊ณ  ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ค๊ณ„

์ˆ˜ํ–‰ ๋ฐฉํ–ฅ

  • Best Practice๋ฅผ ์„ ์ •ํ•˜๊ธฐ์ „ ๊ฐ์ž ๊ตฌํ˜„ํ•œ ์ฝ”๋“œ๋ฅผ ์„ค๋ช…ํ•˜๋ฉฐ ์ฝ”๋“œ๋ฆฌ๋ทฐ๋ฅผ ์ง„ํ–‰
  • ๊ฐ์ž ๋งก์€ ์ฝ”๋“œ ๊ตฌํ˜„ ๋ฐฉ๋ฒ•๋“ค์„ ์ •๋ฆฌ ํ›„ ์Šคํฌ๋Ÿผ์„ ํ†ตํ•ด Best Practice ์„ ์ •
  • ์ฝ”๋“œ์ปจ๋ฒค์…˜ ๋ฐ ์–ธ์–ด, ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ, ํด๋”๊ตฌ์กฐ ์ •๋ฆฌ
  • Best Practice๋กœ ๋ฝ‘ํžŒ ๊ตฌํ˜„๋ฐฉ์‹์ค‘ ๊ตฌํ˜„ํ•˜์ง€ ์•Š์€ ๋ถ€๋ถ„๋“ค์„ ๋‚˜๋ˆ„์–ด ์—…๋ฌด ๋ถ„๋‹ด
  • ์ด์Šˆ ์ž‘์„ฑ ๋ฐ ๊ฐœ๋ณ„์ ์œผ๋กœ ์ฝ”๋“œ ๊ตฌํ˜„ ํ›„ pr ํ›„ ์ฝ”๋“œ๋ฆฌ๋ทฐ๋ฅผ ์ง„ํ–‰ ํ•˜๊ณ  merge

๊ตฌํ˜„์‚ฌํ•ญ


๐Ÿ“Œ API

axios instance

  • baseURL ์ง€์ •
  • header์— ๋ชจ๋“  ์š”์ฒญ ์‹œ ๊ณตํ†ต์œผ๋กœ ๋“ค์–ด๊ฐ€๋Š” Accept, Authorization(ํ† ํฐ) ์ง€์ •

ํŠน์ • ์ €์žฅ์†Œ์˜ ์ด์Šˆ ๋ฐ์ดํ„ฐ๋ฅผ ์š”์ฒญํ•˜๋Š” api class

  • private ํ‚ค์›Œ๋“œ: path, query์˜ ์™ธ๋ถ€ ์ ‘๊ทผ์„ ๋ง‰๊ธฐ์œ„ํ•ด private ํ‚ค์›Œ๋“œ ์„ค์ •
  • getIssueList: ์ด์Šˆ ๋ชฉ๋ก์„ ์š”์ฒญํ•˜๋Š” ๋ฉ”์†Œ๋“œ
  • getIssue: ๋‹จ์ผ ์ด์Šˆ๋ฅผ ์š”์ฒญํ•˜๋Š” ๋ฉ”์†Œ๋“œ

sort type

  • ๊ธฐ์กด ์ฝ”๋“œ๋Š” sort ์˜ต์…˜ ์ค‘ ํ•˜๋‚˜์ธ comments๋ฅผ QUERY_SORT_TYPE์— ํ• ๋‹นํ•ด์„œ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Œ
  • sort ์˜ต์…˜์€ created, updated, comments ์ด 3๊ฐ€์ง€๊ฐ€ ์žˆ๋Š”๋ฐ, ์ด ์™ธ์— ๋‹ค๋ฅธ ๋ฌธ์ž์—ด์ด ํ• ๋‹น๋˜๋ฉด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Œ. ๊ทธ๋ž˜์„œ ๊ธฐ์กด์˜ string ํƒ€์ž…๋ณด๋‹ค ๋” ๊ตฌ์ฒด์ ์ธ ๋ฆฌํ„ฐ๋Ÿด ํƒ€์ž…์„ ์ง€์ •ํ•ด ์˜ค๋ฅ˜๋ฅผ ๋ฐฉ์ง€ํ•จ
type SortType = 'created' | 'updated' | 'comments';

export class RepositoryAPI {
  private static QUERY_SORT_TYPE: SortType = 'comments';

  // code...
}

๐Ÿ“Œ IssueList ์ปดํฌ๋„ŒํŠธ

  1. ๊ด€์‹ฌ์‚ฌ๋ฅผ ๋ถ„๋ฆฌํ•˜์—ฌ ์ปดํฌ๋„ŒํŠธ์˜ ๊ฐ€๋…์„ฑ๊ณผ ์œ ์ง€ ๋ณด์ˆ˜์„ฑ์„ ํ–ฅ์ƒ
  • ๋ฌดํ•œ ์Šคํฌ๋กค ๋กœ์ง, ์ด์Šˆ ๋ฐ์ดํ„ฐ ๋ฐ ์ƒํƒœ ๊ด€๋ฆฌ๋Š” IssueContext๋กœ ๋ถ„๋ฆฌ๋˜์–ด ๊ด€์‹ฌ์‚ฌ ๋ถ„๋ฆฌ

  • Intersection Observer๊ณผ ๊ด€๋ จ๋œ ๋กœ์ง์„ useIntersectionObserver ํ›…์„ ํ†ตํ•ด ๋ณ„๋„๋กœ ๋ถ„๋ฆฌ

    // src/pages/IssueList.tsx
    const { issues, getInfiniteIssues, isLoading, isError } =
      useContext(IssueContext);
    const handleIntersection = () => {
      if (!isLoading) getInfiniteIssues();
    };
    const ref = useIntersectionObserver({ callback: handleIntersection });
  1. ์—๋Ÿฌ ์ฒ˜๋ฆฌ : ๋ฆฌ๋‹ค์ด๋ ‰์…˜ vs ์—๋Ÿฌ ์ปดํฌ๋„ŒํŠธ
  • ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ ์ปดํฌ๋„ŒํŠธ๋งŒ ์˜ํ–ฅ์„ ๋ฐ›๊ณ , ๋‹ค๋ฅธ ์„œ๋น„์Šค๋‚˜ ๊ธฐ๋Šฅ์€ ์ •์ƒ์ ์œผ๋กœ ๋™์ž‘ํ•  ์ˆ˜ ์žˆ์Œ

  • ์ „์ฒด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์•ˆ์ •์„ฑ์„ ์œ ์ง€ํ•˜๋ฉด์„œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ ๋ถ€๋ถ„๋งŒ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Œ

    {
      isError ? <Error /> : <li ref={ref}></li>;
    }

๐Ÿ“Œ useIntersectionObserver ์ปค์Šคํ…€ ํ›…

  • Intersection Observer๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์š”์†Œ์˜ ๊ฐ€์‹œ์„ฑ ๋ณ€๊ฒฝ์„ ๊ฐ์ง€ํ•˜๊ณ , ์ง€์ •๋œ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ์—ญํ• 

  • ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ์ด ํ–ฅ์ƒ. Intersection Observer์˜ ๋กœ์ง์ด ๋ถ„๋ฆฌ๋˜์–ด ๋”์šฑ ๋ช…ํ™•ํ•˜๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Œ

  • ์žฌ์‚ฌ์šฉ์„ฑ์ด ๋†’์•„์ง. useIntersectionObserver ํ›…์„ ๋‹ค๋ฅธ ์ปดํฌ๋„ŒํŠธ์—์„œ๋„ ํ™œ์šฉํ•˜์—ฌ ๊ฐ€์‹œ์„ฑ ๋ณ€๊ฒฝ ์ด๋ฒคํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Œ

    const useIntersectionObserver = ({ callback, option = {} }) => {
      const ref = useRef(null);
      const handleIntersection = (entries) => {
        const target = entries[0];
        if (target.isIntersecting) callback();
      };
      useEffect(() => {
        const observer = new IntersectionObserver(handleIntersection, {
          threshold: 0.5,
          ...option,
        });
        if (ref.current) observer.observe(ref.current);
        return () => observer.disconnect();
      }, [handleIntersection]);
      return ref;
    };

๐Ÿ“Œ context API ํ™œ์šฉํ•˜์—ฌ Issue ๋ชฉ๋ก ๊ด€๋ฆฌ

[๊ณ ๋ฏผ ์‚ฌํ•ญ]

์ด์Šˆ๋“ค์„ ๋ฌดํ•œ์œผ๋กœ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ ์œ„ํ•œ page ๋ณ€์ˆ˜๋ฅผ ์–ด๋””์„œ ๊ด€๋ฆฌํ• ์ง€์— ๋Œ€ํ•œ ๊ณ ๋ฏผ

  1. Issue Context๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ ๋‹จ(IssueList ํŽ˜์ด์ง€)์—์„œ ๊ด€๋ฆฌ
  2. Issue Context์—์„œ ๊ด€๋ฆฌ
  • ๋…ผ์˜ ๊ฒฐ๊ณผ: Issue Context์—์„œ ๊ด€๋ฆฌ
  • ์ด์œ : page ๋ณ€์ˆ˜๋Š” ์˜ค๋กœ์ง€ ์ด์Šˆ๋ฅผ ์œ„ํ•ด์„œ๋งŒ ์กด์žฌํ•˜๊ธฐ ๋•Œ๋ฌธ์—, issue๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” IssueContext ์—์„œ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒŒ ์ ํ•ฉํ•˜๋‹ค๊ณ  ํŒ๋‹จ

[๊ทธ ์™ธ ๊ฐœ์„  ์‚ฌํ•ญ]

  1. ์ด์Šˆ๋ฅผ ๋ถˆ๋Ÿฌ์˜ฌ ๋•Œ ์‚ฌ์šฉํ•˜๋Š” page ๋ณ€์ˆ˜๋Š” state ๋Œ€์‹  useRef ์‚ฌ์šฉํ•˜์—ฌ ๋ถˆํ•„์š”ํ•œ ๋ฆฌ๋žœ๋”๋ง ๋ฐฉ์ง€
  2. isEndRef ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋” ์ด์ƒ ๋ถˆ๋Ÿฌ์˜ฌ ๋ฐ์ดํ„ฐ๊ฐ€ ์—†์œผ๋ฉด api๋ฅผ ํ˜ธ์ถœํ•˜์ง€ ์•Š๋„๋ก ๋ง‰์Œ

๐Ÿ“Œ Router ๊ธฐ๋Šฅ : createBrowserRouter๋กœ ๊ตฌํ˜„

๊ธฐ์กด์˜ ๋ผ์šฐํŒ… ๊ธฐ๋Šฅ๋ณด๋‹ค ๋งŽ์€ ๊ธฐ๋Šฅ๋“ค์ด ์ถ”๊ฐ€๋˜์–ด ์žˆ์–ด ํ™œ์šฉ์„ฑ์ด ๋†’๋‹ค.
ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌ ๊ฐ€๋Šฅ, ๊ฒฝ๋กœ๊ฐ€ ๋งŽ๋‹ค๋ฉด ๊ฐ€๋…์„ฑ์ด ์ข‹์œผ๋ฉฐ ์—๋Ÿฌ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋”ฐ๋กœ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

  1. App.tsx ์—์„œ RouterProvider ์—ฐ๊ฒฐ
  2. routerํด๋” > Router.tsx์—์„œ createBrowserRouter ์‚ฌ์šฉ
    ํ˜„์žฌ '/' ๋ฉ”์ธ ํŽ˜์ด์ง€๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ธฐ์— index๊ฐ’์„ true๋กœ ์„ค์ •ํ•˜์—ฌ '/' ์ ‘๊ทผ์‹œ '/repos/facebook/react/issues' ๊ฒฝ๋กœ๋กœ ์ด๋™ํ•˜๋„๋ก ์„ค์ •
    ๊ฒฝ๋กœ๊ฐ€ '/repos/:owner/:repo/issues'๋ผ๋ฉด ๋ฅผ ๋ Œ๋”๋ง
    ๊ฒฝ๋กœ๊ฐ€ '/repos/:owner/:repo/issues/:id'๋ผ๋ฉด ๋ฅผ ๋ Œ๋”๋ง
    router์— ์„ค์ •ํ•œ ์„ค์ •๋Œ€๋กœ ์ง€์ •ํ•œ url์ด ์•„๋‹ ๊ฒฝ์šฐ์— ์—๋Ÿฌ ํŽ˜์ด์ง€(NotFoundPage) ๋ Œ๋”๋ง
import { createBrowserRouter, Navigate } from 'react-router-dom';
import IssueDetail from '../pages/IssueDetail';
import IssueList from '../pages/IssueList';
import NotFoundPage from '../pages/NotFoundPage';
import { Root } from './Root';

export const router = createBrowserRouter([
  {
    path: '/',
    element: <Root />,
    children: [
      {
        index: true,
        element: <Navigate to={'/repos/facebook/react/issues'} />,
      },
      {
        path: '/repos/:owner/:repo/issues',
        element: <IssueList />,
      },
      {
        path: '/repos/:owner/:repo/issues/:id',
        element: <IssueDetail />,
      },
    ],
    errorElement: <NotFoundPage />,
  },
]);

๋˜ํ•œ Header text(owner/repo) ๊ตฌํ˜„์‹œ,
ํŠน์ • ๋ ˆํฌ๋ฅผ ์„ ํƒํ•˜์—ฌ ๊ธฐ์กด ํ•˜๋“œ์ฝ”๋”ฉ์œผ๋กœ ๊ตฌํ˜„ํ•œ ๊ฒƒ๋ณด๋‹ค ํ™•์žฅ์„ฑ์„ ๊ณ ๋ คํ•˜์—ฌ
Router.tsx์—์„œ ๊ฒฝ๋กœ ์„ค์ •์„ '/repos/facebook/react/issues' ์ด๋ ‡๊ฒŒ ๋งŒ๋“ค์–ด
useParams๋กœ owner/repo๋ฅผ ๊บผ๋‚ด์˜ฌ ์ˆ˜ ์žˆ๋‹ค.
Router.tsx์—์„œ owner/repo๋ฅผ ๋ฐ”๊พธ๊ธฐ๋งŒ ํ•˜๋ฉด ์›ํ•˜๋Š” ๋ ˆํฌ์˜ ์ด์Šˆ๋ฅผ ์š”์ฒญํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋งŒ๋“ฆ

//Header.tsx
import { useParams } from 'react-router-dom';

export default function Header() {
  const { owner, repo } = useParams();
  return (
    <header className='header p-6 pl-16 bg-blue-500 text-white text-xl mb-5 flex items-center justify-center'>
      <h1>
        {owner}/{repo}
      </h1>
    </header>
  );
}

๐Ÿ“Œ IssueDetail ์ปดํฌ๋„ŒํŠธ: API ์š”์ฒญ ์ฒ˜๋ฆฌ ๋ฐฉ๋ฒ• ์„ ํƒ

  1. ๋…ผ์˜ ์‚ฌํ•ญ
    • IssueContext์—์„œ ๋ชจ๋“  ์ด์Šˆ๋ฅผ ๊ด€๋ฆฌํ•˜๋˜ ๋กœ๋”ฉ, ์—๋Ÿฌ ์ƒํƒœ๋Š” ๊ด€๋ฆฌ ์•ˆํ•จ
    • IssueContext์—์„œ๋Š” ์ด์Šˆ ๋ฌดํ•œ์Šคํฌ๋กค๋กœ ๋ถˆ๋Ÿฌ์˜ค๋Š” ๊ฒƒ๋งŒ ๋‹ด๋‹น, ๊ทธ์— ๋”ฐ๋ฅธ ๋กœ๋”ฉ & ์—๋Ÿฌ ์ƒํƒœ๋„ ๊ฐ™์ด ๊ด€๋ฆฌ
  2. ๋…ผ์˜ ๊ฒฐ๊ณผ
    • IssueContext์—์„œ ๋ชจ๋“  ์ด์Šˆ๋ฅผ ๊ด€๋ฆฌํ•˜๊ฒŒ ๋˜๋ฉด ๋กœ๋”ฉ, ์—๋Ÿฌ ์ƒํƒœ ๊ณต์œ ํ•ด์„œ ์“ฐ๊ฒŒ ๋˜๊ธฐ ๋•Œ๋ฌธ์— IssueContext๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ ๋‹จ์—์„œ ๋กœ๋”ฉ, ์—๋Ÿฌ ์ƒํƒœ ๋ณ€์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด์•ผ ํ•ด์„œ ๊ฐœ๋ณ„ ์ด์Šˆ api ํ˜ธ์ถœ์€ IssueDetail์—์„œ ์ง์ ‘ํ•˜๋Š”๊ฒŒ ์ ํ•ฉ
  3. ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•
    • ๊ฐœ๋ณ„ ์ด์Šˆ apiํ˜ธ์ถœ์€ IssueContext๊ฐ€ ์•„๋‹Œ IssueDetail์—์„œ ์ง„ํ–‰

About

๐Ÿ ์›ํ‹ฐ๋“œ ํ”„๋ฆฌ์˜จ๋ณด๋”ฉ ์ธํ„ด์‹ญ 3์ฃผ์ฐจ ๊ณผ์ œ

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published