체력을 기르기 위한 운동은 필수! 해야 할 운동들을 정리

  • 해본 운동들 중에 효과가 좋았던 것들, 지속해서 일주일 넘게 해 봤던 운동들을 정리
  • 플레이 리스트로 정리하자니 관리가 귀찮을 것 같아서 포스팅으로 남김

1. 스트레칭

(1) 하루 5분, 30일 후엔 다리찢기가 되는 스트레치! (일본어 영상)

스트레치

(2) 고관절이 딱딱한 사람이라도 부드러워지는 스트레치 (일본어 영상)

스트레치

(3) 발목 가동성 및 강화운동을 해도 좋아지지 않는 이유

스트레치

2. 유산소 운동들

(1) 빅시스 올인원 운동

NO 층간소음 올인원 운동

(2) 땅크부부 칼소폭

칼소폭 매운맛

(3) 차머 12분 맨몸 홈트

맨몸 홈트 차머

(4) 리쌤 초보자 운동

바벨라토르 홈트

Comment and share

프론트엔드 엔지니어 면접에서 자주 나오는 질문 1편

(추후에도 정리할 수 있음 더 정리하기…)

해당 영상에서 나온 것들을 위주로 정리

1. Virtual-DOM이란?

Virtual DOM은 무엇인가요?
Virtual DOM (VDOM)은 UI의 이상적인 또는 “가상”적인 표현을 메모리에 저장하고 ReactDOM과 같은 라이브러리에 의해 “실제” DOM과 동기화하는 프로그래밍 개념입니다. 이 과정을 재조정이라고 합니다.
(React 공식 문서 참조)

(1) 브라우저는 HTML을 전달 받으면 이를 파싱하여 DOM 노드로 이루어진DOM 트리를 생성한다
(2) CSS파일과 각 엘리먼트의 inline 스타일을 파싱, 스타일 정보를 사용해서 Render 트리를 생성한다
(3) 이 노드 스타일을 동기적으로 attachment하고 렌더 트리가 다 만들어지면 레이아웃(reflow) 과정을 통해 노드들에 스크린의 좌표가 주어지며 위치가 정해진다
(4) 렌더링이 끝나면 paint() 메소드를 통해 렌더링된 요소들에 색을 입힘

그렇다면 왜 Virtual DOM은 효율적인걸까?

  • DOM을 직접 조작한다면 그 때마다 레이아웃의 재계산과 리렌더링이 일어날 것
  • 이 변화가 일어날 때 Virtual DOM에서 계산한다면 이 DOM은 가상 DOM이기 때문에 렌더링되지 않고, 그렇기 때문에 연산 비용의 절감 효과가 있다
  • Virtual DOM은 DOM fragment를 관리하는 과정을 자동화 및 추상화하고 어떤 부분이 바뀌었는지를 파악해준다

velopert님 블로그를 참조함

2. useMemo와 useCallback

(1) useMemo

1
const memoizedValue = useMemo(() => computeExpensiveValue(a, b), [a, b]);

메모이제이션된 값을 반환합니다 (React 공식 문서)

  • 복잡한 함수의 return값을 기억해야 할 때 사용
  • 렌더링 중에 실행되므로 사이드 이펙트가 일어나는 것을 useMemo로 처리해선 안된다 → useEffect()를 사용할 것!

(2) useCallback

1
2
3
const memoizedCallback = useCallback(() => {
doSomething(a, b);
}, [a, b]);

메모이제이션된 콜백을 반환합니다 (React 공식 문서)

  • 불필요한 렌더링을 방지하기 위해 설계된 함수
  • 의존성을 갖는 reference(여기서는 [a, b])가 변경되었을 때 실행됨

→ 사실 useMemo()나 useCallback()은 (렌더링 최적화를 위해 사용 가능하지만) 이제 useState()와 useEffect()로 거의 다 처리할 수 있다

참고자료: React.memo() 현명하게 사용하기

3. 리렌더링의 조건

  • React에서 렌더 순서는 App → 부모 → 자식 순
  • React에서 마운트 순서는 자식 → 부모 → App 순
  • React는 컴포넌트의 상태가 변하면 컴포넌트의 리렌더링을 발생시킨다
    • 자신의 상태가 변경될 때
    • 부모 컴포넌트가 리렌더링 될 때
    • 자신이 전달받은 props가 변경될 때
    • forceUpdate()가 실행될 때

