📌 리액트 훅에 대해서 학습을 하는데 사실 앞선 과정에서 리액트 훅을 개인적으로 찾아서 학습한 뒤 사용을 하고 있었기에 조금더 정확히 짚고 가는 계기가 될 것이다.

📗 오늘 학습한 내용

Virtual DOM

  • 가상의 DOM 객체 (추상화된 JavaScript 객체의 형태)
  • React는 실제 DOM 객체에 접근하여 조작하는 대신 가상의 DOM 객체에 접근하여 변화 전과 변화 후를 비교하고 바뀐 부분을 적용한다.

Real DOM (DOM, Document Object Model)

  • 브라우저가 트리 구조로 만든 객체 모델
  • 브라우저가 JavaScript와 같은 스크립팅 언어로 html 태그들에 접근하고 조작할 수 있도록 태그들을 트리 구조로 객체화 시킨 것이다.

DOM의 조작 속도가 느려지는 이유

  • DOM의 조작으로 업데이트 된 요소와 그의 자식 요소들에 의해 DOM 트리르 재구축함으로써 재랜더링 과정을 거쳐 UI를 업데이트 해야한다.
  • 재연산을 해야하기 때문에 속도가 느려진다.
  • 가상 DOM을 사용하면 일반적인 DOM 조작보다 속도가 빠르다.

React Diffing Algorithm

  • 요소 하나하나를 바꾸다보면 수십만번의 비교가 이루어져야하고, 이 작업은 상당히 비싸다. 그래서 리액트에서는 두 개의 트리가 나온다는 점과 모든 개발자들이 key props를 통해 바뀌었다는 것을 명시할 수 있다는 점으로 해당 문제를 해결하기 위해나온 알고리즘이다.

React Diffing Algorithm 동작 원리

  1. 각기 서로 다른 두 요소는 다른 트리를 구축할 것이다.
  2. 개발자는 키 소품을 사용하여 다른 렌더링에서 어떤 자식 요소가 안정적일 수 있는 힌트를 줄 수 있습니다.

React가 DOM 트리를 탐색하는 방법

  • 기존의 가상 DOM 트리와 새롭게 변경된 가상 DOM 트리를 비교할 때, 트리의 레벨 순서대로 순회하는 방식으로 탐색합니다.
  • 너비 우선 탐색(BFS)의 일종이다.

Class Component

  • 복잡해질수록 이해하기 어려워지고, 컴포넌트 사이에서 상태 로직을 재사용하기 어렵다는 단점이있다.
  • React의 클래스 컴포넌트를 사용하기 위해서는 JavaScript의 this 키워드가 어떤 방식으로 동작하는지 알아야하며, 문법을 정확히 알지 못하면 동작 방식 자체를 정확히 이해하기 어렵게 만들었습니다.
  • 위와 같은 문제점을 보완하기 위해 함수 컴포넌트로 이동하기 시작하였지만 상태 값을 사용하거나 최적화할 수 있는 기능들이 미진한 부분을 보완하기 위해 나온 것이 바로 Hook이라는 개념입니다.

Function Component

  • 클래스형 컴포넌트에 비해 훨씬 더 직관적이고, 보기 쉽다는 특징이 있다.
  • 함수형 컴포넌트는 렌더링이되면 함수가 호출되고, 모든 내부 변수가 초기화 된다.

Hook이란?

  • React 16.8에 새로 추가된 기능이다.
  • class를 작성하지 않고도 state와 다른 React의 기능들을 사용할 수 있게 해준다.
  • 함수형 컴포넌트에서 상태 값 및 다른 여러 기능을 사용하기 편리하게 해주는 메소드를 의미한다.

Hook 사용 규칙

  1. 리액트 함수의 최상위에서만 호출해야 한다.
    • 반복문, 조건문, 중첩된 함수 내에서 Hook을 실행하면 동작하지 않을 경우가 있다.
  2. 오직 리액트 함순 내에서만 사용되어야 한다.
    • 함수형 컴포넌트나 커스텀 Hook이 아닌 다른 일반 JavaScript 함수 안에서는 호출해서는 안 된다.

