Skip to content

2week_FE_tech_post_1

sey2 edited this page Jan 9, 2024 · 3 revisions

ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ์ œ๋„ค๋ฆญ์ด๋ž€?

์ œ๋„ค๋ฆญ์„ ์ฒ˜์Œ ๋งˆ์ฃผ์นœ ์ˆœ๊ฐ„

ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋กœ ์ž‘์„ฑ๋œ ์ฝ”๋“œ๋ฅผ ๋ณด๋‹ค๋ณด๋ฉด ํ•จ์ˆ˜๋ช…<T>(a: T) {...}๊ณผ ๊ฐ™์ด ์ž‘์„ฑ๋œ ์ฝ”๋“œ๊ฐ€ ์ข…์ข… ๋ณด์ธ๋‹ค. ์ด๋ฒˆ ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋ฉด์„œ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ฒ˜์Œ ์“ฐ๋‹ค ๋ณด๋‹ˆ ๋ฌด์Šจ ๋œป์ธ์ง€๋„ ๋ชจ๋ฅด๊ณ  ์•ˆ ์จ๋„ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์–ด์„œ ์šฐ์„ ์€ ๋ฌด์‹œํ•œ ์ฑ„๋กœ ๊ณ„์†ํ•ด์„œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด ๋‚˜๊ฐ”๋‹ค. ๊ทธ๋Ÿฌ๋‹ค API๋ฅผ ํ†ตํ•ด์„œ ๋ฐ์ดํ„ฐ๋ฅผ fetchํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•˜๋ ค๊ณ  ์ž๋ฃŒ๋ฅผ ์ฐพ๋‹ค๋ณด๋‹ˆ ๋‹ค์‹œ ํ•œ ๋ฒˆ ๋งˆ์ฃผ์น˜๊ฒŒ ๋˜์—ˆ๋‹ค.

์ œ๋„ค๋ฆญ์„ ํฌํ•จํ•œ ์•„์ฃผ ๊ฐ„๋‹จํ•œ ์˜ˆ์‹œ

function sort<T>(item: T[]): T[] {
  return item.sort();
}

const nums: number[] = [1, 2, 3, 4];

sort<number>(nums);

์œ„์˜ sortํ•จ์ˆ˜๋Š” ๋ฐฐ์—ด์„ ๋ฐ›์•„์„œ ํ•ด๋‹น ๋ฐฐ์—ด์„ ์ •๋ ฌํ•˜๋Š” ๊ฐ„๋‹จํ•œ ํ•จ์ˆ˜์ด๋‹ค. sort<T>์—์„œ <T>๊ฐ€ ์ œ๋„ค๋ฆญ ํƒ€์ž…์ด๋‹ค. ์ฆ‰ sortํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ํƒ€์ž…๋„ <T>๋กœ ๋ฐ›์•„์˜ค๊ฒŒ ๋œ๋‹ค. sort<number>(nums);๋ผ๋ฉด ์ด๋ฒˆ์— ํ˜ธ์ถœ๋œ sortํ•จ์ˆ˜์—์„œ T๋Š” number๊ฐ€ ๋œ๋‹ค. ์ฆ‰ ํ•จ์ˆ˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ๋‹ค.

function sort(item: number[]): number[] {
    return item.sort();
}

์ฆ‰ number๋ฐฐ์—ด์„ ์ž…๋ ฅ์œผ๋กœ ๋ฐ›์•„ number๋ฐฐ์—ด์„ ์ถœ๋ ฅํ•˜๋Š” ํ•จ์ˆ˜๊ฐ€ ๋˜๋Š” ๊ฒƒ์ด๋‹ค. ๋ฌผ๋ก  ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•  ๋•Œ ์ฒ˜์Œ๋ถ€ํ„ฐ any[]์„ ์‚ฌ์šฉํ•ด๋„ ๋œ๋‹ค. ํ•˜์ง€๋งŒ any๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ์—์„œ ์ปดํŒŒ์ผ ์‹œ ํƒ€์ž…์„ ํ™•์ธํ•ด ์ฃผ์ง€ ์•Š๋Š”๋‹ค. ํ•˜์ง€๋งŒ ์ œ๋„ค๋ฆญ ํƒ€์ž…์„ ์‚ฌ์šฉํ•˜๋ฉด ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ํƒ€์ž…์„ ํ™•์ธํ•ด ์˜ค๋ฅ˜๋ฅผ ์žก์•„์ค„ ์ˆ˜ ์žˆ๋‹ค.

์‹ค์ œ useFetchํ•จ์ˆ˜์—์„œ์˜ ์‚ฌ์šฉ

type FetchStatus = 'idle' | 'loading' | 'success' | 'error';

interface FetchResponse<T> {
  data: T | null;
  error: string | null;
  status: FetchStatus;
}

const useFetch = <T>(url: string): FetchResponse<T> => {
  const [data, setData] = useState<T | null>(null);

  ...

  return {data};
}

