TIL 0324

zittoยท2023๋…„ 3์›” 25์ผ
0

TIL

๋ชฉ๋ก ๋ณด๊ธฐ
10/77
post-thumbnail

๐Ÿท๏ธ [๋ชฉ์ฐจ]

  • ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋ž€?
  • ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ 
  • ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ์‚ฌ์šฉ๋ฐฉ๋ฒ•
  • ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ ํ™•์žฅ์ž์™€ ์‹ค์Šต
    • ํƒ€์ž… ์ถ”๋ก 
    • ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ๋ฐฐ์—ด, ๊ฐ์ฒด ์‹ค์Šต
  • ์—„๊ฒฉํ•œ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ strict
    • ํƒ€์ž…์œผ๋กœ ๋ญ˜ ๋ฐ›์•„์˜ค๋Š” ์ง€ ์ž˜ ๋ชจ๋ฅผ ๋•Œ
  • ์œ ํ‹ธ๋ฆฌํ‹ฐ ํƒ€์ž…
  • API ์‘๋‹ต ๋ฐ์ดํ„ฐ์˜ ํƒ€์ž…์€ ์–ด๋–ป๊ฒŒ ํ• ๊นŒ?
    • graphql์— codegen ์ ์šฉํ•ด๋ณด๊ธฐ

๐Ÿ–‡๏ธ [์ถœ์ฒ˜ ๋ฐ ์ฐธ์กฐ]

์ฝ”๋“œ์บ ํ”„



๐Ÿ’กย TypeScript โ“

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ํƒ€์ž…์„ ๊ฐ•์ œ์‹œํ‚ค๋Š” ์–ธ์–ด!

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์™€ ๋‹ฌ๋ฆฌ ๋ณ€์ˆ˜์— ์ž๋ฃŒํ˜•์„ ์ง€์ •ํ•ด์ฃผ๋Š” ํŠน์„ฑ
๋ณ€์ˆ˜์— ๋ฌธ์ž์—ด์„ ํ• ๋‹นํ–ˆ๋‹ค๊ฐ€ ์ดํ›„์— ์ˆซ์ž์—ด์„ ํ• ๋‹นํ•ด์ฃผ๋ฉด ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธด๋‹ค.-> let aaa(์ƒ์ž):string(์ƒ์ž์ด๋ฆ„) = "์•ˆ๋…•ํ•˜์„ธ์š”"
aaa = 123

let hello:string = "hello" 
// โŒ ๋ถˆ๊ฐ€๋Šฅ
hello = 12345
// โญ•๏ธ ๋ฌธ์ž์—ด๋งŒ ํ• ๋‹น ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
hello = "12345"

โœ… ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ฝ๋Š” ๋ฐฉ๋ฒ•โ—๏ธ

๋ธŒ๋ผ์šฐ์ €๋Š” HTML,CSS,Javascript๋งŒ ์ฝ์„ ์ˆ˜ ์žˆ๊ธฐ์— ์‹คํ–‰ ์‹œ์— ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ ๋ณ€๊ฒฝ๋˜์–ด ์‹คํ–‰๋œ๋‹ค.
-> ์ปดํŒŒ์ผ๊ณผ ํŠธ๋žœ์ŠคํŒŒ์ผ ์ž‘์—…์ด ํ•„์š”!

  • ์ปดํŒŒ์ผ: ํ•˜๋‚˜์˜ ์–ธ์–ด๊ฐ€ ๋‹ค๋ฅธ ์–ธ์–ด๋กœ ๋ณ€๊ฒฝ๋˜๋Š” ์ž‘์—…
  • ํŠธ๋žœ์ŠคํŒŒ์ผ: ํ•˜๋‚˜์˜ ์–ธ์–ด๊ฐ€ ๊ฐ™์€ ์–ธ์–ด์˜ ๋‹ค๋ฅธ ๋ฒ„์ „์œผ๋กœ ๋ณ€๊ฒฝ๋˜๋Š” ์ž‘์—…
    ๋„๊ตฌ๋ฅผ ์ปดํŒŒ์ผ๋Ÿฌ ๋˜๋Š” ํŠธ๋žœ์ŠคํŒŒ์ผ๋Ÿฌ ๋ผ๊ณ  ํ•œ๋‹ค.