useMemo

  • 특정 값(value)를 재사용하고자 할 때 사용하는 Hook
  • 복잡한 연산의 중복을 피하고 React 앱의 성능을 최적화한다.
  • 렌더링 할 때마다 값이 바뀌는 것이 아니라면 값을 어딘가에 저장 해뒀다가 다시 꺼내서 쓸 수 있게한다. (메모이제이션)
  • Memoization
    • 수행한 연산의 결과값을 메모리에 저장을 해두고, 동일한 입력이 들어오면 재활용하는 프로그래밍 기법
  • 구조
    • 첫 번째 인자 콜백 함수: 콜백함수가 return 하는 값이 useMemo가 return 하는 값이다.
    • 두번째 인자 배열(의존성 배열): 배열안에 요소의 값이 업데이트 될때만 콜백함수가 실행된다. 
      빈 배열일 경우 최초 한 번만 실행된다.
const value = useMemo(() => {
	return calculate();
}, [item]);

useCallback

  • 함수의 재사용을 위해 사용하는 Hook
  • 자식 컴포넌트의 props로 함수를 전달해줄 때 사용하기 좋다.
  • 참조 동등성에 의존한다.
  • 메모이제이션 기법을 사용한 Hook이다.
  • 인자로 전달받은 함수 그 자체를 메모이제이션 한다.
const calculate = useCallback((num) => {
	return num + 1;
}, [item])

📘 추가로 공부할 내용

[udemy] React 완벽 가이드 강의 보기 (매일 조금씩 이라도 꾸준히 듣기)

Study원과 함께 진행중인 프로젝트 구현

  • Authentication

📝 중요한 내용

  • 가상 DOM
  • React Diffing Algorithm
  • 컴포넌트 최적화
  • useMemo
  • useCallback

'Daily > Today I Learned' 카테고리의 다른 글

22.08.01_TIL  (0) 2022.08.01
22.07.28_TIL  (0) 2022.07.28
22.07.26_TIL  (0) 2022.07.26
22.07.25_TIL  (0) 2022.07.25
22.07.22_TIL  (0) 2022.07.22

📌 웹팩은 JavaSrcipt, JSON 문법만을 번들링할 수 있지만 loader를 사용하여 각종 css, jsx 등의 언어와 png, jpb 등의 멀티미디어 파일 또한 번들링을 할 수 있습니다. 오늘은 이러한 사실을 알고 있으므로 리액트를 웹팩을 사용하여 번들링하는 방법에 대해 알아보아야한다.

📗 오늘 학습한 내용

react, react-dom

  • 리액트 컴포넌트와 Hooks, 라이프 사이클에 대한 정보가 모두 들어있는 리액트와 이 리액트 코드를 브라우저에 보여줄 수 있는 react-dom이 필요하다.

babel

  • create-react-app에 포함되어 있는 babel이 jsx를 js로 변경해주어 번들링을 해주었기 때문에 babel은 jsx를 JavaScript로 변경하여 entry에서 불러올 수 잇게 만들어주는 로더이다.

css-loader

  • css 파일을 번들링할 때 사용하는 로더이다.

react-hot-reloader

  • webpack-dev-server처럼 저장할 때 마다 변경사항을 개발 환경에 적용해주는 라이브러리
  • react-hot-reloader는 리액트 상태를 유지시켜준다.

eslint

  • JavaScript로 개발 시 자주 접하는 에러를 방지하기 위한 린터이다.

prettier

  • JavaScript로 개발 시 통일성 있게 코드 형식을 맞출 수 있게 도와주는 툴이다.

📘 추가로 공부할 내용

[udemy] React 완벽 가이드 강의 보기 (매일 조금씩 이라도 꾸준히 듣기)

Study원과 함께 진행중인 프로젝트 구현

  • 회원가입 폼 구현

📝 중요한 내용

  • 바벨

🍀 참고자료

'Daily > Today I Learned' 카테고리의 다른 글

22.07.28_TIL  (0) 2022.07.28
22.07.27_TIL  (0) 2022.07.27
22.07.25_TIL  (0) 2022.07.25
22.07.22_TIL  (0) 2022.07.22
22.07.21_TIL  (0) 2022.07.21

📌 웹팩은 어렵다고 많이 들었는데 어떤 부분에서 어려움이 있는지 자세히 찾아봐야겠다.

📗 오늘 학습한 내용

번들링

  • 사전적 의미: 여러 제품이나, 코드, 프로그램을 묶어서 패키지로 제공하는 행위
  • 개발적 의미: 사용자에게 웹 애플리케이션을 제공하기 위한 파일 묶음

