<star />

์ปจํ…์ŠคํŠธ ๋ณธ๋ฌธ

React ๐Ÿ“

์ปจํ…์ŠคํŠธ

๋ณ„๊น… 2022. 12. 4. 00:06
728x90

 

 

์ปจํ…์ŠคํŠธ (Context) ๊ฐ€ ๋ญ์•ผ? ๐Ÿ˜ƒ

 

- ๋ฆฌ์•กํŠธ ์ปดํฌ๋„ŒํŠธ๋“ค ์‚ฌ์ด์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ธฐ์กด์˜ props ๋ฅผ ํ†ตํ•ด ์ „๋‹ฌํ•˜๋Š” ๋ฐฉ์‹ ๋Œ€์‹ ,

์ปดํฌ๋„ŒํŠธ ํŠธ๋ฆฌ (component tree) ๋ฅผ ํ†ตํ•ด ๊ณง๋ฐ”๋กœ ์ปดํฌ๋„ŒํŠธ์— ์ „๋‹ฌํ•˜๋Š” ์ƒˆ๋กœ์šด ๋ฐฉ์‹์„ ์ œ๊ณตํ•จ.

์ด๋ฅผ ํ†ตํ•ด ์–ด๋–ค ์ปดํฌ๋„ŒํŠธ๋“ ์ง€ ๋ฐ์ดํ„ฐ์— ์‰ฝ๊ฒŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์ง€์šฉ.

 

1) ์ปจํ…์ŠคํŠธ๋Š” ์–ธ์ œ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋‚˜?

 

- ๊ธฐ์กด props ๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๊ธฐ์กด ๋ฐฉ์‹์€ ์‹ค์ œ ๋ฐ์ดํ„ฐ๋ฅผ ํ•„์š”๋กœ ํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ๊นŒ์ง€์˜ ๊นŠ์ด๊ฐ€ ๊ธธ์–ด์งˆ์ˆ˜๋ก ๋ณต์žกํ•ด์ง.

๋ฐ˜๋ณต์ ์ธ ์ฝ”๋“œ๋ฅผ ๊ณ„์†ํ•ด์„œ ์ž‘์„ฑํ•ด์•ผ ํ•˜๊ธฐ๋•Œ๋ฌธ์— ๋น„ํšจ์œจ์ ์ด๊ณ , ์ง๊ด€์ ์ด์ง€๋„ ์•Š์Œ! 

์ด๋Ÿด ๋•Œ ์ปจํ…์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊นฐ๋”ํ•˜๊ฒŒ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ์Œ. ๐Ÿ’ช๐Ÿป

 

 

1.

์ปจํ…์ŠคํŠธ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋งค๋ฒˆ ์ปดํฌ๋„ŒํŠธ๋ฅผ ํ†ตํ•ด ์ „๋‹ฌํ•  ํ•„์š” ์—†์ด ์ปดํฌ๋„ŒํŠธ ํŠธ๋ฆฌ๋กœ ๊ณง๋ฐ”๋กœ ์ „๋‹ฌํ•˜๊ฒŒ ํ•ด ์คŒ.

์•„๋ž˜ ์ฝ”๋“œ๋Š” React.createContext() ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด์„œ ThemeContext ๋ผ๋Š” ์ด๋ฆ„์˜ ์ปจํ…์ŠคํŠธ๋ฅผ ํ•˜๋‚˜ ์ƒ์„ฑํ–ˆ์Œ.

ํ˜„์žฌ ํ…Œ๋งˆ๋ฅผ ์œ„ํ•œ ์ปจํ…์ŠคํŠธ๊ฐ€ ์ƒ์„ฑ๋๊ณ , ๊ธฐ๋ณธ๊ฐ’์€ 'red' ์ž„.

 

const ThemeContext = React.createContext('red');

 

2.

Provider ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ๋“ค์—๊ฒŒ ํ˜„์žฌ ํ…Œ๋งˆ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•ด์•ผ ํ•จ.

๋ชจ๋“  ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ๋“ค์€ ์ปดํฌ๋„ŒํŠธ ํŠธ๋ฆฌ ํ•˜๋‹จ์— ์–ผ๋งˆ๋‚˜ ๊นŠ์ด ์žˆ๋Š”์ง€์— ๊ด€๊ณ„์—†์ด ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์„ ์ˆ˜ ์žˆ์Œ.

