|
12 | 12 | <div class="slides"> |
13 | 13 | <!-- Slide 1 --> |
14 | 14 | <section> |
15 | | - <iframe src="contents/1.html"></iframe> |
| 15 | + <iframe data-src="contents/1.html" data-preload></iframe> |
16 | 16 | <aside class="notes"> |
17 | 17 | 안녕하세요! 오늘은 React를 완전히 까보는 시간을 가져보려고 합니다. 평소에 우리가 당연하게 써왔던 |
18 | 18 | React가 내부적으로 어떻게 동작하는지, Virtual DOM부터 Fiber Architecture까지 30분 동안 함께 |
|
22 | 22 |
|
23 | 23 | <!-- Slide 2 --> |
24 | 24 | <section> |
25 | | - <iframe src="contents/2.html"></iframe> |
| 25 | + <iframe data-src="contents/2.html" data-preload></iframe> |
26 | 26 | <aside class="notes"> |
27 | 27 | 오늘은 크게 5가지 주제를 다룰 건데요. 각 주제가 서로 연결되어 있어서 순서대로 따라오시면 전체 |
28 | 28 | 그림이 보이실 겁니다. 목표는 '아 그래서 React가 이렇게 동작하는구나'를 느끼는 거예요! |
|
31 | 31 |
|
32 | 32 | <!-- Slide 3 --> |
33 | 33 | <section> |
34 | | - <iframe src="contents/3.html"></iframe> |
| 34 | + <iframe data-src="contents/3.html" data-preload></iframe> |
35 | 35 | <aside class="notes"> |
36 | 36 | 여러분 처음 JSX 봤을 때 어땠나요? 저는 '어? JavaScript에서 HTML을 쓴다고?'라고 생각했어요. 근데 |
37 | 37 | 이거, 사실은 JavaScript가 아닙니다! |
|
40 | 40 |
|
41 | 41 | <!-- Slide 4 --> |
42 | 42 | <section> |
43 | | - <iframe src="contents/4.html"></iframe> |
| 43 | + <iframe data-src="contents/4.html" data-preload></iframe> |
44 | 44 | <aside class="notes"> |
45 | 45 | JSX는 Babel이 JavaScript로 변환해줍니다. 보시면 React.createElement라는 함수 호출로 바뀌죠. 그럼 |
46 | 46 | 이 함수가 뭘 반환할까요? |
|
49 | 49 |
|
50 | 50 | <!-- Slide 5 --> |
51 | 51 | <section> |
52 | | - <iframe src="contents/5.html"></iframe> |
| 52 | + <iframe data-src="contents/5.html" data-preload></iframe> |
53 | 53 | <aside class="notes"> |
54 | 54 | 결국 JavaScript 객체를 만드는 거예요! 이 객체가 바로 Virtual DOM을 구성하는 노드입니다. HTML처럼 |
55 | 55 | 보이지만 사실은 전부 JavaScript 객체인 거죠. |
|
58 | 58 |
|
59 | 59 | <!-- Slide 6 --> |
60 | 60 | <section> |
61 | | - <iframe src="contents/6.html"></iframe> |
| 61 | + <iframe data-src="contents/6.html" data-preload></iframe> |
62 | 62 | <aside class="notes"> |
63 | 63 | Virtual DOM 이야기를 하기 전에, 왜 필요했는지부터 보죠. jQuery 시대에는 데이터가 바뀔 때마다 |
64 | 64 | DOM을 일일이 찾아서 업데이트했어요. 코드는 복잡해지고 버그는 양산되죠. |
|
67 | 67 |
|
68 | 68 | <!-- Slide 7 --> |
69 | 69 | <section> |
70 | | - <iframe src="contents/7.html"></iframe> |
| 70 | + <iframe data-src="contents/7.html" data-preload></iframe> |
71 | 71 | <aside class="notes"> |
72 | 72 | Virtual DOM의 핵심 아이디어는 간단합니다. 상태가 바뀌면 새로운 Virtual DOM을 만들고, 이전 것과 |
73 | 73 | 비교해서 바뀐 부분만 실제 DOM에 반영하는 거예요. 그런데 여기서 중요한 오해가 하나 있습니다... |
|
76 | 76 |
|
77 | 77 | <!-- Slide 8 --> |
78 | 78 | <section> |
79 | | - <iframe src="contents/8.html"></iframe> |
| 79 | + <iframe data-src="contents/8.html" data-preload></iframe> |
80 | 80 | <aside class="notes"> |
81 | 81 | 많은 분들이 'Virtual DOM이 빠르니까 쓴다'고 생각하는데, 사실 목적은 성능이 아니라 개발 |
82 | 82 | 경험이에요. 우리가 What만 신경 쓰면 How는 React가 알아서 해주는 거죠! |
|
85 | 85 |
|
86 | 86 | <!-- Slide 9 --> |
87 | 87 | <section> |
88 | | - <iframe src="contents/9.html"></iframe> |
| 88 | + <iframe data-src="contents/9.html" data-preload></iframe> |
89 | 89 | <aside class="notes"> |
90 | 90 | 두 개의 트리를 비교하는 건 원래 엄청 복잡한 문제예요. O(n³) 복잡도라서 노드가 1000개만 되어도 |
91 | 91 | 10억 번 연산을 해야 합니다. 60fps를 유지하려면 16ms 안에 끝내야 하는데, 이건 불가능하죠. React는 |
|
95 | 95 |
|
96 | 96 | <!-- Slide 10 --> |
97 | 97 | <section> |
98 | | - <iframe src="contents/10.html"></iframe> |
| 98 | + <iframe data-src="contents/10.html" data-preload></iframe> |
99 | 99 | <aside class="notes"> |
100 | 100 | React는 두 가지 과감한 가정으로 O(n)을 달성했습니다. 첫째, 타입이 다르면 완전히 다른 UI라고 |
101 | 101 | 가정하고 비교하지 않고 새로 만듭니다. 둘째, key를 통해 요소를 식별합니다. 이 두 가정 덕분에 |
|
105 | 105 |
|
106 | 106 | <!-- Slide 11 --> |
107 | 107 | <section> |
108 | | - <iframe src="contents/11.html"></iframe> |
| 108 | + <iframe data-src="contents/11.html" data-preload></iframe> |
109 | 109 | <aside class="notes"> |
110 | 110 | 이게 바로 우리가 늘 듣는 'key warning'의 이유입니다. index를 key로 쓰면 React가 요소를 제대로 |
111 | 111 | 식별하지 못해요. 새 아이템을 추가했는데 React는 기존 아이템이 바뀐 줄 알고 불필요하게 전부 |
|
115 | 115 |
|
116 | 116 | <!-- Slide 12 --> |
117 | 117 | <section> |
118 | | - <iframe src="contents/12.html"></iframe> |
| 118 | + <iframe data-src="contents/12.html" data-preload></iframe> |
119 | 119 | <aside class="notes"> |
120 | 120 | Diffing 알고리즘의 핵심은 3가지입니다. 같은 레벨끼리만 비교하고, 타입이 같으면 props만 |
121 | 121 | 업데이트하고, 컴포넌트가 같으면 state를 유지합니다. 이 마지막 포인트가 리렌더링 시에도 state가 |
|
125 | 125 |
|
126 | 126 | <!-- Slide 13 --> |
127 | 127 | <section> |
128 | | - <iframe src="contents/13.html"></iframe> |
| 128 | + <iframe data-src="contents/13.html" data-preload></iframe> |
129 | 129 | <aside class="notes"> |
130 | 130 | React는 상태가 바뀌었는지 확인할 때 얕은 비교만 합니다. 참조만 비교하는 거죠. 깊은 비교는 중첩된 |
131 | 131 | 모든 객체를 순회해야 해서 느립니다. 대신 우리가 불변성을 지켜야 하죠! 그리고 여기서 중요한 |
|
137 | 137 |
|
138 | 138 | <!-- Slide 14 --> |
139 | 139 | <section> |
140 | | - <iframe src="contents/14.html"></iframe> |
| 140 | + <iframe data-src="contents/14.html" data-preload></iframe> |
141 | 141 | <aside class="notes"> |
142 | 142 | 이게 바로 우리가 항상 스프레드 연산자를 쓰는 이유입니다. 직접 수정하면 참조가 같아서 React가 |
143 | 143 | 변화를 감지하지 못해요. 새 객체를 만들어야 참조가 바뀌면서 리렌더링이 일어나죠. 복잡하면 Immer |
|
147 | 147 |
|
148 | 148 | <!-- Slide 15 --> |
149 | 149 | <section> |
150 | | - <iframe src="contents/15.html"></iframe> |
| 150 | + <iframe data-src="contents/15.html" data-preload></iframe> |
151 | 151 | <aside class="notes"> |
152 | 152 | Vue나 Angular는 자동으로 변화를 감지해줍니다. 편하죠. 하지만 React는 '명시적'을 선택했어요. 더 |
153 | 153 | 번거롭지만, 코드를 읽었을 때 정확히 무슨 일이 일어나는지 알 수 있다는 장점이 있습니다! |
|
156 | 156 |
|
157 | 157 | <!-- Slide 16 --> |
158 | 158 | <section> |
159 | | - <iframe src="contents/16.html"></iframe> |
| 159 | + <iframe data-src="contents/16.html" data-preload></iframe> |
160 | 160 | <aside class="notes"> |
161 | 161 | React 16 이전에는 Stack Reconciler를 썼는데요. 재귀적으로 모든 작업을 한 번에 처리했습니다. |
162 | 162 | 문제는 중단할 수 없다는 거예요. 대규모 리스트를 렌더링할 때 입력이 먹통되는 경험, 다들 해보셨죠? |
|
166 | 166 |
|
167 | 167 | <!-- Slide 17 --> |
168 | 168 | <section> |
169 | | - <iframe src="contents/17.html"></iframe> |
| 169 | + <iframe data-src="contents/17.html" data-preload></iframe> |
170 | 170 | <aside class="notes"> |
171 | 171 | Fiber는 작업을 작은 단위로 쪼개서, 중요한 것부터 먼저 처리하고, 필요하면 중간에 멈추고 다시 |
172 | 172 | 시작할 수 있습니다. 사용자 입력은 즉시 처리하고, 검색 결과 업데이트 같은 건 뒤로 미룰 수 있는 |
|
176 | 176 |
|
177 | 177 | <!-- Slide 18 --> |
178 | 178 | <section> |
179 | | - <iframe src="contents/18.html"></iframe> |
| 179 | + <iframe data-src="contents/18.html" data-preload></iframe> |
180 | 180 | <aside class="notes"> |
181 | 181 | Fiber는 작업에 우선순위를 매길 수 있습니다. 클릭이나 입력 같은 사용자 인터랙션은 최우선으로 |
182 | 182 | 처리하고, 데이터 페칭이나 로깅 같은 건 나중에 처리하죠. useTransition이나 Suspense 같은 기능도 |
|
186 | 186 |
|
187 | 187 | <!-- Slide 19 --> |
188 | 188 | <section> |
189 | | - <iframe src="contents/19.html"></iframe> |
| 189 | + <iframe data-src="contents/19.html" data-preload></iframe> |
190 | 190 | <aside class="notes"> |
191 | 191 | Fiber는 렌더링을 중단하고 다시 시작할 수 있기 때문에, 컴포넌트 함수가 여러 번 호출될 수 |
192 | 192 | 있습니다. 그래서 반드시 순수 함수로 작성해야 해요. API 호출 같은 부작용은 useEffect에서 처리해야 |
|
196 | 196 |
|
197 | 197 | <!-- Slide 20 --> |
198 | 198 | <section> |
199 | | - <iframe src="contents/20.html"></iframe> |
| 199 | + <iframe data-src="contents/20.html" data-preload></iframe> |
200 | 200 | <aside class="notes"> |
201 | 201 | 오늘 배운 내용을 정리해볼게요. JSX가 JavaScript 객체로 변환되고, 이게 Virtual DOM을 구성하고, |
202 | 202 | Reconciliation으로 효율적으로 비교하고, 얕은 비교로 빠르게 감지하고, Fiber로 우선순위를 |
|
206 | 206 |
|
207 | 207 | <!-- Slide 21 --> |
208 | 208 | <section> |
209 | | - <iframe src="contents/21.html"></iframe> |
| 209 | + <iframe data-src="contents/21.html" data-preload></iframe> |
210 | 210 | <aside class="notes"> |
211 | 211 | 이제 여러분은 React를 더 깊이 이해하게 되었습니다. key warning이 왜 뜨는지, 왜 불변성을 지켜야 |
212 | 212 | 하는지, 언제 최적화를 해야 하는지 이해할 수 있죠. 이 지식은 실무에서 성능 문제를 디버깅하고 더 |
|
216 | 216 |
|
217 | 217 | <!-- Slide 22 --> |
218 | 218 | <section> |
219 | | - <iframe src="contents/22.html"></iframe> |
| 219 | + <iframe data-src="contents/22.html" data-preload></iframe> |
220 | 220 | <aside class="notes"> |
221 | 221 | 더 깊이 공부하고 싶으시면 React 공식 문서와 Lin Clark의 Fiber 설명 영상을 추천드립니다. 여유가 |
222 | 222 | 되시면 React 소스코드를 직접 읽어보거나, 간단한 React를 직접 구현해보는 것도 큰 도움이 될 |
|
226 | 226 |
|
227 | 227 | <!-- Slide 23 --> |
228 | 228 | <section> |
229 | | - <iframe src="contents/23.html"></iframe> |
| 229 | + <iframe data-src="contents/23.html" data-preload></iframe> |
230 | 230 | <aside class="notes"> |
231 | 231 | 발표는 여기까지입니다. 궁금하신 점이나 더 자세히 알고 싶은 부분 있으시면 질문해주세요! |
232 | 232 | </aside> |
233 | 233 | </section> |
234 | 234 |
|
235 | 235 | <!-- Slide 24 --> |
236 | 236 | <section> |
237 | | - <iframe src="contents/24.html"></iframe> |
| 237 | + <iframe data-src="contents/24.html" data-preload></iframe> |
238 | 238 | <aside class="notes"> |
239 | 239 | 끝까지 들어주셔서 감사합니다. 혹시 나중에 더 궁금하신 게 있으시면 블로그나 GitHub로 연락주세요! |
240 | 240 | </aside> |
|
0 commit comments