번들링을 사용하지 않을 경우 일어나는 상황

  • 두 개의 js파일에서 같은 변수를 사용하고 있어서 변수 간 충돌이 일어난 상황
  • 딱 한 번 불러오는 프레임워크 코드가 8MB라서, 인터넷 속도가 느린 국가의 모바일 환경에서 사용자가 불편을 호소한 상황
  • 번들 파일 사이즈를 줄이기 위해서 파일의 공백을 모두 지웠는데, 가독성이 너무 떨어져서 코딩하기 어려운 상황
  • 배포 코드가 너무 읽기 쉬워 개발을 할 줄 아는 사용자가 프론트엔드 애플리케이션을 임의로 조작하여 피해가 발생한 상황

웹팩 (Webpack)

  • 여러 개의 파일을 하나의 파일로 합쳐주는 모듈 번들러
    • *모듈번들러: HTML, CSS, JavaScript 등의 자원을 전부 각각의 모듈로 보고 이를 조합해 하나의 묶음으로 번들링(빌드)하는 도구
  • 프론트엔드 애플리케이션 배포를 위해서 가장 많이 사용하는 번들러
  • 프론트엔드 애플리케이션을 대규모 유저에게 제공하기 위해 가장 많이 사용하는 방법
  • 백엔드 개발자도 배포를 위해 많이 사용한다.

Webpack에서의 모듈

  • JavaScript의 모듈에만 국한하지 않는다. HTML, CSS, jpg, png 같은 이미지 파일들도 전부 포함한 포괄적인 개념이다.

빌드와 번들링

  • 빌드: 개발이 완료된 앱을 배포하기 위해 하나의 폴더로 구성하여 준비하는 작업
    • React앱: npm run build를 실행하면 React buid 작업이 진행되고, index.html 파일에 압축되어 배포에 최적화된 상태를 제공
  • 번들링: 묶음의 개념(그룹화), 파일을 묶는 작업 그 자체를 말하며 파일은 의존적 관계에 있는 파일들 그 자체 혹은 내부적으로 포함되어 있는 모듈을 의미

Webpack의 필요성

  • 웹 애플리케이션의 빠른 로딩 속도와 높은 성능을 위해서이다.
  • 각 자원들을 일일히 서버에서 요청하지 않아도 되기 때문에 네트워크 코스트가 획기적으로 줄어든다.

웹팩의 핵심 개념

  • Target
    • target: ["프로젝트 환경", "ECMAScript 버전"]
  • Entry
    • 웹팩이 내부의 디펜던시 그래프를 생성하기 위해 사용해야 하는 모듈
    • 직간접적으로 의존하는 다른 모듈과 라이브러리를 찾아낼 수 있다.
  • Output
    • 생성된 번들을 내보낼 위치와 이 파일의 이름을 지정하는 방법을 webpack에 알려주는 역할
  • Loaders
    • Webpack은 JavaScript와 JSON 파일만 이해하지만 로더를 사용하면 다른 유형의 파일을 처리하거나, 유효한 모듈로 변환해 애플리케이션에 사용하거나 디펜던시 그래프에 추가할 수 있다.
    • test: 변환이 필요한 파일들을 식별하기 위한 속성 (필수)
    • use: 변환을 수행하는데 사용되는 로더를 가리키는 속성 (필수)
    • exclude: 바벨로 컴파일하지 않을 파일이나 폴더를 지정
  • Plugins
    • 번들을 최적화하거나 에셋을 관리하고, 환경변수 주입 등의 광범위한 작업을 수행할 수 있게 된다.
  • Optimization(최적화)
    • Webpack 버전 4부터 실행
    • minimize: TerserPlugin, optimization.minimize에 명시된 플러그인으로 번들파일을 최소화(압축)시키는 작업 여부를 결정한다.
    • minimizer: default minimizer을 커스텀돈 TerserPlugin 인스턴스를 제공해서 재정의 할 수 있다.
  • Mode
    • webpack에 내장된 최적화 기능을 사용할 수 있다.
    • development: 모듈과 청크에 유용한 이름을 사용할 수 있다.
    • production: 모듈과 청크, FlagDependencyUsagePlugin, FlagIncludedChunksPlugin, ModuleConcatenationPlugin, NoEmitOnErrorsPlugin, TerserPlugin 등에 대해 결정적 망글이름(mangled name)을 사용할 수 있습니다.
    • none: 기본 최적화 옵션에서 제외한다.
  • Browser Compatibility

📘 추가로 공부할 내용

[udemy] React 완벽 가이드 강의 보기 (매일 조금씩 이라도 꾸준히 듣기)

Study원과 함께 진행중인 프로젝트 구현

  • 회원가입 폼 구현

