JiSoo's Devlog

[์šฐ์•„ํ•œ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ] 9์žฅ ๋ณธ๋ฌธ

Frontend/Typescript

[์šฐ์•„ํ•œ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ] 9์žฅ

์ง€์ˆญ์ˆญ์ˆญ 2025. 6. 6. 00:34

๐Ÿ“ ๋ฆฌ์•กํŠธ ํ›…

useState

๋ฆฌ์•กํŠธ ํ•จ์ˆ˜ ์ปดํฌ๋„ŒํŠธ์—์„œ ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด useState ํ›…์„ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

function useState<S>(
initialstate๏ผš S ! (() => S)
)๏ผš [S, Dispatch<SetStateAction<S»];
type Dispatch<A> = (value๏ผš A) => void;
type SetStateAction<S> = S ! ((prevState๏ผš S) => S);

useState๊ฐ€ ๋ฐ˜ํ™˜ํ•˜๋Š” ํŠœํ”Œ์˜ ์ฒซ ๋ฒˆ์งธ ์š”์†Œ๋Š” ์ œ๋„ค๋ฆญ์œผ๋กœ ์ง€์ •ํ•œ S ํƒ€์ž…์ด๊ณ  ๋‘ ๋ฒˆ์งธ ์š”์†Œ๋Š” ์ƒํƒœ๋ฅผ ์—…๋ฐ์ดํŠธํ•  ์ˆ˜ ์žˆ๋Š” Dispatch ํƒ€์ž… ํ•จ์ˆ˜

 

์˜์กด์„ฑ ๋ฐฐ์—ด์„ ์‚ฌ์šฉํ•˜๋Š” ํ›…

useEffect์™€ useLayoutEffect

๋ Œ๋”๋ง ์ดํ›„ ๋ฆฌ์•กํŠธ ํ•จ์ˆ˜ ์ปดํฌ๋„ŒํŠธ์— ์–ด๋–ค ์ผ์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•˜๋Š”์ง€ ์•Œ๋ ค์ฃผ๊ธฐ ์œ„ํ•ด useEffectํ›…์„ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

function useEffect(effect๏ผš EffectCaUback, deps?๏ผš DependencyList)๏ผš void;
type DependencyList = ReadonlyArray<any>;
type EffectCaUback = () => void | Destructor;

useEffect์˜ ์ฒซ ๋ฒˆ์งธ ์ธ์ž์ด์ž effect์˜ ํƒ€์ž…์ธ EffectCallback์€ Destructor๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ฑฐ๋‚˜ ์•„๋ฌด๊ฒƒ๋„ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š๋Š” ํ•จ์ˆ˜์ด๋‹ค.

Promise ํƒ€์ž…์€ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ useEffect์˜ ์ฝœ๋ฐฑ ํ•จ์ˆ˜์—๋Š” ๋น„๋™๊ธฐ ํ•จ์ˆ˜๊ฐ€ ๋“ค์–ด๊ฐˆ ์ˆ˜ ์—†๋‹ค.

๋‘ ๋ฒˆ์งธ ์ธ์ž์ธ deps๋Š” ์˜ต์…”๋„ํ•˜๊ฒŒ ์ œ๊ณต๋˜๋ฉฐ effect๊ฐ€ ์ˆ˜ํ–‰๋˜๊ธฐ ์œ„ํ•œ ์กฐ๊ฑด์„ ๋‚˜์—ดํ•œ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด deps ๋ฐฐ์—ด์˜ ์›์†Œ๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด ์‹คํ–‰ํ•œ๋‹ค๋Š” ์‹์œผ๋กœ ์‚ฌ์šฉํ•œ๋‹ค.

useEffect๋Š” deps๊ฐ€ ๋ณ€๊ฒฝ๋˜์—ˆ๋Š”์ง€๋ฅผ ์–•์€ ๋น„๊ต๋กœ๋งŒ ํŒ๋‹จํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ์‹ค์ œ ๊ฐ์ฒด ๊ฐ’์ด ๋ฐ”๋€Œ์ง€ ์•Š์•˜๋”๋ผ๋„ ๊ฐ์ฒด์˜ ์ฐธ์กฐ ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜๋ฉด ์ฝœ๋ฐฑ ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋œ๋‹ค.

์–•์€ ๋น„๊ต
๊ฐ์ฒด๋‚˜ ๋ฐฐ์—ด ๊ฐ™์€ ๋ณตํ•ฉ ๋ฐ์ดํ„ฐ ํƒ€์ž…์˜ ๊ฐ’์„ ๋น„๊ตํ•  ๋•Œ ๋‚ด๋ถ€์˜ ๊ฐ ์š”์†Œ๋‚˜ ์†์„ฑ์„ ์žฌ๊ท€์ ์œผ๋กœ ๋น„๊ตํ•˜์ง€ ์•Š๊ณ , ํ•ด๋‹น ๊ฐ’๋“ค์˜ ์ฐธ์กฐ๋‚˜ ๊ธฐ๋ณธ ํƒ€์ž… ๊ฐ’๋งŒ์„ ๋น„๊ตํ•˜๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค.

 

deps๊ฐ€ ๋นˆ ๋ฐฐ์—ด์ด๋ผ๋ฉด useEffect์˜ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋Š” ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ฒ˜์Œ ๋ Œ๋”๋ง๋  ๋•Œ๋งŒ ์‹คํ–‰๋˜๋ฉฐ, ์ด๋•Œ์˜ Destructor๏ผˆํด๋ฆฐ์—… ํ•จ์ˆ˜)๋Š” ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋งˆ์šดํŠธ ํ•ด์ œ๋  ๋•Œ ์‹คํ–‰๋œ๋‹ค. 

deps ๋ฐฐ์—ด์ด ์กด์žฌํ•œ๋‹ค๋ฉด ๋ฐฐ์—ด์˜ ๊ฐ’์ด ๋ณ€๊ฒฝ๋  ๋•Œ๋งˆ๋‹ค Destructor๊ฐ€ ์‹คํ–‰๋œ๋‹ค.

 

useLayoutEffect ํ›… ์—ญ์‹œ useEffect์™€ ์—ญํ•  ์ฐจ์ด๋งŒ ์žˆ๋‹ค.

type DependencyList = ReadonlyArray<any>;
function useLayoutEffect(effect๏ผš EffectCaUback, deps?๏ผš DependencyList)๏ผš void;

useLayoutEffect๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ™”๋ฉด์— ํ•ด๋‹น ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๊ทธ๋ ค์ง€๊ธฐ ์ „์— ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ฒซ ๋ฒˆ์งธ ๋ Œ๋”๋ง ๋•Œ ๋นˆ ์ด๋ฆ„์ด ๋œจ๋Š” ๊ฒฝ์šฐ๋ฅผ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

useMemo์™€ useCallback

๋‘ ๊ฐœ ๋ชจ๋‘ ์ด์ „์— ์ƒ์„ฑ๋œ ๊ฐ’ ๋˜๋Š” ํ•จ์ˆ˜๋ฅผ ๊ธฐ์–ตํ•˜๋ฉฐ ๋™์ผํ•œ ๊ฐ’๊ณผ ํ•จ์ˆ˜๋ฅผ ๋ฐ˜๋ณตํ•ด์„œ ์ƒ์„ฑํ•˜์ง€ ์•Š๋„๋ก ํ•ด์ฃผ๋Š” ํ›…์ด๋‹ค.

์–ด๋–ค ๊ฐ’์„ ๊ณ„์‚ฐํ•˜๋Š” ๋ฐ ์˜ค๋žœ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆด ๋•Œ๋‚˜ ๋ Œ๋”๋ง์ด ์ž์ฃผ ๋ฐœ์ƒํ•˜๋Š” form์—์„œ useMemo๋‚˜ useCallback์„ ์œ ์šฉํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

type DependencyList = ReadonlyArray<any>;
function useMemo<T>(factory: () => T, deps: DependencyList | undefined): T;
function useCallback<T extends (...args: any[]) => any>(callback: T, deps:
DependencyList): T;

๋‘ ํ›… ๋ชจ๋‘ ์ œ๋„ค๋ฆญ์„ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•ด T ํƒ€์ž…์„ ์„ ์–ธํ•ด ์ฃผ๋ฉฐ useCallback์€ ํ•จ์ˆ˜๋ฅผ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•ด ์ œ๋„ค๋ฆญ์˜ ๊ธฐ๋ณธ ํƒ€์ž…์„ ์ง€์ •ํ•˜๊ณ  ์žˆ๋‹ค.

๋‘ ํ›…์€ deps ๋ฐฐ์—ด์„ ๊ฐ–๊ณ  ์žˆ์œผ๋ฉฐ ํ•ด๋‹น ์˜์กด์„ฑ์ด ๋ณ€๊ฒฝ๋˜๋ฉด ๊ฐ’์„ ๋‹ค์‹œ ๊ณ„์‚ฐํ•˜๊ฒŒ ๋œ๋‹ค.

