Post

๐Ÿฅœ [Conference] React19 2๋…„๋งŒ์˜ ์—…๋ฐ์ดํŠธ, ๋ญ๊ฐ€ ๋‹ฌ๋ผ์งˆ๊นŒ (GDSC Kprintf)

image-01 (GDSC Kprintf)

ํ•ด๋‹น์ž๋กœ๋Š” GDSC ์ปจํผ๋Ÿฐ์Šค์— ์ฐธ์—ฌํ•˜์—ฌ ๋“ค์€ ๊ฐ•์˜ ๋‚ด์šฉ ์†Œ๊ฐ์„ ๋ฐ”ํƒ•์œผ๋กœ

์ž‘์„ฑ ๋œ ํฌ์ŠคํŠธ ์ž…๋‹ˆ๋‹ค.

๊ฐœ์š”

ํ”„๋ก ํŠธ์•ค๋“œ ๊ฐœ๋ฐœ์ž๋ฅผ ์ค€๋น„ํ•˜๋Š” ๋‚˜๋กœ์„œ ์ตœ๊ทผ๋“ค์–ด Next 14 ์—…๋ฐ์ดํŠธ๋Š” ์•„์ฃผ ํฐ ์ถฉ๊ฒฉ์ด์—ˆ๋‹ค.

ํ˜„์žฌ ๋ฆฌ์•กํŠธ ๋ฒ„์ „์€ 18 ์ด๊ณ , ๊ณต์‹ ์—…๋ฐ์ดํŠธ๋Š” 2022๋…„ 6์›” ์ดํ›„๋กœ ์—†์—ˆ๋‹ค.

2๋…„๋™์•ˆ ์•„๋ฌด๊ฒƒ๋„ ์—†๋˜ ๊ฒƒ์€ ๊ต‰์žฅํžˆ ์•„์‰ฌ์šด ๋ถ€๋ถ„์ด์—ˆ๋‹ค.

๊ทธ๋Ÿฐ๋ฐ ์ด๋ฒˆ์—๋Š” React ๋„ 19 ๋ฒ„์ „์œผ๋กœ ์—…๋ฐ์ดํŠธ ์†Œ์‹์ด ๋“ค๋ ค์˜ค๋‹ค๋‹ˆโ€ฆ

๊ณผ์—ฐ ๋ญ๊ฐ€ ๋‹ฌ๋ผ์กŒ์„๊นŒ ์•Œ์•„๋ณด์ž

์™œ React ๋Š” ์—…๋ฐ์ดํŠธ๋ฅผ ํ•˜๋Š”๊ฐ€?

  • ์ด์ œ ๋ฆฌ์•กํŠธ๋Š” ๋ชจ๋“  ํ™˜๊ฒฝ์—์„œ ํ˜ธํ™˜๋˜๋ฉฐ Asset loading, ๋ฉ”ํƒ€ ๋ฐ์ดํ„ฐ ์กฐ์ž‘๋“ฑ ํฐ ์กฐ์ •์ด ์žˆ์„ ์˜ˆ์ •์ด๋ผ๊ณ  ํ•œ๋‹ค.
  • ์ •์‹ ๋ฆด๋ฆฌ์ฆˆ ์ „ Web Components ์ง€์›๊ณผ ๊ฐ™์€ ํฐ ๋ณ€๊ฒฝ์ด ์˜ˆ๊ณ ๋˜์—ˆ๋‹ค.

๊ทธ๋Ÿผ ์ด์ œ ๋ณ€๊ฒฝ์ด ๋  ์ ์„ ํ•œ๋ฒˆ ์•Œ์•„๋ณด์ž



๋ณ€๊ฒฝ ๋œ ์ 

๊ทธ๋ ‡๋‹ค๋ฉด React 19 ์—์„œ๋Š” ๋ฌด์Šจ ๋ณ€๊ฒฝ์ ์ด ์žˆ๊ธธ๋ž˜ 2๋…„์ด๋ผ๋Š” ์„ธ์›”์ด ๊ฑธ๋ ธ์„๊นŒ?

