[꼼꼼한 개발자] 꼼코더
[React] - [처음 만난 리액트] - 13. Elements의 특징 및 렌더링 하기 본문
🧹 두서없이 적는 쉬운 정리
1. Elements는 한번 생성되면 변하지 않는다는 불변성을 가지고 있다.
2. 다른 말로 엘리먼트 생성 후에는 children이나 attributes를 바꿀 수 없다는 말
4. 엘리먼트를 생성한 이후에 실제로 화면에 보여주기 위해서는 렌더링이라는 과정을 거쳐야 한다
5. 리액트로만 만들어진 모든 웹사이트들은 단 하나의 Root DOM Node를 가지게 된다
6. 렌더링을 위해 ReactDOM에 render()라는 함수를 사용
7. 이 함수는 '첫번째 파라미터인 리액트 엘리먼트'를 '두 번째 파라미터인 html 엘리먼트'에 (즉 DOM 엘리먼트) 렌더링 하는 역할
8. 결국 리액트 엘리먼트가 렌더링 되는 과정은 Virtual DOM에서 실제 DOM으로 이동하는 과정
9. 한 번 렌더링된 엘리먼트를 업데이트하려면 새로 만들어야 한다 (새로 만든 것으로 바꿔치기)
10. 최종적으로 리엑트 엘리먼트는 불변성 때문에 엘리먼트를 업데이트하기 위해서는 새로 만들어야 한다
(자세한 내용은 아래 참고)
📖 Elements의 특징
엘리먼트는 굉장히 중요한 특징인 불변성을 가지고 있다.
리액트 Elements는 immutable (im + mutable)란 특징을 갖고 있습니다
mutable 영어 단어는 변할 수 있는 이라는 뜻이고
여기에 부정의 의미를 가진 im을 앞에 붙이면 변경할 수 없는 불변의 라는 뜻을 가진 단어 immutable이 된다.
즉 엘리먼트가 불변성을 갖고 있다는 것은 한번 생성된 엘리먼트는 변하지 않는다는 것이다.
다른 말로 표현하면 엘리먼트 생성 후에는 children이나 attributes를 바꿀 수 없다는 말이다.
근데.. 리액트 엘리먼트는 우리 눈에 보이는 것을 기술하는
엘리먼트가 변할 수 없다면 화면 갱신이 안 되는 것 아닌가?
위에서 중요한 부분은 바로 엘리먼트 생성 후에는이라는 부분이다.
즉 엘리먼트는 다양한 모습으로 존재할 수 있지만 한번 생성된 다음에는 변경 이 불가능하다는 뜻이다.
붕어빵 가게에 가면 붕어빵 틀에 반죽을 넣고 붕어빵이 구워져 나오는데
완성된 붕어빵에 속 내용은 바꿀 수 없는 것과 같은 이치라고 생각하면 된다.
이 그림은 리액트 컴포넌트와 엘리먼트의 관계를 붕어빵 그림으로 나타낸다.
쉽게 말해 [컴포넌트 = 붕어빵 틀, 엘리먼트 = 생성된 붕어빵]
그렇다면 화면에 변경된 엘리먼트들을 보여주기 위해서
기존 엘리먼트를 변경하는 것이 아닌 새로운 엘리먼트를 만들어야 한다.
(새로운 엘리먼트를 만들어 기존 엘리먼트와 바꿔치기하는 것)
앞에서 리액트에 장점 중 하나로 빠른 랜더링 속도가 있다는 것을 언급했다
그리고 이를 위해서 내부적으로 Virtual DOM이라는 것을 사용한다고 했다.
위 개념도를 다시 한번 보도록 하자.
이 그림에서 보이는 것처럼 화면에 새로운 내용을 보여주기 위해
Virtual DOM은 변경된 부분을 계산 Compute Diff 하고 해당 부분만을 다시 랜더링(Re-render)한다.
(동그란 각 원들이 바로 엘리먼트) 빨간색으로 표시된 원들은 변경된 엘리먼트들이다.
엘리먼트는 불변성을 갖고 있기 때문에 화면에 새로운 내용을 보여주기 위해서
새로운 엘리먼트를 만들어 기존 엘리먼트가 연결되어 있는 부분에 바꿔서 달면 된다.
🤺 Elements 렌더링 하기
엘리먼트를 생성한 이후에 실제로 화면에 보여주기 위해서는 렌더링이라는 과정을 거쳐야 한다
자 먼저 간단한 html 코드를 보자 이 html 코드는 'root'라는 아이디를 가진 <div> 태그이다
굉장히 단순하지만 이 코드는 모든 리액트에 필수적으로 들어가는 아주 중요한 코드이다.
실제로 이 <div> 태그 안에 리액트 엘리먼트들이 렌더링 되고 이것을 Root DOM Node라고 부른다.
이 <div> 태그 안에 있는 모든 것이 리액트 DOM에 의해서 관리되기 때문이다.
리액트로만 만들어진 모든 웹사이트들은 단 하나의 Root DOM Node를 가지게 된다
반면 기존에 있던 웹사이트에 추가적으로 리액트를 연동하게 되면
여러 개의 분리된 수많은 Root DOM Node를 가질 수도 있다.
'root' <div>의 실제로 리액트 엘리먼트를 랜더링 하기 위해서는 다음과 같은 코드를 사용한다.
이 코드는 먼저 엘리먼트를 하나 생성하고 생성된 엘리먼트를 'root' <div>에 렌더링 하는 코드이다.
렌더링을 위해 ReactDOM에 render()라는 함수를 사용하게 된다.
이 함수는 '첫 번째 파라미터인 리액트 엘리먼트'를 '두 번째 파라미터인 html 엘리먼트'에 (즉 DOM 엘리먼트) 렌더링 하는 역할을 한다.
여기서 다시 한번 리액터 엘리먼트와 톰 엘리먼트는 다른 개념이라는 것을 유의하자
리엑터 엘리먼트 : 리액트 Virtual DOM 존재하는 것
DOM 엘리먼트 : 실제 브라우저 DOM에 존재하는 것
결국 리액트 엘리먼트가 렌더링 되는 과정은 Virtual DOM에서 실제 DOM으로 이동하는 과정
한 번 렌더링 된 엘리먼트를 업데이트하려면 어떻게 해야 할까?
엘리먼트에 중요한 특징인 불변성은 한번 생성되면 바꿀 수 없다는 뜻이기 때문에
엘리먼트를 업데이트하기 위해서는 다시 생성해야 한다.
🧑🏻💻 예제 코드
이 코드에서는 tick() 이라는 함수를 정의하고 있다.
tick() 함수는 현재 시간을 포함하고 있는 엘리먼트를 생성하여 'root' <div>에렌더링하는 역할을 한다.
그리고 자바스크립트의 setInterval() 함수를 사용해서 tick() 함수를 1초(1000)마다 호출하고 있다.
📺 결과
화면에 새로운 시간이 나온다
tick() 함수가 호출될 때마다 기존 엘리먼트를 변경하는 것이 아니라 새로운 엘리먼트를 생성해서 바꿔치기하는 것.
이 그림처럼 크롬의 개발자 도구를 통해서 보게 되면 갱신되는 부분만 반짝이는 효과가 나타나게 된다.
매초 새로운 엘리먼트가 생성되어 기존 엘리먼트와 교체되면서 내용이 변경되고 변경된 부분에 반짝이는 효과가 나타나는 것이다.
[중요] 리엑트 엘리먼트 불변성 때문에 엘리먼트를 업데이트하기 위해서는 새로 만들어야 한다
위 내용은 '소플' 님의 '처음 만난 리액트' 영상을 참고하여 작성되었습니다.
'React > 처음 만난 리액트' 카테고리의 다른 글
[React] - [처음 만난 리액트] - 15. Props의 특징 및 사용법(JSX, Props 사용예제) (0) | 2023.07.05 |
---|---|
[React] - [처음 만난 리액트] - 14. Components와 Props의 정의(Components란?, Props란?) (0) | 2023.07.04 |
[React] - [처음 만난 리액트] - 12. Elements의 정의와 생김새(리액트 엘리먼트와 DOM 엘리먼트 차이점) (2) | 2023.07.02 |
[React] - [처음 만난 리액트] - 11. JSX 코드 작성해보기 (Book.jsx, Library.jsx) (0) | 2023.07.02 |
[React] - [처음 만난 리액트] - 10. JSX의 장점 및 JSX 사용법 (0) | 2023.07.01 |