์ปจํ…์ŠคํŠธ๋ฅผ ์‚ฌ์šฉํ•  ์ปดํฌ๋„ŒํŠธ์˜ ์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ์—์„œ Provider ๋กœ ๊ฐ์‹ธ ์ค˜์•ผ ํ•˜๋Š”๋ฐ,

์•„๋ž˜ ์ฝ”๋“œ์—์„œ๋Š” ์ตœ์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ์ธ App ์ปดํฌ๋„ŒํŠธ๋ฅผ ThemeContext.Provider ๋กœ ๊ฐ์‹ธ ์คฌ์Œ.

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด Provider์˜ ๋ชจ๋“  ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์–ผ๋งˆ๋‚˜ ๊นŠ์ด ์œ„์น˜ํ•ด ์žˆ๋Š”์ง€ ๊ด€๊ณ„์—†์ด ์ปจํ…์ŠคํŠธ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์„ ์ˆ˜ ์žˆ์Œ.

์•„๋ž˜ ์ฝ”๋“œ๋Š” ํ˜„์žฌ ํ…Œ๋งˆ ๊ฐ’์œผ๋กœ 'pink' ๋ฅผ ์ „๋‹ฌํ•˜๊ณ  ์žˆ์Œ.

 

function App (props) {
    return (
        <ThemeContext.Provider value="pink">
            <Toolbar />
        </ThemeContext.Provider>
    );
}

 

3.

์ด์ œ ์ค‘๊ฐ„์— ์œ„์น˜ํ•œ ์ปดํฌ๋„ŒํŠธ๋Š” ํ…Œ๋งˆ ๋ฐ์ดํ„ฐ๋ฅผ ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ๋กœ ์ „๋‹ฌํ•  ํ•„์š”๊ฐ€ ์—†์Œ.

 

function Toolbar (props) {
    return (
        <div>
            <ThemedButton />
        </div>
    )
}

 

4.

๋ฆฌ์•กํŠธ๋Š” ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ์ƒ์œ„ ํ…Œ๋งˆ Provider ๋ฅผ ์ฐพ์•„์„œ ํ•ด๋‹น๋˜๋Š” ๊ฐ’์„ ์‚ฌ์šฉํ•œ๋‹ค.

๋งŒ์•ฝ ํ•ด๋‹น๋˜๋Š” Provider ๊ฐ€ ์—†์„ ๊ฒฝ์šฐ์—๋Š” ๊ธฐ๋ณธ๊ฐ’ 'red' ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

์•„๋ž˜ ์ฝ”๋“œ์—์„œ๋Š” ์ƒ์œ„ Provider ๊ฐ€ ์กด์žฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ˜„์žฌ ํ…Œ๋งˆ์˜ ๊ฐ’์€ 'pink' ๊ฐ€ ๋˜๋Š” ๊ฒƒ์ž„.

 

function ThemedButton (props) {
    return (
        <ThemedContext.Consumer>
            {value => <Button theme={value} />}
        </ThemedContext.Consumer>
    );
}

 

2) ์ปจํ…์ŠคํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์ „์— ๊ณ ๋ คํ•  ์ ์€?

 

- ์ปจํ…์ŠคํŠธ๋Š” ๋‹ค๋ฅธ ๋ ˆ๋ฒจ์˜ ๋งŽ์€ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ํŠน์ • ๋ฐ์ดํ„ฐ๋ฅผ ํ•„์š”๋กœ ํ•˜๋Š” ๊ฒฝ์šฐ์— ์ฃผ๋กœ ์‚ฌ์šฉํ•จ.

ํ•˜์ง€๋งŒ, ๋ฌด์กฐ๊ฑด ์ปจํ…์ŠคํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ์ข‹์€ ๊ฒƒ์ด ์•„๋‹˜~ ์™œ๋ƒ! ์ปดํฌ๋„ŒํŠธ์™€ ์ปจํ…์ŠคํŠธ๊ฐ€ ์—ฐ๋™๋˜๋ฉด ์žฌ์‚ฌ์šฉ์„ฑ์ด ๋–จ์–ด์ง€๊ธฐ ๋•Œ๋ฌธ์ž„.