๋ฆฌ์•กํŠธ๋Š” ๊ณผ๊ฑฐ์— ํฐ ๋ณ€๊ฒฝ์ ์ด ์žˆ์—ˆ๋‹ค.

  1. ํด๋ž˜์Šคํ˜• ์ปดํฌ๋„ŒํŠธ์—์„œ ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ๋กœ ์—…๋ฐ์ดํŠธ ๋์„ ๋•Œ (19.02.16)
  2. Concurrent Mode ๋ฅผ ํ†ตํ•ด ์œ ์ €์—๊ฒŒ ์ข€ ๋” ์นœ์ˆ™ํ•œ UI ๋ฅผ ์ถ”๊ฐ€ (22.03.09)

๋ฆฌ์•กํŠธ๋Š” 3๊ฐœ์˜ ๋ ˆ์ด์–ด๊ฐ€ ์žˆ๋Š”๋ฐ

  • Code Layer : React node ๋ฅผ ํ†ตํ•œ ์ฝ”๋“œ ์ƒํƒœ
  • React layer : Virtual DOM
  • Broser layer : Browser DOM

์ด ๊ตฌ์กฐ๋ฅผ ์ผ๋‹จ ์•Œ์•„์•ผ ๋ณ€๊ฒฝ์ ๋„ ์ดํ•ดํ•˜๊ธฐ ํŽธํ•˜๋‹ค.


๊ณผ๊ฑฐ ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ํ† ๋Œ€๋กœ ์ˆœ์„œ๋Œ€๋กœ ํ˜๋Ÿฌ๊ฐ€๋ณด์ž

์™œ ํด๋ž˜์Šคํ˜• ์ปดํฌ๋„ŒํŠธ์—์„œ ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ๋กœ ๊ตณ์ด ๋ณ€๊ฒฝ์„ ํ–ˆ์„๊นŒ?

ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ๋Š” ํ•ญ์ƒ ๋žœ๋”๋ง๋œ ๊ฐ’์„ UI ์— ๋ณด์—ฌ์ค€๋‹ค.

๋”ฐ๋ผ์„œ ์‚ฌ์šฉ์ž๋Š” ๋”์ด์ƒ UI ์™€ ๋ฐ์ดํ„ฐ๊ฐ„ ๋™๊ธฐํ™”๋ฅผ ์ƒ๊ฐํ•˜์ง€ ์•Š์•„๋„ ๋˜๊ฒŒ ๋œ๋‹ค.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import React form "react";

class ProfilePage extends React.Component {
    showMessage = () => {
        alert(user + "๋ฅผ ํŒ”๋กœ์šฐ ํ•ฉ๋‹ˆ๋‹ค.");
    };

    handleClick = () => {
        const {user} = this.props;
        // ํ•จ์ˆ˜๊ฐ€ ๋  ์‹œ์ ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ˜์˜ ์‹œ์ผœ์•ผ๋จ...
        setTimeout(() => this.showMessage(user), 3000);
    }

    render() {
        return <button onClick = {this.handleClick}>Follow</button>;
    }
}

์ƒ๋‹จ์˜ ์ฝ”๋“œ๋Š” ์•„์ฃผ ํฐ ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค.

ํ•œ๋ฒˆ ์ƒ๊ฐํ•ด๋ณด์ž



State ๋ž€?

User Interaction ์œผ๋กœ ๋ฐœ์ƒํ•œ ๋ฐ์ดํ„ฐ์˜ ๋ณ€ํ™”

๋ชจ๋“  ๋ฐ์ดํ„ฐ๋Š” ์ž๊ธฐ๋งŒ์˜ ์ƒ๋ช… ์ฃผ๊ธฐ๋ฅผ ๊ฐ–๋Š”๋ฐ (๋ชจ๋“  ํ”„๋กœ๊ทธ๋žจ์˜ ๋ฒ•์น™)

๊ทธ๋ ‡๊ธฐ ๋–„๋ฌธ์— interaction ์˜ ๋ฐ์ดํ„ฐ๋„ ๋…๋ฆฝ์ ์ธ ์ƒ๋ช…์ฃผ๊ธฐ๋ฅผ ๋ณด์žฅํ•ด์•ผํ•œ๋‹ค.

1
2
3
4
5
6
7
8
9
function Counter() {
    let state = 0;

    const onClick = () => {
        state++;
    };

    return <button onClick={onClick}>Click Me</button>
}

