jtwjs Dev Wiki
  • DEV_ROAD
    • 💪🏻 생존하기
    • Week 1
      • 개발 환경 세팅
      • 타입스크립트
      • 리엑트
      • Testing Library
      • Parcel & ESLint
    • Week 2
      • JSX
      • Virtual DOM
    • Week 3
      • React Component
      • React State
    • Week 4
      • Express
      • Fetch API & CORS
      • React Hook
      • useRef & Custom Hook
    • Week 5
      • TDD
      • React Testing Library
      • MSW
      • Playwrite
      • Snapshot
    • Week 6
      • Separtion of Concerns
      • Principle
      • DI, (Dependency Injection)
      • Reflect-metadata
      • TSyringe
      • External Store
      • Follow Redux
      • usestore-ts
      • useSyncExternalStore
    • Week 7
      • Routing
      • Routes
      • Router
      • Navigation
    • Week 8
      • Design System
      • Style Basics
      • CSS-in-JS
      • Styled-Components
      • Global Style & Theme
    • Week 9
      • 개발하기 전 준비
      • 상품 목록 페이지
      • 상품 상세 페이지
      • 장바구니 페이지
    • Week 10
      • 로그인
      • 로그아웃
      • 회원가입
      • 주문 목록 & 주문 상세
    • Week 11
      • 배송 정보 입력
      • 포트원 결제 요청
      • 배송 및 결제 정보 전달
    • Week 12
      • 관리자 웹사이트개발시작
  • DEV_NOTE
    • TypeScript
      • 기본적 문법
        • Enum
        • 다형성
          • Untitled
        • 구조적 타이핑
        • 제너릭 타입
        • 컨디셔널 타입
        • 함수 메서드 타이핑
        • infer로 타입스크립트의 추론 직접 활용
        • 재귀 타입
        • 템플릿 리터럴 타입
        • 추가적인 타입 검사 satisfies 연산자
        • 타입스크립트 건망증
        • 원시 자료형에도 브랜딩 기법 사용 가능
        • 타입 좁히기
        • 유용한 타입 만들기
        • 데코레이터 함수
        • 앰비언트 선언도 선언 병합이 된다.
        • 앰비언트 선언도 선언병합이 된다.
    • Testing
      • Unit Testing
      • 단위 테스트의 두 분파
      • 좋은 단위 테스트를 구성하는 4대 요소
      • 테스트 대역과 식별할 수 있는 동작
      • 단위 테스트 스타일
      • 가치 있는 단위 테스트를 위한 리팩토링
      • 통합 테스트
      • Cross Browsing Testing
      • 기능 테스트 종류
      • React Testing Pattern
      • 프론트엔드 테스트 입문
        • 테스트 범위
        • 단위 테스트 검증
        • Mock
        • UI 컴포넌트 테스트
        • 테스트 커버리지
        • 웹 통합 테스트
        • MSW
        • 스토리북
        • 시각적 회귀 테스트
        • E2E 테스트
        • Github Actions 설정
        • 깃허브 액션에서 E2E
      • 시프트 레프트
        • 테스트 기본중의 기본
        • 단위 테스트
        • 코드 복잡도
        • 리팩터링
        • 코드 리뷰
        • 통합 테스트 패턴
        • 시스템 테스트의 자동화
        • 탐색적 테스트
      • Test Tip
      • vitest
      • playwright
      • Test Data Generator
      • MSW
    • Algorithm
      • coding test
      • Data Structure
    • Next.js
      • Data Fetching
      • Hydration
      • Next 13
      • Optimization
      • Next 15
    • Tailwind
      • Tailwind CSS
      • Theme
      • Directives
      • Tool
      • Design System
    • Storybook
      • Storybook
      • CSF3
      • CDD
      • Headless Component
    • Funtional Programming
      • 함수형 프로그래밍
      • 참조 투명성
      • 부수효과
      • 함수 합성
      • 제너릭 타입 활용하기
      • 암묵적 입출력
      • 액션과 계산, 데이터
      • 계층형 설계
      • 호출 그래프
      • 함수형 설계
      • 불변성
      • 일급 함수
      • 함수형 도구
    • Git
      • Github Actions
      • Conflict
      • Branch 전략
    • Contents Format
      • Audio
    • 3D Graphic
      • 3D keyword
      • Three.js
      • Geometry
      • Material
      • Light
      • Camera
      • Decal
      • Rotation
      • Text
      • Shadow
      • Fog
      • Post Processing
      • Animation
      • Math
        • Vector Space
        • 벡터의 연산
        • 회전 계산
      • 3D 컨텐츠가 만들어지는 과정
      • R3F
      • Env
      • Scene
      • Transform
      • R3F
      • Interaction & Raycast
      • Rendering Algorithnm
      • Blender
      • Blender
    • Accessibility
      • 접근성이란
    • Interactive Web
      • Parallax
      • Canvas
      • requestAnimationFrame
      • Effect
      • HSL
      • React.js + Canvas
      • Matter.js
    • AWS
      • DevOps
      • Amplify
      • S3
      • 클라우드 컴퓨팅
        • 온프레미스와 클라우드
        • 클라우드 도입효과
        • 클라우드 컴퓨팅의 범위
        • 컴퓨팅 옵션
          • EC2 - Virtual Machin
          • ECS, EKS - Container
          • Lambda - Serverless
        • 네트워크 가상화
        • 스토리지
        • 데이터베이스
        • 데이터 수집
        • 머신 러닝 영역
        • IoT 영역
        • 블록체인 영역
      • 클라우드 아키텍처 설계
    • Network
      • Web Server & WAS
    • System Design
      • System Design
      • Component
      • 의존성을 배제한 개발
      • Error Handling
      • Architecture
        • 모노로틱 아키텍처
        • Clean Architecture
        • Layered Architecture
        • 이벤트 기반 아키텍처
      • 상황을 파악하는 메타인지
      • 중복 문제 해결하기
      • Monorepo Arhitecture
        • 모노레포 운영과 트러블슈팅
        • Module Federation
      • 코드 병목지점
      • API 대응
      • 공통 코드
      • Infra 구축
      • 모듈 기반의 개발 방식
      • Design System
        • 최소 수준의 아키텍처 설정
        • 더 효율적인 디자인시스템 만들기
        • 디자인 시스템과 UI 라이브러리 목적
        • 디자인 토큰
      • 효율적인 업무
        • 업무 프로세스 병목 파악
      • Clean Code
      • Design Pattern
        • CQRS Pattern
        • Strangler Fig Pattern
        • 데코레이터 패턴
        • 커맨드 패턴
        • 전략 패턴
        • 옵저버 패턴
      • A/B 테스팅
      • 대규모 리엑트 웹앱 개발
        • 복잡성 관리
        • 모듈성
        • 성능
        • 디자인 시스템
        • 데이터 패칭
        • 상태 관리
        • 국제화
        • 코드 조직화하기
        • 개인화 A/B 테스팅
        • 확장 가능한 웹 아키텍처
        • 테스팅
        • 툴링
        • 기술적 마이그레이션
        • 타입스크립트
        • 라우팅
        • 사용자 중심 API 디자인
        • 리액트 미래
    • Performance
      • React DevTools
      • Component 최적화
      • Page Load
      • API
    • MFA
      • MSA
      • MFA 도입하기
      • Monorepo
        • Monorepo Tool
        • Yarn Berry Workspace
        • Turborepo
      • MFA Composition
      • SPA 통합
      • Design System
      • Package Manager
        • Yarn
        • pnpm
      • Transpiler & Bundler
        • Babel
        • Rollup
        • esbuild
        • swc
        • Webpack
        • Vite
      • 분해와 통합을 위한 여러 기술 비교
    • State Management
      • Zustand
    • React v18
      • Automatic batching
      • Suspense
      • Transition
    • SEO
      • Search Engine Optimization
      • Open Graph Element
      • Metadata
    • FE Develop
      • Scrubbing
      • Clipboard
    • Refactoring
      • 리팩토링 깊게 들여다보기
      • 긴 코드 조각내기
      • 타입 코드 처리하기
      • 유사한 코드 융합하기
      • 데이터 보호
      • 코드 추가 및 제거
    • OAuth 2.0
    • Analytics
      • Mixpanel
    • ETC
      • VSCode
    • React Hook In Action
      • useContext & Provider
      • 커스텀 훅
      • 코드 분할하기 with Suspense, lazy
      • Suspense와 이미지 적재하기
      • useTransition, uesDeferredValue
      • SuspenseList