๋‹ค๋ฅธ ๋ ˆ๋ฒจ์˜ ์—ฌ๋Ÿฌ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ํ•„์š”๋กœ ํ•˜๋Š” ๊ฒŒ ์•„๋‹ˆ๋ฉด, ๊ธฐ์กด ์‚ฌ์šฉ ๋ฐฉ์‹๋Œ€๋กœ props ๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ ํ•ฉ์„ฑ ๋ฐฉ๋ฒ•์ด ๋” ์ ํ•ฉํ•  ๋•Œ๋„ ์žˆ์Œ.

 

//Page ์ปดํฌ๋„ŒํŠธ๋Š” PageLayout ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ Œ๋”๋งํ•จ.
<Page user={user} avatarSize={avatarSize} />

//PageLayout ์ปดํฌ๋„ŒํŠธ๋Š” NavigationBar ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ Œ๋”๋ง
<PageLayout user={user} avatarSize={avatarSize} />

//NavigationBar ์ปดํฌ๋„ŒํŠธ๋Š” Link ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ Œ๋”๋ง
<NavigationBar user={user} avatarSize={avatarSize} />

//Link ์ปดํฌ๋„ŒํŠธ๋Š” Avatar ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ Œ๋”๋ง
<Link href={user.permalink}>
	<Avatar user={user} size={avatarSize} />
</Link>

 

์œ„์˜ ์ฝ”๋“œ์—์„œ๋Š” ์‚ฌ์šฉ์ž ์ •๋ณด์™€, ์•„๋ฐ”ํƒ€ ์‚ฌ์ด์ฆˆ๋ฅผ ๋ช‡ ๋‹จ๊ณ„์— ๊ฑธ์ณ ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ์ธ Link ์ปดํฌ๋„ŒํŠธ์™€ Avatar ๋กœ ์ „๋‹ฌํ•˜๋Š”

Page ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์žˆ์Œ.

๊ฐ€์žฅ ํ•˜์œ„ ๋ ˆ๋ฒจ์ธ Avatar ์ปดํฌ๋„ŒํŠธ๊ฐ€ user ์™€ avatarSize ๋ฅผ ํ•„์š”๋กœ ํ•˜๊ธฐ ๋•Œ๋ฌธ์—, <<<  ์ด๋ฅผ ์œ„ํ•ด ์—ฌ๋Ÿฌ ๋‹จ๊ณ„์— ๊ฑธ์ณ์„œ props ๋ฅผ ํ†ตํ•ด user ์™€ avatarSize ๋ฅผ ์ „๋‹ฌํ•ด ์ฃผ๊ณ  ์žˆ๋Š” ๊ฒƒ์ธ๋ฐ.... ์ด ๊ณผ์ •์€ ๊ต‰์žฅํžˆ ๋ถˆํ•„์š”ํ•˜๊ฒŒ ๋А๊ปด์ง.

๋˜ํ•œ Avatar ์ปดํฌ๋„ŒํŠธ์— ์ถ”๊ฐ€์ ์ธ ๋ฐ์ดํ„ฐ๊ฐ€ ํ•„์š”ํ•ด์ง€๋ฉด ํ•ด๋‹น ๋ฐ์ดํ„ฐ๋„ ์ถ”๊ฐ€๋กœ ์—ฌ๋Ÿฌ ๋‹จ๊ณ„์— ๊ฑธ์ณ ๋„˜๊ฒจ ์ค˜์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ต‰์žฅํžˆ ๋ฒˆ๊ฑฐ๋กœ์›€.

์ด๋•Œ, ์ปจํ…์ŠคํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ํ•œ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์€ Avatar ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ณ€์ˆ˜์— ์ €์žฅํ•˜์—ฌ ์ง์ ‘ ๋„˜๊ฒจ ์ฃผ๋Š” ๊ฒƒ์ž„.

 