์œ„์˜ ๊ฐ’์€ re-rendering ๋  ์‹œ์—๋Š” ๊ฐ’์ด ์ž๋™ ์†Œ๋ฉธํ•œ๋‹ค.

components ๊ฐ€ ํ˜ธ์ถœ ๋์„ ๋•Œ ์ดˆ๊ธฐํ™”๊ฐ€ ๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.



React Hooks

๋…๋ฆฝ์ ์ธ state ๋ฐ์ดํ„ฐ ์กฐ์ž‘์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๋Š” API

1
2
3
4
function Counter() {
    const [first, setFirst] = useState(0);
    const [second, setSecond] = useState(0);
}

์–ผ๋งˆ๋“ ์ง€ ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋˜์–ด๋„ ๋ฐ์ดํ„ฐ๋ฅผ ๋…๋ฆฝ์ ์ธ ๊ฐ’์œผ๋กœ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” React ์˜ Hook ์ด๋‹ค.

ํ•˜์ง€๋งŒ ๋‹ค๋ฅธ state ๋“ค์€ Hooks ๋˜์ง€ ๋ชปํ•œ ๊ฒƒ๋“ค์ด ์žˆ๋Š”๋ฐ

  • useSuspense
  • useCatch(useThrow)
  • useProvider
  • useShouldComponentsUpdate

๋‹ค๋ฅธ ์ปดํฌ๋„ŒํŠธ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๊ธฐ ๋•Œ๋ฌธ์— ๋…๋ฆฝ์ ์ด์ง€ ๋ชปํ•˜๊ธฐ ๋•Œ๋ฌธโ€ฆ



Concurrent React (React 18)

์ด์ œ ๋”์ด์ƒ ์‚ฌ์šฉ์ž๋Š” UI ์™€ ๋ฐ์ดํ„ฐ์™€ ๋™๊ธฐํ™”๋ฅผ ์ƒ๊ฐํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค.

๊ทธ๋Ÿผ ์ด์ œ ๋ฐ์ดํ„ฐ๋ฅผ ์—…๋ฐ์ดํŠธ๋ฅผ ์–ธ์ œ, ์–ด๋–ป๊ฒŒ ๋ฌด์—‡์œผ๋กœ UI ์— ์•Œ๋ฆฌ์ง€?

๊ทธ๋ ‡๋‹ค๋ฉด ์–ธ์ œ ์•Œ๋ฆด์ง€ React ๊ฐ€ ์„ ํƒ๊ถŒ์„ ์ฅ๊ณ  ์žˆ๋‹ค๊ฐ€ ํ•„์š”ํ•œ UI ๋จผ์ € ์—…๋ฐ์ดํŠธ๋ฅผ ํ•  ์ˆ˜ ์žˆ์œผ๋ฉด ์ข‹์ง€์•Š์„๊นŒ?

๋ผ๋Š” ์—ฐ๊ณ„ ์งˆ๋ฌธ์— ๋‹ค๋‹ค๋ฅผ ์ˆ˜ ์žˆ๋Š”๋ฐ ๊ทธ๋Ÿผ ๋™์‹œ์„ฑ ์„ ๊ณ ๋ ค๋ฅผ ํ•ด์•ผํ•œ๋‹คโ€ฆ

๋™์‹œ์„ฑ ์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์ž



Concurrency (๋™์‹œ์„ฑ)

์ดํ•ด๋ฅผ ๋•๊ธฐ ์œ„ํ•ด ์˜ˆ์‹œ๋ฅผ ๋“ค์ž๋ฉด

ํ†ตํ™”๋ฅผ ์˜ˆ์‹œ๋ฅผ ๋“ค์–ด๋ณด์ž ์ง€๊ธˆ ๋‚ด๊ฐ€ ์ฒ ์ˆ˜์˜ ํ†ตํ™”๋ฅผ ๋ฐ›๊ณ ์žˆ๋‹ค๋ฉด, ์˜ํฌ์˜ ํ†ตํ™”๋ฅผ ๋“ค์„ ์ˆ˜๊ฐ€ ์—†๋‹ค.