๐Ÿ’ก ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ โ“

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ์œ ์—ฐํ•œ ์–ธ์–ด์ด๊ธฐ ๋•Œ๋ฌธ์—
๋ณ€์ˆ˜๋‚˜ ์ƒ์ˆ˜์˜ ํ• ๋‹น ๊ฐ’์ด ์ž์œ ์ž์žฌ๋กœ ๋ณ€ํ™˜์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
ํ•˜์ง€๋งŒ ์ด๋Ÿฐ ์ ์ด ํฐ ์„œ๋น„์Šค๋ฅผ ๊ฐœ๋ฐœ ํ•  ๋•Œ๋Š” ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธธ ์ˆ˜ ์žˆ๋‹ค.
ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ์˜ ๊ฒฝ์šฐ ์ˆซ์ž๋ณ€์ˆ˜์—๋Š” ์ˆซ์ž๋งŒ, ๋ฌธ์ž์—๋Š” ๋ฌธ์ž๋งŒ ๋„ฃ์–ด์„œ ์•ˆ์ •์„ฑ์„ ๋†’์—ฌ์ค€๋‹ค!


๐Ÿ’ก ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ์‚ฌ์šฉ๋ฐฉ๋ฒ•

-> interface์˜ I + ๋ณ€์ˆ˜๋ช…์„ ํ•ฉ์ณ์„œ ๊ฐ์ฒดํƒ€์ž…์„ ๋งŒ๋“ค์–ด์ฃผ๋Š” ๊ฒƒ์ด ๋„ค์ด๋ฐ ๊ด€๋ก€!
๊ฐ ๋ณ€์ˆ˜์— ํƒ€์ž…์„ ์ง€์ •ํ•ด์ฃผ๊ณ  ๋‚˜๋ฉด, ํƒ€์ž…์— ๋งž์ง€ ์•Š๋Š” ๊ฐ’์„ ํ• ๋‹น ์‹œ ์—๋Ÿฌ๊ฐ€ ๋‚˜๊ฒŒ ๋œ๋‹ค.


๐Ÿ’ก ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ ํ™•์žฅ์ž์™€ ์‹ค์Šต

โœ… ์„ค์น˜

typescript


1๏ธโƒฃ ๋ช…๋ น์–ด (package.json ํŒŒ์ผ ์žˆ๋Š” ์œ„์น˜)
yarn add typescript --dev
yarn add @types/react@17.0.2 @types/node@17.0.2 --dev


2๏ธโƒฃ typescript ์„ค์ • ํŒŒ์ผ(tsconfig.json)๋งŒ๋“ค๊ณ  yarn dev ํ•˜๋ฉด ์ž๋™์œผ๋กœ ์ฑ„์›Œ์ง
3๏ธโƒฃ strict์„ true๋กœ ๋ฐ”๊พธ๊ธฐ(์—„๊ฒฉํ•œ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ)

โœ… ํŒŒ์ผ ํ™•์žฅ์ž

  1. JSX ๋ฅผ return ํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ : tsx
  2. ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋งŒ ์‚ฌ์šฉํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ : ts

โœ… ํƒ€์ž…์ถ”๋ก 

๋ณ€์ˆ˜์— ํƒ€์ž…์„ ๋จผ์ € ์ž…ํžˆ์ง€ ์•Š๊ณ  ํ• ๋‹น์„ ํ•˜๊ฒŒ ๋˜๋ฉด ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋Š” ํ• ๋‹น๋œ ๊ฐ’์˜ ์ž๋ฃŒํ˜•์„ ํƒ€์ž…์œผ๋กœ ์ถ”๋ก  ํ•˜๊ฒŒ ๋œ๋‹ค.-> string์„ ํ•ด์ฃผ์ง€ ์•Š์•„๋„ ์—๋Ÿฌ๋ฅผ ์žก์•„๋ƒ„
ํƒ€์ž…์ด ์ถ”๋ก ๋ซ๊ธฐ ๋•Œ๋ฌธ์ž„

โœ… ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ๋ฐฐ์—ด, ๊ฐ์ฒด ์‹ค์Šต

