티스토리 뷰

반응형

# 좋은 아키텍쳐란?

다른것들끼리 분리해라.

컴포넌트를 언제 어떻게 쪼갤지에 대해선 의견이 분분하지만,

강사님 개인적인 의견으로는 map으로 리스트 데이터를 뿌려주는 경우 별도의 컴포넌트로 감싸주는걸 선호한다.

눈에 보기 쉽기 때문!

 

쪼갤까 말까 싶을때가 쪼갤때다!

나중에 비대해질 경우 버그날까 쪼개기 어렵다.

 

# 커뮤니케이션

이 부분은 아래 링크 작성자께서 정리를 잘해주셔서 발췌해왔습니다.

https://github.com/soongyu/woowa-tech-learning-react-typescript/blob/master/week02-2.md

 

soongyu/woowa-tech-learning-react-typescript

우아한테크러닝 3기 React&TypeScript 기록. Contribute to soongyu/woowa-tech-learning-react-typescript development by creating an account on GitHub.

github.com

  1. 아주 기본적인 소프트 스킬(Soft Skill)  커뮤니케이션에 있어서 가장 중요한  약속(프로토콜, Protocol)이라고 생각한다. 함께 일하다보면 그게 맞지 않는 경우가 많은데 의식조차 못하는 사람도 대다수. 정보를 주고받는다는  이해의 수준(레이어, Layer) 일치(유사, 동등)해야한다. 비개발자에게 개발 언어를 사용하면 이해하는 것이 어렵 상대에 따라 단어 선택도 바꿔야할 필요가 있다상대(Target Layer)  이해(의식)하고 커뮤니케이션을 있길, 커뮤니케이션뿐 아니라 어떤 분야던.
  2. 학습도 물론 마찬가지. 교육 과정이나 강의 등을 고를 때를 예로 들면 유명하고 인기 있는(핫한) 좋은 것이 아니라 내가 이해할 있는 영역인지?, 정말 필요한지 중요하다고 받아들여진다. 고급 테크닉만 쫓는다고 좋은 아니다. 주니어 시절에 갖추는 본질과 기본이 중요하다.(편식 No! 차곡차곡!) 내가 속한 레이어에 맞는 표현, 단어들도 습득하도록 노력하자!
  3. 다른 사람에게 전달할 때도 내가 A라는 것에 대해서 다양한 레이어로 얘기할 수 있는가. 상대의 레이어가 어느 수준인지 의도적으로 파악하는지도 생각하자.
  4. 방향으로 너무 반복되면 습관이 되고 몸에 붙게 된다. 그걸 떼어내기가 쉽지 않으므로 의욕이 넘칠 위험할 있으니 조금 돌아보고 낮추는 것도 필요.

 

# 클래스 컴포넌트 vs 함수형 컴포넌트

리액트 측에서는 사실 클래스 컴포넌트를 명맥상 유지하는거 같음.

함수형으로 모든게 가능하고 클래스는 라이프사이클 관련해서나 여러가지로 잡음이 많다.

 

import React, { useEffect } from "react";

const SessionItem = ({ title }) => <li>{title}</li>;

class classApp extends React.Component {
  constructor(props) {
    super(props); // 상위 클래스에 넘겨준다.

    // 일반 펑션 쓸 때는 생성자 함수에서 일일히 이렇게 해줫다.
    this.onToggleDisplayOrder = this.onToggleDisplayOrder.bind(this);

    this.state = {
      displayOrder: "ASC"
    };
  }
  onToggleDisplayOrder() {
    // 실행 컨택스트
    this.setState({
      displayOrder: displayOrder === "ASC" ? "DESC" : "ASC"
    });
  }

  toggleDisplayOrder = () => {
    // 렉시컬 컨택스트 (문맥상 this)
    this.setState({
      displayOrder: displayOrder === "ASC" ? "DESC" : "ASC"
    });
  };

  render() {
    // 클래스 컴포넌트는 상태가 바뀌면 렌더를 다시 해줄 뿐이지
    // this는 바뀌지 않는다. 기존 상태들 값 유지.
    return (
      <div>
        여기여기
        <button onClick={onToggleDisplayOrder}>정렬</button>
      </div>
    );
  }
}

const App = (props) => {
  // 기존엔 함수형은 상태를 가질 수 없어서 상위 컴포넌트로 상태를 다 올려버려서
  // 상위 컴포넌트가 비대해졌다.
  // 함수형 컴포넌트도 상태를 가지면 좋겠다고 생각.
  // 그래서 만들어진게 리액트 훅.
  // toggleDisplayOrder은 리액트가 제공한 함수기 때문에 언제 상태가 변경되는지 감지 가능.
  // 그래서 해당 함수를 호출하면 다시 렌더해준다.

  // toggleDisplayOrder는 다른 함수 안에 콜백으로 들어갈 수 밖에 없다.
  // (그렇지 않으면 무한루프에 빠지기 때문에)
  // 그 때 (사용시에) 클로저가 잡히는거지, 훅 자체가 클로저는 아님.

  // useEffect라는 훅은 렌더될때마다 전달해준 함수를 호출해줌.
  // 렌더가 완료된 이후 dom이 완성된 이후에 실행되는 것. (라이프사이클 함수)
  useEffect(() => {
    // 사이드이펙트가 일어나는 일.
    // 컴포넌트가 사라질 때 리턴해주는 함수를 호출함.

    // ex) 구독
    return () => {
      // 구독 해제
    };
  });

  const [displayOrder, toggleDisplayOrder] = React.useState("ASC");
  const { sessionList } = props.store;
  const orderedSessionList = sessionList.map((session, i) => ({
    ...sessionStorage,
    order: i
  }));

  const onToggleDisplayOrder = () => {
    toggleDisplayOrder(displayOrder === "ASC" ? "DESC" : "ASC");
  };

  return (
    <div>
      <header>
        <h1>React and TypeScript</h1>
      </header>
      <p>전체 세션 갯수: 4개 {displayOrder}</p>
      <button onClick={onToggleDisplayOrder}>재정렬</button>
      <ul>
        {orderedSessionList.map((session) => (
          <SessionItem title={session.title} />
        ))}
      </ul>
    </div>
  );
};