๋‚ด๊ฐ€ ์ง€๊ธˆ ์ฒ ์ˆ˜์™€ ์žก๋‹ด์„ ํ•˜๊ณ  ์žˆ๋Š”๋ฐ, ์˜ํฌ์™€ ์ค‘์š”ํ•œ ์ „ํ™”๊ฐ€ ๊ฑธ๋ ค์˜จ๋‹ค๋ฉดโ€ฆ

๊ทธ๋Ÿผ ์ฒ ์ˆ˜์˜ ํ†ตํ™”๋Š” ์ค‘์š”ํ•˜์ง€ ์•Š์œผ๋‹ˆ ์ง„ํ–‰ ์ค‘์ธ ์ฒ ์ˆ˜ ํ†ตํ™”๋Š” ์ž ๊น ๋ฉˆ์ถ”๊ณ 

์˜ํฌ์˜ ์ „ํ™”๋ฅผ ๋ฐ›๋Š”๊ฒŒ ๋ฐ์ดํ„ฐ ์ƒ์œผ๋กœ๋„ ์ค‘์š”๋„๋ฅผ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ๋‹ค.


๋”ฐ๋ผ์„œ ํ•ด๋‹น ์˜ˆ์‹œ๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ

setInputValue ์™€ setSearchResult ๋ฅผ ์„ค๋ช…ํ•˜๋ฉด

setInputValue ๊ฐ€ ๊ฐ’์„ ๋จผ์ € ์ €์žฅ์„ ํ•˜๊ณ ๋‚˜์„œ setSearchResult ๋ฅผ ์‹คํ–‰์„ ํ•ด์•ผ ํ•˜๋ฏ€๋กœ

React 18 ์—์„œ๋ถ€ํ„ฐ๋Š” ๋…๋ฆฝ์ ์œผ๋กœ ์ž๊ธฐ๋งŒ์˜ ์Šค์ผ€์ค„๋ง์„ ํ•  ์ˆ˜ ์žˆ์–ด์กŒ๋‹ค.

ex) Suspenseโ€ฆ

1
2
3
4
5
6
7
8
return (
    <Layout> // OK!
        <NavBar/> // OK!
            <Suspense fallback ={<UsersSkeleton/>}> // WAIT!
                <Users/> // FAILED...
            </Suspense>
    </Layout>
)

์‹ค์ œ React ์˜ ๋‚ด๋ถ€์—์„œ๋Š” Ping ์„ ํ†ตํ•ด ๋ Œ๋”๋ง์„ ์‹œ๋„ํ•ด๋‹ฌ๋ผ ์š”์ฒญ์„ ํ•œ๋‹ค.

์ด๊ฒŒ useState() ์—์„œ ๊ตณ์ด ์ปดํฌ๋„ŒํŠธ๋ฅผ async ์ฒ˜๋ฆฌํ•˜์ง€ ์•Š์•„๋„ ๋˜๋Š” ์ด์œ ๋‹ค.

1
2
3
4
5
6
7
8
9
10
11
12
13
//Before React18
function onClick() {
    setOne(); // rendering
    setTwo(); // rendering
    setThree(); // rendering
}

//after React18
function onClick() {
    setOne(); // waiting three
    setTwo(); // waiting three
    setThree(); // rendering
}

ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ ๋‚ด์—์„œ๋„ ์ ์šฉ์ด ๋˜๋Š” ๋ถ€๋ถ„์ด๋‹ค.



์ปดํฌ๋„ŒํŠธ ๋™์ž‘ ๋ถ„๋ฆฌ

๊ฐ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์‹คํ–‰์ด ๋˜์–ด์•ผ ํ•˜๋Š” ๊ณณ์€ ๋‹ค๋ฅธ ๊ณณ์ด์–ด์•ผ ํ•œ๋‹ค.

๊ทธ ์ด์œ ๋Š” ๋ฐ”๋กœ ์–ด๋–ค ์ปดํฌ๋„ŒํŠธ๋Š” ์„œ๋ฒ„์— ์ ‘๊ทผํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์™€์•ผํ•˜๊ณ 