📝 중요한 내용

  • 웹팩이란?
  • 웹팩을 사용하는 이유
  • 웹팩 사용법
  • 번들링
  • 웹팩의 개념

🍀 참고자료

'Daily > Today I Learned' 카테고리의 다른 글

22.07.27_TIL  (0) 2022.07.27
22.07.26_TIL  (0) 2022.07.26
22.07.22_TIL  (0) 2022.07.22
22.07.21_TIL  (0) 2022.07.21
22.07.19_TIL  (0) 2022.07.19

React 프로젝트 구성 #1 (프로젝트 생성)

Firebase를 사용하여 React 프로젝트에서 Firestore를 사용할 수 있도록 작업을 시작해보겠습니다.

1. Firebase 로그인 및 콘솔로 이동

구글 계정을 생성후 firebase.google.com 링크에 접속하여 우측 상단에 있는 '콘솔로 이동'을 클릭하여 Firebase 프로젝트를 생성하러 이동합니다.

2. 프로젝트 생성

콘솔로 이동하게 되면 중앙에 프로젝트 추가 버튼을 클릭해줍니다.

 

프로젝트의 이름을 지정합니다.

애널리틱스를 설정합니다.

*애널리틱스: 무제한 무료 분석 솔루션인 Google 애널리틱스를 사용하면 Firebase Crashlytics, 클라우드 메시징, 인앱 메시지, 원격 구성, A/B 테스팅, Cloud Functions에서 타겟팅, 보고 등을 이용할 수 있습니다.

애널리틱스 계정을 Default로 설정하고 프로젝트 만들기를 클릭합니다.

3. 웹 앱에 firebase 추가하기

위의 과정을 진행하셨다면 해당 프로젝트 페이지로 이동이됩니다.

이동 후 가운데 IOS, Android, web 중 시작하려는 프로젝트의 유형을 지정할 수 있습니다.

저는 React로 웹 프로젝트를 작성할 것이기 때문에 웹 </>을 클릭하여 주겠습니다.

클릭을 하게 되면 아래와 같은 화면이 나오게 되면 생성하게 될 앱의 이름을 등록하여 프로젝트에서 사용할 수 있는 API키를 생성하여 줍니다.

앱 등록을 정상적으로 클릭하셨다면 Firebase SDK를 설치하는 코드와 API Key가 생성되게 됩니다.

이번글에서는  Firebase의 가장 기초적인 프로젝트 생성까지 진행을 했습니다.

다음 글에서는 React에 firebase 모듈을 설치하여 SDK(API Key)를 지정하는 방법까지 진행하겠습니다.

'Coding > Firebase' 카테고리의 다른 글

[Firebase] Firebase?  (0) 2022.07.24

Firebase?

모바일 및 웹 애플리케이션을 만들기 위해 개발된 플랫폼입니다.

Firebase로 플랫폼을 구축 시 자동적으로 서버를 구축해주어 리눅스의 명령어를 알 필요가 없으며, 인증, 데이터베이스, 스토리지, API 등을 구성하는데 조금 더 간편하게 작업을 할 수 있도록 도와줍니다. 이를 통해서 적은 비용으로 좋은 앱을 만들 수 잇습니다.

기능

기본적으로 가장 많이 사용하는 기능만 적어보도록 하겠습니디ㅏ.

Authentication

  • 계정 기능을 쉽게 만들 수 있게 해주는 API입니다.
  • SNS 로그인 기능 또한 구현할 수 있습니다.

Cloud Firestore

  • SQL 언어를 사용하지 않고, 클라우드에 데이터를 저장하여 사용할 수 있습니다.

실시간 데이터베이스

  • 사용자 기반 보안으로 온/오프라인에서 실시간에 가깝게 JSON 데이터를 저장하고 사용자간에 동기화하여 서버리스 앱을 빌드합니다.

Cloud Messaging

  • 플랫폼 전체에서 무료로 서버와 기기 간에 푸스 메시지를 안정적으로 주고 받을 수 있게해줍니다.

Hosting

  • 웹 사이트를 간편하게 배포하게 해줍니다.

Cloud Storage

  • 사용자의 콘텐츠(사진, 동영상 등)을 저장하여 사용할 수 있습니다.

참고자료
Firebase 공식문서

'Coding > Firebase' 카테고리의 다른 글

[Firebase] React 프로젝트 구성 #1  (0) 2022.07.24

📌 어제 한 미디어 쿼리는 재미있었다. 오늘은 웹 페이지에 동적인 효과를 가져올 수 있는 애니메이션 효과에 대해서 학습을 한다. 오늘도 어제와 같이 재미있는 시간이 되었으면 좋겠다.