์œ„๋Š” ํ”„๋กœ์ ํŠธ์—์„œ ์‚ฌ์šฉํ•˜๋Š” useFetch๋ผ๋Š” ์ปค์Šคํ…€ ํ›…์˜ ์ผ๋ถ€ ์ฝ”๋“œ์ด๋‹ค. useFetch๋Š” ์ œ๋„ค๋ฆญ ํƒ€์ž…์œผ๋กœ ํƒ€์ž… <T>๋กœ ๋ฐ›๊ณ  ๋ฌธ์ž์—ด url์„ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋ฐ›์•„์„œ FetchResponse<T>๋ผ๋Š” ํƒ€์ž…์„ returnํ•˜๋Š” ํ•จ์ˆ˜์ด๋‹ค. interface FetchResponse<T>๋Š” ๋˜ํ•œ ๊ฐ์ฒดํ˜•ํƒœ๋กœ data: T | null;์„ ํ†ตํ•ด์„œ ๊ฐ์ฒด์—์„œ data์˜ value๋กœ๋Š” Tํƒ€์ž…์˜ ๊ฐ’ ๋˜๋Š” null๋งŒ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ฃผ์—ˆ๋‹ค.

๋”ฐ๋ผ์„œ ์šฐ๋ฆฌ๊ฐ€ useFetch๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ๋Š” ์ œ๋„ค๋ฆญ ํƒ€์ž…์œผ๋กœ ์›ํ•˜๋Š” ํƒ€์ž…์„ ๋„˜๊ฒจ์ฃผ๋ฉด ํ•ด๋‹น ํƒ€์ž…์„ ๊ฐ€์ง€๊ณ  ๊ฒฐ๊ณผ๋ฅผ returnํ•ด์ฃผ๋Š” ํ˜•ํƒœ๋กœ ๋™์ž‘ํ•œ๋‹ค. ์•„๋ž˜์™€ ๊ฐ™์ด ์‚ฌ์šฉํ•ด์„œ API์—์„œ ๋„˜๊ฒจ์ฃผ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ interface๋ฅผ ์„ ์–ธํ•ด์ฃผ๊ณ  ํ•ด๋‹น interface๋ฅผ useFetch์˜ ์ œ๋„ค๋ฆญ ํƒ€์ž…์œผ๋กœ ๋…๊ฒจ์ฃผ๋ฉด ๋ฐ์ดํ„ฐ์˜ ํƒ€์ž…์„ ๋ฐ˜์˜ํ•ด์„œ ์•ˆ์ „ํ•˜๊ฒŒ ๋ฐ›์„ ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

interface IProps {
  name: string;
  age: number;
  major: string[];
}

const { data } = useFetch<IProps>('API ์ฃผ์†Œ');

console.log(data.name);
console.log(data.age);

์ถ”๊ฐ€์ ์ธ ์ œ๋„ค๋ฆญ์˜ ์‚ฌ์šฉ๋ฒ• - extends

function getLen<T>(data: T) {
  return data.lenght;
}

์˜๋ฏธ์—†๋Š” ํ•จ์ˆ˜์ด์ง€๋งŒ ์œ„์™€๊ฐ™์ด ์–ด๋– ํ•œ ๋ฐ์ดํ„ฐ์˜ length๋ฅผ ๊ตฌํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•œ๋‹ค๊ณ  ํ•˜์˜€์„ ๋•Œ ์œ„์™€ ๊ฐ™์ด ์ž‘์„ฑํ•˜๋ฉด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ํ•จ์ˆ˜์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋“ค์–ด์˜จ data๋ผ๋Š” ๊ฐ’์— length๋ผ๋Š” ์†์„ฑ์ด ์—†์„ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๋”ฐ๋ผ์„œ getLen์ด๋ผ๋Š” ํ•จ์ˆ˜๋ฅผ ์ˆ˜ํ–‰ํ•  ๋•Œ ๋ฏธ๋ฆฌ length๋ผ๋Š” ์†์„ฑ์ด ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•œ ๊ฒƒ์ด extends์ด๋‹ค.

interface lengthCheck {
  length: number;
}

function getLen<T extends lengthCheck>(data: T) {
  return data.lenght;
}

์œ„์™€ ๊ฐ™์ด ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋ฉด ์ œ๋„ค๋ฆญ Tํƒ€์ž…์€ ๋ฐ˜๋“œ์‹œ lengthCheck๋ผ๋Š” interface๋ฅผ ํฌํ•จํ•œ๋‹ค๋Š” ๋œป์ด๋‹ค. ์ฆ‰ T extends lengthCheck๋ผ๋Š” ํƒ€์ž…์€ ๋ฐ˜๋“œ์‹œ lenght๋ผ๋Š” ์†์„ฑ์„ ๊ฐ€์ง€๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— return data.length;์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

๐Ÿ’ป Projects

๐Ÿค Rules

โ˜€๏ธ Meetings

๐ŸŒต Reviews

1์ฃผ์ฐจ
2์ฃผ์ฐจ
3์ฃผ์ฐจ
4์ฃผ์ฐจ

๐ŸŒˆ Scrums

1์ฃผ์ฐจ
2์ฃผ์ฐจ
3์ฃผ์ฐจ
4์ฃผ์ฐจ

๐Ÿ›  Tech Posts & Mini seminar

๐Ÿ’ช๐Ÿผ [BE]

๐Ÿ›ค [FE]

๐Ÿ›ธ [AOS]


Clone this wiki locally