과제 - React Hooks 적용하기
1.Hook의 사용법을 익히며 직접 앱을 최적화하고 명료하게 만들 수 있습니다.
2.React Suspense를 직접 Route에 적용해 볼 수 있습니다.

1.Hook(useState, useEffect, CustomHook, Lazy, Suspense 등)를 사용하여 앱을 최적화하고 잘 작동하게 할 수 있었다.
chrome-extension://nlipoenfbbikpbjkfpfillcgkoblgpmj/video-react.html?id=1659091568346

2.React Suspense는 딱히 어려울게 없다. 그냥 import로 lazy, Suspense를 받아온 후 루트 분기점들을 Suspense로 감싸주고 루트로 받아올 컴포넌트들에 lazy를 넣어주면 된다.

import {Suspense, lazy } from 'react';

const Home =  lazy(() => import('./Home')); //lazy로 컴포넌트들 감싸주기
const CreateBlog = lazy(() => import('./blogComponent/CreateBlog'));
const BlogDetails = lazy(() => import('./blogComponent/BlogDetail'));
const NotFound = lazy(() => import('./component/NotFound'));

<Suspense> //루트 시작부분부터
  <Routes>
    <Route exact path="/" element={<Home blogs={blogs} isPending={isPending} />} />
    <Route path="/create" element={<CreateBlog isChanged={isChanged} setIsChanged={setIsChanged}/>} />
    <Route path="/blogs/:id" element={<BlogDetails isChanged={isChanged} setIsChanged={setIsChanged} />} />
    <Route path="/blogs/:id" element={<NotFound />} />
  </Routes>
</Suspense>  //루트 끝부분까지 Suspense로 감싸기

 

오늘 과제는 페어분과 재미있게 잘 진행할 수 있었다.

이제 fetch부분도 여유있게 사용할 수 있게 됐고 리액트의 동작에 대해서도 좀 더 알아가는 것 같다.

'회고' 카테고리의 다른 글

학습(알고리즘)  (0) 2022.07.31
학습(알고리즘)  (0) 2022.07.30
React 심화-2  (0) 2022.07.28
React 심화  (0) 2022.07.27
번들링과 웹팩-2  (0) 2022.07.26

Chpater2-3. Custom Hooks
  1.custom hook을 어느 때에 사용하는지 이해합니다.
  2.custom hook의 작성 규칙과 작성 방법에 대해 이해합니다.
Chapter3. React의 주목해야 할 기능
  3.React가 버전 18로 업데이트 되면서 어떤 점이 바뀌었는지 이해한다.
Chapter3-1. 코드 분할(Code Spliting)
  4.번들링한 앱들이 코드 분할이 필요한 이유에 대해 이해합니다.
  5.React는 어떤 방식으로 코드 분할을 하는지 이해합니다.
Chapter3-2. React.lazy()와 Suspencse
  6.React.lazy()의 사용법과 어느 때에 사용하는지 이해합니다.
  7.React.Suspense의 사용법과 어느 때에 사용하는지 이해합니다.

1.반복되는 로직을 재사용하고 싶은 경우 사용할 수 있다. 예를 들면 url fetch, 상태변경 등에 사용한다.

2.중복되는 로직을 분리하여 use를 붙인 함수를 만들며 아래와 같은 규칙을 지켜야한다.

  1.Custom Hook을 정의할 때는 함수 이름 앞에 use를 붙여야한다.(없는경우 일반컴포넌트취급)
  2.프로젝트 내의 hooks 디렉토리에 Custom Hook을 위치 시킨다.
  3.Custom Hook으로 만들 때 함수는 조건부 함수가 아니어야한다.


3.ReactDOM.render를 지원하지 않고 대신 createRoot API를 지원한다. 덕분에 Suspense기능을 이용해 독립적 렌더링이 가능하다.

4.번들링한 앱에 코드분할을 적용하면 필요한 부분만 먼저 불러서 사용할 수 있기 때문에 획기적으로 빨라질 수 있다.

5.원래는 모든 컴포넌트를 불러오지만 코드분할을 사용할 경우 요청받은 컴포넌트만 import하는 방식으로 진행된다.