Powered by GitBook
On this page
  • 강의 요약
  • 리액트로 사고하기
  • ReacfDOM.createRoot
  • 리엑트 컴포넌트는 언제 리렌더링이 될까?
  • 리액트는 라이브러리? 프레임워크?
  • 제어의 역전(Inversion of Control, IoC)
  • 키워드
  • React란?
  • React 컴포넌트
  • IoC(Inversion of Control)
  • Library vs Framework
  1. DEV_ROAD
  2. Week 1

리엑트

강의 요약

리액트로 사고하기

상태를 골라 내는게 핵심

상태를 골라내는 방법

  • 시간이 지나도 변하지 않는 값은 상태가 아니다.

  • props로 전달된 데이터는 상태가 아니다.

  • 컴포넌트의 기존 상태 및 props에서 계산될 수 있는 값은 상태가 아니다

ReacfDOM.createRoot

리엑트가 만든 가상 돔을 실제 돔에 안착시키는 함수!

  • createRoot(domNode, options?)는 브라우저 DOM 요소 내부에 콘텐츠를 표시하기 위한 React 루트를 생성한다

  • 여러개의 Root를 만들거나, 여러번 렌더 해도 된다.

import ReactDOM from 'react-dom/client';

import App from './App';
import Demo from './Demo';

const main = () => {
  const element = document.querySelector('#root');
  const ohterElement = document.querySelector('#other-root');

  if (!element || !ohterElement) {
    return;
  }

  const root = ReactDOM.createRoot(element);
  const otherRoot = ReactDOM.createRoot(ohterElement);

  root.render(<App />);

  let count = 0;
  // 여러 Root 생성 가능
  otherRoot.render(<Demo count={count} />);

  setInterval(() => {
    count += 1;
    // 여러번 렌더 가능
    otherRoot.render(<Demo count={count} />);
  });
};