📗 오늘 학습한 내용

CSS 애니메이션

  • @keyframes
    • CSS로 키프레임 블록을 만든다
@keyframes 애니메이션이름{
    0% {	/* from으로 작성가능 */
        CSS속성: 속성값;
        transform: rotate(0deg)
    }
    50% {  
        CSS속성: 속성값;
        transform: rotate(180deg)
    }
    100% {	/* to으로 작성가능 */
        CSS속성: 속성값;
        transform: rotate(360deg)
    }
}

/* 시작 시점에서 0도, 50프로 시점에서 180도, 완료시점에서 360도 회전시킴*/

애니메이션 속성

  • animation: 띄어쓰기로 속성 나열 가능
    • animation-name: 애니메이션의 중간 상태를 지정하는 이름.
#logo{
    animation: lotate;
    animation-name: lotate;
    /* 둘 다 사용가능 */
}
  • animation-duration: 한 싸이크르이 애니메이션이 재생될 시간 지정
#logo{
    animation: lotate 3s;
    /* =================== */
    animation-name: lotate;
    animation-duration: 3s;
}
  • animation-delay: 애니메이션의 시작을 지연시킬 시간 지정
#logo{
    animation-name: lotate;
    animation-duration: 3s;
    animation-delay: 3s;
}
  • animation-direction: 애니메이션 재생 방향을 지정
    • normal: 기본값 (재생 종료 후 다시 재생)
    • reverse: 역방향 재생
    • alternate: 순반향부터 역방향을 번갈아가며 재생
    • alternate-reverse: 역방향부터 순반향을 번갈아가며 재생
#logo{
    animation-name: lotate;
    animation-duration: 3s;
    animation-direction: arternate;
}
  • animation-iteration-count: 애니메이션이 몇 번 반복될지 지정
#logo{
    animation-name: lotate;
    animation-duration: 3s;
    animation-iteration-count: 3;
    /* 애니메이션 3회 반복 */
}
  • animation-play-state: 애니메이션의 재생 상태(일시정지, 재시작)
#logo{
    animation-name: lotate;
    animation-duration: 3s;
    animation-play-state: pause;
}
  • animation-timing-function: 중간 상태들의 전환을 어떤 시간간격으로 진행할지 지정
    • linear: 일정한 간격
    • ease: 기본값
    • ease-in
    • ease-out
    • ease-in-out
  • animation-fill-mode: 애니메이션의 재생 전 후의 상태 지정
    • none: 기본값
    • forwards: 마지막 키프레임 스타일 유지
    • backwards: 첫 번째 키프레임 스타일 유지
    • both: 재생 전 - 첫 번째 키프레임 스타일, 재생 후 - 마지막 키프레임 스타일 유지

Canvas

  • 다양한 그래픽 요소를 만들기 위해서 사용한다.
  • 단순한 도형 그리기, 데이터 시각화, 애니메이션, 웹 게임 등에 사용하여 다양한 콘텐츠를 만들어 낼 수 있다.
<canvas id="canvas">
	캔버스를 지원하지 않는 브라우저에서는 캔버스 대신 태그 사이 내용 표시
</canvas>
  • 캔버스 크기 지정 (기본크기 300px * 150px)
<canvas id="canvas" width="500" height="500"></canvas>

<canvas id="canvas" width="50vw" height="40vh"></canvas>

캔버스로 사각형 그리기

  • 색상
    • ctx.fillStyle = 'blue'
    • ctx.fillRect = (10, 10, 100, 50)
    • ctx.lineWitdth = 5;
      ctx.strokeStyle = "black";
    • ctx.strokeRect(10, 10, 100, 50)
  • 지우기
    • ctx.clearRect(20, 20, 80, 30)

📘 추가로 공부할 내용

[udemy] React 완벽 가이드 강의 보기 (매일 조금씩 이라도 꾸준히 듣기)

Study원과 함께 진행중인 프로젝트 구현

  • 로그인 폼 구현

📝 중요한 내용

  • CSS 애니메이션 사용법
  • 캔버스 사용법

'Daily > Today I Learned' 카테고리의 다른 글

22.07.26_TIL  (0) 2022.07.26
22.07.25_TIL  (0) 2022.07.25
22.07.21_TIL  (0) 2022.07.21
22.07.19_TIL  (0) 2022.07.19
22.07.18_TIL  (0) 2022.07.18

+ Recent posts