6,7.lazy와 Suspense는 사실 같이 사용해야 한다. lazy는 import할 필요가 없지만 Suspense는 import가 필요하며 특정 컴포넌트가 필요한 경우 lazy에 감싸진 컴포넌트를 요청한다.

import { Suspense, lazy } from 'react';  //Suspense, lazy import하기
import { BrowserRouter as Router, Routes, Route } from 'react-router-dom';

const Home = lazy(() => import('./routes/Home'));  // lasy로 분기 감싸주기
const About = lazy(() => import('./routes/About'));

const App = () => (
  <Router>
    <Suspense fallback={<div>Loading...</div>}> //Suspense로 lazy를 사용한 컴포넌트 감싸기
      <Routes>
        <Route path="/" element={<Home />} />
        <Route path="/about" element={<About />} />
      </Routes>
    </Suspense>
  </Router>
);

전반적으로 뭘 하고 싶은지는 이해할 수 있지만 Custom Hook을 사용하는 법에 대해서는 아직 정확하게 모르겠다.

확실히 리액트의 기술들은 체계적이라 이해하기 더 쉬운 것 같다.

 

'회고' 카테고리의 다른 글

학습(알고리즘)  (0) 2022.07.30
React 심화-3  (0) 2022.07.29
React 심화  (0) 2022.07.27
번들링과 웹팩-2  (0) 2022.07.26
번들링과 웹팩  (0) 2022.07.25

Chapter1. Virtual DOM
  1.Virtual DOM이 나오게 된 배경에 대해 이해합니다. 
  2.DOM의 조작 속도가 느려지는 이유와 어떻게 가상 DOM이 더 빠른 지에 대해 이해합니다.
  3.Virtual DOM의 형태에 대해 이해합니다.
Chapter1. React Diffing Algorithm
  4.React Diffing Algorithm의 두 가지 가정에 대해 이해합니다.
  5.React가 DOM 트리를 탐색하는 방법에 대해 이해합니다.
  6.다른 타입의 DOM 엘리먼트인 경우와 같은 타입의 DOM 엘리먼트인 경우의 알고리즘 동작 방식을 이해합니다.
  7.자식 엘리먼트의 재귀적 처리와 key에 대해 이해합니다.
Chapter2. React Hooks
  8.Function Component와 Class Component에 대해 이해합니다.
  9.Hook에 대해 이해합니다.
  10.Hook 사용 규칙에 대해 이해합니다.
Chapter2-1. useMemo
  11.useMemo을 어느 때에 사용하는지 이해합니다.
  12.Memoization의 개념에 대해 이해합니다.
  13.실습을 통해 useMemo을 직접 작성해보고 어떻게 작성하는지 이해합니다.
Chapter2-2. useCallback
  14.useCallback을 어느 때에 사용하는지 이해합니다.
  15.useCallback과 참조 동등성에 대해 이해합니다.
  16.실습을 통해 useCallback을 직접 작성해보고 어떻게 작성하는지 이해합니다.


1.리플로우를 줄이기 위해 가상화된 돔을 만들어 차이점을 비교해 달라진 부분만 리렌더링하기 위해서.

2.예를 들어 집을 비유하면 집에서 시계를 없앨 경우 그냥 시계를 벽에서 떼면 되지만 랜더링에서는 집 크게는 아파트 전체를 리플로우해야 할 수 있다. 그렇기 때문에 가상 DOM 여기서 예를 들자면 집의 도면등을 그린 가상의 집에서 시계가 있는 부분에서 시계를 제거한 후 차이점은 시계 하나라는 점을 반영해서 시계만 제거하는 기법인 가상 DOM을 사용해 시간과 데이터를 절약할 수 있다.

3. DOM은 추상화된 자바스크립트 객체의 형태를 가지고 있다. 일반적인 DOM과 유사하게 HTML문서 객체를 기반으로 하며 가상화 한 상태기 때문에 실제 DOM과는 무관하게 조작할 수 있다.

