The RED: Back to the Basics - 프레임워크보다 기본기 === ###### tags: `석기` --- :::info 1강, 2강은 너무 잡다한 배경 이야기라 정리하지 않았습니다. ::: --- ## Browser 웹 페이지를 표현하는 방법 ### 웹 브라우저 #### 웹 페이지 로드 과정 ![](https://i.imgur.com/FaAfIlr.png) - Prompt for unload - 다른 페이지로 이동시 발생. - `unload` 라는 이벤트가 발생하면, 현재 있던 페이지를 `unload`를 시킨다. - `window.beforeunload` 함수를 통해 `페이지를 나가시겠습니까?` 대화 창이 뜨는 원리. - Redirect - 요청한 URL에서 redirect를 시킬때 발생. - 노란색 부분은 전부 network단계에서 일어남. JS 동작은 없다. - AppCache - 실제로 서버에서 데이터를 가져오기 전에, 브라우저 캐시에 저장된 정보가 있는지 확인. - Processing - 웹 페이지에 필요한 정보들 파싱. 렌더링을 모두 포함한 것! - `domInteractive`, `domComplete` - `document.readystatechange`에 관련된 함수. 찾아보세욥. #### 브라우저 주요 구성 요소 <img src="https://i.imgur.com/kF7xiHF.png" width='50%'/> <img src="https://i.imgur.com/W9uzxUI.png" width='50%' /> #### 렌더링 엔진의 동작 과정 ![](https://i.imgur.com/FYip72n.png) 1. 파싱 - HTML를 분석하고 이해. - script를 만나면 파싱 멈추는 이유 - `document.write` 를 통해서 HTML에 영향을 끼칠 수 있기 때문에. - 그래서 script 태그를 맨 끝에 두라는 것임! 2. DOM, CSSOM 변환 - 변환과정. - 문법적인 해석을 마쳤다면, 실제로 사용할 수 있도록 메모리에 객체적인 구조로 변환. - 브라우저가 사용할 수 있도록! 3. 렌더 트리 구축 - 각 엘리먼트가 css에서 정의한 특성을 머금게. 4. 렌더 트리 배치 (Layout 단계) 5. 렌더 트리 그리기 - 픽셀 단위로 그린다. (Paint 단계) - 여러 레이어 합성. (Compositing 단계) - 브라우저 내부에서 화면을 몇가지 레이어로 구분하는데, 그 레이어다. (z index 아님.) :::success ==이 모든 과정이 점진적으로 진행된다.== - 한것들을 먼저 미리 보여주는 의미. - 더 나은 사용자 경험을 위해! ::: --- ## HTML5은 어떤 의미인가 ### Semantic HTML - HTML 본연의 목적에 해당된다! - ==**HTML 엘리먼트와 속성, 속성값은 특정한 의미를 지니도록 정의되어있다.**== - 의미를 가진 태그를 사용. **참고** ![](https://i.imgur.com/O8TZ5zy.png) 1. 점진적 향상 - 필수적인 정보 2. 우아한 성능 저하 - 꼭 필요하지 않는 정보. --- ## CSS3은 없다 <center><img src="https://i.imgur.com/RqX7qUb.png" width="50%"/></center> ### Layout <center><img src="https://i.imgur.com/yqoC7kP.png" width="50%"/></center> ### Flex <center><img src="https://i.imgur.com/003hicd.png" width="50%"/></center> - 부모에 flex 속성 부여. <center><img src="https://i.imgur.com/VDqUpiZ.png" width="50%"/></center> - 해당 부모에 자식들은 자동적으로 flex가 먹음. <center><img src="https://i.imgur.com/QUFw7tl.png" width="50%"/></center> - default가 `flex-direction: row` 인데, 이 **row**는 물리적인 값이 아니라 **논리적인 값**. - **row가 화면에서 수평방향이라고 생각하지 말자.** - 즉, **==글쓰기 방향==과 일치한다.** ==**정리**== <center><img src="https://i.imgur.com/JvEt55E.png" width="90%"/></center> ### 논리적 프로퍼티와 값 <center><img src="https://i.imgur.com/CacagzI.jpg" width="100%"/></center> - 다국어 지원 예정인 서비스라면 무조건 고려해야하는 사항이다! ### 선택자 <center><img src="https://i.imgur.com/wOOXxVH.png" width="80%"/></center> ![](https://i.imgur.com/UgjfdSY.png) - 엘리먼트 선택자 - 타입 선택자: HTML를 바로 선택 - 수도 엘리먼트: **가상 엘리먼트**, 콜론이 두개! - 속성 선택자 - 아이디 / 클래스 선택자: 직접 선정. - 수도 클래스: 실제로는 없지만 / _특정 상황에서 적용되는 속성들._ - 속성 클래스: 해당하는 모든 태그들에 적용. ### 마진 병합 <center><img src="https://i.imgur.com/oSF0wiE.png" width="80%" /></center> - 수직으로 인접한 마진이 더 큰쪽으로 병합되는 현상. - 위와 같은 상황에서 `Child` 가 `Parent` 안에 들어가게 된다면 어떻게 될까? ==아마도 이렇게 예상하겠다.== <center><img src="https://i.imgur.com/UBwjrAV.png" width="50%" /></center> ==**하지만, 실제는 아래와 같다.**== <center><img src="https://i.imgur.com/dR9ZfKf.png" width="50%" /></center> **아래 설명 참고** ![](https://i.imgur.com/Xu4FUyP.png) - `Parent`의 마진이 `Child` 에 포함되었다. --- ## Javascript 자주 하는 실수부터 콜백 지옥까지 ### 어휘적 환경 - Lexical Environment <center><img src="https://i.imgur.com/xjXIbPR.png" width="60%" /></center> - Lexical Environment: 변수나 함수, 식별자가 어떤 값을 가지고 있는지 볼 수 있는 곳. <center><img src="https://i.imgur.com/wg9azvY.png" width="70%" /></center> - Global Lexical Env - 2가지 값이 존재한다. - Env Record: 전역 식별자들의 정보들이 저장됨. - outer: 나보다 밖에 있는 Lexical Env ... 전역이므로 null. ### 실행 컨텍스트 - Execution Context #### 정의 - 자바스크립트 코드가 실행되는 환경. - 모든 자바스크립트 코드는 실행 컨텍스트 내부에서 실행된다. - 3가지 종류가 있다. <center><img src="https://i.imgur.com/tiTdLNl.png" width="60%" /></center> ==**모든 스크립트 코드는 전역 실행 컨텍스트에서 실행된다**== 1. 전역 실행 컨텍스트 2. 함수 실행 컨텍스트 3. eval 함수 실행 컨텍스트 - 문자열로 된 자바스크립트 코드를 전달하면 수행... 없다고 생각해라 :::success 예시 코드를 보며 정리해보자. ::: <center><img src="https://i.imgur.com/oXfPpZH.png" width="70%" /></center> ![](https://i.imgur.com/8nTbNPh.png) - 8번째 줄을 수행하고 나서야 비로소 `hello` 함수의 실행 컨텍스트가 생성된다. - 그 전에는 전역 실행 컨텍스트만 존재하는 것. - 먼저 **전역 실행 컨텍스트**가 어떤 것들로 구성되어 있는지 살펴보자. ![](https://i.imgur.com/o6T22ny.png) - **모든 실행 컨텍스트의 ==구조==는 같다.** - 실행 컨텍스트는 **3가지**로 구성되어 있다. - Function - 해당 실행 컨텍스트가 함수의 실행으로 만들어진 것이라면, 그 함수 객체를 가르킨다. - 전역 실행 컨텍스트는 함수의 실행으로 발생한 것이 아니므로 `null`. - Lexical Env - 실행되는 환경의 정보를 가지고 있다. - Env Record(아래 찐한 파랑색 2개 박스)와 outer(청록색 박스)로 구성되어 있다. <img src="https://i.imgur.com/Y6o1vHA.png" width="60%"/> - 전역 컨텍스트에서 코드를 수행할때, 2번째줄, 8번째줄처럼 변수나 함수를 찾으면, 실행 컨텍스트는 Lexical Env를 참고하여 수행한다. - **전역 컨텍스트의 함수를 더 자세히 알아보자 (찐한 파랑 2번째 박스)** - **함수**는, **실행 컨텍스트**를 만들 수 있는 객체이기 때문에, 특별한 것을 만든다. ![](https://i.imgur.com/NPO5Cre.png) - Environment라는 속성을 만든다. - 이 공간에는 자신이 선언될때, 만들어질때 속해있던 Env record를 적어둔다. - 즉, 전역 컨텍스트 Lexical Env와 같다. ![](https://i.imgur.com/Qv9wFMj.png) - **8번째 줄에서 `hello` 함수를 실행했을때, 아래처럼 동작한다.** <center><img src="https://i.imgur.com/vWiSuXs.jpg" width="70%"></center> - `hello` 함수 내부의 Function은 자기 자신을, - `hello` 함수 실행 컨텍스트의 Lexical Env의 outer는 전역 컨텍스트의 Lexical Env를 가르킨다. - Variable Env ### 어휘적 범위 - Lexical Scope ![](https://i.imgur.com/QOAPt50.png) - 5번째 줄에서 `greeting` 변수에 접근 할 수 없다. - 해당 변수는 2 ~ 4번쨰 줄에서만 접근 가능하니까. ### 클로저 - Closure ![](https://i.imgur.com/cebQmrx.png) - 9번째 줄에서 `hello` 함수를 사용하게 된다면 `hello` 실행 컨텍스트가 생성된다. ![](https://i.imgur.com/5hSDBTP.jpg) - `hello` 함수는 익명 함수를 반환한다. - 반환된 함수는 전역 컨텍스트의 `say` 에 저장된다. - 즉, ==9번째 줄 `hello` 함수가 반환하는 4~6번째 줄이 `say` 에 저장된다.== #### 그 `say` 함수를 실행한다면? - 해당 함수의 env 속성은 say 실행컨텍스트의 outer이다. ![](https://i.imgur.com/E5v6SMu.png) - 10번쨰 줄에서 함수가 실행되면, - 4~5 번째 줄이 실행된다. - greeting 변수를 찾는다. - 하지만 현재 `say` 함수의 실행 컨텍스트에는 `greeting` 변수가 존재하지 않는다. - 그래서 `outer` 를 참고한다. - `outer`는 `hello` 실행 컨텍스트이기 때문에, 해당 실행 컨텍스트에서 찾는다. - 정상적으로 출력된다! #### 주의할 점 - 함수의 실행 컨텍스트는, 해당 함수가 실행하면서 발생하고, 함수가 종료되면 사라진다. - 따라서 `hello` 실행 컨텍스트는 9번째 줄에서 `hello` 를 실행하고 사라져야함. - 하지만 그렇지 않다. - 왜?) `say` 라는 전역 컨텍스트에 `hello` 실행 컨텍스트가 참조되어 있기 때문에 없어지지 않는다. - 10번째 줄에서 `say` 를 수행하며 참조한다. #### 신기방기 - 11번째줄에서 `hello` 를 또 실행해도, 10번째 줄에서 생성한 실행 컨텍스트와 다르다. - 함수의 실행 컨텍스트는 함수를 실행할때마다 새롭게 생성되기 떄문이다. #### 정리 - 함수는 자기 자신이 선언될떄의 Lexical env를 env 변수에 저장하고 있다가 - 실행 컨텍스트를 생성할때 outer에 그걸 넣어둔다. - 따라서 자기가 속해있던 실행 컨텍스트를 참조할 수 있다. ### 비동기 자바스크립트 - 자바스크립트의 동작 원리 - 싱글 스레드 언어. - 이벤트 루프를 통해 비동기 처리. - 콜백 지옥 #### 이벤트 루프 - 동시성 처리 모델의 기본 원리. - [이 곳](https://velog.io/@ghdtjrrl94/FE-%EC%A7%80%EC%8B%9D5.-Callstack%EA%B3%BC-Event-Loop)에 잘 정리해 두었음. #### Promise, async, await ##### Promise ![](https://i.imgur.com/2dgWDq0.png) - 역시 콜백을 쓰지만, 콜백 지옥을 완화해준다. - then은 성공시, catch는 실패시에 쓰도록 하자. - then에서 2번째 인자로 실패시 사용은 가능하다.