function Page (props) {
    const user = props.user;

    const userLink = (
        <Link href={user.permalink}>
            <Avatar user={user} size={props.avatarSize} />
        </Link>
    );

    //Page ์ปดํฌ๋„ŒํŠธ๋Š” PageLayout ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ Œ๋”๋ง
    //์ด๋•Œ props ๋กœ userLink ๋ฅผ ํ•จ๊ป˜ ์ „๋‹ฌํ•จ.

    return <PageLayout userLink={userLink} />;
}

//PageLayout ์ปดํฌ๋„ŒํŠธ๋Š” NavigationBar ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ Œ๋”๋ง
<PageLayout userLink={...} />

//NavigationBar ์ปดํฌ๋„ŒํŠธ๋Š” props ๋กœ ์ „๋‹ฌ๋ฐ›์€ userLink element ๋ฅผ ๋ฆฌํ„ด
<NavigationBar userLink={...} />

 

์œ„ ์ฝ”๋“œ์—์„œ๋Š” user ์™€ avatarSize ๊ฐ€ props ๋กœ ๋“ค์–ด๊ฐ„ Avatar ์ปดํฌ๋„ŒํŠธ๋ฅผ userLink ๋ผ๋Š” ๋ณ€์ˆ˜์— ์ €์žฅํ•œ ๋’ค์— ํ•ด๋‹น ๋ณ€์ˆ˜๋ฅผ ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ๋กœ ๋„˜๊ธฐ๊ณ  ์žˆ์Œ.

๊ฐ€์žฅ ์ƒ์œ„ ๋ ˆ๋ฒจ์— ์žˆ๋Š” Page ์ปดํฌ๋„ŒํŠธ๋งŒ Avatar ์ปดํฌ๋„ŒํŠธ์—์„œ ํ•„์š”๋กœ ํ•˜๋Š” user ์™€ avatarSize ์— ๋Œ€ํ•ด ์•Œ๊ณ  ์žˆ์œผ๋ฉด ๋จ.

 

์ด๋Ÿฐ ๋ฐฉ์‹์€ ์ค‘๊ฐ„ ๋ ˆ๋ฒจ์˜ ์ปดํฌ๋„ŒํŠธ๋ฅผ ํ†ตํ•ด ์ „๋‹ฌํ•ด์•ผ ํ•˜๋Š” props ๋ฅผ ์—†์• ๊ณ , ์ฝ”๋“œ๋ฅผ ๊ฐ„๊ฒฐํžˆ ๋งŒ๋“ค์–ด ์คŒ.

๋˜ํ•œ ์ตœ์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ์—๋Š” ๋งŽ์€ ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•˜๊ฒŒ ๋จ.

 

๋‹ค๋งŒ, ๋ชจ๋“  ์ƒํ™ฉ์— ์ด ๋ฐฉ์‹์ด ์ข‹์€ ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค~

๋ฐ์ดํ„ฐ๊ฐ€ ๋งŽ์•„์งˆ์ˆ˜๋ก ์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ์— ๋ชฐ๋ฆฌ๊ธฐ ๋•Œ๋ฌธ์— ์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ๋Š” ๋ณต์žกํ•ด์ง€๊ณ , ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ๋Š” ๋„ˆ๋ฌด ์œ ์—ฐํ•ด์ง‘๋‹ˆ๋‹ค.

 

 

function Page (props) {
    const user = props.user;

    const topBar = (
        <NavigationBar>
            <Link href={user.permalink}>
                <Avatar user={user} size={props.avatarSize} />
            </Link>
        </NavigationBar>
    );

    const content = <Feed user={user} />

    return (
        <PageLayout
            topBar={topBar}
            content={content}
        />
    );
}

 

์œ„ ์ฝ”๋“œ์˜ ๋ฐฉ์‹์€ ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ์˜ ์˜์กด์„ฑ์„ ์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ์™€ ๋ถ„๋ฆฌํ•  ํ•„์š”๊ฐ€ ์žˆ๋Š” ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ์— ์ ์ ˆํ•œ ๋ฐฉ๋ฒ•์ž„.

๋ Œ๋”๋ง ์ „์— ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ์™€ ํ†ต์‹ ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ render props ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ฒ˜๋ฆฌํ•  ์ˆ˜๋„ ์žˆ์Œ.

 

