SPA와 MPA Multipage → SPA란? 상태관리 → 어떠한 상태에 의해서 화면의 변경을 모니터링 뷰 모델 바인딩 화면을 어떻게 작게 나눌까, 재사용할까. 변동사항을 탐지하고 리렌더링 변경사항을 탐지하기 위해서는 변경사항과 기존을 비교 diff단계까지도 실제 DOM에서는 따로 갱신이 없고 virtual DOM에서 최소한의 변동 사항을 반영해서 바꿈 → DOM의 접근을 최소화함 가상DOM → DOM을 흉내낸 최소한의 객체로 트리구조로 되어있음

setCount → count값 바꾸는 함수 useState로 정의된 값이 count고 count가 바뀌게 되면

상태관리에서 useState에서 setStat가 호출됐을 때 notify가 호출되고 이를 감지하여 바뀌는 형태

CreateElement의 역할과 동작 원리

JSX를 변환하는 과정에서 파싱(토크나이징 → 렉서 → 파서)

createElement 함수의 역할

  • DOM노드 생성 및 관리
    • 주어진 태그, 속성, 자식 요소들을 조합하여 새로운 DOM 노드 또는 가상 DOM 노드 생성
  • 컴포넌트 구조화
    • 다양한 컴포넌트를 일관된 인터페이스로 제공

createElement함수의 동작 방식

  • 노드 타입 확인
  • 속성 처리
  • 자식 노드 처리
  • vitual DOM 객체 반환

createElement 함수의 최적화

동기적으로 동작할 경우 싱글 스레드인 nodejs가 동기적으로 하는 과정에서 끊기는 현상이 발생할 수 있음 작업을 분할해서 다음 작업이 들어올 여유를 줌. setTimeout을 통해 비동기적으로 처리 리액트는 바닐라보다 느리다

  • 동일한 입력이 오면 또 동일한 Virtual DOM 객체를 반환?
  • 절대 변경이 안되는 노드도 가상 DOM에 있어야 하나?
  • list의 변화를 쉽게 파악하는 방법

Virtual DOM과 Diff 알고리즘

리액트에서는 Virtual DOM 용어를 자체를 잘 안씀 React native도 있고 여러 가지가 있기 때문에 DOM이라는 표현을 자제하고 있음

Virtual DOM을 사용하는 이유

  • DOM 조작의 비용
    • 프론트에서 DOM 조작의 비용이 가장 느림
    • 브라우저의 렌더링 엔진에서 많은 리소스를 소비
    • 페이지 전체를 새로 그리는 데 많은 시간이 소요될 수 있음(첫 페이지에 대한 로딩 문제)

Diff 알고리즘의 동작 원리

두 개의 Virtual DOM 트리 간의 변화를 찾는 과정에서 노드의 타입과 속성을 비교 그 결과 React는 DOM을 효율적으로 갱신

  1. 노드 타입 비교
    1. 노드의 타입이 다르면 해당 노드를 완전히 교체함
  2. 속성(props) 비교
    1. 노드의 타입이 동일한 경우, 그 노드의 속성을 비교하여 달라진 부분만 수정함
  3. 자식 노드 비교
    1. 자식 노드를 탐색?
    2. 리스트 노드를 쉽게 비교하는 방법?

VDOM 업데이트 절차

  • 새로운 Virtual DOM 생성
  • 기존 Vitual DOM과 비교
  • 차이점을 기반으로 실제 DOM 업데이트
    • DOM API를 통한 업데이트
  • 현재 Virtual DOM을 새로운 DOM으로 교체
    • 가상DOM을 쓰는 이유 → DOM조작의 최소화

비교와 동시에 업데이트

  • 방법: 변경 사항을 감지할 때마다 실제 DOM을 업데이트
  • 장점 : 간단하고 구현이 쉬우며 바로 업데이트되므로 빠르게 반응하는 것처럼 보임
  • 변경 사항이 많으면 성능 저하

배치 처리

  • 변경 사항을 모아서 한번에 실제 DOM에 반영
  • DOM 조작
    • DOM 조작을 최소화할 수 있어 성능 향상
    • 리플로우와 리페인트를 줄여 브라우정 성능에 유리

리스트 항목과 key의 diffing

Virtual DOM을 사용하지 않는 방식

컴파일 단계에서 상태가 변경될 때 어떤 DOM 조작이 필요할지 미리 결정하고, 그에 맞춰 최적화된 JS 코드를 생성

함수형 프로그래밍 패러다임

  • 순수 함수(pure-function)
  • 불변성(immutability)
  • 고차함수(higher-order function)
    • 함수를 인자로 받거나 함수를 반환

옵저버 패턴

뷰 간의 의존을 하게 되면 서로 계속해서 상태 관리를 해야 하기 때문에 얽히게 되는 구조가 될 수밖에 없음

Proxy

const target = {
  message: "Hello, World!"
};
 
const handler = {
  get: function(target, prop) {
    return prop in target ? target[prop] : "Property does not exist";
  },
  set: function(target, prop, value) {
    console.log(`Setting value ${value} to ${prop}`);
    target[prop] = value;
  }
};
 
const proxy = new Proxy(target, handler);
 
// 접근 시
console.log(proxy.message); // "Hello, World!"
console.log(proxy.nonexistent); // "Property does not exist"
 
// 값 설정 시
proxy.message = "Hello, Proxy!"; // "Setting value Hello, Proxy! to message"
console.log(proxy.message); // "Hello, Proxy!"

나 → target가 관계가 마치 중간 매개체(proxy)를 거쳐 target으로 이동하는 듯함

사용자가 입력한 값을 모델의 속성에 반영 → 모델이 바뀔 경우 뷰는 리렌더링 → 뷰가 바뀔 경우 렌더링하는 코드를 proxy를 활용해서 target이라는 부분이 모델이 될 수도 있고 뷰를

Object.defineProperty 배열이나

요청과 응답 사이의 과정 → 미들웨어 express 미들웨어의 특징 미들웨어의 순서를 req,res,next라는 표현을 통해 지정할 수 있음. 어떤 주소로 들어왔는지에 대해 제공하는 리소스 → api api들을 조금 더 의미있게 정의할 필요가 있음 api의 구성은 reasonable하게 짜야한다 api ? rest-ful하게 표현할 수 있는명확한 정의 서버측의 동작을 http method로 표현 & resources(Path) method의 이름과 resouce의 이름을 보았을 떄 어떤 응답이 나올지에 대해 시각적으로 충분히 이해할 수 있는 api가 restful한 api임. 정반대 → graphQL(추상화 해서 보냄) http 메서드의 내용과 요청 작업의 주소 부분을 봤을 때 명시적으로 원하는 작업이 무엇인지를 잘 표현하자!

db선택에서의 자유도 RDB의 대표주자가 아닌 다른 db의 대표주자들 써보기 NOSQL, DynamoDB 간단한 db의 경우 서버리스로