18. 전문가를 위한 리액트

chap1 리액트의 탄생

리액트 이전의 기술들

  1. jQuery

    • 이는 부작용이 많음. 왜? -> 코드 어느 곳에서든 페이지구조를 직접적으로 혹은 전역적으로 수정할 수 있음.
    • 외부에서 불러오는 모듈은 물론이고, 원격에서 불러들인 코드에서도 가능함.
    • 페이지 일부를 변경하면 예상하지 못한 방식으로 다른 부분에도 영향을 미쳐, 상호작용이 복잡해지고 동작을 파악하기가 난해해짐.
    • 또한, jQuery에서 사용하는 패턴은, 코드 주변, 즉 코드가 인접한 애플리케이션 상태가 지속적으로 변하기 때문에 이해하고 테스트하기도 어려움.
    • 또한, 브라우저 환경에도 크게 의존함.
  2. Backbone

    • 모델과 뷰를 생성하는 방법을 제공함.
    • 전통적인 MVC 패턴을 해석함.
    • MVC는 하지만 부족한점이 많음.
    • 복잡한 상호작용 및 상태 관리
      • 앱 규모가 커지면서 늘어난 컨트롤러 때문에, 상태 변경과 UI의 다양한 부분에 미치는 영향을 관리하기 어려워짐.
      • MVC 구성요소 간의 경계가 명확하지 않아서 다른 컨트롤러와의 충돌을 일으키기도 함.
    • 양방향 데이터 바인딩
      • 뷰가 모델과 동기화되지 않거나, 모델이 뷰와 동기화되지 않기도 하는 부작용이 발생 할수 있음.
      • 데이터 소유권 문제가 대충 처리되거나, 관심사가 명확하지 않은 경우도 있음.
      • 즉, MVC 의 가장 큰 강점인 관심사분리는 강제성이 없을 때 약점이 되기도함.
      • 리액트는 단방향 데이터 바인딩을 사용함. (이를 통햇거 데이터 흐름의 우선순위를 정하고 강제함)
    • 강한 결합
      • Model, View, Controller 가 강결합 되어있 다른 구성요소에 영향을 주지 않고 독립적으로 하나만 변경하거나 리팩터링하기 어려워짐.
    • 또한 backbon 은 이벤트 중심 아키텍쳐임.
      • 즉, 모델 데이터를 업데이트하면 전체 애플리케이션에서 수많은 이벤트가 발생 할 수 있음. 따라서, 이벤트는 예측하기 어려워서 유지보수에 어려움을 줌.
    • 또한, 뷰 조합성도 부족함.
      • 뷰를 쉽게 중첩 할수있는 기능이 내장되지 않아 복잡한 사용자 인터페이스를 구성하기 어려움.
  3. Knockout

    • 옵저버블과 바인딩을 사용하여, 상태가 변경될 때 마다 옵저버블과 바인딩으로 의존성을 추적함.
    • 반응형 자바스크립트 라이브러리.
      • 반응형은, 관찰 가능한 방식으로 상태 변화에 따라 값을 업데이트하는 것.
      • 현대적으로 구현한건 signal
    • MVVM 디자인패턴 사용.
    • 옵저버블을 명시적으로 구독하고, 변경에 따라 사용자 인터페이스를 업데이트하려면 많은 작업이 필요함. 즉, 보일러플레이트가 많이 필요함.
    • 또한, 뷰모델이 거대해지고 복잡해지면서 리팩터링/최적화가 불확실해짐.
  4. 앵귤러

    • 양방향 데이터바인딩
      • 모델 (기반 데이터)이 변경되면 뷰(UI)도 변경사항을 반영하도록 자동 업데이트 됨. vice versa
      • jQuery에서 개발자가 DOM을 수동으로 조작하여, 데이터의 변경사항을 반영하고, 사용자 입력을 캡쳐하여 데이터 업데이트하는 것과 반대.
    • 모듈식 아키텍쳐
      • 애플리케이션의 구성 요소를 논리적으로 분리할 수 있도록 모듈식 아키텍쳐를 도입함.
      • 모듈은 기능을 캡슐화하여 독립적으로 개발,테스트, 유지 관리가 가능함.
    • 의존성 주입 (DI)
      • 객체가 의존성을 직접 만드는대신, 의존성을 전달받는 디자인 패턴.
      • 모듈과 구성요소를 만들고 관리하는 방식에 큰 영향을 미치고 모듈성과 재사용성을 높임

리액트 등장

플럭스 아키텍쳐

chap2 JSX

내부 동작

chap 3. 가상 DOM

실제 DOM 의 문제점

문서 조각

  1. 일괄 업데이트
    • 문서의 실제 DOM을 여러번 개별적으로 업데이트하는 대신, 문서 조각 내의 모든 변경사항을 일괄적으로 처리함.
    • 다시말해, 문서 조각 내에서 얼마나 많은 엘리먼트나 업데이트를 수행했든, reflow & repaint 는 한번씩만 수행됨.
  2. 메모리 효율성
    • 문서 조각에 추가된 노드는 문서의 실제 DOM에서 제거됨. 이는 문서에서 큰 영역을 재정렬할 때 메모리 사용량을 최적화하는데 일조함.
  3. 중복 렌더링 방지
    • 문서 조각은 활성화된 문서 DOM 트리에 속하지 않으므로, 문서 조각을 변경해도 실제 문서에는 영향을 주지 않으며, 실제 DOM에 추가될 때 까지 스타일과 스크립트가 적용되지 않음.

가상 DOM 작동 방식

chap4. 재조정

일괄 처리

스택 재조정자 (16미만 버전에서 사용)

파이버 재조정자

Chap 5. 자주묻는 질문과 유용한 패턴

1. React.memo 를 사용한 메모화

의견..
리액트 19에서는 자동메모이제이션 기능이 추가됨으로써, 개발자가 이런것들을 조금 덜 신경써도 되어져서 좋은듯. 늘 리액트에서 성능 최적화 등을 고려하며 개발하는게 매우 어렵다고 생각함ㅎㅎ 자식 컴포넌트에 내려지는 콜백인가 아닌가에 따라서, 그리고 그 자식컴포넌트가 메모이제이션을 하고있는가 아닌가에 따라서 부모 컴포넌트에서 콜백에 메모이제이션 등을 추가하는 작업들이 매우 복잡하여 실수 또는 부정확한 최적화만 늘어난 다고 생각함. 이런 것들이 어느정도 리액트 자체에게 위임되어서 다행인듯.

2. Lazy loading

3. useState vs useReducer

4. 다양한 패턴들

... 그냥 패턴 사용의 나열이어서, 생략하고 흥미로웠던것만 가져옴.
훅을 사용하는 경우와, 고차컴포넌트를 사용하는 경우

Chap 6. 서버사이드 리액트

CSR 의 한계

서버렌더링의 장점

그런데, 서버에서 가져온 html 에는 이벤트 핸들러 등이 바인딩되어있지 않은 매마른 상태임. 즉 상호작용할수 있도록 물을 줘야함. 바로바로~ 하이드레이션

하이드레이션

하이드레이션에 대한 비판

다양한 서버사이드 렌더링 api 들