4.기존의 트리를 다른 트리로 변형시킬 기존의 조작방식은 O(n^3)의 복잡도를 가지고 있었기 때문에 엘리먼트의 규모가 커질수록 들어가는 시간이 세제곱만큼 늘어난다는 단점을 가지고 있어 기하급수적으로 늘어나는 비용을 감당할 수 없었다. 
React Diffing Algorithm은 아래의 두 가지 가정을 기본으로 전제한다.

 1.각기 서로 다른 두 요소는 다른 트리를 구축할 것이다.
 2.개발자가 제공하는 key 프로퍼티를 가지고, 여러 번 렌더링을 거쳐도 변경되지 말아야 하는 
   자식 요소가 무엇인지 알아낼 수 있을 것이다.

 

 1번은 변경이 있기 때문에 당연히 다른 트리를 구축할 수 밖에 없으며 2번은 key 프로퍼티를 통해서 자식요소로 무엇이 있어야 하는지를 비교할 수 있기 때문에 기존에 존재하던 key를 그대로 보유한 엘리먼트들은 유지시켜야 함을 알 수 있다.
 
5.DOM 트리를 탐색할 경우 BFS의 일종인 계층별 순회비교를 사용한다.

6.다른 타입의 DOM 엘리먼트인 경우 그 하위에 있는 모든 자식요소들도 전부 파괴되며 재생성된다. 만약 부모엘리먼트의 태그만 바뀐다고 하더라도 부모자체를 인식하지 못했기 때문에 그 하위 자식들이 버려진다고 할 수 있다. 하지만 같은 타입의 DOM 엘리먼트인 경우 그 하위에 바뀐 점들만 바뀐다. 물론 그 하위 엘리먼트중 하나의 태그가 바뀌는 일이 있다면 그 하위 엘리먼트의 자식요소들은 모두 재생성된다.

7.자식 엘리먼트의 재귀적 처리에는 순서를 도입해서 첫번째 값과 바뀐 DOM의 첫번쨰 값(자식)을 비교하기 때문에 만약 바뀐 DOM의 첫번째에 사소한 요소를 추가한다고 하더라도 매칭이 제대로 되지 않아 새로운 값들을 모두 재생성해야한다. 마치 단추를 잘못 끼우면 그 아래가 모두 어긋나서 새로 일을 하는 느낌이라고 볼 수 있다.
하지만 여기에 Key를 도입한다면 자식요소로 있어야 할 요소들이 모두 존재하며 단지 하나가 추가되었고 그 위치가 첫번째 순서임을 알 수 있기 때문에 맨 앞에 새로 변경된 요소만 추가할 수 있어 효율성이 올라간다. 

8.Class Component는 예전에 사용하던 컴포넌트이며 Function Component는 새로 추가된(이미 추가된지 오래 되기는 했지만) 컴포넌트로 Hook을 사용할 수 있다.

9.Hook은 함수형 컴포넌트에서 상태 값 및 여러 기능을 편하게 사용할 수 있는 메소드를 의미한다. 예전에 배운 리듀서와 use메모, use콜백, useState같은 편리한 친구들이 Hook에 속한다.

10.Hook의 사용 규칙은 다음과 같다.

  1.리액트 함수의 최상위에서만 호출해야 한다.
  2.오직 리액트 함수 내에서만 사용되어야 한다.

 

 

11.useMemo은 특정 값(value)를 재사용하고자 할 때 사용하는 Hook으로 반복적으로 계산을 하게 되는 경우 투입할 값이 동일할 경우 출력될 값이 같음을 이용해 함수를 호출하지 않고 결과만을 리턴한다.

12.메모이제이션(Memoization)은 기존에 수행한 연산의 결과를 저장했다가 같은 입력이 있는 경우 재활용하는 기법으로 성능 최적화에 도움이 된다.

13.useMemo는 아래와 같은 방식으로 사용할 수 있다.

  1. import { useMemo } from "react";
  2. 변경함수에 useMemo 덮어씌우고 변수값들 대괄호에 넣어주기(입력값이 같은지 비교하기 위해)
      const answer = calculate(val1, val2);
   => const answer = useMemo(() => calculate(val1, val2), [val1, val2]);

 

 

