*JSX(JavaScript XML)
- XML과 비슷한 자바스크립트 확장 문법이다.
- 자바스크립트에서 HTML과 자바스크립트 변수 및 속성 값들을 사용할 수 있게 해준다.
- 리액트 컴포넌트 파일에서 JSX로 코드를 작성하면 babel이 JavaScript로 변환 해준다.
예시 코드)
이미지 출처: 리액트를 다루는 기술
- 테스트 코드는 *Babel을 이용하면 별도의 컴파일 없이 사용할 수 있다.
- 그리고 이 툴들이 ECMAScript6(ES6)를 지원하기 때문에 JSX를 사용시에 ES6도 같이 사용을 많이 한다. (JSX문법 + 자바스크립트 함수 사용 가능)
*Babel: 자바스크립트의 문법을 확장해주는 도구
아직 지원되지 않는 최신 문법이나, 편의상 사용하는등의 자바스크립트 문법들을
정식 자바스크립트 형태로 변환해줌으로써 구형 브라우저같은 환경에서도 제대로 실행할 수 있게 해주는 역할을 함.
먼저, 🔥DOM이란? Document Object Model
DOM은 변화가 일어날 때
1. CSS의 재연산
2. 레이아웃 구성
3. 페이지 리페인트 (페이지를 다시 그리는 것)
의 과정을 거치며 잦은 업데이트가 일어날 경우 성능 저하가 일어날 수 밖에 없다.
자바스크립트에서 EventHandler가 작동시에 src속성을 변경해주고, sum부분을 변경해주고
기록의 Text부분까지 순차적으로 모두 변경해주어야한다.
이에 반해,
React는 {handleRollClick}컴포넌트를 이용하여 컴포넌트 자체를 통으로 렌더링한다.
그럼, 내부 State들을 순차적으로 렌더링하게 되는데, 여기서 통으로 렌더링 해버리게 되면 변경 값이 없는 state들 까지 다 렌더링하게 되어서 오히려 비효율적이라 생각할 수 있다. 그래서 React는 Virtual DOM을 사용해 State의 변경 전, 후 값을 비교하여 변경된 값만 렌더링하여 적용하는 것이다.
->바닐라 자바스크립트 방식의 코드는 이벤트의 발생시에 데이터 변경할 때 예를 들어, body부분과 div부분이 함께 변경된다. 하지만, React에서는 딱 변화가 일어난 State부분만 변경된다.
이러한 Virtual DOM 개념은 React만 사용하진 않고 React와 비슷한 다른 웹기술들은 대부분 Virtual DOM개념을 사용한다.
데이터가 양방향으로 흐르지 않는다.
양방향 데이터 바인딩을 하게 되면 개발 비용은 일시적으로 적다고 느낄 수 있지만,
장기적으로 데이터 흐름을 이해하기 어려워 개발 비용이 증가한다.
그래서
React는 위에서 아래로만 데이터가 흐르고, 아래에서 위로 데이터가 올라갈 수는 없다.
단방향 데이터 흐름: 데이터는 단방향으로 흐르고 데이터 계층이 자기가 영향을 미치는 View 업데이트 완료 후 다음 작업을 진행한다.
큰 특징은 단방향 데이터 흐름(undirectional data flow)이다.
데이터의 흐름은,
디스패처 -> 스토어 -> 뷰 로 흘러가며 뷰에서 입력되는 데이터가 발생하면
액션(Action)을 이용해 디스패처로 향하도록 한다.
정의: UI를 서버에서 렌더링 하는 것.
웹앱이 클라이언트에서만 실행되는 것은 아니다.
클라이언트에서만 렌더링을 하게 되면 `HTML + JavaScript + Data + View' 순으로
진행하는 시간 소요 때문에 초기 구동 속도가 느리다.
React가 빠르다는건 초기 구동 이후이다.
리액트로 만든 SPA는 자바스크립트가 실행되지 않는 환경(검색 엔진 크롤러 봇과 같은 환경-구글, 네이버 등 검색 엔진)에서는 페이지가 제대로 나타나지 않는다 (빈 HTML만 수집).
(React는 JSX문법으로 작성하고 Babel을 통해 자바스크립트 문법으로 변환해준다)
이런 단점을 해결하기 위해 서버 측에서 렌더링(서버 사이드 렌더링)을 지원한다.
서버에서 클라이언트 대신 렌더링을 해주면 검색 엔진이 페이지의 내용을 제대로 수집해 갈 수 있다.
서버에서 렌더링을 해서 내려준 후에 클라이언트에서 다시 한번 렌더링을 하는 이런 방식이 비효율적으로 보일 수 있으나 React는 서버에서 렌더링 된 후 클라이언트에서 한 번 더 렌더링 할 때 바뀌어야할 부분이 있다면 그 부분만 다시 렌더링 하기 때문에 효율적이고 빠르다.
SPA(Single Page Application) 가 인기를 얻으면서 한 페이지에서 재 렌더링 없이 DOM객체, Ajax 데이터 통신, 데이터 바인딩을 할 수 있는 자바스크립트 프레임워크 기술이 발전했다.
그 중심에 Angular와 Backbone등이 있었고 데이터를 받아와 기존 데이터와 비교하여 전체 DOM 객체를 비동기 갱신으로 재 렌더링 없이 사용자 경험을 향상했다.
그런데,
전체 DOM갱신에는 처리 시간이 늦어진다는 문제점이 있었고 여기서 React는 이 부분을
Virtual DOM을 통해 데이터를 비교하여 최소한의 요소만 변경하도록 만들어졌다.
참고
https://blog.gaerae.com/2016/04/hello-react.html
https://lemontia.tistory.com/637
https://brunch.co.kr/@eight-two-five/14
https://react.vlpt.us/basic/04-jsx.html