main();

Root 내장 메소드

createRoot는 render 및 unmount라는 두 가지 메서드가 있는 객체를 반환합니다.

export interface Root {
  /* 내부적으로 리엑트가 만든 가상돔 객체를 이전 가상돔 객체와 비교해서 다른 부분만 실제 돔에 반영 */
  render(children: React.ReactNode): void;
  /* */
  unmount(): void;
}

리엑트 컴포넌트는 언제 리렌더링이 될까?

  • 상태 또는 props가 변경이 될 때

  • 부모 컴포넌트가 리렌더링이 되면 자식 컴포넌트도 리렌더링이 된다.

리액트는 라이브러리? 프레임워크?

React 개발자의 답변은 "It's both"

제어의 역전(Inversion of Control, IoC)

'Don't call us, we'll call you' (우리한테 연락하지 마세요. 우리가 당신에게 연락할게요.)

  • 프레임워크의 주요한 특징

  • 기존의 모든 제어를 클라이언트 코드가 가지도록 구현 하던 것에서 기존 구조적 설계와 비교해 프레임워크(Container)가 제어를 나누어 가져가게되어 의존 관계가 방향이 달라지게 되는 것을 제어가 반전,역전 되었다 라고 한다.

  • React는 IoC를 통해 상태와 업데이트가 얽힌 복잡한 상황을 간단히 선언형 UI로 구성하는 혜택을 누린다

선언형 이란?

프로그램이 어떤 방법으로 해야 하는지를 나타내기보다 무엇과 같은지를 설명하는 경우에 선언형이라고 한다

즉, 값이 무엇이 되어야 하는가? 라는 선언전인 사고를 의미한다.

키워드

React란?

가상 돔(Virtual DOM)으로 DOM이 가지고 있는 문제점을 해결하여 UI 개발을 쉽게 도와주는 Library

DOM이 가진 문제점이 뭐야?

  • DOM API는 기능이 많고 복잡한 구조를 가지고 있어서 사용하기 어렵고 이해하기 어렵다.

  • DOM을 안쓰면 HTML을 조작할 수 없다. 즉, DOM을 써야만 UI 개발을 할 수 있다.

// DOM API로 자바스크립트를 통해 HTML을 조작하는 것은 구조를 파악하가 어렵다.
const todoContainer = document.createElement('li');
const todoItem = document.createElement('div');

todoContainer.classList.add('list-group-item');
todoContainer.appendChild(todoItem);

그래서 React는 DOM을 어떻게 해결했는가?

  • 사용자인 개발자에게 다루기 어려운 DOM을 쓰게 하지말고 친숙한 HTML 마크업 문법을 통해 UI를 개발하도록 제공

  • 리엑트는 마크업 구조인 jsx 문법을 제공하며 사용자에게 쉬운 구조(HTML) -> 어려운 구조(DOM API)로 변환하는 트랜스파일링을 필요로 한다.

다루기 까다로운 무언가가 있다면 다루기 쉬운 포맷으로 바꿔서 그 쉬운 포맷으로 다뤄보자는 아이디어

React 컴포넌트

IoC(Inversion of Control)

제어 반전, 제어의 반전, 역제어는 프로그래머가 작성한 프로그램이 재사용 라이브러리의 흐름 제어를 받게 되는 소프트웨어 디자인 패턴

전통적인 프로그래밍에서 흐름은 프로그래머가 작성한 프로그램이 외부 라이브러리의 코드를 호출해 이용합니다.

하지만 제어 반전이 적용된 구조에서는 외부 라이브러리의 코드가 프로그래머가 작성한 코드를 호출합니다.

IoC Container

IoC (Inversion of Control) 를 구현하는 프레임워크로 객체를 관리하고, 객체의 생성을 책임지고, 의존성을 관리하는 컨테이너 입니다.

  • 모든 의존성을 컨테이터(Container)를 통해서 받아오게 되니 실수로 서로 다르게 구현 될 일이 없다.

의존성 주입(Dependency Injection, DI)

외부로부터 전달받는 것을 의존성 주입이라 한다.

Ioc의 목적

  • 작업을 구현하는 방식과 작업 수행 자체를 분리

  • 모듈을 제작할 때, 모듈과 외부 프로그램의 결합에 대해 고민할 필요 없이 모듈의 목적에 집중할 수 있다..

  • 다른 시스템이 어떻게 동작할지에 대해 고민할 필요 없이, 미리 정해진 협약대로만 동작하게 하면 된다.

  • 모듈을 바꾸어도 다른 시스템에 부작용을 일으키지 않는다.

Library vs Framework

Previous타입스크립트NextTesting Library

Last updated 1 year ago

React는 언제 다시 리렌더링이 될까요?
왜 리액트에서 리렌더링이 발생하는가
React 렌더링 동작 완벽 가이드
react 및 redux의 IoC 와 DI
제어의 역전이란?