14.useCallback은 useMemo와는 다르게 함수의 재사용을 위해 사용하는 Hook으로 일반적으로 사용함에 있어서 최적화를 느낄 수 없지만 
리액트의 리렌더링 시 "함수를 새로이 만들어서 호출"을 한다는 부분에서 문제가 생길 수 있기 때문에 함수를 다른 함수의 인자로 넘기거나 props로 자식 컴포넌트에 넘겨줄 때 에러가 생기지 않도록 useCallback을 사용해서 "같은 함수"를 보내줄 수 있다는 장점이 있다.

15.참조 동등성이란 같은 함수를 가지고 결과를 비교하더라도 객체간의 주소가 다르기 때문에 일반적인 값의 비교(==)를 하면 true를 받을 수 있지만 엄밀비교(===)를 사용할 경우에는 false가 나와버린다. 그렇기 때문에 useCallback으로 동일한 함수를 사용할 수 있다는 부분은 그 함수를 여러곳에서 동시에 사용할 때 문제를 막을 수 있는 안정성을 보장한다.

16.useCallback은 아래와 같은 방식으로 사용할 수 있다.

   1.import { useCallback } from "react";
   2.변경함수에 useCallback 덮어씌우고 변수값들 대괄호에 넣어주기(입력값 비교용)  
      const getItems = () => [input +1, input + 10, input + 100];
   => const getItems = useCallback(() => [input +1, input + 10, input + 100],[input]);


이론을 재미있게 학습헀지만 생각보다 정리하려니 뭔가 많은 것 같다.

알고리즘 위주로 학습했지만 오히려 그래서 더 리액트 심화에서 재미있게 학습할 수 있었다.

'회고' 카테고리의 다른 글

React 심화-3  (0) 2022.07.29
React 심화-2  (0) 2022.07.28
번들링과 웹팩-2  (0) 2022.07.26
번들링과 웹팩  (0) 2022.07.25
학습(알고리즘)  (0) 2022.07.24

리액트의 번들링과 웹팩에 대해서 학습하던 중 빌드까지는 완료했지만 깃허브 페이지에 올려도 로딩이 되지 않는 문제가 발생했다.

처음에는 추측해서 해결해보다가 console을 확인해보니 여러가지 문제들이 있었다.

초반에 자잘한 문제는 어떻게 해결했지만 net::ERR_ABORTED 404는 쉽게 해결되지 않았다.

 

 

정확하게 어떤 원인인지는 모르겠지만 404자체가 경로 문제라는 사실을 인지헀고 구글링을 통해 여러 사람들의 답변을 본 결과 아래와 같은 순서로 오류 해결작업을 진행했다.

 

1.경로가 잘 지정되야 하는데 만약 경로에 .js가 없는 상태라면 js를 추가해줘야한다.

import App from './App';     //  =>   
import App from './App.js';



2.manifest의 경로를 /manifest로 변경해줘야 한다.(index.html 내부값)

<link rel="manifest" href="%PUBLIC_URL%/manifest.json" />   //  =>
<link rel="/manifest" href="%PUBLIC_URL%/manifest.json" />



3.계속해서 되지 않아 검색해보니 net::ERR_ABORTED 404가 경로문제라는 사실을 재확인하고 config에서 html의 경로를 public이 아닌 src로 된 부분을 다시 수정했다.(이부분은 본인의 경로를 확인해서 맞는 위치의 파일을 불러와야한다)

template: './src/index.html'      //  =>
template: './public/index.html'



4.경로문제가 homepage를 설정해야 한다는 말이 있어서 package.json에서  "homepage": "https://ryujichang.github.io/Lottery-/"를 추가해 초기 주소값을 설정해줬다. => 성공

"homepage": "http://ryujichang.github.io" (미설정 기본값이 이것임을 콘솔에서 확인 후 아래로 변경)  //  =>
"homepage": "https://ryujichang.github.io/Lottery-/"

1,2번은 효과가 있는지 모르겠지만 3번의 config경로확인은 중요한 문제였으며 4번은 직접적으로 해결이 됐다.

마지막으로 4번은 깃허브에서 사용하는 레포지토리명이 있음에도 불구하고 레포지토리명은 생략한채 바로 /static으로 넘어가버려서 생기는 문제였기 때문에 레포지토리명을 중간에 포함시켜줬다(-/라고 된 것 처럼 페이지 주소값이 저렇게 되어있기 때문에 레포지토리명이 아니라 저렇게 넣어줘야 했다. 저 Lottery-/ 라는 추가된 부분은 페이지를 배포하려고 할 때 표기된다.)