ํ•˜์ง€๋งŒ ์–ด๋– ํ•œ ๊ฒฝ์šฐ์—๋Š” ํ•˜๋‚˜์˜ ๋ฐ์ดํ„ฐ์— ๋‹ค์–‘ํ•œ ๋ ˆ๋ฒจ์ด ์žˆ๋Š” ์ค‘์ฒฉ๋œ ์ปดํฌ๋„ŒํŠธ๋“ค์˜ ์ ‘๊ทผ์ด ํ•„์š”ํ•  ์ˆ˜ ์žˆ์Œ.

์ด๋Ÿฌํ•œ ๊ฒฝ์šฐ์—๋Š” ์œ„ ๋ฐฉ์‹์€ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๊ณ , ์ปจํ…์ŠคํŠธ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•จ.

์ปจํ…์ŠคํŠธ๋Š” ํ•ด๋‹น ๋ฐ์ดํ„ฐ์™€ ๋ฐ์ดํ„ฐ์˜ ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ๋ชจ๋‘ ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ๋“ค์—๊ฒŒ broadcast(๋„๋ฆฌ ์•Œ๋ ค ์ฃผ๋Š” ๊ฒƒ) ํ•ด ์คŒ.

์ปจํ…์ŠคํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ์— ์ ํ•ฉํ•œ ๋ฐ์ดํ„ฐ์˜ ๋Œ€ํ‘œ์ ์ธ ์˜ˆ๋กœ ํ˜„์žฌ ์ง€์—ญ ์ •๋ณด, ui ํ…Œ๋งˆ, ๊ทธ๋ฆฌ๊ณ  ์บ์‹ฑ๋œ ๋ฐ์ดํ„ฐ ๋“ฑ์ด ์žˆ์Œ.

 

 

3) ์ปจํ…์ŠคํŠธ API

 

1. React.createContext

 

- ์ปจํ…์ŠคํŠธ๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด์„œ React.createContext() ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•จ.

 

const MyContext = React.createContext(๊ธฐ๋ณธ๊ฐ‘);

 

์ƒ์œ„ ๋ ˆ๋ฒจ์— ๋งค์นญ๋˜๋Š” Provider ๊ฐ€ ์—†๋‹ค๋ฉด, ์ด ๊ฒฝ์šฐ์—๋งŒ ๊ธฐ๋ณธ๊ฐ’์ด ์‚ฌ์šฉ๋จ.

๊ธฐ๋ณธ๊ฐ’์œผ๋กœ undefined ๋ฅผ ๋„ฃ์œผ๋ฉด ๊ธฐ๋ณธ๊ฐ’์ด ์‚ฌ์šฉ๋˜์ง€ ์•Š์Œ.

 

 

2. Context.Provider

 

- Context.Provider ์ปดํฌ๋„ŒํŠธ๋กœ ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ๋“ค์„ ๊ฐ์‹ธ์ฃผ๋ฉด ๋ชจ๋“  ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ๋“ค์ด ํ•ด๋‹น ์ปจํ…์ŠคํŠธ์˜ ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋จ.

 

<MyContext.Provider value={/* some value */}>

 

Provider ์ปดํฌ๋„ŒํŠธ์—๋Š” value ๋ผ๋Š” prop ์ด ์žˆ์œผ๋ฉฐ, ์ด๊ฒƒ์€ Provider ์ปดํฌ๋„ŒํŠธ ํ•˜์œ„์— ์žˆ๋Š” ์ปดํฌ๋„ŒํŠธ๋“ค์—๊ฒŒ ์ „๋‹ฌ๋จ.

ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ๋“ค์ด ์ด ๊ฐ’์„ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋Š”๋ฐ, ์ด๊ฒƒ์„ consumer ์ปดํฌ๋„ŒํŠธ ๋ผ๊ณ  ๋ถ€๋ฆ„.

consumer ์ปดํฌ๋„ŒํŠธ๋Š” ์ปจํ…์ŠคํŠธ ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜๋ฉด ์žฌ๋ Œ๋”๋ง ๋จ!

์ฐธ๊ณ ๋กœ, ํ•˜๋‚˜์˜ Provider ์ปดํฌ๋„ŒํŠธ๋Š” ์—ฌ๋Ÿฌ ๊ฐœ์˜ consumer ์ปดํฌ๋„ŒํŠธ์™€ ์—ฐ๊ฒฐ๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์—ฌ๋Ÿฌ ๊ฐœ์˜ Provider ์ปดํฌ๋„ŒํŠธ๋Š” ์ค‘์ฒฉ๋˜์–ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ.

 

