이노베이션-실전플젝

[TIL] 함수 커링, hook, Blob 및 회고

개린이다 2023. 8. 1. 02:42
  • Fact (사실: 무슨 일이 있었나?)
  • Feeling (느낌: 무슨 느낌이 들었나?)
  • Finding (배운 점: 어떤 인사이트를 얻었나?)
  • Future action (향후 행동: 앞으로 무엇을 해야 할까?)
  • Feedback (피드백: 앞서 정한 향후 행동을 실천해본 뒤, 이에 대해 어떤 피드백을 받았나?)

- 씁.. 회고가 TIL이었음을 지금 깨달음

- 알려준 4F이 회고 기술 중 하나였음

- 괜히 회고가 뭔지 몰라서 찾아봄

 

1. Fact

: 예,, 저는 멍청이 입니다.. Type Scirpt를 공부 하나도 안했는데, Type Script로 개발을 진행하는 사람이 있다? 그 사람이 바로 나예요.. 똑똑이 두 분과 함께 하다보니 감사하게도 Type Script와 RTK-Query, mockupserver로 개발을 진행하게 되었다.. 여러 컨벤션도 완전 철저하다.. 그리고 미리 틀을 잡아놓은 것도 있어서 거기 맞춰서 하나씩 진행하니 개발이 척척 된다 진짜.. 잘 따라가기만 하면 MVP는 금방 완성될각임;; 

문제는 ㅋㅋㅋ 내가 .. 너무.. 모른다는 거다. 혼자서 하라고 했을 때, 할 수 있는가? 그게 중요한 것 같다.. 글애서 새로 배운것들을 하나씩 정리해보려고 한다...

 

2. Feeling

: 안녕하세요, 이번 금쪽이 입니다

: 하지만? 전에 밸런스 게임 중에 '천재 중 나만 바보' 와 '나만 똑똑이' 가 있었다 이 때는 뭐가 더 나은지 전혀 감이 안 잡혔는데, 이번 플젝을 진행해보니 나는 1도 꽤 잘맞는다. 내가 못하는 게 느껴질 수록 좌절하고 바닥만 칠 것 같았는디, 사업단에서 진행했던 멘토링이 꽤 큰 힘을 줬다

머.. 그 두 분이 나보다 잘하는 건 당연한거라;; 여기에서 나는 왜 못하지?! 하는 건 오히려 두 분의 시간을.. 욕보이는.. 그런.. 그래서 걍 나는 못하는 게 당연하다~ 라는 생각으로 최대한 물어보고 따라가려고 노력하고 있다

멘토링 때, 걍 개발은 어제의 나와 비교하는 거고, 결국 꾸준히 공부하면 되는 거고, 3~4년구르면 결국 아는 건 다 비슷비슷해진다고 위로해주셨는디, 이 생각으로 해보려고 한다 이번에 부트캠프 한 것도, 마지막으로 전공을 도전 안 해보면 후회가 남을 것 같아 한 거라^^,, 내가 이것도 못하다니! 나는 바보야! 이렇게 좌절할 필요는 없더라.. 마음이 꽤 편안해짐

 

3. Finding

여기서부터 중요함 ;;

 

1) 커링(Currying)

- 함수와 함께 사용할 수 있는 고급 기술

- Js에만 존재하는 것은 아님. 다른 언어에도 존재

- f(a,b,c) 처럼 단일 호출로 처리하는 함수를 f(a)(b)(c)와 같이 각각의 인수가 호출 가능한 프로세스로 호출된 후 병합되도록 변환하는 것

- 커링은 함수를 호출하지 않음. 단지 변환할 뿐

- 사용예시

function log(date, importance, message) {
  alert(`[${date.getHours()}:${date.getMinutes()}] [${importance}] ${message}`);
}

- 쿼링 적용

log = _.curry(log);