/* ๋ฐฐ์—ดํƒ€์ž… */
// ๋ฌธ์ž์—ด๋งŒ ์žˆ๋Š” ๋ฐฐ์—ด
let aaa:string[] = ["์›๋‘","์€์ •","ํ˜œ์›"]
// ๋ฐฐ์—ด์— ๋ฌธ์ž์—ด๊ณผ ์ˆซ์ž์—ด์„ ๊ฐ™์ด ๋„ฃ์–ด๋‘๊ณ  ์‹ถ์„ ๋•Œ
let fff:(string | number)[] = [1,2,3,"์ฒ ์ˆ˜","์˜ํฌ"]
// ๋ชจ๋‘ ์ˆซ์ž์ด๊ฑฐ๋‚˜ ๋ชจ๋‘ ๋ฌธ์ž์ธ ๋ฐฐ์—ด
let hhh: string[] | nuber[] =[ "์˜ํฌ","์ฒ ์ˆ˜" ]
hhh=[1,2,3]
/* ๊ฐ์ฒดํƒ€์ž… */
interface IPropfile {
		name : string
		age : number 
		school : string
	}
const profile:IPropfile = {
		name : "์›๋‘"
		age : 8
		school : "์ฝ”์บ  ์ดˆ๋“ฑํ•™๊ต"
	} 
//age์˜ ํƒ€์ž…์ด ๋ฌธ์ž์—ด์ด๊ฑฐ๋‚˜ ์ˆซ์ž์—ด์ผ ๋•Œ
interface IPropfile{
		name : string
		age : string | number
		school : string
	}
const profile:IPropfile = {
		name : "์›๋‘"
		age : 8 or "8์‚ด"
		school : "์ฝ”์บ  ์ดˆ๋“ฑํ•™๊ต"
	} 

โ—๏ธย ํƒ€์ž… ์Šคํฌ๋ฆฝํŠธ์—์„œ์˜ ๋˜๋Š”, ๊ทธ๋ฆฌ๊ณ 
๋˜๋Š” : |
๊ทธ๋ฆฌ๊ณ  : &
โ—๏ธ ๊ฐ์ฒด์—์„œ ํ•ด๋‹น key์— value๊ฐ€ ์žˆ์œผ๋ฉด ๋ณด๋‚ด์ฃผ๊ณ  ์‹ถ์„ ๋•Œ
โ†’ ? ๋ฅผ ์ด์šฉ
? ๋Š” โ€˜์žˆ์œผ๋ฉดโ€™ ์ด๋ผ๋Š” ๋œป

๐Ÿ’ก ์—„๊ฒฉํ•œ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ strict

strict๋ฅผ true๋กœ ๋‘๊ฒŒ๋˜๋ฉด props์ชฝ์—์„œ ๋นจ๊ฐ„์ค„์ด ๊ทธ์ด๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.
๋”ฐ๋ผ์„œ interface๋กœ props์˜ ํƒ€์ž…์„ ์ง€์ •ํ•ด์ค˜์•ผ ํ•œ๋‹ค.
props์—์„œ๋Š” ์ฃผ๋Š” ์ž…์žฅ๊ณผ ๋ฐ›๋Š” ์ž…์žฅ์ด ์žˆ๋‹ค.
ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋Š” ํ•ญ์ƒ ๋ฐ›๋Š” ์ชฝ์ด ์ค‘์‹ฌ!
๋”ฐ๋ผ์„œ ๋ณด๋‚ด์ฃผ๋Š” ์ชฝ์—์„œ๋Š” ๋ฐ›๊ฒ ๋‹ค๊ณ  ํ•œ ํƒ€์ž… ๊ทธ๋Œ€๋กœ๋ฅผ ๋ณด๋‚ด์ค˜์•ผ ํ•œ๋‹ค.

โ—๏ธย ํ•จ์ˆ˜์˜ ํƒ€์ž… ์ง€์ •ํ•ด์ฃผ๊ธฐ
โ†’ ํŒŒ๋ผ๋ฏธํ„ฐ์˜ ํƒ€์ž…๋˜ํ•œ ์ง€์ •ํ•ด์•ผ ํ•œ๋‹ค.

/* props๋ฅผ ์ฃผ๋Š” ์ชฝ ์ปดํฌ๋„ŒํŠธ */
// ํŒŒ๋ผ๋ฏธํ„ฐ์˜ ํƒ€์ž…์„ ์ง€์ •ํ•ด์ฃผ์…”์•ผ ํ•ฉ๋‹ˆ๋‹ค.
const add = (a: number, b: number) => {
  return a + b;
};
return (
    // ์ปดํฌ๋„ŒํŠธ์˜ JSX๋ถ€๋ถ„
    <Component add={add} />
  );