export default App;

** 가비지 컬렉션 (GC)

  • 메모리 누수를 막기 위해 사용하지 않는, 즉 참조가 사라진 값들을 자바스크립트 엔진이 알아서 지워준다.
  • 브라우저마다 시대마다 사용하는 알고리즘이 다양하지만 예전에는 주로 상호-순환 참조 알고리즘, 요즘에는 주로 마크 스윕 알고리즘을 사용한다.
  • 결론 : 리액트 훅을 사용하면서 메모리 leak 발생하는거 같다고 걱정하지마라. 신경쓰지 마라.

 

# 제너레이터 (Generator)

함수명 앞에 asterisk(*)가 붙은 함수를 Generator function 이라고 부른다.
async function과 함께 모던한 함수로 분류된다.

## 지연 호출 (lazy)

// 한 번에 실행 불가능.
const x = 10;
const y = x * 10;

// 한 번에 실행 가능.
const x = () => 10;
const y = x() * 10;

위 두줄의 코드는 한번에 실행시킬 수 없다.

x라는 값으로 디펜던시가 걸려잇다.
x값이 확정되기 전에는 아래 코드를 실행할 수 없기 때문.

 

그러나 아래 두 줄의 코드는 가능하다.
x값의 확정을 지연시켰기 때문. 보통 lazy, 또는 지연 호출이라고 한다.
Rx나 Mobx에서 사용하는 테크닉이다.

 

## generator vs async ~ await

const p = new Promise(function (resolve, reject) {
  // resolve 호출을 지연 호출시킨다.
  setTimeout(() => {
    resolve("1");
  }, 1000);
});

p.then(function (r) {
  // console.log(r);
});

function xyz(x) {
  // ...
  // 어떤 값을 리턴하는 것을 함수
  // 리턴이 없는 함수를 프로시져
  // 물론 자바스크립트는 리턴이 없으면 undefined를 반환하긴 함.
}

// 코루틴
// 함수인데 리턴을 여러번 할 수 있게 하면 어떨까?
// 마지막 리턴한 지점부터 다시 시작.
// 제너레이터는 이러한 코루틴 아이디어를 응용한것.

function* makeNumber() {
  let num = 1;

  while (num) {
    // yield는 제너레이터 함수에서 return 이라고 생각.
    // 그러나 return은 함수 자체를 끝내버리기 때문에 다르다.
    // 제너레이터 함수는 모든 상태를 기억하고 있다. 마치 리액트에서 제공하는 리액트 훅 같은 기능.
    const x = yield num++;
    console.log(x);
  }
}

const i = makeNumber(); // 실행될 준비만 함.

// console.log(i.next()); // 이 때 실행함. yield나 return이 나올때까지
// 제너레이터 바깥에서는 끝났는지 아닌지 알 수 없기 때문에 객체를 리턴.
// done: 다음에 실행할 코드가 있는지 구별하는 플래그.
// done이 true면 next를 그만 호출.
// console.log(i.next());
// console.log(i.next('x')); //값을 전달할수도 있다.

const delay = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
const delay2 = (ms) => ms;

// 콜백함수 구조
delay(3000).then(() => {
  console.log("3초 뒤");
});

// 바깥쪽에서 내부를 컨트롤 할 수 있다.
// 콜백으로 쓰지 않고 비동기를 동기적으로 쓸 수 있게 만든것이 리덕스 사가.
// 어떤 응답이 오면 다시 next 불러서 알려줘라.
function* main() {
  console.log("시작");
  yield delay2(3000);
  console.log("3초 뒤");
}
const it = main();
const { value } = it.next();

if (value instanceof Promise) {
  value.then(() => {
    it.next();
  });
} else {
  setTimeout(() => {
    it.next();
  }, value);
}

// async - await 활용한 경우.
async function main2() {
  console.log("시작");
  await delay(3000);
  console.log("3초 뒤");
}
main2();

// async await는 프로미스에 최적화된 것.
// 제너레이터는 훨씬 더 일반적인 상황에 적용 가능하다.
// 비동기 뿐만이 아니더라도 다양하게 적용 가능.
// 제너레이터가 반환한 객체를 iterator라고도 함.

// 콜백에 비해 코드가 깔끔해지고 코드가 깔끔해지면 읽기 쉬워진다.

 

반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함