4. 자바스크립트의 실행 컨텍스트

참고 페이지

  • 실행 컨텍스트란 실행 가능한 코드를 형상화하고 구분하는 추상적 개념으로 코드가 실행되기 위해 필요한 환경
  • 실행 가능한 코드는 전역 코드, Eval 코드, 함수 코드로 나뉜다

(1) 실행 컨텍스트의 실행 과정

  • 컨트롤이 실행 가능한 코드로 이동하면 새 실행 컨텍스트가 생성된다
  • 전역 코드로 컨트롤이 진입하면 전역 실행 컨텍스트가 생성되고 실행 컨텍스트 스택에 쌓인다(이 전역 실행 컨텍스트는 웹페이지를 나가거나 브라우저를 닫을 때 까지 유지됨)
  • 함수를 실행하면 해당 함수의 실행 컨텍스트가 생성되고 직전에 실행된 코드 블록의 실행 컨텍스트 위에 쌓인다
  • 함수 실행이 끝나면 실행 컨텍스트를 파기하고 직전의 실행 컨텍스트에 컨트롤을 반환

(2) 실행 컨텍스트의 구조

  • 실행 컨텍스트는 변수 객체(Variable Object), 스코프 체인, this로 이루어져 있다
  • 변수 객체는 변수, 매개변수, 인수정보, 함수 선언 등을 담고 있다
  • 전역 컨텍스트는 전역 함수와 전역 변수를 가지고, 함수 컨텍스트는 매개변수 객체와 내부 함수, 지역 변수를 갖는다
  • 스코프 체인은 해당 전역/함수 컨텍스트가 참조할 수 있는 변수, 함수 선언 등의 정보를 담고 있는 전역 객체, 활성 객체의 리스트를 가리킨다
  • 실행 컨텍스트 스택 내 활성 객체를 선두로 리스트의 마지막은 당연히 전역 객체를 가리킨다
  • 자바스크립트 엔진은 스코프 체인을 통해 렉시컬 스코프(함수가 중첩될 때 상위 스코프를 따라 올라가는 것)를 파악한다
  • 자바스크립트의 함수는 호출 될 때 매개변수 인자 이외에 arguments 객체와 this를 전달 받는다
  • this는 어떤 스코프에 위치해 있느냐에 따라 다른데 전역 객체에 있다면 this는 window(브라우저), global(Node.js) 객체를 의미한다
  • 메소드의 내부함수나 콜백의 경우에도 this는 전역 객체에 바인딩 된다
  • 함수가 객체의 프로퍼티 값이라면 메서드로 호출되는데, 이 메서드 내부의 this는 해당 메서드를 호출한 객체에 바인딩된다
  • new 연산자로 생성자를 호출할 경우 자바스크립트는 빈 객체를 먼저 생성하여 this를 바인딩하고 바인딩된 this를 통해 프로퍼티를 생성하여 객체를 리턴한다

5. 클로저

  • 함수를 일급 객체로 취급하는 함수형 프로그래밍 언어에서라면 클로저가 사용된다
  • 클로저는 반환된 내부함수가 자신이 선언되었을 때의 환경인 스코프를 기억하고 자신이 선언됐을 때의 스코프 밖에서 호출되어도 그 스코프에 접근할 수 있는 함수를 말한다
  • 말이 어려운데 클로저는 함수 안에 함수가 있게 되면 기본적으로 생성된다
  • 그렇게 되면 자연스레 스코프 체인이 형성될 텐데 이 스코프 체인이 형성될 때 변수 값들을 보존하고 기억하게 된다 (이는 메모리에서 해당 함수가 없어질 때까지 존재함)

6. 이벤트 루프와 이벤트 버블링, 이벤트 위임

참고 페이지: 이벤트 버블링, 이벤트 캡처 그리고 이벤트 위임까지

  • 이벤트 버블링은 특정 화면 요소에 이벤트가 발생했을 때 해당 이벤트가 더 상위의 화면 요소들로 전달되는 특성 → 이는 HTML요소가 트리 구조를 가지기 때문
  • 이런 버블링은 stopPropagation()을 통해 막을 수 있다
  • 이벤트 캡쳐는 이와 반대 방향으로 진행되는 전파 방식
  • 하위 요소에 각각 이벤트를 붙이지 않고 상위 요소에서 하위 요소의 이벤트를 제어하기 위한 것이 이벤트 위임