7.React의 단방향 데이터 흐름(One-way data flow)에 대해 자신의 언어로 설명할 수 있다.
8.JSX 문법의 기본과 컴포넌트 기반 개발에 대해서 숙지한다.
9.React Router DOM으로 React에서 SPA(Single-Page Application)을 구현할 수 있다.
10.state hook을 이용하여, 컴포넌트에서 데이터를 변화시킬 수 있다.
11.props를 이용하여, 부모 컴포넌트의 데이터를 자식 컴포넌트로 전달할 수 있다.
12.바람직한 컴포넌트 구조와 state와 props의 위치에 대해 고민한다.

7.리액트는 하향식 데이터 흐름을 가지고 있는데 이로 인해서 둘 이상의 컴포넌트에 영향을 주는 state의 위치는 해당 컴포넌트의 공통된 선조 컴포넌트(둘 모두를 후손으로 두는 컴포넌트)여야 한다. 데이터가 한 방향만으로 흐르기 때문에 어디에서 문제가 발생했는지, 그 문제의 여파는 어디까지인지를 파악하기도 쉬울 것 같다. 

8.JSX문법은 엘리먼트 작성시 태그로 감싸줘야하며 class가 아닌 className으로 사용해야한다.
JS기능들을 사용하기 위해서는 {}로 감싸줘야하고 if문보다는 ? :을 이용한 삼항연산자를 사용하며 map을 사용할 경우 key값을 넣어줘야 하는데 이 부분에서 랜덤으로 넣게되면 과부하가 걸릴 수 있기 때문에 랜덤은 지향하고 숫자값을 넣어줘야 하지만 삭제를 염두에 둔다면 key값을 만들어주는 라이브러리를 사용해야한다. 그리고 컴포넌트는 대문자로 시작해야한다.

9.SPA를 위해서는 npm install react-router-dom@^6을 사용해 라이브러리를 받아준 후 import로 { BrowserRouter, Routes, Route} from 'react-router-dom'; 등을 작성해 주고 내용물을 <BrowserRouter>로 감싸주고  <Routes>로 분기를 설정한 후 내부 내용을 <Route path="/" element={<Tweets />} /> (import Tweets from './Pages/Tweets';등으로 수입해줘야한다.) 주소, 페이지위치등을 지정해주면 그 페이지로 이동하는 분기점? 경로?가 생긴다. 

10.아래와 같이 useState를 import한 후 함수 내부에서 useState를 사용해 state로 선언하고 그 내부 값은 set변수명을 사용해 내부 값을 변경해야 하며 내부 이벤트핸들러를 사용해 set기능으로 state를 변경해준다.
import React, { useState } from "react";