------------------------------------------------------------------------
/* props๋ฅผ ๋ฐ›๋Š” ์ชฝ ์ปดํฌ๋„ŒํŠธ */
// ํ•จ์ˆ˜์˜ ํƒ€์ž… ์ง€์ •ํ•ด์ฃผ๊ธฐ
// ๋ฆฌํ„ด๋˜๋Š” ๊ฐ’์˜ ํƒ€์ž…์„ ์ ์šฉํ•ด์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค. ๋งŒ์ผ ๋ฆฌํ„ด๋˜๋Š” ๊ฐ’์ด ์—†๋‹ค๋ฉด void๋ฅผ ์ ์–ด์ฃผ์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.
interface IProps {
  add: (a: number, b: number) => number;
}
const Component2 = (props: IProps) => {
  props.add(1, 2);
  return (
    //์ปดํฌ๋„ŒํŠธ์˜ JSX๋ถ€๋ถ„
  );
};


โœ… ํƒ€์ž…์œผ๋กœ ๋ญ˜ ๋ฐ›์•„์˜ค๋Š” ์ง€ ์ž˜ ๋ชจ๋ฅผ ๋•Œ

์™ธ๋ถ€์™€ ํ†ต์‹ ํ•ด์„œ ๋ฐ›์•„์˜ค๋Š” api๊ฐ™์€ ๋ฐ์ดํ„ฐ๋Š” ๋ญ˜ ๋ฐ›์•„์˜ค๋Š”์ง€ ์ž˜ ๋ชจ๋ฅผ ์ˆ˜ ์žˆ๋‹ค
๊ทธ๋Ÿด ๋•Œ๋Š” ์ผ๋‹จ ํƒ€์ž…์— any๋ฅผ ์ฃผ๊ณ  ๋„˜์–ด๊ฐ€๊ธฐ!
ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ์—์„œ์˜ any๋Š” ๋ชจ๋“  ํƒ€์ž…์„ ์˜๋ฏธํ•œ๋‹ค.

โ—๏ธ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ํ•จ์ˆ˜์˜ ํŒŒ๋ผ๋ฏธํ„ฐ(event) ํƒ€์ž… ์ง€์ •ํ•˜๊ธฐ

// HTML ํƒœ๊ทธ๋Š” ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ํ•จ์ˆ˜๊ฐ€ ์ ์šฉ๋˜ ํ•จ์ˆ˜๊ฐ€ ๋ญ”์ง€์— ๋”ฐ๋ผ ๋‹ค๋ฅด๊ฒŒ ์ ํžŒ๋‹ค.
const onChangeMyWriter = (event: ChangeEvent<HTML inputelement>)=>{
			setMywriter(event.target.value)
 	} 

ChangeEvent๋Š” ๋ฆฌ์•กํŠธ์—์„œ ์ œ๊ณตํ•ด์ฃผ๋Š” ํƒ€์ž…์œผ๋กœ import๋ฅผ ํ•ด์„œ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.


๐Ÿ’ก ์œ ํ‹ธ๋ฆฌํ‹ฐ ํƒ€์ž…

: ๋‚ด๊ฐ€ ์›ํ•˜๋Š” ํƒ€์ž…์„ ์กฐ์ž‘ํ•ด์„œ ํ•„์š”ํ•œ ํƒ€์ž…๋งŒ ๋”ฐ๋กœ ๋นผ๋‘๊ฑฐ๋‚˜, ํ•„์š”์—†๋Š” ํƒ€์ž…๋งŒ ์ œ๊ฑฐํ•˜๋Š” ํƒ€์ž…์„ ์˜๋ฏธ

export interface IProfile {
  name: string;
  age: number;
  school: string;
  hobby?: string;
}

1. Partial

-> ์ „๋ถ€ ๋ฌผ์Œํ‘œ์ฒ˜๋ฆฌ ํ•ด์ฃผ๊ณ  ์‹ถ๋‹ค๋ฉด

type aaa = Partial<IProfile>;

2. Required

type bbb = Required<IProfile>;

3. Pick

-> ์ „์ฒด ํƒ€์ž…์—์„œ ์›ํ•˜๋Š” ํƒ€์ž…๋งŒ ์ง€์ •

type ccc = Pick<IProfile, "name" | "age">;
// name๊ณผ age ํƒ€์ž…๋งŒ ์ง€์ •