Provider ์ปดํฌ๋„ŒํŠธ๋กœ ๊ฐ์‹ธ์ง„ ๋ชจ๋“  consumer ์ปดํฌ๋„ŒํŠธ๋Š” Provider ์˜ value prop ์ด ๋ฐ”๋€” ๋•Œ๋งˆ๋‹ค ์žฌ๋ Œ๋”๋ง ๋จ.

 

๊ฐ’์ด ๋ณ€๊ฒฝ๋˜์—ˆ์„ ๋•Œ ์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์—…๋ฐ์ดํŠธ ๋Œ€์ƒ์ด ์•„๋‹ˆ๋”๋ผ๋„, ํ•˜์œ„์— ์žˆ๋Š” ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ปจํ…์ŠคํŠธ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ์—์„œ๋Š” ์—…๋ฐ์ดํŠธ๊ฐ€ ์ผ์–ด๋‚จ.

 

 

3. Context.Consumer

 

consumer ์ปดํฌ๋„ŒํŠธ๋Š” ์ปจํ…์ŠคํŠธ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊ตฌ๋…ํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ์ž„.

 

<MyContext.Consumer>
    {value => /* ์ปจํ…์ŠคํŠธ์˜ ๊ฐ’์— ๋”ฐ๋ผ์„œ ์ปดํฌ๋„ŒํŠธ๋“ค์„ ๋ Œ๋”๋ง */ }
</MyContext.Consumer>

 

์ปดํฌ๋„ŒํŠธ์˜ ์ž์‹์œผ๋กœ ํ•จ์ˆ˜๊ฐ€ ์˜ค๋Š” ๊ฒƒ์„ function as a child ๋ผ๊ณ  ํ•จ.

Context.Consumer ๋กœ ๊ฐ์‹ธ์ฃผ๋ฉด ์ž์‹์œผ๋กœ ๋“ค์–ด๊ฐ„ ํ•จ์ˆ˜๊ฐ€ ํ˜„์žฌ ์ปจํ…์ŠคํŠธ์˜ value ๋ฅผ ๋ฐ›์•„์„œ ๋ฆฌ์•กํŠธ ๋…ธ๋“œ๋กœ ๋ฆฌํ„ดํ•˜๊ฒŒ ๋จ.

ํ•จ์ˆ˜๋กœ ์ „๋‹ฌ๋˜๋Š” value ๋Š” Provider ์˜ value prop ๊ณผ ๋™์ผํ•จ.

๋งŒ์•ฝ ์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ์— Provider ๊ฐ€ ์—†๋‹ค๋ฉด ์ด value ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” createContext() ๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ ๋„ฃ๋Š” ๊ธฐ๋ณธ๊ฐ’๊ณผ ๋™์ผํ•œ ์—ญํ• ์„ ํ•จ.

 

 

4. Context.displayName

 

์ปจํ…์ŠคํŠธ ๊ฐ์ฒด๋Š” displayName ์ด๋ผ๋Š” ๋ฌธ์ž์—ด ์†์„ฑ์„ ๊ฐ€์ง.

๋˜ํ•œ, ํฌ๋กฌ ๋ฆฌ์•กํŠธ ๊ฐœ๋ฐœ์ž ๋„๊ตฌ์—์„œ๋Š” ์ปจํ…์ŠคํŠธ์˜ Provider ๋‚˜ Consumer ๋ฅผ ํ‘œ์‹œํ•  ๋•Œ,

์ด displayName ์„ ํ•จ๊ป˜ ํ‘œ์‹œํ•ด ์คŒ.

 

const MyContext = React.createContext(/* some value */);
MyContext.displayName = 'MyDisplayName';

//๊ฐœ๋ฐœ์ž ๋„๊ตฌ์— "MyDisplayName.Provider" ๋กœ ํ‘œ์‹œ๋จ
<MyCOntext.Provider>