State ๋Š” Client ์— ์กด์žฌํ•ด์•ผ ํ•˜๋ฉฐ ๊ฒฐ๊ตญ ์‚ฌ์šฉ์ž์™€ ์ƒํ˜ธ์ž‘์šฉํ•ด์•ผ ๊ทธ ์˜๋ฏธ๋ฅผ ๊ฐ–๋Š”๋ฐ

๊ทธ๋Ÿผ ์„œ๋ฒ„์— ์ ‘๊ทผํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ๋Š” UI ์— ์˜ํ•ด ์ฒ˜๋ฆฌ๋˜๊ณ , ๋˜ ํ•œ๋ฒˆ ์„œ๋ฒ„์— ์˜ํ•ด ์ฒ˜๋ฆฌ๊ฐ€ ๋˜์–ด์•ผํ•œ๋‹ค.

๋‘๋ฒˆํ•˜๋Š” ๊ฑด ์—„์ฒญ ๋น„ํšจ์œจ์ ์ด๋‹ค.

์ด๋ง์ธ ์ฆ‰์Šจ

  • state ๊ฐ€ ์—†๋Š” ์ปดํฌ๋„ŒํŠธ๋Š” client ์—์„œ ๋‹ค๋ฃฐ ํ•„์š”๊ฐ€ ์—†๋‹ค.
  • data๊ฐ€ ์—†๋Š” ์ปดํฌ๋„ŒํŠธ๋Š” server ์—์„œ ๋‹ค๋ฃฐ ํ•„์š”๊ฐ€ ์—†๋‹ค.

๋ผ๋Š” ๋‘ ๊ฐ€์ง€ ํฐ ํ‹€๋กœ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.


๋”ฐ๋ผ์„œ client ์— ์ฃผ์ง€ ์•Š์•„๋„ ๋˜๋Š” ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ค„์ด๋Š” ๊ฒƒ์ด ์„ฑ๋Šฅ ๊ฐœ์„ ์— ํฐ ๋„์›€์ด ๋œ๋‹ค.

React ๊ฐ€ 19 ๋ฒ„์ „์œผ๋กœ ์—…๋ฐ์ดํŠธ ๋˜๋Š” ๊ฐ€์žฅ ํฐ ์ด์œ ๋‹ค.

Server Component ์— ๋Œ€ํ•œ ๋ณธ๊ฒฉ์ ์ธ ์ง€์›์ด ์‹œ์ž‘์ด ๋œ๋‹ค ์ด ๋ง์ด๋‹ค.



Server Component ๋ž€?

  • Server Component ๋Š” ์„œ๋ฒ„์—์„œ๋งŒ ์‹คํ–‰๋˜๋Š” ์ปดํฌ๋„ŒํŠธ๋กœ, ์‹ค์ œ ํด๋ผ์ด์–ธํŠธ์— ์ฝ”๋“œ๊ฐ€ ์ „๋‹ฌ ๋˜์ง€์•Š์Œ
  • DB, ํŒŒ์ผ ๋‹ค๋ฅธ ์„œ๋ฒ„ ๋“ฑ server-side resource ์— ์ ‘๊ทผ ํ•  ์ˆ˜ ์žˆ์Œ

Next ์˜ use server ๊ฐ™์€ ๋Š๋‚Œ

๋”ฐ๋ผ์„œ Suspense ์™€ ํ•จ๊ป˜ํ•œ๋‹ค๋ฉด ์ตœ์ ํ™”์™€ ์ตœ์ ์˜ UI ๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Œ!!!

๋˜ํ•œ ์„ ํ˜•์ ์ธ ๋กœ๋”ฉ ์‹œ๊ฐ„์„ ๋ณ‘๋ ฌ์ ์œผ๋กœ๋„ ๊ฐœ์„ ์„ ํ•  ์ˆ˜๊ฐ€ ์žˆ์–ด์กŒ๋‹ค.

๋”ฐ๋ผ์„œ Client ๋Š” server component ๋ฅผ ์•Œ ํ•„์š”๊ฐ€ ์—†์–ด์กŒ๊ณ 

๊ทธ๋ž˜์„œ ๋ฒˆ๋“ค ์‚ฌ์ด์ฆˆ๊ฐ€ ์ž‘์•„์ง€๊ธฐ ๋•Œ๋ฌธ์— ๋ Œ๋”๋ง ๊ฐœ์„ ์— ์•„์ฃผ ํฐ ๋„์›€์ด ๋˜์—ˆ๋‹ค.