7. promise, async, await

자바스크립트에서 비동기 처리란?

  • 특정 로직의 실행이 끝날때 까지 기다리지 않고 나머지 코드를 먼저 실행하는 것
  • 이를 해결하기 위해 콜백 함수를 사용했었음
  • promise는 이 비동기 처리에 사용되는 객체로 Pending(대기), Fulfilled(이행), Rejected(실패)의 3가지 상태를 가진다
  • new promise()가 호출되면 대기 상태가 되며 첫번째 매개변수로 콜백 함수를 선언할 수 있으며 이 콜백 함수는 resolve와 reject 인자를 가진다
  • resolve가 실행되었을 때에 이행 상태가 되고 reject가 실행되었을 때 실패 상태가 된다
  • 이행 상태가 된다면 then()을 사용하여 처리 결과 값을 받을 수 있고 실패 상태가 된다면 catch()로 처리 결과 값을 받을 수 있다

비동기 처리 패턴에 사용되는 async와 await

  • 코드의 순서를 보장하기 위해 사용하는 예약어(async)와 연산자(await)
  • await의 처리 코드는 promise를 반환해야 한다
  • async와 await의 예외를 처리하려면 try catch문을 사용해야 한다

8. 자바스크립트의 가비지 컬렉션

  • 자바스크립트는 도달 가능성(reachability)이라는 개념을 사용해 메모리를 관리한다
  • 가비지 컬렉터는 루트 정보를 수집하고 이를 기억한다
  • 루트가 참조하고 있는 모든 객체를 방문하고 이것들을 기억한다
  • 기억한 모든 객체에 방문하여 그 객체가 참조하는 객체까지 기억한다 (한 번 방문하면 다시 방문하지 않음)
  • 루트에서 도달 가능한 모든 객체를 방문할 때까지 반복한다
  • 이 때 기억되지 않은 모든 객체를 메모리에서 삭제
  • 최적화 기법으로 세대별 수집(새로운 객체/오래된 객체로 나누어 감시), 점진적 수집(가비지 컬렉션을 나누어 수행), 유휴 시간 수집(CPU가 유휴 상태일 때만 실행) 기법을 사용함

9. www.google.com을 입력 했을 때 일어나는 일

잘 정리된 문서가 있으므로 링크만 남김

10. 브라우저가 display: none;을 처리하는 법

참고 페이지 : 렌더링 트리 생성, 레이아웃 및 페인트

  • DOM과 CSSOM 트리는 결합해 렌더링 트리를 형성
  • 페이지를 렌더링하는 데 필요한 노드만 포함시킴
  • 레이아웃을 통해 위치와 크기 계산
  • 페인트 및 픽셀 렌더링

이 때 display: none;은 요소가 보이지 않고 레이아웃에도 포함되지 않도록 렌더링 트리에서 요소가 완전히 제거됨 (visibility: hidden은 레이아웃에서 공간을 차지함)

Comment and share

새롭게 깃헙 블로그를 만들어보았다 w/ hexo

1. 블로그를 시작하게 된 이유

  • 첫째, 매일 커밋을 하고 있지만 정작 눈에 띄게 남는 것이 보이지 않아서
  • 둘째, 앞으로 코딩 테스트를 준비함에 있어 알고리즘은 똑부러지게 정리를 해야 할 것 같아서
  • 셋째, 책을 읽고 정리하는데 하나의 Readme.md로는 부족했기 때문에 (이 부분은 리팩토링 2판 페이지를 참조)

2. hexo를 택한 이유

  • Javascript가 익숙한 언어이고 cli도 잘 되어있으면서 무엇보다 hexo 공식문서가 어느정도 한글을 지원하고 있어 사용하기에 편할 것이라는 생각에 선택하게 됨

3. 앞으로 올릴 것들 및 올 한해 포부 등

  • 자료구조 및 알고리즘 관련 내용을 매일같이 공부하고 공부한 만큼 업데이트를 할 예정
  • 공부하는 도중에 둘러보는 UI/UX 디자인 페이지와 새 기술 등에 관련된 내용도 정리할 예정
  • 올해에는 원하는 회사에 취업하기!

Comment and share

  • page 1 of 1

Harry Kim

author.bio


author.job