4. Omit

-> ์›ํ•˜๋Š” ํƒ€์ž…๋งŒ ์ œ๊ฑฐ

type ddd = Omit<IProfile, "school">;
// school ํƒ€์ž…๋งŒ ์ œ๊ฑฐ = name๊ณผ age ํƒ€์ž…๋งŒ ์ง€์ •

5. Union Type / Record

//5. Record ํƒ€์ž… ํ•˜๋‚˜ํ•˜๋‚˜๊ฐ€ ๋‹ค ๊ฐœ๋ณ„๋ ˆ์ฝ”๋“œ์ž„
type eee = "์ฒ ์ˆ˜" | "์˜ํฌ" | "ํ›ˆ์ด"; 
//Unionํƒ€์ž… - ์›ํ•˜๋Š” ํƒ€์ž… ์ง์ ‘ ์ง€์ •
const child1: eee = "์ฒ ์ˆ˜"; 
//์ฒ ์ˆ˜,์˜ํฌ,ํ›ˆ์ด๋งŒ ๊ฐ€๋Šฅํ•จ.
const child2: string = "apple"; 
// apple,banana,์ฒ ์ˆ˜,ํ›ˆ์ด ๋‹ค ๋จ
type fff = Record<eee, IProfile>; 
//Record ํƒ€์ž… - union์œผ๋กœ ์ง€์ •๋œ ํƒ€์ž…์„ ์ˆœํšŒํ•˜์—ฌ ํƒ€์ž…์ง€์ •
------------------------------------------
//6. ๊ฐ์ฒด์˜ key๋“ค๋กœ Unionํƒ€์ž… ๋งŒ๋“ค๊ธฐ
type ggg = keyof IProfile; //"name" | "age" | "school" | "hobby"
let myprofile: ggg = "name";
------------------------------------------
//7. type vs interface ์ฐจ์ด => interface๋Š” ์„ ์–ธ๋ณ‘ํ•ฉ์ด ๊ฐ€๋Šฅ
export interface IProfile {
  candy: number; //์„ ์–ธ๋ณ‘ํ•ฉ์œผ๋กœ ์ถ”๊ฐ€๋จ
}
------------------------------------------
//8. ์‘์šฉํ•˜๊ธฐ
let profile: Partial<IProfile> = {
  candy: 10,
};  

๐Ÿ’ก API ์‘๋‹ต ๋ฐ์ดํ„ฐ์˜ ํƒ€์ž…์€ ์–ด๋–ป๊ฒŒ ํ• ๊นŒ?

rest-api๋Š” ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ ์šฉํ•˜๊ฒŒ ๋˜๋ฉด ์–ด๋Š์ •๋„ ์ผ์ผํžˆ ์†์œผ๋กœ ๋งŒ๋“ค์–ด์•ผ ํ•˜๋Š” ๋ถ€๋ถ„์ด ๋งŽ๋‹ค.
ํ•˜์ง€๋งŒ graphql ๊ฐ™์€ ๊ฒฝ์šฐ๋Š” graphql-codegen์„ ์ด์šฉํ•ด ๋ช…๋ น์–ด ํ•˜๋‚˜๋กœ ๋งŒ๋“ค์–ด์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ๊ต‰์žฅํžˆ ๊ฐ„ํŽธํ•˜๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.

โœ… graphql์— codegen ์„ค์น˜ํ•˜๊ธฐ

1๏ธโƒฃ ์„ค์น˜
graphql-codegen
yarn add -D @graphql-codegen/cli
yarn add -D @graphql-codegen/typescript
yarn add ts-node

2๏ธโƒฃ codegen.yaml ํŒŒ์ผ์„ ๋งŒ๋“ค๊ณ  ์•„๋ž˜ ๋‚ด์šฉ ์ž…๋ ฅ(โ—๏ธ์ธ๋ดํŠธ ์ฃผ์˜)

//codegen.yaml ํŒŒ์ผ (yml, yaml ๋‘˜ ๋‹ค ์ƒ๊ด€ ์—†์Šต๋‹ˆ๋‹ค.)
schema: http://backend-example.codebootcamp.co.kr/graphql
generates:
  ./src/commons/types/generated/types.ts:
    plugins:
      - typescript
    config:
      typesPrefix: I

3๏ธโƒฃ package.json ํŒŒ์ผ์— ์•„๋ž˜ ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ ํ›„ ์ €์žฅ