log(new Date(), "DEBUG", "some debug"); // log(a, b, c)
log(new Date())("DEBUG")("some debug"); // log(a)(b)(c)

//둘의 결과는 같음

- 아래처럼 사용하면 좋음

// logNow 는 log 의 첫 번째 인수가 고정된 partial이 될 것입니다.
let logNow = log(new Date());

// use it
logNow("INFO", "message"); // [HH:mm] INFO message

let debugNow = logNow("DEBUG");

debugNow("message"); // [HH:mm] DEBUG 메세지

- 우리가 코드 간결화를 위해 많이 쓰는 건 이런 경우

const onClickButton = (id:number) => {...}

...

<button onClick={()=>onClickButton(id)} />

- 아래와 같이 사용 가능

const onClickButton = (id:number) = () => {...}

...

<button onClick={onClickButton(id)} />

- 그냥 아래에 쓰던 걸 위로 올린 거임 커링덕분에 그래도 된다~

 

* 참고자료

https://ko.javascript.info/currying-partials

 

커링

 

ko.javascript.info

 

2) Hook

- 규칙

(1) 최상위에서만 Hook을 호출해야함

: 반복문, 조건문 혹은 중첩된 함수 내에서 Hook을 호출하면 안 됨

: 이러면, 컴포넌트가 랜더링 될 때마다 항상 동일한 순서로 Hook이 호출되는 것이 보장됨

 

(2) React 함수 내에서 Hook을 호출해야함

: 일반적인 Js에서 호출하지 마셈

: Custiom Hook에서 Hook을 호출하셈

 

(3) 위의 두 가지 규칙을 강제하기 위해 ESLint를 사용하세요!

: CRA에 기본적으로 포함되어 있는 플러그인이긴 함

npm install eslint-plugin-react-hooks --save-dev

- React는 어떻게 특정 state가 어떤 useState호출에 해당하는지 알 수 있나?

: React가 Hook이 호출되는 순서에 의존하기 때문! (그래서 순서가 중요한 거였음)

function Form() {
  // 1. name이라는 state 변수를 사용하세요.
  const [name, setName] = useState('Mary');

  // 2. Effect를 사용해 폼 데이터를 저장하세요.
  useEffect(function persistForm() {
    localStorage.setItem('formData', name);
  });

  // 3. surname이라는 state 변수를 사용하세요.
  const [surname, setSurname] = useState('Poppins');

  // 4. Effect를 사용해서 제목을 업데이트합니다.
  useEffect(function updateTitle() {
    document.title = name + ' ' + surname;
  });

  // ...
}

// ------------
// 첫 번째 렌더링
// ------------
useState('Mary')           // 1. 'Mary'라는 name state 변수를 선언합니다.
useEffect(persistForm)     // 2. 폼 데이터를 저장하기 위한 effect를 추가합니다.
useState('Poppins')        // 3. 'Poppins'라는 surname state 변수를 선언합니다.
useEffect(updateTitle)     // 4. 제목을 업데이트하기 위한 effect를 추가합니다.

// -------------
// 두 번째 렌더링
// -------------
useState('Mary')           // 1. name state 변수를 읽습니다.(인자는 무시됩니다)
useEffect(persistForm)     // 2. 폼 데이터를 저장하기 위한 effect가 대체됩니다.
useState('Poppins')        // 3. surname state 변수를 읽습니다.(인자는 무시됩니다)
useEffect(updateTitle)     // 4. 제목을 업데이트하기 위한 effect가 대체됩니다.

// ...

- 여기서 Hook을 조건문 안에 넣으면,

  // 🔴 조건문에 Hook을 사용함으로써 첫 번째 규칙을 깼습니다
  if (name !== '') {
    useEffect(function persistForm() {
      localStorage.setItem('formData', name);
    });
  }
  