function CheckboxExample() {
  const [isChecked, setIsChecked] = useState(false);

  const handleChecked = (event) => {
    setIsChecked(event.target.checked);
  };

11.아래와 같이 itemOne, itemTwo를 props로 넘겨주고 싶은 경우 부모컴포넌트에서 넘겨줄 자식컴포넌트의 내부에 anyname = {itemOne}의 방식으로 넣어준 다음 자식 컴포넌트에서 props.anyname을 통해 받아올 수 있다. 아래의 경우에는 a, b가 이름이다.
const App = () => {
  const itemOne = "React를";
  const itemTwo = "배우고 있습니다.";

  return (
    <div className="App">
      <Learn a = {itemOne} b ={itemTwo}/>
    </div>
  );
};

const Learn = (props) => {
  return <div className="Learn"> {props.a} {props.b} </div>;
};


12.바람직한 컴포넌트의 구조에 대해서는 아직 뒤에서 배울 상태 끌어올리기 등을 제대로 배우지 않아 부족하지만 변화되는 것들을 모두 포함하는 가장 작은 규모의 컴포넌트(가장 낮은 부모단계?)에 위치시켜야 한다는 것 까지밖에는 모르겠다.

13.아래는 어드밴스 내용 중 셀럭터에 대해 잊어버릴까바 추가하는 내용
```js state를 추가해서 필터로 메뉴를 확인하는 부분을 만들어야 한다.
1. [isFiltered, set] = useState(false)
2. [filteredTweets, set] = useState(dummyTweets) 
<select>
<option> -- click to filter balabla -- </option>
{
</select> ```

오늘은 state&props-2를 끝냈지만 사실 state와 props에 대한 부분은 리액트에서 전반적으로 더 다룰 것 같다. 그 예로 다음주에 진행될 Unit9 - [React] 클라이언트 Ajax 요청도 state끌어올리기에 대한 이야기로 시작된다. 
조금 뒤쳐지는게 아닌가 싶었던 생각도 들지만 베어미니멈은 빨리 끝내고 어드밴스드도 조금씩 보는 정도로 만족하면서 부족했던 JS, 코딩테스트등을 보충해야겠다.

'회고' 카테고리의 다른 글

[HTTP/네트워크] 실습  (0) 2022.06.10
[HTTP/네트워크] 기초  (0) 2022.06.09
[React] React State & Props  (0) 2022.06.07
예습 (React State & Props)  (0) 2022.06.06
복습(deep dive, 문제풀이)  (0) 2022.06.05

1.state, props의 개념에 대해서 이해하고, 실제 프로젝트에 바르게 적용할 수 있다.
2.React 함수 컴포넌트(React Function Component)에서 state hook을 이용하여 state를 정의 및 변경할 수 있다.
3.React 컴포넌트(React Component)에 props를 전달할 수 있다.
4.이벤트 핸들러 함수를 만들고 React에서 이용할 수 있다.
5.실제 웹 애플리케이션의 컴포넌트를 보고 어떤 데이터가 state이고 props에 적합한지 판단할 수 있다.
6.실제 웹 애플리케이션 개발 시 적합한 state와 props의 위치를 스스로 정할 수 있다.
7.React의 단방향 데이터 흐름(One-way data flow)에 대해 자신의 언어로 설명할 수 있다.
8.JSX 문법의 기본과 컴포넌트 기반 개발에 대해서 숙지한다.
9.React Router DOM으로 React에서 SPA(Single-Page Application)을 구현할 수 있다.
10.state hook을 이용하여, 컴포넌트에서 데이터를 변화시킬 수 있다.
11.props를 이용하여, 부모 컴포넌트의 데이터를 자식 컴포넌트로 전달할 수 있다.
12.바람직한 컴포넌트 구조와 state와 props의 위치에 대해 고민한다.

1.state와 props에 대해서 이해하고 있으며 작성한 예시를 보유하고 있고 그 예시를 보며 응용해서 작성할 수 있다.

2.useState를 사용해서 현재 상태, 변경함수, 디폴트값을 만들 수 있다.
const [showPopup, setShowPopup] = useState(false); 이 함수에서 첫번째 showPopup 변수이며 useState를 통해 false라는 값이 default로 배정되어있고 setShowPopup()를 사용해 showPopup라는 변수의 값을 변경해줄 수 있다.


3.아래의 예시에서 볼 수 있지만 원하는 컴포넌트에 특정 props값을 넣어준 후 자식함수에서 그 값을 매개변수로 넣어주는 방식으로 호출할 수 있다.
const App = () => {
  const itemOne = "React를";
  const itemTwo = "배우고 있습니다.";

  return (
    <div className="App">
      <Learn a = {itemOne} b ={itemTwo}/>
    </div>
  );
};

const Learn = (props) => {
  return <div className="Learn"> {props.a} {props.b} </div>;
};

export default App;


4.이벤트 핸들러 함수는 사실 위에서 대답한 set State와 관련있는데 특정 이벤트를 받게되면 이벤트 핸들러 함수의 내부에 setX()를 넣어줘서 state값을 변경해주거나 map, filter 등의 조작을 통해 반응을 만드는 방식이다.

5.props는 변경되지 않는 값들로 건축물의 위치, 주소, 기원 등에 적용된다면 state는 현재 건물의 수명?, 안전점검시기, 평당 단가 등의 변경될 수 있는 값들에 넣어줘야 한다. 변경이 가능하거나 변경해야 하는 내용들은 state로 넣어주는 편이 좋다. (하지만 state를 남발하면 데이터 낭비가 있다는 것 같기도 하다)

6.아직은 부족하다고 생각되는데 아마 질문의 의도는 데이터는 아래로 흐르기 때문에 아래에서 변경을 해서 상위함수? 컴포넌트?에 적용시키고 싶은 경우 상위에 만들고 그걸 아래에서 받아서 데이터를 위로 전달하는 상태 끌어올리기등을 원하는 것 같다. 하지만 그건 다음주에 배울 예정이다. (미리 잠깐 본 상태)

 

질문은 12까지 있지만 6까지 한 이유는 아무래도 내일까지 진행되는 내용의 회고이기도 하고

오늘 다 대답할 수 있겠지만 시간이 너무 늦어서 수면시간 보장을 위해 반으로 나눈 것도 있다.

다른 회고의 경우 2~3일에 걸쳐서 한다고 해도 한 내용까지만 잘라서 하는 경우가 많았는데

오늘과 내일 모두 state & props를 진행하고 학습은 이미 오늘 끝내고 내일은 과제만 진행하기 때문에 나누기도 애매했다.

 

내일 한다고 해도 이상하지 않은 회고를 잠도 못자가며(다래끼 때문에 수면에 민감하다) 오늘 마감하는 것 보다는

반으로 나누고 오늘 예정되있던 10분운동을 마무리 하고 수면을 취하는 편이 더 좋다고 생각된다.

 

state는 좋은 기능인 것 같다.

 

'회고' 카테고리의 다른 글

[HTTP/네트워크] 기초  (0) 2022.06.09
[React] React State & Props-2  (0) 2022.06.08
예습 (React State & Props)  (0) 2022.06.06
복습(deep dive, 문제풀이)  (0) 2022.06.05
복습(React 기초, JS promise)  (0) 2022.06.04

1.SPA(Single-Page Application) 개념을 이해하고 설명할 수 있다.
2.SPA의 장, 단점에 대해 이해하고 설명할 수 있다.
3.와이어프레임을 보고 어느 부분을 컴포넌트로 구분할지 스스로 정할 수 있다.
Chapter2. React Router
4.React에서 npm으로 React Router를 설치(npm install react-router-dom@^6)하고 이용할 수 있다.
5.React Router를 이용하여 SPA를 구현할 수 있다.
6.라우팅 구조를 짤 수 있어야 하고, 이에 필요한 기초 문법들을 사용할 수 있어야 한다.

1. SPA는 이름처럼 하나의 페이지에 적용되는 시스템으로 모든 페이지를 수정하지 않고 변경해서 보여줘야 하는 부분만 변경하는 방식이다.

2. SPA는 기존의 여러 페이지와는 다르게 하나의 페이지에서 시행되기 때문에 불필요한 정보를 로딩할 필요가 없기 때문에 실행 속도가 빠르고 유저의 데이터 낭비를 줄일 수 있습니다. 또한 구조적으로 합처진 상태이기 때문에 내용의 추가나 삭제를 할 경우에도 내부 이름들의 충돌등을 걱정하지 않고도 수입해서 편하게 사용할 수 있다.

3.와이어프레임에서 기초적인 메뉴바 또는 하단을 제외한 대부분(가끔은 사이드바도 남길 수 있다.)의 기능들은 컴포넌트로 작성해야하고 사실 다른 부분들도 컴포넌트로 제작한 후 불러오는 것이 좋다. 사실 컴포넌트로 구분한다기 보다는 라우터로 구분하는 부분이 중요하며 고정해서 나오는 부분이라도 수정할 경우를 위해서 컴포넌트로 작성하는 것이 나쁘지 않다.

4.npm install react-router-dom@^6을 작성한 후 import로 { BrowserRouter, Routes, Route} from 'react-router-dom'; 등을 작성해 주고 내용물을 <BrowserRouter>로 감싸주고  <Routes>로 분기를 설정한 후 내부 내용을 <Route path="/" element={<Tweets />} /> (import Tweets from './Pages/Tweets';등으로 수입해줘야한다.) 주소, 페이지위치등을 지정해주면 그 페이지로 이동하는 분기점? 경로?가 생긴다. 

5.가능하다.

6.기초적인 Routes, Route를 사용할 수 있다.


SPA를 이용한 route는 상당히 흥미로운 방식이었다.
길을 나누는 방식들도 합리적이고 명확하게 표현된 것 같다.
아무래도 최신식으로 추가된 문법일수록 기능적으로 우수하고 사용하기 좋은 것 같다.

'회고' 카테고리의 다른 글

복습(deep dive, 문제풀이)  (0) 2022.06.05
복습(React 기초, JS promise)  (0) 2022.06.04
[React] Intro  (0) 2022.06.02
예습(react 기초)  (0) 2022.06.01
[JS/Node]비동기, Node.js  (0) 2022.05.31

Chapter1. React Intro
1.React의 3가지 특징에 대해서 이해하고, 설명할 수 있다.
2.JSX가 왜 명시적인지 이해하고, 바르게 작성할 수 있다.
3.React 컴포넌트(React Component)의 필요성에 대해서 이해하고, 설명할 수 있다.
Chapter2. Create React App
4.Create React App 소개를 보고, Create React App 이 무엇인지 대략적으로 이해할 수 있다.
5.npx create-react-app 으로 새로운 리액트 프로젝트를 시작할 수 있다.
6.create-react-app 으로 간단한 개발용 React 앱을 실행할 수 있다.
7.리액트 랜덤 명언 앱 Hands-on을 따라 간단한 리액트 랜덤 명언 앱을 만들 수 있다.
8.Create React App으로 만들어진 리액트 프로젝트 구성을 대략적으로 이해할 수 있다.

1.리액트는 선언형, 컴포넌트 기반, 범용성이라는 특징을 가지고 있다.
선언형 - 한 페이지를 위해 HTML/CSS/JS로 나누기 보다는 하나의 파일에 JSX를 통해 선언형 프로그래밍을 지향한다.
컴포넌트 기반 - 독립적이고 재사용 가능한 컴포넌트들을 만들어 기능에 집중할 수 있으며 유지보수나 유닛테스트도 각각 시행해 시간과 비용을 아낄 수 있다.
범용성 - 프레임워크와는 다르게 다른 프로젝트에도 자유롭게 이식할 수 있다.

2.한 페이지에서 JS와 HTML을 동시에 사용할 수 있기 때문에 내용을 훨씬 더 쉽게 파악할 수 있으며 기능들 또한 JS를 사용하는 것과 별다른 차이점이 없기 때문에 작성하기도 간편한 장점이 있다.

3.위에서 설명했지만 컴포넌트를 사용함으로써 하나의 컴포넌트 단위로 이미 작성했던 컴포넌트를 재사용하거나 남이 작성한 컴포넌트들을 자유롭게 가져다 쓸 수 있기 때문에 컴포넌트는 재사용성 등에 압도적인 장점을 지니고 있으며 각각을 유지보수하거나 테스트하는 것에도 다른 간섭을 최소화할 수 있기 때문에(없을 수도 있다)

4.리액트 SPA를 쉽고 빠르게 개발할 수 있도록 만들어진 툴 체인이다. 다만 많은 모듈들이 들어있기 때문에 설치에는 약간(1분가량)의 시간이 걸린다.

5.가능하다. (어제 만든 로또번호 생성기를 Create React App으로 제작했다.)

6.가능하다.. (질문이 중복되는 느낌)

7.랜덤 명언앱을 제작한 후 로또번호 생성기를 만들었다.

8.가능하다!

오늘의 과제는 컴포넌트를 만들고 배정하는 등의 기본적인 리액트 사용법에 대한 것이었다.
하지만 그 기본적인 리액트 사용만으로도 1달정도만에 만들어봤던 나만의 아고라스테이츠와 유사한 기능을 만들 수 있었다.
리액트는 유사한 기능들을 더 간단하게 만들고 더 빠르게 구현됐다.
리액트가 훨씬 더 좋은 것 같다!

'회고' 카테고리의 다른 글

복습(React 기초, JS promise)  (0) 2022.06.04
[React] SPA  (0) 2022.06.03
예습(react 기초)  (0) 2022.06.01
[JS/Node]비동기, Node.js  (0) 2022.05.31
[JS/Node] Node.js  (0) 2022.05.30

+ Recent posts