4๏ธโƒฃ yarn generate ๋ช…๋ น์„ ์‹คํ–‰

โœ… graphql์— codegen ์ ์šฉํ•ด๋ณด๊ธฐ

1๏ธโƒฃ mutation์— ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ์ ์šฉํ•ด๋ณด๊ธฐ

// ๊ฒฐ๊ณผํƒ€์ž…๊ณผ ๋ณ€์ˆ˜ํƒ€์ž…์€ types.ts ํŒŒ์ผ์—์„œ importํ•ด์„œ ๋ฐ๋ฆฌ๊ณ  ์˜จ๋‹ค.
const [ํ•จ์ˆ˜] = useMutation<๊ฒฐ๊ณผํƒ€์ž…,๋ณ€์ˆ˜ํƒ€์ž…>(์ฟผ๋ฆฌ);
/* ์‹ค์ œ ์ฝ”๋“œ์— ์ ์šฉํ•ด๋ณด๊ธฐ */
// ๋‹ค์šด๋กœ๋“œ๋œ ํƒ€์ž…๋“ค ์ค‘ ๋งž๋Š” ํƒ€์ž…์„ ๋ฐ๋ฆฌ๊ณ  ์˜ฌ๋•Œ๋Š” Pick์„ ์ด์šฉํ•˜๋ฉฐ ํ•ด๋‹น ํƒ€์ž…์„ importํ•ด์˜จ๋‹ค.
const [createBoard] = useMutation<Pick<IMutation, "createBoard">, IMutationCreateBoardArgs>(CREATE_BOARD);
const onClickUpload = async () => {
		const result = await createBoard(CREARTE_BOARD);
console.log(result.data?.createBoard?.message);
	}


2๏ธโƒฃ query์— ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ์ ์šฉํ•ด๋ณด๊ธฐ

const { data } = useQuery<Pick<IQuery,"fetchBoard">,IQueryFetchBoardArgs>(FETCH_BOARD,{
		variables: {number: Number(router.query.mynumber)}
	})

โ—๏ธ input tag์˜ readOnly ์†์„ฑ
input tag์˜ readOnly ์†์„ฑ์€ boolean ํƒ€์ž…์ด๋‹ค. ๋•Œ๋ฌธ์— ์ด ํƒ€์ž…์ด string ํƒ€์ž…์ด ๋˜๋„๋ก ๋งŒ๋“ค์–ด์ค˜์•ผ ํ•œ๋‹ค.
์ด์ค‘๋ถ€์ •์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•ด ํ•ด๊ฒฐ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
data?.fetchBoard.writer์€ string ํƒ€์ž…์ด์ง€๋งŒ boolean ํƒ€์ž…์œผ๋กœ ๋ณด๋ฉด string์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— true์ด๋‹ค.
์—ฌ๊ธฐ์— !data?.fetchBoard.writer ํ•ด์ฃผ๋ฉด false๊ฐ€ ๋˜๊ณ ,
ํ• ๋‹นํ•ด์ค€ ๋ฐ์ดํ„ฐ๋ฅผ ๊ทธ๋Œ€๋กœ ๊ฐ€์ ธ์˜ค๊ณ ์‹ถ์€ ๊ฒฝ์šฐ์—๋Š” !!data?.fetchBoard.writer ์ฒ˜๋Ÿผ ์ด์ค‘๋ถ€์ •์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด true์ธ ์ƒํƒœ ๊ทธ๋Œ€๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋‹ค.



๐Ÿฅš Learning

  1. disabled : ์ˆ˜์ •ํŽ˜์ด์ง€์—์„œ ์ˆ˜์ •์•ˆ๋˜๊ฒŒ๋” ํ•  ์ˆ˜ ์žˆ์Œ.
  2. early-exitํŒจํ„ด: ์ž˜๋ชป๋œ ๋‚ด์šฉ๋“ค์€ ๋จผ์ € ์ข…๋ฃŒ์‹œํ‚จ๋‹ค.
  3. ๋ฆฌํŒฉํ† ๋ง ์กฐ๊ฑด! ๊ฒฐ๊ณผ๊ฐ’์€ ๋ณ€ํ•จ์ด ์—†์–ด์•ผ ํ•œ๋‹ค.
profile
JUST DO WHATEVER

0๊ฐœ์˜ ๋Œ“๊ธ€