useState('Mary')           // 1. name state 변수를 읽습니다. (인자는 무시됩니다)
// useEffect(persistForm)  // 🔴 Hook을 건너뛰었습니다!
useState('Poppins')        // 🔴 2 (3이었던). surname state 변수를 읽는 데 실패했습니다.
useEffect(updateTitle)     // 🔴 3 (4였던). 제목을 업데이트하기 위한 effect가 대체되는 데 실패했습니다.


//  name !== '' 조건은 첫 번째 렌더링에서 true 기 때문에 Hook은 동작합니다. 
//  하지만 사용자가 그다음 렌더링에서 폼을 초기화하면서 조건을 false로 만들 겁니다. 
//  렌더링 간에 Hook을 건너뛰기 때문에 Hook 호출 순서는 달라지게 됩니다.

- 요지랄이 나버림

- 그래서 만약, 조건부로 effect를 실행하고 싶다면, 조건문을 Hook 내부에 넣으면 됨

  useEffect(function persistForm() {
    // 👍 더 이상 첫 번째 규칙을 어기지 않습니다
    if (name !== '') {
      localStorage.setItem('formData', name);
    }
  });

- 뭐.. esLint쓰면 알아서 에러 잡아줄거라 ㄱㅊㄱㅊ

- 참고 자료

https://ko.legacy.reactjs.org/docs/hooks-rules.html

 

Hook의 규칙 – React

A JavaScript library for building user interfaces

ko.legacy.reactjs.org

3) new Blob

- 이미지, 사운드, 비디오와 같은 멀티미디어를 다룰 때 사용함

- 대개 데이터의 크기 및 MIME 타입을 알아내거나 데이터 송수신을 위해 작은 Blob 객체로 나누는데에 사용됨

- File 객체도 name과 lastModifiedDate 속성이 존재하는 Blob 객체임

- 생성 : 인수로 array와 options을 받음

const newBlob = new Blob(array, options);

- array

: Blob 생성자 첫번재 인수로 ArrayBuffer, ArrayBufferView, Blob(File), DOMString 객체 또는 이러한 객체가 혼합된 Array를 사용할 수 있음

new Blob([new ArrayBuffer(data)], { type: 'video/mp4' });
new Blob(new Uint8Array(data), { type: 'image/png' });  
new Blob(['<div>Hello Blob!</div>'], {
  type: 'text/html',
  endings: 'native'
});

- 참고 자료

https://heropy.blog/2019/02/28/blob/

 

Blob(블랍) 이해하기

JavaScript에서 Blob(Binary Large Object, 블랍)은 이미지, 사운드, 비디오와 같은 멀티미디어 데이터를 다룰 때 사용할 수 있습니다. 대개 데이터의 크기(Byte) 및 MIME 타입을 알아내거나, 데이터를 송수신

heropy.blog

- 코드보면서 왜 썼는지부터 보고 오겠음

 

+) MIME 타입

: MIME 타입(Multipurpose Internet Mail Extensions 타입)은 파일의 종류와 형식을 식별하기 위해 사용되는 식별자

: MIME 타입은 일반적으로 type/subtype 형식으로 구성

  • 텍스트 파일: text/plain
  • HTML 문서: text/html
  • CSS 스타일시트: text/css
  • JavaScript 파일: application/javascript
  • JSON 데이터: application/json
  • 이미지 파일:
    • JPEG 이미지: image/jpeg
    • PNG 이미지: image/png
    • GIF 이미지: image/gif
  • 오디오 파일:
    • MP3 오디오: audio/mpeg
    • OGG 오디오: audio/ogg
  • 비디오 파일:
    • MP4 비디오: video/mp4
    • WebM 비디오: video/webm
  • PDF 문서: application/pdf
  • Microsoft Word 문서: application/msword
  • Microsoft Excel 문서: application/vnd.ms-excel

4. Future action

- 씁.. 걍 열심히 하기;; 모르는 거 정리해두고,, 공부해야겠음

- 일단 오늘은 타입스크립트랑.. 그리드 공부하다가 자려고 함;;