์ƒˆ๋กœ์šด React Hook ์˜ ๋„์ž…๋„ ๊ทธ์— ๋งž๊ฒŒ ๊ฐœ์„ ์ด ๋˜์—ˆ๋‹ค.

  • useFormState()
  • useFormStatus()
  • โ€ฆ



Asset Loading

์‹ค์ œ ๋žœ๋”๋ง์‹œ React ์˜ ๋žœ๋”๋ง๊ณผ Asset ์˜ ๋ Œ๋”๋ง ์†๋„์˜ ์ฐจ์ด๊ฐ€ ๋‚˜์„œ ๋ถˆํŽธํ–ˆ๋‹ค.

๊ทธ ์ฐจ์ด๊ฐ€ ๊ฐœ์„ ์ด ๋˜์—ˆ๋Š”๋ฐ

์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ ๊ฐœ์„  ๋˜์—ˆ๋Š”์ง€ ์•Œ์•„๋ณด์ž


Resource Hints

Resource Hints ๊ฐ€ React ๋‚ด์—์„œ ๋„์ž…์ด ๋˜์—ˆ๋‹ค.

Resource Hint

๋ธŒ๋ผ์šฐ์ €์—๊ฒŒ ๋ฏธ๋ฆฌ ๋ฆฌ์†Œ์Šค๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ๋ฏธ๋ฆฌ ๊ฐ’์„ ์•Œ๋ ค์ฃผ๋Š” ๋ฐฉ์‹์œผ๋กœ

๋žœ๋”๋ง ์†๋„ ๊ฐœ์„ ์— ์•„์ฃผ ํฐ ๋„์›€์ด ๋˜๋Š” ๋ฐฉ์‹์ด๋‹ค.

  • preconnect : ๋ฏธ๋ฆฌ ์„œ๋ฒ„์™€ ์—ฐ๊ฒฐ๊นŒ์ง€ ๊ตฌ์„ฑ์„ ํ•ด TCP Hand-shake ๋„ ๋น ๋ฅด๊ฒŒ ๋งŒ๋“ค์–ด์คŒ
  • dns-preconnect : DNS ์„œ๋ฒ„์— ์ ‘๊ทผ ํ•˜๊ธฐ ์ „์— ๋ฏธ๋ฆฌ ์•Œ๋ ค์คŒ
  • preload : ํŠน์ • ๋ฆฌ์†Œ์Šค๊ฐ€ ์“ฐ์ด๋Š”๊ฒƒ์ด ํ™•์‹คํ•  ๋•Œ

๋”ฐ๋ผ์„œ ํ•ด๋‹น Hint ๋“ค์„ ํ†ตํ•ด ๋ฏธ๋ฆฌ ๋ฆฌ์†Œ์Šค๋“ค์„ ์•Œ๊ฒŒ ๋˜๋ฏ€๋กœ

fallback ์„ ๋” ๋น ๋ฅด๊ฒŒ ๊ด€๋ฆฌ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜๊ณ  ์ด๋Š” ๊ณง ๋กœ๋”ฉ์†๋„ ๊ฐœ์„ ์— ์—„์ฒญ๋‚œ ํž˜์ด ๋œ๋‹ค.

๋ง ๊ทธ๋Œ€๋กœ ์ •๋ณด๋ฅผ ๋ฏธ๋ฆฌ ์•Œ๊ฒŒ ๋˜๋‹ˆ๊น



Web Components

image-02 (Web Components)

๋ฆฌ์•กํŠธ๊ฐ€ ์•„๋‹Œ ๋‹ค๋ฅธ ํ™˜๊ฒฝ์—์„œ๋„ Components ๋ผ๋Š” ๊ฐœ๋…์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์„๊นŒ?

๋ผ๋Š” ๋ฐœ์ƒ์—์„œ ๋ฐœ์ƒ๋œ ์—…๋ฐ์ดํŠธ๋กœ

Svelte ๊ฐ™์€ ํ™˜๊ฒฝ์—์„œ๋„ Component ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด๋‹ค.