๋ชจ๋“  ๊ฐ’๊ณผ ํ•จ์ˆ˜๋ฅผ useMemo์™€ useCallback์„ ์‚ฌ์šฉํ•ด ๊ณผ๋„ํ•˜๊ฒŒ ๋ฉ”๋ชจ์ด์ œ์ด์…˜ํ•˜๋ฉด ์ปดํฌ๋„ŒํŠธ์˜ ์„ฑ๋Šฅ ํ–ฅ์ƒ์ด ๋ณด์žฅ๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ๋‹ค.

 

useRef

<input /> ์š”์†Œ์— ํฌ์ปค์Šค ์„ค์ •ํ•˜๊ฑฐ๋‚˜ ํŠน์ • ์ปดํฌ๋„ŒํŠธ์˜ ์œ„์น˜๋กœ ์Šคํฌ๋กค ๋“ฑ DOM์„ ์ง์ ‘ ์„ ํƒํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.

์ด๋•Œ ๋ฆฌ์•กํŠธ์˜ useRef ์‚ฌ์šฉ

useRef๋Š” ์„ธ ์ข…๋ฅ˜์˜ ํƒ€์ž… ์ •์˜๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๊ณ  ๋„ฃ์–ด์ฃผ๋Š” ์ธ์ž ํƒ€์ž…์— ๋”ฐ๋ผ ๋ฐ˜ํ™˜๋˜๋Š” ํƒ€์ž…์ด ๋‹ฌ๋ผ์ง„๋‹ค.

๋ฆฌ์•กํŠธ ์ปดํฌ๋„ŒํŠธ์—์„œ ref๋ฅผ prop์œผ๋กœ ์ „๋‹ฌํ•˜๋ ค๋ฉด forwardRef๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.

interface Props {
name๏ผš string;
}
const Mylnput = forwardRef<HTMLInputElement, Props>((props, ref) => {
return (
<div>
<label>{props .name}</label>
<input ref = {ref} />
</div>
);
});

 

uselmperativeHandle

uselmperativeHandle์€ ForwardRefRenderFunction๊ณผ ํ•จ๊ป˜ ์“ธ ์ˆ˜ ์žˆ๋Š” ํ›…์ด๋‹ค.

์ด ํ›…์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ์—์„œ ref๋ฅผ ํ†ตํ•ด ์ž์‹ ์ปดํฌ๋„ŒํŠธ์—์„œ ์ •์˜ํ•œ ์ปค์Šคํ„ฐ๋งˆ์ด์ง•๋œ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

์ด์— ๋”ฐ๋ผ ์ž์‹ ์ปดํฌ๋„ŒํŠธ๋Š” ๋‚ด๋ถ€ ์ƒํƒœ๋‚˜ ๋กœ์ง์„ ๊ด€๋ฆฌํ•˜๋ฉด์„œ ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ์™€์˜ ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถœ ์ˆ˜ ์žˆ๋‹ค.

 

useRef์˜ ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ํŠน์„ฑ

useRef๋Š” ์ž์‹ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ €์žฅํ•˜๋Š” ๋ณ€์ˆ˜๋กœ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์„ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋‹ค๋ฅธ ๋ฐฉ์‹์œผ๋กœ๋„ ์œ ์šฉํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

- useRef๋กœ ๊ด€๋ฆฌ๋˜๋Š” ๋ณ€์ˆ˜๋Š” ๊ฐ’์ด ๋ฐ”๋€Œ์–ด๋„ ์ปดํฌ๋„ŒํŠธ ๋ฆฌ๋ Œ๋”๋ง์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค. 

- ๋ฆฌ์•กํŠธ ์ปดํฌ๋„ŒํŠธ ์ƒํƒœ๋Š” ์ƒํƒœ ๋ณ€๊ฒฝ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  ๋ Œ๋”๋ง๋œ ์ดํ›„์— ์—…๋ฐ์ดํŠธ๋œ ์ƒํƒœ๋ฅผ ์กฐํšŒํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

๐Ÿ”ฎ ์ปค์Šคํ…€ ํ›…

๋‚˜๋งŒ์˜ ํ›… ๋งŒ๋“ค๊ธฐ

์ปค์Šคํ…€ ํ›…์€ ๋ฆฌ์•กํŠธ ์ปดํฌ๋„ŒํŠธ ๋‚ด์—์„œ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ ์ด๋ฆ„์€ ๋ฐ˜๋“œ์‹œ use๋กœ ์‹œ์ž‘ํ•ด์•ผ ํ•œ๋‹ค.

import { useState } from "react";
const useinput = (initialvalue) => {
const [value, setValue] = useState(initialvalue);
const onChange = (e) => {
setValue(e .target .value);
};
return { value, onChange };
};

 

 

728x90