//๊ฐœ๋ฐœ์ž ๋„๊ตฌ์— "MyDisplayName.Consumer" ๋กœ ํ‘œ์‹œ๋จ
<MyContext.Consumer>

 

์œ„์™€ ๊ฐ™์ด ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋ฉด MyDisplayName ์ด ๋ฆฌ์•กํŠธ ๊ฐœ๋ฐœ์ž ๋„๊ตฌ์— ํ‘œ์‹œ๋จ.

 

 

5. useContext

 

ํ•จ์ˆ˜ ์ปดํฌ๋„ŒํŠธ์—์„œ ์ปจํ…์ŠคํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋งค๋ฒˆ Consumer ์ปดํฌ๋„ŒํŠธ๋กœ ๊ฐ์‹ธ์ฃผ๋Š” ๊ฒƒ๋ณด๋‹ค ๋” ์ข‹์€ ๋ฐฉ๋ฒ•์ด ์žˆ์Œ.

๊ทธ๊ฒƒ์€ ๋ฐ”๋กœ useContext() ํ›…์ž…๋‹ˆ๋‹ค.

ํ›…์€ ํ•จ์ˆ˜ ์ปดํฌ๋„ŒํŠธ์—์„œ ์ปจํ…์ŠคํŠธ๋ฅผ ์‰ฝ๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด ์คŒ.

useContext() ํ›…๊ณผ React.createContext() ํ•จ์ˆ˜ ํ˜ธ์ถœ๋กœ ์ƒ์„ฑ๋œ ์ปจํ…์ŠคํŠธ ๊ฐ์ฒด๋ฅผ ์ธ์ž๋กœ ๋ฐ›์•„์„œ

ํ˜„์žฌ ์ปจํ…์ŠคํŠธ์˜ ๊ฐ’์„ ๋ฆฌํ„ดํ•จ.

 

function MyComponent(props) {
    const value = useContext(MyContext);

    return (
        ...
    );
}

 

useContext () ํ›…์„ ์‚ฌ์šฉํ•˜๋ฉด ๋‹ค๋ฅธ ๋ฐฉ์‹๊ณผ ๋™์ผํ•˜๊ฒŒ ์ปดํฌ๋„ŒํŠธ ํŠธ๋ฆฌ์ƒ์—์„œ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ์ƒ์œ„ Provider ๋กœ๋ถ€ํ„ฐ ์ปจํ…์ŠคํŠธ์˜ ๊ฐ’์„ ๋ฐ›์•„์˜ค๊ฒŒ ๋จ.

๋งŒ์•ฝ ์ปจํ…์ŠคํŠธ์˜ ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜๋ฉด ๋ณ€๊ฒฝ๋œ ๊ฐ’๊ณผ ํ•จ๊ป˜ useContext() ํ›…์„ ์‚ฌ์šฉํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์žฌ๋ Œ๋”๋ง ๋จ.

๊ทธ๋ ‡๊ธฐ์— useContext() ํ›…์„ ์‚ฌ์šฉํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ์˜ ๋ Œ๋”๋ง์ด ๊ฝค ๋ฌด๊ฑฐ์šด ์ž‘์—…์ผ ๊ฒฝ์šฐ์—๋Š” ๋ณ„๋„๋กœ ์ตœ์ ํ™” ์ž‘์—…์„ ํ•ด ์ค„ ํ•„์š”๊ฐ€ ์žˆ์Œ.

 

useContext() ํ›…์„ ์‚ฌ์šฉํ•  ๋•Œ์—๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ปจํ…์ŠคํŠธ ๊ฐ์ฒด๋ฅผ ๋„ฃ์–ด ์ค˜์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ๊ผญ ๊ธฐ์–ตํ•˜์ž.

 

//์˜ฌ๋ฐ”๋ฅธ ์‚ฌ์šฉ
useContext(MyContext);

//์ž˜๋ชป๋œ ์‚ฌ์šฉ๋ฒ•
useContext(MyContext.Consumer);
useContext(MyContext.Provider);

 

์œ„ ์ฝ”๋“œ์ฒ˜๋Ÿผ Consumer๋‚˜ Provider ๋ฅผ ๋„ฃ์œผ๋ฉด ์•ˆ ๋จ!!!

728x90
Comments