<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>bow_.log</title>
        <link>https://velog.io/</link>
        <description>이녀석공부해야지</description>
        <lastBuildDate>Fri, 11 Nov 2022 08:01:52 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>bow_.log</title>
            <url>https://velog.velcdn.com/images/river_kim_/profile/1faf451a-02d7-473b-9c32-6751ca0f50cb/social_profile.jpeg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. bow_.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/river_kim_" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[Naver 지도를 만들어보자!]]></title>
            <link>https://velog.io/@river_kim_/Naver-%EC%A7%80%EB%8F%84%EB%A5%BC-%EB%A7%8C%EB%93%A4%EC%96%B4%EB%B3%B4%EC%9E%90</link>
            <guid>https://velog.io/@river_kim_/Naver-%EC%A7%80%EB%8F%84%EB%A5%BC-%EB%A7%8C%EB%93%A4%EC%96%B4%EB%B3%B4%EC%9E%90</guid>
            <pubDate>Fri, 11 Nov 2022 08:01:52 GMT</pubDate>
            <description><![CDATA[<p><a href="https://i.ytimg.com/vi/QbH-6U7Vlk4/maxresdefault.jpg">출처-[빠더너스 유튜브]</a></p>
<p></br></br>
오늘은 <strong>작은 프로젝트</strong>를 만드는데 가장 중요한 내용인 네이버 맵 API를 사용할 거다. 근데 내용을 짧게 할 거임</p>
<p>일단 <a href="https://console.ncloud.com/">네이버 클라우드 플랫폼</a> 여기에서 가입하고 </p>
<p><strong>Web Dynamic Map</strong>을 사용할 수 있게 만들고 인증 키를 복사하는 것까지 만드셈</p>
<h1 id="😒">😒</h1>
<p>우선 네이버 맵을 쓸 파일 하나 만들어준다 근데 바로는 안 할 거임</p>
<p>나는 지난번에 리액트를 타입 스크립트 형태로 패키지 설치를 했다.
tsx을 쓸 거란 말</p>
<p>우선 <code>index.html</code>파일에 해당 내용을 넣어준다</p>
<h1 id="일반적인-순서">일반적인 순서</h1>
<p></br></br></p>
<pre><code class="language-html">&lt;head&gt;
  &lt;meta charset=&quot;utf-8&quot; /&gt;
  &lt;script type=&quot;text/javascript&quot; src=&quot;https://openapi.map.naver.com/openapi/v3/maps.js?ncpClientId=인증키&quot;&gt;&lt;/script&gt;
  &lt;title&gt; Map&lt;/title&gt;
&lt;/head&gt;
</code></pre>
<p><strong>복붙만 하지말고 인증키 내용은 바꿔주자</strong> 그리고 라이브러리 하나를 설치해주자
</br></br></p>
<blockquote>
<p><code>npm i -D @types/navermaps</code></p>
<p>라이브러리는 클라이언트 폴더에 설치해야한다 
<code>npx create-react-app 폴더명 --template typescript</code>으로 패키지 설치했던 폴더 안에 라이브러리 설치해야한다.</p>
</blockquote>
<p>다음으로 map을 생성, 조작할 파일 내용을 입력한다
</br></br></p>
<pre><code class="language-js">export default function NaverMap() {
  let map: naver.maps.Map;
  const center: naver.maps.LatLng = new naver.maps.LatLng(
    37.3595704,
    127.105399
  );

  map = new naver.maps.Map(&quot;map&quot;, {
    center: center,
    zoom: 16,
  });

  return (
    &lt;&gt;
      &lt;div id=&quot;map&quot; /&gt;
    &lt;/&gt;
  );
}
</code></pre>
<p>완성 !</p>
<p></br></br></p>
<h3 id="좋다-좋니">좋다. ..좋니?</h3>
<p></br></br>
인증키도 발급받아 스크립트에 넣었고 라이브러리도 설치했고 맵을 생성해서 html id로 전달해서 div에 id 값을 넣어 지도를 만들었다!</p>
<p>이제 실행시켜보면?</p>
<p><img src="https://velog.velcdn.com/images/river_kim_/post/2bf66e87-a589-4eb4-92f9-746d85008251/image.png" alt="">
🤬
<code>Uncaught TypeError: Cannot read properties of null (reading &#39;style&#39;)</code>
이라는 오류가 뜬다 </p>
<p></br></br></br></p>
<h1 id="왜-외-웨">왜? 외? 웨?</h1>
<p>이유야 여러 가지일 듯</p>
<ol>
<li><p>브라우저가 html 파싱하고 dom 트리를 구성하면서 id 값인 map을 불러올 때 아직 스크립트가 참조를 못해서 표시가 안될 수도 있다.</p>
</li>
<li><p>리액트 메인 페이지를 렌더링 했을 때 리액트가 마운트 되기 전이라서 
즉, 리액트가 장착되기 전에 네이버 api 코드가 실행되면서 id 값인 &#39;map&#39;이 없기 때문에 오류가 남</p>
</li>
</ol>
<p>그러면 렌더링 이후에 하면 되겠다!라고 생각하면 당신은 멋진 사람이다.
</br></br></br></br></br></br></p>
<h1 id="해결방법-중-한가지">해결방법 중 한가지</h1>
<p>사실 두 개임 근데 다시 이런 현상을 막고자 하나는 예방하자는 거임</p>
<p><code>index.html</code>에서 순서를 바꾸어주자</p>
<pre><code class="language-html">&lt;body&gt;
  &lt;div id=&quot;root&quot;&gt;&lt;/div&gt;
  &lt;script type=&quot;text/javascript&quot; src=&quot;https://openapi.map.naver.com/openapi/v3/maps.js?ncpClientId=인증키&quot;&gt;&lt;/script&gt;
&lt;/body&gt;</code></pre>
<p>왜 바디 안에 넣었냐면 브라우저가 html 파싱하고 dom 트리를 구성하면서</p>
<p>id 값인 map을 불러올 때 아직 스크립트가 참조를 못해서 표시가 안될 수도 있다.</p>
<p>방금처럼 같은 이유라고 볼 수 있다 근데 이거는 거의 안 그럴 듯</p>
<p></br></br></br></p>
<p><code>naverMap.tsx</code>에서도 코드 내용을 수정해 주자 그리고 옵션을 바꾸자!</p>
<pre><code class="language-js">import { useEffect } from &quot;react&quot;;

export default function NaverMap() {

  useEffect(() =&gt; {
    let map = null;
    const initMap = () =&gt; {
      // naver.maps.Map(mapDiv, mapOptions)
      //    ㄴ&gt; mapDiv : 지도를 삽입할 HTML 요소 또는 HTML 요소의 id , mapOptions : 지도의 옵션 객체
      map = new naver.maps.Map(&quot;map&quot;, {
        //center : 좌표 / naver.maps.LatLng : 좌표 입력함수
        center: new naver.maps.LatLng(37.43968, 127.12779),
        zoom: 18, //확대 7~21 까지 최소,최대
      });
    };
    initMap();
  }, []);

  const mapStyle = {
    width: &quot;100%&quot;,
    height: &quot;300px&quot;,
  };

  return (
    &lt;&gt;
      &lt;div id=&quot;map&quot; style={mapStyle} /&gt;
    &lt;/&gt;
  );
}
</code></pre>
</br>

<p>그럼 확인해본다람쥐</p>
<p><img src="https://velog.velcdn.com/images/river_kim_/post/f9d1cee9-53c3-4404-94e6-67614c767e26/image.png" alt=""></p>
<h1 id="캬-👍">캬 👍</h1>
<p>참고로 좌표 바꾼 곳이 우리 집임 진짜 우연히도 네이버랑 일하기 가까운 곳이네.. </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[React 초기설정을 해주자!]]></title>
            <link>https://velog.io/@river_kim_/React-%EC%B4%88%EA%B8%B0%EC%84%A4%EC%A0%95%EC%9D%84-%ED%95%B4%EC%A3%BC%EC%9E%90</link>
            <guid>https://velog.io/@river_kim_/React-%EC%B4%88%EA%B8%B0%EC%84%A4%EC%A0%95%EC%9D%84-%ED%95%B4%EC%A3%BC%EC%9E%90</guid>
            <pubDate>Fri, 11 Nov 2022 06:00:30 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/river_kim_/post/2f931b6b-fa28-4887-9024-8d6bf542f597/image.png" alt=""></p>
<p>( <a href="https://velog.io/@river_kim_/%EC%84%9C%EB%B2%84%EC%99%80-%ED%81%B4%EB%9D%BC%EC%9D%B4%EC%96%B8%ED%8A%B8%EB%A5%BC-%EB%A7%8C%EB%93%A4%EC%9E%90">서버와 클라이언트를 만들자 편</a>을 참고 )</p>
<p>오늘은 리액트 ( 타입 스크립트 ) 프로젝트를 설치했을 때</p>
<p>처음에 무엇을 건드려야 할지 모를 때 간단한 가이드임</p>
<p>참고로 아무것도 없는 상태로 만드는 가이드라서 기술적인 부분은 없다.</p>
<p>프로젝트를 설치했다면 요런것들이 생겼을것이다.</p>
<p><img src="https://velog.velcdn.com/images/river_kim_/post/b8ee097c-f471-4c5b-8139-e59e6b9d5d7d/image.png" alt=""></p>
<p>여기서 <code>Public &gt; index.html</code> <code>src &gt; index.tsx</code> 파일을 제외한 나머지를 삭제</p>
<p><img src="https://velog.velcdn.com/images/river_kim_/post/eaa6b1bc-7afe-449f-85ac-95d5dad96f93/image.png" alt=""></p>
<p>요렇게 남게된다. 그러면 <code>npm start</code>로 실행해본다면?</p>
<p><img src="https://velog.velcdn.com/images/river_kim_/post/3592f835-4fb4-49ba-9f54-a5dc2c3e94e8/image.png" alt=""></p>
<p>오류가 있다. 사실 저 한 줄 말고도 없애줘야 할 게 더 있음</p>
<p>먼저 <code>index.html</code>파일부터 보면 </p>
<p><img src="https://velog.velcdn.com/images/river_kim_/post/6938e279-1be2-4911-bc43-f86ae88952be/image.png" alt="">
맨 위 한 줄 빼곤 다 필요가 없다. <code>&lt;meta charset=&quot;utf-8/&gt;</code> </p>
<p>아이콘부터 뭐 할지 정할 것도 아니고 디바이스 화면을 어떻게 할지,</p>
<p>테마 색상, 설명, 모바일 처음부터 설정해 주면 좋긴 하겠지만</p>
<p>나 같은 주니어+주니어인 쮸니어인 나에게 미루어야 할 일이다</p>
<p>그리고 <code>index.tsx</code>파일로 가보자</p>
<p><img src="https://velog.velcdn.com/images/river_kim_/post/889ecd6b-3118-4b21-9d49-cceab3e9a6b8/image.png" alt=""></p>
<p>파일 없는걸 import 받으려고 하니 에러가 난 모양이다.</p>
<p>필요 없는 걸 삭제하면 이렇게 바뀐다.</p>
<pre><code class="language-js">import React from &#39;react&#39;;
import ReactDOM from &#39;react-dom/client&#39;;


const root = ReactDOM.createRoot(
  document.getElementById(&#39;root&#39;) as HTMLElement
);
root.render(
  &lt;React.StrictMode&gt;

  &lt;/React.StrictMode&gt;
);
</code></pre>
<p>이제 웹브라우저에서 확인해 보면 아무것도 없는 페이지가 완성이 되었다.!</p>
<p>그래도 아무것도 없으니까 허전하니 아주 중요한 메세지를 띄워야겠다.</p>
<p><img src="https://velog.velcdn.com/images/river_kim_/post/d03bedbe-dfd5-42f5-a0dd-dbc9ee684d90/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/river_kim_/post/8beab6df-db18-410a-8142-c78b30955718/image.png" alt=""></p>
<h2 id="굿-👍">굿 👍</h2>
]]></description>
        </item>
        <item>
            <title><![CDATA[서버와 클라이언트를 만들자]]></title>
            <link>https://velog.io/@river_kim_/%EC%84%9C%EB%B2%84%EC%99%80-%ED%81%B4%EB%9D%BC%EC%9D%B4%EC%96%B8%ED%8A%B8%EB%A5%BC-%EB%A7%8C%EB%93%A4%EC%9E%90</link>
            <guid>https://velog.io/@river_kim_/%EC%84%9C%EB%B2%84%EC%99%80-%ED%81%B4%EB%9D%BC%EC%9D%B4%EC%96%B8%ED%8A%B8%EB%A5%BC-%EB%A7%8C%EB%93%A4%EC%9E%90</guid>
            <pubDate>Thu, 10 Nov 2022 08:01:06 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/river_kim_/post/7d0849ae-7799-4767-98ab-28615a0dfdef/image.png" alt=""></p>
<p>오늘은 작은 프로젝트를 만들기 위해 초기 세팅을 해주자!</p>
<p>먼저 VSCode로 폴더를 만들어준다!</p>
<p>구조는 서버 폴더 &gt; 클라이언트 폴더로 구성할 거니까 서버 폴더부터 만들어주자
</br></br></p>
<p><img src="https://velog.velcdn.com/images/river_kim_/post/53f3c3d7-d546-4f01-b5b9-f7e6f3bd6bc0/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/river_kim_/post/cff0d6f2-6621-464c-b101-eee0a5dd6278/image.png" alt=""></p>
<p>다른 건 그냥 엔터로 넘어가도 된다 하지만 entry point는 서버를 구성할 파일과 같은 이름으로 만들어준다
</br></br>
</br></br></p>
<p><img src="https://velog.velcdn.com/images/river_kim_/post/8f2ac7b4-0e34-4d42-a921-e3e5f4446ff6/image.png" alt=""></p>
<p>인스톨하면 알아서 설치해 준다 서버를 구성하는 데 도움을 주는 라이브러리이다.
</br></br>
</br></br></p>
<p><img src="https://velog.velcdn.com/images/river_kim_/post/6b6f9777-efd5-4a6d-872a-2812f76bfa42/image.png" alt=""></p>
<p>서버를 조작할 파일을 하나 만들어준다.</p>
<p></br></br>
</br></br></p>
<p>이제 서버 폴더의 기본 구조는 완성했으니 클라이언트 폴더를 만들어주자
</br></br></p>
<p><code>npm create-react-app</code> 
그리고</p>
<p><code>npx create-react-app 자유작명</code> 또는 타입 스크립트로 사용하려면</p>
<p><code>npx create-react-app 자유작명 --template typescript</code> 로 만들어 준다.</p>
<h6 id="나의-경우는-typescript-선택했다">나의 경우는 typeScript 선택했다.</h6>
<p>설치가 완료되면 클라이언트 폴더로 다시 열어도 좋지만 귀찮으니 터미널 창에서 </p>
<p><code>cd 폴더이름</code>으로 이동 후 <code>npm run build</code>로 <code>Html</code>문서를 합쳐주는 작업을 해준다.</p>
</br>

<p>그리고 아까 만든 <code>server.js</code>에서 </p>
<pre><code class="language-js">const express = require(&#39;express&#39;);
const path = require(&#39;path&#39;);
const app = express();

app.use(express.static(__dirname+&#39;/&lt;폴더이름&gt;/build&#39;))

app.get(&#39;/&#39;,(res,req)=&gt;{
    req.sendFile(&#39;index.js&#39;)
})


app.listen(8080, function () {
  console.log(&#39;listening on 8080&#39;)
}); </code></pre>
<p>를 작성하여 서버를 켤 준비를 해준다 8080으로 접속하면 <code>build/index.js</code> 파일을 실행시켜주는 것이다!</p>
<p>실제로 클라이언트 폴더에 가서 경로로 따라가면 해당 파일이 있다.</p>
<p>이제 서버를 실행하여 확인해보자! 그 전에 나는 터미널에서 <code>cd 폴더이름</code> 으로 이동했으니 다시 그전 폴더로 이동시켜야 한다.
그래야 서버 폴더에서 서버를 실행하는 거니까 </p>
<p><code>cd..</code> 해주면 됨</p>
<p><code>node server.js</code>으로 서버를 실행하면 터미널 창에서 해당 콘솔 내용이 출력 된다.</p>
<pre><code class="language-js">app.listen(8080,function(){
  console.log(&#39;listening on 8080&#39;);
});</code></pre>
<p>이제 클라이언트에서 실행하는 게 아니라 서버에서 실행하면 클라이언트 파일이 나온다는 걸 알 수 있다</p>
<p><img src="https://velog.velcdn.com/images/river_kim_/post/374cb741-63ef-4e9a-8925-4f58cb849953/image.png" alt=""></p>
<p>그리고 웹 브라우저를 열어 <code>localhost:8080</code> 을 입력해서 들어가 보면 !?</p>
<p><img src="https://velog.velcdn.com/images/river_kim_/post/6409c35b-048d-4136-b245-37d0f4b9ecb7/image.gif" alt=""></p>
<h2 id="굿--👍">굿  👍</h2>
]]></description>
        </item>
        <item>
            <title><![CDATA[인터넷이란 뭘까? ( 브라우저 편 )]]></title>
            <link>https://velog.io/@river_kim_/%EC%9D%B8%ED%84%B0%EB%84%B7%EC%9D%B4%EB%9E%80-%EB%AD%98%EA%B9%8C-%EB%B8%8C%EB%9D%BC%EC%9A%B0%EC%A0%80-%ED%8E%B8</link>
            <guid>https://velog.io/@river_kim_/%EC%9D%B8%ED%84%B0%EB%84%B7%EC%9D%B4%EB%9E%80-%EB%AD%98%EA%B9%8C-%EB%B8%8C%EB%9D%BC%EC%9A%B0%EC%A0%80-%ED%8E%B8</guid>
            <pubDate>Thu, 03 Nov 2022 07:43:19 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/river_kim_/post/cc94d5af-d193-4aea-8b0a-67f8db539bc9/image.png" alt=""></p>
<h3 id="브라우저가-뭘까">브라우저가 뭘까?</h3>
<p><img src="https://velog.velcdn.com/images/river_kim_/post/4b3c2c3b-b867-4136-b462-a6c6cc2b5425/image.png" alt="">
이게 브라우저임 내가 원하는 기능을 서버에 요청하여 표시하게 해주는 것</p>
<blockquote>
<h3 id="center브라우저-기본-구조centerbr"><center>브라우저 기본 구조</center><br/></h3>
<p><img src="https://velog.velcdn.com/images/river_kim_/post/9f34cbf2-8d3b-435d-b598-64bf7f9f27b2/image.png" alt=""><br/></p>
</blockquote>
<ol>
<li>사용자 인터페이스 - 주소 표시줄, 뒤로/앞으로 버튼, 북마크 메뉴 등이 포함됨 요청한 페이지를 보여주는 창을 제외한 나머지 모든 부분 <br/><br/></li>
<li>브라우저 엔진 - 사용자 인터페이스와 렌더링 엔진 사이의 동작을 제어<br/><br/></li>
<li>렌더링 엔진 - 요청한 콘텐츠를 표시. 예를 들어 HTML을 요청하면 HTML과 CSS를 파싱하여 화면에 표시함<br/><br/></li>
<li>통신 - HTTP 요청과 같은 네트워크 호출에 사용됨. 이것은 플랫폼 독립적인 인터페이스이고 각 플랫폼 하부에서 실행됨<br/><br/></li>
<li>UI 백엔드 - 콤보 박스와 창 같은 기본적인 위젯을 그리는데 사용. 플랫폼에서 명시하지 않은 일반적인 인터페이스로서, OS 사용자 인터페이스 체계를 사용<br/><br/></li>
<li>자바스크립트 해석기 - 자바스크립트 코드를 해석하고 실행<br/><br/></li>
<li>자료 저장소 - 이 부분은 자료를 저장하는 계층이다. 
쿠키를 저장하는 것과 같이 모든 종류의 자원을 하드 디스크에 저장할 필요가 있다.
HTML5 명세에는 브라우저가 지원하는 &#39;웹 데이터 베이스&#39;가 정의되어 있다<br/><blockquote>
<h6 id="크롬은-대부분의-브라우저와-달리-각-탭마다-별도의-렌더링-엔진-인스턴스를-유지하는-것이-주목할만하다-각-탭은-독립된-프로세스로-처리된다">※크롬은 대부분의 브라우저와 달리 각 탭마다 별도의 렌더링 엔진 인스턴스를 유지하는 것이 주목할만하다. 각 탭은 독립된 프로세스로 처리된다.</h6>
</blockquote>
</li>
</ol>
<br/>

<blockquote>
</blockquote>
<p><img src="https://velog.velcdn.com/images/river_kim_/post/34aea651-96b6-41a3-b7f0-0ecb1a0ccfd0/image.png" alt=""></p>
<h5 id="center렌더링-엔진의-동작-과정center"><center>렌더링 엔진의 동작 과정</center></h5>
<blockquote>
<blockquote>
</blockquote>
<p>렌더링 엔진은 좀 더 나은 사용자 경험을 위해 가능하면 빠르게 내용을 표시하는데 
모든 HTML을 파싱할 때까지 기다리지 않고 배치와 그리기 과정을 시작한다.
네트워크로부터 나머지 내용이 전송되기를 기다리는 동시에 받은 내용의 일부를 먼저 화면에 표시하는 것이다...</p>
</blockquote>
<p>가끔 우리가 인터넷하다보면 서서히 보여지게 되는것도 이것과 같은 의미이다. </p>
<h5 id="💡-dom-생성하는동안-link-만나면-dom생성을-중지한-후-cssom을-생성한다br-💡-dom--document-object-model--br-💡-cssom--css-object-model-">💡 DOM 생성하는동안 <code>&lt;link&gt;</code> 만나면 DOM생성을 중지한 후 CSSOM을 생성한다.<br/> 💡 DOM ( Document Object Model ) <br/> 💡 CSSOM ( CSS Object Model )</h5>
<hr>
<br/>


<h3 id="브라우저-동작순서">브라우저 동작순서?</h3>
<p>내가 유저라고 생각하고 하나씩 실행해봄 ( 사용 브라우저 : 크롬 )</p>
<ul>
<li><code>www.?.com</code>을 입력</li>
<li><code>DNS</code>가 입력한 주소의 IP로 반환 받음</li>
<li>반환받은 IP주소로 이동하여 서버에게 요청 = <code>HTTP Request</code></li>
<li>서버가 요청받은걸 나에게 줌  = <code>HTTP Response</code></li>
<li>요청받은 데이터들을 이제 유저가 볼수있게 해석 (파싱) 이때 렌더링엔진을 실행한다.</li>
<li><strong>렌더링 엔진</strong>의 동작 과정을 지난다.</li>
<li>짜잔 브라우저 화면 완성 !</li>
<li><h5 id="💡-dnsdomain-name-server">💡 DNS(Domain Name Server)</h5>
</li>
</ul>
<br/>

<p>물론 설명이 생략된 내용들이 많다. 간단하게 이해하기 쉽게 설명하고 자세히 설명할 거임 
일단 렌더링 엔진에서부터 HTML과 CSS를 해석하게 되는데</p>
<blockquote>
<p><img src="https://velog.velcdn.com/images/river_kim_/post/d1d45041-4ded-4655-8cf0-044ee6643aec/image.png" alt="">
웹킷 동작 과정이다. </p>
</blockquote>
<p>웹킷 동작 과정을 자세히 풀어보자 아래는 예시임</p>
<pre><code>&lt;!DOCTYPE html&gt;
&lt;html&gt;
  &lt;head&gt;
    &lt;meta name=&quot;viewport&quot; content=&quot;width=device-width,initial-scale=1&quot;&gt;
    &lt;link href=&quot;style.css&quot; rel=&quot;stylesheet&quot;&gt;
    &lt;title&gt;Critical Path&lt;/title&gt;
  &lt;/head&gt;
  &lt;body&gt;
    &lt;p&gt;Hello &lt;span&gt;web performance&lt;/span&gt; students!&lt;/p&gt;
    &lt;div&gt;&lt;img src=&quot;awesome-photo.jpg&quot;&gt;&lt;/div&gt;
  &lt;/body&gt;
&lt;/html&gt; </code></pre><p>대략 이런 느낌이다.</p>
<br/>

<hr>
<br/>

<h2 id="🌳-dom-tree-생성과정">🌳 DOM Tree 생성과정</h2>
<blockquote>
<p><img src="https://velog.velcdn.com/images/river_kim_/post/0df8e2ec-a12f-465a-8874-8ed13be3a938/image.png" alt="">
바이트 -&gt; 문자 -&gt; 토큰 -&gt; 노드 -&gt; DOM의 과정을 거치게 된다. 그래서 Dom Tree인가보다
이제 어떻게 표시되는지는 CSSOM이 결정한다.</p>
</blockquote>
<p><br/><br/></p>
<h2 id="🌳-cssom-tree-생성과정">🌳 CSSOM Tree 생성과정</h2>
<blockquote>
<p><img src="https://velog.velcdn.com/images/river_kim_/post/2596dbc1-0689-4340-bf56-a295843fa3e4/image.png" alt="">
<img src="https://velog.velcdn.com/images/river_kim_/post/3547ce95-f7e2-4c4d-bb6a-7de951f620ea/image.png" alt=""> <br/></p>
</blockquote>
<ul>
<li>하향식 규칙임 ( <code>body</code>의 스타일이 <code>span</code>에게 영향받음 )</li>
<li>근데 완전한 트리는 아님 스타일이 재정의 되었을때만</li>
</ul>
<p>근데 <code>DOM</code>이랑 다른 구조인데 이것도 트리 구조라고 할수있는지 의문이다.
하지만 위의 사진을 보면 <code>body</code>에 적용한 스타일이 <code>span</code>까지 영향을 미치게된다. 하양식 규칙을 적용하게 되기 때문에 트리구조로 볼수가 있지만 완전한 트리는 아니다.</p>
<p><br/><br/></p>
<h2 id="🌳🌳-render-tree">🌳🌳 Render Tree</h2>
<p><img src="https://velog.velcdn.com/images/river_kim_/post/67e4623e-9ebe-43c8-bb1f-7e3e9c0665ef/image.png" alt=""></p>
<h5 id="center웹킷-동작과정-중-일부center"><center>웹킷 동작과정 중 일부</center></h5>
<br/>
 `Attachment`은 웹킷 동작 과정에서 마지막에 tree를 결합하여 표시하고 그려낼 수 있는 과정이다. 
그러니까  `DOM Tree`+`CSSOM Tree` 합쳐지는 과정을 `Attachment`라고 하고 
결과가 =   `Render tree`이다 

<p><br/><br/></p>
<h3 id="과정을-그림으로-나타낸-거">과정을 그림으로 나타낸 거</h3>
<blockquote>
</blockquote>
<p><img src="https://velog.velcdn.com/images/river_kim_/post/1694871b-cbe1-46d3-b903-d822342d3c8e/image.png" alt="">
Render Tree를 생성하려고 하면 브라우저가 다음 작업을 수행한다.</p>
<blockquote>
</blockquote>
<ol>
<li>DOM 트리의 루트에서 시작하여 표시되는 각 노드를 이동 <br/><br/><ul>
<li>일부 노드(스크립트 태그, 메타 태그 등)는 표시되지 않으며 렌더링된 출력에 반영되지 않으므로 제외</li>
<li>일부 노드는 CSS를 통해 숨겨짐 ex=( display : none ) 속성을 설정하는 규칙이 있기 때문에 렌더 트리에서 제외<br/></li>
</ul>
</li>
<li>표시되는 각 노드에 대해 일치하는 적절한 CSSOM 규칙을 찾아 적용<br/></li>
<li>컨텐츠와 그 계산 스타일을 포함한 가시적인 노드를 내보냄</li>
</ol>
<br/>

<h3 id="redner-tree에는-무엇이-있을까">Redner Tree에는 무엇이 있을까?</h3>
<ul>
<li><h4 id="layout-or-reflow">Layout or Reflow</h4>
<p>렌더 트리의 노드가 정확한 위치와 크기를 계산한다. 
이때 <code>%</code>, <code>rem</code>, <code>vh</code> 이런 상대적인 값들은 절대적인 값으로 <code>px</code>로 바뀐다. 
이 과정이 <code>Layout</code> 임 ( <code>Reflow</code>이라고도 함 )</p>
</li>
<li><h4 id="paint">Paint</h4>
<p><code>Layout</code> 나타날 때 Painting 메서드가 호출됨. 그리기 과중 후 화면에 UI가 나타나게 됨</p>
</li>
</ul>
<ul>
<li>Render Tree를 조금 더 자세히 설명해 주고 있다. 브라우저의 동적 변경이라든지 브라우저가 UI까지 보이게 되고 수치가 변했을 때 어떻게 수행하는지 등 궁금할 테니 찾아보자!
<a href="https://velog.io/@thyoondev/%EC%9B%B9-%EB%B8%8C%EB%9D%BC%EC%9A%B0%EC%A0%80%EC%9D%98-%EB%8F%99%EC%9E%91%EC%9B%90%EB%A6%AC%EB%A5%BC-%EC%95%8C%EC%95%84%EB%B3%B4%EC%9E%90#%EB%A7%88%EC%B9%98%EB%A9%B0">웹 브라우저의 동작원리를 알아보자-thyoondev</a></li>
</ul>
<p><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/></p>
<blockquote>
<h3 id="출처">출처</h3>
</blockquote>
<ul>
<li><a href="https://d2.naver.com/helloworld/59361">브라우저는 어떻게 동작하는가? - d2.Naver</a></li>
<li><a href="https://web.dev/howbrowserswork/">howbrowserswork.web</a></li>
<li><a href="https://velog.io/@thyoondev/%EC%9B%B9-%EB%B8%8C%EB%9D%BC%EC%9A%B0%EC%A0%80%EC%9D%98-%EB%8F%99%EC%9E%91%EC%9B%90%EB%A6%AC%EB%A5%BC-%EC%95%8C%EC%95%84%EB%B3%B4%EC%9E%90">thyoodev.log</a></li>
<li><a href="https://web.dev/critical-rendering-path-constructing-the-object-model/">Constructing the Object Model</a></li>
<li><a href="https://velog.io/@thyoondev/%EC%9B%B9-%EB%B8%8C%EB%9D%BC%EC%9A%B0%EC%A0%80%EC%9D%98-%EB%8F%99%EC%9E%91%EC%9B%90%EB%A6%AC%EB%A5%BC-%EC%95%8C%EC%95%84%EB%B3%B4%EC%9E%90#%EB%A0%8C%EB%8D%94-%ED%8A%B8%EB%A6%AC-%EA%B7%B8%EB%A6%AC%EA%B8%B0-paint">thyoondev</a></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[인터넷이란 뭘까? ( HTTP 편 )]]></title>
            <link>https://velog.io/@river_kim_/%EC%9D%B8%ED%84%B0%EB%84%B7%EC%9D%B4%EB%9E%80-%EB%AD%98%EA%B9%8C-HTTP-%ED%8E%B8</link>
            <guid>https://velog.io/@river_kim_/%EC%9D%B8%ED%84%B0%EB%84%B7%EC%9D%B4%EB%9E%80-%EB%AD%98%EA%B9%8C-HTTP-%ED%8E%B8</guid>
            <pubDate>Thu, 03 Nov 2022 00:42:44 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/river_kim_/post/cdbc8916-5cf1-43f8-8ba5-a3e82b2851a1/image.png" alt=""></p>
<h1 id="http-그게-머임">Http? 그게 머임..</h1>
<blockquote>
</blockquote>
<p>-(<strong>H</strong>yper<strong>T</strong>ext <strong>T</strong>ransfer <strong>P</strong>rotocol) 
 HTML과 같은 하이퍼미디어 문서를 전송하기 위한 프로토콜</p>
<p>저번에도 TCP/어쩌고 프로토콜이 나오는데 이번에도 나온다  그러면 TCP/IP랑 HTTP는 같은걸까?</p>
<p>이걸 이해하기 위해 OSI 7계층을 알아야함.</p>
<h1 id="osi-7계층">OSI 7계층</h1>
<p><img src="https://velog.velcdn.com/images/river_kim_/post/9b18a9cc-0b2e-4296-bf38-f3f2e9735a74/image.png" alt=""></p>
<table>
<thead>
<tr>
<th>계층</th>
<th>이름</th>
<th>단위<br>(PDU)</th>
<th>예시</th>
<th>프로토콜<br>(Protocols)</th>
<th>디바이스<br>(Device)</th>
</tr>
</thead>
<tbody><tr>
<td>7</td>
<td>응용 계층<br>(Application Layer)</td>
<td>Data</td>
<td>텔넷(Telnet), 구글 크롬, 이메일, 데이터베이스 관리</td>
<td><strong>HTTP</strong>, SMTP, SSH, FTP, Telnet, DNS, modbus, SIP, AFP, APPC, MAP</td>
<td></td>
</tr>
<tr>
<td>6</td>
<td>표현 계층<br>(Presentation Layer)</td>
<td>Data</td>
<td>인코딩, 디코딩, 암호화, 복호화</td>
<td>ASCII, MPEG, JPEG, MIDI, EBCDIC, XDR, AFP, PAP</td>
<td></td>
</tr>
<tr>
<td>5</td>
<td>세션 계층<br>(Session Layer)</td>
<td>Data</td>
<td>NetBIOS, SAP, SDP, PIPO, SSL, TLS, NWLink, ASP, ADSP, ZIP, DLC</td>
<td></td>
<td></td>
</tr>
<tr>
<td>4</td>
<td>전송 계층<br>(Transport Layer)</td>
<td>TCP-Segment, UDP-datagram</td>
<td>특정 방화벽 및 프록시 서버</td>
<td><strong>TCP</strong>, UDP, SPX, SCTP, NetBEUI, RTP, ATP, NBP, AEP, OSPF</td>
<td>게이트웨이</td>
</tr>
<tr>
<td>3</td>
<td>네트워크 계층<br>(Network Layer)</td>
<td>Packet</td>
<td>라우터</td>
<td><strong>IP</strong>, IPX, IPsec, ICMP, ARP, NetBEUI, RIP, BGP, DDP, PLP</td>
<td>라우터</td>
</tr>
<tr>
<td>2</td>
<td>데이터링크 계층<br>(DataLink Layer)</td>
<td>Frame</td>
<td>MAC 주소, 브리지 및 스위치</td>
<td>Ethernet, Token Ring, AppleTalk, PPP, ATM, MAC, HDLC, FDDI, LLC, ALOHA</td>
<td>브릿지,스위치</td>
</tr>
<tr>
<td>1</td>
<td>물리 계층<br>(Physical Layer)</td>
<td>Bit</td>
<td>전압, 허브, 네트워크 어댑터, 중계기 및 케이블 사양, 신호 변경(디지털,아날로그)</td>
<td>10BASE-T, 100BASE-TX, ISDN, wired, wireless, RS-232, DSL, Twinax</td>
<td>허브,리피터</td>
</tr>
</tbody></table>
<p>보면 HTTP는 7계층에 있고 TCP와 IP는 4층 3층에 있다.</p>
<p>그러면 최상위에 있으니까 같은거라고 볼수 있지 않을까? 개념적으로는 그렇다</p>
<p>ex) 내가 <code>naver.com</code>으로 인터넷 주소창에 쓰고 엔터를 한다면</p>
<p>7부터 1계층까지 지나가기 때문에 같은 의미라고 볼수 있다.</p>
<p>애매하게 말한 이유는 4계층에서 <code>TCP</code>와 <code>HTTP</code>를 놓고 본다면 같다고 할수있다.</p>
<p>하지만 7계층에선? 다르다.. 계층 설명은 <a href="https://velog.io/@cgotjh/%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-OSI-7-%EA%B3%84%EC%B8%B5-OSI-7-LAYER-%EA%B8%B0%EB%B3%B8-%EA%B0%9C%EB%85%90-%EA%B0%81-%EA%B3%84%EC%B8%B5-%EC%84%A4%EB%AA%85">OSI7계층</a>에서 확인하면 이해하기 쉽다.</p>
<h1 id="그래서-http가-뭐임">그래서 HTTP가 뭐임?</h1>
<blockquote>
</blockquote>
<ul>
<li>웹 브라우저와 웹 서버가 통신을 할 때 사용하는 통신규칙</li>
</ul>
<p>CSS, HTML, JavaScript, image 와 같은 서로 주고받는 컨텐츠가 있을때 서로 주고받고 하기 </p>
<p>위해 웹 브라우저와 웹서버가 알아들을 수 있어야 하는 공통 메시지가 바로 <code>HTTP</code>이다.</p>
<p><a href="https://www.youtube.com/watch?v=vHhWcTyJoS0">생활코딩</a>에서 쉽게 설명해 주고 있다.</p>
<p><code>HTTP</code>는 Request와 Response를 위한 메시지 구분되어 있음</p>
<p>그렇다면 요청과 응답에는 뭐가 있을까?
<br/></p>
<h3 id="http-request에는-이런-정보들이-있다">HTTP Request에는 이런 정보들이 있다.</h3>
<blockquote>
</blockquote>
<p><img src="https://velog.velcdn.com/images/river_kim_/post/331839fc-8f23-4634-965d-a14803e2c5af/image.png" alt=""></p>
<blockquote>
<p><a href="https://www.youtube.com/watch?v=1TigiIAPipA&amp;t">생활코딩-Request message</a> 에서 쉽게 설명해 주고 있다.</p>
</blockquote>
<br/>

<h3 id="http-resopnse에는-무슨-내용이-있을까">HTTP Resopnse에는 무슨 내용이 있을까?</h3>
<blockquote>
</blockquote>
<p><img src="https://velog.velcdn.com/images/river_kim_/post/3bda6eee-960d-4c77-a5c6-b642a4ced500/image.png" alt=""></p>
<blockquote>
<p><a href="https://www.youtube.com/watch?v=yIm0BfUvKH4&amp;t">생활코딩-Response message</a> 에서 쉽게 설명해 주고 있다.</p>
</blockquote>
<blockquote>
<h4 id="출처">출처</h4>
<p><a href="https://www.youtube.com/c/%EC%83%9D%ED%99%9C%EC%BD%94%EB%94%A91">생활코딩</a></p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[인터넷이란 뭘까? ( 동작원리 편 )]]></title>
            <link>https://velog.io/@river_kim_/%EC%9D%B8%ED%84%B0%EB%84%B7%EC%9D%B4%EB%9E%80-%EB%AD%98%EA%B9%8C</link>
            <guid>https://velog.io/@river_kim_/%EC%9D%B8%ED%84%B0%EB%84%B7%EC%9D%B4%EB%9E%80-%EB%AD%98%EA%B9%8C</guid>
            <pubDate>Wed, 02 Nov 2022 07:10:26 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/river_kim_/post/c20332d7-8992-465a-b24e-15eabfa12a67/image.png" alt=""></p>
<blockquote>
<h3 id="인터넷이-뭐임">인터넷이 뭐임?</h3>
</blockquote>
<br/>

<pre><code>인터넷(Internet)은 인터넷 프로토콜 스위트(TCP/IP)를 기반으로 하여 

전 세계적으로 연결되어있는 컴퓨터 네트워크 통신망을 일컫는 말이다. 

그야말로 인류의 역사상 전례 없는 거대한 정보의 바다인 셈이다.....</code></pre><br/>
🌳나무위키에서 긁어온 글이다.
<br/><br/>
단순히 생각해본다면 인터넷을 하기위해선  TCP와 IP가 있어야 한다는건데 그럼 TCP는 뭐고 IP는 뭘까?

<h1 id="tcp--ip가-뭐임">TCP / IP가 뭐임?</h1>
<blockquote>
<ul>
<li><strong>T</strong>ransmission <strong>C</strong>ontrol <strong>P</strong>rotocol - 전송 제어 프로토콜
컴퓨터가 다른 컴퓨터와 통신하기 위한 규약이라고 한다.<br/></li>
<li><strong>I</strong>nternet <strong>P</strong>rotocol - 인터넷 프로토콜
인터넷이 통하는 네트워크에서 어떤 정보를 수신하고 송신하는 통신에 대한 규약을 의미한다.</li>
</ul>
</blockquote>
<p>네트워크에서 컴퓨터시스템에 연결하는데 사용되는 통신프로토콜의 패밀리라는것</p>
<p> 제일 많이 쓰는 네트워킹방식이다. 
 <code>참고로 TCP와 IP의 OSI계층은 서로 다르다</code></p>
<h1 id="인터넷-동작원리">인터넷 동작원리</h1>
<p>인터넷이 동작하려면 컴퓨터들끼리 통신을 해야한다. 그러면 위와 같이 TCP/IP를 사용함</p>
<p>인터넷이 동작하려면 컴퓨터끼리 연결해야 할 것 같음 </p>
<p>그런데 여러 컴퓨터가 연결하려고 하는 상황이면??</p>
<p><img src="https://velog.velcdn.com/images/river_kim_/post/ba38e7e0-dd63-4aa6-b02d-992311e94b8d/image.png" alt="더러워">
굉장히 보기 불편하다 중간 다리 역할 같은 장비를 추가해 준다면?</p>
<p><img src="https://velog.velcdn.com/images/river_kim_/post/41e043a3-62cb-4373-b6da-d6ec89802157/image.png" alt="깔끔해">
너무 깔끔하다 이게 라우터임 라우터끼리 통신도 가능</p>
<p>만약 멀리 아주아주 멀리~ 있는 사람에게도 네트워크 연결을 하고 싶다면? </p>
<p>ISP를 연결해야한다. 즉 통신사와 연결해야한다는 것이다. 그러면 아주 멀리 있더라도 서로 연결이 가능함</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[TypeScript가 뭐지?]]></title>
            <link>https://velog.io/@river_kim_/TypeScript%EA%B0%80-%EB%AD%90%EC%A7%80</link>
            <guid>https://velog.io/@river_kim_/TypeScript%EA%B0%80-%EB%AD%90%EC%A7%80</guid>
            <pubDate>Tue, 01 Nov 2022 08:36:25 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/river_kim_/post/dfe70b24-9c0c-4244-9e09-fd1cfd6fa1b2/image.png" alt=""></p>
<h6 id=""></h6>
<p>요새 채용공고에 보면 React와 TypeScript를 자주 보고 있다.</p>
<p><br><br></p>
<h1 id="💡-typescript가-뭘까">💡 TypeScript가 뭘까?</h1>
<blockquote>
<p>쉽게 풀어보자면..
오타 교정, 타입 체크 ( 문자인지 숫자인지 ~기타 등등)
자바스크립트가 다이나믹타이핑을 지원하는 걸 막아주는 언어라고 해야 할까?
공항 검색대처럼 굉장히 엄격한 언어라고 할 수 있다</p>
<h4 id="그럼-다이나믹-타이핑은-뭘까">그럼 다이나믹 타이핑은 뭘까?</h4>
<p>변수를 지정할 때 데이터 타입을 명시하지 않아도 컴퓨터가 알아서 해석하도록 해준다고 쓰여있다. 
사람처럼 비유하자면  <strong>*&quot;거기에 있는 그거 좀 줘봐&quot;*</strong>  가 아닐까?</p>
</blockquote>
<p><br><br></p>
<h1 id="💬-어떻게-사용해야할까">💬 어떻게 사용해야할까?</h1>
<p>변수를 쓸 때 </p>
<pre><code class="language-typescript">var name = &quot;kim&quot;;</code></pre>
<p>에서 타입을 지정해 주면 된다.</p>
<p><br><br></p>
<pre><code class="language-typescript">var name : string = &quot;kim&quot;;</code></pre>
<p>이런 식으로 사용할 수 있는 방법이 많다.</p>
<p><br><br></p>
<pre><code class="language-typescript">let name : string[] = [&quot;kim&quot;,&quot;lee&quot;...]

let name : string | number = 4885;

let age : { 나이 : number } = { 나이 : number };

type nameType = string | number;
let name : nameType = &#39;lee&#39;

let user : [string,number] = [&#39;kim&#39;,10]

//함수를 사용할때는 타입을 미리 체크해줘야한다
function 함수( a : number) { 
    if(typeof x === &#39;number&#39;){
        return a * 2
    }

// object 타입
type userType={
    name? : string, // name 속성이 string거나 name이 undefined라는 의미이다
    age : number
}
let kim : userType = {
    name : &#39;kim&#39;,
    age : 10
}

//object안에 속성이 전부 같은 속성일때 타입 지정하는것도 있다
let Person : { [key : string] : number } = {
    na_E : 10,
    kI : 190,
    mu_gea : 100
  }

//class도 사용가능하다 대신 중괄호안에 변수를 만들어야 사용가능</code></pre>
<p><br><br><br></p>
<p>하지만 꼭 타입을 지정하지 않아도 알아서 타입을 지정해 준다
<img src="https://velog.velcdn.com/images/river_kim_/post/b1d6c4e6-cb06-4a0a-843b-ebec9f054f33/image.png" alt="">
편하다.. 그래도 나는 주니어_주니어 니까 사용하는 버릇을 만들자</p>
<br>

<p>추가로 </p>
<br>

<pre><code class="language-typescript">let name ;
name = &#39;kim&#39;</code></pre>
<br>

<p>일 때 let name : Any 가 된다. 타입 속성을 해제하는 거랑 같은 의미이다</p>
<br>


<blockquote>
<p>Any와 unknown 타입이 있는데<br>** 타입이 지정된 변수 = Any텍스트로 지정된 변수** 는 에러가 나지 않지만
** 타입이 지정된 변수 = unknown로 지정된 변수** 는 에러가 난다</p>
</blockquote>
<p><br><br><br><br><br></p>
<h1 id="👀-사용해보자">👀 사용해보자</h1>
<br>

<pre><code class="language-typescript">function 함수( a : number | string ) {
    return a + 1;
}</code></pre>
<br>

<p>이런 계산식을 사용하는 함수가 있다고 하자 그렇다면 문자 형식으로 된 숫자가 입력된다면? </p>
<p>어떻게 사용하는 방법들이 있을까?</p>
<p><br><br></p>
<blockquote>
<h3 id="narrowing">Narrowing</h3>
</blockquote>
<pre><code class="language-typescript"> function 함수( a : number | string ) {
    if ( typeof a === &quot;number&quot;) { // in , instanceof 사용 가능
        return a + 1
      }
      else if ( typeof a === &quot;string&quot;){
        return a + 1
      }
      else {return 0}
  }</code></pre>
<blockquote>
<h3 id="assertion">Assertion</h3>
</blockquote>
<pre><code class="language-typescript">function 함수(a : number | string) {
    return (a as number) + 1 
    // a를 number로 인식하게 만듬 하지만 인식만할뿐 임시해결용에 가깝다.
}</code></pre>
<p>Assertion은 확실할 때아니면 임시로 에러 해결할 때 사용하고 나머진 Narrowing을 사용해야겠다.</p>
]]></description>
        </item>
    </channel>
</rss>