Use Hook

Use Hook ์„ ์‚ฌ์šฉํ•˜๋ฉด ๋น„๋™๊ธฐ ํ•จ์ˆ˜๋„ ๋™๊ธฐ์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด์ง„๋‹ค.

๋”ฐ๋ผ์„œ React-Query ์™€ ๊ฐ™์€ ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ์˜์กดํ•  ํ•„์š”๊ฐ€ ์—†์–ด์ง„๋‹ค.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
export async function fetchNote() {
    ...// fetch data
    
    return data
}

export function Note({id}) {
    const note = use(fetchNote(id));

    return (<div>
        <h1>{note.title}</h1>
        <section>{note.body}</section>
    </div>)
}

React-Query ์™€ ๋งค์šฐ ๋น„์Šทํ•˜๋‹ค.

Forward Ref ๊ฐ€ ๋ถˆํ•„์š” ํ•ด์ง

React ๋Š” ๋žœ๋”๋ง๊ณผ ์ƒ๊ด€์—†๋Š” ๊ฐ’์„ ๊ฐ€๋ฆฌํ‚ค๊ธฐ ์œ„ํ•œ useRef ๋ผ๋Š” ํ›…์ด ์žˆ๋‹ค.

์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ์—์„œ ํ•˜์œ„๋กœ ref ๋ฅผ ๋„˜๊ฒจ์ค„ ๋•Œ forward ref ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋„˜๊ฒจ์ฃผ์–ด์•ผ ํ–ˆ๋Š”๋ฐ

๊ทธ ์ด์œ ๋ˆˆ class Component ๋‚ด ref ๊ฐ’์€ props ๋‚ด ๊ณ ์œ ํ•œ ๊ฐ’์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.


์ •ํ™•ํžˆ๋Š” Class ์˜ insatance ์ธ์ง€ ์—ฌ๋ถ€๋ฅผ ๋‹ด๊ณ  ์žˆ๋Š”๋ฐ ์ž˜๋ชปํ•˜๋ฉด

ํด๋ž˜์Šค ๋‚ด ๊ฐ’์ด ๋ฎ์–ด์“ฐ์—ฌ์งˆ ์ˆ˜ ์žˆ๋Š” ์œ„ํ—˜์ด ์กด์žฌํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

๊ทผ๋ฐ ์ด์ œ ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋” ์ž์ฃผ ์‚ฌ์šฉ๊ณ  function ์€ instance ๊ฐœ๋…์ด ์—†๊ธฐ ๋•Œ๋ฌธ์—

์ด์ œ forward ref ๋ž€ ๊ฐœ๋…์ด ์—†๊ณ  ์ด์ œ๋Š” ref ๋ฅผ ํ•˜์œ„์ปดํฌ๋„ŒํŠธ๋กœ props ๋กœ ๋„˜๊ฒจ ์ค„ ์ˆ˜ ์žˆ๋‹ค.



๋งˆ์น˜๋ฉฐโ€ฆ

image-03 (react 19)

์•„์ง์€ pre realize ์ƒํƒœ๊ธฐ ๋•Œ๋ฌธ์— ์•„์ง์€ ๋ณ€๊ฒฝ๋  ์ˆ˜ ์žˆ๋Š” ์ƒํ™ฉ์ด ๋งŽ์ง€๋งŒ

๊ฐ€์žฅ ์ค‘์š”ํ•œ ๋ฐฉ๋ฒ•์€ ํ† ์ดํ”„๋กœ์ ํŠธ๋กœ ์ง์ ‘ ์ฒดํ—˜ํ•ด ๋ณด๋Š” ๊ฒƒ์ด๋‹ค.

๊ณต์‹ ์ฑ„๋„์„ ์ž์ฃผ ์ฐธ๊ณ ํ•˜๋ฉฐ ์•ž์œผ๋กœ ๋‹ค๊ฐ€์˜ฌ ๋Œ€๊ทœ๋ชจ ์—…๋ฐ์ดํŠธ

React 19 ์— ๋Œ€ํ•ด ์ค€๋น„๋ฅผ ๊พธ์ค€ํžˆ ํ•˜์ž

This post is licensed under CC BY 4.0 by the author.